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 renderIndex(DiffTableModel model, int row) { 039 int rowNumber = model.getRowNumber(row); 040 setText(rowNumber > 0 ? Integer.toString(rowNumber) : ""); 041 setToolTipText(null); 042 setHorizontalAlignment(CENTER); 043 renderIcon(null); 044 } 045 046 protected void renderRole(Item diffItem) { 047 RelationMemberData member = (RelationMemberData) diffItem.value; 048 String text = member == null ? "" : member.getRole(); 049 setText(text); 050 setToolTipText(text); 051 setHorizontalAlignment(LEADING); 052 renderIcon(null); 053 } 054 055 protected void renderPrimitive(Item diffItem) { 056 String text = ""; 057 RelationMemberData member = (RelationMemberData) diffItem.value; 058 if (member != null) { 059 switch(member.getMemberType()) { 060 case NODE: text = tr("Node {0}", member.getMemberId()); break; 061 case WAY: text = tr("Way {0}", member.getMemberId()); break; 062 case RELATION: text = tr("Relation {0}", member.getMemberId()); break; 063 default: throw new AssertionError(); 064 } 065 } 066 setText(text); 067 setToolTipText(text); 068 setHorizontalAlignment(LEADING); 069 renderIcon((RelationMemberData) diffItem.value); 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 Item.DiffItemType type = member.state; 080 switch(column) { 081 case RelationMemberTableColumnModel.INDEX_COLUMN: 082 type = Item.DiffItemType.EMPTY; 083 renderIndex(((DiffTableModel) table.getModel()), row); 084 break; 085 case RelationMemberTableColumnModel.ROLE_COLUMN: 086 renderRole(member); 087 break; 088 case RelationMemberTableColumnModel.OBJECT_COLUMN: 089 renderPrimitive(member); 090 break; 091 default: // Do nothing 092 } 093 094 GuiHelper.setBackgroundReadable(this, type.getColor(isSelected, hasFocus)); 095 return this; 096 } 097}