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}