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