Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/edit/policies/CustomDiagramDragDropEditPolicy.java')
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/edit/policies/CustomDiagramDragDropEditPolicy.java1163
1 files changed, 598 insertions, 565 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/edit/policies/CustomDiagramDragDropEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/edit/policies/CustomDiagramDragDropEditPolicy.java
index 73868b03168..527c8570319 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/edit/policies/CustomDiagramDragDropEditPolicy.java
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/edit/policies/CustomDiagramDragDropEditPolicy.java
@@ -1,565 +1,598 @@
-/*****************************************************************************
- * Copyright (c) 2009 Atos Origin.
- *
- *
- * 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:
- * Atos Origin - Initial API and implementation
- *
- *****************************************************************************/
-package org.eclipse.papyrus.uml.diagram.activity.edit.policies;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CreateCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor;
-import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActionLocalPostconditionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActionLocalPreconditionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.CallBehaviorActionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.CallOperationActionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ConstraintAsLocalPostcondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ConstraintAsLocalPrecondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ControlFlowEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.DurationConstraintAsLocalPostcondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.DurationConstraintAsLocalPrecondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.IntervalConstraintAsLocalPostcondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.IntervalConstraintAsLocalPrecondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ObjectFlowEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.OpaqueActionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ReadSelfActionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.TimeConstraintAsLocalPostcondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.TimeConstraintAsLocalPrecondEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ValueSpecificationActionEditPart;
-import org.eclipse.papyrus.uml.diagram.activity.helper.ActivityLinkMappingHelper;
-import org.eclipse.papyrus.uml.diagram.activity.part.UMLVisualIDRegistry;
-import org.eclipse.papyrus.uml.diagram.activity.providers.UMLElementTypes;
-import org.eclipse.papyrus.uml.diagram.common.commands.CommonDeferredCreateConnectionViewCommand;
-import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter;
-import org.eclipse.papyrus.uml.diagram.common.editpolicies.CommonDiagramDragDropEditPolicy;
-import org.eclipse.papyrus.uml.diagram.common.util.DiagramEditPartsUtil;
-import org.eclipse.uml2.uml.Action;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.Behavior;
-import org.eclipse.uml2.uml.Constraint;
-import org.eclipse.uml2.uml.Element;
-import org.eclipse.uml2.uml.ObjectFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-
-/**
- * This class is used to execute the drag and drop from the outline. It can
- * manage the drop of nodes and binary links. To manage specific drop the method
- * CommonDiagramDragDropEditPolicy.getSpecificDropCommand has to be implemented
- */
-public class CustomDiagramDragDropEditPolicy extends CommonDiagramDragDropEditPolicy {
-
- /** DropActionLocalConditionsAfterActionCommand label */
- private static final String LABEL = "DropLocalConditions";
-
- /** Point to translate successive local conditions to avoid overlapping */
- private static final Point LOCAL_CONDITIONS_TRANSLATION_POINT = new Point(160, 0);
-
- /**
- * Instantiates a new custom diagram drag drop edit policy with the right
- * link mapping helper
- */
- public CustomDiagramDragDropEditPolicy() {
- super(ActivityLinkMappingHelper.getInstance());
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected Set<Integer> getDroppableElementVisualId() {
- Set<Integer> droppableElementsVisualID = new HashSet<Integer>();
- droppableElementsVisualID.add(OpaqueActionEditPart.VISUAL_ID);
- droppableElementsVisualID.add(CallBehaviorActionEditPart.VISUAL_ID);
- droppableElementsVisualID.add(CallOperationActionEditPart.VISUAL_ID);
- droppableElementsVisualID.add(TimeConstraintAsLocalPrecondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(TimeConstraintAsLocalPostcondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(DurationConstraintAsLocalPrecondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(DurationConstraintAsLocalPostcondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(IntervalConstraintAsLocalPrecondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(IntervalConstraintAsLocalPostcondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(ConstraintAsLocalPrecondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(ConstraintAsLocalPostcondEditPart.VISUAL_ID);
- droppableElementsVisualID.add(ObjectFlowEditPart.VISUAL_ID);
- droppableElementsVisualID.add(ControlFlowEditPart.VISUAL_ID);
- droppableElementsVisualID.add(ValueSpecificationActionEditPart.VISUAL_ID);
- droppableElementsVisualID.add(ReadSelfActionEditPart.VISUAL_ID);
- return droppableElementsVisualID;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public IElementType getUMLElementType(int elementID) {
- return UMLElementTypes.getElementType(elementID);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int getNodeVisualID(View containerView, EObject domainElement) {
- return UMLVisualIDRegistry.getNodeVisualID(containerView, domainElement);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int getLinkWithClassVisualID(EObject domainElement) {
- return UMLVisualIDRegistry.getLinkWithClassVisualID(domainElement);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected Command getSpecificDropCommand(DropObjectsRequest dropRequest, Element semanticElement, int nodeVISUALID, int linkVISUALID) {
- switch(nodeVISUALID) {
- case OpaqueActionEditPart.VISUAL_ID:
- case CallBehaviorActionEditPart.VISUAL_ID:
- case CallOperationActionEditPart.VISUAL_ID:
- case ValueSpecificationActionEditPart.VISUAL_ID:
- case ReadSelfActionEditPart.VISUAL_ID:
- return dropAction(dropRequest, semanticElement, nodeVISUALID);
- case TimeConstraintAsLocalPrecondEditPart.VISUAL_ID:
- case TimeConstraintAsLocalPostcondEditPart.VISUAL_ID:
- case DurationConstraintAsLocalPrecondEditPart.VISUAL_ID:
- case DurationConstraintAsLocalPostcondEditPart.VISUAL_ID:
- case IntervalConstraintAsLocalPrecondEditPart.VISUAL_ID:
- case IntervalConstraintAsLocalPostcondEditPart.VISUAL_ID:
- case ConstraintAsLocalPrecondEditPart.VISUAL_ID:
- case ConstraintAsLocalPostcondEditPart.VISUAL_ID:
- return dropActionLocalCondition(dropRequest, semanticElement, nodeVISUALID);
- }
- switch(linkVISUALID) {
- case ObjectFlowEditPart.VISUAL_ID:
- case ControlFlowEditPart.VISUAL_ID:
- return dropActivityEdge(dropRequest, semanticElement, linkVISUALID);
- }
- return super.getSpecificDropCommand(dropRequest, semanticElement, nodeVISUALID, linkVISUALID);
- }
-
- /**
- * Specific drop action for an action (with its local conditions)
- *
- * @param dropRequest
- * the drop request
- * @param semanticElement
- * the semantic link
- * @param nodeVISUALID
- * the node visual id
- *
- * @return the command for action
- */
- protected Command dropAction(final DropObjectsRequest dropRequest, final Element semanticElement, int nodeVISUALID) {
- // The element to drop is a node
- /*
- * Check if the element is contained in this new container.
- * A special case as to be handle for structured element as contained node are not contained by the reference OwnedElement
- */
- // Retrieve it's expected graphical parent
- EObject graphicalParent = ((GraphicalEditPart)getHost()).resolveSemanticElement();
- if(graphicalParent instanceof StructuredActivityNode) {
- if(!((StructuredActivityNode)graphicalParent).getNodes().contains(semanticElement)) {
- return UnexecutableCommand.INSTANCE;
- }
- } else if(graphicalParent instanceof Element) {
- if(!((Element)graphicalParent).getOwnedElements().contains(semanticElement)) {
- return UnexecutableCommand.INSTANCE;
- }
- }
- CompoundCommand globalCmd = new CompoundCommand();
- if(globalCmd.isEmpty()) {
- ICommand cmd = getDefaultDropNodeCommand(nodeVISUALID, dropRequest.getLocation(), semanticElement);
- globalCmd.add(new ICommandProxy(cmd));
- }
- // also drop local conditions
- DropActionLocalConditionsAfterActionCommand cmd = new DropActionLocalConditionsAfterActionCommand(dropRequest, semanticElement);
- globalCmd.add(cmd);
- return globalCmd;
- }
-
- /**
- * Specific drop action for an action's local condition
- *
- * @param dropRequest
- * the drop request
- * @param semanticElement
- * the semantic link
- * @param nodeVISUALID
- * the node visual id
- *
- * @return the command for local condition
- */
- protected Command dropActionLocalCondition(DropObjectsRequest dropRequest, Element semanticElement, int nodeVISUALID) {
- if(getHost() instanceof GraphicalEditPart) {
- // Adapt the location
- Point location = dropRequest.getLocation().getCopy();
- ((GraphicalEditPart)getHost()).getContentPane().translateToRelative(location);
- ((GraphicalEditPart)getHost()).getContentPane().translateFromParent(location);
- location.translate(((GraphicalEditPart)getHost()).getContentPane().getClientArea().getLocation().getNegated());
- location.y += 100;
- // Retrieve expected graphical parent
- EObject graphicalParent = ((GraphicalEditPart)getHost()).resolveSemanticElement();
- // verification of container differs from usually, condition is
- // graphically contained by the activity
- if(graphicalParent instanceof Activity) {
- // drop the constraint and its link to the action
- Element linkSource = semanticElement.getOwner();
- Element linkTarget = semanticElement;
- // check for existing link part
- for(Object targetView : DiagramEditPartsUtil.getEObjectViews(linkTarget)) {
- if(targetView instanceof View) {
- EditPart targetEditpart = DiagramEditPartsUtil.getEditPartFromView((View)targetView, getHost());
- if(targetEditpart instanceof ActionLocalPreconditionEditPart || targetEditpart instanceof ActionLocalPostconditionEditPart) {
- // condition link is already drawn.
- return UnexecutableCommand.INSTANCE;
- }
- }
- }
- if(TimeConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID || DurationConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID || IntervalConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID || ConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID) {
- return new ICommandProxy(dropBinaryLink(new CompositeCommand("drop Local Precondition link"), linkSource, linkTarget, ActionLocalPreconditionEditPart.VISUAL_ID, location, semanticElement));
- } else if(TimeConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID || DurationConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID || IntervalConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID || ConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID) {
- return new ICommandProxy(dropBinaryLink(new CompositeCommand("drop Local Postcondition link"), linkSource, linkTarget, ActionLocalPostconditionEditPart.VISUAL_ID, location, semanticElement));
- }
- }
- }
- return UnexecutableCommand.INSTANCE;
- }
-
- /**
- * the method provides command to create the binary link into the diagram.
- * If the source and the target views do not exist, these views will be
- * created.
- *
- * @param cc
- * the composite command that will contain the set of command to
- * create the binary link
- * @param source
- * the source the element source of the link
- * @param target
- * the target the element target of the link
- * @param linkVISUALID
- * the link VISUALID used to create the view
- * @param location
- * the location the location where the view will be be created
- * @param semanticLink
- * the semantic link that will be attached to the view
- *
- * @return the composite command
- */
- public CompositeCommand dropObjectFlowSpecification(CompositeCommand cc, ObjectFlow source, Behavior target, int linkVISUALID, int specificationVISUALID, Point location, Element semanticLink) {
- // look for editpart
- ObjectFlowEditPart sourceEditPart = lookForEdgePart(source);
- // look for editpart linked with the object flow
- GraphicalEditPart targetEditPart = null;
- if(sourceEditPart != null) {
- // TODO check that there is not already a representation linked to
- // the source object flow
- }
- // descriptor of the link
- CreateConnectionViewRequest.ConnectionViewDescriptor linkdescriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(getUMLElementType(linkVISUALID), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), getDiagramPreferencesHint());
- IAdaptable sourceAdapter = null;
- IAdaptable targetAdapter = null;
- if(sourceEditPart == null) {
- // creation of the node
- ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(source), Edge.class, null, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
- // get the command and execute it.
- CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)getHost().getModel()));
- cc.compose(nodeCreationCommand);
- SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), new Point(location.x, location.y + 100));
- cc.compose(setBoundsCommand);
- sourceAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
- } else {
- sourceAdapter = new SemanticAdapter(null, sourceEditPart.getModel());
- }
- if(targetEditPart == null) {
- // creation of the node
- String nodeSemanticHint = ((IHintedType)getUMLElementType(specificationVISUALID)).getSemanticHint();
- ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(target), Node.class, nodeSemanticHint, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
- // get the command and execute it.
- CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)getHost().getModel()));
- cc.compose(nodeCreationCommand);
- SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), new Point(location.x, location.y - 100));
- cc.compose(setBoundsCommand);
- targetAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
- } else {
- targetAdapter = new SemanticAdapter(null, targetEditPart.getModel());
- }
- CommonDeferredCreateConnectionViewCommand aLinkCommand = new CommonDeferredCreateConnectionViewCommand(getEditingDomain(), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), sourceAdapter, targetAdapter, getViewer(), getDiagramPreferencesHint(), linkdescriptor, null);
- aLinkCommand.setElement(semanticLink);
- cc.compose(aLinkCommand);
- return cc;
- }
-
- /**
- * Look for editPart from its semantic.
- *
- * @param semantic
- * the semantic
- *
- * @return the edits the part or null if not found
- */
- private ObjectFlowEditPart lookForEdgePart(EObject semantic) {
- Collection<EditPart> editPartSet = getHost().getViewer().getEditPartRegistry().values();
- Iterator<EditPart> editPartIterator = editPartSet.iterator();
- ObjectFlowEditPart existedEditPart = null;
- while(editPartIterator.hasNext() && existedEditPart == null) {
- EditPart currentEditPart = editPartIterator.next();
- if(currentEditPart instanceof ObjectFlowEditPart && semantic.equals(((ObjectFlowEditPart)currentEditPart).resolveSemanticElement())) {
- existedEditPart = (ObjectFlowEditPart)currentEditPart;
- }
- }
- return existedEditPart;
- }
-
- /**
- * Specific drop action for an activity edge
- *
- * @param dropRequest
- * the drop request
- * @param semanticLink
- * the semantic link
- * @param linkVISUALID
- * the link visual id
- *
- * @return the command for association
- */
- protected Command dropActivityEdge(DropObjectsRequest dropRequest, Element semanticLink, int linkVISUALID) {
- Collection<?> sources = ActivityLinkMappingHelper.getInstance().getSource(semanticLink);
- Collection<?> targets = ActivityLinkMappingHelper.getInstance().getTarget(semanticLink);
- if(sources.size() == 1 && targets.size() == 1) {
- ActivityNode source = (ActivityNode)sources.toArray()[0];
- ActivityNode target = (ActivityNode)targets.toArray()[0];
- CompositeCommand dropBinaryLink = dropBinaryLink(new CompositeCommand("drop Activity Edge"), source, target, linkVISUALID, dropRequest.getLocation(), semanticLink);
- // If the activity edge is interruptible edge we forbib to drag it outside the interuptible edge
- if(dropBinaryLink != null && semanticLink instanceof ActivityEdge && ((ActivityEdge)semanticLink).getInterrupts() != null) {
- if(!((ActivityEdge)semanticLink).getInterrupts().equals(((IGraphicalEditPart)getHost()).resolveSemanticElement())) {
- return UnexecutableCommand.INSTANCE;
- } else {
- return new ICommandProxy(getInterruptbleEdgeCommand(new CompositeCommand("drop Interruptible Activity Edge"), source, target, linkVISUALID, dropRequest.getLocation(), semanticLink));////$NON-NLS-0$
- }
- }
- return new ICommandProxy(dropBinaryLink);
- } else {
- return UnexecutableCommand.INSTANCE;
- }
- }
-
- /**
- * Get the command to drag and drop an interruptible Edge
- * Set the source inside the Interruptible Edge and set the target outside the interruptible edge
- *
- * @param dropBinaryLink
- * {@link CompositeCommand} to compose the newly created command
- * @param semanticLink
- * @param point
- * @param linkVISUALID
- * @param target
- * @param source
- */
- protected CompositeCommand getInterruptbleEdgeCommand(CompositeCommand cc, Element source, Element target, int linkVISUALID, Point location, Element semanticLink) {
- // look for editpart
- GraphicalEditPart sourceEditPart = (GraphicalEditPart)lookForEditPart(source);
- GraphicalEditPart targetEditPart = (GraphicalEditPart)lookForEditPart(target);
- // descriptor of the link
- CreateConnectionViewRequest.ConnectionViewDescriptor linkdescriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(getUMLElementType(linkVISUALID), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), getDiagramPreferencesHint());
- IAdaptable sourceAdapter = null;
- IAdaptable targetAdapter = null;
- if(sourceEditPart == null) {
- // creation of the node
- ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(source), Node.class, null, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
- // get the command and execute it.
- CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)getHost().getModel()));
- cc.compose(nodeCreationCommand);
- SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), new Point(location.x, location.y)); //$NON-NLS-1$
- cc.compose(setBoundsCommand);
- sourceAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
- } else {
- sourceAdapter = new SemanticAdapter(null, sourceEditPart.getModel());
- }
- if(targetEditPart == null) {
- // creation of the node
- ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(target), Node.class, null, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
- // get the command and execute it.
- CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)((View)((IGraphicalEditPart)getHost()).getTopGraphicEditPart().getModel()).eContainer()));
- cc.compose(nodeCreationCommand);
- IFigure interruptibleActivityRegionFigure = ((IGraphicalEditPart)getHost()).getFigure();
- interruptibleActivityRegionFigure.getBounds();
- Point targetPoint = location.getCopy();
- targetPoint.setX(targetPoint.x() + 50);
- interruptibleActivityRegionFigure.translateToAbsolute(targetPoint);
- while(interruptibleActivityRegionFigure.containsPoint(targetPoint)) {
- targetPoint.setX(targetPoint.x() + 50);
- }
- SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), targetPoint); //$NON-NLS-1$
- cc.compose(setBoundsCommand);
- targetAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
- } else {
- targetAdapter = new SemanticAdapter(null, targetEditPart.getModel());
- }
- CommonDeferredCreateConnectionViewCommand aLinkCommand = new CommonDeferredCreateConnectionViewCommand(getEditingDomain(), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), sourceAdapter, targetAdapter, getViewer(), getDiagramPreferencesHint(), linkdescriptor, null);
- aLinkCommand.setElement(semanticLink);
- cc.compose(aLinkCommand);
- return cc;
- }
-
- /**
- * Avoid selection of label edit parts
- *
- * @see org.eclipse.papyrus.uml.diagram.common.editpolicies.OldCommonDiagramDragDropEditPolicy#isEditPartTypeSuitableForEClass(java.lang.Class,
- * org.eclipse.emf.ecore.EClass)
- */
- @Override
- protected boolean isEditPartTypeSuitableForEClass(Class<? extends GraphicalEditPart> editPartClass, EClass eClass) {
- // avoid selecting a label instead of the activity node
- return !LabelEditPart.class.isAssignableFrom(editPartClass);
- }
-
- /**
- * This action enables to drop an action's local conditions when an action
- * is dropped. Check of the existing action view is run at execution time to
- * avoid duplication of the action's view. This action is an intern class
- * since it is narrowly linked with this edit policy properties and
- * operations
- */
- private class DropActionLocalConditionsAfterActionCommand extends Command {
-
- /** The drop request */
- private DropObjectsRequest request;
-
- /** The dropped action */
- private Element droppedAction;
-
- /** The command which have been executed (known at execution time) */
- private List<Command> executedCommands = new LinkedList<Command>();
-
- /**
- * Constructor.
- *
- * @param dropRequest
- * the initial request to drop elements
- * @param action
- * the dropped action (whose local conditions must follow)
- */
- public DropActionLocalConditionsAfterActionCommand(DropObjectsRequest dropRequest, Element action) {
- super(LABEL);
- request = dropRequest;
- droppedAction = action;
- }
-
- /**
- * This command can always execute, though it may have no effect
- *
- * @see org.eclipse.gef.commands.Command#canExecute()
- * @return true
- */
- @Override
- public boolean canExecute() {
- return true;
- }
-
- /**
- * Execute the command and drop each local condition view
- *
- * @see org.eclipse.gef.commands.Command#execute()
- */
- @Override
- public void execute() {
- // update request to unset the position, so that position is
- // automatically recomputed each time (to avoid superposition).
- Object hostView = getHost().getModel();
- if(hostView instanceof View) {
- if(droppedAction instanceof Action) {
- Point initialLocation = request.getLocation().getCopy();
- for(Constraint pre : ((Action)droppedAction).getLocalPreconditions()) {
- int visual = UMLVisualIDRegistry.getNodeVisualID((View)hostView, pre);
- Command localCmd = dropActionLocalCondition(request, pre, visual);
- if(localCmd != null && localCmd.canExecute()) {
- localCmd.execute();
- executedCommands.add(localCmd);
- // update the request's position to avoid conditions
- // superposition
- request.getLocation().translate(LOCAL_CONDITIONS_TRANSLATION_POINT);
- }
- }
- for(Constraint post : ((Action)droppedAction).getLocalPostconditions()) {
- int visual = UMLVisualIDRegistry.getNodeVisualID((View)hostView, post);
- Command localCmd = dropActionLocalCondition(request, post, visual);
- if(localCmd != null && localCmd.canExecute()) {
- localCmd.execute();
- executedCommands.add(localCmd);
- // update the request's position to avoid conditions
- // superposition
- request.getLocation().translate(LOCAL_CONDITIONS_TRANSLATION_POINT);
- }
- }
- // restore initial location
- request.getLocation().setLocation(initialLocation);
- }
- }
- }
-
- /**
- * Undo executed commands
- *
- * @see org.eclipse.gef.commands.Command#undo()
- */
- @Override
- public void undo() {
- // undo commands in the inverse order
- for(int i = executedCommands.size() - 1; i >= 0; i--) {
- Command cmd = executedCommands.get(i);
- cmd.undo();
- }
- executedCommands.clear();
- }
- }
-
- @Override
- protected Command getDropCommand(ChangeBoundsRequest request) {
- return super.getDropCommand(request);
- }
-}
+/*****************************************************************************
+ * Copyright (c) 2009 Atos Origin.
+ *
+ *
+ * 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:
+ * Atos Origin - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.uml.diagram.activity.edit.policies;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.commands.CreateCommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor;
+import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActionLocalPostconditionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActionLocalPreconditionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.CallBehaviorActionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.CallOperationActionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ConstraintAsLocalPostcondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ConstraintAsLocalPrecondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ControlFlowEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.DurationConstraintAsLocalPostcondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.DurationConstraintAsLocalPrecondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ExpansionNodeAsInEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ExpansionNodeAsOutEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.IntervalConstraintAsLocalPostcondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.IntervalConstraintAsLocalPrecondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ObjectFlowEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.OpaqueActionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ReadSelfActionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.TimeConstraintAsLocalPostcondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.TimeConstraintAsLocalPrecondEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ValueSpecificationActionEditPart;
+import org.eclipse.papyrus.uml.diagram.activity.helper.ActivityLinkMappingHelper;
+import org.eclipse.papyrus.uml.diagram.activity.part.UMLVisualIDRegistry;
+import org.eclipse.papyrus.uml.diagram.activity.providers.UMLElementTypes;
+import org.eclipse.papyrus.uml.diagram.common.commands.CommonDeferredCreateConnectionViewCommand;
+import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter;
+import org.eclipse.papyrus.uml.diagram.common.editpolicies.CommonDiagramDragDropEditPolicy;
+import org.eclipse.papyrus.uml.diagram.common.util.DiagramEditPartsUtil;
+import org.eclipse.uml2.uml.Action;
+import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ObjectFlow;
+import org.eclipse.uml2.uml.StructuredActivityNode;
+
+/**
+ * This class is used to execute the drag and drop from the outline. It can
+ * manage the drop of nodes and binary links. To manage specific drop the method
+ * CommonDiagramDragDropEditPolicy.getSpecificDropCommand has to be implemented
+ */
+public class CustomDiagramDragDropEditPolicy extends CommonDiagramDragDropEditPolicy {
+
+ /** DropActionLocalConditionsAfterActionCommand label */
+ private static final String LABEL = "DropLocalConditions";
+
+ /** Point to translate successive local conditions to avoid overlapping */
+ private static final Point LOCAL_CONDITIONS_TRANSLATION_POINT = new Point(160, 0);
+
+ /**
+ * Instantiates a new custom diagram drag drop edit policy with the right
+ * link mapping helper
+ */
+ public CustomDiagramDragDropEditPolicy() {
+ super(ActivityLinkMappingHelper.getInstance());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Set<Integer> getDroppableElementVisualId() {
+ Set<Integer> droppableElementsVisualID = new HashSet<Integer>();
+ droppableElementsVisualID.add(OpaqueActionEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(CallBehaviorActionEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(CallOperationActionEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(TimeConstraintAsLocalPrecondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(TimeConstraintAsLocalPostcondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(DurationConstraintAsLocalPrecondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(DurationConstraintAsLocalPostcondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(IntervalConstraintAsLocalPrecondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(IntervalConstraintAsLocalPostcondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ConstraintAsLocalPrecondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ConstraintAsLocalPostcondEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ObjectFlowEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ControlFlowEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ValueSpecificationActionEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ReadSelfActionEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ExpansionNodeAsInEditPart.VISUAL_ID);
+ droppableElementsVisualID.add(ExpansionNodeAsOutEditPart.VISUAL_ID);
+ return droppableElementsVisualID;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public IElementType getUMLElementType(int elementID) {
+ return UMLElementTypes.getElementType(elementID);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getNodeVisualID(View containerView, EObject domainElement) {
+ return UMLVisualIDRegistry.getNodeVisualID(containerView, domainElement);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getLinkWithClassVisualID(EObject domainElement) {
+ return UMLVisualIDRegistry.getLinkWithClassVisualID(domainElement);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Command getSpecificDropCommand(DropObjectsRequest dropRequest, Element semanticElement, int nodeVISUALID, int linkVISUALID) {
+ switch(nodeVISUALID) {
+ case OpaqueActionEditPart.VISUAL_ID:
+ case CallBehaviorActionEditPart.VISUAL_ID:
+ case CallOperationActionEditPart.VISUAL_ID:
+ case ValueSpecificationActionEditPart.VISUAL_ID:
+ case ReadSelfActionEditPart.VISUAL_ID:
+ return dropAction(dropRequest, semanticElement, nodeVISUALID);
+ case ExpansionNodeAsInEditPart.VISUAL_ID:
+ case ExpansionNodeAsOutEditPart.VISUAL_ID:
+ return dropExpansionNode(dropRequest, semanticElement, nodeVISUALID);
+ case TimeConstraintAsLocalPrecondEditPart.VISUAL_ID:
+ case TimeConstraintAsLocalPostcondEditPart.VISUAL_ID:
+ case DurationConstraintAsLocalPrecondEditPart.VISUAL_ID:
+ case DurationConstraintAsLocalPostcondEditPart.VISUAL_ID:
+ case IntervalConstraintAsLocalPrecondEditPart.VISUAL_ID:
+ case IntervalConstraintAsLocalPostcondEditPart.VISUAL_ID:
+ case ConstraintAsLocalPrecondEditPart.VISUAL_ID:
+ case ConstraintAsLocalPostcondEditPart.VISUAL_ID:
+ return dropActionLocalCondition(dropRequest, semanticElement, nodeVISUALID);
+ }
+ switch(linkVISUALID) {
+ case ObjectFlowEditPart.VISUAL_ID:
+ case ControlFlowEditPart.VISUAL_ID:
+ return dropActivityEdge(dropRequest, semanticElement, linkVISUALID);
+ }
+ return super.getSpecificDropCommand(dropRequest, semanticElement, nodeVISUALID, linkVISUALID);
+ }
+
+ protected Command dropExpansionNode(DropObjectsRequest dropRequest,
+ Element semanticElement, int nodeVISUALID) {
+ // The element to drop is a node
+ /*
+ * Check if the element is contained in this new container.
+ * A special case as to be handle for structured element as contained node are not contained by the reference OwnedElement
+ */
+ // Retrieve it's expected graphical parent
+ EObject graphicalParent = ((GraphicalEditPart)getHost()).resolveSemanticElement();
+ if(graphicalParent instanceof StructuredActivityNode) {
+ if(!((StructuredActivityNode)graphicalParent).getNodes().contains(semanticElement)) {
+ return UnexecutableCommand.INSTANCE;
+ }
+ } else if(graphicalParent instanceof Element) {
+ if(!((Element)graphicalParent).getOwnedElements().contains(semanticElement)) {
+ return UnexecutableCommand.INSTANCE;
+ }
+ }
+ CompoundCommand globalCmd = new CompoundCommand();
+ if(globalCmd.isEmpty()) {
+ ICommand cmd = getDefaultDropNodeCommand(nodeVISUALID, dropRequest.getLocation(), semanticElement);
+ globalCmd.add(new ICommandProxy(cmd));
+ }
+ return globalCmd;
+ }
+
+ /**
+ * Specific drop action for an action (with its local conditions)
+ *
+ * @param dropRequest
+ * the drop request
+ * @param semanticElement
+ * the semantic link
+ * @param nodeVISUALID
+ * the node visual id
+ *
+ * @return the command for action
+ */
+ protected Command dropAction(final DropObjectsRequest dropRequest, final Element semanticElement, int nodeVISUALID) {
+ // The element to drop is a node
+ /*
+ * Check if the element is contained in this new container.
+ * A special case as to be handle for structured element as contained node are not contained by the reference OwnedElement
+ */
+ // Retrieve it's expected graphical parent
+ EObject graphicalParent = ((GraphicalEditPart)getHost()).resolveSemanticElement();
+ if(graphicalParent instanceof StructuredActivityNode) {
+ if(!((StructuredActivityNode)graphicalParent).getNodes().contains(semanticElement)) {
+ return UnexecutableCommand.INSTANCE;
+ }
+ } else if(graphicalParent instanceof Element) {
+ if(!((Element)graphicalParent).getOwnedElements().contains(semanticElement)) {
+ return UnexecutableCommand.INSTANCE;
+ }
+ }
+ CompoundCommand globalCmd = new CompoundCommand();
+ if(globalCmd.isEmpty()) {
+ ICommand cmd = getDefaultDropNodeCommand(nodeVISUALID, dropRequest.getLocation(), semanticElement);
+ globalCmd.add(new ICommandProxy(cmd));
+ }
+ // also drop local conditions
+ DropActionLocalConditionsAfterActionCommand cmd = new DropActionLocalConditionsAfterActionCommand(dropRequest, semanticElement);
+ globalCmd.add(cmd);
+ return globalCmd;
+ }
+
+ /**
+ * Specific drop action for an action's local condition
+ *
+ * @param dropRequest
+ * the drop request
+ * @param semanticElement
+ * the semantic link
+ * @param nodeVISUALID
+ * the node visual id
+ *
+ * @return the command for local condition
+ */
+ protected Command dropActionLocalCondition(DropObjectsRequest dropRequest, Element semanticElement, int nodeVISUALID) {
+ if(getHost() instanceof GraphicalEditPart) {
+ // Adapt the location
+ Point location = dropRequest.getLocation().getCopy();
+ ((GraphicalEditPart)getHost()).getContentPane().translateToRelative(location);
+ ((GraphicalEditPart)getHost()).getContentPane().translateFromParent(location);
+ location.translate(((GraphicalEditPart)getHost()).getContentPane().getClientArea().getLocation().getNegated());
+ location.y += 100;
+ // Retrieve expected graphical parent
+ EObject graphicalParent = ((GraphicalEditPart)getHost()).resolveSemanticElement();
+ // verification of container differs from usually, condition is
+ // graphically contained by the activity
+ if(graphicalParent instanceof Activity) {
+ // drop the constraint and its link to the action
+ Element linkSource = semanticElement.getOwner();
+ Element linkTarget = semanticElement;
+ // check for existing link part
+ for(Object targetView : DiagramEditPartsUtil.getEObjectViews(linkTarget)) {
+ if(targetView instanceof View) {
+ EditPart targetEditpart = DiagramEditPartsUtil.getEditPartFromView((View)targetView, getHost());
+ if(targetEditpart instanceof ActionLocalPreconditionEditPart || targetEditpart instanceof ActionLocalPostconditionEditPart) {
+ // condition link is already drawn.
+ return UnexecutableCommand.INSTANCE;
+ }
+ }
+ }
+ if(TimeConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID || DurationConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID || IntervalConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID || ConstraintAsLocalPrecondEditPart.VISUAL_ID == nodeVISUALID) {
+ return new ICommandProxy(dropBinaryLink(new CompositeCommand("drop Local Precondition link"), linkSource, linkTarget, ActionLocalPreconditionEditPart.VISUAL_ID, location, semanticElement));
+ } else if(TimeConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID || DurationConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID || IntervalConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID || ConstraintAsLocalPostcondEditPart.VISUAL_ID == nodeVISUALID) {
+ return new ICommandProxy(dropBinaryLink(new CompositeCommand("drop Local Postcondition link"), linkSource, linkTarget, ActionLocalPostconditionEditPart.VISUAL_ID, location, semanticElement));
+ }
+ }
+ }
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ /**
+ * the method provides command to create the binary link into the diagram.
+ * If the source and the target views do not exist, these views will be
+ * created.
+ *
+ * @param cc
+ * the composite command that will contain the set of command to
+ * create the binary link
+ * @param source
+ * the source the element source of the link
+ * @param target
+ * the target the element target of the link
+ * @param linkVISUALID
+ * the link VISUALID used to create the view
+ * @param location
+ * the location the location where the view will be be created
+ * @param semanticLink
+ * the semantic link that will be attached to the view
+ *
+ * @return the composite command
+ */
+ public CompositeCommand dropObjectFlowSpecification(CompositeCommand cc, ObjectFlow source, Behavior target, int linkVISUALID, int specificationVISUALID, Point location, Element semanticLink) {
+ // look for editpart
+ ObjectFlowEditPart sourceEditPart = lookForEdgePart(source);
+ // look for editpart linked with the object flow
+ GraphicalEditPart targetEditPart = null;
+ if(sourceEditPart != null) {
+ // TODO check that there is not already a representation linked to
+ // the source object flow
+ }
+ // descriptor of the link
+ CreateConnectionViewRequest.ConnectionViewDescriptor linkdescriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(getUMLElementType(linkVISUALID), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), getDiagramPreferencesHint());
+ IAdaptable sourceAdapter = null;
+ IAdaptable targetAdapter = null;
+ if(sourceEditPart == null) {
+ // creation of the node
+ ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(source), Edge.class, null, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
+ // get the command and execute it.
+ CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)getHost().getModel()));
+ cc.compose(nodeCreationCommand);
+ SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), new Point(location.x, location.y + 100));
+ cc.compose(setBoundsCommand);
+ sourceAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
+ } else {
+ sourceAdapter = new SemanticAdapter(null, sourceEditPart.getModel());
+ }
+ if(targetEditPart == null) {
+ // creation of the node
+ String nodeSemanticHint = ((IHintedType)getUMLElementType(specificationVISUALID)).getSemanticHint();
+ ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(target), Node.class, nodeSemanticHint, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
+ // get the command and execute it.
+ CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)getHost().getModel()));
+ cc.compose(nodeCreationCommand);
+ SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), new Point(location.x, location.y - 100));
+ cc.compose(setBoundsCommand);
+ targetAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
+ } else {
+ targetAdapter = new SemanticAdapter(null, targetEditPart.getModel());
+ }
+ CommonDeferredCreateConnectionViewCommand aLinkCommand = new CommonDeferredCreateConnectionViewCommand(getEditingDomain(), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), sourceAdapter, targetAdapter, getViewer(), getDiagramPreferencesHint(), linkdescriptor, null);
+ aLinkCommand.setElement(semanticLink);
+ cc.compose(aLinkCommand);
+ return cc;
+ }
+
+ /**
+ * Look for editPart from its semantic.
+ *
+ * @param semantic
+ * the semantic
+ *
+ * @return the edits the part or null if not found
+ */
+ private ObjectFlowEditPart lookForEdgePart(EObject semantic) {
+ Collection<EditPart> editPartSet = getHost().getViewer().getEditPartRegistry().values();
+ Iterator<EditPart> editPartIterator = editPartSet.iterator();
+ ObjectFlowEditPart existedEditPart = null;
+ while(editPartIterator.hasNext() && existedEditPart == null) {
+ EditPart currentEditPart = editPartIterator.next();
+ if(currentEditPart instanceof ObjectFlowEditPart && semantic.equals(((ObjectFlowEditPart)currentEditPart).resolveSemanticElement())) {
+ existedEditPart = (ObjectFlowEditPart)currentEditPart;
+ }
+ }
+ return existedEditPart;
+ }
+
+ /**
+ * Specific drop action for an activity edge
+ *
+ * @param dropRequest
+ * the drop request
+ * @param semanticLink
+ * the semantic link
+ * @param linkVISUALID
+ * the link visual id
+ *
+ * @return the command for association
+ */
+ protected Command dropActivityEdge(DropObjectsRequest dropRequest, Element semanticLink, int linkVISUALID) {
+ Collection<?> sources = ActivityLinkMappingHelper.getInstance().getSource(semanticLink);
+ Collection<?> targets = ActivityLinkMappingHelper.getInstance().getTarget(semanticLink);
+ if(sources.size() == 1 && targets.size() == 1) {
+ ActivityNode source = (ActivityNode)sources.toArray()[0];
+ ActivityNode target = (ActivityNode)targets.toArray()[0];
+ CompositeCommand dropBinaryLink = dropBinaryLink(new CompositeCommand("drop Activity Edge"), source, target, linkVISUALID, dropRequest.getLocation(), semanticLink);
+ // If the activity edge is interruptible edge we forbib to drag it outside the interuptible edge
+ if(dropBinaryLink != null && semanticLink instanceof ActivityEdge && ((ActivityEdge)semanticLink).getInterrupts() != null) {
+ if(!((ActivityEdge)semanticLink).getInterrupts().equals(((IGraphicalEditPart)getHost()).resolveSemanticElement())) {
+ return UnexecutableCommand.INSTANCE;
+ } else {
+ return new ICommandProxy(getInterruptbleEdgeCommand(new CompositeCommand("drop Interruptible Activity Edge"), source, target, linkVISUALID, dropRequest.getLocation(), semanticLink));////$NON-NLS-0$
+ }
+ }
+ return new ICommandProxy(dropBinaryLink);
+ } else {
+ return UnexecutableCommand.INSTANCE;
+ }
+ }
+
+ /**
+ * Get the command to drag and drop an interruptible Edge
+ * Set the source inside the Interruptible Edge and set the target outside the interruptible edge
+ *
+ * @param dropBinaryLink
+ * {@link CompositeCommand} to compose the newly created command
+ * @param semanticLink
+ * @param point
+ * @param linkVISUALID
+ * @param target
+ * @param source
+ */
+ protected CompositeCommand getInterruptbleEdgeCommand(CompositeCommand cc, Element source, Element target, int linkVISUALID, Point location, Element semanticLink) {
+ // look for editpart
+ GraphicalEditPart sourceEditPart = (GraphicalEditPart)lookForEditPart(source);
+ GraphicalEditPart targetEditPart = (GraphicalEditPart)lookForEditPart(target);
+ // descriptor of the link
+ CreateConnectionViewRequest.ConnectionViewDescriptor linkdescriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(getUMLElementType(linkVISUALID), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), getDiagramPreferencesHint());
+ IAdaptable sourceAdapter = null;
+ IAdaptable targetAdapter = null;
+ if(sourceEditPart == null) {
+ // creation of the node
+ ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(source), Node.class, null, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
+ // get the command and execute it.
+ CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)getHost().getModel()));
+ cc.compose(nodeCreationCommand);
+ SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), new Point(location.x, location.y)); //$NON-NLS-1$
+ cc.compose(setBoundsCommand);
+ sourceAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
+ } else {
+ sourceAdapter = new SemanticAdapter(null, sourceEditPart.getModel());
+ }
+ if(targetEditPart == null) {
+ // creation of the node
+ ViewDescriptor descriptor = new ViewDescriptor(new EObjectAdapter(target), Node.class, null, ViewUtil.APPEND, true, ((IGraphicalEditPart)getHost()).getDiagramPreferencesHint());
+ // get the command and execute it.
+ CreateCommand nodeCreationCommand = new CreateCommand(((IGraphicalEditPart)getHost()).getEditingDomain(), descriptor, ((View)((View)((IGraphicalEditPart)getHost()).getTopGraphicEditPart().getModel()).eContainer()));
+ cc.compose(nodeCreationCommand);
+ IFigure interruptibleActivityRegionFigure = ((IGraphicalEditPart)getHost()).getFigure();
+ interruptibleActivityRegionFigure.getBounds();
+ Point targetPoint = location.getCopy();
+ targetPoint.setX(targetPoint.x() + 50);
+ interruptibleActivityRegionFigure.translateToAbsolute(targetPoint);
+ while(interruptibleActivityRegionFigure.containsPoint(targetPoint)) {
+ targetPoint.setX(targetPoint.x() + 50);
+ }
+ SetBoundsCommand setBoundsCommand = new SetBoundsCommand(getEditingDomain(), "move", (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), targetPoint); //$NON-NLS-1$
+ cc.compose(setBoundsCommand);
+ targetAdapter = (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue();
+ } else {
+ targetAdapter = new SemanticAdapter(null, targetEditPart.getModel());
+ }
+ CommonDeferredCreateConnectionViewCommand aLinkCommand = new CommonDeferredCreateConnectionViewCommand(getEditingDomain(), ((IHintedType)getUMLElementType(linkVISUALID)).getSemanticHint(), sourceAdapter, targetAdapter, getViewer(), getDiagramPreferencesHint(), linkdescriptor, null);
+ aLinkCommand.setElement(semanticLink);
+ cc.compose(aLinkCommand);
+ return cc;
+ }
+
+ /**
+ * Avoid selection of label edit parts
+ *
+ * @see org.eclipse.papyrus.uml.diagram.common.editpolicies.OldCommonDiagramDragDropEditPolicy#isEditPartTypeSuitableForEClass(java.lang.Class,
+ * org.eclipse.emf.ecore.EClass)
+ */
+ @Override
+ protected boolean isEditPartTypeSuitableForEClass(Class<? extends GraphicalEditPart> editPartClass, EClass eClass) {
+ // avoid selecting a label instead of the activity node
+ return !LabelEditPart.class.isAssignableFrom(editPartClass);
+ }
+
+ /**
+ * This action enables to drop an action's local conditions when an action
+ * is dropped. Check of the existing action view is run at execution time to
+ * avoid duplication of the action's view. This action is an intern class
+ * since it is narrowly linked with this edit policy properties and
+ * operations
+ */
+ private class DropActionLocalConditionsAfterActionCommand extends Command {
+
+ /** The drop request */
+ private DropObjectsRequest request;
+
+ /** The dropped action */
+ private Element droppedAction;
+
+ /** The command which have been executed (known at execution time) */
+ private List<Command> executedCommands = new LinkedList<Command>();
+
+ /**
+ * Constructor.
+ *
+ * @param dropRequest
+ * the initial request to drop elements
+ * @param action
+ * the dropped action (whose local conditions must follow)
+ */
+ public DropActionLocalConditionsAfterActionCommand(DropObjectsRequest dropRequest, Element action) {
+ super(LABEL);
+ request = dropRequest;
+ droppedAction = action;
+ }
+
+ /**
+ * This command can always execute, though it may have no effect
+ *
+ * @see org.eclipse.gef.commands.Command#canExecute()
+ * @return true
+ */
+ @Override
+ public boolean canExecute() {
+ return true;
+ }
+
+ /**
+ * Execute the command and drop each local condition view
+ *
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+ @Override
+ public void execute() {
+ // update request to unset the position, so that position is
+ // automatically recomputed each time (to avoid superposition).
+ Object hostView = getHost().getModel();
+ if(hostView instanceof View) {
+ if(droppedAction instanceof Action) {
+ Point initialLocation = request.getLocation().getCopy();
+ for(Constraint pre : ((Action)droppedAction).getLocalPreconditions()) {
+ int visual = UMLVisualIDRegistry.getNodeVisualID((View)hostView, pre);
+ Command localCmd = dropActionLocalCondition(request, pre, visual);
+ if(localCmd != null && localCmd.canExecute()) {
+ localCmd.execute();
+ executedCommands.add(localCmd);
+ // update the request's position to avoid conditions
+ // superposition
+ request.getLocation().translate(LOCAL_CONDITIONS_TRANSLATION_POINT);
+ }
+ }
+ for(Constraint post : ((Action)droppedAction).getLocalPostconditions()) {
+ int visual = UMLVisualIDRegistry.getNodeVisualID((View)hostView, post);
+ Command localCmd = dropActionLocalCondition(request, post, visual);
+ if(localCmd != null && localCmd.canExecute()) {
+ localCmd.execute();
+ executedCommands.add(localCmd);
+ // update the request's position to avoid conditions
+ // superposition
+ request.getLocation().translate(LOCAL_CONDITIONS_TRANSLATION_POINT);
+ }
+ }
+ // restore initial location
+ request.getLocation().setLocation(initialLocation);
+ }
+ }
+ }
+
+ /**
+ * Undo executed commands
+ *
+ * @see org.eclipse.gef.commands.Command#undo()
+ */
+ @Override
+ public void undo() {
+ // undo commands in the inverse order
+ for(int i = executedCommands.size() - 1; i >= 0; i--) {
+ Command cmd = executedCommands.get(i);
+ cmd.undo();
+ }
+ executedCommands.clear();
+ }
+ }
+
+ @Override
+ protected Command getDropCommand(ChangeBoundsRequest request) {
+ return super.getDropCommand(request);
+ }
+}

Back to the top