001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.conflict.tags;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Component;
007import java.awt.Font;
008
009import javax.swing.DefaultComboBoxModel;
010import javax.swing.ImageIcon;
011import javax.swing.JLabel;
012import javax.swing.JTable;
013import javax.swing.UIManager;
014import javax.swing.table.TableCellRenderer;
015
016import org.openstreetmap.josm.gui.conflict.ConflictColors;
017import org.openstreetmap.josm.gui.widgets.JosmComboBox;
018import org.openstreetmap.josm.tools.ImageProvider;
019
020/**
021 * This is a {@link TableCellRenderer} for {@link MultiValueResolutionDecision}s.
022 *
023 */
024public 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    @Override
127    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
128            int row, int column) {
129
130        reset();
131        if (value == null)
132            return this;
133
134        MultiValueResolutionDecision decision = (MultiValueResolutionDecision)value;
135        renderColors(decision,isSelected);
136        renderToolTipText(decision);
137        switch(column) {
138        case 0:
139            if (decision.isDecided()) {
140                setIcon(iconDecided);
141            } else {
142                setIcon(iconUndecided);
143            }
144            return this;
145
146        case 1:
147            setText(decision.getKey());
148            return this;
149
150        case 2:
151            renderValue(decision);
152            return cbDecisionRenderer;
153        }
154        return this;
155    }
156}