All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.j3d.util.ImageLoader Maven / Gradle / Ivy

There is a newer version: 3.0.1
Show newest version
/*****************************************************************************
 *                        J3D.org Copyright (c) 2000
 *                               Java Source
 *
 * This source is licensed under the GNU LGPL v2.1
 * Please read http://www.gnu.org/copyleft/lgpl.html for more information
 *
 * This software comes with the standard NO WARRANTY disclaimer for any
 * purpose. Use it at your own risk. If there's a problem you get to fix it.
 *
 ****************************************************************************/

package org.j3d.util;

// External imports
import java.awt.Image;
import java.awt.Toolkit;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.net.MalformedURLException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashMap;

import javax.swing.Icon;
import javax.swing.ImageIcon;

// Local imports
// none

/**
 * A convenience class that loads Icons for users and provides caching
 * mechanisms.
 * 

* * Internationalisation Resource Names *

    *
  • urlFormatErrorMsg: The filename they give us is treated as a URL * but is badly formatted.
  • *
* * @author Justin Couch * @version $Revision: 1.4 $ */ public class ImageLoader { /** Resource for the file not found error message */ private static final String BAD_URL_MSG_PROP = "org.j3d.util.ImageLoader.urlFormatErrorMsg"; /** The default size of the map */ private static final int DEFAULT_SIZE = 10; /** * A hashmap of the loaded image instances. Weak so that we can discard * them if if needed because we're running out of memory. */ private static HashMap loadedImages; /** * A hashmap of the loaded icon instances. Weak so that we can discard * them if if needed because we're running out of memory. */ private static HashMap loadedIcons; /** Error reporter for sending out messages */ private static ErrorReporter errorReporter; /** * Static initialiser to get all the bits set up as needed. */ static { errorReporter = DefaultErrorReporter.getDefaultReporter(); loadedImages = new HashMap<>(DEFAULT_SIZE); loadedIcons = new HashMap<>(DEFAULT_SIZE); } /** * Register an error reporter with the engine so that any errors generated * by the loading of script code can be reported in a nice, pretty fashion. * Setting a value of null will clear the currently set reporter. If one * is already set, the new value replaces the old. * * @param reporter The instance to use or null */ public static void setErrorReporter(ErrorReporter reporter) { errorReporter = reporter; // Reset the default only if we are not shutting down the system. if(reporter == null) errorReporter = DefaultErrorReporter.getDefaultReporter(); } /** * Load an icon for the named image file. Looks in the classpath for the * image so the path provided must be fully qualified relative to the * classpath. Alternatively a fully qualified URL may be provided to fetch * an image from an alternative place other than the classpath. * * @param name The path to load the icon for. If not found, * no image is loaded. * @return An icon for the named path. */ public static Icon loadIcon(String name) { // Check the map for an instance first Icon ret_val = null; WeakReference ref = loadedIcons.get(name); if(ref != null) { ret_val = (Icon)ref.get(); if(ret_val == null) loadedIcons.remove(name); } if(ret_val == null) { Image img = loadImage(name); if(img != null) { ret_val = new ImageIcon(img, name); loadedIcons.put(name, new WeakReference<>(ret_val)); } } return ret_val; } /** * Load an image for the named image file. Looks in the classpath for the * image so the path provided must be fully qualified relative to the * classpath. Alternatively a fully qualified URL may be provided to fetch * an image from an alternative place other than the classpath. * * @param name The path to load the icon for. If not found, * no image is loaded. * @return An image for the named path. */ public static Image loadImage(String name) { // Check the map for an instance first Image ret_val = null; WeakReference ref = loadedImages.get(name); if(ref != null) { ret_val = (Image)ref.get(); if(ret_val == null) loadedIcons.remove(name); } if(ret_val == null) { URL url = findFile(name); if(url != null) { Toolkit toolkit = Toolkit.getDefaultToolkit(); ret_val = toolkit.createImage(url); loadedImages.put(name, new WeakReference<>(ret_val)); } } return ret_val; } /** * Find the path to the resource name by looking for fully qualified * and partially qualified names. Works within JWS too. * * @param filename The name/path to the file to load * @return The URL the file that needs to be loaded */ private static URL findFile(final String filename) { URL ret_val = null; // if URL or URI then just get the object if(filename.startsWith("http:") || filename.startsWith("file:")) { try { ret_val = new URL(filename); } catch (MalformedURLException ioe) { I18nManager intl_mgr = I18nManager.getManager(); String msg = intl_mgr.getString(BAD_URL_MSG_PROP) + filename; errorReporter.errorReport(msg, null); } } else { // try to retrieve from the classpath ret_val = AccessController.doPrivileged( new PrivilegedAction() { public URL run() { URL url = ClassLoader.getSystemResource(filename); // WebStart fallback if(url == null) { ClassLoader cl = ImageLoader.class.getClassLoader(); url = cl.getResource(filename); } return url; } } ); } return ret_val; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy