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

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

sonar - squid:S2325 - "private" methods that don't access instance data should be "static"

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