// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.tageditor.editor; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.table.TableCellRenderer; import org.openstreetmap.josm.gui.tagging.TagModel; import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset; import org.openstreetmap.josm.plugins.tageditor.preset.AdvancedTag; /** * This is the table cell renderer for cells for the table of tags * in the tag editor dialog. */ public class TagTableCellRenderer extends JLabel implements TableCellRenderer { //private static Logger logger = Logger.getLogger(TagTableCellRenderer.class.getName()); public static final Color BG_COLOR_HIGHLIGHTED = new Color(255, 255, 204); private Font fontStandard = null; private Font fontItalic = null; public TagTableCellRenderer() { fontStandard = getFont(); fontItalic = fontStandard.deriveFont(Font.ITALIC); setOpaque(true); setBorder(new EmptyBorder(5, 5, 5, 5)); } /** * renders the name of a tag in the second column of the table * * @param tag the tag */ protected void renderTagName(TagModel tag) { setText(tag.getName()); } /** * renders the value of a a tag in the third column of the table * * @param tag the tag */ protected void renderTagValue(TagModel tag) { if (tag.getValueCount() == 0) { setText(""); } else if (tag.getValueCount() == 1) { setText(tag.getValues().get(0)); } else if (tag.getValueCount() > 1) { setText(tr("multiple")); setFont(fontItalic); } } /** * resets the renderer */ protected void resetRenderer() { setText(""); setIcon(null); setFont(fontStandard); } protected TagEditorModel getModel(JTable table) { return (TagEditorModel) table.getModel(); } protected boolean belongsToSelectedPreset(TagModel tagModel, TagEditorModel model) { // current tag is empty or consists of whitespace only => can't belong to // a selected preset // if (tagModel.getName().trim().equals("") && tagModel.getValue().equals("")) { return false; } // no current preset selected? // TaggingPreset item = (TaggingPreset) model.getAppliedPresetsModel().getSelectedItem(); if (item == null) { return false; } for (AdvancedTag tag: AdvancedTag.forTaggingPreset(item)) { if (tag.getValue() == null) { if (tagModel.getName().equals(tag.getKey())) { return true; } } else { if (tagModel.getName().equals(tag.getKey()) && tagModel.getValue().equals(tag.getValue())) { return true; } } } return false; } /** * renders the background color. The default color is white. It is * set to {@see TableCellRenderer#BG_COLOR_HIGHLIGHTED} if this cell * displays the tag which is suggested by the currently selected * preset. * * @param tagModel the tag model * @param model the tag editor model */ protected void renderColor(TagModel tagModel, TagEditorModel model, boolean isSelected) { if (isSelected) { setBackground(UIManager.getColor("Table.selectionBackground")); setForeground(UIManager.getColor("Table.selectionForeground")); } else { setBackground(UIManager.getColor("Table.background")); setForeground(UIManager.getColor("Table.foreground")); } if (belongsToSelectedPreset(tagModel, model)) { setBackground(BG_COLOR_HIGHLIGHTED); } } /** * replies the cell renderer component for a specific cell * * @param table the table * @param value the value to be rendered * @param isSelected true, if the value is selected * @param hasFocus true, if the cell has focus * @param rowIndex the row index * @param vColIndex the column index * * @return the renderer component */ @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { resetRenderer(); TagModel tagModel = (TagModel) value; switch(vColIndex) { case 0: renderTagName(tagModel); break; case 1: renderTagValue(tagModel); break; } renderColor(tagModel, (TagEditorModel) table.getModel(), isSelected); if (hasFocus && isSelected) { if (table.getSelectedColumnCount() == 1 && table.getSelectedRowCount() == 1) { if (table.getEditorComponent() != null) { table.getEditorComponent().requestFocusInWindow(); } } } return this; } }