001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import java.awt.Color;
008import java.awt.Component;
009import java.awt.event.ActionEvent;
010import java.util.LinkedList;
011import java.util.List;
012
013import javax.swing.AbstractAction;
014import javax.swing.Action;
015import javax.swing.JColorChooser;
016import javax.swing.JMenuItem;
017import javax.swing.JOptionPane;
018
019import org.openstreetmap.josm.Main;
020import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
021import org.openstreetmap.josm.gui.layer.Layer.MultiLayerAction;
022import org.openstreetmap.josm.tools.ImageProvider;
023
024public class CustomizeColor extends AbstractAction implements LayerAction, MultiLayerAction {
025    private transient List<Layer> layers;
026
027    public CustomizeColor(List<Layer> l) {
028        this();
029        layers = l;
030    }
031
032    public CustomizeColor(Layer l) {
033        this();
034        layers = new LinkedList<>();
035        layers.add(l);
036    }
037
038    private CustomizeColor() {
039        super(tr("Customize Color"), ImageProvider.get("colorchooser"));
040        putValue("help", ht("/Action/LayerCustomizeColor"));
041    }
042
043    @Override
044    public boolean supportLayers(List<Layer> layers) {
045        for (Layer layer: layers) {
046            if (layer.getColor(false) == null)
047                return false;
048        }
049        return true;
050    }
051
052    @Override
053    public Component createMenuComponent() {
054        return new JMenuItem(this);
055    }
056
057    @Override
058    public Action getMultiLayerAction(List<Layer> layers) {
059        return new CustomizeColor(layers);
060    }
061
062    @Override
063    public void actionPerformed(ActionEvent e) {
064        Color cl = layers.get(0).getColor(false);
065        if (cl == null) cl = Color.gray;
066        JColorChooser c = new JColorChooser(cl);
067        Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
068        int answer = JOptionPane.showOptionDialog(
069                Main.parent,
070                c,
071                tr("Choose a color"),
072                JOptionPane.OK_CANCEL_OPTION,
073                JOptionPane.PLAIN_MESSAGE,
074                null,
075                options,
076                options[0]
077        );
078        switch (answer) {
079        case 0:
080            for (Layer layer : layers) {
081                Main.pref.putColor("layer "+layer.getName(), c.getColor());
082            }
083            break;
084        case 1:
085            return;
086        case 2:
087            for (Layer layer : layers) {
088                Main.pref.putColor("layer "+layer.getName(), null);
089            }
090            break;
091        }
092        Main.map.repaint();
093    }
094}