001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.conflict.tags;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.awt.Component;
007    import java.awt.Font;
008    
009    import javax.swing.DefaultComboBoxModel;
010    import javax.swing.ImageIcon;
011    import javax.swing.JLabel;
012    import javax.swing.JTable;
013    import javax.swing.UIManager;
014    import javax.swing.table.TableCellRenderer;
015    
016    import org.openstreetmap.josm.gui.conflict.ConflictColors;
017    import org.openstreetmap.josm.gui.widgets.JosmComboBox;
018    import org.openstreetmap.josm.tools.ImageProvider;
019    
020    /**
021     * This is a {@link TableCellRenderer} for {@link MultiValueResolutionDecision}s.
022     *
023     */
024    public class MultiValueCellRenderer extends JLabel implements TableCellRenderer {
025    
026        private ImageIcon iconDecided;
027        private ImageIcon iconUndecided;
028        private DefaultComboBoxModel model;
029        private JosmComboBox cbDecisionRenderer;
030    
031        public MultiValueCellRenderer() {
032            setOpaque(true);
033            iconDecided = ImageProvider.get("dialogs/conflict", "tagconflictresolved");
034            iconUndecided = ImageProvider.get("dialogs/conflict", "tagconflictunresolved");
035            cbDecisionRenderer = new JosmComboBox(model = new DefaultComboBoxModel());
036        }
037    
038        protected void renderColors(MultiValueResolutionDecision decision, boolean selected) {
039            if (selected) {
040                setForeground(UIManager.getColor("Table.selectionForeground"));
041                setBackground(UIManager.getColor("Table.selectionBackground"));
042            } else{
043                switch(decision.getDecisionType()) {
044                case UNDECIDED:
045                    setForeground(UIManager.getColor("Table.foreground"));
046                    setBackground(ConflictColors.BGCOLOR_UNDECIDED.get());
047                    break;
048                case KEEP_NONE:
049                    setForeground(UIManager.getColor("Panel.foreground"));
050                    setBackground(UIManager.getColor("Panel.background"));
051                    break;
052                default:
053                    setForeground(UIManager.getColor("Table.foreground"));
054                    setBackground(UIManager.getColor("Table.background"));
055                    break;
056                }
057            }
058        }
059    
060        protected void renderValue(MultiValueResolutionDecision decision) {
061            model.removeAllElements();
062            switch(decision.getDecisionType()) {
063            case UNDECIDED:
064                model.addElement(tr("Choose a value"));
065                cbDecisionRenderer.setFont(getFont().deriveFont(Font.ITALIC));
066                cbDecisionRenderer.setSelectedIndex(0);
067                break;
068            case KEEP_ONE:
069                model.addElement(decision.getChosenValue());
070                cbDecisionRenderer.setFont(getFont());
071                cbDecisionRenderer.setSelectedIndex(0);
072                break;
073            case KEEP_NONE:
074                model.addElement(tr("deleted"));
075                cbDecisionRenderer.setFont(getFont().deriveFont(Font.ITALIC));
076                cbDecisionRenderer.setSelectedIndex(0);
077                break;
078            case KEEP_ALL:
079                model.addElement(decision.getChosenValue());
080                cbDecisionRenderer.setFont(getFont());
081                cbDecisionRenderer.setSelectedIndex(0);
082                break;
083            }
084        }
085    
086        /**
087         * Sets the text of the tooltip for both renderers, this (the JLabel) and the combobox renderer.
088         */
089        protected void renderToolTipText(MultiValueResolutionDecision decision) {
090            switch(decision.getDecisionType()) {
091            case UNDECIDED:
092            {
093                String toolTipText = tr("Please decide which values to keep");
094                setToolTipText(toolTipText);
095                cbDecisionRenderer.setToolTipText(toolTipText);
096                break;
097            }
098            case KEEP_ONE:
099            {
100                String toolTipText = tr("Value ''{0}'' is going to be applied for key ''{1}''", decision.getChosenValue(), decision.getKey());
101                setToolTipText(toolTipText);
102                cbDecisionRenderer.setToolTipText(toolTipText);
103                break;
104            }
105            case KEEP_NONE:
106            {
107                String toolTipText = tr("The key ''{0}'' and all its values are going to be removed", decision.getKey());
108                setToolTipText(toolTipText);
109                cbDecisionRenderer.setToolTipText(toolTipText);
110                break;
111            }
112            case KEEP_ALL:
113                String toolTipText = tr("All values joined as ''{0}'' are going to be applied for key ''{1}''", decision.getChosenValue(), decision.getKey());
114                setToolTipText(toolTipText);
115                cbDecisionRenderer.setToolTipText(toolTipText);
116                break;
117            }
118        }
119    
120        protected void reset() {
121            setFont(UIManager.getFont("Table.font"));
122            setIcon(null);
123            setText("");
124        }
125    
126        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
127                int row, int column) {
128    
129            reset();
130            if (value == null)
131                return this;
132    
133            MultiValueResolutionDecision decision = (MultiValueResolutionDecision)value;
134            renderColors(decision,isSelected);
135            renderToolTipText(decision);
136            switch(column) {
137            case 0:
138                if (decision.isDecided()) {
139                    setIcon(iconDecided);
140                } else {
141                    setIcon(iconUndecided);
142                }
143                return this;
144    
145            case 1:
146                setText(decision.getKey());
147                return this;
148    
149            case 2:
150                renderValue(decision);
151                return cbDecisionRenderer;
152            }
153            return this;
154        }
155    }