package tim.prune.save; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import tim.prune.App; import tim.prune.I18nManager; import tim.prune.data.Coordinate; import tim.prune.data.DataPoint; import tim.prune.data.Field; import tim.prune.data.Track; /** * Class to export track information * into a specified Kml file */ public class KmlExporter { private App _app = null; private JFrame _parentFrame = null; private Track _track = null; private JFileChooser _fileChooser = null; /** * Constructor giving App object, frame and track * @param inApp application object to inform of success * @param inParentFrame parent frame * @param inTrack track object to save */ public KmlExporter(App inApp, JFrame inParentFrame, Track inTrack) { _app = inApp; _parentFrame = inParentFrame; _track = inTrack; } /** * Show the dialog to select options and export file */ public boolean showDialog() { boolean fileSaved = false; Object description = JOptionPane.showInputDialog(_parentFrame, I18nManager.getText("dialog.exportkml.text"), I18nManager.getText("dialog.exportkml.title"), JOptionPane.QUESTION_MESSAGE, null, null, ""); if (description != null) { // OK pressed, so choose output file if (_fileChooser == null) _fileChooser = new JFileChooser(); _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); _fileChooser.setFileFilter(new FileFilter() { public boolean accept(File f) { return (f != null && (f.isDirectory() || f.getName().toLowerCase().endsWith(".kml"))); } public String getDescription() { return "KML files"; } }); _fileChooser.setAcceptAllFileFilterUsed(false); // Allow choose again if an existing file is selected boolean chooseAgain = false; do { chooseAgain = false; if (_fileChooser.showSaveDialog(_parentFrame) == JFileChooser.APPROVE_OPTION) { // OK pressed and file chosen File file = _fileChooser.getSelectedFile(); if (!file.getName().toLowerCase().endsWith(".kml")) { file = new File(file.getAbsolutePath() + ".kml"); } // Check if file exists - if so don't overwrite if (file.exists()) { JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.save.fileexists"), I18nManager.getText("error.save.dialogtitle"), JOptionPane.ERROR_MESSAGE); chooseAgain = true; } else { if (exportFile(file, description.toString())) { fileSaved = true; } else { chooseAgain = true; } } } } while (chooseAgain); } return fileSaved; } /** * Export the track data to the specified file with description * @param inFile File object to save to * @param inDescription description to use, if any */ private boolean exportFile(File inFile, String inDescription) { try { FileWriter writer = new FileWriter(inFile); writer.write("\n\n\n"); writer.write("\t"); writer.write(inDescription); writer.write("\n"); int i = 0; DataPoint point = null; boolean hasTrackpoints = false; // Loop over waypoints int numPoints = _track.getNumPoints(); for (i=0; i\n\t\ttrack\n\t\t\n\t\t\n\t\t\t"); // Loop over track points for (i=0; i\n\t\t\n\t"); } writer.write("\n"); writer.close(); JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("dialog.save.ok1") + " " + numPoints + " " + I18nManager.getText("dialog.save.ok2") + inFile.getAbsolutePath(), I18nManager.getText("dialog.save.oktitle"), JOptionPane.INFORMATION_MESSAGE); return true; } catch (IOException ioe) { JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.save.failed") + ioe.getMessage(), I18nManager.getText("error.save.dialogtitle"), JOptionPane.ERROR_MESSAGE); } return false; } /** * Export the specified waypoint into the file * @param inPoint waypoint to export * @param inWriter writer object */ private void exportWaypoint(DataPoint inPoint, Writer inWriter) throws IOException { inWriter.write("\t\n\t\t"); inWriter.write(inPoint.getFieldValue(Field.WAYPT_NAME).trim()); inWriter.write("\n"); inWriter.write("\t\t\n\t\t\t"); inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); inWriter.write(','); inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); inWriter.write(",0\n\t\t\n\t\n"); } /** * Export the specified trackpoint into the file * @param inPoint trackpoint to export * @param inWriter writer object */ private void exportTrackpoint(DataPoint inPoint, Writer inWriter) throws IOException { inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); inWriter.write(','); inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); // Altitude not exported, locked to ground by Google Earth inWriter.write(",0\n"); } }