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 }