View Javadoc

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