View Javadoc

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.Toolkit;
24  import java.awt.image.ImageProducer;
25  
26  import java.io.IOException;
27  
28  import java.net.URL;
29  
30  import java.security.AccessController;
31  import java.security.PrivilegedAction;
32  
33  import java.util.HashMap;
34  
35  
36  /**
37   * ImageHelper acts as an interface to the all images currently in classpath.
38   * ImageHelper is a singleton class that maintains internal cache to all
39   * accessed images. This class may be used to minimize the memory consumption
40   * where application uses static images. If images are changed independently,
41   * this class should not be used.
42   *
43   * @author <a href="mailto:jernej.kamenik@cosylab.com">Jernej Kamenik</a>
44   * @version $id$
45   *
46   */
47  public class ImageHelper {
48      /** cache for images. */
49      private static final HashMap<String, Image> cache = new HashMap<String, Image>();
50  
51      /** singleton instance of this class. */
52      private static ImageHelper instance = null;
53  
54      /**
55       * Protected constructor for creation of singleton class.
56       */
57      private ImageHelper() {
58          super();
59      }
60  
61      /**
62       * Returns instance of a singleton ImageHelper.
63       *
64       * @return ImageHelper
65       */
66      private static synchronized ImageHelper getInstance() {
67          if (instance == null) {
68              instance = new ImageHelper();
69          }
70  
71          return instance;
72      }
73  
74      /**
75       * Returns image from the cache. If image cannot be found in cache, return
76       * value will be <code>null</code>.
77       *
78       * @param name String
79       * @return Image instance of an image or null if not found
80       */
81      private static Image getCachedImage(String name) {
82          if (cache.containsKey(name)) {
83              return (Image) cache.get(name);
84          }
85  
86          return null;
87      }
88  
89      /**
90       * Puts image in the cache. If an image with the specified name has already been stored,
91       * current image will be overwritten.
92       *
93       * @param name
94       * @param image
95       */
96      private static synchronized void setCachedImage(String name, Image image) {
97          cache.put(name, image);
98      }
99  
100     /**
101      * Returns instance of the image by loading it using the <code>
102      * ClassLoader</code> instance provided. images are cached. If an image with
103      * the same name is requested several times, <code>createImage</code> will
104      * return the same instance each time. If images will be manipulated
105      * individually, do not use this method to load images. If image is not found
106      * in the classpath, return value will be null.
107      *
108      * @param name String
109      * @param cl ClassLoader Instance of class loader to use
110      * @return image Instance of image or null if image could not be found.
111      */
112     public static Image createimage(String name, ClassLoader cl) {
113         Image image = getCachedImage(name);
114 
115         if (image == null) {
116             image = loadResource(name, cl);
117 
118             if (image != null) {
119                 setCachedImage(name, image);
120             }
121         }
122 
123         return image;
124     }
125 
126     /**
127      * Returns instance of the image. images are cached. If an image with the same
128      * name is requested several times, <code>createImage</code> will return the
129      * same instance each time. If images will be manipulated individually, do
130      * not use this method to load images. If image is not found in the classpath,
131      * return value will be null.
132      *
133      * @param name String
134      * @return image Instance of image or null if image could not be found.
135      */
136     public static Image createImage(String name) {
137         return createimage(name, ImageHelper.class.getClassLoader());
138     }
139 
140     /**
141      * This is a utility method to help in loading image images.
142      * It takes the name of a resource file and loads an image object
143      * from that file.  Typically images will be GIFs.
144      * <p>
145      * @param resourceName  A pathname relative to the directory
146      *                holding the class loader specified.  For example,
147      *                "wombat.gif".
148      * @param c ClassLoader.
149      * @return  an image object.  May be null if the load failed.
150      */
151     public static Image loadResource(final String resourceName,
152         final ClassLoader c) {
153         try {
154             ImageProducer ip = (ImageProducer) AccessController.doPrivileged(new PrivilegedAction<Object>() {
155                         public Object run() {
156                             URL url;
157 
158                             if ((url = c.getResource(resourceName)) == null) {
159                                 return null;
160                             } else {
161                                 try {
162                                     return url.getContent();
163                                 } catch (IOException ioe) {
164                                     return null;
165                                 }
166                             }
167                         }
168                     });
169 
170             if (ip == null) {
171                 return null;
172             }
173 
174             Toolkit tk = Toolkit.getDefaultToolkit();
175 
176             return tk.createImage(ip);
177         } catch (Exception ex) {
178             return null;
179         }
180     }
181 }