com.windowtester.swt.util.ImageManager.java Source code

Java tutorial

Introduction

Here is the source code for com.windowtester.swt.util.ImageManager.java

Source

/*******************************************************************************
 *  Copyright (c) 2012 Google, Inc.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *  
 *  Contributors:
 *  Google, Inc. - initial API and implementation
 *******************************************************************************/
package com.windowtester.swt.util;

import java.net.MalformedURLException;
import java.net.URL;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;

/**
 * Manages the images and image descriptors implementing an efficient cache.  This
 * implementations caches these objects in a {@link org.eclipse.jface.resource.ImageRegistry}
 * instance.
 * 
 * <p>Before using an instance of this class it is necessary to invoke the 
 * {@link #initialize()} method.
 * 
 * <p>This implementation is based on the 
 * {@link org.eclipse.jdt.internal.ui.JavaPluginImages} class.
 */
abstract public class ImageManager {
    /*
     * Image directory prefixes.
     */
    public static final String T_LCL = "lcl16";
    public static final String T_TOOL = "tool16";
    public static final String T_VIEW = "view16";
    public static final String T_OBJ = "obj16";
    public static final String T_OVR = "ovr16";
    public static final String T_WIZBAN = "wizban";

    /**
     * URL to the plugin's icon base directory. 
     */
    private URL iconBaseURL;

    /**
     * Image registry used to cache the images and image descriptors.
     */
    private ImageRegistry imageRegistry;

    /**
     * Indicates if the images were loaded to this image manager.
     */
    private boolean imagesWereLoaded = false;

    /**
     * Initializes this image manager.  Nothing happens if this method is 
     * invoked after a previous initialization.
     * 
     * <p>This method is not supposed to be invoked more than once.
     * 
     * @param iconBaseURL The url to the plugin's icon base directory.
     * @param imageRegistry The image registry to cache the images and image
     * descriptors.
     */
    public void initialize(URL iconBaseURL, ImageRegistry imageRegistry) {
        this.iconBaseURL = iconBaseURL;
        this.imageRegistry = imageRegistry;
    }

    /**
     * Checks if the images are loaded in the cache.  The variable 
     * <code>imagesWereLoaded</code> is used to ensure that they won't
     * be loaded more then once.
     */
    protected void checkImages() {
        if (imagesWereLoaded)
            return;

        addImages();
        imagesWereLoaded = true;
    }

    /**
     * Subclasses are supposed to add <b>all</b> the images to this manager in this 
     * method implementation.
     * 
     * <p>The images should be added by invoking one the <code>add</code> 
     * methods.
     */
    abstract protected void addImages();

    /**
     * Creates an image descriptor for a given image directory prefix and 
     * image name adding it to the image registry.
     * @param prefix
     * @param name
     * @return ImageDescriptor
     */
    protected ImageDescriptor add(String prefix, String name) {
        ImageDescriptor imageDescriptor = createImageDescriptor(prefix, name);
        if (imageDescriptor != null && imageRegistry != null)
            imageRegistry.put(name, imageDescriptor);
        return imageDescriptor;
    }

    /**
     * Creates an image descriptor for a given image directory prefix, directory
     * type and image name adding it to the image registry.
     * 
     * <p>This method is typically used to register action images.  For example, to 
     * register <i>clcl16/open.gif</i>, <i>dlcl16/open.gif</i> and <i>elcl16/open.gif</i>
     * client should execute <pre>addManaged("c", T_LCL, "open.gif")</pre>, 
     * <pre>add("d", T_LCL, "open.gif")</pre> and 
     * <pre>add("e", T_LCL, "open.gif")</pre>.
     * 
     * @param prefixType
     * @param prefix
     * @param name
     * @return ImageDescriptor
     */
    protected ImageDescriptor add(String prefixType, String prefix, String name) {
        ImageDescriptor imageDescriptor = createImageDescriptor(prefixType + prefix, name);
        if (imageDescriptor != null)
            imageRegistry.put(prefixType + name, imageDescriptor);
        return imageDescriptor;
    }

    /**
     * Adds an image descriptor to this image manager.
     * @param key
     * @param imageDescriptor
     * @return <code>true</code> if the image descriptor was added of <code>false</code> 
     * if <code>key</code> or <code>imageDescriptor</code> is <code>null</code> or if the 
     * default image registry has already the specified <code>key</code>.
     * @throws IllegalArgumentException if the key already exists
     */
    protected boolean add(String key, ImageDescriptor imageDescriptor) throws IllegalArgumentException {
        if ((key == null) || (imageDescriptor == null))
            return false;

        imageRegistry.put(key, imageDescriptor);
        return true;
    }

    /**
     * Creates an image descriptor for a given image directory prefix and 
     * image name.  The image prefix is appended to the 
     * {@link #iconBaseURL base icon url}
     * @param prefix
     * @param name
     * @return ImageDescriptor
     */
    protected ImageDescriptor createImageDescriptor(String prefix, String name) {
        try {
            return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
        } catch (MalformedURLException e) {
            return ImageDescriptor.getMissingImageDescriptor();
        }
    }

    /**
     * Creates a URL for a given image directory prefix and 
     * image name.
     * @param prefix
     * @param name
     * @return URL
     * @throws MalformedURLException
     */
    protected URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
        if (iconBaseURL == null)
            throw new MalformedURLException();

        StringBuffer buffer = new StringBuffer(prefix);
        buffer.append('/');
        buffer.append(name);
        return new URL(iconBaseURL, buffer.toString());
    }

    /**
     * Returns the image descriptor associated to a key.
     * @param key
     * @return ImageDescriptor
     */
    public ImageDescriptor getImageDescriptor(String key) {
        checkImages();
        return imageRegistry.getDescriptor(key);
    }

    /**
     * Returns the image associated to a key. 
     * image registry.
     * @param key
     * @return Image
     */
    public Image getImage(String key) {
        checkImages();
        return imageRegistry == null ? null : imageRegistry.get(key);
    }

    /**
     * Returns the image descriptor associated to a prefix type and key.  The
     * prefix type is the prefix of the directory such as "c", "d" and "e" in
     * "cview16", "dview16" and "eview16".
     * @param prefixType
     * @param key
     * @return ImageDescriptor
     */
    public ImageDescriptor getImageDescriptor(String prefixType, String key) {
        return getImageDescriptor(prefixType + key);
    }

    /**
     * Returns the image associated to a prefix type and key.  The
     * prefix type is the prefix of the directory such as "c", "d" and "e" in
     * "cview16", "dview16" and "eview16".
     * @param prefixType
     * @param key
     * @return ImageDescriptor
     */
    public Image getImage(String prefixType, String key) {
        return getImage(prefixType + key);
    }

    /**
     * Sets all the image descriptors of a given action.  This method assumes
     * the following convention:<OL>
     * <LI>The prefix type "e" is used for the main image</LI>
     * <LI>The prefix type "c" is used for the hover image</LI>
     * <LI>The prefix type "d" is used for the disabled image</LI>
     * </OL>
     * 
     * @param action
     * @param name
     */
    public void setImageDescriptors(IAction action, String name) {
        ImageDescriptor imageDescriptor = getImageDescriptor("d", name);
        if (imageDescriptor != null)
            action.setDisabledImageDescriptor(imageDescriptor);

        imageDescriptor = getImageDescriptor("c", name);
        if (imageDescriptor != null)
            action.setHoverImageDescriptor(imageDescriptor);

        imageDescriptor = getImageDescriptor("e", name);
        if (imageDescriptor != null)
            action.setImageDescriptor(imageDescriptor);
    }
}