View Javadoc

1   /*
2    * Copyright 2002,2004 The Apache Software Foundation.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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         // ### we should create Converters from Strings to various Swing types such as
126         // ### Icon, KeyStroke etc.
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         // the model tags
142         registerTag( "tableModel", TableModelTag.class );
143         registerTag( "tableModelColumn", TableModelColumnTag.class );
144 
145         // the border tags...
146         registerTag( "etchedBorder", EtchedBorderTag.class );
147         registerTag( "emptyBorder", EmptyBorderTag.class );
148         registerTag( "titledBorder", TitledBorderTag.class );
149         // @todo the other kinds of borders, empty, bevelled, compound etc
150 
151         // the layout tags...
152 
153         // HTML style table, tr, td layouts
154         registerTag( "tableLayout", TableLayoutTag.class );
155         registerTag( "tr", TrTag.class );
156         registerTag( "td", TdTag.class );
157 
158         // GridBagLayout
159         registerTag( "gridBagLayout", GridBagLayoutTag.class );
160         registerTag( "gbc", GbcTag.class );
161 
162         // BorderLayout
163         registerTag( "borderLayout", BorderLayoutTag.class );
164         registerTag( "borderAlign", BorderAlignTag.class );
165         
166         //CardLayout
167         registerTag( "cardLayout", CardLayoutTag.class);
168 
169         // Dialog
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     // Implementation methods
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         // how to add content there ?
215         // Have a ComboBoxModel (just one should have a Table or Tree Model objects) ?
216         // can the element control it's children ?
217         // but children should also be able to be any component (as Swing comps. are all container)
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         // Box related layout components
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 }