001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm.visitor.paint;
003
004import static org.openstreetmap.josm.tools.I18n.marktr;
005
006import java.awt.Color;
007import java.util.List;
008
009import org.openstreetmap.josm.Main;
010import org.openstreetmap.josm.data.Preferences.ColorKey;
011import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
012import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
013import org.openstreetmap.josm.gui.mappaint.StyleSource;
014
015public enum PaintColors implements ColorKey {
016
017    INACTIVE(marktr("inactive"), Color.darkGray),
018    SELECTED(marktr("selected"), Color.red),
019    RELATIONSELECTED(marktr("Relation: selected"), Color.magenta),
020    NODE(marktr("Node: standard"), Color.yellow),
021    CONNECTION(marktr("Node: connection"), Color.yellow),
022    TAGGED(marktr("Node: tagged"), new Color(204, 255, 255)), // light cyan
023    DEFAULT_WAY(marktr("way"), new Color(0, 0, 128)), // dark blue
024    RELATION(marktr("relation"), new Color(0, 128, 128)), // teal
025    UNTAGGED_WAY(marktr("untagged way"), new Color(0, 128, 0)), // dark green
026    BACKGROUND(marktr("background"), Color.BLACK),
027    HIGHLIGHT(marktr("highlight"), SELECTED.get()),
028    HIGHLIGHT_WIREFRAME(marktr("highlight wireframe"), Color.orange),
029
030    UNTAGGED(marktr("untagged"), Color.GRAY),
031    TEXT(marktr("text"), Color.WHITE),
032    AREA_TEXT(marktr("areatext"), Color.LIGHT_GRAY);
033
034    private final String name;
035    private final Color defaultColor;
036
037    private static volatile Color backgroundColorCache;
038
039    private static final MapPaintSylesUpdateListener styleOverrideListener = new MapPaintSylesUpdateListener() {
040
041        @Override
042        public void mapPaintStylesUpdated() {
043            backgroundColorCache = null;
044        }
045
046        @Override
047        public void mapPaintStyleEntryUpdated(int idx) {
048            mapPaintStylesUpdated();
049        }
050    };
051
052    static {
053        MapPaintStyles.addMapPaintSylesUpdateListener(styleOverrideListener);
054    }
055
056    PaintColors(String name, Color defaultColor) {
057        this.name = name;
058        this.defaultColor = defaultColor;
059    }
060
061    @Override
062    public String getColorName() {
063        return name;
064    }
065
066    @Override
067    public Color getDefaultValue() {
068        return defaultColor;
069    }
070
071    @Override
072    public String getSpecialName() {
073        return null;
074    }
075
076    public Color get() {
077        return Main.pref.getColor(this);
078    }
079
080    public static void getColors() {
081        for (PaintColors c:values()) {
082            c.get();
083        }
084    }
085
086    public static Color getBackgroundColor() {
087        if (backgroundColorCache != null)
088            return backgroundColorCache;
089        List<StyleSource> sources = MapPaintStyles.getStyles().getStyleSources();
090        for (StyleSource s : sources) {
091            if (!s.active) {
092                continue;
093            }
094            Color backgroundColorOverride = s.getBackgroundColorOverride();
095            if (backgroundColorOverride != null) {
096                backgroundColorCache = backgroundColorOverride;
097            }
098        }
099        if (backgroundColorCache == null) {
100            backgroundColorCache = BACKGROUND.get();
101        }
102        return backgroundColorCache;
103    }
104}