001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.history;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Color;
007 import java.awt.Component;
008 import java.util.HashMap;
009
010 import javax.swing.ImageIcon;
011 import javax.swing.JLabel;
012 import javax.swing.JTable;
013 import javax.swing.table.TableCellRenderer;
014
015 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
016 import org.openstreetmap.josm.data.osm.RelationMemberData;
017 import org.openstreetmap.josm.tools.ImageProvider;
018
019 /**
020 * The {@link TableCellRenderer} for a list of relation members in {@link HistoryBrower}
021 *
022 *
023 */
024 public class RelationMemberListTableCellRenderer extends JLabel implements TableCellRenderer {
025
026 public final static Color BGCOLOR_EMPTY_ROW = new Color(234,234,234);
027 public final static Color BGCOLOR_NOT_IN_OPPOSITE = new Color(255,197,197);
028 public final static Color BGCOLOR_IN_OPPOSITE = new Color(255,234,213);
029 public final static Color BGCOLOR_SELECTED = new Color(143,170,255);
030
031 private HashMap<OsmPrimitiveType, ImageIcon> icons;
032
033 public RelationMemberListTableCellRenderer(){
034 setOpaque(true);
035 icons = new HashMap<OsmPrimitiveType, ImageIcon>();
036 icons.put(OsmPrimitiveType.NODE, ImageProvider.get("data", "node"));
037 icons.put(OsmPrimitiveType.WAY, ImageProvider.get("data", "way"));
038 icons.put(OsmPrimitiveType.RELATION, ImageProvider.get("data", "relation"));
039 }
040
041 protected void renderIcon(RelationMemberData member) {
042 if (member == null) {
043 setIcon(null);
044 } else {
045 setIcon(icons.get(member.getMemberType()));
046 }
047 }
048
049 protected void renderRole( HistoryBrowserModel.RelationMemberTableModel model, RelationMemberData member, int row, boolean isSelected) {
050 String text = "";
051 Color bgColor = Color.WHITE;
052 if (member == null) {
053 bgColor = BGCOLOR_EMPTY_ROW;
054 } else {
055 text = member.getRole();
056 if (model.isSameInOppositeWay(row)) {
057 bgColor = Color.WHITE;
058 } else if (model.isInOppositeWay(row)) {
059 bgColor = BGCOLOR_IN_OPPOSITE;
060 } else {
061 bgColor = BGCOLOR_NOT_IN_OPPOSITE;
062 }
063 }
064 setText(text);
065 setToolTipText(text);
066 setBackground(bgColor);
067 }
068
069 protected void renderPrimitive( HistoryBrowserModel.RelationMemberTableModel model, RelationMemberData member, int row, boolean isSelected) {
070 String text = "";
071 Color bgColor = Color.WHITE;
072 if (member == null) {
073 bgColor = BGCOLOR_EMPTY_ROW;
074 } else {
075 text = "";
076 switch(member.getMemberType()) {
077 case NODE: text = tr("Node {0}", member.getMemberId()); break;
078 case WAY: text = tr("Way {0}", member.getMemberId()); break;
079 case RELATION: text = tr("Relation {0}", member.getMemberId()); break;
080 }
081 if (model.isSameInOppositeWay(row)) {
082 bgColor = Color.WHITE;
083 } else if (model.isInOppositeWay(row)) {
084 bgColor = BGCOLOR_IN_OPPOSITE;
085 } else {
086 bgColor = BGCOLOR_NOT_IN_OPPOSITE;
087 }
088 }
089 setText(text);
090 setToolTipText(text);
091 setBackground(bgColor);
092 }
093
094 // Warning: The model pads with null-rows to match the size of the opposite table. 'value' could be null
095 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
096 int row, int column) {
097
098 HistoryBrowserModel.RelationMemberTableModel model = gteRelationMemberTableModel(table);
099 RelationMemberData member = (RelationMemberData)value;
100 renderIcon(member);
101 switch(column) {
102 case 0:
103 renderRole(model, member, row, isSelected);
104 break;
105 case 1:
106 renderPrimitive(model, member, row, isSelected);
107 break;
108 }
109
110 return this;
111 }
112
113 protected HistoryBrowserModel.RelationMemberTableModel gteRelationMemberTableModel(JTable table) {
114 return (HistoryBrowserModel.RelationMemberTableModel) table.getModel();
115 }
116 }