package tim.prune.load;
import java.io.File;
import java.util.ArrayList;
import java.util.TreeSet;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import tim.prune.App;
import tim.prune.config.Config;
import tim.prune.data.Photo;
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 App _app;
private JFileChooser _fileChooser = null;
private JFrame _parentFrame;
private TextFileLoader _textFileLoader = null;
private NmeaFileLoader _nmeaFileLoader = null;
private XmlFileLoader _xmlFileLoader = null;
private ZipFileLoader _zipFileLoader = null;
private GzipFileLoader _gzipFileLoader = null;
/**
* Constructor
* @param inApp Application object to inform of track load
* @param inParentFrame parent frame to reference for dialogs
*/
public FileLoader(App inApp, JFrame inParentFrame)
{
_app = inApp;
_parentFrame = inParentFrame;
_textFileLoader = new TextFileLoader(inApp, inParentFrame);
_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("filetype.txt", new String[] {"txt", "text"}));
_fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.gpx", new String[] {"gpx"}));
_fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.kml", new String[] {"kml"}));
_fileChooser.addChoosableFileFilter(new GenericFileFilter("filetype.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)
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(_parentFrame) == JFileChooser.APPROVE_OPTION)
{
File[] files = _fileChooser.getSelectedFiles();
// Loop through files looking for files which exist and are readable
ArrayList<File> dataFiles = new ArrayList<File>();
if (files != null)
{
for (int i=0; i<files.length; i++)
{
File file = files[i];
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
*/
public void openFile(File inFile)
{
// Store directory in config for later
File parent = inFile.getParentFile();
if (parent != null) {
Config.setConfigString(Config.KEY_TRACK_DIR, parent.getAbsolutePath());
}
// 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(inFile);
}
else if (fileExtension.equals(".kmz") || fileExtension.equals(".zip"))
{
// Use zip loader for zipped kml (or zipped gpx)
_zipFileLoader.openFile(inFile);
}
else if (fileExtension.endsWith(".gz") || fileExtension.equals("gzip"))
{
// Use gzip loader for gzipped xml
_gzipFileLoader.openFile(inFile);
}
else if (fileExtension.equals("nmea"))
{
_nmeaFileLoader.openFile(inFile);
}
else if (fileExtension.equals(".jpg") || fileExtension.equals("jpeg"))
{
Photo photo = JpegLoader.createPhoto(inFile);
TreeSet<Photo> photoSet = new TreeSet<Photo>();
photoSet.add(photo);
_app.informPhotosLoaded(photoSet);
_app.informNoDataLoaded(); // To trigger load of next file if any
}
else
{
// Use text loader for everything else
_textFileLoader.openFile(inFile);
}
}
/**
* @return the last delimiter character used for a text file load
*/
public char getLastUsedDelimiter()
{
return _textFileLoader.getLastUsedDelimiter();
}
}