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

Last change on this file since 4162 was 4162, checked in by stoecker, 13 years ago

fix #4140 - make colors in conflict dialog configurable

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.conflict.pair.relation;
3
4import java.awt.Color;
5import java.awt.Component;
6import java.util.ArrayList;
7import java.util.Collections;
8
9import javax.swing.BorderFactory;
10import javax.swing.JLabel;
11import javax.swing.JTable;
12import javax.swing.border.Border;
13import javax.swing.table.TableCellRenderer;
14
15import org.openstreetmap.josm.data.osm.Node;
16import org.openstreetmap.josm.data.osm.OsmPrimitive;
17import org.openstreetmap.josm.data.osm.RelationMember;
18import org.openstreetmap.josm.gui.DefaultNameFormatter;
19import org.openstreetmap.josm.gui.conflict.ConflictColors;
20import org.openstreetmap.josm.gui.conflict.pair.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 Border rowNumberBorder = null;
29
30 /**
31 * constructor
32 */
33 public RelationMemberTableCellRenderer() {
34 setIcon(null);
35 setOpaque(true);
36 rowNumberBorder = BorderFactory.createEmptyBorder(0,4,0,0);
37 }
38
39 public String buildToolTipText(OsmPrimitive primitive) {
40 StringBuilder sb = new StringBuilder();
41 sb.append("<html>");
42 sb.append("<strong>id</strong>=")
43 .append(primitive.getId())
44 .append("<br>");
45 ArrayList<String> keyList = new ArrayList<String>(primitive.keySet());
46 Collections.sort(keyList);
47 for (int i = 0; i < keyList.size(); i++) {
48 if (i > 0) {
49 sb.append("<br>");
50 }
51 String key = keyList.get(i);
52 sb.append("<strong>")
53 .append(key)
54 .append("</strong>")
55 .append("=");
56 String value = primitive.get(key);
57 while(value.length() != 0) {
58 sb.append(value.substring(0,Math.min(50, value.length())));
59 if (value.length() > 50) {
60 sb.append("<br>");
61 value = value.substring(50);
62 } else {
63 value = "";
64 }
65 }
66 }
67 sb.append("</html>");
68 return sb.toString();
69 }
70
71 /**
72 * reset the renderer
73 */
74 protected void reset() {
75 setBackground(ConflictColors.BGCOLOR.get());
76 setForeground(ConflictColors.FGCOLOR.get());
77 setBorder(null);
78 setIcon(null);
79 setToolTipText(null);
80 }
81
82 protected void renderBackground(ListMergeModel<Node>.EntriesTableModel model, RelationMember member, int row, int col, boolean isSelected) {
83 Color bgc = ConflictColors.BGCOLOR.get();
84 if (col == 0) {
85 if (model.getListMergeModel().isFrozen()) {
86 bgc = ConflictColors.BGCOLOR_FROZEN.get();
87 } else if (model.isParticipatingInCurrentComparePair()) {
88 bgc = ConflictColors.BGCOLOR_PARTICIPAING_IN_COMPARISON.get();
89 } else if (isSelected) {
90 bgc = ConflictColors.BGCOLOR_SELECTED.get();
91 }
92 } else {
93 if (model.getListMergeModel().isFrozen()) {
94 bgc = ConflictColors.BGCOLOR_FROZEN.get();
95 } else if (member == null) {
96 bgc = ConflictColors.BGCOLOR_EMPTY_ROW.get();
97 } else if (isSelected) {
98 bgc = ConflictColors.BGCOLOR_SELECTED.get();
99 } else {
100 if (model.isParticipatingInCurrentComparePair()) {
101 if (model.isSamePositionInOppositeList(row)) {
102 bgc = ConflictColors.BGCOLOR_SAME_POSITION_IN_OPPOSITE.get();
103 } else if (model.isIncludedInOppositeList(row)) {
104 bgc = ConflictColors.BGCOLOR_IN_OPPOSITE.get();
105 } else {
106 bgc = ConflictColors.BGCOLOR_NOT_IN_OPPOSITE.get();
107 }
108 }
109 }
110 }
111 setBackground(bgc);
112 }
113
114 protected void renderForeground(ListMergeModel<Node>.EntriesTableModel model, RelationMember member, int row, int col, boolean isSelected) {
115 Color fgc = ConflictColors.FGCOLOR.get();
116 if (col == 0 && model.isParticipatingInCurrentComparePair() && ! model.getListMergeModel().isFrozen()) {
117 fgc = ConflictColors.FGCOLOR_PARTICIPAING_IN_COMPARISON.get();
118 }
119 setForeground(fgc);
120 }
121
122 protected void renderRole(RelationMember member) {
123 setText(member.getRole());
124 setToolTipText(member.getRole());
125 }
126
127 protected void renderPrimitive(RelationMember member) {
128 String displayName = member.getMember().getDisplayName(DefaultNameFormatter.getInstance());
129 setText(displayName);
130 setToolTipText(buildToolTipText(member.getMember()));
131 setIcon(ImageProvider.get(member.getDisplayType()));
132 }
133
134 /**
135 * render the row id
136 * @param row the row index
137 * @param isSelected
138 */
139 protected void renderRowId(int row) {
140 setBorder(rowNumberBorder);
141 setText(Integer.toString(row+1));
142 }
143
144 protected void renderEmptyRow() {
145 setIcon(null);
146 setBackground(ConflictColors.BGCOLOR_EMPTY_ROW.get());
147 setText("");
148 }
149
150 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
151 int row, int column) {
152
153 RelationMember member = (RelationMember)value;
154 reset();
155 if (value == null)
156 return this;
157
158 renderBackground(getModel(table), member, row, column, isSelected);
159 renderForeground(getModel(table), member, row, column, isSelected);
160 switch(column) {
161 case 0:
162 renderRowId(row);
163 break;
164 case 1:
165 if (member == null) {
166 renderEmptyRow();
167 } else {
168 renderRole(member);
169 }
170 break;
171 case 2:
172 if (member == null) {
173 renderEmptyRow();
174 } else {
175 renderPrimitive(member);
176 }
177 break;
178 default:
179 // should not happen
180 }
181 return this;
182 }
183
184 /**
185 * replies the model
186 * @param table the table
187 * @return the table model
188 */
189 @SuppressWarnings("unchecked")
190 protected ListMergeModel<Node>.EntriesTableModel getModel(JTable table) {
191 return (ListMergeModel.EntriesTableModel)table.getModel();
192 }
193}
Note: See TracBrowser for help on using the repository browser.