001 /* 002 * Copyright 2002-2004 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.factory; 017 018 import java.awt.Component; 019 import java.awt.LayoutManager; 020 021 import javax.swing.JButton; 022 import javax.swing.JCheckBox; 023 import javax.swing.JComboBox; 024 import javax.swing.JComponent; 025 import javax.swing.JFormattedTextField; 026 import javax.swing.JLabel; 027 import javax.swing.JList; 028 import javax.swing.JMenuItem; 029 import javax.swing.JPanel; 030 import javax.swing.JPasswordField; 031 import javax.swing.JRadioButton; 032 import javax.swing.JTabbedPane; 033 import javax.swing.JTable; 034 import javax.swing.JTextArea; 035 import javax.swing.JTextField; 036 import javax.swing.JScrollPane; 037 import javax.swing.JToggleButton; 038 import javax.swing.JFormattedTextField.AbstractFormatterFactory; 039 import javax.swing.table.TableModel; 040 041 import org.springframework.binding.value.ValueModel; 042 import org.springframework.richclient.util.Alignment; 043 044 /** 045 * A factory interface for encapsulating logic to create well-formed, configured 046 * GUI controls. 047 * 048 * @author Keith Donald 049 */ 050 public interface ComponentFactory { 051 052 /** 053 * Create and configure a label with the specified label key. For example: 054 * "&My Control Label:", where the '&' marks a positional mnemonic. 055 * 056 * @param labelKey The label message code; may also be the label text if no 057 * message source is configured. 058 * @return The configured label. 059 */ 060 public JLabel createLabel(String labelKey); 061 062 /** 063 * Create and configure a label with the specified label key. For example: 064 * "&My Control Label:", where the '&' marks a positional mnemonic. 065 * 066 * @param labelKey The label message code; may also be the label text if no 067 * message source is configured. 068 * @return The configured label. 069 */ 070 public JLabel createLabel(String[] labelKeys); 071 072 /** 073 * Creates and configure a label with the specified label key and 074 * parameterized arguments. Argument values are resolved to {digit 075 * placeholder} characters in the resolved message string. 076 * 077 * @param labelKey 078 * @param arguments 079 * @return The configured label. 080 */ 081 public JLabel createLabel(String labelKey, Object[] arguments); 082 083 /** 084 * Creates and configure a label with the specified label key and 085 * parameterized arguments. Argument values are resolved to {digit 086 * placeholder} characters in the resolved message string. Argument values 087 * are pulled from the provided value model, and this component factory will 088 * auto-subscribe for changes, dynamically updating the label when 089 * underlying arguments change. 090 * 091 * @param labelKey 092 * @param argumentValueHolders The value model of the arguments; 093 * @return The configured label. 094 */ 095 public JLabel createLabel(String labelKey, ValueModel[] argumentValueHolders); 096 097 /** 098 * Create and configure a title label with the specified label key. A title 099 * label's text matches that of a titled border title (bold, highlighted.) 100 * 101 * @param labelKey The label message code; may also be the label text if no 102 * message source is configured. 103 * 104 * @return The configured label. 105 */ 106 public JLabel createTitleLabel(String labelKey); 107 108 /** 109 * Creates a titled border for the specified component. 110 * 111 * @param labelKey the title label message code. 112 * @param comp the component to attach a titled border to. 113 * @return the configured component. 114 */ 115 public JComponent createTitledBorderFor(String labelKey, JComponent comp); 116 117 /** 118 * Create and configure a label for the provided component. Associating a 119 * label with a component ensures when the mnemonic is selected the 120 * component is given focus. 121 * 122 * @param labelKey The label message code; may also be the label text if no 123 * message source is configured. 124 * @param comp the labeled component 125 * @return The configured label. 126 */ 127 public JLabel createLabelFor(String labelKey, JComponent comp); 128 129 /** 130 * Create and configure a label for the provided component. Associating a 131 * label with a component ensures when the mnemonic is selected the 132 * component is given focus. 133 * 134 * @param labelKey The label message code; may also be the label text if no 135 * message source is configured. 136 * @param comp the labeled component 137 * @return The configured label. 138 */ 139 public JLabel createLabelFor(String[] labelKeys, JComponent comp); 140 141 /** 142 * Create and configure a button with the specified label key. The button 143 * will be configured with the appropriate mnemonic and accelerator. Note: 144 * if you find yourself duplicating the same handler logic accross different 145 * buttons, maybe its time to use a Command. 146 * 147 * @param labelKey The label message code; may also be the label text if no 148 * message source is configured. 149 * @return The configured button. 150 */ 151 public JButton createButton(String labelKey); 152 153 /** 154 * Create and configure an left-aligned label acting as a form dividing 155 * separator; that is, a control that displays a label and a separator 156 * immediately underneath it. 157 * 158 * @param labelKey The label message code; may also be the label text if no 159 * message source is configured. 160 * @return The configured labeled separator. 161 */ 162 public JComponent createLabeledSeparator(String labelKey); 163 164 /** 165 * Create and configure an aligned label acting as a form dividing 166 * separator; that is, a control that displays a label and a separator 167 * immediately underneath it. 168 * 169 * @param labelKey The label message code; may also be the label text if no 170 * message source is configured. 171 * @param alignment The label's alignment. 172 * @return The configured labeled separator. 173 */ 174 public JComponent createLabeledSeparator(String labelKey, Alignment alignment); 175 176 /** 177 * Create a list using this component factory. 178 * 179 * @return The new list. 180 */ 181 public JList createList(); 182 183 /** 184 * Create a combo box using this component factory. 185 * 186 * @return The new combo box. 187 */ 188 public JComboBox createComboBox(); 189 190 /** 191 * Create a combo box using this component factory. The list of selectable 192 * items is populated from the provided value model, which provides access 193 * to a list. When an item is selected in the list, the 194 * selectedItemValueModel is set. 195 * 196 * @return The new combo box. 197 * @param the value model for the list of selectable items 198 * @param the property to render each item in the list. 199 */ 200 public JComboBox createListValueModelComboBox(ValueModel selectedItemValueModel, 201 ValueModel selectableItemsListHolder, String renderedPropertyPath); 202 203 /** 204 * Create a combo box using this component factory, to be populated by the 205 * list of all enums of the specified type, resolved using this factory's 206 * enum resolver. 207 * 208 * @return The new combo box. 209 */ 210 public JComboBox createComboBox(Class enumType); 211 212 /** 213 * Configure a combo box to be populated with all enums of the specified 214 * enumeration type. The type must be resolvable by this factory's enum 215 * resolver. 216 * 217 * @param enumType The enumeration type. 218 */ 219 public void configureForEnum(JComboBox comboBox, Class enumType); 220 221 /** 222 * Create a configured menu item. 223 * 224 * @param labelKey The label message code; may also be the label text if no 225 * message source is configured. 226 * @return The menu item. 227 */ 228 public JMenuItem createMenuItem(String labelKey); 229 230 /** 231 * Create a configured checkbox. 232 * 233 * @param labelKey The label message code; may also be the label text if no 234 * message source is configured. 235 * @return The checkbox. 236 */ 237 public JCheckBox createCheckBox(String labelKey); 238 239 /** 240 * Create a configured checkbox. 241 * 242 * @param labelKeys The label message codes; may also be the label text if 243 * no message source is configured. 244 * @return The checkbox. 245 */ 246 public JCheckBox createCheckBox(String[] labelKeys); 247 248 /** 249 * Create a configured toggle button. 250 * 251 * @param labelKey The label message code; may also be the label text if no 252 * message source is configured. 253 * @return The toggle button. 254 */ 255 public JToggleButton createToggleButton(String labelKey); 256 257 /** 258 * Create a configured toggle button. 259 * 260 * @param labelKeys The label message codes; may also be the label text if 261 * no message source is configured. 262 * @return The toggle button. 263 */ 264 public JToggleButton createToggleButton(String[] labelKeys); 265 266 /** 267 * Create a configured radio button. 268 * 269 * @param labelKey The label message code; may also be the label text if no 270 * message source is configured. 271 * @return The radio button. 272 */ 273 public JRadioButton createRadioButton(String labelKey); 274 275 /** 276 * Create a configured radio button. 277 * 278 * @param labelKeys The label message codes; may also be the label text if 279 * no message source is configured. 280 * @return The radio button. 281 */ 282 public JRadioButton createRadioButton(String[] labelKeys); 283 284 /** 285 * Create a formatted text field using this component factory. 286 * 287 * @param formatterFactory AbstractFormatterFactory used for formatting. 288 * @return The new formatted text field 289 */ 290 public JFormattedTextField createFormattedTextField(AbstractFormatterFactory formatterFactory); 291 292 /** 293 * Create a standard text field using this component factory. 294 * 295 * @return the new text field. 296 */ 297 public JTextField createTextField(); 298 299 /** 300 * Create a standard password field using this component factory. 301 * 302 * @return the new password field. 303 */ 304 public JPasswordField createPasswordField(); 305 306 /** 307 * Create a text area using this component factory. 308 * 309 * @return The new text area. 310 */ 311 public JTextArea createTextArea(); 312 313 /** 314 * Create a text area using this component factory. 315 * 316 * @return The new text area. 317 */ 318 public JTextArea createTextArea(int row, int columns); 319 320 /** 321 * Create a text area that looks like a label (but with cut/copy/paste 322 * enabled!) using this component factory. 323 * 324 * @return The new text area. 325 */ 326 public JTextArea createTextAreaAsLabel(); 327 328 /** 329 * Create and return a new tabbed pane. 330 * 331 * @return a new tabbed pane. 332 */ 333 public JTabbedPane createTabbedPane(); 334 335 /** 336 * Adds a tab to the provided tabbed pane, configuring the tab's appearance 337 * from information retrieved using the <code>labelKey</code> property. 338 * The tab title text, icon, mnemonic, and mnemonic index are all 339 * configurable. 340 * 341 * @param tabbedPane 342 * @param labelKey 343 * @param tabComponent 344 */ 345 public void addConfiguredTab(JTabbedPane tabbedPane, String labelKey, JComponent tabComponent); 346 347 /** 348 * Create a scroll pane using this component factory. 349 * 350 * @return empty scroll pane. 351 * @see javax.swing.JScrollPane#JScrollPane() 352 */ 353 public JScrollPane createScrollPane(); 354 355 /** 356 * Create a scroll pane using this component factory, with the specified 357 * component as the viewport view. 358 * 359 * @param view the component to display in the scrollpane's viewport 360 * @return scroll pane with specified view 361 * @see JScrollPane#JScrollPane(java.awt.Component) 362 */ 363 public JScrollPane createScrollPane(Component view); 364 365 /** 366 * Create a scroll pane using this component factory, with the specified 367 * component as the viewport view and with the specified vertical and 368 * horizontal scrollbar policies. 369 * 370 * @param view the component to display in the scrollpane's viewport 371 * @param vsbPolicy set the vertical scrollbar policy. 372 * @param hsbPolicy set the horizontal scrollbar policy. 373 * @return scroll pane with specified view and scrolling policies 374 * @see JScrollPane#JScrollPane(java.awt.Component, int, int) 375 */ 376 public JScrollPane createScrollPane(Component view, int vsbPolicy, int hsbPolicy); 377 378 /** 379 * Creates a panel using this component factory. 380 * 381 * @return the panel 382 * @see JPanel 383 */ 384 public JPanel createPanel(); 385 386 /** 387 * Creates a panel with the supplied LayoutManager using this component 388 * factory. 389 * 390 * @param layoutManager the LayoutManager that will be used by the returned 391 * panel 392 * @return a panel 393 * @see JPanel#JPanel(java.awt.LayoutManager) 394 */ 395 public JPanel createPanel(LayoutManager layoutManager); 396 397 /** 398 * Construct a JTable with a default model. 399 * @return new table instance 400 */ 401 public JTable createTable(); 402 403 /** 404 * Construct a JTable with the specified table model. 405 * @param model TableModel to install into the new table 406 * @return new table instance 407 */ 408 public JTable createTable(TableModel model); 409 410 /** 411 * Construct a JToolBar. 412 * @return new toolbar instance 413 */ 414 public JComponent createToolBar(); 415 416 }