1 package tim.prune.load;
4 import java.util.ArrayList;
5 import java.util.TreeSet;
7 import javax.swing.JFileChooser;
8 import javax.swing.JFrame;
11 import tim.prune.config.Config;
12 import tim.prune.data.Photo;
13 import tim.prune.load.json.JsonFileLoader;
14 import tim.prune.load.xml.GzipFileLoader;
15 import tim.prune.load.xml.XmlFileLoader;
16 import tim.prune.load.xml.ZipFileLoader;
20 * Generic FileLoader class to select a file
21 * and pass handling on to appropriate loader
23 public class FileLoader
26 private JFileChooser _fileChooser = null;
27 private JFrame _parentFrame;
28 private TextFileLoader _textFileLoader = null;
29 private NmeaFileLoader _nmeaFileLoader = null;
30 private XmlFileLoader _xmlFileLoader = null;
31 private ZipFileLoader _zipFileLoader = null;
32 private GzipFileLoader _gzipFileLoader = null;
37 * @param inApp Application object to inform of track load
38 * @param inParentFrame parent frame to reference for dialogs
40 public FileLoader(App inApp, JFrame inParentFrame)
43 _parentFrame = inParentFrame;
44 _textFileLoader = new TextFileLoader(inApp, inParentFrame);
45 _nmeaFileLoader = new NmeaFileLoader(inApp);
46 _xmlFileLoader = new XmlFileLoader(inApp);
47 _zipFileLoader = new ZipFileLoader(inApp, _xmlFileLoader);
48 _gzipFileLoader = new GzipFileLoader(inApp, _xmlFileLoader);
53 * Select an input file and open the GUI frame
54 * to select load options
56 public void openFile()
58 // Construct file chooser if necessary
59 if (_fileChooser == null)
61 _fileChooser = new JFileChooser();
62 _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.txt", new String[] {"txt", "text"}));
63 _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.gpx", new String[] {"gpx"}));
64 _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.kml", new String[] {"kml"}));
65 _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.kmz", new String[] {"kmz"}));
66 _fileChooser.setAcceptAllFileFilterUsed(true);
67 _fileChooser.setFileFilter(_fileChooser.getAcceptAllFileFilter()); // For some reason seems necessary
68 // start from directory in config if already set (by load jpegs)
69 String configDir = Config.getConfigString(Config.KEY_TRACK_DIR);
70 if (configDir == null) {configDir = Config.getConfigString(Config.KEY_PHOTO_DIR);}
71 if (configDir != null) {_fileChooser.setCurrentDirectory(new File(configDir));}
72 _fileChooser.setMultiSelectionEnabled(true); // Allow multiple selections
74 // Show the open dialog
75 if (_fileChooser.showOpenDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
77 File[] files = _fileChooser.getSelectedFiles();
78 // Loop through files looking for files which exist and are readable
79 ArrayList<File> dataFiles = new ArrayList<File>();
82 for (int i=0; i<files.length; i++)
85 if (file.exists() && file.isFile() && file.canRead())
91 if (dataFiles.size() > 0) {
92 _app.loadDataFiles(dataFiles);
96 // couldn't find any files to load - show error message
97 _app.showErrorMessage("error.load.dialogtitle", "error.load.noread");
103 * Open the selected input file
104 * @param inFile file to open
106 public void openFile(File inFile)
108 // Store directory in config for later
109 File parent = inFile.getParentFile();
110 if (parent != null) {
111 Config.setConfigString(Config.KEY_TRACK_DIR, parent.getAbsolutePath());
113 // Check file type to see if it's xml or just normal text
114 String fileExtension = inFile.getName().toLowerCase();
115 if (fileExtension.length() > 4) {
116 fileExtension = fileExtension.substring(fileExtension.length() - 4);
118 if (fileExtension.equals(".kml") || fileExtension.equals(".gpx")
119 || fileExtension.equals(".xml"))
121 // Use xml loader for kml, gpx and xml filenames
122 _xmlFileLoader.openFile(inFile);
124 else if (fileExtension.equals(".kmz") || fileExtension.equals(".zip"))
126 // Use zip loader for zipped kml (or zipped gpx)
127 _zipFileLoader.openFile(inFile);
129 else if (fileExtension.endsWith(".gz") || fileExtension.equals("gzip"))
131 // Use gzip loader for gzipped xml
132 _gzipFileLoader.openFile(inFile);
134 else if (fileExtension.equals("nmea"))
136 _nmeaFileLoader.openFile(inFile);
138 else if (fileExtension.equals(".jpg") || fileExtension.equals("jpeg"))
140 Photo photo = JpegLoader.createPhoto(inFile);
141 TreeSet<Photo> photoSet = new TreeSet<Photo>(new MediaSorter());
143 _app.informPhotosLoaded(photoSet);
144 _app.informNoDataLoaded(); // To trigger load of next file if any
146 else if (fileExtension.equals("json"))
148 new JsonFileLoader(_app).openFile(inFile);
152 // Use text loader for everything else
153 _textFileLoader.openFile(inFile);
158 * @return the last delimiter character used for a text file load
160 public char getLastUsedDelimiter()
162 return _textFileLoader.getLastUsedDelimiter();