Ticket #20913: 20913-v2.1.patch

File 20913-v2.1.patch, 30.3 KB (added by Bjoeni, 3 years ago)
  • trunk/src/org/openstreetmap/josm/actions/SaveAction.java

    diff --git a/trunk/src/org/openstreetmap/josm/actions/SaveAction.java b/trunk/src/org/openstreetmap/josm/actions/SaveAction.java
    a b  
    115115        // Ask for overwrite in case of GpxLayer
    116116        if (f != null && layer instanceof GpxLayer && !Config.getPref().getBoolean("gpx.export.overwrite", false)) {
    117117            JPanel p = new JPanel(new GridBagLayout());
    118             JLabel label = new JLabel(tr("File {0} exists. Overwrite?", f.getName()));
     118            JLabel label = new JLabel("<html>" + tr("The file \"{0}\" has been changed.<br>Would you like to overwrite the existing file?", f.getName()) + "</html>");
    119119            label.setHorizontalAlignment(SwingConstants.CENTER);
    120120            JCheckBox remember = new JCheckBox(tr("Remember choice"));
    121121            remember.setHorizontalAlignment(SwingConstants.CENTER);
     
    124124            ExtendedDialog dialog = new ExtendedDialog(
    125125                    MainApplication.getMainFrame(),
    126126                    tr("Overwrite"),
    127                     tr("Overwrite"), tr("Cancel"))
    128                 .setButtonIcons("save_as", "cancel")
     127                    tr("Overwrite"), tr("New file"), tr("Cancel"))
     128                .setButtonIcons("save", "save_as", "cancel")
    129129                .setContent(p);
    130             if (dialog.showDialog().getValue() != 1) {
     130            int val = dialog.showDialog().getValue();
     131            if (val == 1) {
     132                Config.getPref().putBoolean("gpx.export.overwrite", remember.isSelected());
     133            } else if (val == 2) {
    131134                f = null;
    132             } else if (remember.isSelected()) {
    133                 Config.getPref().putBoolean("gpx.export.overwrite", true);
     135            } else {
     136                return null;
    134137            }
    135138        }
    136139        return f == null ? layer.createAndOpenSaveFileChooser() : f;
  • trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java

    diff --git a/trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java b/trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
    a b  
    1919import java.util.Map;
    2020import java.util.Set;
    2121import java.util.stream.Collectors;
     22import java.util.stream.Stream;
    2223
    2324import javax.swing.BorderFactory;
    2425import javax.swing.JCheckBox;
     
    3233import javax.swing.border.EtchedBorder;
    3334import javax.swing.filechooser.FileFilter;
    3435
     36import org.openstreetmap.josm.data.preferences.BooleanProperty;
    3537import org.openstreetmap.josm.gui.ExtendedDialog;
    3638import org.openstreetmap.josm.gui.HelpAwareOptionPane;
    3739import org.openstreetmap.josm.gui.MainApplication;
    3840import org.openstreetmap.josm.gui.MapFrame;
    3941import org.openstreetmap.josm.gui.MapFrameListener;
     42import org.openstreetmap.josm.gui.Notification;
     43import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
    4044import org.openstreetmap.josm.gui.layer.Layer;
    4145import org.openstreetmap.josm.gui.util.WindowGeometry;
    4246import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
     
    5862    private transient Map<Layer, SessionLayerExporter> exporters;
    5963    private transient MultiMap<Layer, Layer> dependencies;
    6064
     65    private static final BooleanProperty SAVE_LOCAL_FILES_PROP = new BooleanProperty("session.savelocal", true);
     66
    6167    /**
    6268     * Constructs a new {@code SessionSaveAsAction}.
    6369     */
     
    156162                .filter(layer -> exporters.get(layer) != null && exporters.get(layer).shallExport())
    157163                .collect(Collectors.toList());
    158164
     165        Stream<Layer> layersToSaveStream = layersOut.stream()
     166                .filter(Layer::isSavable)
     167                .filter(layer -> !(layer instanceof AbstractModifiableLayer) || ((AbstractModifiableLayer) layer).isModified())
     168                .filter(layer -> exporters.get(layer) != null && !exporters.get(layer).requiresZip());
     169
     170        if (SAVE_LOCAL_FILES_PROP.get()) {
     171            // individual files must be saved before the session file as the location may change
     172
     173            if (layersToSaveStream
     174                .map(layer -> SaveAction.getInstance().doSave(layer, true))
     175                .collect(Collectors.toList()) //force evaluation of all elements
     176                .contains(false)) {
     177
     178                new Notification(tr("Not all local files referenced by the session file could be saved.<br>Make sure you save them before closing JOSM."))
     179                    .setIcon(JOptionPane.WARNING_MESSAGE)
     180                    .setDuration(Notification.TIME_LONG)
     181                    .show();
     182            }
     183
     184        } else if (layersToSaveStream.anyMatch(l -> l instanceof AbstractModifiableLayer)) {
     185            new Notification(tr("Not all local files referenced by the session file are saved yet.<br>Make sure you save them before closing JOSM."))
     186                .setIcon(JOptionPane.INFORMATION_MESSAGE)
     187                .setDuration(Notification.TIME_LONG)
     188                .show();
     189        }
     190
    159191        int active = -1;
    160192        Layer activeLayer = getLayerManager().getActiveLayer();
    161193        if (activeLayer != null) {
     
    241273        }
    242274
    243275        protected final Component build() {
     276            JPanel op = new JPanel(new GridBagLayout());
    244277            JPanel ip = new JPanel(new GridBagLayout());
    245278            for (Layer layer : layers) {
    246279                JPanel wrapper = new JPanel(new GridBagLayout());
     
    263296            p.add(sp, GBC.eol().fill());
    264297            final JTabbedPane tabs = new JTabbedPane();
    265298            tabs.addTab(tr("Layers"), p);
    266             return tabs;
     299            op.add(tabs, GBC.eol().fill());
     300            JCheckBox chkSaveLocal = new JCheckBox(tr("Save all local files to disk"), SAVE_LOCAL_FILES_PROP.get());
     301            chkSaveLocal.addChangeListener(l -> {
     302                SAVE_LOCAL_FILES_PROP.put(chkSaveLocal.isSelected());
     303            });
     304            op.add(chkSaveLocal);
     305            return op;
    267306        }
    268307
    269308        protected final Component getDisabledExportPanel(Layer layer) {
  • trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java

    diff --git a/trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java b/trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java
    a b  
    4141 *
    4242 * @author Raphael Mack &lt;ramack@raphael-mack.de&gt;
    4343 */
    44 public class GpxData extends WithAttributes implements Data {
     44public class GpxData extends WithAttributes implements Data, IGpxLayerPrefs {
    4545
    4646    /**
    4747     * Constructs a new GpxData.
     
    981981     * @return Modifiable map
    982982     * @since 15496
    983983     */
     984    @Override
    984985    public Map<String, String> getLayerPrefs() {
    985986        return layerPrefs;
    986987    }
     
    11751176     * @param value modified flag
    11761177     * @since 15496
    11771178     */
     1179    @Override
    11781180    public void setModified(boolean value) {
    1179         modified = value;
     1181        if (!initializing) {
     1182            modified = value;
     1183        }
    11801184    }
    11811185
    11821186    /**
  • trunk/src/org/openstreetmap/josm/data/gpx/IGpxLayerPrefs.java

    diff --git a/trunk/src/org/openstreetmap/josm/data/gpx/IGpxLayerPrefs.java b/trunk/src/org/openstreetmap/josm/data/gpx/IGpxLayerPrefs.java
    new file mode 100644
    a b  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.data.gpx;
     3
     4import java.util.Map;
     5
     6/**
     7 * Interface containing the layer preferences.
     8 * Implemented by GpxLayer and MarkerLayer
     9 * @since xxx
     10 */
     11public interface IGpxLayerPrefs {
     12
     13    /**
     14     * The layer specific prefs formerly saved in the preferences, e.g. drawing options.
     15     * NOT the track specific settings (e.g. color, width)
     16     * @return Modifiable map
     17     */
     18    Map<String, String> getLayerPrefs();
     19
     20    /**
     21     * Sets the modified flag to the value.
     22     * @param value modified flag
     23     */
     24    void setModified(boolean value);
     25
     26}
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    diff --git a/trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java b/trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
    a b  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.layer;
    33
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5import static org.openstreetmap.josm.tools.I18n.trn;
     6
     7import java.awt.Color;
     8import java.awt.Dimension;
     9import java.awt.Graphics2D;
     10import java.awt.event.ActionEvent;
     11import java.io.File;
     12import java.time.Instant;
     13import java.util.ArrayList;
     14import java.util.Arrays;
     15import java.util.Collections;
     16import java.util.List;
     17import java.util.NoSuchElementException;
     18import java.util.stream.Collectors;
     19
     20import javax.swing.AbstractAction;
     21import javax.swing.Action;
     22import javax.swing.Icon;
     23import javax.swing.JScrollPane;
     24import javax.swing.SwingUtilities;
     25
    426import org.openstreetmap.josm.actions.AutoScaleAction;
    527import org.openstreetmap.josm.actions.ExpertToggleAction;
    628import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
     
    4163import org.openstreetmap.josm.tools.Utils;
    4264import org.openstreetmap.josm.tools.date.Interval;
    4365
    44 import javax.swing.AbstractAction;
    45 import javax.swing.Action;
    46 import javax.swing.Icon;
    47 import javax.swing.JScrollPane;
    48 import javax.swing.SwingUtilities;
    49 import java.awt.Color;
    50 import java.awt.Dimension;
    51 import java.awt.Graphics2D;
    52 import java.awt.event.ActionEvent;
    53 import java.io.File;
    54 import java.time.Instant;
    55 import java.util.ArrayList;
    56 import java.util.Arrays;
    57 import java.util.Collections;
    58 import java.util.List;
    59 import java.util.NoSuchElementException;
    60 import java.util.stream.Collectors;
    61 
    62 import static org.openstreetmap.josm.tools.I18n.tr;
    63 import static org.openstreetmap.josm.tools.I18n.trn;
    64 
    6566/**
    6667 * A layer that displays data from a Gpx file / the OSM gpx downloads.
    6768 */
     
    592593
    593594    @Override
    594595    public synchronized void destroy() {
     596        if (linkedMarkerLayer != null && MainApplication.getLayerManager().containsLayer(linkedMarkerLayer)) {
     597            linkedMarkerLayer.data.transferLayerPrefs(data.getLayerPrefs());
     598        }
    595599        data.clear();
    596600        data = null;
    597601        super.destroy();
  • trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java

    diff --git a/trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java b/trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
    a b  
    2020import java.util.ArrayList;
    2121import java.util.Collection;
    2222import java.util.Comparator;
     23import java.util.HashMap;
    2324import java.util.List;
     25import java.util.Map;
    2426import java.util.Optional;
    2527
    2628import javax.swing.AbstractAction;
     
    3739import org.openstreetmap.josm.data.gpx.GpxData;
    3840import org.openstreetmap.josm.data.gpx.GpxExtension;
    3941import org.openstreetmap.josm.data.gpx.GpxLink;
     42import org.openstreetmap.josm.data.gpx.IGpxLayerPrefs;
    4043import org.openstreetmap.josm.data.gpx.WayPoint;
    4144import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    4245import org.openstreetmap.josm.data.preferences.IntegerProperty;
     
    5659import org.openstreetmap.josm.gui.preferences.display.GPXSettingsPanel;
    5760import org.openstreetmap.josm.io.audio.AudioPlayer;
    5861import org.openstreetmap.josm.spi.preferences.Config;
     62import org.openstreetmap.josm.tools.ColorHelper;
    5963import org.openstreetmap.josm.tools.ImageProvider;
    6064import org.openstreetmap.josm.tools.Logging;
    6165import org.openstreetmap.josm.tools.Utils;
     
    7680    /**
    7781     * A list of markers.
    7882     */
    79     public final List<Marker> data;
     83    public final MarkerData data;
    8084    private boolean mousePressed;
    8185    public GpxLayer fromLayer;
    8286    private Marker currentMarker;
     
    100104    public MarkerLayer(GpxData indata, String name, File associatedFile, GpxLayer fromLayer) {
    101105        super(name);
    102106        this.setAssociatedFile(associatedFile);
    103         this.data = new ArrayList<>();
     107        this.data = new MarkerData();
    104108        this.fromLayer = fromLayer;
    105109        double firstTime = -1.0;
    106110        String lastLinkedFile = "";
    107111
    108         Color c = null;
    109         String cs = GPXSettingsPanel.tryGetLayerPrefLocal(indata, "markers.color");
     112        String cs = GPXSettingsPanel.tryGetDataPrefLocal(indata, "markers.color");
    110113        if (cs != null) {
    111             try {
    112                 c = Color.decode(cs);
    113             } catch (NumberFormatException ex) {
     114            Color c = ColorHelper.html2color(cs);
     115            if (c != null) {
     116                setPrivateColors(c);
     117            } else {
    114118                Logging.warn("Could not read marker color: " + cs);
    115119            }
    116120        }
    117         setPrivateColors(c);
    118121
    119122        for (WayPoint wpt : indata.waypoints) {
    120123            /* calculate time differences in waypoints */
     
    459462     * @return <code>true</code> if text should be shown, <code>false</code> otherwise.
    460463     */
    461464    private boolean isTextOrIconShown() {
    462         return Boolean.parseBoolean(GPXSettingsPanel.getLayerPref(fromLayer, "markers.show-text"));
     465        return Boolean.parseBoolean(GPXSettingsPanel.getDataPref(data, "markers.show-text"));
    463466    }
    464467
    465468    @Override
     
    475478    @Override
    476479    public void setColor(Color color) {
    477480        setPrivateColors(color);
    478         if (fromLayer != null) {
    479             String cs = null;
    480             if (color != null) {
    481                 cs = String.format("#%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue());
    482             }
    483             GPXSettingsPanel.putLayerPrefLocal(fromLayer, "markers.color", cs);
     481        String cs = null;
     482        if (color != null) {
     483            cs = ColorHelper.color2html(color);
    484484        }
     485        GPXSettingsPanel.putDataPrefLocal(data, "markers.color", cs);
    485486        invalidate();
    486487    }
    487488
     
    533534
    534535        @Override
    535536        public void actionPerformed(ActionEvent e) {
    536             GPXSettingsPanel.putLayerPrefLocal(layer.fromLayer, "markers.show-text", Boolean.toString(!layer.isTextOrIconShown()));
     537            GPXSettingsPanel.putDataPrefLocal(layer.data, "markers.show-text", Boolean.toString(!layer.isTextOrIconShown()));
    537538            layer.invalidate();
    538539        }
    539540
     
    617618            invalidate();
    618619        }
    619620    }
     621
     622    /**
     623     * the data of a MarkerLayer
     624     */
     625    public class MarkerData extends ArrayList<Marker> implements IGpxLayerPrefs {
     626
     627        private Map<String, String> ownLayerPrefs;
     628
     629        @Override
     630        public Map<String, String> getLayerPrefs() {
     631            if (ownLayerPrefs == null && fromLayer != null && fromLayer.data != null) {
     632                return fromLayer.data.getLayerPrefs();
     633            }
     634            // fallback to own layerPrefs if the corresponding gpxLayer has already been deleted
     635            // by the user or never existed when loaded from a session file
     636            if (ownLayerPrefs == null) {
     637                ownLayerPrefs = new HashMap<>();
     638            }
     639            return ownLayerPrefs;
     640        }
     641
     642        /**
     643         * Transfers the layerPrefs from the GpxData to MarkerData (when GpxData is deleted)
     644         * @param gpxLayerPrefs the layerPrefs from the GpxData object
     645         */
     646        public void transferLayerPrefs(Map<String, String> gpxLayerPrefs) {
     647            ownLayerPrefs = new HashMap<>(gpxLayerPrefs);
     648        }
     649
     650        @Override
     651        public void setModified(boolean value) {
     652            if (fromLayer != null && fromLayer.data != null) {
     653                fromLayer.data.setModified(value);
     654            }
     655        }
     656
     657    }
    620658}
  • trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java

    diff --git a/trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java b/trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
    a b  
    2929import org.apache.commons.jcs3.access.exception.InvalidArgumentException;
    3030import org.openstreetmap.josm.actions.ExpertToggleAction;
    3131import org.openstreetmap.josm.data.gpx.GpxData;
     32import org.openstreetmap.josm.data.gpx.IGpxLayerPrefs;
    3233import org.openstreetmap.josm.gui.MainApplication;
    3334import org.openstreetmap.josm.gui.layer.GpxLayer;
    3435import org.openstreetmap.josm.gui.layer.gpx.GpxDrawHelper;
     
    172173     * @return the value
    173174     */
    174175    public static String getLayerPref(GpxLayer layer, String key) {
     176        GpxData data = layer != null ? layer.data : null;
     177        return getDataPref(data, key);
     178    }
     179
     180    /**
     181     * Reads the preference for the given layer or the default preference if not available
     182     * @param data the data. Can be <code>null</code>, default preference will be returned then
     183     * @param key the drawing key to be read, without "draw.rawgps."
     184     * @return the value
     185     */
     186    public static String getDataPref(IGpxLayerPrefs data, String key) {
    175187        Object d = DEFAULT_PREFS.get(key);
    176188        String ds;
    177189        if (d != null) {
     
    180192            Logging.warn("No default value found for layer preference \"" + key + "\".");
    181193            ds = null;
    182194        }
    183         return Optional.ofNullable(tryGetLayerPrefLocal(layer, key)).orElse(Config.getPref().get("draw.rawgps." + key, ds));
     195        return Optional.ofNullable(tryGetDataPrefLocal(data, key)).orElse(Config.getPref().get("draw.rawgps." + key, ds));
    184196    }
    185197
    186198    /**
     
    190202     * @return the integer value
    191203     */
    192204    public static int getLayerPrefInt(GpxLayer layer, String key) {
    193         String s = getLayerPref(layer, key);
     205        GpxData data = layer != null ? layer.data : null;
     206        return getDataPrefInt(data, key);
     207    }
     208
     209    /**
     210     * Reads the integer preference for the given data or the default preference if not available
     211     * @param data the data. Can be <code>null</code>, default preference will be returned then
     212     * @param key the drawing key to be read, without "draw.rawgps."
     213     * @return the integer value
     214     */
     215    public static int getDataPrefInt(IGpxLayerPrefs data, String key) {
     216        String s = getDataPref(data, key);
    194217        if (s != null) {
    195218            try {
    196219                return Integer.parseInt(s);
     
    213236     * @return the value or <code>null</code> if not found
    214237     */
    215238    public static String tryGetLayerPrefLocal(GpxLayer layer, String key) {
    216         return layer != null ? tryGetLayerPrefLocal(layer.data, key) : null;
     239        return layer != null ? tryGetDataPrefLocal(layer.data, key) : null;
    217240    }
    218241
    219242    /**
     
    222245     * @param key the drawing key to be read, without "draw.rawgps."
    223246     * @return the value or <code>null</code> if not found
    224247     */
    225     public static String tryGetLayerPrefLocal(GpxData data, String key) {
     248    public static String tryGetDataPrefLocal(IGpxLayerPrefs data, String key) {
    226249        return data != null ? data.getLayerPrefs().get(key) : null;
    227250    }
    228251
     
    236259        String v = value == null ? null : value.toString();
    237260        if (layers != null) {
    238261            for (GpxLayer l : layers) {
    239                 putLayerPrefLocal(l.data, key, v);
     262                putDataPrefLocal(l.data, key, v);
    240263            }
    241264        } else {
    242265            Config.getPref().put("draw.rawgps." + key, v);
     
    251274     */
    252275    public static void putLayerPrefLocal(GpxLayer layer, String key, String value) {
    253276        if (layer == null) return;
    254         putLayerPrefLocal(layer.data, key, value);
     277        putDataPrefLocal(layer.data, key, value);
    255278    }
    256279
    257280    /**
     
    260283     * @param key the drawing key to be written, without "draw.rawgps."
    261284     * @param value the value or <code>null</code> to remove key
    262285     */
    263     public static void putLayerPrefLocal(GpxData data, String key, String value) {
     286    public static void putDataPrefLocal(IGpxLayerPrefs data, String key, String value) {
     287        if (data == null) return;
     288        data.setModified(true);
    264289        if (value == null || value.trim().isEmpty() ||
    265290                (getLayerPref(null, key).equals(value) && DEFAULT_PREFS.get(key) != null && DEFAULT_PREFS.get(key).toString().equals(value))) {
    266291            data.getLayerPrefs().remove(key);
  • trunk/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java

    diff --git a/trunk/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java b/trunk/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java
    a b  
    109109         */
    110110        public void write(MarkerLayer layer) {
    111111            GpxData data = new GpxData();
     112            layer.data.getLayerPrefs().forEach((k, v) -> {
     113                if (k != null && k.indexOf("markers.") == 0) {
     114                    data.getLayerPrefs().put(k, v);
     115                }
     116            });
    112117            data.put(GpxData.META_DESC, "exported JOSM marker layer");
    113118            for (Marker m : layer.data) {
    114119                data.waypoints.add(m.convertToWayPoint());
  • trunk/src/org/openstreetmap/josm/io/session/SessionReader.java

    diff --git a/trunk/src/org/openstreetmap/josm/io/session/SessionReader.java b/trunk/src/org/openstreetmap/josm/io/session/SessionReader.java
    a b  
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.awt.Color;
    76import java.awt.GraphicsEnvironment;
    87import java.io.BufferedInputStream;
    98import java.io.File;
     
    4645import org.openstreetmap.josm.io.Compression;
    4746import org.openstreetmap.josm.io.IllegalDataException;
    4847import org.openstreetmap.josm.tools.CheckParameterUtil;
    49 import org.openstreetmap.josm.tools.ColorHelper;
    5048import org.openstreetmap.josm.tools.JosmRuntimeException;
    5149import org.openstreetmap.josm.tools.Logging;
    5250import org.openstreetmap.josm.tools.MultiMap;
     
    619617                    Logging.warn(ex);
    620618                }
    621619            }
    622             String colorString = el.getAttribute("color");
    623             if (colorString != null) {
    624                 try {
    625                     Color color = ColorHelper.html2color(colorString);
    626                     layer.setColor(color);
    627                 } catch (RuntimeException ex) {
    628                     Logging.warn("Cannot parse color " + colorString);
    629                 }
    630             }
    631620            layer.setName(names.get(entry.getKey()));
    632621            layers.add(layer);
    633622        }
  • trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java

    diff --git a/trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java b/trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java
    a b  
    4343import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
    4444import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
    4545import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
    46 import org.openstreetmap.josm.tools.ColorHelper;
    4746import org.openstreetmap.josm.tools.JosmRuntimeException;
    4847import org.openstreetmap.josm.tools.Logging;
    4948import org.openstreetmap.josm.tools.MultiMap;
     
    240239            if (!Utils.equalsEpsilon(layer.getOpacity(), 1.0)) {
    241240                el.setAttribute("opacity", Double.toString(layer.getOpacity()));
    242241            }
    243             if (layer.getColor() != null) {
    244                 el.setAttribute("color", ColorHelper.color2html(layer.getColor()));
    245             }
    246242            Set<Layer> deps = dependencies.get(layer);
    247243            final String depends = deps == null ? "" : deps.stream().map(depLayer -> {
    248244                int depIndex = layers.indexOf(depLayer);
  • trunk/test/data/sessions/gpx_markers.jos

    diff --git a/trunk/test/data/sessions/gpx_markers.jos b/trunk/test/data/sessions/gpx_markers.jos
    a b  
    1515        <layer index="1" name="GPX layer name" type="tracks" version="0.1" visible="true">
    1616            <file>layers/01/data.gpx</file>
    1717        </layer>
    18         <layer color="#34567812" index="2" name="Marker layer name" opacity="0.5" type="markers" version="0.1" visible="true">
     18        <layer index="2" name="Marker layer name" opacity="0.5" type="markers" version="0.1" visible="true">
    1919            <file>layers/02/data.gpx</file>
    2020        </layer>
    2121    </layers>
  • trunk/test/data/sessions/gpx_markers.joz

    diff --git a/trunk/test/data/sessions/gpx_markers.joz b/trunk/test/data/sessions/gpx_markers.joz
    GIT binary patch
    literal 1636
    zc$^FHW@Zs#;Nak3=q|eu#DD~ZfH)_yGPS5!-@s5mC9xz?FTJ2*Zji74V*`;r${*!*
    z-Y;DKWAPSV7rz~Ey|gbVF$&$9ZC*J=XQS-Rwk7}Ta@(hgt#uIiIjQpVv$HnQbNW{~
    zpHGO*F0p*va#rBQEt9oz(>LFq{r=|5H+!t?gkIO(xoDs+v-noimt)g@JYWCX`^)23
    zd<Snxzc%EWbZhF5gTMDJD3M@$<ePsj?A~_emA#7^eJr2;_`%Vtf3bW2v6Zp@e-xLo
    zzum+7!Ry-+Mk$*VgI^77;(FbB-$dQ6%kjwib!^PGO7FS6`*io~UyM`E+*+Vn%6mKP
    zx|m+5o{w&A*Y|~mUlf(AR2OGoP-m{4CZGO5%T17LPtKC*S4DhG9=yuhC6p1cOGWjq
    za>SLByb+GV4_p5nw|RL?@#-tTUqbrNROYXrmTsX~s4l78^R&C;L}CBtD8CbO>c>m8
    ze`kGT<&5YFQ{fI5dv~zyIotZDx{O=4OMl^*E#$v0HX=V=$L;*4>L#Ij>qwpOpPKXE
    zFKZ3^HE+j){5Kp`8;lLV$nEVcn~|;kB$`#!{&eKA3Jdcd(U*V3Os1-RRQMi$cgMBE
    zbL(8gk6aJ<%N*d%&awE}Bf0sE3=9XD85jbHie4i`^oIE6&jCiS`>Fa3cMi|naQ1ke
    zh-6XrQmsH`)v1f_#Z)MkFe=~Xe6xT3*=eyJx6dxSb8pYbJs)qh#eXerjdOSzWOnk9
    zdQRhllPPg#uA6?8{XcnIXWgaK+;Lm}Hn!D1N}i%A;I@jT{%2Krv)z3=g%{B)dECM_
    zUF57YTGp%ic2}Ro%~MXD$2Y0ZT(eR&c>b>+pO|juFF0<$bRB<ojAIISuNl{YD~nVu
    z1706&z87(2*M)h-hM^nY{^4nj={)x?Z{3kJuf2Nd-*!*%2))o?IN$D0%>7jV0Pgi$
    zZY?^Q5VPuZ1pnOZnViNfU(;A#__lrashYdE-0gGRze?kOa`*nPD>g2C_2{vw#6)i8
    zOSLopwAbVn^}gD)vc<DNWJ2kNsJbJ}j~0EENX(J7bonBDE^DW|+8onmi{BLf%RiEI
    zt~91oc11L6|AIGv+mowR9Fni_<t9#l;1d>f)rh?(&gCl)XIeYwG(UgNqF<+&mTz8L
    zym*`PRzcGx?-C_1ut}<J(p}D6k!1c(^hopJFU|*)wk6H++fcvb2LH7Hnbw@UQeU)g
    zR<5}`VL{WC{zJTxQ6IUM=>|ugX8c^+pS!2w?&eS#w!#zpimkTvo#Zw4k0=mNsQXnP
    z)iF)Q=DJhCtwRC53wc_9i|(?x91lt(SwEbnKLMr@OICbogd2#9Q;Ul;^Yiqw@{5;F
    zI+%UPK;r28L;u<*RL@@aYR#l;lPjb+cE6dmbiUp!Gu6)6zwf8J-CdQOyupG0es%wG
    z{rFSUVwVPRAM=WRKI0gtTL5?LsjBIZ7vFZ1j1yDdc70oy&JDY7qW(!;-R**(+P4bb
    zlg_=9$~UXwR-<FrZkhCtHqw_fXQi1e?Ju#5{F$}n*Q^(>QiZMNT`sYEZEKXXsY%;G
    z^vA9hFYRwOe%j+Xr{(j^v?qKmrf%;YE%<G8{sbw1T(-2KQIctsPK()w6$d!pZAm<$
    zT|To-T5iT0UY(z7=lp!?wDFeBdhy3OR>>-7!hhs%@cB6Tz5AVR-6s}D53fs5ikyDo
    zXKF%7^&A=d!eWl>_h;h{d6>s|l)svv(>2lB)Gn-b#?kHXJEJn6uKu*o*!{rw@OxgY
    zM`w1bOqp`$W5xB79+u=CEdsv;&GsHzXRdF)B;721hs7Uu-M`wmQa9D5r2Lp&{ScgM
    zJ0+!+BY`m@2hO#OOd<@3I6=<QLJa5tvyevDj~v^m`tLJhD+SQ?BfE_oML#nON(u?^
    RW@Q5l1K~~}J(U&20|2&tzI6Zq