001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.gui; 003 004 import java.awt.Component; 005 006 import javax.swing.DefaultListCellRenderer; 007 import javax.swing.JLabel; 008 import javax.swing.JList; 009 import javax.swing.JTable; 010 import javax.swing.ListCellRenderer; 011 import javax.swing.table.DefaultTableCellRenderer; 012 import javax.swing.table.TableCellRenderer; 013 014 import org.openstreetmap.josm.data.osm.OsmPrimitive; 015 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive; 016 import org.openstreetmap.josm.tools.ImageProvider; 017 018 /** 019 * Renderer that renders the objects from an OsmPrimitive as data. 020 * 021 * Can be used in lists and tables. 022 * 023 * @author imi 024 * @author Frederik Ramm <frederik@remote.org> 025 */ 026 public class OsmPrimitivRenderer implements ListCellRenderer, TableCellRenderer { 027 private DefaultNameFormatter formatter = DefaultNameFormatter.getInstance(); 028 029 /** 030 * Default list cell renderer - delegate for ListCellRenderer operation 031 */ 032 private DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer(); 033 034 /** 035 * Default table cell renderer - delegate for TableCellRenderer operation 036 */ 037 private DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer(); 038 039 /** 040 * Adapter method supporting the ListCellRenderer interface. 041 */ 042 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 043 Component def = defaultListCellRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 044 return renderer(def, (OsmPrimitive) value); 045 } 046 047 /** 048 * Adapter method supporting the TableCellRenderer interface. 049 */ 050 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 051 Component def = defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 052 if (value instanceof OsmPrimitive) 053 return renderer(def, (OsmPrimitive) value); 054 else if (value instanceof HistoryOsmPrimitive) 055 return renderer(def, (HistoryOsmPrimitive) value); 056 else 057 return def; 058 } 059 060 /** 061 * Internal method that stuffs information into the rendering component 062 * provided that it's a kind of JLabel. 063 * @param def the rendering component 064 * @param value the OsmPrimtive to render 065 * @return the modified rendering component 066 */ 067 private Component renderer(Component def, OsmPrimitive value) { 068 if (def != null && value != null && def instanceof JLabel) { 069 ((JLabel)def).setText(getComponentText(value)); 070 ((JLabel)def).setIcon(ImageProvider.get(value.getDisplayType())); 071 ((JLabel)def).setToolTipText(getComponentToolTipText(value)); 072 } 073 return def; 074 } 075 076 /** 077 * Internal method that stuffs information into the rendering component 078 * provided that it's a kind of JLabel. 079 * @param def the rendering component 080 * @param value the HistoryOsmPrimtive to render 081 * @return the modified rendering component 082 */ 083 private Component renderer(Component def, HistoryOsmPrimitive value) { 084 if (def != null && value != null && def instanceof JLabel) { 085 ((JLabel)def).setText(value.getDisplayName(DefaultNameFormatter.getInstance())); 086 ((JLabel)def).setIcon(ImageProvider.get(value.getType())); 087 ((JLabel)def).setToolTipText(formatter.buildDefaultToolTip(value)); 088 } 089 return def; 090 } 091 092 /** 093 * Can be overridden to customize the Text 094 */ 095 protected String getComponentText(OsmPrimitive value) { 096 return value.getDisplayName(DefaultNameFormatter.getInstance()); 097 } 098 099 /** 100 * Can be overridden to customize the ToolTipText 101 */ 102 protected String getComponentToolTipText(OsmPrimitive value) { 103 return formatter.buildDefaultToolTip(value); 104 } 105 }