]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/load/FileLoader.java
8669e189c94043b4e3ab91889c4acf4b5e52dc0e
[GpsPrune.git] / tim / prune / load / FileLoader.java
1 package tim.prune.load;
2
3 import java.io.File;
4 import java.util.ArrayList;
5 import java.util.TreeSet;
6
7 import javax.swing.JFileChooser;
8 import javax.swing.JFrame;
9
10 import tim.prune.App;
11 import tim.prune.config.Config;
12 import tim.prune.data.Photo;
13 import tim.prune.load.xml.GzipFileLoader;
14 import tim.prune.load.xml.XmlFileLoader;
15 import tim.prune.load.xml.ZipFileLoader;
16
17
18 /**
19  * Generic FileLoader class to select a file
20  * and pass handling on to appropriate loader
21  */
22 public class FileLoader
23 {
24         private App _app;
25         private JFileChooser _fileChooser = null;
26         private JFrame _parentFrame;
27         private TextFileLoader _textFileLoader = null;
28         private NmeaFileLoader _nmeaFileLoader = null;
29         private XmlFileLoader _xmlFileLoader = null;
30         private ZipFileLoader _zipFileLoader = null;
31         private GzipFileLoader _gzipFileLoader = null;
32
33
34         /**
35          * Constructor
36          * @param inApp Application object to inform of track load
37          * @param inParentFrame parent frame to reference for dialogs
38          */
39         public FileLoader(App inApp, JFrame inParentFrame)
40         {
41                 _app = inApp;
42                 _parentFrame = inParentFrame;
43                 _textFileLoader = new TextFileLoader(inApp, inParentFrame);
44                 _nmeaFileLoader = new NmeaFileLoader(inApp);
45                 _xmlFileLoader = new XmlFileLoader(inApp);
46                 _zipFileLoader = new ZipFileLoader(inApp, _xmlFileLoader);
47                 _gzipFileLoader = new GzipFileLoader(inApp, _xmlFileLoader);
48         }
49
50
51         /**
52          * Select an input file and open the GUI frame
53          * to select load options
54          */
55         public void openFile()
56         {
57                 // Construct file chooser if necessary
58                 if (_fileChooser == null)
59                 {
60                         _fileChooser = new JFileChooser();
61                         _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.txt", new String[] {"txt", "text"}));
62                         _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.gpx", new String[] {"gpx"}));
63                         _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.kml", new String[] {"kml"}));
64                         _fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.kmz", new String[] {"kmz"}));
65                         _fileChooser.setAcceptAllFileFilterUsed(true);
66                         // start from directory in config if already set (by load jpegs)
67                         String configDir = Config.getConfigString(Config.KEY_TRACK_DIR);
68                         if (configDir == null) {configDir = Config.getConfigString(Config.KEY_PHOTO_DIR);}
69                         if (configDir != null) {_fileChooser.setCurrentDirectory(new File(configDir));}
70                         _fileChooser.setMultiSelectionEnabled(true); // Allow multiple selections
71                 }
72                 // Show the open dialog
73                 if (_fileChooser.showOpenDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
74                 {
75                         File[] files = _fileChooser.getSelectedFiles();
76                         // Loop through files looking for files which exist and are readable
77                         ArrayList<File> dataFiles = new ArrayList<File>();
78                         if (files != null)
79                         {
80                                 for (int i=0; i<files.length; i++)
81                                 {
82                                         File file = files[i];
83                                         if (file.exists() && file.isFile() && file.canRead())
84                                         {
85                                                 dataFiles.add(file);
86                                         }
87                                 }
88                         }
89                         if (dataFiles.size() > 0) {
90                                 _app.loadDataFiles(dataFiles);
91                         }
92                         else
93                         {
94                                 // couldn't find any files to load - show error message
95                                 _app.showErrorMessage("error.load.dialogtitle", "error.load.noread");
96                         }
97                 }
98         }
99
100         /**
101          * Open the selected input file
102          * @param inFile file to open
103          */
104         public void openFile(File inFile)
105         {
106                 // Store directory in config for later
107                 File parent = inFile.getParentFile();
108                 if (parent != null) {
109                         Config.setConfigString(Config.KEY_TRACK_DIR, parent.getAbsolutePath());
110                 }
111                 // Check file type to see if it's xml or just normal text
112                 String fileExtension = inFile.getName().toLowerCase();
113                 if (fileExtension.length() > 4) {
114                         fileExtension = fileExtension.substring(fileExtension.length() - 4);
115                 }
116                 if (fileExtension.equals(".kml") || fileExtension.equals(".gpx")
117                         || fileExtension.equals(".xml"))
118                 {
119                         // Use xml loader for kml, gpx and xml filenames
120                         _xmlFileLoader.openFile(inFile);
121                 }
122                 else if (fileExtension.equals(".kmz") || fileExtension.equals(".zip"))
123                 {
124                         // Use zip loader for zipped kml (or zipped gpx)
125                         _zipFileLoader.openFile(inFile);
126                 }
127                 else if (fileExtension.endsWith(".gz") || fileExtension.equals("gzip"))
128                 {
129                         // Use gzip loader for gzipped xml
130                         _gzipFileLoader.openFile(inFile);
131                 }
132                 else if (fileExtension.equals("nmea"))
133                 {
134                         _nmeaFileLoader.openFile(inFile);
135                 }
136                 else if (fileExtension.equals(".jpg") || fileExtension.equals("jpeg"))
137                 {
138                         Photo photo = JpegLoader.createPhoto(inFile);
139                         TreeSet<Photo> photoSet = new TreeSet<Photo>();
140                         photoSet.add(photo);
141                         _app.informPhotosLoaded(photoSet);
142                         _app.informNoDataLoaded(); // To trigger load of next file if any
143                 }
144                 else
145                 {
146                         // Use text loader for everything else
147                         _textFileLoader.openFile(inFile);
148                 }
149         }
150
151         /**
152          * @return the last delimiter character used for a text file load
153          */
154         public char getLastUsedDelimiter()
155         {
156                 return _textFileLoader.getLastUsedDelimiter();
157         }
158 }