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

Last change on this file since 12846 was 12846, checked in by bastiK, 7 years ago

see #15229 - use Config.getPref() wherever possible

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