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.x.impl.swing;
    14
    15  import java.awt.event.ActionEvent;
    16  import java.io.File;
    17
    18  import javax.swing.AbstractAction;
    19  import javax.swing.JButton;
    20  import javax.swing.JFileChooser;
    21  import javax.swing.JPanel;
    22  import javax.swing.JTextField;
    23  import javax.swing.text.Document;
    24
    25  import org.apache.log4j.Logger;
    26
    27  import com.eviware.soapui.settings.ProjectSettings;
    28  import com.eviware.soapui.support.DocumentListenerAdapter;
    29  import com.eviware.soapui.support.UISupport;
    30  import com.eviware.x.form.XFormTextField;
    31  import com.eviware.x.form.XForm.FieldType;
    32  import com.jgoodies.forms.builder.ButtonBarBuilder;
    33
    34  public class FileFormField extends AbstractSwingXFormField<JPanel> implements XFormTextField
    35  {
    36  	private final static Logger log = Logger.getLogger(FileFormField.class);
    37
    38  	private JTextField textField;
    39  	private final FieldType type;
    40  	private JButton selectDirectoryButton;
    41  	private String projectRoot;
    42
    43  	private boolean updating;
    44  	private String oldValue;
    45
    46  	public FileFormField( String tooltip, FieldType type )
    47  	{
    48  		super( new JPanel() );
    49  		this.type = type;
    50
    51  		ButtonBarBuilder builder = new ButtonBarBuilder( getComponent() );
    52  		textField = new JTextField( 30 );
    53  		textField.setToolTipText( tooltip );
    54  		builder.addGriddedGrowing( textField );
    55  		builder.addRelatedGap();
    56  		selectDirectoryButton = new JButton( new SelectDirectoryAction());
    57  		builder.addFixed( selectDirectoryButton );
    58
    59  		textField.getDocument().addDocumentListener( new DocumentListenerAdapter() {
    60
    61  			@Override
    62  			public void update( Document document )
    63  			{
    64  				String text = textField.getText();
    65
    66  				if( !updating )
    67  					fireValueChanged( text, oldValue );
    68
    69  				oldValue = text;
    70  			}} );
    71  	}
    72
    73  	public void setValue(String value)
    74  	{
    75  		updating = true;
    76  		oldValue = null;
    77  		updateValue( value );
    78  		updating = false;
    79  	}
    80
    81  	private void updateValue( String value )
    82  	{
    83  		if( value != null && projectRoot != null && value.startsWith( projectRoot ) )
    84  		{
    85  			value = value.substring( projectRoot.length()+1 );
    86  		}
    87
    88  		textField.setText( value );
    89  	}
    90
    91  	public String getValue()
    92  	{
    93  		String text = textField.getText().trim();
    94
    95  		if( projectRoot != null && text.length() > 0 )
    96  		{
    97  			String tempName = projectRoot + File.separatorChar + text;
    98  			if( new File( tempName ).exists() )
    99  			{
    100 				text = tempName;
    101 			}
    102 		}
    103
    104 		return text;
    105 	}
    106
    107 	public void setEnabled(boolean enabled)
    108 	{
    109 		textField.setEnabled( enabled );
    110 		selectDirectoryButton.setEnabled( enabled );
    111 	}
    112
    113 	public class SelectDirectoryAction extends AbstractAction
    114 	{
    115 		private JFileChooser fileChooser;
    116
    117 		public SelectDirectoryAction()
    118 		{
    119 			super( "Browse..." );
    120 		}
    121
    122 		public void actionPerformed(ActionEvent e)
    123 		{
    124 			if( fileChooser == null )
    125 			{
    126 				fileChooser = new JFileChooser();
    127 				if( type == FieldType.FOLDER || type == FieldType.PROJECT_FOLDER )
    128 					fileChooser.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
    129 			}
    130
    131 			String value = FileFormField.this.getValue();
    132 			if( value.length() > 0 )
    133 			{
    134 				fileChooser.setSelectedFile( new File( value ));
    135 			}
    136 			else if( projectRoot != null )
    137 			{
    138 				fileChooser.setCurrentDirectory( new File( projectRoot ));
    139 			}
    140
    141 			int returnVal = fileChooser.showOpenDialog( UISupport.getMainFrame() );
    142 		   if( returnVal == JFileChooser.APPROVE_OPTION )
    143 		   {
    144 		     	updateValue( fileChooser.getSelectedFile().getAbsolutePath());
    145 		   }
    146 		}
    147 	}
    148
    149 	public void setProperty(String name, Object value)
    150 	{
    151 		super.setProperty(name, value);
    152
    153 		if( name.equals( ProjectSettings.PROJECT_ROOT ))
    154 		{
    155 			projectRoot = (String) value;
    156 			log.debug( "Set projectRoot to [" + projectRoot + "]" );
    157 		}
    158 	}
    159
    160 	public void setWidth(int columns)
    161 	{
    162 		textField.setColumns( columns );
    163 	}
    164 }