package org.eclipse.epf.authoring.ui.providers;

import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
import org.eclipse.epf.library.configuration.closure.ElementDependencyError;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

public class ConfigPackageLabelProvider extends LabelProvider {

	private ConfigurationClosure closure = null;
	private ConfigPackageContentProvider contentProvider;
	private AdapterFactoryLabelProvider afProvider;

	/**
	 * Creates an instance
	 * @param contentProvider
	 */
	public ConfigPackageLabelProvider(
			ConfigPackageContentProvider contentProvider) {
		this.contentProvider = contentProvider;
		afProvider = new AdapterFactoryLabelProvider(contentProvider
				.getAdapterFactory());
	}

	private ElementDependencyError getFirstChildError(Object e) {
		ElementDependencyError error = null;
		Object[] children = contentProvider.getChildren(e);
		if (children == null || children.length == 0) {
			return null;
		}

		for (int i = 0; i < children.length; i++) {
			Object object = children[i];
			if (object instanceof ItemProviderAdapter) {
				return getFirstChildError(object);
			} else {
				error = closure.getError(object);
				if (error != null) {
					return error;
				}
			}
		}

		return error;
	}

	/**
	 * This implements {@link ILabelProvider}.getImage by forwarding it to
	 * an object that implements
	 * {@link IItemLabelProvider#getImage IItemLabelProvider.getImage}
	 */
	public Image getImage(Object object) {
		if (closure != null) {

			ElementDependencyError error = null;
			if (object instanceof ItemProviderAdapter) {
				error = getFirstChildError(object);
			} else {
				error = closure.getError(object);
			}

			if (error != null) {
				if (error.isError() || error.isChildError()) {
					return PlatformUI.getWorkbench().getSharedImages()
							.getImage(ISharedImages.IMG_OBJS_ERROR_TSK); 
				} else if (error.isWarning() || error.isChildWarning()) {
					return PlatformUI.getWorkbench().getSharedImages()
							.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
				}
			}
		}

		return afProvider.getImage(object);
	}

	protected Image getImageFromObject(Object object) {
		return ExtendedImageRegistry.getInstance().getImage(object);
	}

	/**
	 * This implements {@link ILabelProvider}.getText by forwarding it to
	 * an object that implements
	 * {@link IItemLabelProvider#getText IItemLabelProvider.getText}
	 */
	public String getText(Object object) {
		if (object instanceof ProcessComponent) {
			Process proc = (Process) ((ProcessComponent) object)
					.getProcess();
			if (proc != null)
				return proc.getPresentationName();
			else
				// if process is null, return processcomponent name
				return ((ProcessComponent) object).getName();
		} else
			return afProvider.getText(object);
	}

	/**
	 * @see org.eclipse.jface.viewers.LabelProvider#dispose()
	 */
	public void dispose() {
		super.dispose();

		contentProvider = null;
		afProvider = null;
	}

	public void setClosure(ConfigurationClosure closure) {
		this.closure = closure;
	}

}
