1 /*
2 Copyright (C) 2000 - 2007 Grid Systems, S.A.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2, as
6 published by the Free Software Foundation.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
17
18 package com.gridsystems.config.tools.swing;
19
20 import java.io.File;
21 import java.io.IOException;
22 import javax.swing.filechooser.FileFilter;
23 import javax.swing.JFileChooser;
24
25 /**
26 * Manages a file value asking the user through a file system browser.
27 *
28 * @author SJM
29 */
30 public class FileChooserField extends PopupTextField {
31 /**
32 * Allows selecting both files and directories.
33 */
34 public static final int FILES_AND_DIRECTORIES = JFileChooser.FILES_AND_DIRECTORIES;
35
36 /**
37 * Allows selecting only files directories.
38 */
39 public static final int DIRECTORIES_ONLY = JFileChooser.DIRECTORIES_ONLY;
40
41 /**
42 * Allows selecting only files.
43 */
44 public static final int FILES_ONLY = JFileChooser.FILES_ONLY;
45
46 /**
47 * Opens the popup as an "Open" file menu (chose an existing file.
48 */
49 public static final int TYPE_OPEN = JFileChooser.OPEN_DIALOG;
50
51 /**
52 * Opens the popup as a "Save" file menu (chose an existing file.
53 */
54 public static final int TYPE_SAVE = JFileChooser.SAVE_DIALOG;
55
56 /**
57 * The internal file chooser instance.
58 */
59 private JFileChooser jFileChooser = new JFileChooser();
60
61 /**
62 * Constructor.
63 *
64 * Is equivalent to
65 * FileChooserField(null, FileChooserField.FILES_AND_DIRECTORIES)
66 */
67 public FileChooserField() {
68 this(null, FileChooserField.FILES_AND_DIRECTORIES);
69 }
70
71 /**
72 * Constructor.
73 *
74 * Is equivalent to FileChooserField(<code>initialSelection</code>,
75 * FileChooserField.FILES_AND_DIRECTORIES)
76 *
77 * @param initialSelection a String with the path initially selected.
78 */
79 public FileChooserField(String initialSelection) {
80 this(initialSelection, FileChooserField.FILES_AND_DIRECTORIES);
81 }
82
83 /**
84 * Constructor.
85 *
86 * Is equivalent to FileChooserField(null,<code>mode</code>)
87 *
88 * @param mode an int with the mode of selection of files.
89 */
90 public FileChooserField(int mode) {
91 this(null, mode);
92 }
93
94 /**
95 * Constructor.
96 *
97 * @param initialSelection a String with the path initially selected. If it
98 * is not a valid path or the associated file does not exist, it will be
99 * ignored.
100 * @param mode an int with the mode of selection of files. It can be
101 * FILES_AND_DIRECTORIES, FILES_ONLY or DIRECTORIES_ONLY.
102 */
103 public FileChooserField(String initialSelection, int mode) {
104 super();
105
106 this.setValue(initialSelection);
107 this.setMode(mode);
108 }
109
110 /**
111 * Opens the file chooser dialog.
112 */
113 protected void openPopup() {
114 File selectedFile = null;
115 File parent = null;
116 try {
117 String currentPath = (String)this.getValue();
118 if (currentPath != null) {
119 selectedFile = new File(currentPath);
120 if (!selectedFile.exists()) {
121 selectedFile = null;
122 } else {
123 selectedFile = selectedFile.getCanonicalFile();
124 parent = selectedFile.getParentFile();
125 }
126 }
127 } catch (IOException ioe) {
128 selectedFile = null;
129 }
130 this.jFileChooser.setCurrentDirectory(parent);
131 this.jFileChooser.setSelectedFile(selectedFile);
132
133 int action = this.jFileChooser.showOpenDialog(FileChooserField.this);
134 if (action == JFileChooser.APPROVE_OPTION) {
135 FileChooserField.this.setValue(
136 jFileChooser.getSelectedFile().getAbsolutePath());
137 }
138 }
139
140 /**
141 * Sets the managed value of the object.
142 *
143 * Sets the managed value of the object. This implementation just tries to
144 * use the methods from File to get the canonical path and use it instead of
145 * the value passed as a parameter, if this can not be done the value of the
146 * parameter is used. The internal storage/management of the object does not
147 * change.
148 *
149 * @param value the Object with the value to be managed by the component. If
150 * it is a instance of File, its getCanonicalPath() method is used. If it is
151 * not, the value of toString() is used to try to get the canonical path. If
152 * it fails, then the toString() value is stored as the internal value.
153 */
154 public void setValue(Object value) {
155 if (value == null) {
156 super.setValue(null);
157 return;
158 }
159
160 if (value instanceof File) {
161 File file = (File) value;
162 try {
163 super.setValue(file.getCanonicalPath());
164 } catch (IOException ioe) {
165 super.setValue(file.toString());
166 }
167 return;
168 }
169
170 String path = value.toString();
171 try {
172 File file = new File(path);
173 super.setValue(file.getCanonicalPath());
174 return;
175 } catch (IOException ioe) {
176 }
177 super.setValue(path);
178 }
179
180 /**
181 * Gets the selected file.
182 *
183 * @return The selected file
184 */
185 public File getFile() {
186 String path = super.getValue().toString();
187 return new File(path);
188 }
189
190 /**
191 * Sets the mode of selection of files.
192 *
193 * @param mode an int with the mode of selection of files. It can be
194 * FILES_AND_DIRECTORIES, FILES_ONLY or DIRECTORIES_ONLY.
195 */
196 public void setMode(int mode) {
197 this.jFileChooser.setFileSelectionMode(mode);
198 }
199
200 /**
201 * Gets the mode of selection of files.
202 *
203 * @return an int with the mode of selection of files. It can be
204 * FILES_AND_DIRECTORIES, FILES_ONLY or DIRECTORIES_ONLY.
205 */
206 public int getMode() {
207 return this.jFileChooser.getFileSelectionMode();
208 }
209
210 /**
211 * Sets the type of menu to show.
212 *
213 * @param type an int with the type of menu to show. It can be TYPE_OPEN or
214 * TYPE_SAVE.
215 */
216 public void setType(int type) {
217 this.jFileChooser.setDialogType(type);
218 }
219
220 /**
221 * Gets the type of menu to show.
222 *
223 * @return an int with the type of menu to show. It can be TYPE_OPEN or
224 * TYPE_SAVE.
225 */
226 public int getType() {
227 return this.jFileChooser.getDialogType();
228 }
229
230 /**
231 * Sets a filter for the files to be displayed at the file system browser.
232 *
233 * @param fileFilter a javax.swing.filechooser.FileFilter that selects the
234 * files to display.
235 *
236 * @see JFileChooser#setFileFilter(FileFilter)
237 */
238 public void setFilter(FileFilter fileFilter) {
239 this.jFileChooser.setFileFilter(fileFilter);
240 }
241
242 /**
243 * Gets the filter for the files to be displayed at the file system browser.
244 *
245 * @return the javax.swing.filechooser.FileFilter that selects the files to
246 * display. It can be null.
247 *
248 * @see JFileChooser#getFileFilter()
249 */
250 public FileFilter getFilter() {
251 return this.jFileChooser.getFileFilter();
252 }
253 }
254