source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java@ 6529

Last change on this file since 6529 was 6529, checked in by Don-vip, 10 years ago

Various stuff:

  • see #9414: remove old DeprecatedTags test
  • refactor some classes in gui.preferences package
  • improve javadoc
  • Property svn:eol-style set to native
File size: 11.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.display;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Color;
7import java.awt.Component;
8import java.awt.Dimension;
9import java.awt.GridBagLayout;
10import java.awt.event.ActionEvent;
11import java.awt.event.ActionListener;
12import java.util.ArrayList;
13import java.util.HashMap;
14import java.util.List;
15import java.util.Map;
16import java.util.Map.Entry;
17import java.util.TreeMap;
18import java.util.Vector;
19
20import javax.swing.BorderFactory;
21import javax.swing.Box;
22import javax.swing.JButton;
23import javax.swing.JColorChooser;
24import javax.swing.JLabel;
25import javax.swing.JOptionPane;
26import javax.swing.JPanel;
27import javax.swing.JScrollPane;
28import javax.swing.JTable;
29import javax.swing.ListSelectionModel;
30import javax.swing.event.ListSelectionEvent;
31import javax.swing.table.DefaultTableModel;
32import javax.swing.table.TableCellRenderer;
33
34import org.openstreetmap.josm.Main;
35import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
36import org.openstreetmap.josm.data.validation.Severity;
37import org.openstreetmap.josm.gui.MapScaler;
38import org.openstreetmap.josm.gui.conflict.ConflictColors;
39import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
40import org.openstreetmap.josm.gui.layer.GpxLayer;
41import org.openstreetmap.josm.gui.layer.ImageryLayer;
42import org.openstreetmap.josm.gui.layer.OsmDataLayer;
43import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
44import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
45import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
46import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
47import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
48import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
49import org.openstreetmap.josm.tools.ColorHelper;
50import org.openstreetmap.josm.tools.GBC;
51
52public class ColorPreference implements SubPreferenceSetting {
53
54 /**
55 * Factory used to create a new {@code ColorPreference}.
56 */
57 public static class Factory implements PreferenceSettingFactory {
58 @Override
59 public PreferenceSetting createPreferenceSetting() {
60 return new ColorPreference();
61 }
62 }
63
64 private DefaultTableModel tableModel;
65 private JTable colors;
66 private List<String> del = new ArrayList<String>();
67
68 JButton colorEdit;
69 JButton defaultSet;
70 JButton remove;
71
72 /**
73 * Set the colors to be shown in the preference table. This method creates a table model if
74 * none exists and overwrites all existing values.
75 * @param colorMap the map holding the colors
76 * (key = color id (without prefixes, so only <code>background</code>; not <code>color.background</code>),
77 * value = html representation of the color.
78 */
79 public void setColorModel(Map<String, String> colorMap) {
80 if(tableModel == null) {
81 tableModel = new DefaultTableModel();
82 tableModel.addColumn(tr("Name"));
83 tableModel.addColumn(tr("Color"));
84 }
85
86 // clear old model:
87 while(tableModel.getRowCount() > 0) {
88 tableModel.removeRow(0);
89 }
90 // fill model with colors:
91 Map<String, String> colorKeyList = new TreeMap<String, String>();
92 Map<String, String> colorKeyList_mappaint = new TreeMap<String, String>();
93 Map<String, String> colorKeyList_layer = new TreeMap<String, String>();
94 for(String key : colorMap.keySet()) {
95 if(key.startsWith("layer ")) {
96 colorKeyList_layer.put(getName(key), key);
97 } else if(key.startsWith("mappaint.")) {
98 /* use getName(key)+key, as getName() may be ambiguous */
99 colorKeyList_mappaint.put(getName(key)+key, key);
100 } else {
101 colorKeyList.put(getName(key), key);
102 }
103 }
104 for (Entry<String, String> k : colorKeyList.entrySet()) {
105 Vector<Object> row = new Vector<Object>(2);
106 row.add(k.getValue());
107 row.add(ColorHelper.html2color(colorMap.get(k.getValue())));
108 tableModel.addRow(row);
109 }
110 for (Entry<String, String> k : colorKeyList_mappaint.entrySet()) {
111 Vector<Object> row = new Vector<Object>(2);
112 row.add(k.getValue());
113 row.add(ColorHelper.html2color(colorMap.get(k.getValue())));
114 tableModel.addRow(row);
115 }
116 for (Entry<String, String> k : colorKeyList_layer.entrySet()) {
117 Vector<Object> row = new Vector<Object>(2);
118 row.add(k.getValue());
119 row.add(ColorHelper.html2color(colorMap.get(k.getValue())));
120 tableModel.addRow(row);
121 }
122 if(this.colors != null) {
123 this.colors.repaint();
124 }
125 }
126
127 /**
128 * Returns a map with the colors in the table (key = color name without prefix, value = html color code).
129 * @return a map holding the colors.
130 */
131 public Map<String, String> getColorModel() {
132 String key;
133 String value;
134 Map<String, String> colorMap = new HashMap<String, String>();
135 for(int row = 0; row < tableModel.getRowCount(); ++row) {
136 key = (String)tableModel.getValueAt(row, 0);
137 value = ColorHelper.color2html((Color)tableModel.getValueAt(row, 1));
138 colorMap.put(key, value);
139 }
140 return colorMap;
141 }
142
143 private String getName(String o)
144 {
145 return Main.pref.getColorName(o);
146 }
147
148 @Override
149 public void addGui(final PreferenceTabbedPane gui) {
150 fixColorPrefixes();
151 setColorModel(Main.pref.getAllColors());
152
153 colorEdit = new JButton(tr("Choose"));
154 colorEdit.addActionListener(new ActionListener(){
155 @Override
156 public void actionPerformed(ActionEvent e) {
157 int sel = colors.getSelectedRow();
158 JColorChooser chooser = new JColorChooser((Color)colors.getValueAt(sel, 1));
159 int answer = JOptionPane.showConfirmDialog(
160 gui, chooser,
161 tr("Choose a color for {0}", getName((String)colors.getValueAt(sel, 0))),
162 JOptionPane.OK_CANCEL_OPTION,
163 JOptionPane.PLAIN_MESSAGE);
164 if (answer == JOptionPane.OK_OPTION) {
165 colors.setValueAt(chooser.getColor(), sel, 1);
166 }
167 }
168 });
169 defaultSet = new JButton(tr("Set to default"));
170 defaultSet.addActionListener(new ActionListener(){
171 @Override
172 public void actionPerformed(ActionEvent e) {
173 int sel = colors.getSelectedRow();
174 String name = (String)colors.getValueAt(sel, 0);
175 Color c = Main.pref.getDefaultColor(name);
176 if (c != null) {
177 colors.setValueAt(c, sel, 1);
178 }
179 }
180 });
181 JButton defaultAll = new JButton(tr("Set all to default"));
182 defaultAll.addActionListener(new ActionListener(){
183 @Override
184 public void actionPerformed(ActionEvent e) {
185 for(int i = 0; i < colors.getRowCount(); ++i)
186 {
187 String name = (String)colors.getValueAt(i, 0);
188 Color c = Main.pref.getDefaultColor(name);
189 if (c != null) {
190 colors.setValueAt(c, i, 1);
191 }
192 }
193 }
194 });
195 remove = new JButton(tr("Remove"));
196 remove.addActionListener(new ActionListener(){
197 @Override
198 public void actionPerformed(ActionEvent e) {
199 int sel = colors.getSelectedRow();
200 del.add((String)colors.getValueAt(sel, 0));
201 tableModel.removeRow(sel);
202 }
203 });
204 remove.setEnabled(false);
205 colorEdit.setEnabled(false);
206 defaultSet.setEnabled(false);
207
208 colors = new JTable(tableModel) {
209 @Override public boolean isCellEditable(int row, int column) {
210 return false;
211 }
212 @Override public void valueChanged(ListSelectionEvent e) {
213 super.valueChanged(e);
214 int sel = getSelectedRow();
215 remove.setEnabled(sel >= 0 && isRemoveColor(sel));
216 colorEdit.setEnabled(sel >= 0);
217 defaultSet.setEnabled(sel >= 0);
218 }
219 };
220 colors.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
221 final TableCellRenderer oldColorsRenderer = colors.getDefaultRenderer(Object.class);
222 colors.setDefaultRenderer(Object.class, new TableCellRenderer(){
223 @Override
224 public Component getTableCellRendererComponent(JTable t, Object o, boolean selected, boolean focus, int row, int column) {
225 if (o == null)
226 return new JLabel();
227 if (column == 1) {
228 JLabel l = new JLabel(ColorHelper.color2html((Color)o));
229 l.setBackground((Color)o);
230 l.setOpaque(true);
231 return l;
232 }
233 return oldColorsRenderer.getTableCellRendererComponent(t,getName(o.toString()),selected,focus,row,column);
234 }
235 });
236 colors.getColumnModel().getColumn(1).setWidth(100);
237 colors.setToolTipText(tr("Colors used by different objects in JOSM."));
238 colors.setPreferredScrollableViewportSize(new Dimension(100,112));
239
240 JPanel panel = new JPanel(new GridBagLayout());
241 panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
242 JScrollPane scrollpane = new JScrollPane(colors);
243 scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
244 panel.add(scrollpane, GBC.eol().fill(GBC.BOTH));
245 JPanel buttonPanel = new JPanel(new GridBagLayout());
246 panel.add(buttonPanel, GBC.eol().insets(5,0,5,5).fill(GBC.HORIZONTAL));
247 buttonPanel.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL));
248 buttonPanel.add(colorEdit, GBC.std().insets(0,5,0,0));
249 buttonPanel.add(defaultSet, GBC.std().insets(5,5,5,0));
250 buttonPanel.add(defaultAll, GBC.std().insets(0,5,0,0));
251 buttonPanel.add(remove, GBC.std().insets(0,5,0,0));
252 gui.getDisplayPreference().addSubTab(this, tr("Colors"), panel);
253 }
254
255 Boolean isRemoveColor(int row)
256 {
257 return ((String)colors.getValueAt(row, 0)).startsWith("layer ");
258 }
259
260 /**
261 * Add all missing color entries.
262 */
263 private void fixColorPrefixes() {
264 PaintColors.getColors();
265 ConflictColors.getColors();
266 Severity.getColors();
267 MarkerLayer.getGenericColor();
268 GpxLayer.getGenericColor();
269 OsmDataLayer.getOutsideColor();
270 ImageryLayer.getFadeColor();
271 MapScaler.getColor();
272 ConflictDialog.getColor();
273 }
274
275 @Override
276 public boolean ok() {
277 Boolean ret = false;
278 for(String d : del) {
279 Main.pref.put("color."+d, null);
280 }
281 for (int i = 0; i < colors.getRowCount(); ++i) {
282 String key = (String)colors.getValueAt(i, 0);
283 if(Main.pref.putColor(key, (Color)colors.getValueAt(i, 1)))
284 {
285 if(key.startsWith("mappaint.")) {
286 ret = true;
287 }
288 }
289 }
290 OsmDataLayer.createHatchTexture();
291 return ret;
292 }
293
294 @Override
295 public boolean isExpert() {
296 return false;
297 }
298
299 @Override
300 public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
301 return gui.getDisplayPreference();
302 }
303}
Note: See TracBrowser for help on using the repository browser.