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