1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.jelly.tags.swing;
17
18 import java.awt.Dimension;
19 import java.awt.Point;
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import javax.swing.Box;
24 import javax.swing.JButton;
25 import javax.swing.JCheckBox;
26 import javax.swing.JCheckBoxMenuItem;
27 import javax.swing.JComboBox;
28 import javax.swing.JDesktopPane;
29 import javax.swing.JEditorPane;
30 import javax.swing.JFileChooser;
31 import javax.swing.JFrame;
32 import javax.swing.JInternalFrame;
33 import javax.swing.JLabel;
34 import javax.swing.JList;
35 import javax.swing.JMenu;
36 import javax.swing.JMenuBar;
37 import javax.swing.JMenuItem;
38 import javax.swing.JOptionPane;
39 import javax.swing.JPanel;
40 import javax.swing.JPasswordField;
41 import javax.swing.JPopupMenu;
42 import javax.swing.JProgressBar;
43 import javax.swing.JRadioButton;
44 import javax.swing.JRadioButtonMenuItem;
45 import javax.swing.JScrollPane;
46 import javax.swing.JSeparator;
47 import javax.swing.JSplitPane;
48 import javax.swing.JTabbedPane;
49 import javax.swing.JTable;
50 import javax.swing.JTextArea;
51 import javax.swing.JTextField;
52 import javax.swing.JToggleButton;
53 import javax.swing.JToolBar;
54 import javax.swing.JTree;
55
56 import org.apache.commons.beanutils.ConvertUtils;
57 import org.apache.commons.jelly.JellyException;
58 import org.apache.commons.jelly.Tag;
59 import org.apache.commons.jelly.TagLibrary;
60 import org.apache.commons.jelly.impl.TagFactory;
61 import org.apache.commons.jelly.impl.TagScript;
62 import org.apache.commons.jelly.tags.swing.converters.ColorConverter;
63 import org.apache.commons.jelly.tags.swing.converters.DimensionConverter;
64 import org.apache.commons.jelly.tags.swing.converters.PointConverter;
65 import org.apache.commons.logging.Log;
66 import org.apache.commons.logging.LogFactory;
67 import org.xml.sax.Attributes;
68
69 /*** The Swing tag library. <p/>
70 * In addition to the tag descriptions in the tag doc, implements
71 * the following basic components:
72 * <ul>
73 * <li>button - JButton
74 <li>checkBox - JCheckBox
75 <li>checkBoxMenuItem - JCheckBoxMenuItem
76 <li>comboBox - JComboBox
77 <li>desktopPane - JDesktopPane
78 <li>editorPane - JEditorPane
79 <li>fileChooser - JFileChooser
80 <li>frame - JFrame
81 <li>internalFrame - JInternalFrame
82 <li>label - JLabel
83 <li>list - JList
84 <li>menu - JMenu
85 <li>menuBar - JMenuBar
86 <li>menuItem - JMenuItem
87 <li>panel - JPanel
88 <li>passwordField - JPasswordField
89 <li>popupMenu - JPopupMenu
90 <li>progressBar - JProgressBar
91 <li>radioButton - JRadioButton
92 <li>radioButtonMenuItem - JRadioButtonMenuItem
93 <li>optionPane - JOptionPane
94 <li>scrollPane - JScrollPane
95 <li>separator - JSeparator
96
97 <li>splitPane - JSplitPane
98 <li>hbox" - Box.createHorizontalBox()
99 <li>vbox - Box.createVerticalBox()
100
101 <li>tabbedPane - JTabbedPane
102 <li>table - JTable
103 <li>textArea - JTextArea
104 <li>textField - JTextField
105 <li>toggleButton - JToggleButton
106 <li>tree - JTree
107 <li>toolBar - JToolBar
108
109 * </ul>
110 *
111 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
112 * @author <a href="mailto:bob@eng.werken.com">bob mcwhirter</a>
113 * @version $Revision: 331130 $
114 */
115 public class SwingTagLibrary extends TagLibrary {
116
117 /*** The Log to which logging calls will be made. */
118 private static final Log log = LogFactory.getLog(SwingTagLibrary.class);
119
120 /*** A map of element name to bean class objects */
121 private Map factoryMap;
122
123 static {
124
125
126
127 ConvertUtils.register( new DimensionConverter(), Dimension.class );
128 ConvertUtils.register( new PointConverter(), Point.class );
129 ConvertUtils.register( new ColorConverter(), java.awt.Color.class );
130 }
131
132 public SwingTagLibrary() {
133 registerTag( "action", ActionTag.class );
134 registerTag( "buttonGroup", ButtonGroupTag.class );
135 registerTag( "component", ComponentTag.class );
136 registerTag( "font", FontTag.class );
137 registerTag( "windowListener", WindowListenerTag.class );
138 registerTag( "focusListener", FocusListenerTag.class );
139 registerTag( "keyListener", KeyListenerTag.class );
140
141
142 registerTag( "tableModel", TableModelTag.class );
143 registerTag( "tableModelColumn", TableModelColumnTag.class );
144
145
146 registerTag( "etchedBorder", EtchedBorderTag.class );
147 registerTag( "emptyBorder", EmptyBorderTag.class );
148 registerTag( "titledBorder", TitledBorderTag.class );
149
150
151
152
153
154 registerTag( "tableLayout", TableLayoutTag.class );
155 registerTag( "tr", TrTag.class );
156 registerTag( "td", TdTag.class );
157
158
159 registerTag( "gridBagLayout", GridBagLayoutTag.class );
160 registerTag( "gbc", GbcTag.class );
161
162
163 registerTag( "borderLayout", BorderLayoutTag.class );
164 registerTag( "borderAlign", BorderAlignTag.class );
165
166
167 registerTag( "cardLayout", CardLayoutTag.class);
168
169
170 registerTag( "dialog", DialogTag.class );
171 }
172
173 /*** Creates a new script to execute the given tag name and attributes */
174 public TagScript createTagScript(String name, Attributes attributes) throws JellyException {
175 TagScript answer = super.createTagScript(name, attributes);
176 if ( answer == null ) {
177 final Factory factory = getFactory( name );
178 if ( factory != null ) {
179 return new TagScript(
180 new TagFactory() {
181 public Tag createTag(String name, Attributes attributes) throws JellyException {
182 if ( factory instanceof TagFactory ) {
183 return ((TagFactory) factory).createTag(name, attributes);
184 }
185 else {
186 return new ComponentTag(factory);
187 }
188 }
189 }
190 );
191 }
192 }
193 return answer;
194 }
195
196 /***
197 * @return the Factory of the Swing component for the given element name
198 */
199 public Factory getFactory(String elementName) {
200 return (Factory) getFactoryMap().get(elementName);
201 }
202
203
204
205
206 /***
207 * Strategy method allowing derived classes to change the registration behaviour
208 */
209 protected void registerFactories() {
210 registerBeanFactory( "button", JButton.class );
211 registerBeanFactory( "checkBox", JCheckBox.class );
212 registerBeanFactory( "checkBoxMenuItem", JCheckBoxMenuItem.class );
213 registerBeanFactory( "comboBox", JComboBox.class );
214
215
216
217
218 registerBeanFactory( "desktopPane", JDesktopPane.class );
219 registerBeanFactory( "editorPane", JEditorPane.class );
220 registerBeanFactory( "fileChooser", JFileChooser.class );
221 registerBeanFactory( "frame", JFrame.class );
222 registerBeanFactory( "internalFrame", JInternalFrame.class );
223 registerBeanFactory( "label", JLabel.class );
224 registerBeanFactory( "list", JList.class );
225 registerBeanFactory( "menu", JMenu.class );
226 registerBeanFactory( "menuBar", JMenuBar.class );
227 registerBeanFactory( "menuItem", JMenuItem.class );
228 registerBeanFactory( "panel", JPanel.class );
229 registerBeanFactory( "passwordField", JPasswordField.class );
230 registerBeanFactory( "popupMenu", JPopupMenu.class );
231 registerBeanFactory( "progressBar", JProgressBar.class );
232 registerBeanFactory( "radioButton", JRadioButton.class );
233 registerBeanFactory( "radioButtonMenuItem", JRadioButtonMenuItem.class );
234 registerBeanFactory( "optionPane", JOptionPane.class );
235 registerBeanFactory( "scrollPane", JScrollPane.class );
236 registerBeanFactory( "separator", JSeparator.class );
237
238 registerFactory(
239 "splitPane",
240 new Factory() {
241 public Object newInstance() {
242 JSplitPane answer = new JSplitPane();
243 answer.setLeftComponent(null);
244 answer.setRightComponent(null);
245 answer.setTopComponent(null);
246 answer.setBottomComponent(null);
247 return answer;
248 }
249 }
250 );
251
252
253 registerFactory(
254 "hbox",
255 new Factory() {
256 public Object newInstance() {
257 return Box.createHorizontalBox();
258 }
259 }
260 );
261 registerFactory(
262 "vbox",
263 new Factory() {
264 public Object newInstance() {
265 return Box.createVerticalBox();
266 }
267 }
268 );
269
270 registerBeanFactory( "tabbedPane", JTabbedPane.class );
271 registerBeanFactory( "table", JTable.class );
272 registerBeanFactory( "textArea", JTextArea.class );
273 registerBeanFactory( "textField", JTextField.class );
274 registerBeanFactory( "toggleButton", JToggleButton.class );
275 registerBeanFactory( "tree", JTree.class );
276 registerBeanFactory( "toolBar", JToolBar.class );
277 }
278
279 /***
280 * Register a widget factory for the given element name
281 */
282 protected void registerFactory(String name, Factory factory) {
283 getFactoryMap().put(name, factory);
284 }
285
286 /***
287 * Register a bean factory for the given element name and class
288 */
289 protected void registerBeanFactory(String name, Class beanClass) {
290 registerFactory(name, new BeanFactory(beanClass));
291 }
292
293 protected Map getFactoryMap() {
294 if ( factoryMap == null ) {
295 factoryMap = new HashMap();
296 registerFactories();
297 }
298 return factoryMap;
299 }
300 }