1 /*
2
3 dsh-identify Lightweight components for identifiable beans.
4 Copyright (c) 2003-2012 held jointly by the individual authors.
5
6 This library is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 3 of the License, or (at
9 your option) any later version.
10
11 This library is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with this library; if not, write to the Free Software Foundation,
18 Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
19
20 > http://www.fsf.org/licensing/licenses/lgpl.html
21 > http://www.opensource.org/licenses/lgpl-license.php
22
23 */
24 package org.dishevelled.identify;
25
26 import java.awt.Image;
27 import java.awt.Component;
28 import java.awt.ComponentOrientation;
29
30 import javax.swing.JTree;
31 import javax.swing.JLabel;
32 import javax.swing.ImageIcon;
33
34 import javax.swing.tree.DefaultTreeCellRenderer;
35
36 import org.dishevelled.iconbundle.IconSize;
37 import org.dishevelled.iconbundle.IconState;
38 import org.dishevelled.iconbundle.IconBundle;
39 import org.dishevelled.iconbundle.IconTextDirection;
40
41 /**
42 * Tree cell renderer that displays the name property value
43 * and appropriate icon from an icon bundle for a given bean.
44 *
45 * @author Michael Heuer
46 * @version $Revision: 1059 $ $Date: 2012-01-03 14:03:02 -0600 (Tue, 03 Jan 2012) $
47 */
48 public class IdTreeCellRenderer
49 extends DefaultTreeCellRenderer
50 {
51 /** Default icon size. */
52 public static final IconSize DEFAULT_ICON_SIZE = IconSize.DEFAULT_16X16;
53
54 /** Icon size. */
55 private IconSize iconSize;
56
57 /** ImageIcon wrapper for image from icon bundle. */
58 private transient ImageIcon imageIcon;
59
60
61 /**
62 * Create a new tree cell renderer for identifiable beans with
63 * the default icon size.
64 *
65 * @see #DEFAULT_ICON_SIZE
66 */
67 public IdTreeCellRenderer()
68 {
69 this(DEFAULT_ICON_SIZE);
70 }
71
72 /**
73 * Create a new tree cell renderer for identifiable beans with
74 * the specified icon size.
75 *
76 * @param iconSize icon size, must not be null
77 */
78 public IdTreeCellRenderer(final IconSize iconSize)
79 {
80 super();
81 setIconSize(iconSize);
82 }
83
84
85 /**
86 * Return the icon size for this tree cell renderer.
87 *
88 * @return the icon size for this tree cell renderer
89 */
90 public final IconSize getIconSize()
91 {
92 return iconSize;
93 }
94
95 /**
96 * Set the icon size for this tree cell renderer to <code>iconSize</code>.
97 *
98 * @param iconSize icon size, must not be null
99 */
100 public final void setIconSize(final IconSize iconSize)
101 {
102 if (iconSize == null)
103 {
104 throw new IllegalArgumentException("iconSize must not be null");
105 }
106 this.iconSize = iconSize;
107 }
108
109 /** {@inheritDoc} */
110 public Component getTreeCellRendererComponent(final JTree tree,
111 final Object value,
112 final boolean isSelected,
113 final boolean isExpanded,
114 final boolean isLeaf,
115 final int row,
116 final boolean hasFocus)
117 {
118 JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, isSelected, isExpanded, isLeaf, row, hasFocus);
119
120 String name = IdentifyUtils.getNameFor(value);
121 label.setText(name);
122
123 IconBundle iconBundle = IdentifyUtils.getIconBundleFor(value);
124
125 if (iconBundle == null)
126 {
127 label.setIcon(null);
128 }
129 else
130 {
131 IconTextDirection textDirection = determineTextDirection(label);
132 Image image = iconBundle.getImage(label, textDirection, IconState.NORMAL, iconSize);
133
134 if (imageIcon == null)
135 {
136 imageIcon = new ImageIcon(image);
137 }
138 else
139 {
140 imageIcon.setImage(image);
141 }
142 label.setIcon(imageIcon);
143 }
144
145 return label;
146 }
147
148 /**
149 * Determine a text direction from the component orientation of
150 * the specified label.
151 *
152 * @param label label
153 * @return a text direction for the component orientation of
154 * the specified label
155 */
156 private IconTextDirection determineTextDirection(final JLabel label)
157 {
158 ComponentOrientation componentOrientation = label.getComponentOrientation();
159 return componentOrientation.isLeftToRight() ? IconTextDirection.LEFT_TO_RIGHT : IconTextDirection.RIGHT_TO_LEFT;
160 }
161 }