]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/save/GpxExporter.java
Version 6, October 2008
[GpsPrune.git] / tim / prune / save / GpxExporter.java
index 98619d1a81dddf0fdef65060a1969f6c582f0c25..5afdda3a91a66e41d3e2fa1cf8e08ea7600a6ce8 100644 (file)
@@ -12,8 +12,10 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 
+import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
 import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
@@ -21,16 +23,18 @@ import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
-import javax.swing.filechooser.FileFilter;
 
+import tim.prune.Config;
 import tim.prune.GpsPruner;
 import tim.prune.I18nManager;
+import tim.prune.UpdateMessageBroker;
 import tim.prune.data.Altitude;
 import tim.prune.data.Coordinate;
 import tim.prune.data.DataPoint;
 import tim.prune.data.Timestamp;
 import tim.prune.data.Track;
 import tim.prune.data.TrackInfo;
+import tim.prune.load.GenericFileFilter;
 
 /**
  * Class to export track information
@@ -43,6 +47,7 @@ public class GpxExporter implements Runnable
        private JDialog _dialog = null;
        private JTextField _nameField = null;
        private JTextField _descriptionField = null;
+       private JCheckBox _timestampsCheckbox = null;
        private JFileChooser _fileChooser = null;
        private File _exportFile = null;
 
@@ -102,6 +107,10 @@ public class GpxExporter implements Runnable
                _descriptionField = new JTextField(10);
                descPanel.add(_descriptionField);
                mainPanel.add(descPanel);
+               // checkbox for timestamps
+               _timestampsCheckbox = new JCheckBox(I18nManager.getText("dialog.exportgpx.includetimestamps"));
+               _timestampsCheckbox.setSelected(true);
+               mainPanel.add(_timestampsCheckbox);
                dialogPanel.add(mainPanel, BorderLayout.CENTER);
 
                // button panel at bottom
@@ -126,6 +135,7 @@ public class GpxExporter implements Runnable
                });
                buttonPanel.add(cancelButton);
                dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
+               dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15));
                return dialogPanel;
        }
 
@@ -137,20 +147,15 @@ public class GpxExporter implements Runnable
        {
                // 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(".gpx")));
-                       }
-                       public String getDescription()
-                       {
-                               return I18nManager.getText("dialog.exportgpx.filetype");
-                       }
-               });
-               _fileChooser.setAcceptAllFileFilterUsed(false);
+               {
+                       _fileChooser = new JFileChooser();
+                       _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
+                       _fileChooser.setFileFilter(new GenericFileFilter("filetype.gpx", new String[] {"gpx"}));
+                       _fileChooser.setAcceptAllFileFilterUsed(false);
+                       // start from directory in config which should be set
+                       File configDir = Config.getWorkingDirectory();
+                       if (configDir != null) {_fileChooser.setCurrentDirectory(configDir);}
+               }
                // Allow choose again if an existing file is selected
                boolean chooseAgain = false;
                do
@@ -201,10 +206,12 @@ public class GpxExporter implements Runnable
 
                        // close file
                        writer.close();
-                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("dialog.save.ok1")
-                                + " " + numPoints + " " + I18nManager.getText("dialog.save.ok2")
-                                + " " + _exportFile.getAbsolutePath(),
-                               I18nManager.getText("dialog.save.oktitle"), JOptionPane.INFORMATION_MESSAGE);
+                       // Store directory in config for later
+                       Config.setWorkingDirectory(_exportFile.getParentFile());
+                       // Show confirmation
+                       UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.save.ok1")
+                                + " " + numPoints + " " + I18nManager.getText("confirm.save.ok2")
+                                + " " + _exportFile.getAbsolutePath());
                        // export successful so need to close dialog and return
                        _dialog.dispose();
                        return;
@@ -236,7 +243,9 @@ public class GpxExporter implements Runnable
                inWriter.write(GPX_VERSION_NUMBER);
                inWriter.write("\" creator=\"");
                inWriter.write(GPX_CREATOR);
-               inWriter.write("\">\n");
+               inWriter.write("\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+                       + " xmlns=\"http://www.topografix.com/GPX/1/0\""
+                       + " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n");
                // Name field
                if (_nameField != null && _nameField.getText() != null && !_nameField.getText().equals(""))
                {
@@ -264,7 +273,7 @@ public class GpxExporter implements Runnable
                for (i=0; i<numPoints; i++)
                {
                        point = _track.getPoint(i);
-                       // Make a blob for each waypoint
+                       // Make a wpt element for each waypoint
                        if (point.isWaypoint())
                        {
                                exportWaypoint(point, inWriter);
@@ -274,18 +283,23 @@ public class GpxExporter implements Runnable
                                hasTrackpoints = true;
                        }
                }
-               // Make a line for the track, if there is one
-               // TODO: Look at segments of track, and split into separate track segments in Gpx if necessary
+               // Output the track, if there is one
                if (hasTrackpoints)
                {
+                       boolean firstPoint = true;
                        inWriter.write("\t<trk><trkseg>\n");
                        // Loop over track points
                        for (i=0; i<numPoints; i++)
                        {
                                point = _track.getPoint(i);
-                               if (!point.isWaypoint())
-                               {
+                               // restart track segment if necessary
+                               if (point.getSegmentStart() && !firstPoint) {
+                                       inWriter.write("\t</trkseg>\n\t<trkseg>\n");
+                               }
+                               if (!point.isWaypoint()) {
+                                       // export the track point
                                        exportTrackpoint(point, inWriter);
+                                       firstPoint = false;
                                }
                        }
                        inWriter.write("\t</trkseg></trk>\n");
@@ -315,11 +329,11 @@ public class GpxExporter implements Runnable
                if (inPoint.hasAltitude())
                {
                        inWriter.write("\t\t<ele>");
-                       inWriter.write("" + inPoint.getAltitude().getValue(Altitude.FORMAT_METRES));
+                       inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.FORMAT_METRES));
                        inWriter.write("</ele>\n");
                }
                // timestamp if available (point might have altitude and then be turned into a waypoint)
-               if (inPoint.hasTimestamp())
+               if (inPoint.hasTimestamp() && _timestampsCheckbox.isSelected())
                {
                        inWriter.write("\t\t<time>");
                        inWriter.write(inPoint.getTimestamp().getText(Timestamp.FORMAT_ISO_8601));
@@ -346,11 +360,11 @@ public class GpxExporter implements Runnable
                if (inPoint.hasAltitude())
                {
                        inWriter.write("<ele>");
-                       inWriter.write("" + inPoint.getAltitude().getValue(Altitude.FORMAT_METRES));
+                       inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.FORMAT_METRES));
                        inWriter.write("</ele>");
                }
-               // timestamp if available
-               if (inPoint.hasTimestamp())
+               // timestamp if available (and selected)
+               if (inPoint.hasTimestamp() && _timestampsCheckbox.isSelected())
                {
                        inWriter.write("<time>");
                        inWriter.write(inPoint.getTimestamp().getText(Timestamp.FORMAT_ISO_8601));