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 }