/*
* $Id$
*
* Copyright (c) 2000-2003 by Rodney Kinney
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.configure;
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import VASSAL.build.GameModule;
import VASSAL.preferences.Prefs;
import VASSAL.tools.ArchiveWriter;
import VASSAL.tools.filechooser.FileChooser;
/**
* A Configurer for java.io.File values
*/
public class FileConfigurer extends Configurer {
protected ArchiveWriter archive;
protected JPanel p;
protected JTextField tf;
protected FileChooser fc;
protected boolean editable;
protected DirectoryConfigurer startingDirectory;
public FileConfigurer(String key, String name) {
this(key, name, (DirectoryConfigurer)null);
}
/**
*
* @param key
* @param name
* @param startingDirectory If non-null, points to a preferences setting that specifies the starting directory for the "Select" button
*/
public FileConfigurer(String key, String name, DirectoryConfigurer startingDirectory) {
super(key, name);
setValue(null);
editable = true;
this.startingDirectory = startingDirectory;
fc = initFileChooser();
}
protected FileChooser initFileChooser() {
FileChooser fc = FileChooser.createFileChooser(null, startingDirectory);
if (startingDirectory == null && GameModule.getGameModule() != null) {
fc.setCurrentDirectory((File) Prefs.getGlobalPrefs().getValue(Prefs.MODULES_DIR_KEY));
}
return fc;
}
/**
* If a non-null {@link ArchiveWriter} is used in the constructor, then invoking {@link #setValue} on this
* FileConfigurer will automatically add the file to the archive
*/
public FileConfigurer(String key, String name, ArchiveWriter archive) {
this(key, name);
this.archive = archive;
}
public String getValueString() {
if (archive == null) {
return getFileValue() == null ? "null" : getFileValue().getPath();
}
else {
return getFileValue() == null ? "null" : getFileValue().getName();
}
}
public void setValue(Object o) {
// FIXME: this creates a problem when the referenced file is in the JAR
File f = (File) o;
if (f != null && f.exists()) {
if (archive != null) {
addToArchive(f);
}
}
super.setValue(f);
if (tf != null && !noUpdate) {
tf.setText(getValueString());
}
}
protected void addToArchive(File f) {
archive.addFile(f.getPath(), f.getName());
}
public void setValue(String s) {
if (s == null)
setValue((Object) null);
else {
setValue(new File(s));
}
}
public Component getControls() {
if (p == null) {
p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(new JLabel(getName()));
JButton b = new JButton("Select");
p.add(b);
tf = new JTextField(getValueString());
tf.setEditable(editable);
tf.setMaximumSize(new java.awt.Dimension(tf.getMaximumSize().width,
tf.getPreferredSize().height));
tf.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent evt) {
update();
}
public void insertUpdate(DocumentEvent evt) {
update();
}
public void removeUpdate(DocumentEvent evt) {
update();
}
public void update() {
String text = tf.getText();
File f = text != null && text.length() > 0 && !"null".equals(text) ? new File(text) : null;
noUpdate = true;
setValue(f);
noUpdate = false;
}
});
p.add(tf);
b.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
chooseNewValue();
}
});
}
return p;
}
public void chooseNewValue() {
if (fc.showOpenDialog(getControls()) != FileChooser.APPROVE_OPTION) {
setValue((Object) null);
}
else {
setValue(fc.getSelectedFile().exists() ? fc.getSelectedFile() : (Object) null);
}
}
public File getFileValue() {
return (File) value;
}
public static void main(String args[]) {
final JFrame f = new JFrame();
final FileConfigurer c =
new ImageConfigurer(null, "Test file", new ArchiveWriter("testArchive"));
c.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.err.println(String.valueOf(evt.getNewValue()));
}
});
f.getContentPane().add(c.getControls());
f.pack();
f.setVisible(true);
}
public boolean isEditable() {
return editable;
}
public void setEditable(boolean editable) {
this.editable = editable;
if (tf != null) {
tf.setEditable(editable);
}
}
}