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