/*******************************************************************************
 * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
 * 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:
 *     Soyatec - initial API and implementation
 *     Anaik Trihoreau <anaik@anyware-tech.com> - Bug 274057
 *******************************************************************************/
package org.eclipse.xwt.vex.palette.customize;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;

/**
 * 
 * Class allowing to include custom widgets in the XWT palette
 * Contributors:
 *     Anaik Trihoreau <anaik@anyware-tech.com> - inital API and implementation
 */
public class CustomWidgetManager
{
	private static final String CUSTOM_PALETTE_EXTENSION_ID = "org.eclipse.xwt.vex.customPalette";
	private static final String WIDGET_CATEGORY_ELEMENT = "category";
	private static final String WIDGET_CATEGORY_NAME_ATTR = "name";
	private static final String WIDGET_CATEGORY_ICON_ATTR = "icon";
	private static final String WIDGET_ELEMENT = "tool";
	private static final String WIDGET_NAME_ATTR = "name";
	private static final String WIDGET_CLASS_ATTR = "class";
	private static final String WIDGET_SCOPE_ATTR = "scope";
	private static final String WIDGET_ICON_ATTR = "icon";
	private static final String WIDGET_TOOLTIP_ATTR = "tooltip";
	private static final String WIDGET_CONTENT_ATTR = "content";

	private static CustomWidgetManager __instance;

	private Map<Category, List<Tool>> widgetMap = null;
	private Collection<Class<?>> widgetClassList = null;

	/**
	 * Private constructor
	 */
	private CustomWidgetManager()
	{
		initWidgetCategories();
	}

	/**
	 * Returns the singleton
	 * 
	 * @return
	 */
	public static CustomWidgetManager getInstance()
	{
		if (__instance == null)
		{
			__instance = new CustomWidgetManager();
		}
		return __instance;
	}

	/**
	 * Returns the custom widgets which are defined in the extension. The custom widget are grouped
	 * by categories
	 * 
	 * @return the custom widgets grouped by categories
	 */
	public Map<Category, List<Tool>> getWidgetCategories()
	{
		return widgetMap;
	}

	/**
	 * Returns the list of the classes corresponding to the custom widgets which are defined in the
	 * extension.
	 * 
	 * @return the list of the classes
	 */
	public Collection<Class<?>> getWidgetClassList()
	{
		return widgetClassList;
	}

	/**
	 * Initialize the custom widgets which are defined in the extension
	 */
	private void initWidgetCategories()
	{
		// Init
		widgetMap = new HashMap<Category, List<Tool>>();
		widgetClassList = new ArrayList<Class<?>>();

		List<Tool> widgetList = null;

		List<IConfigurationElement> confEltList = getExtensions(CUSTOM_PALETTE_EXTENSION_ID);
		if (confEltList != null && !confEltList.isEmpty())
		{
			for (Iterator<IConfigurationElement> it = confEltList.iterator(); it.hasNext();)
			{
				IConfigurationElement cfgElt = it.next();
				String eltName = cfgElt.getName();

				if (WIDGET_CATEGORY_ELEMENT.equals(eltName))
				{
					// Name of the category
					String nameCat = cfgElt.getAttribute(WIDGET_CATEGORY_NAME_ATTR);
					if (nameCat == null || nameCat.length() == 0)
					{
						continue;
					}

					// Gets the extension bundle
					String extPlugInID = cfgElt.getContributor().getName();

					// Gets the icon of the category
					WidgetIcon iconCat = new WidgetIcon(extPlugInID,
						cfgElt.getAttribute(WIDGET_CATEGORY_ICON_ATTR));

					// Adds the new category
					Category widgetCat = new Category(nameCat, iconCat);
					widgetList = widgetMap.get(widgetCat);
					if (widgetList == null)
					{
						widgetList = new ArrayList<Tool>();
						widgetMap.put(widgetCat, widgetList);
					}
					// Gets the Widget elements
					IConfigurationElement[] widgetElts = cfgElt.getChildren(WIDGET_ELEMENT);
					if (widgetElts != null && widgetElts.length > 0)
					{
						for (IConfigurationElement widgetElt: widgetElts)
						{
							try
							{
								String bundleName = widgetElt.getContributor().getName();
								// Load the class of the widget
								Bundle bundle = Platform.getBundle(bundleName);
								String className = widgetElt.getAttribute(WIDGET_CLASS_ATTR);
								if (className != null) {
									Class<?> theClass = bundle.loadClass(widgetElt.getAttribute(WIDGET_CLASS_ATTR));
									widgetClassList.add(theClass);
								}

								// Get the icons
								WidgetIcon icon = new WidgetIcon(extPlugInID,
									widgetElt.getAttribute(WIDGET_ICON_ATTR));

								// Creates the entry corresponding to the widget
								String name = widgetElt.getAttribute(WIDGET_NAME_ATTR);
								String scope = widgetElt.getAttribute(WIDGET_SCOPE_ATTR);
								String tooltip = widgetElt.getAttribute(WIDGET_TOOLTIP_ATTR);
								String content = widgetElt.getAttribute(WIDGET_CONTENT_ATTR);

								widgetList.add(new Tool(name, scope, tooltip, content, icon));
							}
							catch (Exception e)
							{
								// Nothing to do
							}
						}
					}
				}
			}
		}
	}

	/**
	 * Returns the <code>IConfigurationElement</code> list corresponding to the extension defined by
	 * <code>extensionId</code>
	 * 
	 * @param extensionId
	 *        the extension identifier
	 * @return the <code>IConfigurationElement</code> list
	 */
	private List<IConfigurationElement> getExtensions(String extensionId)
	{

		IExtensionRegistry registry = Platform.getExtensionRegistry();
		IExtensionPoint extensionPoint = registry.getExtensionPoint(extensionId);
		IExtension[] extensions = extensionPoint.getExtensions();

		List<IConfigurationElement> resList = new ArrayList<IConfigurationElement>();
		for (int i = 0; i < extensions.length; i++)
		{
			IConfigurationElement[] elements = extensions[i].getConfigurationElements();
			for (int j = 0; j < elements.length; j++)
			{
				resList.add(elements[j]);
			}
		}
		return resList;
	}

	/**
	 * Class which defines a widget category
	 */
	public class Category
	{
		private String name = null;
		private WidgetIcon icon = null;

		public Category(String name, WidgetIcon icon)
		{
			this.name = name;
			this.icon = icon;
		}

		public String getName()
		{
			return name;
		}

		public WidgetIcon getIcon()
		{
			return icon;
		}

		@Override
		public boolean equals(Object obj)
		{

			boolean equals = super.equals(obj);
			if (!equals && obj instanceof Category)
			{
				Category widgetCat = (Category) obj;
				equals = (name == null && widgetCat.name == null)
					|| (name != null && name.equals(widgetCat.name));
			}
			return equals;
		}

		@Override
		public int hashCode()
		{
			if (name != null)
			{
				return name.hashCode();
			}
			return super.hashCode();
		}
	}

	/**
	 * Class which defines a widget
	 */
	public class Tool
	{
		private String name = null;
		private String scope = null;
		private String tooltip = null;
		private String content = null;
		private WidgetIcon icon = null;

		public Tool(String name, String scope, String tooltip, String content, WidgetIcon icon)
		{
			this.name = name;
			this.scope = scope;
			this.tooltip = tooltip;
			this.content = content;
			this.icon = icon;
		}

		public String getName()
		{
			return name;
		}

		public String getScope()
		{
			return scope;
		}

		public String getToolTip()
		{
			return tooltip;
		}

		public String getContent()
		{
			return content;
		}

		public WidgetIcon getIcon()
		{
			return icon;
		}
	}

	/**
	 * Class which defines a widget icon
	 */
	public class WidgetIcon
	{
		private String bundleID = null;
		private String path = null;

		public WidgetIcon(String bundleID, String path)
		{
			this.bundleID = bundleID;
			this.path = path;
		}

		public String getBundleID()
		{
			return bundleID;
		}

		public String getPath()
		{
			return path;
		}
	}
}
