1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support.components;
14
15 import java.awt.event.ComponentAdapter;
16 import java.awt.event.ComponentEvent;
17 import java.util.HashMap;
18 import java.util.Iterator;
19 import java.util.Map;
20
21 import javax.swing.Action;
22 import javax.swing.ComboBoxModel;
23 import javax.swing.JButton;
24 import javax.swing.JCheckBox;
25 import javax.swing.JComboBox;
26 import javax.swing.JComponent;
27 import javax.swing.JLabel;
28 import javax.swing.JList;
29 import javax.swing.JPanel;
30 import javax.swing.JPasswordField;
31 import javax.swing.JSeparator;
32 import javax.swing.JTextField;
33 import javax.swing.border.Border;
34 import javax.swing.text.JTextComponent;
35
36 import com.jgoodies.forms.layout.CellConstraints;
37 import com.jgoodies.forms.layout.FormLayout;
38 import com.jgoodies.forms.layout.RowSpec;
39
40 /***
41 * Utility-class for creating forms
42 */
43
44 public class SimpleForm
45 {
46 private JPanel panel;
47 private CellConstraints cc = new CellConstraints();
48 private FormLayout layout;
49 private RowSpec rowSpec;
50 private int rowSpacing = 5;
51 private Map<String,JComponent> components = new HashMap<String,JComponent>();
52 private Map<JComboBox,Object[]> comboBoxMaps = new HashMap<JComboBox,Object[]>();
53 private String rowAlignment = "center";
54 private Map<String,String> hiddenValues;
55 private boolean appended;
56
57 public SimpleForm()
58 {
59 this( 5 );
60 }
61
62 public SimpleForm( String layout )
63 {
64 this( new FormLayout( layout ) );
65 }
66
67 public SimpleForm( FormLayout layout )
68 {
69 this.layout = layout;
70 panel = new JPanel( layout );
71 rowSpec = new RowSpec( rowAlignment + ":pref" );
72 }
73
74 public SimpleForm( int indent )
75 {
76 this( indent + "px:none,right:pref,10px,left:default,5px:grow(1.0)" );
77 }
78
79 public JPanel getPanel()
80 {
81 return panel;
82 }
83
84 public String getRowAlignment()
85 {
86 return rowAlignment;
87 }
88
89 public void setRowAlignment( String rowAlignment )
90 {
91 this.rowAlignment = rowAlignment;
92 }
93
94 public int getRowSpacing()
95 {
96 return rowSpacing;
97 }
98
99 public void setRowSpacing( int rowSpacing )
100 {
101 this.rowSpacing = rowSpacing;
102 }
103
104 public void addHiddenValue( String name, String value )
105 {
106 if( hiddenValues == null )
107 hiddenValues = new HashMap<String,String>();
108
109 hiddenValues.put( name, value );
110 }
111
112 public JButton addRightButton( Action action )
113 {
114 if( rowSpacing > 0 && !components.isEmpty() )
115 addSpace( rowSpacing );
116
117 layout.appendRow( rowSpec );
118 int row = layout.getRowCount();
119
120 JButton button = new JButton( action );
121 panel.add( button, cc.xy( 4, row, "right,bottom" ) );
122 return button;
123 }
124
125 public void addSpace()
126 {
127 addSpace( rowSpacing );
128 }
129
130 public void addSpace( int size )
131 {
132 if( size > 0 )
133 layout.appendRow( new RowSpec( size + "px" ) );
134 }
135
136 public void addRightComponent( JComponent component )
137 {
138 if( rowSpacing > 0 && !components.isEmpty() )
139 addSpace( rowSpacing );
140
141 layout.appendRow( rowSpec );
142 int row = layout.getRowCount();
143
144 panel.add( component, cc.xy( 4, row, "right,bottom" ) );
145 }
146
147 public JCheckBox appendCheckBox( String caption, String label, boolean selected )
148 {
149 JCheckBox checkBox = new JCheckBox( label, selected );
150 components.put( caption, checkBox );
151 append( caption, checkBox );
152 return checkBox;
153 }
154
155 public void append( String label, JComponent component )
156 {
157 append( label, component, null );
158 }
159
160 public JComboBox appendComboBox( String label, Map values )
161 {
162 Object[] valueArray = new Object[values.size()];
163 Object[] keyArray = new Object[values.size()];
164
165 int ix = 0;
166 for( Iterator i = values.keySet().iterator(); i.hasNext(); ix++ )
167 {
168 keyArray[ix] = i.next();
169 valueArray[ix] = values.get( keyArray[ix] );
170 }
171
172 JComboBox comboBox = new JComboBox( valueArray );
173
174 comboBoxMaps.put( comboBox, keyArray );
175
176 append( label, comboBox );
177 return comboBox;
178 }
179
180 public JComboBox appendComboBox( String label, Object [] values, String tooltip )
181 {
182 JComboBox comboBox = new JComboBox( values );
183 comboBox.setToolTipText( tooltip );
184 append( label, comboBox );
185 return comboBox;
186 }
187
188 public JComboBox appendComboBox( String label, ComboBoxModel model, String tooltip )
189 {
190 JComboBox comboBox = new JComboBox( model );
191 comboBox.setToolTipText( tooltip );
192 append( label, comboBox );
193 return comboBox;
194 }
195
196 public void appendFixed( String label, JComponent component )
197 {
198 append( label, component, "left:pref" );
199 }
200
201 public void append( String label, JComponent component, String alignments )
202 {
203 int spaceRowIndex = -1;
204
205 if( rowSpacing > 0 && appended )
206 {
207 addSpace( rowSpacing );
208 spaceRowIndex = layout.getRowCount();
209 }
210
211 layout.appendRow( rowSpec );
212 int row = layout.getRowCount();
213
214 if( label != null )
215 {
216 JLabel jlabel = new JLabel( label );
217 panel.add( jlabel, cc.xy( 2, row ) );
218
219 component.addComponentListener( new LabelHider( jlabel, spaceRowIndex ) );
220 }
221 else
222 component.addComponentListener( new LabelHider( null, spaceRowIndex ) );
223
224 if( alignments == null )
225 panel.add( component, cc.xy( 4, row ) );
226 else
227 panel.add( component, cc.xy( 4, row, alignments ) );
228
229 components.put( label, component );
230 appended = true;
231 }
232
233 public void appendSeparator()
234 {
235 if( appended && rowSpacing > 0 )
236 addSpace( rowSpacing );
237
238 layout.appendRow( rowSpec );
239 int row = layout.getRowCount();
240
241 panel.add( new JSeparator(), cc.xywh( 2, row, 3, 1 ) );
242 appended = true;
243 }
244
245 public JTextField appendTextField( String label, String tooltip )
246 {
247 JTextField textField = new JTextField();
248 textField.setColumns( 30 );
249 textField.setToolTipText( tooltip );
250 append( label, textField );
251 return textField;
252 }
253
254 public JTextField appendPasswordField( String label, String tooltip )
255 {
256 JPasswordField textField = new JPasswordField();
257 textField.setColumns( 30 );
258 textField.setToolTipText( tooltip );
259 append( label, textField );
260 return textField;
261 }
262
263 public void setComponentValue( String label, String value )
264 {
265 JComponent component = getComponent( label );
266
267 if( component instanceof JTextComponent )
268 {
269 ((JTextComponent) component).setText( value );
270 }
271 else if( component instanceof JComboBox )
272 {
273 JComboBox comboBox = ((JComboBox) component);
274 comboBox.setSelectedItem( value );
275 }
276 else if( component instanceof JList )
277 {
278 ((JList) component).setSelectedValue( value, true );
279 }
280 else if( component instanceof JCheckBox )
281 {
282 ((JCheckBox) component).setSelected( Boolean.valueOf( value ));
283 }
284 else if( component instanceof JFormComponent )
285 {
286 ((JFormComponent) component).setValue( value );
287 }
288 }
289
290 public String getComponentValue( String label )
291 {
292 JComponent component = getComponent( label );
293 if( component == null )
294 {
295 return (String) (hiddenValues == null ? null : hiddenValues.get( label ));
296 }
297
298 if( component instanceof JTextComponent )
299 {
300 return ((JTextComponent) component).getText();
301 }
302
303 if( component instanceof JComboBox )
304 {
305 JComboBox comboBox = ((JComboBox) component);
306 int selectedIndex = comboBox.getSelectedIndex();
307 if( selectedIndex != -1 )
308 {
309 if( comboBoxMaps.containsKey( component ) )
310 {
311 Object[] keys = (Object[]) comboBoxMaps.get( comboBox );
312 Object value = keys[selectedIndex];
313 return (String) value == null ? null : value.toString();
314 }
315 else
316 {
317 Object value = comboBox.getSelectedItem();
318 return (String) value == null ? null : value.toString();
319 }
320 }
321 }
322
323 if( component instanceof JList )
324 {
325 return (String) ((JList) component).getSelectedValue();
326 }
327
328 if( component instanceof JCheckBox )
329 {
330 return String.valueOf( ((JCheckBox) component).isSelected() );
331 }
332
333 else if( component instanceof JFormComponent )
334 {
335 return ((JFormComponent) component).getValue();
336 }
337
338 return null;
339 }
340
341 public JComponent getComponent( String label )
342 {
343 return (JComponent) components.get( label );
344 }
345
346 public void setBorder(Border border)
347 {
348 panel.setBorder( border );
349 }
350
351 public int getRowCount()
352 {
353 return layout.getRowCount();
354 }
355
356 public void addComponent(JComponent component)
357 {
358 layout.appendRow( rowSpec );
359 int row = layout.getRowCount();
360
361 panel.add( component, cc.xyw( 2, row, 4 ) );
362 }
363
364 public void setValues(Map<String, String> values)
365 {
366 for( Iterator<String> i = values.keySet().iterator(); i.hasNext(); )
367 {
368 String key = i.next();
369 setComponentValue( key, values.get( key ));
370 }
371 }
372
373 public void getValues(Map<String, String> values)
374 {
375 for( Iterator<String> i = components.keySet().iterator(); i.hasNext(); )
376 {
377 String key = i.next();
378 values.put( key, getComponentValue( key ));
379 }
380 }
381
382 public void append( JComponent component )
383 {
384 int spaceRowIndex = -1;
385
386 if( rowSpacing > 0 && appended )
387 {
388 addSpace( rowSpacing );
389 spaceRowIndex = layout.getRowCount();
390 }
391
392 layout.appendRow( rowSpec );
393 int row = layout.getRowCount();
394
395 panel.add( component, cc.xyw( 2, row, 4 ) );
396
397 component.addComponentListener( new LabelHider( null, spaceRowIndex ) );
398
399 appended = true;
400 }
401
402 private final class LabelHider extends ComponentAdapter
403 {
404 private final JLabel jlabel;
405 private final int rowIndex;
406
407 public LabelHider( JLabel jlabel, int i )
408 {
409 this.jlabel = jlabel;
410 this.rowIndex = i;
411 }
412
413 public void componentHidden( ComponentEvent e )
414 {
415 if( jlabel != null )
416 jlabel.setVisible( false );
417
418 if( rowIndex >= 0 && rowIndex < layout.getRowCount() )
419 layout.setRowSpec( rowIndex, new RowSpec( "0px" ));
420 }
421
422 public void componentShown( ComponentEvent e )
423 {
424 if( jlabel != null )
425 jlabel.setVisible( true );
426
427 if( rowIndex >= 0 && rowIndex < layout.getRowCount() )
428 layout.setRowSpec( rowIndex, new RowSpec( rowSpacing + "px" ));
429 }
430 }
431 }
432