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.JLabel;
008import javax.swing.JTable;
009import javax.swing.UIManager;
010import javax.swing.table.TableCellRenderer;
011
012import org.openstreetmap.josm.gui.util.GuiHelper;
013
014/**
015 * The {@link TableCellRenderer} for a list of tags in {@link HistoryBrowser}
016 *
017 */
018public class TagTableCellRenderer extends JLabel implements TableCellRenderer {
019    /**
020     * The background color for a selected row that has the focus.
021     */
022    public static final Color BGCOLOR_SELECTED_FOCUS = new Color(0xff8faaff);
023    /**
024     * The background color for a selected row while the table is not focused.
025     */
026    public static final Color BGCOLOR_SELECTED = new Color(0xffafc2ff);
027
028    /**
029     * Constructs a new {@code TagTableCellRenderer}.
030     */
031    public TagTableCellRenderer() {
032        setOpaque(true);
033    }
034
035    protected void setBackgroundReadable(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected, boolean hasFocus,
036            boolean isValue) {
037        Color bgColor = UIManager.getColor("Table.background");
038        if ((!model.hasTag(key) && model.isCurrentPointInTime())
039                || (!model.oppositeHasTag(key) && model.isReferencePointInTime())) {
040            bgColor = TwoColumnDiff.Item.DiffItemType.DELETED.getColor();
041        } else if ((!model.oppositeHasTag(key) && model.isCurrentPointInTime())
042                || (!model.hasTag(key) && model.isReferencePointInTime())) {
043            bgColor = TwoColumnDiff.Item.DiffItemType.INSERTED.getColor();
044        } else if (isValue && model.hasTag(key) && model.oppositeHasTag(key) && !model.hasSameValueAsOpposite(key)) {
045            bgColor = TwoColumnDiff.Item.DiffItemType.CHANGED.getColor();
046        }
047        if (isSelected) {
048            if (hasFocus) {
049                bgColor = BGCOLOR_SELECTED_FOCUS;
050            } else {
051                bgColor = BGCOLOR_SELECTED;
052            }
053        }
054
055        GuiHelper.setBackgroundReadable(this, bgColor);
056    }
057
058    @Override
059    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
060            int row, int column) {
061
062        if (value == null)
063            return this;
064
065        String key = (String) value;
066        HistoryBrowserModel.TagTableModel model = getTagTableModel(table);
067
068        String text = "";
069        if (model.hasTag(key)) {
070            switch(column) {
071            case TagTableColumnModel.COLUMN_KEY:
072                // the name column
073                text = key;
074                break;
075            case TagTableColumnModel.COLUMN_VALUE:
076                // the value column
077                text = model.getValue(key);
078                break;
079            default: // Do nothing
080            }
081        }
082
083        setText(text);
084        setToolTipText(text);
085        setBackgroundReadable(key, model, isSelected, table.hasFocus(), column == TagTableColumnModel.COLUMN_VALUE);
086        return this;
087    }
088
089    protected HistoryBrowserModel.TagTableModel getTagTableModel(JTable table) {
090        return (HistoryBrowserModel.TagTableModel) table.getModel();
091    }
092}