diff options
author | atischenko | 2014-09-01 19:04:54 +0000 |
---|---|---|
committer | Camille Letavernier | 2014-09-12 15:53:15 +0000 |
commit | bd31548ee1271a0eb812d3f2710b9cad4cb46265 (patch) | |
tree | 8f1b63d017f08af1f208a2b2d5338b03ed30d38c | |
parent | 52d5de5e53a95c09a55d7dc070a178f375cb4051 (diff) | |
download | org.eclipse.papyrus-bd31548ee1271a0eb812d3f2710b9cad4cb46265.tar.gz org.eclipse.papyrus-bd31548ee1271a0eb812d3f2710b9cad4cb46265.tar.xz org.eclipse.papyrus-bd31548ee1271a0eb812d3f2710b9cad4cb46265.zip |
[406430] - ExpansionNodes cannot be drag&drop on its expansionRegion in
diagram from modelExplorer
Signed-off-by: atischenko <ticher777@gmail.com>
5 files changed, 275 insertions, 4 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/activitygroup/editpolicy/ExpansionRegionCompartmentDnDEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/activitygroup/editpolicy/ExpansionRegionCompartmentDnDEditPolicy.java new file mode 100644 index 00000000000..434d6b32b88 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/custom-src/org/eclipse/papyrus/uml/diagram/activity/activitygroup/editpolicy/ExpansionRegionCompartmentDnDEditPolicy.java @@ -0,0 +1,77 @@ +/***************************************************************************** + * Copyright (c) 2014 CEA LIST 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: + * CEA LIST - Initial API and implementation + * + *****************************************************************************/ + +package org.eclipse.papyrus.uml.diagram.activity.activitygroup.editpolicy; + +import org.eclipse.core.commands.operations.IUndoableOperation; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.emf.ecore.EObject; +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.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeCompartmentEditPart; +import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor; +import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; +import org.eclipse.gmf.runtime.emf.type.core.IHintedType; +import org.eclipse.gmf.runtime.notation.Node; +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.policies.ActivityGroupCustomDragAndDropEditPolicy; +import org.eclipse.uml2.uml.Element; +import org.eclipse.uml2.uml.ExpansionNode; + + +public class ExpansionRegionCompartmentDnDEditPolicy extends ActivityGroupCustomDragAndDropEditPolicy { + + @Override + protected IUndoableOperation getDropObjectCommand(DropObjectsRequest dropRequest, EObject droppedObject) { + if (isExpansionNode(droppedObject)) { + return dropExpansionNode((ExpansionNode) droppedObject); + } + return super.getDropObjectCommand(dropRequest, droppedObject); + } + + public IUndoableOperation dropExpansionNode(ExpansionNode expNode) { + int visualID = 0; + if (expNode.getRegionAsInput() != null) { + visualID = ExpansionNodeAsInEditPart.VISUAL_ID; + } else { + visualID = ExpansionNodeAsOutEditPart.VISUAL_ID; + } + CompositeCommand wrapCommand = new CompositeCommand("Wrap drop command"); + IGraphicalEditPart graphicalParent; + if (getHost() instanceof ShapeCompartmentEditPart) { + graphicalParent = (IGraphicalEditPart) getHost().getParent(); + } else { + graphicalParent = (IGraphicalEditPart) getHost(); + } + wrapCommand.add(getCreateViewCommand(graphicalParent, expNode, visualID)); + return wrapCommand; + } + + protected ICommand getCreateViewCommand(IGraphicalEditPart parent, Element droppedElement, int nodeVISUALID) { + IAdaptable elementAdapter = new EObjectAdapter(droppedElement); + ViewDescriptor descriptor = new ViewDescriptor(elementAdapter, Node.class, ((IHintedType) getUMLElementType(nodeVISUALID)).getSemanticHint(), ViewUtil.APPEND, true, getDiagramPreferencesHint()); + + CreateCommand c = new CreateCommand(getEditingDomain(), descriptor, parent.getPrimaryView()); + + return c.canExecute() ? c : org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand.INSTANCE; + } + + private boolean isExpansionNode(EObject droppedElement) { + return droppedElement instanceof ExpansionNode; + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/model/activityDiagram.gmfgen b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/model/activityDiagram.gmfgen index a003a279c10..5aa284933f9 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/model/activityDiagram.gmfgen +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/model/activityDiagram.gmfgen @@ -3564,7 +3564,7 @@ <compartments visualID="7009" editPartClassName="ExpansionRegionStructuredActivityNodeContentCompartmentEditPart" itemSemanticEditPolicyClassName="ExpansionRegionStructuredActivityNodeContentCompartmentItemSemanticEditPolicy" notationViewFactoryClassName="ExpansionRegionStructuredActivityNodeContentCompartmentViewFactory" canonicalEditPolicyClassName="ExpansionRegionStructuredActivityNodeContentCompartmentCanonicalEditPolicy" childNodes="/0/@diagram/@childNodes.3 /0/@diagram/@childNodes.4 /0/@diagram/@childNodes.5 /0/@diagram/@childNodes.6 /0/@diagram/@childNodes.11 /0/@diagram/@childNodes.16 /0/@diagram/@childNodes.32 /0/@diagram/@childNodes.33 /0/@diagram/@childNodes.34 /0/@diagram/@childNodes.35 /0/@diagram/@childNodes.36 /0/@diagram/@childNodes.37 /0/@diagram/@childNodes.44 /0/@diagram/@childNodes.52 /0/@diagram/@childNodes.54 /0/@diagram/@childNodes.56 /0/@diagram/@childNodes.57 /0/@diagram/@childNodes.60 /0/@diagram/@childNodes.64 /0/@diagram/@childNodes.65 /0/@diagram/@childNodes.70 /0/@diagram/@childNodes.24 /0/@diagram/@childNodes.25 /0/@diagram/@childNodes.26 /0/@diagram/@childNodes.27 /0/@diagram/@childNodes.28 /0/@diagram/@childNodes.29 /0/@diagram/@childNodes.30 /0/@diagram/@childNodes.31 /0/@diagram/@childNodes.73 /0/@diagram/@childNodes.76 /0/@diagram/@childNodes.79 /0/@diagram/@childNodes.83 /0/@diagram/@childNodes.85 /0/@diagram/@childNodes.87 /0/@diagram/@childNodes.90 /0/@diagram/@childNodes.92 /0/@diagram/@childNodes.69 /0/@diagram/@childNodes.93" title="StructuredActivityNodeContentCompartment" canCollapse="false" needsTitle="false" node="/0/@diagram/@childNodes.57" listLayout="false"> <diagramRunTimeClass href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/> <viewmap xsi:type="gmfgen:ParentAssignedViewmap" getterName="getStructuredActivityNodeCompartment" figureQualifiedClassName="org.eclipse.draw2d.RoundedRectangle"/> - <behaviour xsi:type="gmfgen:CustomBehaviour" key="EditPolicyRoles.DRAG_DROP_ROLE" editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.activity.edit.policies.ActivityGroupCustomDragAndDropEditPolicy"/> + <behaviour xsi:type="gmfgen:CustomBehaviour" key="EditPolicyRoles.DRAG_DROP_ROLE" editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.activity.activitygroup.editpolicy.ExpansionRegionCompartmentDnDEditPolicy"/> <behaviour xsi:type="gmfgen:CustomBehaviour" key=""RemoveOrphanView"" editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.activity.edit.policies.RemoveOrphanViewPolicy"/> <behaviour xsi:type="gmfgen:CustomBehaviour" key="org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.SEMANTIC_ROLE" editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.activity.edit.policies.CustomExpansionRegionStructuredActivityNodeContentCompartmentItemSemanticEditPolicy"/> <behaviour xsi:type="gmfgen:CustomBehaviour" key="org.eclipse.gef.EditPolicy.GRAPHICAL_NODE_ROLE" editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.common.editpolicies.CustomContainerEditPolicy"/> diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/src/org/eclipse/papyrus/uml/diagram/activity/edit/parts/ExpansionRegionStructuredActivityNodeContentCompartmentEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/src/org/eclipse/papyrus/uml/diagram/activity/edit/parts/ExpansionRegionStructuredActivityNodeContentCompartmentEditPart.java index f8a4427c9f4..e9eda154aee 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/src/org/eclipse/papyrus/uml/diagram/activity/edit/parts/ExpansionRegionStructuredActivityNodeContentCompartmentEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity/src/org/eclipse/papyrus/uml/diagram/activity/edit/parts/ExpansionRegionStructuredActivityNodeContentCompartmentEditPart.java @@ -27,7 +27,7 @@ import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure; import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.papyrus.uml.diagram.activity.edit.policies.ActivityGroupCustomDragAndDropEditPolicy;
+import org.eclipse.papyrus.uml.diagram.activity.activitygroup.editpolicy.ExpansionRegionCompartmentDnDEditPolicy;
import org.eclipse.papyrus.uml.diagram.activity.edit.policies.CustomExpansionRegionStructuredActivityNodeContentCompartmentItemSemanticEditPolicy;
import org.eclipse.papyrus.uml.diagram.activity.edit.policies.ExpansionRegionStructuredActivityNodeContentCompartmentItemSemanticEditPolicy;
import org.eclipse.papyrus.uml.diagram.activity.edit.policies.RemoveOrphanViewPolicy;
@@ -85,7 +85,7 @@ public class ExpansionRegionStructuredActivityNodeContentCompartmentEditPart ext installEditPolicy(DuplicatePasteEditPolicy.PASTE_ROLE, new DuplicatePasteEditPolicy());
// in Papyrus diagrams are not strongly synchronised
// installEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CANONICAL_ROLE, new org.eclipse.papyrus.uml.diagram.activity.edit.policies.ExpansionRegionStructuredActivityNodeContentCompartmentCanonicalEditPolicy());
- installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new ActivityGroupCustomDragAndDropEditPolicy());
+ installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new ExpansionRegionCompartmentDnDEditPolicy());
installEditPolicy("RemoveOrphanView", new RemoveOrphanViewPolicy()); //$NON-NLS-1$
installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new CustomExpansionRegionStructuredActivityNodeContentCompartmentItemSemanticEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new CustomContainerEditPolicy());
diff --git a/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/AllCanonicalTests.java b/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/AllCanonicalTests.java index 8991c541710..e9d34866f20 100644 --- a/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/AllCanonicalTests.java +++ b/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/AllCanonicalTests.java @@ -25,7 +25,8 @@ import org.junit.runners.Suite.SuiteClasses; TestActivityDiagramChildNode.class,
// TestActivityDiagramChildWithOtherCreationNode.class,
TestActivityChildNodeInStructuredActivity.class,
-TestActivityGroup.class
+TestActivityGroup.class,
+TestDropObjects.class
})
public class AllCanonicalTests {
diff --git a/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/TestDropObjects.java b/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/TestDropObjects.java new file mode 100644 index 00000000000..398e1ace59c --- /dev/null +++ b/tests/junit/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.activity.tests/src/org/eclipse/papyrus/uml/diagram/activity/tests/canonical/TestDropObjects.java @@ -0,0 +1,193 @@ +package org.eclipse.papyrus.uml.diagram.activity.tests.canonical; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.List; + +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.gef.RequestConstants; +import org.eclipse.gef.commands.Command; +import org.eclipse.gef.requests.GroupRequest; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequestFactory; +import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest; +import org.eclipse.gmf.runtime.emf.type.core.IElementType; +import org.eclipse.gmf.tooling.runtime.update.DiagramUpdater; +import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActivityActivityContentCompartmentEditPart; +import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActivityEditPart; +import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ExpansionNodeAsInEditPart; +import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ExpansionRegionEditPart; +import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ExpansionRegionStructuredActivityNodeContentCompartmentEditPart; +import org.eclipse.papyrus.uml.diagram.activity.part.UMLDiagramUpdater; +import org.eclipse.papyrus.uml.diagram.activity.part.UMLVisualIDRegistry; +import org.eclipse.papyrus.uml.diagram.activity.providers.UMLElementTypes; +import org.eclipse.papyrus.uml.diagram.activity.tests.IActivityDiagramTestsConstants; +import org.junit.Test; + +/** + * Testing drop action. + */ +public class TestDropObjects extends AbstractPapyrusTestCase { + + @Override + protected String getProjectName() { + return IActivityDiagramTestsConstants.PROJECT_NAME; + } + + @Override + protected String getFileName() { + return IActivityDiagramTestsConstants.FILE_NAME; + } + + public DiagramUpdater getDiagramUpdater() { + return UMLDiagramUpdater.TYPED_INSTANCE; + } + + /** + * create childNodeEditPart in parentEditPart + */ + protected IGraphicalEditPart createChild(int childVID, IGraphicalEditPart container) { + final IElementType childType = UMLElementTypes.getElementType(childVID); + final CreateViewRequest requestcreation = CreateViewRequestFactory.getCreateShapeRequest(childType, container.getDiagramPreferencesHint()); + requestcreation.setSize(new Dimension(1, 1)); + requestcreation.setLocation(new Point(10, 10)); + Command cmd = container.getCommand(requestcreation); + executeOnUIThread(cmd); + return findChildBySemanticHint(container, childVID); + } + + private IGraphicalEditPart findChildBySemanticHint(IGraphicalEditPart parent, int vid) { + IGraphicalEditPart childEP = parent.getChildBySemanticHint(Integer.toString(vid)); + assertNotNull("Parent " + parent + ", type " + parent.getNotationView() + " looking for: " + vid, childEP); + return childEP; + } + + protected IGraphicalEditPart getActivityCompartmentEditPart() { + IGraphicalEditPart activityEP = findChildBySemanticHint(getDiagramEditPart(), ActivityEditPart.VISUAL_ID); + return findChildBySemanticHint(activityEP, ActivityActivityContentCompartmentEditPart.VISUAL_ID); + } + + @Test + public void testExpansionNodeInExpansionRegionCompartment() throws Exception { + IGraphicalEditPart regionEP = createChild(ExpansionRegionEditPart.VISUAL_ID, getActivityCompartmentEditPart()); + IGraphicalEditPart regionCompartmentEP = findChildBySemanticHint(regionEP, ExpansionRegionStructuredActivityNodeContentCompartmentEditPart.VISUAL_ID); + IGraphicalEditPart expansionNode = createChild(ExpansionNodeAsInEditPart.VISUAL_ID, regionEP); + + DropObjectSequence dropSeq = new DropObjectSequence(expansionNode, regionEP, regionCompartmentEP); + dropSeq.doSequence(); + } + + /** + * Sequence for manage and testing drop object action + * + */ + public class DropObjectSequence { + + private final IGraphicalEditPart myChild; + + private final IGraphicalEditPart myParent; + + private final IGraphicalEditPart myDropParent; + + public DropObjectSequence(IGraphicalEditPart childEP, IGraphicalEditPart parentEP, IGraphicalEditPart dropParent) { + assertNotNull(childEP); + assertNotNull(parentEP); + assertNotNull(dropParent); + + myChild = childEP; + myParent = parentEP; + myDropParent = dropParent; + + assertNotEquals(myChild, myParent); + assertNotEquals(myChild, myDropParent); + } + + public void doSequence() { + testBeforeRemoveView(); + EObject objectToDrop = doHideChild(); + testHide(); + IGraphicalEditPart newGrapticalChild = doDrop(objectToDrop); + testDrop(newGrapticalChild); + } + + protected void testBeforeRemoveView() { + testGraphicalEditParts((IGraphicalEditPart)getChildEP().getParent(), getParentEP()); + + EObject childObject = getChildEP().resolveSemanticElement(); + EObject parentObject = getParentEP().resolveSemanticElement(); + + testSemantic(parentObject, childObject.eContainer()); + } + + protected EObject doHideChild() { + EObject result = getChildEP().resolveSemanticElement(); + Command deleteChild = getChildEP().getCommand(new GroupRequest(RequestConstants.REQ_DELETE)); + assertTrue(deleteChild.canExecute()); + executeOnUIThread(deleteChild); + return result; + } + + protected void testHide() { + List<?> childrenAfterHide = getParentEP().getChildren(); + for (Object child : childrenAfterHide) { + assertNotEquals(child, getChildEP()); + } + } + + private int getChildVID() { + return UMLVisualIDRegistry.getVisualID(getChildEP().getNotationView()); + } + + protected IGraphicalEditPart doDrop(EObject objectToDrop) { + DropObjectsRequest req = createRequest(objectToDrop); + Command dropCommand = myDropParent.getCommand(req); + assertTrue(dropCommand.canExecute()); + executeOnUIThread(dropCommand); + return findChildBySemanticHint(getParentEP(), getChildVID()); + } + + private DropObjectsRequest createRequest(EObject objectToDrop) { + DropObjectsRequest result = new DropObjectsRequest(); + result.setObjects(Arrays.asList(objectToDrop)); + result.setType(org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants.REQ_DROP_OBJECTS); + result.setLocation(new Point(1, 1)); + return result; + } + + protected void testDrop(IGraphicalEditPart childEP) { + testGraphicalEditParts((IGraphicalEditPart)childEP.getParent(), getParentEP()); + + EObject childObject = childEP.resolveSemanticElement(); + EObject parentObject = getParentEP().resolveSemanticElement(); + + testSemantic(parentObject, childObject.eContainer()); + } + + public final IGraphicalEditPart getChildEP() { + return myChild; + } + + public final IGraphicalEditPart getParentEP() { + return myParent; + } + + public final IGraphicalEditPart getDropParentEP() { + return myDropParent; + } + + protected void testSemantic(EObject parent, EObject expected) { + assertEquals(parent, expected); + } + + protected void testGraphicalEditParts(IGraphicalEditPart parent, IGraphicalEditPart expected) { + assertEquals(parent, expected); + } + } +} |