source: josm/trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellRenderer.java@ 1938

Last change on this file since 1938 was 1938, checked in by jttt, 15 years ago

Replace some occurrences of RelationMember.member with getters

File size: 7.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.conflict.relation;
3
4import java.awt.Color;
5import java.awt.Component;
6import java.text.DecimalFormat;
7import java.util.ArrayList;
8import java.util.Collections;
9
10import javax.swing.BorderFactory;
11import javax.swing.ImageIcon;
12import javax.swing.JLabel;
13import javax.swing.JTable;
14import javax.swing.border.Border;
15import javax.swing.table.TableCellRenderer;
16
17import org.openstreetmap.josm.data.osm.Node;
18import org.openstreetmap.josm.data.osm.OsmPrimitive;
19import org.openstreetmap.josm.data.osm.RelationMember;
20import org.openstreetmap.josm.gui.conflict.ListMergeModel;
21import org.openstreetmap.josm.tools.ImageProvider;
22
23/**
24 * This is the {@see TableCellRenderer} used in the tables of {@see RelationMemberMerger}.
25 *
26 */
27public class RelationMemberTableCellRenderer extends JLabel implements TableCellRenderer {
28 private final static DecimalFormat COORD_FORMATTER = new DecimalFormat("###0.0000");
29 public final static Color BGCOLOR_SELECTED = new Color(143,170,255);
30 public final static Color BGCOLOR_EMPTY_ROW = new Color(234,234,234);
31
32 public final static Color BGCOLOR_NOT_IN_OPPOSITE = new Color(255,197,197);
33 public final static Color BGCOLOR_IN_OPPOSITE = new Color(255,234,213);
34 public final static Color BGCOLOR_SAME_POSITION_IN_OPPOSITE = new Color(217,255,217);
35
36 public final static Color BGCOLOR_PARTICIPAING_IN_COMPARISON = Color.BLACK;
37 public final static Color FGCOLOR_PARTICIPAING_IN_COMPARISON = Color.WHITE;
38
39 public final static Color BGCOLOR_FROZEN = new Color(234,234,234);
40
41 private ImageIcon nodeIcon;
42 private ImageIcon wayIcon;
43 private ImageIcon relationIcon;
44 private Border rowNumberBorder = null;
45
46 /**
47 * Load the image icon for an OSM primitive of type node
48 *
49 * @return the icon; null, if not found
50 */
51 protected void loadIcons() {
52 nodeIcon = ImageProvider.get("data", "node");
53 wayIcon = ImageProvider.get("data", "way");
54 relationIcon = ImageProvider.get("data", "relation");
55 }
56
57 /**
58 * constructor
59 */
60 public RelationMemberTableCellRenderer() {
61 setIcon(null);
62 setOpaque(true);
63 loadIcons();
64 rowNumberBorder = BorderFactory.createEmptyBorder(0,4,0,0);
65 }
66
67
68 public String buildToolTipText(OsmPrimitive primitive) {
69 StringBuilder sb = new StringBuilder();
70 sb.append("<html>");
71 sb.append("<strong>id</strong>=")
72 .append(primitive.id)
73 .append("<br>");
74 ArrayList<String> keyList = new ArrayList<String>(primitive.keySet());
75 Collections.sort(keyList);
76 for (int i = 0; i < keyList.size(); i++) {
77 if (i > 0) {
78 sb.append("<br>");
79 }
80 String key = keyList.get(i);
81 sb.append("<strong>")
82 .append(key)
83 .append("</strong>")
84 .append("=");
85 String value = primitive.get(key);
86 while(value.length() != 0) {
87 sb.append(value.substring(0,Math.min(50, value.length())));
88 if (value.length() > 50) {
89 sb.append("<br>");
90 value = value.substring(50);
91 } else {
92 value = "";
93 }
94 }
95 }
96 sb.append("</html>");
97 return sb.toString();
98 }
99
100 /**
101 * reset the renderer
102 */
103 protected void reset() {
104 setBackground(Color.WHITE);
105 setForeground(Color.BLACK);
106 setBorder(null);
107 setIcon(null);
108 setToolTipText(null);
109 }
110
111
112 protected void renderBackground(ListMergeModel<Node>.EntriesTableModel model, RelationMember member, int row, int col, boolean isSelected) {
113 Color bgc = Color.WHITE;
114 if (col == 0) {
115 if (model.getListMergeModel().isFrozen()) {
116 bgc = BGCOLOR_FROZEN;
117 } else if (model.isParticipatingInCurrentComparePair()) {
118 bgc = BGCOLOR_PARTICIPAING_IN_COMPARISON;
119 } else if (isSelected) {
120 bgc = BGCOLOR_SELECTED;
121 }
122 } else {
123 if (model.getListMergeModel().isFrozen()) {
124 bgc = BGCOLOR_FROZEN;
125 } else if (member == null) {
126 bgc = BGCOLOR_EMPTY_ROW;
127 } else if (isSelected) {
128 bgc = BGCOLOR_SELECTED;
129 } else {
130 if (model.isParticipatingInCurrentComparePair()) {
131 if (model.isSamePositionInOppositeList(row)) {
132 bgc = BGCOLOR_SAME_POSITION_IN_OPPOSITE;
133 } else if (model.isIncludedInOppositeList(row)) {
134 bgc = BGCOLOR_IN_OPPOSITE;
135 } else {
136 bgc = BGCOLOR_NOT_IN_OPPOSITE;
137 }
138 }
139 }
140 }
141 setBackground(bgc);
142 }
143
144 protected void renderForeground(ListMergeModel<Node>.EntriesTableModel model, RelationMember member, int row, int col, boolean isSelected) {
145 Color fgc = Color.BLACK;
146 if (col == 0 && model.isParticipatingInCurrentComparePair() && ! model.getListMergeModel().isFrozen()) {
147 fgc = Color.WHITE;
148 }
149 setForeground(fgc);
150 }
151
152 protected void renderRole(RelationMember member) {
153 setText(member.getRole());
154 setToolTipText(member.getRole());
155 }
156
157 protected void renderPrimitive(RelationMember member) {
158 String displayName = member.getMember().getName();
159 setText(displayName);
160 setToolTipText(buildToolTipText(member.getMember()));
161 if (member.isNode()) {
162 setIcon(nodeIcon);
163 } else if (member.isWay()) {
164 setIcon(wayIcon);
165 } else if (member.isRelation()) {
166 setIcon(relationIcon);
167 } else {
168 // should not happen
169 setIcon(null);
170 }
171 }
172
173 /**
174 * render the row id
175 * @param row the row index
176 * @param isSelected
177 */
178 protected void renderRowId(int row) {
179 setBorder(rowNumberBorder);
180 setText(Integer.toString(row+1));
181 }
182
183 protected void renderEmptyRow() {
184 setIcon(null);
185 setBackground(BGCOLOR_EMPTY_ROW);
186 setText("");
187 }
188
189
190 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
191 int row, int column) {
192
193 RelationMember member = (RelationMember)value;
194 reset();
195 renderBackground(getModel(table), member, row, column, isSelected);
196 renderForeground(getModel(table), member, row, column, isSelected);
197 switch(column) {
198 case 0:
199 renderRowId(row);
200 break;
201 case 1:
202 if (member == null) {
203 renderEmptyRow();
204 } else {
205 renderRole(member);
206 }
207 break;
208 case 2:
209 if (member == null) {
210 renderEmptyRow();
211 } else {
212 renderPrimitive(member);
213 }
214 break;
215 default:
216 // should not happen
217 }
218 return this;
219 }
220
221 /**
222 * replies the model
223 * @param table the table
224 * @return the table model
225 */
226 @SuppressWarnings("unchecked")
227 protected ListMergeModel<Node>.EntriesTableModel getModel(JTable table) {
228 return (ListMergeModel.EntriesTableModel)table.getModel();
229 }
230}
Note: See TracBrowser for help on using the repository browser.