source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesCellRenderer.java@ 9149

Last change on this file since 9149 was 9149, checked in by simon04, 8 years ago

see #9775 - Allow plugins to change display of keys/values in properties dialog

  • Property svn:eol-style set to native
File size: 6.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.properties;
3
4import static org.openstreetmap.josm.tools.I18n.marktr;
5import static org.openstreetmap.josm.tools.I18n.tr;
6import static org.openstreetmap.josm.tools.I18n.trn;
7
8import java.awt.Color;
9import java.awt.Component;
10import java.awt.Font;
11import java.util.Collection;
12import java.util.Map;
13import java.util.Objects;
14import java.util.concurrent.CopyOnWriteArrayList;
15
16import javax.swing.JLabel;
17import javax.swing.JTable;
18import javax.swing.UIDefaults;
19import javax.swing.table.DefaultTableCellRenderer;
20import javax.swing.table.TableCellRenderer;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24
25/**
26 * Cell renderer of tags table.
27 * @since 6314
28 */
29public class PropertiesCellRenderer extends DefaultTableCellRenderer {
30
31 private final Collection<TableCellRenderer> customRenderer = new CopyOnWriteArrayList<>();
32
33 private void setColors(Component c, String key, boolean isSelected) {
34 UIDefaults defaults = javax.swing.UIManager.getDefaults();
35 if (OsmPrimitive.getDiscardableKeys().contains(key)) {
36 if (isSelected) {
37 c.setForeground(Main.pref.getColor(marktr("Discardable key: selection Foreground"), Color.GRAY));
38 c.setBackground(Main.pref.getColor(marktr("Discardable key: selection Background"),
39 defaults.getColor("Table.selectionBackground")));
40 } else {
41 c.setForeground(Main.pref.getColor(marktr("Discardable key: foreground"), Color.GRAY));
42 c.setBackground(Main.pref.getColor(marktr("Discardable key: background"), defaults.getColor("Table.background")));
43 }
44 } else {
45 c.setForeground(defaults.getColor("Table."+(isSelected ? "selectionF" : "f")+"oreground"));
46 c.setBackground(defaults.getColor("Table."+(isSelected ? "selectionB" : "b")+"ackground"));
47 }
48 }
49
50 @Override
51 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
52 for (TableCellRenderer renderer : customRenderer) {
53 final Component component = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
54 if (component != null) {
55 return component;
56 }
57 }
58 Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
59 if (value == null)
60 return this;
61 if (c instanceof JLabel) {
62 String str = null;
63 if (value instanceof String) {
64 str = (String) value;
65 } else if (value instanceof Map<?, ?>) {
66 Map<?, ?> v = (Map<?, ?>) value;
67 if (v.size() != 1) { // Multiple values: give user a short summary of the values
68 Integer blankCount;
69 Integer otherCount;
70 if (v.get("") == null) {
71 blankCount = 0;
72 otherCount = v.size();
73 } else {
74 blankCount = (Integer) v.get("");
75 otherCount = v.size()-1;
76 }
77 StringBuilder sb = new StringBuilder("<");
78 if (otherCount == 1) {
79 for (Map.Entry<?, ?> entry : v.entrySet()) { // Find the non-blank value in the map
80 if (!Objects.equals(entry.getKey(), "")) {
81 /* I18n: properties display partial string joined with comma, frst is count, second is value */
82 sb.append(tr("{0} ''{1}''", entry.getValue().toString(), entry.getKey()));
83 }
84 }
85 } else {
86 /* I18n: properties display partial string joined with comma */
87 sb.append(trn("{0} different", "{0} different", otherCount, otherCount));
88 }
89 if (blankCount > 0) {
90 /* I18n: properties display partial string joined with comma */
91 sb.append(trn(", {0} unset", ", {0} unset", blankCount, blankCount));
92 }
93 sb.append('>');
94 str = sb.toString();
95 c.setFont(c.getFont().deriveFont(Font.ITALIC));
96
97 } else { // One value: display the value
98 final Map.Entry<?, ?> entry = v.entrySet().iterator().next();
99 str = (String) entry.getKey();
100 }
101 }
102 ((JLabel) c).putClientProperty("html.disable", Boolean.TRUE); // Fix #8730
103 ((JLabel) c).setText(str);
104 if (Main.pref.getBoolean("display.discardable-keys", false)) {
105 String key = null;
106 if (column == 0) {
107 key = str;
108 } else if (column == 1) {
109 Object value0 = table.getModel().getValueAt(row, 0);
110 if (value0 instanceof String) {
111 key = (String) value0;
112 }
113 }
114 setColors(c, key, isSelected);
115 }
116 }
117 return c;
118 }
119
120 /**
121 * Adds a custom table cell renderer to render cells of the tags table.
122 *
123 * If the renderer is not capable performing a {@link TableCellRenderer#getTableCellRendererComponent},
124 * it should return {@code null} to fall back to the
125 * {@link PropertiesCellRenderer#getTableCellRendererComponent default implementation}.
126 * @param renderer the renderer to add
127 * @since 9149
128 */
129 public void addCustomRenderer(TableCellRenderer renderer) {
130 customRenderer.add(renderer);
131 }
132
133 /**
134 * Removes a custom table cell renderer.
135 * @param renderer the renderer to remove
136 * @since 9149
137 */
138 public void removeCustomRenderer(TableCellRenderer renderer) {
139 customRenderer.remove(renderer);
140 }
141}
Note: See TracBrowser for help on using the repository browser.