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