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, TagTableModel model, boolean isSelected, boolean hasFocus, boolean isValue) {
036        Color bgColor = UIManager.getColor("Table.background");
037        if ((!model.hasTag(key) && model.isCurrentPointInTime())
038                || (!model.oppositeHasTag(key) && model.isReferencePointInTime())) {
039            bgColor = TwoColumnDiff.Item.DiffItemType.DELETED.getColor();
040        } else if ((!model.oppositeHasTag(key) && model.isCurrentPointInTime())
041                || (!model.hasTag(key) && model.isReferencePointInTime())) {
042            bgColor = TwoColumnDiff.Item.DiffItemType.INSERTED.getColor();
043        } else if (isValue && model.hasTag(key) && model.oppositeHasTag(key) && !model.hasSameValueAsOpposite(key)) {
044            bgColor = TwoColumnDiff.Item.DiffItemType.CHANGED.getColor();
045        }
046        if (isSelected) {
047            if (hasFocus) {
048                bgColor = BGCOLOR_SELECTED_FOCUS;
049            } else {
050                bgColor = BGCOLOR_SELECTED;
051            }
052        }
053
054        GuiHelper.setBackgroundReadable(this, bgColor);
055    }
056
057    @Override
058    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
059            int row, int column) {
060
061        if (value == null)
062            return this;
063
064        String key = (String) value;
065        TagTableModel model = getTagTableModel(table);
066
067        String text = "";
068        if (model.hasTag(key)) {
069            switch(column) {
070            case TagTableColumnModel.COLUMN_KEY:
071                // the name column
072                text = key;
073                break;
074            case TagTableColumnModel.COLUMN_VALUE:
075                // the value column
076                text = model.getValue(key);
077                break;
078            default: // Do nothing
079            }
080        }
081
082        setText(text);
083        setToolTipText(text);
084        setBackgroundReadable(key, model, isSelected, table.hasFocus(), column == TagTableColumnModel.COLUMN_VALUE);
085        return this;
086    }
087
088    protected TagTableModel getTagTableModel(JTable table) {
089        return (TagTableModel) table.getModel();
090    }
091}