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.util;
21
22 import java.awt.Image;
23 import java.awt.image.ImageProducer;
24 import java.io.File;
25 import java.net.URL;
26 import java.util.HashMap;
27
28 import javax.swing.Icon;
29 import javax.swing.ImageIcon;
30
31
32 /**
33 * IconHelper acts as an interface to the all icons currently in classpath.
34 * IconHelper is a singleton class that maintains internal cache to all
35 * accessed icons. This class may be used to minimize the memory consumption
36 * where application uses static icons. If icons are changed independently,
37 * this class should not be used.
38 *
39 * @author <a href="mailto:ales.pucelj@cosylab.com">Ales Pucelj</a>
40 * @version $id$
41 */
42 public final class IconHelper {
43
44 public static String ICONS_NAVIGATION_DOWN16= "icons/navigation/Down16.gif";
45 public static String ICONS_NAVIGATION_DOWN24= "icons/navigation/Down24.gif";
46 public static String ICONS_NAVIGATION_MINUS16= "icons/navigation/Minus16.gif";
47 public static String ICONS_NAVIGATION_PLUS16= "icons/navigation/Plus16.gif";
48 public static String ICONS_NAVIGATION_UP16= "icons/navigation/Up16.gif";
49 public static String ICONS_NAVIGATION_UP24= "icons/navigation/Up24.gif";
50 public static String ICONS_GENERAL_DELETE16= "icons/general/Delete16.gif";
51 public static String ICONS_GENERAL_DELETE24= "icons/general/Delete24.gif";
52 public static String ICONS_GENERAL_REMOVE16= "icons/general/Remove16.gif";
53 public static String ICONS_GENERAL_REMOVE24= "icons/general/Remove24.gif";
54
55
56 /** cache for icons. */
57 private static HashMap<String, Icon> cache;
58
59 /**
60 * Protected constructor for creation of singleton class.
61 */
62 private IconHelper() {
63 super();
64 }
65
66 /**
67 * Returns icon from the cache. If icon cannot be found in cache, return
68 * value will be <code>null</code>.
69 *
70 * @param name String
71 * @return Icon instance of an icon or null if not found
72 */
73 private static synchronized Icon getCachedIcon(String name) {
74 if (cache==null) {
75 return null;
76 }
77 if (cache.containsKey(name)) {
78 return cache.get(name);
79 }
80
81 return null;
82 }
83
84 /**
85 * Puts icon in the cache. If an icon with the specified name has already been stored,
86 * current icon will be overwritten.
87 *
88 * @param name
89 * @param icon
90 */
91 private static synchronized void putCachedIcon(String name, Icon icon) {
92 if (cache==null) {
93 cache = new HashMap<String, Icon>();
94 }
95 cache.put(name, icon);
96 }
97
98 /**
99 * Attempts to load the icon from the resources in classpath.
100 * If the icon cannot be found or other error occurs, the return value is null.
101 *
102 * @param resource String
103 * @param cl ClassLoader
104 * @return Icon icon instance or null
105 */
106 private static final Icon loadResource(String resource, ClassLoader cl) {
107 try {
108 URL url = cl.getResource(resource);
109 if (!(url.getContent() instanceof ImageProducer)) return null;
110 return new ImageIcon(url);
111 } catch (Exception e) {
112 return null;
113 }
114 }
115
116 /**
117 * Returns instance of the icon by loading it using the <code>
118 * ClassLoader</code> instance provided. Icons are cached. If an icon with
119 * the same name is requested several times, <code>createIcon</code> will
120 * return the same instance each time. If icons will be manipulated
121 * individually, do not use this method to load icons. If icon is not found
122 * in the classpath, return value will be null.
123 *
124 * @param name String
125 * @param cl ClassLoader Instance of class loader to use
126 * @return Icon Instance of Icon or null if icon could not be found.
127 */
128 public static Icon createIcon(String name, ClassLoader cl) {
129 Icon icon = getCachedIcon(name);
130
131 if (icon == null) {
132 icon = loadResource(name, cl);
133
134 if (icon != null) {
135 putCachedIcon(name, icon);
136 } else {
137 return createIcon(new File(name));
138 }
139 }
140
141 return icon;
142 }
143
144 /**
145 * Returns instance of the icon. Icons are cached. If an icon with the same
146 * name is requested several times, <code>createIcon</code> will return the
147 * same instance each time. If icons will be manipulated individually, do
148 * not use this method to load icons. If icon is not found in the classpath,
149 * or the file with that name does not exist on the disk return value will be null.
150 *
151 * @param name String
152 * @return Icon Instance of Icon or null if icon could not be found.
153 */
154 public static Icon createIcon(String name) {
155 return createIcon(name, IconHelper.class.getClassLoader());
156 }
157
158 /**
159 * Creates a new image loaded from the provided image file name.
160 * This class' class loader is used to access resources.
161 *
162 * @param name the filename of the image
163 * @return Image
164 */
165 public static Image createImage(String name) {
166 return createImage(name, IconHelper.class.getClassLoader());
167 }
168
169 /**
170 * Creates a new image loaded from the provided image file. The image
171 * is loaded using the given class loader.
172 *
173 * @param name the filename of the image
174 * @param cl classloader to be used for accessing resources
175 * @return Image
176 */
177 public static Image createImage(String name, ClassLoader cl) {
178 ImageIcon icon = ((ImageIcon) createIcon(name, cl));
179
180 if (icon == null) {
181 return null;
182 }
183
184 return icon.getImage();
185 }
186
187 /**
188 * Creates an Icon by reading the image stored in the given file. This file
189 * can be anywhere on the computer as long as it is accessible by the current user
190 * rights (the icon file does not need to be added to classpath).
191 *
192 * @param file the image file
193 * @return icon
194 */
195 public static Icon createIcon(File file) {
196 if (file == null) return null;
197 Icon icon = getCachedIcon(file.getAbsolutePath());
198 if (icon == null) {
199 icon = new ImageIcon(file.getAbsolutePath());
200 putCachedIcon(file.getAbsolutePath(), icon);
201 }
202 return icon;
203 }
204 }