001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.history; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.Color; 007 import java.awt.Component; 008 009 import javax.swing.ImageIcon; 010 import javax.swing.JLabel; 011 import javax.swing.JTable; 012 import javax.swing.table.TableCellRenderer; 013 014 import org.openstreetmap.josm.tools.ImageProvider; 015 016 public class NodeListTableCellRenderer extends JLabel implements TableCellRenderer { 017 018 public final static Color BGCOLOR_EMPTY_ROW = new Color(234,234,234); 019 public final static Color BGCOLOR_DELETED = new Color(255,197,197); 020 public final static Color BGCOLOR_INSERTED = new Color(0xDD, 0xFF, 0xDD); 021 public final static Color BGCOLOR_CHANGED = new Color(255,234,213); 022 public final static Color BGCOLOR_SELECTED = new Color(143,170,255); 023 024 private ImageIcon nodeIcon; 025 026 public NodeListTableCellRenderer(){ 027 setOpaque(true); 028 nodeIcon = ImageProvider.get("data", "node"); 029 setIcon(nodeIcon); 030 } 031 032 protected void renderNode(TwoColumnDiff.Item item, boolean isSelected) { 033 String text = ""; 034 Color bgColor = Color.WHITE; 035 setIcon(nodeIcon); 036 if (item.value != null) { 037 text = tr("Node {0}", item.value.toString()); 038 } 039 switch(item.state) { 040 case TwoColumnDiff.Item.EMPTY: 041 text = ""; 042 bgColor = BGCOLOR_EMPTY_ROW; 043 setIcon(null); 044 break; 045 case TwoColumnDiff.Item.CHANGED: 046 bgColor = BGCOLOR_CHANGED; 047 break; 048 case TwoColumnDiff.Item.INSERTED: 049 bgColor = BGCOLOR_INSERTED; 050 break; 051 case TwoColumnDiff.Item.DELETED: 052 bgColor = BGCOLOR_DELETED; 053 break; 054 default: 055 bgColor = BGCOLOR_EMPTY_ROW; 056 } 057 if (isSelected) { 058 bgColor = BGCOLOR_SELECTED; 059 } 060 setText(text); 061 setBackground(bgColor); 062 } 063 064 // Warning: The model pads with null-rows to match the size of the opposite table. 'value' could be null 065 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 066 int row, int column) { 067 068 renderNode((TwoColumnDiff.Item)value, isSelected); 069 return this; 070 } 071 }