001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.history;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Color;
007import java.awt.Component;
008import java.awt.Font;
009
010import javax.swing.JLabel;
011import javax.swing.JTable;
012import javax.swing.UIManager;
013import javax.swing.table.TableCellRenderer;
014
015/**
016 * The {@link TableCellRenderer} for a list of tags in {@link HistoryBrowser}
017 *
018 */
019public class TagTableCellRenderer extends JLabel implements TableCellRenderer {
020    public static final Color BGCOLOR_DIFFERENCE = new Color(255,197,197);
021
022    /**
023     * Constructs a new {@code TagTableCellRenderer}.
024     */
025    public TagTableCellRenderer() {
026        setOpaque(true);
027    }
028
029    protected void renderName(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected) {
030        String text = key;
031        Color bgColor = UIManager.getColor("Table.background");
032        Color fgColor = UIManager.getColor("Table.foreground");
033        Font font = UIManager.getFont("Table.font");
034        if (! model.hasTag(key)) {
035            text = tr("not present");
036            bgColor = BGCOLOR_DIFFERENCE;
037            font = font.deriveFont(Font.ITALIC);
038        } else if (!model.oppositeHasTag(key)) {
039            bgColor = BGCOLOR_DIFFERENCE;
040        }
041        if (isSelected) {
042            bgColor = UIManager.getColor("Table.backgroundSelected");
043            fgColor = UIManager.getColor("Table.foregroundSelected");
044        }
045
046        setText(text);
047        setToolTipText(text);
048        setBackground(bgColor);
049        setForeground(fgColor);
050        setFont(font);
051    }
052
053    protected void renderValue(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected) {
054        String text = "";
055        Color bgColor = UIManager.getColor("Table.background");
056        Color fgColor = UIManager.getColor("Table.foreground");
057        Font font = UIManager.getFont("Table.font");
058        if (! model.hasTag(key)) {
059            text = tr("not present");
060            bgColor = BGCOLOR_DIFFERENCE;
061            font = font.deriveFont(Font.ITALIC);
062        } else {
063            text = model.getValue(key);
064            if (!model.hasSameValueAsOpposite(key)) {
065                bgColor = BGCOLOR_DIFFERENCE;
066            }
067        }
068        if (isSelected) {
069            bgColor = UIManager.getColor("Table.backgroundSelected");
070            fgColor = UIManager.getColor("Table.foregroundSelected");
071        }
072
073        setText(text);
074        setToolTipText(text);
075        setBackground(bgColor);
076        setForeground(fgColor);
077        setFont(font);
078    }
079
080    @Override
081    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
082            int row, int column) {
083
084        if (value == null)
085            return this;
086
087        String key = (String)value;
088        HistoryBrowserModel.TagTableModel model = getTagTableModel(table);
089
090        switch(column) {
091        case 0:
092            // the name column
093            renderName(key, model, isSelected);
094            break;
095        case 1:
096            // the value column
097            renderValue(key, model, isSelected);
098            break;
099        }
100
101        return this;
102    }
103
104    protected HistoryBrowserModel.TagTableModel getTagTableModel(JTable table) {
105        return (HistoryBrowserModel.TagTableModel) table.getModel();
106    }
107}