Ticket #21931: 21931.patch

File 21931.patch, 15.0 KB (added by Bjoeni, 19 months ago)
  • src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java

    ### Eclipse Workspace Patch 1.0
    #P josm
     
    168168                data.addAll(markers);
    169169            }
    170170        }
     171
     172        if (fromLayer != null && !data.isEmpty()) {
     173            fromLayer.setLinkedMarkerLayer(this);
     174        }
    171175    }
    172176
    173177    @Override
  • src/org/openstreetmap/josm/actions/SaveAction.java

     
    44import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
    7 import java.awt.GridBagLayout;
    87import java.awt.event.KeyEvent;
    98import java.beans.PropertyChangeListener;
    109import java.io.File;
    1110
    12 import javax.swing.JCheckBox;
    13 import javax.swing.JLabel;
    14 import javax.swing.JPanel;
    15 import javax.swing.SwingConstants;
    16 
    17 import org.openstreetmap.josm.data.gpx.GpxConstants;
    18 import org.openstreetmap.josm.gui.ExtendedDialog;
    19 import org.openstreetmap.josm.gui.MainApplication;
    2011import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
    21 import org.openstreetmap.josm.gui.layer.GpxLayer;
    2212import org.openstreetmap.josm.gui.layer.Layer;
    2313import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
    2414import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
    2515import org.openstreetmap.josm.gui.layer.SaveToFile;
    2616import org.openstreetmap.josm.gui.util.GuiHelper;
    27 import org.openstreetmap.josm.spi.preferences.Config;
    28 import org.openstreetmap.josm.tools.GBC;
    2917import org.openstreetmap.josm.tools.Shortcut;
    3018
    3119/**
     
    10088    @Override
    10189    public File getFile(Layer layer) {
    10290        File f = layer.getAssociatedFile();
    103         if (f != null && !f.exists()) {
    104             f = null;
     91        if (f == null || !f.exists()) {
     92            f = layer.createAndOpenSaveFileChooser();
    10593        }
    106 
    107         // Ask for overwrite in case of GpxLayer
    108         if (f != null
    109                 && layer instanceof GpxLayer
    110                 && (((GpxLayer) layer).data == null
    111                 || !GpxConstants.JOSM_CREATOR_NAME.equals(((GpxLayer) layer).data.creator))
    112                 && !Config.getPref().getBoolean("gpx.export.overwrite", false)) {
    113 
    114             JPanel p = new JPanel(new GridBagLayout());
    115             JLabel label = new JLabel("<html>"
    116                     + tr("The file \"{0}\" will be modified.<br>Would you like to overwrite the existing file?", f.getName())
    117                     + "</html>");
    118             label.setHorizontalAlignment(SwingConstants.CENTER);
    119             JCheckBox remember = new JCheckBox(tr("Always overwrite GPX files without asking"));
    120             remember.setHorizontalAlignment(SwingConstants.CENTER);
    121             p.add(label, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 5, 10));
    122             p.add(remember, GBC.eop().fill(GBC.HORIZONTAL));
    123             ExtendedDialog dialog = new ExtendedDialog(
    124                     MainApplication.getMainFrame(),
    125                     tr("Overwrite"),
    126                     tr("Overwrite"), tr("Save As..."), tr("Cancel"))
    127                 .setButtonIcons("save", "save_as", "cancel")
    128                 .setContent(p);
    129             int val = dialog.showDialog().getValue();
    130             if (val == 1) {
    131                 Config.getPref().putBoolean("gpx.export.overwrite", remember.isSelected());
    132             } else if (val == 2) {
    133                 f = null;
    134             } else {
    135                 return null;
    136             }
    137         }
    138         return f == null ? layer.createAndOpenSaveFileChooser() : f;
     94        return f;
    13995    }
    14096}
  • src/org/openstreetmap/josm/actions/SaveActionBase.java

     
    135135            return false;
    136136
    137137        Notification savingNotification = showSavingNotification(file.getName());
     138        layer.setAssociatedFile(file);
    138139        try {
    139140            boolean exported = false;
    140141            boolean canceled = false;
     
    145146                    } else {
    146147                        exporter.exportData(file, layer);
    147148                    }
     149                    file = layer.getAssociatedFile();
    148150                    exported = true;
    149151                    canceled = exporter.isCanceled();
    150152                    break;
     
    161163            if (!layer.isRenamed()) {
    162164                layer.setName(file.getName());
    163165            }
    164             layer.setAssociatedFile(file);
    165166            if (layer instanceof AbstractModifiableLayer) {
    166167                ((AbstractModifiableLayer) layer).onPostSaveToFile();
    167168            }
  • src/org/openstreetmap/josm/io/nmea/NmeaReader.java

     
    232232    @Override
    233233    public boolean parse(boolean tryToFinish) throws SAXException, IOException {
    234234        // create the data tree
    235         data = new GpxData();
     235        data = new GpxData(true);
    236236        Collection<Collection<WayPoint>> currentTrack = new ArrayList<>();
    237237
    238238        try (BufferedReader rd = new BufferedReader(new InputStreamReader(source, StandardCharsets.UTF_8))) {
     
    268268        } catch (IllegalDataException e) {
    269269            Logging.warn(e);
    270270            return false;
     271        } finally {
     272            data.endUpdate();
    271273        }
    272274        return true;
    273275    }
  • src/org/openstreetmap/josm/io/ozi/OziWptReader.java

     
    5151
    5252    @Override
    5353    public boolean parse(boolean tryToFinish) throws SAXException, IOException {
    54         data = new GpxData();
     54        data = new GpxData(true);
    5555        Collection<Collection<WayPoint>> currentTrack = new ArrayList<>();
    5656        Collection<WayPoint> waypoints = new ArrayList<>();
    5757        try (BufferedReader rd = new BufferedReader(new InputStreamReader(source, StandardCharsets.UTF_8))) {
     
    9797        }
    9898        currentTrack.add(waypoints);
    9999        data.tracks.add(new GpxTrack(currentTrack, Collections.<String, Object>emptyMap()));
     100        data.endUpdate();
    100101        return true;
    101102    }
    102103
  • src/org/openstreetmap/josm/io/rtklib/RtkLibPosReader.java

     
    6060
    6161    @Override
    6262    public boolean parse(boolean tryToFinish) throws SAXException, IOException {
    63         data = new GpxData();
     63        data = new GpxData(true);
    6464        Collection<Collection<WayPoint>> currentTrack = new ArrayList<>();
    6565        Collection<WayPoint> waypoints = new ArrayList<>();
    6666        try (BufferedReader rd = new BufferedReader(new InputStreamReader(source, StandardCharsets.UTF_8))) {
     
    102102        }
    103103        currentTrack.add(waypoints);
    104104        data.tracks.add(new GpxTrack(currentTrack, Collections.<String, Object>emptyMap()));
     105        data.endUpdate();
    105106        return true;
    106107    }
    107108
  • src/org/openstreetmap/josm/actions/SaveAsAction.java

     
    2929    }
    3030
    3131    /**
     32     * A file indicating that a potential overwrite has been confirmed by the user
     33     * @since xxx
     34     */
     35    public static class OverwritableFile extends File {
     36        /**
     37         * Construct an @link {@link OverwritableFile}
     38         * @param pathname A pathname String
     39         */
     40        public OverwritableFile(String pathname) {
     41            super(pathname);
     42        }
     43    }
     44
     45    /**
    3246     * Returns the unique instance.
    3347     * @return the unique instance
    3448     */
     
    3751    }
    3852
    3953    @Override protected File getFile(Layer layer) {
    40         return layer.createAndOpenSaveFileChooser();
     54        return new OverwritableFile(layer.createAndOpenSaveFileChooser().getPath());
    4155    }
    4256}
  • src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java

     
    2525import javax.swing.JPanel;
    2626import javax.swing.JScrollPane;
    2727import javax.swing.ListSelectionModel;
     28import javax.swing.SwingConstants;
    2829
     30import org.openstreetmap.josm.actions.SaveAsAction;
    2931import org.openstreetmap.josm.data.gpx.GpxConstants;
    3032import org.openstreetmap.josm.data.gpx.GpxData;
    3133import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
     
    4244import org.openstreetmap.josm.spi.preferences.Config;
    4345import org.openstreetmap.josm.tools.CheckParameterUtil;
    4446import org.openstreetmap.josm.tools.GBC;
     47import org.openstreetmap.josm.tools.Utils;
    4548
    4649/**
    4750 * Exports data to a .gpx file. Data may be native GPX or OSM data which will be converted.
     
    7881
    7982    @Override
    8083    public boolean acceptFile(File pathname, Layer layer) {
    81         return isSupportedLayer(layer) ? super.acceptFile(pathname, layer) : false;
     84        return isSupportedLayer(layer);
    8285    }
    8386
    8487    @Override
     
    98101                    .getClass().getName()));
    99102        CheckParameterUtil.ensureParameterNotNull(file, "file");
    100103
    101         String fn = file.getPath();
    102         if (fn.indexOf('.') == -1) {
    103             fn += ".gpx";
    104             file = new File(fn);
     104        if (!Utils.hasExtension(file, "gpx")) {
     105            String pth = file.getPath() + ".gpx";
     106            file = new File(pth);
    105107        }
    106108
    107         GpxData gpxData;
    108         if (quiet) {
    109             gpxData = getGpxData(layer, file);
    110             try (OutputStream fo = Compression.getCompressedFileOutputStream(file)) {
    111                 GpxWriter w = new GpxWriter(fo);
    112                 w.write(gpxData);
    113                 w.close();
    114                 fo.flush();
     109        // Ask if GPX file should be overwritten
     110        if (!(file instanceof SaveAsAction.OverwritableFile)
     111                && file.exists()
     112                && (((GpxLayer) layer).data == null || !GpxConstants.JOSM_CREATOR_NAME.equals(((GpxLayer) layer).data.creator))
     113                && !Config.getPref().getBoolean("gpx.export.overwrite", false)) {
     114
     115            JPanel p = new JPanel(new GridBagLayout());
     116            JLabel label = new JLabel("<html>"
     117                    + tr("The file \"{0}\" will be modified.<br>Would you like to overwrite the existing file?", file.getName())
     118                    + "</html>");
     119            label.setHorizontalAlignment(SwingConstants.CENTER);
     120            JCheckBox remember = new JCheckBox(tr("Always overwrite GPX files without asking"));
     121            remember.setHorizontalAlignment(SwingConstants.CENTER);
     122            p.add(label, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 5, 10));
     123            p.add(remember, GBC.eop().fill(GBC.HORIZONTAL));
     124            ExtendedDialog dialog = new ExtendedDialog(
     125                    MainApplication.getMainFrame(),
     126                    tr("Overwrite"),
     127                    tr("Overwrite"), tr("Save As..."), tr("Cancel"))
     128                .setButtonIcons("save", "save_as", "cancel")
     129                .setContent(p);
     130            int val = dialog.showDialog().getValue();
     131            if (val == 1) {
     132                Config.getPref().putBoolean("gpx.export.overwrite", remember.isSelected());
     133            } else if (val == 2) {
     134                file = layer.createAndOpenSaveFileChooser();
     135            } else {
     136                file = null;
    115137            }
     138        }
     139
     140        if (file == null) {
     141            setCanceled(true);
    116142            return;
    117143        }
    118144
     145        GpxWriteOptions opts;
     146        if (quiet) {
     147            opts = new GpxWriteOptions(getGpxData(layer, file), ColorFormat.GPXD, true);
     148        } else {
     149            opts = askGpxAttributes(layer, file);
     150        }
     151
     152        if (opts == null) return;
     153        layer.setAssociatedFile(file);
     154
     155        try (OutputStream fo = Compression.getCompressedFileOutputStream(file)) {
     156            GpxWriter w = new GpxWriter(fo);
     157            w.write(opts.gpxData, opts.cFormat, opts.saveLayerPrefs);
     158            w.close();
     159            fo.flush();
     160        }
     161    }
     162
     163    private GpxWriteOptions askGpxAttributes(Layer layer, File file) {
     164        GpxData gpxData;
     165
    119166        // open the dialog asking for options
    120167        JPanel p = new JPanel(new GridBagLayout());
    121168
     
    217264
    218265        if (ed.showDialog().getValue() != 1) {
    219266            setCanceled(true);
    220             return;
     267            return null;
    221268        }
    222269        setCanceled(false);
    223270
     
    267314            gpxData.put(META_KEYWORDS, keywords.getText());
    268315        }
    269316
    270         try (OutputStream fo = Compression.getCompressedFileOutputStream(file)) {
    271             GpxWriter w = new GpxWriter(fo);
    272             w.write(gpxData, cFormat, layerPrefs.isSelected());
    273             w.close();
    274             fo.flush();
    275         }
     317        return new GpxWriteOptions(gpxData, cFormat, layerPrefs.isSelected());
    276318    }
    277319
    278320    /**
     
    423465        authorActionListener.actionPerformed(null);
    424466        authorNameListener.keyReleased(null);
    425467    }
     468
     469    private static class GpxWriteOptions {
     470        GpxData gpxData;
     471        ColorFormat cFormat;
     472        boolean saveLayerPrefs;
     473
     474        GpxWriteOptions(GpxData gpxData, ColorFormat cFormat, boolean saveLayerPrefs) {
     475            this.gpxData = gpxData;
     476            this.cFormat = cFormat;
     477            this.saveLayerPrefs = saveLayerPrefs;
     478        }
     479    }
    426480}
  • src/org/openstreetmap/josm/gui/io/importexport/GpxImporter.java

     
    175175            markerLayer = new MarkerLayer(data, tr("Markers from {0}", gpxLayerName), data.storageFile, gpxLayer);
    176176            if (markerLayer.data.isEmpty()) {
    177177                markerLayer = null;
    178             } else {
    179                 gpxLayer.setLinkedMarkerLayer(markerLayer);
    180178            }
    181179        }
    182180        if (Config.getPref().getBoolean("gpx.makeautoroutes", true) && !data.getRoutes().isEmpty()) {