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}