/*******************************************************************************
* Copyright (c) 2006, 2007 g-Eclipse Consortium
* 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
*
* Initial development of the original code was made for the g-Eclipse project
* funded by European Union project number: FP6-IST-034327
* http://www.geclipse.eu/
*
* Contributors:
* RUR (http://acet.rdg.ac.uk/)
* - Ashish Thandavan - initial API and implementation
******************************************************************************/
package eu.geclipse.workflow.ui.edit.policies;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import eu.geclipse.workflow.model.IWorkflowPackage;
import eu.geclipse.workflow.ui.edit.parts.InputPortEditPart;
import eu.geclipse.workflow.ui.edit.parts.LinkEditPart;
import eu.geclipse.workflow.ui.edit.parts.OutputPortEditPart;
import eu.geclipse.workflow.ui.edit.parts.WorkflowEditPart;
import eu.geclipse.workflow.ui.edit.parts.WorkflowJobEditPart;
import eu.geclipse.workflow.ui.part.WorkflowDiagramUpdater;
import eu.geclipse.workflow.ui.part.WorkflowLinkDescriptor;
import eu.geclipse.workflow.ui.part.WorkflowNodeDescriptor;
import eu.geclipse.workflow.ui.part.WorkflowVisualIDRegistry;
/**
* @generated
*/
public class WorkflowCanonicalEditPolicy extends CanonicalConnectionEditPolicy {
/**
* @generated
*/
Set myFeaturesToSynchronize;
/**
* @generated
*/
@Override
protected List getSemanticChildrenList() {
View viewObject = ( View )getHost().getModel();
List result = new LinkedList();
for( Iterator it = WorkflowDiagramUpdater.getIWorkflow_79SemanticChildren( viewObject )
.iterator(); it.hasNext(); )
{
result.add( ( ( WorkflowNodeDescriptor )it.next() ).getModelElement() );
}
return result;
}
/**
* @generated
*/
@Override
protected boolean shouldDeleteView( View view ) {
return true;
}
/**
* @generated
*/
@Override
protected boolean isOrphaned( Collection semanticChildren, final View view ) {
int visualID = WorkflowVisualIDRegistry.getVisualID( view );
switch( visualID ) {
case WorkflowJobEditPart.VISUAL_ID:
return !semanticChildren.contains( view.getElement() )
|| visualID != WorkflowVisualIDRegistry.getNodeVisualID( ( View )getHost().getModel(),
view.getElement() );
}
return false;
}
/**
* @generated
*/
@Override
protected String getDefaultFactoryHint() {
return null;
}
/**
* @generated
*/
@Override
protected Set getFeaturesToSynchronize() {
if( myFeaturesToSynchronize == null ) {
myFeaturesToSynchronize = new HashSet();
myFeaturesToSynchronize.add( IWorkflowPackage.eINSTANCE.getIWorkflow_Nodes() );
}
return myFeaturesToSynchronize;
}
/**
* @generated
*/
@Override
protected List getSemanticConnectionsList() {
return Collections.EMPTY_LIST;
}
/**
* @generated
*/
@Override
protected EObject getSourceElement( EObject relationship ) {
return null;
}
/**
* @generated
*/
@Override
protected EObject getTargetElement( EObject relationship ) {
return null;
}
/**
* @generated
*/
@Override
protected boolean shouldIncludeConnection( Edge connector, Collection children )
{
return false;
}
/**
* @generated
*/
@Override
protected void refreshSemantic() {
List createdViews = new LinkedList();
createdViews.addAll( refreshSemanticChildren() );
List createdConnectionViews = new LinkedList();
createdConnectionViews.addAll( refreshSemanticConnections() );
createdConnectionViews.addAll( refreshConnections() );
if( createdViews.size() > 1 ) {
// perform a layout of the container
DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand( host().getEditingDomain(),
createdViews,
host() );
executeCommand( new ICommandProxy( layoutCmd ) );
}
createdViews.addAll( createdConnectionViews );
makeViewsImmutable( createdViews );
}
/**
* @generated
*/
private Diagram getDiagram() {
return ( ( View )getHost().getModel() ).getDiagram();
}
/**
* @generated
*/
private Collection refreshConnections() {
Map domain2NotationMap = new HashMap();
Collection linkDescriptors = collectAllLinks( getDiagram(),
domain2NotationMap );
Collection existingLinks = new LinkedList( getDiagram().getEdges() );
for( Iterator linksIterator = existingLinks.iterator(); linksIterator.hasNext(); )
{
Edge nextDiagramLink = ( Edge )linksIterator.next();
EObject diagramLinkObject = nextDiagramLink.getElement();
EObject diagramLinkSrc = nextDiagramLink.getSource().getElement();
EObject diagramLinkDst = nextDiagramLink.getTarget().getElement();
int diagramLinkVisualID = WorkflowVisualIDRegistry.getVisualID( nextDiagramLink );
for( Iterator LinkDescriptorsIterator = linkDescriptors.iterator(); LinkDescriptorsIterator.hasNext(); )
{
WorkflowLinkDescriptor nextLinkDescriptor = ( WorkflowLinkDescriptor )LinkDescriptorsIterator.next();
if( diagramLinkObject == nextLinkDescriptor.getModelElement()
&& diagramLinkSrc == nextLinkDescriptor.getSource()
&& diagramLinkDst == nextLinkDescriptor.getDestination()
&& diagramLinkVisualID == nextLinkDescriptor.getVisualID() )
{
linksIterator.remove();
LinkDescriptorsIterator.remove();
}
}
}
deleteViews( existingLinks.iterator() );
return createConnections( linkDescriptors, domain2NotationMap );
}
/**
* @generated
*/
private Collection collectAllLinks( View view, Map domain2NotationMap ) {
Collection result = new LinkedList();
switch( WorkflowVisualIDRegistry.getVisualID( view ) ) {
case WorkflowEditPart.VISUAL_ID: {
domain2NotationMap.put( view.getElement(), view );
result.addAll( WorkflowDiagramUpdater.getIWorkflow_79ContainedLinks( view ) );
break;
}
case WorkflowJobEditPart.VISUAL_ID: {
domain2NotationMap.put( view.getElement(), view );
result.addAll( WorkflowDiagramUpdater.getIWorkflowJob_1001ContainedLinks( view ) );
break;
}
case OutputPortEditPart.VISUAL_ID: {
domain2NotationMap.put( view.getElement(), view );
result.addAll( WorkflowDiagramUpdater.getIOutputPort_2001ContainedLinks( view ) );
break;
}
case InputPortEditPart.VISUAL_ID: {
domain2NotationMap.put( view.getElement(), view );
result.addAll( WorkflowDiagramUpdater.getIInputPort_2002ContainedLinks( view ) );
break;
}
case LinkEditPart.VISUAL_ID: {
domain2NotationMap.put( view.getElement(), view );
result.addAll( WorkflowDiagramUpdater.getILink_3001ContainedLinks( view ) );
break;
}
}
for( Iterator children = view.getChildren().iterator(); children.hasNext(); )
{
result.addAll( collectAllLinks( ( View )children.next(),
domain2NotationMap ) );
}
for( Iterator edges = view.getSourceEdges().iterator(); edges.hasNext(); ) {
result.addAll( collectAllLinks( ( View )edges.next(), domain2NotationMap ) );
}
return result;
}
/**
* @generated
*/
private Collection createConnections( Collection linkDescriptors,
Map domain2NotationMap )
{
List adapters = new LinkedList();
for( Iterator linkDescriptorsIterator = linkDescriptors.iterator(); linkDescriptorsIterator.hasNext(); )
{
final WorkflowLinkDescriptor nextLinkDescriptor = ( WorkflowLinkDescriptor )linkDescriptorsIterator.next();
EditPart sourceEditPart = getEditPart( nextLinkDescriptor.getSource(),
domain2NotationMap );
EditPart targetEditPart = getEditPart( nextLinkDescriptor.getDestination(),
domain2NotationMap );
if( sourceEditPart == null || targetEditPart == null ) {
continue;
}
CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor( nextLinkDescriptor.getSemanticAdapter(),
null,
ViewUtil.APPEND,
false,
( ( IGraphicalEditPart )getHost() ).getDiagramPreferencesHint() );
CreateConnectionViewRequest ccr = new CreateConnectionViewRequest( descriptor );
ccr.setType( RequestConstants.REQ_CONNECTION_START );
ccr.setSourceEditPart( sourceEditPart );
sourceEditPart.getCommand( ccr );
ccr.setTargetEditPart( targetEditPart );
ccr.setType( RequestConstants.REQ_CONNECTION_END );
Command cmd = targetEditPart.getCommand( ccr );
if( cmd != null && cmd.canExecute() ) {
executeCommand( cmd );
IAdaptable viewAdapter = ( IAdaptable )ccr.getNewObject();
if( viewAdapter != null ) {
adapters.add( viewAdapter );
}
}
}
return adapters;
}
/**
* @generated
*/
private EditPart getEditPart( EObject domainModelElement,
Map domain2NotationMap )
{
View view = ( View )domain2NotationMap.get( domainModelElement );
if( view != null ) {
return ( EditPart )getHost().getViewer().getEditPartRegistry().get( view );
}
return null;
}
}