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.Component; 007import java.util.EnumMap; 008import java.util.Map; 009 010import javax.swing.ImageIcon; 011import javax.swing.JLabel; 012import javax.swing.JTable; 013import javax.swing.table.TableCellRenderer; 014 015import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 016import org.openstreetmap.josm.data.osm.RelationMemberData; 017import org.openstreetmap.josm.gui.history.TwoColumnDiff.Item; 018import org.openstreetmap.josm.gui.util.GuiHelper; 019import org.openstreetmap.josm.tools.ImageProvider; 020 021/** 022 * The {@link TableCellRenderer} for a list of relation members in {@link HistoryBrowser}. 023 * @since 1709 024 */ 025public class RelationMemberListTableCellRenderer extends JLabel implements TableCellRenderer { 026 027 private final transient Map<OsmPrimitiveType, ImageIcon> icons; 028 029 /** 030 * Constructs a new {@code RelationMemberListTableCellRenderer}. 031 */ 032 public RelationMemberListTableCellRenderer() { 033 setOpaque(true); 034 icons = new EnumMap<>(OsmPrimitiveType.class); 035 icons.put(OsmPrimitiveType.NODE, ImageProvider.get("data", "node")); 036 icons.put(OsmPrimitiveType.WAY, ImageProvider.get("data", "way")); 037 icons.put(OsmPrimitiveType.RELATION, ImageProvider.get("data", "relation")); 038 } 039 040 protected void renderIcon(RelationMemberData member) { 041 if (member == null) { 042 setIcon(null); 043 } else { 044 setIcon(icons.get(member.getMemberType())); 045 } 046 } 047 048 protected void renderRole(Item diffItem) { 049 RelationMemberData member = (RelationMemberData) diffItem.value; 050 String text = member == null ? "" : member.getRole(); 051 setText(text); 052 setToolTipText(text); 053 GuiHelper.setBackgroundReadable(this, diffItem.state.getColor()); 054 } 055 056 protected void renderPrimitive(Item diffItem) { 057 String text = ""; 058 RelationMemberData member = (RelationMemberData) diffItem.value; 059 if (member != null) { 060 switch(member.getMemberType()) { 061 case NODE: text = tr("Node {0}", member.getMemberId()); break; 062 case WAY: text = tr("Way {0}", member.getMemberId()); break; 063 case RELATION: text = tr("Relation {0}", member.getMemberId()); break; 064 default: throw new AssertionError(); 065 } 066 } 067 setText(text); 068 setToolTipText(text); 069 GuiHelper.setBackgroundReadable(this, diffItem.state.getColor()); 070 } 071 072 // Warning: The model pads with null-rows to match the size of the opposite table. 'value' could be null 073 @Override 074 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 075 int row, int column) { 076 077 if (value == null) return this; 078 Item member = (TwoColumnDiff.Item) value; 079 renderIcon((RelationMemberData) member.value); 080 switch(column) { 081 case 0: 082 renderRole(member); 083 break; 084 case 1: 085 renderPrimitive(member); 086 break; 087 default: // Do nothing 088 } 089 090 return this; 091 } 092}