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