source: josm/trunk/src/org/openstreetmap/josm/gui/PrimitiveRenderer.java@ 13777

Last change on this file since 13777 was 13564, checked in by Don-vip, 6 years ago

introduce PrimitiveRenderer to replace OsmPrimitivRenderer (now deprecated). Change NameFormatter API to support IPrimitive instead of OsmPrimitive. Enhances interfaces in consequence.

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import java.awt.Component;
5
6import javax.swing.DefaultListCellRenderer;
7import javax.swing.ImageIcon;
8import javax.swing.JLabel;
9import javax.swing.JList;
10import javax.swing.JTable;
11import javax.swing.ListCellRenderer;
12import javax.swing.table.DefaultTableCellRenderer;
13import javax.swing.table.TableCellRenderer;
14
15import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
16import org.openstreetmap.josm.data.osm.IPrimitive;
17import org.openstreetmap.josm.data.osm.OsmPrimitive;
18import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
19import org.openstreetmap.josm.tools.ImageProvider;
20import org.openstreetmap.josm.tools.Logging;
21
22/**
23 * Renderer that renders the objects from an {@link IPrimitive} as data.
24 *
25 * Can be used in lists and tables.
26 *
27 * @author imi
28 * @author Frederik Ramm
29 * @since 13564 (successor to {@link OsmPrimitivRenderer}
30 */
31public class PrimitiveRenderer implements ListCellRenderer<IPrimitive>, TableCellRenderer {
32 private final DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
33
34 /**
35 * Default list cell renderer - delegate for ListCellRenderer operation
36 */
37 private final DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer();
38
39 /**
40 * Default table cell renderer - delegate for TableCellRenderer operation
41 */
42 private final DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer();
43
44 /**
45 * Adapter method supporting the ListCellRenderer interface.
46 */
47 @Override
48 public Component getListCellRendererComponent(JList<? extends IPrimitive> list, IPrimitive value, int index,
49 boolean isSelected, boolean cellHasFocus) {
50 Component def = defaultListCellRenderer.getListCellRendererComponent(list, null, index, isSelected, cellHasFocus);
51 return renderer(def, value, list.getModel().getSize() > 1000);
52 }
53
54 /**
55 * Adapter method supporting the TableCellRenderer interface.
56 */
57 @Override
58 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
59 Component def = defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
60 if (value instanceof IPrimitive)
61 return renderer(def, (IPrimitive) value, table.getModel().getRowCount() > 1000);
62 else if (value instanceof HistoryOsmPrimitive)
63 return renderer(def, (HistoryOsmPrimitive) value);
64 else
65 return def;
66 }
67
68 /**
69 * Internal method that stuffs information into the rendering component
70 * provided that it's a kind of JLabel.
71 * @param def the rendering component
72 * @param value the IPrimitive to render
73 * @param fast whether the icons should be loaded fast since many items are being displayed
74 * @return the modified rendering component
75 */
76 private Component renderer(Component def, IPrimitive value, boolean fast) {
77 if (value != null && def instanceof JLabel) {
78 ((JLabel) def).setText(getComponentText(value));
79 final ImageIcon icon = (fast || !(value instanceof OsmPrimitive))
80 ? ImageProvider.get(value.getType())
81 : ImageProvider.getPadded((OsmPrimitive) value,
82 // Height of component no yet known, assume the default 16px.
83 ImageProvider.ImageSizes.SMALLICON.getImageDimension());
84 if (icon != null) {
85 ((JLabel) def).setIcon(icon);
86 } else {
87 Logging.warn("Null icon for "+value.getDisplayType());
88 }
89 ((JLabel) def).setToolTipText(getComponentToolTipText(value));
90 }
91 return def;
92 }
93
94 /**
95 * Internal method that stuffs information into the rendering component
96 * provided that it's a kind of JLabel.
97 * @param def the rendering component
98 * @param value the HistoryOsmPrimitive to render
99 * @return the modified rendering component
100 */
101 private Component renderer(Component def, HistoryOsmPrimitive value) {
102 if (value != null && def instanceof JLabel) {
103 ((JLabel) def).setText(value.getDisplayName(DefaultNameFormatter.getInstance()));
104 ((JLabel) def).setIcon(ImageProvider.get(value.getType()));
105 ((JLabel) def).setToolTipText(formatter.buildDefaultToolTip(value));
106 }
107 return def;
108 }
109
110 /**
111 * Returns the text representing an OSM primitive in a component.
112 * Can be overridden to customize the text
113 * @param value OSM primitive
114 * @return text representing the OSM primitive
115 */
116 protected String getComponentText(IPrimitive value) {
117 return value.getDisplayName(DefaultNameFormatter.getInstance());
118 }
119
120 /**
121 * Returns the text representing an OSM primitive in a tooltip.
122 * Can be overridden to customize the ToolTipText
123 * @param value OSM primitive
124 * @return text representing the OSM primitive
125 */
126 protected String getComponentToolTipText(IPrimitive value) {
127 return formatter.buildDefaultToolTip(value);
128 }
129}
Note: See TracBrowser for help on using the repository browser.