/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 * 
 * Copyright 2003, 2009 Fraunhofer Gesellschaft, Munich, Germany,
 * for its Fraunhofer Institute for Computer Architecture and Software
 * Technology (FIRST), Berlin, Germany and Technical University Berlin,
 * Germany.
 * 
 * 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
 * $Id: ImageManager.java 23434 2010-02-03 23:52:31Z stephan $
 * 
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 * 
 * Contributors:
 * Fraunhofer FIRST - Initial API and implementation
 * Technical University Berlin - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.ui;

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;
import org.eclipse.ui.plugin.AbstractUIPlugin;


/**
 * Tool class to access plugin images
 * 
 * @author kaiser
 * @version $Id: ImageManager.java 23434 2010-02-03 23:52:31Z stephan $
 */
public class ImageManager implements ImageConstants
{
    private static final String[] _pluginIcons =
		{
			CALLOUTBINDING_IMG, 
			CALLINBINDING_REPLACE_IMG, 
			CALLINBINDING_BEFORE_IMG,
			CALLINBINDING_AFTER_IMG, 
			CALLINMETHOD_IMG,
			BOUNDROLE_IMG,
			GUARD_IMG,
			BASEGUARD_IMG,
			ROLECLASS_IMG, 
			ROLECLASS_PROTECTED_IMG, 
			TEAM_IMG,
			TEAM_ROLE_IMG,
			TEAM_ROLE_PROTECTED_IMG,
			ROLE_OVR,
			TEAM_OVR,
			TEAM_ROLE_OVR,
			HIDE_TEAMPACKAGE,
			NEW_OT_PROJECT,
			NEW_TEAM,
			NEW_ROLE
		};

	private static ImageManager _singleton;

	/**
	 * Avoid multiple instances
	 */
	protected ImageManager()
	{
	}

	/**
	 * The only way to access plugin images
	 * @return PluginImages instance
	 */
	public static ImageManager getSharedInstance()
	{
		if (_singleton == null)
		{
			_singleton = new ImageManager();
		} 
		
		return _singleton;
	}

	/**
	 * Add all plugin specific images to given ImageRegistry
	 * @param reg - ImageRegistry to use 
	 */
	public void registerPluginImages(ImageRegistry reg)
	{
		ImageDescriptor descr;
		
		try
		{
			String[] pluginIcons = pluginIcons();
			URL baseURL = new URL(getInstallLocation(), IMG_PATH);
			for (int idx = 0; idx < pluginIcons.length; idx++)
			{
				descr = ImageDescriptor.createFromURL(
						new URL(baseURL, pluginIcons[idx]));
				reg.put(pluginIcons[idx], descr);
			}
		}
		catch (MalformedURLException ex)
		{
			OTDTUIPlugin.getExceptionHandler().logException(ex);
		}
	}

	private URL getInstallLocation() {
		return getPlugin().getBundle().getEntry("/"); //$NON-NLS-1$
	}

	/** Override to specify which plugin we are serving. */
	protected AbstractUIPlugin getPlugin() {
		return OTDTUIPlugin.getDefault();
	}
	
	/** Override to specify which icons should be registered. */
	protected String[] pluginIcons() {
		return _pluginIcons;
	}

	/**
	 * Setup images for different action states
	 * @param action - action to initialise
	 * @param imgKey - image name to use 
	 */	
	public void setActionImageDescriptors(IAction action, String imgName)
	{
		try
		{
			ImageDescriptor descr;
			URL             baseURL = new URL(getInstallLocation(), IMG_PATH); 

			// set different types image descriptors according to action state
			descr   = ImageDescriptor.createFromURL(new URL(baseURL, DEFAULT_PATH+imgName));
			action.setImageDescriptor( descr );

			descr   = ImageDescriptor.createFromURL(new URL(baseURL, HOVER_PATH+imgName));
			action.setHoverImageDescriptor(descr);

			descr   = ImageDescriptor.createFromURL(new URL(baseURL, DISABLED_PATH+imgName));
			action.setDisabledImageDescriptor(descr);
		}
		catch (MalformedURLException ex)
		{
			OTDTUIPlugin.getExceptionHandler().logException(ex);
		}
	}
	
	/**
	 * Get image from this Plugin's ImageRegistry
	 * @param imageKey - image key from the set returned by pluginIcons().
	 * @return image object
	 */
	public Image get(String imageKey)
	{
		// redirect to image registry
		return getPlugin().getImageRegistry().get(imageKey);		
	}

	
	public ImageDescriptor getDescriptor(String imageKey)
	{
		return getPlugin().getImageRegistry().getDescriptor(imageKey);
	}

}
