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;
008
009import javax.swing.ImageIcon;
010import javax.swing.JLabel;
011import javax.swing.JTable;
012import javax.swing.table.TableCellRenderer;
013
014import org.openstreetmap.josm.gui.history.TwoColumnDiff.Item.DiffItemType;
015import org.openstreetmap.josm.gui.util.GuiHelper;
016import org.openstreetmap.josm.tools.ImageProvider;
017
018/**
019 * A {@link TableCellRenderer} for the {@link NodeListViewer}.
020 *
021 * Renders information about a node when comparing the node list of two
022 * historical versions of a way.
023 */
024public class NodeListTableCellRenderer extends JLabel implements TableCellRenderer {
025
026    /** Color of selected background */
027    public static final Color BGCOLOR_SELECTED = new Color(143, 170, 255);
028
029    private final ImageIcon nodeIcon;
030
031    /**
032     * Constructs a new {@code NodeListTableCellRenderer}.
033     */
034    public NodeListTableCellRenderer() {
035        setOpaque(true);
036        nodeIcon = ImageProvider.get("data", "node");
037        setIcon(nodeIcon);
038    }
039
040    protected void renderIndex(DiffTableModel model, int row) {
041        int rowNumber = model.getRowNumber(row);
042        setText(rowNumber > 0 ? Integer.toString(rowNumber) : "");
043        setToolTipText(null);
044        setHorizontalAlignment(CENTER);
045        setIcon(null);
046    }
047
048    protected void renderNode(TwoColumnDiff.Item item) {
049        String text = "";
050        setIcon(nodeIcon);
051        if (item.value != null) {
052            text = tr("Node {0}", item.value.toString());
053        }
054        if (item.state == DiffItemType.EMPTY) {
055            text = "";
056            setIcon(null);
057        }
058        setText(text);
059        setHorizontalAlignment(LEADING);
060    }
061
062    // Warning: The model pads with null-rows to match the size of the opposite table. 'value' could be null
063    @Override
064    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
065            int row, int column) {
066        if (value == null) return this;
067        TwoColumnDiff.Item item = (TwoColumnDiff.Item) value;
068        GuiHelper.setBackgroundReadable(this, item.state.getColor(isSelected, hasFocus));
069        if (column == NodeListTableColumnModel.INDEX_COLUMN) {
070            renderIndex((DiffTableModel) table.getModel(), row);
071        } else if (column == NodeListTableColumnModel.NODE_COLUMN) {
072            renderNode(item);
073        }
074        return this;
075    }
076}