]> gitweb.fperrin.net Git - GpsPrune.git/blob - src/tim/prune/load/FileLoader.java
Version 20.4, May 2021
[GpsPrune.git] / src / 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.json.JsonFileLoader;
14 import tim.prune.load.xml.GzipFileLoader;
15 import tim.prune.load.xml.XmlFileLoader;
16 import tim.prune.load.xml.ZipFileLoader;
17
18
19 /**
20  * Generic FileLoader class to select a file
21  * and pass handling on to appropriate loader
22  */
23 public class FileLoader
24 {
25         private App _app;
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;
33
34
35         /**
36          * Constructor
37          * @param inApp Application object to inform of track load
38          * @param inParentFrame parent frame to reference for dialogs
39          */
40         public FileLoader(App inApp, JFrame inParentFrame)
41         {
42                 _app = inApp;
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);
49         }
50
51
52         /**
53          * Select an input file and open the GUI frame
54          * to select load options
55          */
56         public void openFile()
57         {
58                 // Construct file chooser if necessary
59                 if (_fileChooser == null)
60                 {
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
73                 }
74                 // Show the open dialog
75                 if (_fileChooser.showOpenDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
76                 {
77                         File[] files = _fileChooser.getSelectedFiles();
78                         // Loop through files looking for files which exist and are readable
79                         ArrayList<File> dataFiles = new ArrayList<File>();
80                         if (files != null)
81                         {
82                                 for (int i=0; i<files.length; i++)
83                                 {
84                                         File file = files[i];
85                                         if (file.exists() && file.isFile() && file.canRead())
86                                         {
87                                                 dataFiles.add(file);
88                                         }
89                                 }
90                         }
91                         if (dataFiles.size() > 0) {
92                                 _app.loadDataFiles(dataFiles);
93                         }
94                         else
95                         {
96                                 // couldn't find any files to load - show error message
97                                 _app.showErrorMessage("error.load.dialogtitle", "error.load.noread");
98                         }
99                 }
100         }
101
102         /**
103          * Open the selected input file
104          * @param inFile file to open
105          */
106         public void openFile(File inFile)
107         {
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());
112                 }
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);
117                 }
118                 if (fileExtension.equals(".kml") || fileExtension.equals(".gpx")
119                         || fileExtension.equals(".xml"))
120                 {
121                         // Use xml loader for kml, gpx and xml filenames
122                         _xmlFileLoader.openFile(inFile);
123                 }
124                 else if (fileExtension.equals(".kmz") || fileExtension.equals(".zip"))
125                 {
126                         // Use zip loader for zipped kml (or zipped gpx)
127                         _zipFileLoader.openFile(inFile);
128                 }
129                 else if (fileExtension.endsWith(".gz") || fileExtension.equals("gzip"))
130                 {
131                         // Use gzip loader for gzipped xml
132                         _gzipFileLoader.openFile(inFile);
133                 }
134                 else if (fileExtension.equals("nmea"))
135                 {
136                         _nmeaFileLoader.openFile(inFile);
137                 }
138                 else if (fileExtension.equals(".jpg") || fileExtension.equals("jpeg"))
139                 {
140                         Photo photo = JpegLoader.createPhoto(inFile);
141                         TreeSet<Photo> photoSet = new TreeSet<Photo>(new MediaSorter());
142                         photoSet.add(photo);
143                         _app.informPhotosLoaded(photoSet);
144                         _app.informNoDataLoaded(); // To trigger load of next file if any
145                 }
146                 else if (fileExtension.equals("json"))
147                 {
148                         new JsonFileLoader(_app).openFile(inFile);
149                 }
150                 else
151                 {
152                         // Use text loader for everything else
153                         _textFileLoader.openFile(inFile);
154                 }
155         }
156
157         /**
158          * @return the last delimiter character used for a text file load
159          */
160         public char getLastUsedDelimiter()
161         {
162                 return _textFileLoader.getLastUsedDelimiter();
163         }
164 }