/**
 * 
 */
package org.eclipse.epf.authoring.gef.viewer;

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

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.DelegatingLayout;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LayeredPane;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.epf.diagram.ad.edit.parts.UMLEditPartFactory;
import org.eclipse.epf.diagram.core.bridge.ActivityDiagramAdapter;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.util.Suppression;
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.MethodElement;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.swt.widgets.Composite;

/**
 * @author Shashidhar Kannoori
 *
 */
public class NewActivityDiagramViewer extends NewAbstractDiagramGraphicalViewer {



	/**
	 * @param parent
	 */
	public NewActivityDiagramViewer(Composite parent, Object act) {
		super(parent,act);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#createEditPart(java.lang.Object, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
	 */
	@Override
	protected EditPart createEditPart(Object e, IFilter filter, Suppression sup) {
		if(e instanceof Activity){
			try{
			Activity act = (Activity)e;
			ActivityDiagramAdapter adapter = new ActivityDiagramAdapter(act);
			adapter.setView(diagram);
			adapter.setSuppression(sup);
			adapter.setFilter(filter);
			adapter.setTarget(diagram.getElement());
			adapter.setEditingDomain((InternalTransactionalEditingDomain)TransactionUtil.getEditingDomain(diagram.getElement()));
			adapter.populateDiagram();
			DiagramEditDomain domain = new DiagramEditDomain(null);
			((IDiagramGraphicalViewer)graphicalViewer).setEditDomain(domain);
			part = EditPartService.getInstance().createGraphicEditPart(diagram);
			diagram.getElement().eAdapters().add(adapter);
			return part;
			
			}catch(Exception ex){
				ex.printStackTrace();
			}
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#getDiagramType()
	 */
	@Override
	protected String getDiagramType() {
		return ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
	}

	/**
	 * 
	 */
	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 GraphicalEditPart) {
				part = (GraphicalEditPart) o;
				Object model = part.getModel();
				Object e = model;
				
				if(e instanceof View){
					EModelElement ex = (EModelElement)((View)e).getElement();
					if(ex != null){
						e = BridgeHelper.getMethodElement(ex);
					}
				}
				
				if (e instanceof MethodElement) {
					boolean suppressed;
					if (model instanceof Node) {
						suppressed = ((MethodElement)BridgeHelper.getMethodElement((EModelElement)((Node)model).getElement())).getSuppressed().booleanValue();
					} else {
						suppressed = ((MethodElement) e).getSuppressed()
								.booleanValue();
					}

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

						String altTag = null;
						if (f instanceof WrapLabel) {
							altTag = ((WrapLabel) 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$
			}
		}
	}
	
	@Override
	protected void createGraphicalViewer() {
		this.graphicalViewer = new DiagramGraphicalViewer();
		this.graphicalViewer.createControl(parent);
		configureGraphicalViewer();
	}
	
	/**
	 * 
	 */
	protected void configureGraphicalViewer() {
		getGraphicalViewer().getControl().setBackground(
				ColorConstants.listBackground);
		DiagramGraphicalViewer viewer = (DiagramGraphicalViewer) getGraphicalViewer();

		DiagramRootEditPart root = (DiagramRootEditPart) EditPartService
				.getInstance().createRootEditPart(getDiagram());
		LayeredPane printableLayers = (LayeredPane) root
				.getLayer(LayerConstants.PRINTABLE_LAYERS);
		FreeformLayer extLabelsLayer = new FreeformLayer();
		extLabelsLayer.setLayoutManager(new DelegatingLayout());
		printableLayers.addLayerAfter(extLabelsLayer,
				UMLEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
				LayerConstants.PRIMARY_LAYER);
		LayeredPane scalableLayers = (LayeredPane) root
				.getLayer(LayerConstants.SCALABLE_LAYERS);
		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
		scaledFeedbackLayer.setEnabled(false);
		scalableLayers.addLayerAfter(scaledFeedbackLayer,
				LayerConstants.SCALED_FEEDBACK_LAYER,
				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
		viewer.setRootEditPart(root);
		viewer.setEditPartFactory(createEditPartFactory());
	}

}
