// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.conflict.tags; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.awt.Font; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.table.TableCellRenderer; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.conflict.ConflictColors; import org.openstreetmap.josm.gui.widgets.JosmComboBox; import org.openstreetmap.josm.tools.ImageProvider; /** * This is a {@link TableCellRenderer} for {@link MultiValueResolutionDecision}s. * */ public class MultiValueCellRenderer extends JLabel implements TableCellRenderer { private final ImageIcon iconDecided; private final ImageIcon iconUndecided; private final DefaultComboBoxModel<Object> model; private final JosmComboBox<Object> cbDecisionRenderer; /** * Constructs a new {@code MultiValueCellRenderer}. */ public MultiValueCellRenderer() { setOpaque(true); iconDecided = ImageProvider.get("dialogs/conflict", "tagconflictresolved"); iconUndecided = ImageProvider.get("dialogs/conflict", "tagconflictunresolved"); model = new DefaultComboBoxModel<>(); cbDecisionRenderer = new JosmComboBox<>(model); } protected void renderColors(MultiValueResolutionDecision decision, boolean selected, boolean conflict) { if (selected) { setForeground(UIManager.getColor("Table.selectionForeground")); setBackground(UIManager.getColor("Table.selectionBackground")); } else { switch (decision.getDecisionType()) { case UNDECIDED: setForeground(ConflictColors.FGCOLOR_UNDECIDED.get()); setBackground(ConflictColors.BGCOLOR_UNDECIDED.get()); break; case KEEP_NONE: setForeground(ConflictColors.FGCOLOR_TAG_KEEP_NONE.get()); setBackground(ConflictColors.BGCOLOR_TAG_KEEP_NONE.get()); break; default: if (conflict) { switch (decision.getDecisionType()) { case KEEP_ONE: setForeground(ConflictColors.FGCOLOR_TAG_KEEP_ONE.get()); setBackground(ConflictColors.BGCOLOR_TAG_KEEP_ONE.get()); break; case KEEP_ALL: setForeground(ConflictColors.FGCOLOR_TAG_KEEP_ALL.get()); setBackground(ConflictColors.BGCOLOR_TAG_KEEP_ALL.get()); break; case SUM_ALL_NUMERIC: setForeground(ConflictColors.FGCOLOR_TAG_SUM_ALL_NUM.get()); setBackground(ConflictColors.BGCOLOR_TAG_SUM_ALL_NUM.get()); break; default: Main.error("Unknown decision type in renderColors(): "+decision.getDecisionType()); } } else { setForeground(UIManager.getColor("Table.foreground")); setBackground(UIManager.getColor("Table.background")); } break; } } } protected void renderValue(MultiValueResolutionDecision decision) { model.removeAllElements(); switch (decision.getDecisionType()) { case UNDECIDED: model.addElement(tr("Choose a value")); cbDecisionRenderer.setFont(getFont().deriveFont(Font.ITALIC)); cbDecisionRenderer.setSelectedIndex(0); break; case KEEP_NONE: model.addElement(tr("deleted")); cbDecisionRenderer.setFont(getFont().deriveFont(Font.ITALIC)); cbDecisionRenderer.setSelectedIndex(0); break; case KEEP_ONE: case KEEP_ALL: case SUM_ALL_NUMERIC: model.addElement(decision.getChosenValue()); cbDecisionRenderer.setFont(getFont()); cbDecisionRenderer.setSelectedIndex(0); break; default: Main.error("Unknown decision type in renderValue(): "+decision.getDecisionType()); } } /** * Sets the text of the tooltip for both renderers, this (the JLabel) and the combobox renderer. * @param decision conflict resolution decision */ protected void renderToolTipText(MultiValueResolutionDecision decision) { String toolTipText = null; switch (decision.getDecisionType()) { case UNDECIDED: toolTipText = tr("Please decide which values to keep"); break; case KEEP_ONE: toolTipText = tr("Value ''{0}'' is going to be applied for key ''{1}''", decision.getChosenValue(), decision.getKey()); break; case SUM_ALL_NUMERIC: toolTipText = tr("All numeric values sumed as ''{0}'' are going to be applied for key ''{1}''", decision.getChosenValue(), decision.getKey()); break; case KEEP_NONE: toolTipText = tr("The key ''{0}'' and all its values are going to be removed", decision.getKey()); break; case KEEP_ALL: toolTipText = tr("All values joined as ''{0}'' are going to be applied for key ''{1}''", decision.getChosenValue(), decision.getKey()); break; } setToolTipText(toolTipText); cbDecisionRenderer.setToolTipText(toolTipText); } protected void reset() { setFont(UIManager.getFont("Table.font")); setIcon(null); setText(""); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { reset(); if (value == null) return this; MultiValueResolutionDecision decision = (MultiValueResolutionDecision) value; TagConflictResolverModel tagModel = (TagConflictResolverModel) table.getModel(); boolean conflict = tagModel.getKeysWithConflicts().contains(tagModel.getKey(row)); renderColors(decision, isSelected, conflict); renderToolTipText(decision); switch(column) { case 0: if (decision.isDecided()) { setIcon(iconDecided); } else { setIcon(iconUndecided); } return this; case 1: setText(decision.getKey()); return this; case 2: renderValue(decision); return cbDecisionRenderer; } return this; } }