//------------------------------------------------------------------------------
// 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.gef.viewer;

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

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.SWTGraphics;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.epf.authoring.gef.edit.DiagramEditPart;
import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart;
import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.model.Diagram;
import org.eclipse.epf.diagram.model.LinkedObject;
import org.eclipse.epf.diagram.model.NamedNode;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.util.Suppression;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.layout.diagram.DiagramInfo;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.DiagramElement;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartFactory;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.LayerManager;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;


/**
 * The abstract base class for a graphical viewer of the element diagram.
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public abstract class AbstractDiagramGraphicalViewer {

	protected Composite parent;

	protected GraphicalViewer graphicalViewer;

	protected Object wrapper;

	public AbstractDiagramGraphicalViewer(Composite parent) {
		this.parent = parent;
		createGraphicalViewer();
	}

	public AbstractDiagramGraphicalViewer(Composite parent, Object wrapper) {
		this.parent = parent;
		this.wrapper = wrapper;
		createGraphicalViewer();
	}
	/**
	 * Creates the GraphicalViewer on the specified <code>Composite</code>
	 * 
	 */
	protected void createGraphicalViewer() {
		this.graphicalViewer = new ScrollingGraphicalViewer();
		this.graphicalViewer.createControl(parent);
		configureGraphicalViewer();
	}

	/**
	 * Returns the graphical viewer.
	 * 
	 * @return the graphical viewer
	 */
	protected GraphicalViewer getGraphicalViewer() {
		return graphicalViewer;
	}

	protected void configureGraphicalViewer() {
		getGraphicalViewer().getControl().setBackground(
				ColorConstants.listBackground);
		ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();

		ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();
		viewer.setRootEditPart(root);
		viewer.setEditPartFactory(createEditPartFactory());
	}

	protected IFigure getFigure() {
		GraphicalViewer viewer = getGraphicalViewer();

		// find the figure to be saved
		LayerManager lm = (LayerManager) viewer.getEditPartRegistry().get(
				LayerManager.ID);
		IFigure figure = lm.getLayer(LayerConstants.PRINTABLE_LAYERS);
		return figure;
	}

	protected void setSuppressionToDiagram(Diagram diagram) {
		Object e = diagram.getObject();
		if (e instanceof BreakdownElement) {
			Process proc = TngUtil.getOwningProcess((BreakdownElement) e);
			if (proc != null) {
				diagram.setSuppression(Suppression.getSuppression(proc));
			}
		}
	}

	/**
	 * Creates diagram for given object (only for {@link Activity} and packs the bounds.
	 * 
	 * @param wrapper 	{@link Object} 	
	 * @param needReset boolean
	 * @param filter 	{@link IFilter}
	 * @param sup		{@link Suppression}
	 */
	public EditPart loadDiagram(Object wrapper, boolean needReset,
			IFilter filter, Suppression sup) {
		// initialize the viewer with the edit part
		EditPart editPart = createEditPart(wrapper, filter, sup);
		this.graphicalViewer.setContents(editPart);

		// ask for immediate update of the control so that the diagram figure
		// will be computed
		parent.pack(true);

		// This check is needed for browsing, in order to render activity contributing's
		// children.  In processAuthoring we don't do realization, in order to displayed 
		// realized elements, we have to cleanup ADD diagram and recreate. needtoReset or cleanupdiagram.
		// Only for activity detail diagram.
		Object o = TngUtil.unwrap(wrapper);
		if(o instanceof VariabilityElement && getDiagramType() != null && 
				getDiagramType().equalsIgnoreCase(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL)){
			if(TngUtil.hasContributor((VariabilityElement)o)){
				needReset = true;
			}
		}
		
		if (needReset) {
			cleanUpDiagram();
		}

		IFigure figure = getFigure();
		if (figure != null) {
			Rectangle bounds = figure.getBounds();

			//System.out.println("Before update: Diagram Bounds = " + bounds); //$NON-NLS-1$
			if (bounds.x < 0 || bounds.y < 0) {
				((DiagramEditPart) editPart).moveFigure(-bounds.x, -bounds.y);

				parent.pack(true);

				bounds = figure.getBounds();
				//System.out.println("After update: Diagram Bounds = " + bounds); //$NON-NLS-1$
			}
		}
		return editPart;
	}

	protected void loadDiagramInfo(GraphicalEditPart part, DiagramInfo diagramInfo) {
		List children = part.getChildren();
		for (Iterator it = children.iterator(); it.hasNext();) {
			Object o = it.next();
			if (o instanceof NodeContainerEditPart) {
				loadDiagramInfo((GraphicalEditPart) o, diagramInfo);
			} else if (o instanceof GraphicalEditPart) {
				part = (GraphicalEditPart) o;
				Object model = part.getModel();
				Object e = model;
				if (e instanceof LinkedObject) {
					e = ((LinkedObject) e).getObject();
				}

				if (e instanceof DiagramElement) {
					continue;
				}

				if (e instanceof MethodElement) {
					boolean suppressed;
					if (model instanceof NamedNode) {
						suppressed = ((NamedNode) model).isSuppressed();
					} else {
						suppressed = ((MethodElement) e).getSuppressed()
								.booleanValue();
					}

						IFigure f = part.getFigure();
						Rectangle bounds = f.getBounds();

						String altTag = null;
						if (f instanceof SelectableLabel) {
							altTag = ((SelectableLabel) f).getText();
						}
						diagramInfo.addArea((MethodElement) e, bounds.x,
							bounds.y, bounds.width, bounds.height, altTag, suppressed);

				}
			} else {
				// System.out.println("EditPart not handled: " + o);
				// //$NON-NLS-1$
			}
		}
	}

	/**
	 * returns {@link DiagramInfo}
	 * 
	 */
	public DiagramInfo getDiagramInfo() {
		DiagramInfo diagramInfo = null;

		GraphicalEditPart part = (GraphicalEditPart) this.graphicalViewer
				.getContents();
		Object element = part.getModel();
		if (element instanceof LinkedObject) {
			element = ((LinkedObject) element).getObject();
		}
		if (element instanceof MethodElement) {
			diagramInfo = new DiagramInfo(getDiagramType(),
					(MethodElement) element);
			loadDiagramInfo(part, diagramInfo);
		}

		return diagramInfo;
	}

	/**
	 * Creates diagram image from figure created in loadDiagram method.
	 * 
	 */
	public Image createDiagramImage() {
		IFigure figure = getFigure();

		SWTGraphics graphics = null;
		GC gc = null;
		Image image = null;

		try {
			Rectangle bounds = figure.getBounds();
			int height = bounds.height;
			int width = bounds.width;

			// create a new image and repaint the graph
			final Display display = Display.getDefault();
			image = new Image(display, width, height);
			gc = new GC(image);
			graphics = new SWTGraphics(gc);
			figure.paint(graphics);

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			// release resources
			if (graphics != null)
				graphics.dispose();
			if (gc != null)
				gc.dispose();
		}

		return image;
	}

	public void dispose() {
		try {
			if (graphicalViewer != null) {
				Control ctrl = graphicalViewer.getControl();
				if (ctrl != null) {
					ctrl.dispose();
				}

				graphicalViewer = null;
			}
		} catch (RuntimeException e) {
			e.printStackTrace();
		}

	}

	protected abstract EditPartFactory createEditPartFactory();

	protected abstract EditPart createEditPart(Object e, IFilter filter,
			Suppression sup);

	protected abstract String getDiagramType();

	protected void cleanUpDiagram() {
		// default implementation does nothing
	}

}
