001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.dialogs.relation;
003    
004    import java.awt.Color;
005    import java.awt.Component;
006    
007    import javax.swing.JLabel;
008    import javax.swing.JTable;
009    import javax.swing.UIManager;
010    import javax.swing.table.TableCellRenderer;
011    
012    import org.openstreetmap.josm.data.osm.OsmPrimitive;
013    import org.openstreetmap.josm.gui.DefaultNameFormatter;
014    import org.openstreetmap.josm.tools.ImageProvider;
015    
016    /**
017     * This is the {@link TableCellRenderer} used in {@link SelectionTable}.
018     *
019     */
020    public  class SelectionTableCellRenderer extends JLabel implements TableCellRenderer {
021        public final static Color BGCOLOR_DOUBLE_ENTRY = new Color(254,226,214);
022        public final static 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.getPrimitiveId().getType()));
062            setText(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
063            setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(primitive));
064        }
065    
066        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
067                int row, int column) {
068    
069            reset();
070            if (value == null)
071                return this;
072    
073            renderBackground((OsmPrimitive)value, isSelected);
074            renderPrimitive((OsmPrimitive)value);
075            return this;
076        }
077    
078        public void setMemberTableModel(MemberTableModel model) {
079            this.model = model;
080        }
081    }