Ticket #12459: KeepLayerColor.patch

File KeepLayerColor.patch, 13.6 KB (added by kolesar, 8 years ago)
  • data/gpx-extensions.xsd

    diff --git a/data/gpx-extensions.xsd b/data/gpx-extensions.xsd
    index bc5452e..875be90 100644
    a b  
    55    <!-- true, if gpx data has been downloaded from the osm server -->
    66    <!-- it this case, JOSM improves the rendering of clouds of anonymous TrackPoints -->
    77    <element name="from-server" type="boolean"/>
    8    
     8
     9    <!-- custom colors set to this layer -->
     10    <element name="color" type="string"/>
     11    <element name="marker-color" type="string"/>
     12
    913    <!-- the following properties are only set for marker layer export -->
    1014    <element name="offset" type="decimal"/>
    1115    <element name="sync-offset" type="decimal"/>
  • src/org/openstreetmap/josm/data/gpx/GpxData.java

    diff --git a/src/org/openstreetmap/josm/data/gpx/GpxData.java b/src/org/openstreetmap/josm/data/gpx/GpxData.java
    index 88ac490..63ad205 100644
    a b  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.data.gpx;
    33
     4import java.awt.Color;
    45import java.awt.geom.Area;
    56import java.io.File;
    67import java.util.Collection;
    public class GpxData extends WithAttributes implements Data {  
    3132    public File storageFile;
    3233    public boolean fromServer;
    3334
     35    public Color color;
     36    public Color markerColor;
     37
    3438    public String creator;
    3539
    3640    public final Collection<GpxTrack> tracks = new LinkedList<>();
  • src/org/openstreetmap/josm/gui/MapView.java

    diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
    index 530856e..2c0cc6a 100644
    a b implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    10721072        if (evt.getPropertyName().equals(Layer.VISIBLE_PROP)) {
    10731073            repaint();
    10741074        } else if (evt.getPropertyName().equals(Layer.OPACITY_PROP) ||
    1075                 evt.getPropertyName().equals(Layer.FILTER_STATE_PROP)) {
     1075                evt.getPropertyName().equals(Layer.FILTER_STATE_PROP) ||
     1076                evt.getPropertyName().equals(Layer.COLOR_PROP)) {
    10761077            Layer l = (Layer) evt.getSource();
    10771078            if (l.isVisible()) {
    10781079                changedLayer = l;
  • src/org/openstreetmap/josm/gui/layer/CustomizeColor.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/CustomizeColor.java b/src/org/openstreetmap/josm/gui/layer/CustomizeColor.java
    index 2fa5bc3..b562fb8 100644
    a b import javax.swing.JMenuItem;  
    1717import javax.swing.JOptionPane;
    1818
    1919import org.openstreetmap.josm.Main;
     20import org.openstreetmap.josm.data.preferences.BooleanProperty;
    2021import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
    2122import org.openstreetmap.josm.gui.layer.Layer.MultiLayerAction;
    2223import org.openstreetmap.josm.tools.ImageProvider;
    2324
    2425public class CustomizeColor extends AbstractAction implements LayerAction, MultiLayerAction {
    2526    private transient List<Layer> layers;
     27    /**
     28     * Use preferences to save and load customized settings for each layer
     29     * where preferences key contains layer name
     30     */
     31    public static final BooleanProperty USE_PREF_LAYER_NAME = new BooleanProperty("dialog.layer.use-pref-layer-name", false);
    2632
    2733    public CustomizeColor(List<Layer> l) {
    2834        this();
    public class CustomizeColor extends AbstractAction implements LayerAction, Multi  
    7884        switch (answer) {
    7985        case 0:
    8086            for (Layer layer : layers) {
    81                 Main.pref.putColor("layer "+layer.getName(), c.getColor());
     87                if (USE_PREF_LAYER_NAME.get()) {
     88                    Main.pref.putColor("layer "+layer.getName(), c.getColor());
     89                }
     90                layer.setColor(c.getColor());
    8291            }
    8392            break;
    8493        case 1:
    8594            return;
    8695        case 2:
    8796            for (Layer layer : layers) {
    88                 Main.pref.putColor("layer "+layer.getName(), null);
     97                if (USE_PREF_LAYER_NAME.get()) {
     98                    Main.pref.putColor("layer "+layer.getName(), null);
     99                }
     100                layer.setColor(null);
    89101            }
    90102            break;
    91103        }
    92         Main.map.repaint();
    93104    }
    94105}
  • src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
    index 6c54410..e5ee02a 100644
    a b public class GpxLayer extends Layer {  
    8484        return drawHelper.getColor(getName(), ignoreCustom);
    8585    }
    8686
     87    @Override
     88    public void setColor(Color color) {
     89        Color oldValue = data.color;
     90        data.color = color;
     91        if (oldValue == null ? color != null : !oldValue.equals(color)) {
     92            propertyChangeSupport.firePropertyChange(COLOR_PROP, oldValue, color);
     93        }
     94    }
     95
    8796    /**
    8897     * Returns a human readable string that shows the timespan of the given track
    8998     * @param trk The GPX track for which timespan is displayed
  • src/org/openstreetmap/josm/gui/layer/Layer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/Layer.java b/src/org/openstreetmap/josm/gui/layer/Layer.java
    index ed33791..2935922 100644
    a b public abstract class Layer implements Destroyable, MapViewPaintable, Projection  
    8585    public static final String OPACITY_PROP = Layer.class.getName() + ".opacity";
    8686    public static final String NAME_PROP = Layer.class.getName() + ".name";
    8787    public static final String FILTER_STATE_PROP = Layer.class.getName() + ".filterstate";
     88    public static final String COLOR_PROP = Layer.class.getName() + ".color";
    8889
    8990    public static final int ICON_SIZE = 16;
    9091
    public abstract class Layer implements Destroyable, MapViewPaintable, Projection  
    191192    }
    192193
    193194    /**
     195     * Set a Color for this layer.
     196     */
     197    public void setColor(Color color) {
     198    }
     199
     200    /**
    194201     * @return A small tooltip hint about some statistics for this layer.
    195202     */
    196203    public abstract String getToolTipText();
  • src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
    index ed925af..eeefe55 100644
    a b import org.openstreetmap.josm.data.gpx.GpxConstants;  
    2323import org.openstreetmap.josm.data.gpx.GpxData;
    2424import org.openstreetmap.josm.data.gpx.WayPoint;
    2525import org.openstreetmap.josm.gui.MapView;
     26import org.openstreetmap.josm.gui.layer.CustomizeColor;
    2627import org.openstreetmap.josm.tools.ColorScale;
    2728
    2829/**
    public class GpxDrawHelper {  
    137138     * @return the color or null if the color is not constant
    138139     */
    139140    public Color getColor(String layerName, boolean ignoreCustom) {
    140         Color c = Main.pref.getColor(marktr("gps point"), specName(layerName), DEFAULT_COLOR);
    141         return ignoreCustom || getColorMode(layerName) == ColorMode.NONE ? c : null;
     141        Color color = data.color;
     142        if (color == null) {
     143            color = Main.pref.getColor(marktr("gps point"), CustomizeColor.USE_PREF_LAYER_NAME.get() ? specName(layerName) : null, DEFAULT_COLOR);
     144        }
     145        return ignoreCustom || getColorMode(layerName) == ColorMode.NONE ? color : null;
    142146    }
    143147
    144148    /**
    145149     * Read coloring mode for specified layer from preferences
    146150     * @param layerName name of the GpxLayer
    147      * @return coloting mode
     151     * @return coloring mode
    148152     */
    149153    public ColorMode getColorMode(String layerName) {
    150154        try {
  • src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
    index e62d62b..9c73ae0 100644
    a b public class MarkerLayer extends Layer implements JumpToMarkerLayer {  
    190190
    191191    @Override
    192192    public Color getColor(boolean ignoreCustom) {
    193         String name = getName();
    194         return Main.pref.getColor(marktr("gps marker"), name != null ? "layer "+name : null, DEFAULT_COLOR);
     193        Color color = fromLayer.data.markerColor;
     194        if (color == null) {
     195            color = Main.pref.getColor(marktr("gps marker"), CustomizeColor.USE_PREF_LAYER_NAME.get() ? specName(getName()) : null, DEFAULT_COLOR);
     196        }
     197        return color;
     198    }
     199
     200    @Override
     201    public void setColor(Color color) {
     202        fromLayer.data.markerColor = color;
     203    }
     204
     205    private static String specName(String layerName) {
     206        return "layer " + layerName;
    195207    }
    196208
    197209    /* for preferences */
  • src/org/openstreetmap/josm/io/GpxReader.java

    diff --git a/src/org/openstreetmap/josm/io/GpxReader.java b/src/org/openstreetmap/josm/io/GpxReader.java
    index 73372e2..4abd8cd 100644
    a b import org.openstreetmap.josm.data.gpx.GpxLink;  
    2626import org.openstreetmap.josm.data.gpx.GpxRoute;
    2727import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
    2828import org.openstreetmap.josm.data.gpx.WayPoint;
     29import org.openstreetmap.josm.tools.ColorHelper;
    2930import org.openstreetmap.josm.tools.Utils;
    3031import org.xml.sax.Attributes;
    3132import org.xml.sax.InputSource;
    public class GpxReader implements GpxConstants {  
    332333                case "bounds":
    333334                    // do nothing, has been parsed on startElement
    334335                    break;
    335                 default:
    336                     //TODO: parse extensions
    337336                }
    338337                break;
    339338            case author:
    public class GpxReader implements GpxConstants {  
    468467                    currentState = states.pop();
    469468                } else if (JOSM_EXTENSIONS_NAMESPACE_URI.equals(namespaceURI)) {
    470469                    // only interested in extensions written by JOSM
    471                     currentExtensions.put(localName, accumulator.toString());
     470                    switch (localName) {
     471                    case "extensions":
     472                        currentState = states.pop();
     473                        break;
     474                    case "from-server":
     475                        data.fromServer = "true".equals(accumulator.toString());
     476                        break;
     477                    case "color":
     478                        data.color = ColorHelper.html2color(accumulator.toString());
     479                        break;
     480                    case "marker-color":
     481                        data.markerColor = ColorHelper.html2color(accumulator.toString());
     482                        break;
     483                    default:
     484                        currentExtensions.put(localName, accumulator.toString());
     485                    }
    472486                }
    473487                break;
    474488            default:
    public class GpxReader implements GpxConstants {  
    489503        public void endDocument() throws SAXException  {
    490504            if (!states.empty())
    491505                throw new SAXException(tr("Parse error: invalid document structure for GPX document."));
    492             Extensions metaExt = (Extensions) data.get(META_EXTENSIONS);
    493             if (metaExt != null && "true".equals(metaExt.get("from-server"))) {
    494                 data.fromServer = true;
    495             }
    496506            gpxData = data;
    497507        }
    498508
  • src/org/openstreetmap/josm/io/GpxWriter.java

    diff --git a/src/org/openstreetmap/josm/io/GpxWriter.java b/src/org/openstreetmap/josm/io/GpxWriter.java
    index 9a04d09..25fb2d4 100644
    a b import org.openstreetmap.josm.data.gpx.GpxTrack;  
    2626import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
    2727import org.openstreetmap.josm.data.gpx.IWithAttributes;
    2828import org.openstreetmap.josm.data.gpx.WayPoint;
     29import org.openstreetmap.josm.tools.ColorHelper;
    2930
    3031/**
    3132 * Writes GPX files from GPX data or OSM data.
    public class GpxWriter extends XmlWriter implements GpxConstants {  
    5051
    5152    private GpxData data;
    5253    private String indent = "";
     54    private boolean hasExtensions;
    5355
    5456    private static final int WAY_POINT = 0;
    5557    private static final int ROUTE_POINT = 1;
    public class GpxWriter extends XmlWriter implements GpxConstants {  
    6769        // and some extra synchronization info for export of AudioMarkers.
    6870        // It is checked in advance, if any extensions are used, so we know whether
    6971        // a namespace declaration is necessary.
    70         boolean hasExtensions = data.fromServer;
     72        hasExtensions = data.fromServer ||
     73                data.color != null ||
     74                data.markerColor != null;
     75
    7176        if (!hasExtensions) {
    7277            for (WayPoint wpt : data.waypoints) {
    7378                Extensions extensions = (Extensions) wpt.get(META_EXTENSIONS);
    public class GpxWriter extends XmlWriter implements GpxConstants {  
    174179            inline("bounds", b);
    175180        }
    176181
    177         if (data.fromServer) {
     182        if (hasExtensions) {
    178183            openln("extensions");
    179             simpleTag("josm:from-server", "true");
     184            if (data.fromServer) {
     185                simpleTag("josm:from-server", "true");
     186            }
     187            if (data.color != null) {
     188                simpleTag("josm:color", ColorHelper.color2html(data.color, true));
     189            }
     190            if (data.markerColor != null) {
     191                simpleTag("josm:marker-color", ColorHelper.color2html(data.markerColor, true));
     192            }
    180193            closeln("extensions");
    181194        }
    182195