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

import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
import org.eclipse.epf.diagram.add.service.DiagramResetService;
import org.eclipse.epf.diagram.core.actions.DiagramActionsService;
import org.eclipse.epf.diagram.model.Diagram;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.util.Suppression;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.uma.Activity;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
import org.eclipse.swt.widgets.Composite;

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

	/**
	 * @param parent
	 * @param wrapper
	 */
	public NewActivityDetailDiagramViewer(Composite parent, Object wrapper) {
		super(parent, wrapper);
		// TODO Auto-generated constructor stub
	}

	/* (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){
			Diagram model =(Diagram)diagram.getElement();
			model.setSuppression(sup);
			DiagramEditDomain domain = new DiagramEditDomain(null);
			((IDiagramGraphicalViewer)graphicalViewer).setEditDomain(domain);
			part = EditPartService.getInstance().createGraphicEditPart(diagram);
			return part;
		}
		if(part == null){
			System.err.println("Editpart for "+ e +" is not created");
		}
		return part;
	}

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

	
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#cleanUpDiagram()
	 */
	protected void cleanUpDiagram() {
		ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
				.getContents();
		dep.getRecentlyAddedParts().addAll(dep.getChildren());

		// clean up the diagram
		DefaultEditDomain editingDomain = new DefaultEditDomain(null);
		ActionRegistry actionRegistry = new ActionRegistry();

		DiagramActionsService actionService = new DiagramActionsService(dmgr.getEditingDomain(),
				getGraphicalViewer(), editingDomain, actionRegistry);
		actionService.registerVerticalAlignFirstSelectedAction();

		DiagramResetService service = new DiagramResetService(dmgr.getEditingDomain(),
				getGraphicalViewer(), editingDomain, actionRegistry);
		service.cleanUpDiagram();
	}
}
