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 final transient List<Layer> layers;
026
027    /**
028     * Constructs a new {@code CustomizeColor} for a given list of layers.
029     * @param l list of layers
030     */
031    public CustomizeColor(List<Layer> l) {
032        super(tr("Customize Color"), ImageProvider.get("colorchooser"));
033        putValue("help", ht("/Action/LayerCustomizeColor"));
034        layers = l;
035    }
036
037    /**
038     * Constructs a new {@code CustomizeColor} for a single layer.
039     * @param l layer
040     */
041    public CustomizeColor(Layer l) {
042        this(new LinkedList<Layer>());
043        layers.add(l);
044    }
045
046    @Override
047    public boolean supportLayers(List<Layer> layers) {
048        for (Layer layer: layers) {
049            if (layer.getColor(false) == null)
050                return false;
051        }
052        return true;
053    }
054
055    @Override
056    public Component createMenuComponent() {
057        return new JMenuItem(this);
058    }
059
060    @Override
061    public Action getMultiLayerAction(List<Layer> layers) {
062        return new CustomizeColor(layers);
063    }
064
065    @Override
066    public void actionPerformed(ActionEvent e) {
067        Color cl = layers.get(0).getColor(false);
068        if (cl == null)
069            cl = Color.gray;
070        JColorChooser c = new JColorChooser(cl);
071        Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
072        int answer = JOptionPane.showOptionDialog(
073                Main.parent,
074                c,
075                tr("Choose a color"),
076                JOptionPane.OK_CANCEL_OPTION,
077                JOptionPane.PLAIN_MESSAGE,
078                null,
079                options,
080                options[0]
081        );
082        switch (answer) {
083        case 0:
084            for (Layer layer : layers) {
085                Main.pref.putColor("layer "+layer.getName(), c.getColor());
086            }
087            break;
088        case 1:
089            return;
090        case 2:
091            for (Layer layer : layers) {
092                Main.pref.putColor("layer "+layer.getName(), null);
093            }
094            break;
095        }
096        Main.map.repaint();
097    }
098}