]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/save/FileSaver.java
Version 19, May 2018
[GpsPrune.git] / tim / prune / save / FileSaver.java
index 63810143800e92aca3eeb81944529c563ae76862..45af83e0a7cac09286848f55be8508b3d2e87c9e 100644 (file)
@@ -35,13 +35,15 @@ import tim.prune.App;
 import tim.prune.I18nManager;
 import tim.prune.UpdateMessageBroker;
 import tim.prune.config.Config;
-import tim.prune.data.Altitude;
 import tim.prune.data.Coordinate;
 import tim.prune.data.DataPoint;
 import tim.prune.data.Field;
 import tim.prune.data.FieldList;
+import tim.prune.data.RecentFile;
 import tim.prune.data.Timestamp;
 import tim.prune.data.Track;
+import tim.prune.data.Unit;
+import tim.prune.data.UnitSetLibrary;
 import tim.prune.load.GenericFileFilter;
 import tim.prune.load.OneCharDocument;
 
@@ -71,8 +73,8 @@ public class FileSaver
 
        private static final int[] FORMAT_COORDS = {Coordinate.FORMAT_NONE, Coordinate.FORMAT_DEG_MIN_SEC,
                Coordinate.FORMAT_DEG_MIN, Coordinate.FORMAT_DEG};
-       private static final Altitude.Format[] FORMAT_ALTS = {Altitude.Format.NO_FORMAT, Altitude.Format.METRES, Altitude.Format.FEET};
-       private static final int[] FORMAT_TIMES = {Timestamp.FORMAT_ORIGINAL, Timestamp.FORMAT_LOCALE, Timestamp.FORMAT_ISO_8601};
+       private static final Unit[] UNIT_ALTS = {null, UnitSetLibrary.UNITS_METRES, UnitSetLibrary.UNITS_FEET};
+       private static final Timestamp.Format[] FORMAT_TIMES = {Timestamp.Format.ORIGINAL, Timestamp.Format.LOCALE, Timestamp.Format.ISO8601};
 
 
        /**
@@ -100,17 +102,25 @@ public class FileSaver
                        _dialog.getContentPane().add(makeDialogComponents());
                        _dialog.pack();
                }
+               // Has the track got media?
+               final boolean hasMedia = _app.getTrackInfo().getPhotoList().hasCorrelatedPhotos()
+                       || _app.getTrackInfo().getAudioList().hasCorrelatedAudios();
                // Check field list
                Track track = _app.getTrackInfo().getTrack();
                FieldList fieldList = track.getFieldList();
                int numFields = fieldList.getNumFields();
-               _model = new FieldSelectionTableModel(numFields);
+               _model = new FieldSelectionTableModel(numFields + (hasMedia ? 1 : 0));
                for (int i=0; i<numFields; i++)
                {
                        Field field = fieldList.getField(i);
                        FieldInfo info = new FieldInfo(field, track.hasData(field));
                        _model.addFieldInfo(info, i);
                }
+               // Add a field for photos / audio if any present
+               if (hasMedia)
+               {
+                       _model.addFieldInfo(new FieldInfo(Field.MEDIA_FILENAME, true), numFields);
+               }
                // Initialise dialog and show it
                initDialog(_model, inDefaultDelimiter);
                _dialog.setVisible(true);
@@ -397,8 +407,6 @@ public class FileSaver
                        _fileChooser = new JFileChooser();
                        _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
                        _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.setAcceptAllFileFilterUsed(true);
                        // start from directory in config which should be set
                        String configDir = Config.getConfigString(Config.KEY_TRACK_DIR);
@@ -429,15 +437,15 @@ public class FileSaver
                for (int i=0; i<_coordUnitsRadios.length; i++)
                        if (_coordUnitsRadios[i].isSelected())
                                coordFormat = FORMAT_COORDS[i];
-               Altitude.Format altitudeFormat = Altitude.Format.NO_FORMAT;
+               Unit altitudeUnit = null;
                for (int i=0; i<_altitudeUnitsRadios.length; i++)
                {
                        if (_altitudeUnitsRadios[i].isSelected()) {
-                               altitudeFormat = FORMAT_ALTS[i];
+                               altitudeUnit = UNIT_ALTS[i];
                        }
                }
                // Get timestamp format
-               int timestampFormat = Timestamp.FORMAT_ORIGINAL;
+               Timestamp.Format timestampFormat = Timestamp.Format.ORIGINAL;
                for (int i=0; i<_timestampUnitsRadios.length; i++)
                {
                        if (_timestampUnitsRadios[i].isSelected()) {
@@ -445,9 +453,12 @@ public class FileSaver
                        }
                }
 
+               // Correct chosen filename if necessary
+               final File saveFile = (isFilenameOk(inSaveFile)?inSaveFile:new File(inSaveFile.getAbsolutePath() + ".txt"));
+
                // Check if file exists, and confirm overwrite if necessary
                Object[] buttonTexts = {I18nManager.getText("button.overwrite"), I18nManager.getText("button.cancel")};
-               if (!inSaveFile.exists() || JOptionPane.showOptionDialog(_parentFrame,
+               if (!saveFile.exists() || JOptionPane.showOptionDialog(_parentFrame,
                                I18nManager.getText("dialog.save.overwrite.text"),
                                I18nManager.getText("dialog.save.overwrite.title"), JOptionPane.YES_NO_OPTION,
                                JOptionPane.WARNING_MESSAGE, null, buttonTexts, buttonTexts[1])
@@ -456,7 +467,7 @@ public class FileSaver
                        try
                        {
                                // Create output file
-                               writer = new FileWriter(inSaveFile);
+                               writer = new FileWriter(saveFile);
                                // Determine delimiter character to use
                                final char delimiter = getDelimiter();
                                FieldInfo info = null;
@@ -499,8 +510,9 @@ public class FileSaver
                                {
                                        DataPoint point = track.getPoint(p);
                                        boolean savePoint = ((point.isWaypoint() && _pointTypeSelector.getWaypointsSelected())
-                                               || (!point.isWaypoint() && point.getPhoto()==null && _pointTypeSelector.getTrackpointsSelected())
-                                               || (!point.isWaypoint() && point.getPhoto()!=null && _pointTypeSelector.getPhotopointsSelected()))
+                                               || (!point.isWaypoint() && !point.hasMedia() && _pointTypeSelector.getTrackpointsSelected())
+                                               || (!point.isWaypoint() && point.getPhoto()!=null && _pointTypeSelector.getPhotopointsSelected())
+                                               || (!point.isWaypoint() && point.getAudio()!=null && _pointTypeSelector.getAudiopointsSelected()))
                                                && (!_pointTypeSelector.getJustSelection() || (p>=selStart && p<=selEnd));
                                        if (!savePoint) {continue;}
                                        numSaved++;
@@ -511,12 +523,11 @@ public class FileSaver
                                                info = _model.getFieldInfo(f);
                                                if (info.isSelected())
                                                {
-                                                       if (!firstField)
-                                                       {
-                                                               // output field separator
+                                                       // output field separator
+                                                       if (!firstField) {
                                                                buffer.append(delimiter);
                                                        }
-                                                       saveField(buffer, point, info.getField(), coordFormat, altitudeFormat, timestampFormat);
+                                                       saveField(buffer, point, info.getField(), coordFormat, altitudeUnit, timestampFormat);
                                                        firstField = false;
                                                }
                                        }
@@ -525,11 +536,14 @@ public class FileSaver
                                        writer.write(lineSeparator);
                                }
                                // Store directory in config for later
-                               Config.setConfigString(Config.KEY_TRACK_DIR, inSaveFile.getParentFile().getAbsolutePath());
+                               Config.setConfigString(Config.KEY_TRACK_DIR, saveFile.getParentFile().getAbsolutePath());
+                               // Add to recent file list
+                               Config.getRecentFileList().addFile(new RecentFile(inSaveFile, true));
                                // Save successful
+                               UpdateMessageBroker.informSubscribers();
                                UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.save.ok1")
                                         + " " + numSaved + " " + I18nManager.getText("confirm.save.ok2")
-                                        + " " + inSaveFile.getAbsolutePath());
+                                        + " " + saveFile.getAbsolutePath());
                                _app.informDataSaved();
                        }
                        catch (IOException ioe)
@@ -562,11 +576,11 @@ public class FileSaver
         * @param inPoint point object
         * @param inField field object
         * @param inCoordFormat coordinate format
-        * @param inAltitudeFormat altitude format
+        * @param inAltitudeUnit altitude unit
         * @param inTimestampFormat timestamp format
         */
        private void saveField(StringBuffer inBuffer, DataPoint inPoint, Field inField,
-               int inCoordFormat, Altitude.Format inAltitudeFormat, int inTimestampFormat)
+               int inCoordFormat, Unit inAltitudeUnit, Timestamp.Format inTimestampFormat)
        {
                // Output field according to type
                if (inField == Field.LATITUDE)
@@ -581,7 +595,7 @@ public class FileSaver
                {
                        try
                        {
-                               inBuffer.append(inPoint.getAltitude().getStringValue(inAltitudeFormat));
+                               inBuffer.append(inPoint.getAltitude().getStringValue(inAltitudeUnit));
                        }
                        catch (NullPointerException npe) {}
                }
@@ -589,14 +603,15 @@ public class FileSaver
                {
                        if (inPoint.hasTimestamp())
                        {
-                               if (inTimestampFormat == Timestamp.FORMAT_ORIGINAL) {
-                                       // output original string
-                                       inBuffer.append(inPoint.getFieldValue(Field.TIMESTAMP));
-                               }
-                               else {
-                                       // format value accordingly
-                                       inBuffer.append(inPoint.getTimestamp().getText(inTimestampFormat));
-                               }
+                               // format value accordingly
+                               inBuffer.append(inPoint.getTimestamp().getText(inTimestampFormat, null));
+                       }
+               }
+               else if (inField == Field.MEDIA_FILENAME)
+               {
+                       if (inPoint.hasMedia())
+                       {
+                               inBuffer.append(inPoint.getMediaName());
                        }
                }
                else
@@ -627,4 +642,17 @@ public class FileSaver
                // Wasn't any of those so must be 'other'
                return _otherDelimiterText.getText().charAt(0);
        }
+
+
+       /**
+        * Check the selected filename to see if it is acceptable
+        * @param inFile chosen file to save
+        * @return true if filename is ok
+        */
+       private static boolean isFilenameOk(File inFile)
+       {
+               String filename = inFile.getName().toLowerCase();
+               return (filename.length() <4 || (!filename.endsWith(".gpx")
+                       && !filename.endsWith(".kml") && !filename.endsWith(".kmz") && !filename.endsWith(".zip")));
+       }
 }