//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.views;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.epf.library.configuration.ConfigurationClosure;
import org.eclipse.epf.library.configuration.ElementDependencyError;
import org.eclipse.epf.library.configuration.ErrorInfo;
import org.eclipse.epf.library.services.ElementReference;
import org.eclipse.epf.library.services.PackageDependency;
import org.eclipse.epf.library.services.PackageReference;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

/**
 * The content provider for a Configuration error or warning message.
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public class MessageContentProvider implements ITreeContentProvider {

	private ConfigurationClosure closure;

	public MessageContentProvider(ConfigurationClosure closure) {
		this.closure = closure;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
	 */
	public Object[] getElements(Object inputElement) {
		if (closure == null) {
			return new Object[0];
		}

		if (inputElement instanceof ConfigurationClosure) {
			return ((ConfigurationClosure) inputElement).getDependencyErrors();
		} else if (inputElement instanceof ElementDependencyError) {
			List errors = ((ElementDependencyError) inputElement).getAll();
			if (errors != null) {
				return errors.toArray();
			}
			return null;
		} else if (inputElement instanceof ErrorInfo) {
			ErrorInfo info = (ErrorInfo) inputElement;
			int relation = info.getRelation();
			MethodElement ownerElement = (MethodElement) info.getOwnerElement();
			MethodElement causeElement = (MethodElement) info.getCauseElement();
			PackageDependency dep;
			PackageReference pkgRef = null;

			if (relation == ErrorInfo.REFERENCE_TO) {
				dep = closure.getConfigurationManager().getDependencyManager()
						.getDependency(ownerElement);
				pkgRef = dep.getReference(causeElement, false);
			} else if (relation == ErrorInfo.REFERENCED_BY) {
				dep = closure.getConfigurationManager().getDependencyManager()
						.getDependency(causeElement);
				pkgRef = dep.getReference(ownerElement, false);
			}

			if (pkgRef != null) {
				List refErrors = new ArrayList();
				for (Iterator it = pkgRef.getReferences().iterator(); it
						.hasNext();) {
					ElementReference ref = (ElementReference) it.next();

					// Don't show the entry if the reference can be ignored.
					if (ref.canIgnore()) {
						continue;
					}
					ErrorInfo elementError;
					if (relation == ErrorInfo.REFERENCE_TO) {
						elementError = new ErrorInfo(
								info.getErrorType(),
								"", ref.getElement(), ref.getRefElement(), relation); //$NON-NLS-1$
					} else {
						elementError = new ErrorInfo(
								info.getErrorType(),
								"", ref.getRefElement(), ref.getElement(), relation); //$NON-NLS-1$
					}

					refErrors.add(elementError);
				}

				return refErrors.toArray();
			}

		}

		return new Object[] {};
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
	 */
	public void dispose() {

	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
	 */
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
	 */
	public Object[] getChildren(Object parentElement) {
		return getElements(parentElement);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
	 */
	public Object getParent(Object element) {
		if (element instanceof ConfigurationClosure) {
			return null;
		} else if (element instanceof ErrorInfo) {
			return this.closure;
		} else {
			return null;
		}
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
	 */
	public boolean hasChildren(Object element) {
		if (element instanceof ConfigurationClosure) {
			return true;
		} else if (element instanceof ElementDependencyError) {
			return ((ElementDependencyError) element).size() > 0;
		} else if (element instanceof ErrorInfo) {
			if (((ErrorInfo) element).getErrorMessage().length() > 0) {
				return true;
			}
		}
		return false;
	}

}
