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