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}