//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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
//------------------------------------------------------------------------------
/*
 * Copyright (c) 2005, 2007 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.diagram.core.part;

import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
import org.eclipse.epf.library.edit.util.IDiagramManager;
import org.eclipse.epf.library.edit.util.Suppression;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;

/**
 * DiagramEditor Input for {@link BreakdownElement} 
 * @author Shashidhar Kannoori
 * @author Phong Nguyen Le
 */
public class DiagramEditorInput implements IEditorInput {

	private MethodElement methodElement;

	private ImageDescriptor imageDescriptor = null;
	
	private Suppression suppression;

	private BreakdownElementWrapperItemProvider wrapper;

	private int diagramType;

	/**
	 * Creates an instance of DiagramEditorInput for activity diagram
	 * @param object
	 * @deprecated use {@link #DiagramEditorInput(Object, Suppression, int)}
	 */
	public DiagramEditorInput(Object object, Suppression suppression) {
		this(object, suppression, IDiagramManager.ACTIVITY_DIAGRAM);
	}
	
	/**
	 * 
	 * @param object
	 * @param suppression
	 * @param diagramType
	 *            can be one of the constants:
	 *            {@link IDiagramManager#ACTIVITY_DIAGRAM},
	 *            {@link IDiagramManager#ACTIVITY_DETAIL_DIAGRAM},
	 *            {@link IDiagramManager#WORK_PRODUCT_DEPENDENCY_DIAGRAM}
	 */
	public DiagramEditorInput(Object object, Suppression suppression, int diagramType) {
		methodElement = (MethodElement) TngUtil.unwrap(object);
		if (object instanceof BreakdownElementWrapperItemProvider) {
			wrapper = (BreakdownElementWrapperItemProvider) object;
		}
		this.suppression = suppression;
		this.diagramType = diagramType;
	}
	
	public int getDiagramType() {
		return diagramType;
	}

	/**
	 * @return Returns the suppression.
	 */
	public Suppression getSuppression() {
		return suppression;
	}

	/**
	 * @return Returns the wrapper.
	 */
	public BreakdownElementWrapperItemProvider getWrapper() {
		return wrapper;
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput#equals(java.lang.Object)
	 */
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (getClass().isInstance(obj)) {
			DiagramEditorInput other = (DiagramEditorInput) obj;
			return getMethodElement() == other.getMethodElement()
					&& ((suppression == null && other.getSuppression() == null) || 
							(suppression.getProcess() == other.getSuppression().getProcess()))
					&& getDiagramType() == other.getDiagramType();
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		int result = getMethodElement().hashCode();
		result ^= suppression.getProcess().hashCode();
		result ^= getDiagramType();
		return result;
	}
	
	public DiagramEditorInput(MethodElement e) {
		methodElement = e;
	}

	public MethodElement getMethodElement() {
		return methodElement;
	}
	

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IEditorInput#exists()
	 */
	public boolean exists() {
		// TODO Auto-generated method stub
		return false;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
	 */
	public ImageDescriptor getImageDescriptor() {
		return imageDescriptor;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IEditorInput#getName()
	 */
	public String getName() {
		return methodElement.getName();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IEditorInput#getPersistable()
	 */
	public IPersistableElement getPersistable() {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
	 */
	public String getToolTipText() {
		return ""; //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	public Object getAdapter(Class adapter) {
		// TODO Auto-generated method stub
		return null;
	}
	
}
