001 /* JAPI - (Yet another (hopefully) useful) Java API
002 *
003 * Copyright (C) 2004-2006 Christian Hujer
004 *
005 * This program is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU General Public License as
007 * published by the Free Software Foundation; either version 2 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful, but
011 * WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013 * General Public License for more details.
014 *
015 * You should have received a copy of the GNU General Public License
016 * along with this program; if not, write to the Free Software
017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
018 * 02111-1307, USA.
019 */
020
021 package net.sf.japi.swing;
022
023 import java.awt.Insets;
024 import java.io.File;
025 import java.io.IOException;
026 import javax.swing.JButton;
027 import javax.swing.JFileChooser;
028 import javax.swing.JTextField;
029
030 /** JButton for choosing a file from hd.
031 * @author <a href="mailto:chris@riedquat.de">Christian Hujer</a>
032 */
033 public class JFileChooserButton extends JButton {
034
035 /** Action Factory. */
036 private static final ActionFactory ACTION_FACTORY = ActionFactory.getFactory("net.sf.japi.swing");
037
038 /** The JTextField to read/write the file path to.
039 * @serial include
040 */
041 private JTextField textField;
042
043 /** The file selection mode.
044 * @serial include
045 */
046 private int fileSelectionMode;
047
048 /** The base directory for choosing files.
049 * @serial include
050 */
051 private File base;
052
053 /** The JFileChooser to use.
054 * @serial include
055 */
056 private JFileChooser chooser;
057
058 /** Create a ChooseButton.
059 * A default chooser is used.
060 * The current working directory is used as base directory.
061 * @param textField JTextField to create button for
062 * @param fileSelectionMode see {@link JFileChooser}
063 */
064 public JFileChooserButton(final JTextField textField, final int fileSelectionMode) {
065 this(new File(System.getProperty("user.dir")), null, textField, fileSelectionMode);
066 }
067
068 /** Create a ChooseButton.
069 * A default chooser is used.
070 * @param base base directory to use
071 * @param textField JTextField to create button for
072 * @param fileSelectionMode see {@link JFileChooser}
073 */
074 public JFileChooserButton(final File base, final JTextField textField, final int fileSelectionMode) {
075 this(base, null, textField, fileSelectionMode);
076 }
077
078 /** Create a ChooseButton.
079 * A default chooser is used.
080 * The current working directory is used as base directory.
081 * @param chooser JFileChooser to associate with
082 * @param textField JTextField to create button for
083 * @param fileSelectionMode see {@link JFileChooser}
084 */
085 public JFileChooserButton(final JFileChooser chooser, final JTextField textField, final int fileSelectionMode) {
086 this(new File(System.getProperty("user.dir")), chooser, textField, fileSelectionMode);
087 }
088
089 /** Create a ChooserButton.
090 * @param base base directory to use
091 * @param chooser JFileChooser to associate with
092 * @param textField JTextField to create button for
093 * @param fileSelectionMode see {@link JFileChooser}
094 */
095 public JFileChooserButton(final File base, final JFileChooser chooser, final JTextField textField, final int fileSelectionMode) {
096 setAction(ACTION_FACTORY.createAction(false, "optionsChooseFile", this));
097 this.textField = textField;
098 this.fileSelectionMode = fileSelectionMode;
099 setMargin(new Insets(0, 0, 0, 0));
100 setChooser(chooser);
101 setBase(base);
102 }
103
104 /** Set the JFileChooser associated with this JFileChooserButton.
105 * @param chooser new JFileChooser to associate or <code>null</code> to instruct the button to create its own
106 */
107 public void setChooser(final JFileChooser chooser) {
108 this.chooser = chooser != null ? chooser : new JFileChooser();
109 }
110
111 /** Set the base directory to choose files from.
112 * This method always tries to convert the base file to canonical form.
113 * If that fails, the base file is converted to absolute form instead.
114 * @param base directory to choose files from
115 */
116 public void setBase(final File base) {
117 try {
118 this.base = base.getCanonicalFile();
119 } catch (final IOException e) {
120 this.base = base.getAbsoluteFile();
121 }
122 }
123
124 /** Get the base directory to choose files from.
125 * @return base directrory to which chosen files are resolved
126 */
127 public File getBase() {
128 return base;
129 }
130
131 /** Get the JFileChooser associated with this JFileChooserButton.
132 * @return associated JFileChooser
133 */
134 public JFileChooser getChooser() {
135 return chooser;
136 }
137
138 /** Action method.
139 * @used
140 */
141 public void optionsChooseFile() {
142 final String oldFilename = textField.getText();
143 final File oldFile = new File(base, oldFilename);
144 chooser.setFileSelectionMode(fileSelectionMode);
145 chooser.setMultiSelectionEnabled(false);
146 if (oldFilename.length() > 0) {
147 chooser.setCurrentDirectory(oldFile.getParentFile());
148 chooser.setSelectedFile(oldFile);
149 } else {
150 chooser.setCurrentDirectory(base);
151 chooser.setSelectedFile(null);
152 }
153 final int returnVal = chooser.showOpenDialog(this);
154 if (returnVal == JFileChooser.APPROVE_OPTION) {
155 textField.setText(chooser.getSelectedFile().getPath());
156 }
157 }
158
159 } // class JFileChooserButton