/* * Created on 21-Oct-2004 by Ryan McNally */ package com.ryanm.config.swing.imp; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileFilter; import com.ryanm.config.Configurator; import com.ryanm.config.swing.Widget; import com.ryanm.util.io.FileUtils; /** * For controlling a File variable * * @author ryanm */ public class FileWidget extends Widget implements ActionListener { private static final String ABSOLUTE = "Absolute"; private static final String RELATIVE = "Relative"; private File oldValue; private JButton button; private JFileChooser chooser = new JFileChooser( System.getProperty( "user.dir" ) ); private File base = new File( System.getProperty( "user.dir" ) ); private JComboBox saveOptions = new JComboBox( new String[] { RELATIVE, ABSOLUTE } ); /** * Standard constructor * * @param conf * The {@link Configurator} that this widget is * configuring a part of. Can be null * @param name * The name of the variable that that we are controlling. * Cannot be null */ public FileWidget( Configurator conf, String name ) { super( conf, name ); setBorder( new TitledBorder( name ) ); setLayout( new BorderLayout() ); oldValue = ( File ) conf.getValue( name ); setRange( null ); button = new JButton( oldValue == null ? "No file selected" : oldValue.getName() ); button.addActionListener( this ); add( button, BorderLayout.CENTER ); setEnabled( conf.isGUIEnabled( name ) ); JPanel panel = new JPanel(); panel.setBorder( new TitledBorder( "Saved path" ) ); panel.add( saveOptions ); chooser.setAccessory( panel ); chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES ); } /** * * */ public FileWidget() { } public void actionPerformed( ActionEvent e ) { synchronized( lock ) { if( oldValue != null ) { chooser.setSelectedFile( oldValue ); try { chooser.setCurrentDirectory( oldValue.getCanonicalFile().getParentFile() ); } catch( IOException e1 ) { e1.printStackTrace(); } } int returnval = chooser.showDialog( FileWidget.this, "Choose" ); if( returnval == JFileChooser.APPROVE_OPTION ) { oldValue = chooser.getSelectedFile(); if( saveOptions.getSelectedItem().equals( ABSOLUTE ) ) { oldValue = oldValue.getAbsoluteFile(); } else { oldValue = FileUtils.getRelativePath( base, oldValue ); } applyChange( conf, name, oldValue ); } } } @Override public void updateRange( Object range ) { range = conf.getRange( name ); String[] s; if( range instanceof String ) { s = new String[] { ( String ) range }; } else if( range instanceof String[] ) { s = ( String[] ) range; } else if( range == null ) { s = null; } else { throw new IllegalArgumentException( "Non-string range object " + range + " found for variable " + conf.getPath() + "/" + name + "\n" ); } final String[] suffixes = s; if( suffixes != null ) { chooser.setFileFilter( new FileFilter() { @Override public boolean accept( File f ) { if( f.isDirectory() ) { return true; } String fn = f.getName(); for( int i = 0; i < suffixes.length; i++ ) { if( fn.endsWith( suffixes[ i ] ) ) { return true; } } return false; } @Override public String getDescription() { StringBuilder buff = new StringBuilder(); buff.append( "Accepts files ending in " ); if( suffixes.length > 1 ) { for( int i = 0; i < suffixes.length - 1; i++ ) { buff.append( "\"" ); buff.append( suffixes[ i ] ); buff.append( "\", " ); } buff.append( " and " ); } buff.append( "\"" ); buff.append( suffixes[ suffixes.length - 1 ] ); buff.append( "\"" ); return buff.toString(); } } ); } else { chooser.setFileFilter( null ); } } @Override public void updateValue() { File file = ( File ) conf.getValue( name ); if( file != null ) { try { button.setText( file.getCanonicalFile().getName() ); } catch( IOException e ) { e.printStackTrace(); } } else { button.setText( "No file selected" ); } } @Override public void setEnabled( boolean b ) { button.setEnabled( b ); } @Override public Widget newWidget( Configurator conf, String name, Class runtimeType ) { return new FileWidget( conf, name ); } @Override public Class getType() { return File.class; } }