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 }