001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.tagging; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.Component; 007 import java.awt.Font; 008 009 import javax.swing.JLabel; 010 import javax.swing.JTable; 011 import javax.swing.UIManager; 012 import javax.swing.border.EmptyBorder; 013 import javax.swing.table.TableCellRenderer; 014 015 /** 016 * This is the table cell renderer for cells for the table of tags 017 * in the tag editor dialog. 018 * 019 * 020 */ 021 public class TagCellRenderer extends JLabel implements TableCellRenderer { 022 private Font fontStandard = null; 023 private Font fontItalic = null; 024 025 public TagCellRenderer() { 026 fontStandard = UIManager.getFont("Table.font"); 027 fontItalic = fontStandard.deriveFont(Font.ITALIC); 028 setOpaque(true); 029 setBorder(new EmptyBorder(5,5,5,5)); 030 } 031 032 /** 033 * renders the name of a tag in the second column of 034 * the table 035 * 036 * @param tag the tag 037 */ 038 protected void renderTagName(TagModel tag) { 039 setText(tag.getName()); 040 } 041 042 /** 043 * renders the value of a a tag in the third column of 044 * the table 045 * 046 * @param tag the tag 047 */ 048 protected void renderTagValue(TagModel tag) { 049 if (tag.getValueCount() == 0) { 050 setText(""); 051 } else if (tag.getValueCount() == 1) { 052 setText(tag.getValues().get(0)); 053 } else if (tag.getValueCount() > 1) { 054 setText(tr("multiple")); 055 setFont(fontItalic); 056 } 057 } 058 059 /** 060 * resets the renderer 061 */ 062 protected void resetRenderer() { 063 setText(""); 064 setIcon(null); 065 setFont(fontStandard); 066 } 067 068 protected TagEditorModel getModel(JTable table) { 069 return (TagEditorModel)table.getModel(); 070 } 071 072 /** 073 * replies the cell renderer component for a specific cell 074 * 075 * @param table the table 076 * @param value the value to be rendered 077 * @param isSelected true, if the value is selected 078 * @param hasFocus true, if the cell has focus 079 * @param rowIndex the row index 080 * @param vColIndex the column index 081 * 082 * @return the renderer component 083 */ 084 public Component getTableCellRendererComponent(JTable table, Object value, 085 boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 086 resetRenderer(); 087 if (value == null) 088 return this; 089 090 // set background color 091 // 092 if (isSelected){ 093 setBackground(UIManager.getColor("Table.selectionBackground")); 094 setForeground(UIManager.getColor("Table.selectionForeground")); 095 } else { 096 setBackground(UIManager.getColor("Table.background")); // standard color 097 setForeground(UIManager.getColor("Table.foreground")); 098 } 099 100 switch(vColIndex) { 101 case 0: renderTagName((TagModel)value); break; 102 case 1: renderTagValue((TagModel)value); break; 103 104 default: throw new RuntimeException("unexpected index in switch statement"); 105 } 106 if (hasFocus && isSelected) { 107 if (table.getSelectedColumnCount() == 1 && table.getSelectedRowCount() == 1) { 108 if (table.getEditorComponent() != null) { 109 table.getEditorComponent().requestFocusInWindow(); 110 } 111 } 112 } 113 return this; 114 } 115 }