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}