001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation;
003
004import java.awt.Color;
005import java.awt.Component;
006
007import javax.swing.JLabel;
008import javax.swing.JTable;
009import javax.swing.UIManager;
010import javax.swing.table.TableCellRenderer;
011
012import org.openstreetmap.josm.data.osm.OsmPrimitive;
013import org.openstreetmap.josm.gui.DefaultNameFormatter;
014import org.openstreetmap.josm.tools.ImageProvider;
015
016/**
017 * This is the {@link TableCellRenderer} used in {@link SelectionTable}.
018 *
019 */
020public class SelectionTableCellRenderer extends JLabel implements TableCellRenderer {
021    public static final Color BGCOLOR_DOUBLE_ENTRY = new Color(254,226,214);
022    public static final Color BGCOLOR_SINGLE_ENTRY = new Color(235,255,177);
023
024    /**
025     * reference to the member table model; required, in order to check whether a
026     * selected primitive is already used in the member list of the currently edited
027     * relation
028     */
029    private MemberTableModel model;
030
031    /**
032     * constructor
033     */
034    public SelectionTableCellRenderer() {
035        setIcon(null);
036        setOpaque(true);
037    }
038
039    /**
040     * reset the renderer
041     */
042    protected void reset() {
043        setBackground(UIManager.getColor("Table.background"));
044        setForeground(UIManager.getColor("Table.foreground"));
045        setBorder(null);
046        setIcon(null);
047        setToolTipText(null);
048    }
049
050    protected void renderBackground(OsmPrimitive primitive, boolean isSelected) {
051        Color bgc = UIManager.getColor("Table.background");
052        if (primitive != null && model != null && model.getNumMembersWithPrimitive(primitive) == 1) {
053            bgc = BGCOLOR_SINGLE_ENTRY;
054        } else if (primitive != null && model != null && model.getNumMembersWithPrimitive(primitive) > 1) {
055            bgc = BGCOLOR_DOUBLE_ENTRY;
056        }
057        setBackground(bgc);
058    }
059
060    protected void renderPrimitive(OsmPrimitive primitive) {
061        setIcon(ImageProvider.get(primitive.getDisplayType()));
062        setText(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
063        setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(primitive));
064    }
065
066    @Override
067    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
068            int row, int column) {
069
070        reset();
071        if (value == null)
072            return this;
073
074        renderBackground((OsmPrimitive)value, isSelected);
075        renderPrimitive((OsmPrimitive)value);
076        return this;
077    }
078
079    public void setMemberTableModel(MemberTableModel model) {
080        this.model = model;
081    }
082}