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}