001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.history;
003
004import java.awt.Color;
005import java.awt.Component;
006
007import javax.swing.BorderFactory;
008import javax.swing.JLabel;
009import javax.swing.JTable;
010import javax.swing.SwingConstants;
011import javax.swing.table.TableCellRenderer;
012
013import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
014import org.openstreetmap.josm.gui.util.GuiHelper;
015
016import static org.openstreetmap.josm.tools.I18n.tr;
017
018/**
019 * The {@link TableCellRenderer} for a list of tags in {@link HistoryBrowser}
020 *
021 */
022public class TagTableCellRenderer extends JLabel implements TableCellRenderer {
023    /**
024     * The background color for a selected row that has the focus.
025     */
026    public static final Color BGCOLOR_SELECTED_FOCUS = new Color(0xff8faaff);
027    /**
028     * The background color for a selected row while the table is not focused.
029     */
030    public static final Color BGCOLOR_SELECTED = new Color(0xffafc2ff);
031
032    /**
033     * Constructs a new {@code TagTableCellRenderer}.
034     */
035    public TagTableCellRenderer() {
036        setOpaque(true);
037    }
038
039    @Override
040    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
041            int row, int column) {
042
043        if (value == null)
044            return this;
045
046        String key = (String) value;
047        TagTableModel model = getTagTableModel(table);
048
049        String text = "";
050        String tooltip = null;
051        setBorder(null);
052        if (model.hasTag(key)) {
053            switch(column) {
054            case TagTableColumnModel.COLUMN_KEY:
055                // the name column
056                text = key;
057                break;
058            case TagTableColumnModel.COLUMN_VALUE:
059                // the value column
060                text = model.getValue(key);
061                break;
062            case TagTableColumnModel.COLUMN_VERSION:
063                HistoryOsmPrimitive primitive = model.getWhichChangedTag(key);
064                if (primitive != null) {
065                    text = model.getVersionString(primitive);
066                    tooltip = tr("Key ''{0}'' was changed in version {1}", key, primitive.getVersion());
067                    setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, model.getVersionColor(primitive)));
068                }
069                break;
070            default: // Do nothing
071            }
072        }
073
074        setText(text);
075        setToolTipText(tooltip != null ? tooltip : text);
076        setHorizontalAlignment(column == TagTableColumnModel.COLUMN_VERSION ? SwingConstants.TRAILING : SwingConstants.LEADING);
077        TwoColumnDiff.Item.DiffItemType diffItemType = model.getDiffItemType(key, column == TagTableColumnModel.COLUMN_VALUE);
078        GuiHelper.setBackgroundReadable(this, diffItemType.getColor(isSelected, table.hasFocus()));
079        return this;
080    }
081
082    protected TagTableModel getTagTableModel(JTable table) {
083        return (TagTableModel) table.getModel();
084    }
085}