001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs.relation; 003 004import java.awt.Color; 005import java.awt.Component; 006import java.awt.Dimension; 007 008import javax.swing.JLabel; 009import javax.swing.JTable; 010import javax.swing.UIManager; 011import javax.swing.table.TableCellRenderer; 012 013import org.openstreetmap.josm.data.osm.OsmPrimitive; 014import org.openstreetmap.josm.gui.DefaultNameFormatter; 015import org.openstreetmap.josm.gui.util.GuiHelper; 016import org.openstreetmap.josm.tools.ImageProvider; 017 018/** 019 * This is the {@link TableCellRenderer} used in {@link SelectionTable}. 020 * 021 */ 022public class SelectionTableCellRenderer extends JLabel implements TableCellRenderer { 023 public static final Color BGCOLOR_DOUBLE_ENTRY = new Color(254, 226, 214); 024 public static final Color BGCOLOR_SINGLE_ENTRY = new Color(235, 255, 177); 025 026 /** 027 * reference to the member table model; required, in order to check whether a 028 * selected primitive is already used in the member list of the currently edited 029 * relation 030 */ 031 private MemberTableModel model; 032 033 /** 034 * constructor 035 */ 036 public SelectionTableCellRenderer() { 037 setIcon(null); 038 setOpaque(true); 039 } 040 041 /** 042 * reset the renderer 043 */ 044 protected void reset() { 045 setBackground(UIManager.getColor("Table.background")); 046 setForeground(UIManager.getColor("Table.foreground")); 047 setBorder(null); 048 setIcon(null); 049 setToolTipText(null); 050 } 051 052 protected void renderBackground(OsmPrimitive primitive) { 053 Color bgc = UIManager.getColor("Table.background"); 054 if (primitive != null && model != null && model.getNumMembersWithPrimitive(primitive) == 1) { 055 bgc = BGCOLOR_SINGLE_ENTRY; 056 } else if (primitive != null && model != null && model.getNumMembersWithPrimitive(primitive) > 1) { 057 bgc = BGCOLOR_DOUBLE_ENTRY; 058 } 059 GuiHelper.setBackgroundReadable(this, bgc); 060 } 061 062 protected void renderPrimitive(OsmPrimitive primitive, Dimension cellSize) { 063 int size = Math.min(cellSize.width, cellSize.height); 064 setIcon(ImageProvider.getPadded(primitive, new Dimension(size, size))); 065 setText(primitive.getDisplayName(DefaultNameFormatter.getInstance())); 066 setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(primitive)); 067 } 068 069 @Override 070 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 071 int row, int column) { 072 073 reset(); 074 if (value == null) 075 return this; 076 077 Dimension cellSize = table.getCellRect(row, column, false).getSize(); 078 079 renderBackground((OsmPrimitive) value); 080 renderPrimitive((OsmPrimitive) value, cellSize); 081 return this; 082 } 083 084 public void setMemberTableModel(MemberTableModel model) { 085 this.model = model; 086 } 087}