001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 *
010 * All Rights Reserved
011 *
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.
014 *
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 *
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023 * GNU Lesser Public License for more details.
024 *
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program. If not, see http://www.gnu.org/licenses.
027 */
028
029 package edu.wisc.ssec.mcidasv.chooser;
030
031
032 import edu.wisc.ssec.mcidasv.*;
033
034 import java.awt.*;
035 import java.awt.event.*;
036
037 import java.io.File;
038
039 import java.util.ArrayList;
040 import java.util.List;
041 import java.util.Hashtable;
042 import java.util.Vector;
043
044 import javax.swing.*;
045 import javax.swing.event.*;
046 import javax.swing.filechooser.FileFilter;
047
048 import org.w3c.dom.Element;
049
050 import ucar.unidata.data.DataSourceResults;
051
052 import ucar.unidata.idv.*;
053
054 import ucar.unidata.idv.chooser.FileChooser;
055 import ucar.unidata.idv.chooser.IdvChooser;
056 import ucar.unidata.idv.chooser.IdvChooserManager;
057
058 import ucar.unidata.ui.ChooserPanel;
059
060 import ucar.unidata.util.FileManager;
061 import ucar.unidata.util.GuiUtils;
062 import ucar.unidata.util.PatternFileFilter;
063 import ucar.unidata.util.PreferenceList;
064 import ucar.unidata.util.StringUtil;
065
066 import ucar.unidata.xml.XmlResourceCollection;
067 import ucar.unidata.xml.XmlUtil;
068
069
070 public class HydraChooser extends IdvChooser {
071
072 private Element chooserNode;
073
074 private JFileChooser fileChooser;
075
076 private IntegratedDataViewer idv = getIdv();
077
078 /**
079 * The chooser xml can specify a datasourceid attribute.
080 */
081 private String dfltDataSourceId = "HYDRA";
082
083 /**
084 * Create the chooser with the given manager and xml
085 *
086 * @param mgr The manager
087 * @param root The xml
088 *
089 */
090 public HydraChooser(IdvChooserManager mgr, Element root) {
091 super(mgr, root);
092 this.chooserNode = root;
093 }
094
095
096 /**
097 * Get the tooltip for the load button
098 *
099 * @return The tooltip for the load button
100 */
101 protected String getLoadToolTip() {
102 return "";
103 }
104
105
106 /**
107 * Get the tooltip for the update button
108 *
109 * @return The tooltip for the update button
110 */
111 protected String getUpdateToolTip() {
112 return "Rescan the directory";
113 }
114
115
116 /**
117 * Make the GUI
118 *
119 * @return The GUI for HYDRA Chooser
120 */
121 protected JComponent doMakeContents() {
122 String path = (String) idv.getPreference(PREF_DEFAULTDIR + getId());
123 if (path == null) {
124 path = XmlUtil.getAttribute(this.chooserNode, FileChooser.ATTR_PATH,
125 (String) null);
126 }
127 //System.out.println("path=" + path);
128 fileChooser = doMakeFileChooser(path);
129 fileChooser.setPreferredSize(new Dimension(300, 300));
130 fileChooser.setMultiSelectionEnabled(true);
131 fileChooser.setApproveButtonText(ChooserPanel.CMD_LOAD);
132
133 PatternFileFilter ff = new PatternFileFilter(".hdf", "*.hdf files");
134 //fileChooser.setFileFilter(ff);
135
136 JComponent chooserPanel = fileChooser;
137 JPanel filePanel = GuiUtils.vbox(chooserPanel, getDefaultButtons());
138 return filePanel;
139 }
140
141
142 /**
143 * Make the file chooser
144 *
145 * @param path the initial path
146 *
147 * @return the file chooser
148 */
149 protected JFileChooser doMakeFileChooser(String path) {
150 return new MyFileChooser(path);
151 }
152
153 /**
154 * An extension of JFileChooser
155 *
156 * @author IDV Development Team
157 * @version $Revision$
158 */
159 public class MyFileChooser extends JFileChooser {
160
161 /**
162 * Create the file chooser
163 *
164 * @param path the initial path
165 */
166 public MyFileChooser(String path) {
167 super(path);
168 setControlButtonsAreShown(false);
169 setMultiSelectionEnabled(true);
170 }
171
172 /**
173 * Approve the selection
174 */
175 public void approveSelection() {
176 HydraChooser.this.doLoad();
177 }
178
179 /**
180 * Cancel the selection
181 */
182 public void cancelSelection() {
183 closeChooser();
184 }
185
186 /**
187 * Set the selected files
188 *
189 * @param selectedFiles the selected files
190 */
191 public void setSelectedFiles(File[] selectedFiles) {
192 super.setSelectedFiles(selectedFiles);
193 setHaveData( !((selectedFiles == null)
194 || (selectedFiles.length == 0)));
195 }
196 }
197
198
199 /**
200 * Handle the selection of the set of files
201 *
202 * @param files The files the user chose
203 * @param directory The directory they chose them from
204 */
205 protected final void selectFiles(File[] files, File directory) {
206 try {
207 if (selectFilesInner(files, directory)) {
208 idv.getStateManager().writePreference(PREF_DEFAULTDIR
209 + getId(), directory.getPath());
210 }
211 } catch (Exception excp) {
212 logException("File selection", excp);
213 }
214 }
215
216 /**
217 * Get the file chooser
218 *
219 * @return the chooser for this instance
220 */
221 protected JFileChooser getFileChooser() {
222 return fileChooser;
223 }
224
225 /**
226 * Override the base class method to catch the do load
227 */
228 public void doLoadInThread() {
229 selectFiles(fileChooser.getSelectedFiles(),
230 fileChooser.getCurrentDirectory());
231 }
232
233
234
235 /**
236 * Override the base class method to catch the do update
237 */
238 public void doUpdate() {
239 fileChooser.rescanCurrentDirectory();
240 }
241
242
243 /**
244 * Handle the selection of the set of files
245 *
246 * @param files The files the user chose
247 * @param directory The directory they chose them from
248 * @return True if the file was successful
249 * @throws Exception
250 */
251 protected boolean selectFilesInner(File[] files, File directory)
252 throws Exception {
253 if ((files == null) || (files.length == 0)) {
254 userMessage("Please select a file");
255 return false;
256 }
257 FileManager.addToHistory(files[0]);
258 List selectedFiles = new ArrayList();
259 String fileNotExistsError = "";
260 boolean didXidv = false;
261
262 for (int i = 0; i < files.length; i++) {
263 if ( !files[i].exists()) {
264 fileNotExistsError += "File does not exist: " + files[i]
265 + "\n";
266 } else {
267 String filename = files[i].toString();
268 //Check for the bundle or jnlp file
269 if (idv.getArgsManager().isXidvFile(filename)
270 || idv.getArgsManager().isZidvFile(filename)
271 || idv.getArgsManager().isJnlpFile(filename)) {
272 didXidv = idv.handleAction(filename, null);
273 } else {
274 selectedFiles.add(filename);
275 }
276 }
277 }
278
279 if (didXidv) {
280 closeChooser();
281 return true;
282 }
283
284
285 if (selectedFiles.size() == 0) {
286 return false;
287 }
288
289 if (fileNotExistsError.length() > 0) {
290 userMessage(fileNotExistsError);
291 return false;
292 }
293
294 Object definingObject = selectedFiles;
295 if (selectedFiles.size() == 1) {
296 definingObject = selectedFiles.get(0);
297 }
298
299 String dataSourceId = getDataSourceId();
300 if (dataSourceId == null) {
301 dataSourceId = dfltDataSourceId;
302 }
303
304 //If the user specifically selected a data source type then pass all files to that data source and be done.
305 DataSourceResults results;
306 if (dataSourceId == null) {
307 //If they selected one directory then ask if they want to load all the files
308 if (selectedFiles.size() == 1) {
309 File file = new File(selectedFiles.get(0).toString());
310 if (file.isDirectory()) {
311 if ( !GuiUtils.showYesNoDialog(null,
312 "Do you want to load all of the files in the selected directory: "
313 + file, "Directory Load")) {
314 return false;
315 }
316 selectedFiles = new ArrayList();
317 definingObject = selectedFiles;
318 File[] subFiles = file.listFiles();
319 for (int i = 0; i < subFiles.length; i++) {
320 if ( !subFiles[i].isDirectory()) {
321 selectedFiles.add(subFiles[i].toString());
322 }
323 }
324 }
325 }
326 }
327
328 Hashtable properties = new Hashtable();
329 return makeDataSource(definingObject, dataSourceId, properties);
330 }
331
332
333 /**
334 * Convert the given array of File objects
335 * to an array of String file names. Only
336 * include the files that actually exist.
337 *
338 * @param files Selected files
339 * @return Selected files as Strings
340 */
341 protected String[] getFileNames(File[] files) {
342 if (files == null) {
343 return (String[]) null;
344 }
345 Vector v = new Vector();
346 String fileNotExistsError = "";
347
348 // NOTE: If multiple files are selected, then missing files
349 // are not in the files array. If one file is selected and
350 // it is not there, then it is in the array and file.exists()
351 // is false
352 for (int i = 0; i < files.length; i++) {
353 if ((files[i] != null) && !files[i].isDirectory()) {
354 if ( !files[i].exists()) {
355 fileNotExistsError += "File does not exist: " + files[i]
356 + "\n";
357 } else {
358 v.add(files[i].toString());
359 }
360 }
361 }
362
363 if (fileNotExistsError.length() > 0) {
364 userMessage(fileNotExistsError);
365 return null;
366 }
367
368 return v.isEmpty()
369 ? null
370 : StringUtil.listToStringArray(v);
371 }
372 }