1 /*
2 * Copyright (c) 2003-2008 by Cosylab d. d.
3 *
4 * This file is part of CosyBeans-Common.
5 *
6 * CosyBeans-Common is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * CosyBeans-Common is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with CosyBeans-Common. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 package com.cosylab.gui.components;
21
22 import com.cosylab.gui.components.util.IconHelper;
23
24 import java.util.Vector;
25
26 import javax.swing.Icon;
27
28
29 /**
30 * This class extends <code>javax.swing.JLabel</code> so that it allows display
31 * of multiple icons. It maintains internal list of icons that associates
32 * integer values with <code>Icon</code> objects. This index is guaranteed to
33 * be valid even if the desired icon could not be found, is not valid or is
34 * null. In such cases the corresponding icon will not be displayed.
35 *
36 * <p>
37 * Icons can be provided by either the calling class via the
38 * <code>javax.swing.Icon</code> object or they can be loaded from the
39 * projects resource automatically. Two methods are provided to add the icons:
40 * <code>addIcon, addIcons</code> The later is preffered when adding multiple
41 * icons at the same time. <br>
42 * Use the <code>setIconByIndex</code> method to set which icon should be displayed.<br>
43 * The disabled state icon of the JLabel is not overriden and can be still
44 * specified.
45 * </p>
46 *
47 * <p></p>
48 *
49 * @author <a href="mailto:ales.pucelj@cosylab.com">Ales Pucelj</a>
50 * @version $id$
51 */
52 public class MultiIconLabel extends javax.swing.JLabel
53 {
54
55 private static final long serialVersionUID = 1L;
56 /** List storing all icons */
57 private final Vector<Icon> iconList = new Vector<Icon>();
58
59 /**
60 * Default constructor for MultiIconLabel.
61 */
62 public MultiIconLabel()
63 {
64 super();
65 }
66
67 /**
68 * Constructs a MultiIconLabel and loads the icons from the specified
69 * resource names.
70 *
71 * <p></p>
72 *
73 * @param resourceNames String[]
74 */
75 public MultiIconLabel(String[] resourceNames)
76 {
77 this();
78 addIcons(resourceNames);
79 }
80
81 /**
82 * Constructs a MultiIconLabel and loads the icons from the specified
83 * resource names. Also sets the horizontal alignement of the text.
84 *
85 * <p></p>
86 *
87 * @param resourceNames String[]
88 * @param horizontalAlignement int.
89 */
90 public MultiIconLabel(String[] resourceNames, int horizontalAlignement)
91 {
92 this();
93 addIcons(resourceNames);
94 setHorizontalAlignment(horizontalAlignement);
95 }
96
97 /**
98 * Constructs a MultiIconLabel and adds the icons to the icon list.
99 *
100 * @param icons Icon[]
101 */
102 public MultiIconLabel(Icon[] icons)
103 {
104 this();
105 addIcons(icons);
106 }
107
108 /**
109 * Constructs a MultiIconLabel and adds the icons to the icon list. Also
110 * sets the horizontal alignement of the text.
111 *
112 * <p></p>
113 *
114 * @param icons javax.swing.Icon[]
115 * @param horizontalAlignment int
116 */
117 public MultiIconLabel(javax.swing.Icon[] icons, int horizontalAlignment)
118 {
119 this(icons);
120 setHorizontalAlignment(horizontalAlignment);
121 }
122
123 /**
124 * Appends the icon specified by resourceName to the end of internal list
125 * of icons. This method calls addIcon(Icon) and loadFromResource(String).
126 * If resourceName does not exist in the projects resources, method adds
127 * empty icon.
128 *
129 * <p></p>
130 *
131 * @param resourceName java.lang.String
132 */
133 public void addIcon(String resourceName)
134 {
135 addIcon(loadFromResource(resourceName));
136 }
137
138 /**
139 * Appends the icon to the list of icons.
140 *
141 * <p></p>
142 *
143 * @param icon javax.swing.Icon
144 */
145 public void addIcon(Icon icon)
146 {
147 iconList.add(icon);
148 }
149
150 /**
151 * Appends all icons specified by resourceNames to the end of internal list
152 * of icons. For adding multiple icons, this method outperforms individual
153 * calls to <code>addIcon</code> method.
154 *
155 * <p>
156 * After calling this method, the list of icons will grow by the size of
157 * the array, regardless of its contentrs. If any of the icons is null or
158 * of invalid type, the associated icon will not be displayed.
159 * </p>
160 *
161 * <p></p>
162 *
163 * @param resourceNames java.lang.String[]
164 */
165 public void addIcons(String[] resourceNames)
166 {
167 if (resourceNames != null) {
168 for (int i = 0; i < resourceNames.length; i++) {
169 addIcon(resourceNames[i]);
170 }
171 }
172 }
173
174 /**
175 * Appends all icons specified by icons parameter to the internal list of
176 * icons. For adding multiple icons, this method outperforms individual
177 * calls to <code>addIcon</code> method.
178 *
179 * <p>
180 * After calling this method, the list of icons will grow by the size of
181 * the array, regardless of its contentrs. If any of the icons is null or
182 * of invalid type, the associated icon will not be displayed. <br>
183 * </p>
184 *
185 * @param icons javax.swing.Icon[]
186 */
187 public void addIcons(Icon[] icons)
188 {
189 if (icons != null) {
190 for (int i = 0; i < icons.length; i++) {
191 addIcon(icons[i]);
192 }
193 }
194 }
195
196 /**
197 * Returns the Icon resource assigned to the specified index. If the icon
198 * has not been defined, returns null.
199 *
200 * <p></p>
201 *
202 * @param index int
203 *
204 * @return javax.swing.Icon
205 */
206 public Icon getIconByIndex(int index)
207 {
208 if ((index >= 0) && (index < iconList.size())) {
209 return iconList.get(index);
210 }
211
212 return null;
213 }
214
215 /**
216 * Loads the Icon from the projects resource. Returns null if the resource
217 * does not exist.
218 *
219 * <p></p>
220 *
221 * @param resourceName java.lang.String
222 *
223 * @return javax.swing.Icon
224 */
225 protected Icon loadFromResource(String resourceName)
226 {
227 return IconHelper.createIcon(resourceName);
228 }
229
230 /**
231 * Displays the icon specified by index. If the icon with this index has
232 * not been defined, no icon will be displayed.
233 *
234 * <p></p>
235 *
236 * @param index int
237 */
238 public void setIconByIndex(int index)
239 {
240 setIcon(getIconByIndex(index));
241 }
242
243 /**
244 * Returns number of available icons.
245 *
246 * @return Number of available icons.
247 */
248 public int getIconCount()
249 {
250 return iconList.size();
251 }
252 }
253
254 /* __oOo__ */