/*******************************************************************************
* Copyright (c) 2013 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.foundation.ui.plugin;
import java.util.Hashtable;
import java.util.Iterator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.osgi.framework.Bundle;
/**
* A helper class for managing shared images
* Clients are expected to subclass this method.
* In their constructor, they should perform something like:
*
* super(bundle);
* addImage(ERROR_IMG, "images/error.gif");
* addImage(ERROR_HOVER_IMG, "images/errorHover.gif");
* @Since 1.1
*/
public class BaseUISharedImages {
private Hashtable<String, Image> images;
private Hashtable<String, ImageDescriptor> descriptors;
private Bundle pluginBundle;
/**
* Instantiate your shared images with your bundle
* @param pluginBundle
*/
public BaseUISharedImages(Bundle pluginBundle) {
this.pluginBundle = pluginBundle;
this.images = new Hashtable<String, Image>();
this.descriptors = new Hashtable<String, ImageDescriptor>();
}
/**
* Allow subclasses to add a key / path combination to the shared images
* @param key
* @param path
*/
protected void addImage(String key, String path) {
ImageDescriptor id = createImageDescriptor(path);
if( id != null ) {
addDescriptor(descriptors, key, id);
}
}
protected ImageDescriptor createImageDescriptor(String path) {
return createImageDescriptor(pluginBundle, path);
}
protected void addDescriptor(Hashtable<String, ImageDescriptor> map, String key, ImageDescriptor val) {
map.put(key, val);
}
/* Internal method to create an Image descriptor */
private ImageDescriptor createImageDescriptor (Bundle pluginBundle, String relativePath) {
return ImageDescriptor.createFromURL(pluginBundle.getEntry(relativePath));
}
/**
* Fetch an image if one is available
* Otherwise, if the image is either not yet created, or is disposed,
* create the image.
*
* @param key
* @return
*/
public Image image(String key) {
Image image = images.get(key);
if( image == null || image.isDisposed()) {
ImageDescriptor desc = descriptors.get(key);
if( desc == null )
return null;
images.put(key, desc.createImage());
}
return images.get(key);
}
/**
* Get an image descriptor for the given key
* @param key
* @return
*/
public ImageDescriptor descriptor(String key) {
return (ImageDescriptor) descriptors.get(key);
}
/**
* Dispose of all items
*/
public void dispose() {
Iterator<String> iter = images.keySet().iterator();
while (iter.hasNext()) {
Image image = (Image) images.get(iter.next());
image.dispose();
}
images.clear();
descriptors.clear();
images = null;
descriptors = null;
}
/**
* Make sure we dispose all of our images
*/
protected void finalize() throws Throwable {
try {
dispose();
} finally {
super.finalize();
}
}
}