From 34cb19097092e85f10ee32a059db9eb5e2cabc98 Mon Sep 17 00:00:00 2001 From: Florian Hoelzl <hoelzl@fortiss.org> Date: Mon, 24 Feb 2020 12:59:54 +0100 Subject: [PATCH] Kernel: LWFXEF is accepting DND from model elements view. Issue-Ref: 3921 Issue-Url: https://af3-developer.fortiss.org/issues/3907 Signed-off-by: Florian Hoelzl <hoelzl@fortiss.org> --- .../base/ui/editor/fx/controller/.ratings | 2 +- .../controller/EObjectDiagramController.java | 6 +- .../fortiss/tooling/base/ui/utils/.ratings | 2 +- .../tooling/base/ui/utils/FXDNDUtils.java | 80 +++++++++++++++---- .../ui/javafx/control/treetableview/.ratings | 2 +- .../treetableview/DynamicTreeViewer.java | 4 - .../tooling/common/ui/javafx/lwfxef/.ratings | 2 +- .../common/ui/javafx/lwfxef/MouseState.java | 11 ++- .../tooling/kernel/ui/extension/base/.ratings | 2 +- .../ui/extension/base/FXEditorBase.java | 1 - 10 files changed, 81 insertions(+), 31 deletions(-) diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings index 9519e4321..99dfa79fb 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings @@ -1,6 +1,6 @@ ContextMenuUtil.java 405387151d45b09dffb3b6ba44f980313c8edcaf GREEN CurvedLinkLayoutedContentAnchorangeController.java 67c20e31ddb82fe2fd499117193353b0545839a0 GREEN -EObjectDiagramController.java a34479522e68cd5f6dc64ca322eab3a56a95602a YELLOW +EObjectDiagramController.java 2b253941592ee25ead95223470f983f23ef9776f YELLOW EObjectEllipticResizableContentControllerBase.java 3494d4f0dcdff5eb35f22f0e21d04df81b32e494 GREEN EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN EObjectRectangularResizableContentControllerBase.java f4a967591a60fadb20550ec3eaabccf240c9ec0d GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java index a34479522..2b2539415 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java @@ -91,12 +91,14 @@ public class EObjectDiagramController<T extends EObject> extends ControllerBase /** {@inheritDoc} */ @Override public boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation) { - return canCompose(db, diagramLocation, getModelElement()); + double zoom = getViewer().getFeatures().getCurrentZoomFactor(); + return canCompose(db, diagramLocation, getModelElement(), true, zoom); } /** {@inheritDoc} */ @Override public boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation) { - return compose(db, diagramLocation, getModelElement()); + double zoom = getViewer().getFeatures().getCurrentZoomFactor(); + return compose(db, diagramLocation, getModelElement(), true, zoom); } } diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings index 64b02a527..5397e6bd6 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings @@ -2,7 +2,7 @@ AbstractNameEditingSupport.java c57336a0e0da18711a1610ca667dfea76728807f GREEN ActionUtils.java 322f43d4f92f992daef8ac88eb0f9197c840c89b GREEN DragAndDropBaseUtils.java d375377f9124f6113b2a295e6b0e09ac8966e564 GREEN EllipseLayoutUIUtils.java 4dd9dbd96a45e8c455c019caa19e4a50f18336af GREEN -FXDNDUtils.java 5572358a950e932a65dfa053ca02e2fbbef5568e RED +FXDNDUtils.java 6ce94e239e68f9e2b3cc0524b072606f4a120076 YELLOW FontUtils.java a167a05bdaa8da9853705cc5134f30f6d81bc9f2 GREEN GCStateManager.java 983973a92376b5c757c1253b32e33d0666ccdf7b GREEN LWFXEditorUtils.java c624d3f0f6487b6d426b168dad048b2c39e71114 GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/FXDNDUtils.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/FXDNDUtils.java index 5572358a9..6ce94e239 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/FXDNDUtils.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/FXDNDUtils.java @@ -15,9 +15,12 @@ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.base.ui.utils; +import static org.fortiss.tooling.base.utils.LayoutModelElementFactory.createPoint; import static org.fortiss.tooling.kernel.service.IPrototypeService.PROTOTYPE_DATA_FORMAT; import org.eclipse.emf.ecore.EObject; +import org.fortiss.tooling.base.dnd.ElementDropContext; +import org.fortiss.tooling.base.model.layout.Point; import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramCoordinate; import org.fortiss.tooling.kernel.extension.data.Prototype; import org.fortiss.tooling.kernel.service.ICommandStackService; @@ -33,42 +36,85 @@ import javafx.scene.input.Dragboard; */ public final class FXDNDUtils { /** Returns whether element composition can be done via {@link IElementCompositorService}. */ - public static boolean canCompose(Dragboard db, DiagramCoordinate location, EObject container) { + public static boolean canCompose(Dragboard db, EObject container) { Prototype proto = extractPrototype(db); if(proto != null) { - // FIXME: location return IElementCompositorService.getInstance().canCompose(container, proto.getPrototypeCopy(), null); } return false; } - /** Extracts the prototype from the dragboard. */ - private static Prototype extractPrototype(Dragboard db) { - Object data = db.getContent(PROTOTYPE_DATA_FORMAT); - if(data instanceof String) { - return IPrototypeService.getInstance().getPrototypeByUniqueID((String)data); + /** Returns whether element composition can be done via {@link IElementCompositorService}. */ + public static boolean canCompose(Dragboard db, DiagramCoordinate location, EObject container, + boolean isRootContainer, double zoom) { + Prototype proto = extractPrototype(db); + if(proto != null) { + ElementDropContext ctx = + createElementDropContext(location, container, isRootContainer, zoom); + return IElementCompositorService.getInstance().canCompose(container, + proto.getPrototypeCopy(), ctx); } - return null; + return false; } /** Composes the elements using {@link IElementCompositorService}. */ - public static boolean compose(Dragboard db, DiagramCoordinate location, EObject container) { + public static boolean compose(Dragboard db, EObject container) { Prototype proto = extractPrototype(db); if(proto != null) { - IElementCompositorService ecs = IElementCompositorService.getInstance(); EObject copy = proto.getPrototypeCopy(); - if(ecs.canCompose(container, copy, null)) { - // FIXME: location - ICommandStackService.getInstance().runAsCommand(container, () -> { - ecs.compose(container, copy, null); - }); - return true; - } + return doElementComposition(container, copy, null); } return false; } + /** + * Composes the elements using {@link IElementCompositorService} creating an + * {@link ElementDropContext} for the given location, root element, and zoom factor. + */ + public static boolean compose(Dragboard db, DiagramCoordinate location, EObject container, + boolean isRootContainer, double zoom) { + Prototype proto = extractPrototype(db); + if(proto != null) { + EObject copy = proto.getPrototypeCopy(); + ElementDropContext ctx = + createElementDropContext(location, container, isRootContainer, zoom); + return doElementComposition(container, copy, ctx); + } + return false; + } + + /** Delegates to {@link IElementCompositorService} in order to compose the elements. */ + private static boolean doElementComposition(EObject container, EObject contained, + ElementDropContext context) { + IElementCompositorService ecs = IElementCompositorService.getInstance(); + if(ecs.canCompose(container, contained, context)) { + ICommandStackService.getInstance().runAsCommand(container, () -> { + ecs.compose(container, contained, context); + }); + return true; + } + return false; + } + + /** Creates the {@link ElementDropContext} containing the drop location. */ + private static ElementDropContext createElementDropContext(DiagramCoordinate location, + EObject container, boolean isRootContainer, double zoom) { + Point dcLocation = createPoint((int)location.getX(), (int)location.getY(), ""); + ElementDropContext ctx = + new ElementDropContext(container, dcLocation, isRootContainer, zoom); + return ctx; + } + + /** Extracts the prototype from the dragboard. */ + private static Prototype extractPrototype(Dragboard db) { + Object data = db.getContent(PROTOTYPE_DATA_FORMAT); + if(data instanceof String) { + return IPrototypeService.getInstance().getPrototypeByUniqueID((String)data); + } + return null; + } + /** Constructor. */ private FXDNDUtils() { // prevent instantiation diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings index 862569d00..fa2a42288 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings @@ -3,6 +3,6 @@ DynamicTreeItem.java 75dc5534b119ffdb3c10a65810c2a0f330b7955e GREEN DynamicTreeTableUIProviderBase.java 75ddf3e91c08fd6a5853ab261593040d1039d774 YELLOW DynamicTreeTableViewer.java 7d35586715715a2b2b29bac37913480b18ca00d2 YELLOW DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece YELLOW -DynamicTreeViewer.java ff43fff033e81c7eded44baab16e5a5a05b26213 YELLOW +DynamicTreeViewer.java 4f17aa4279b6403d3a90ac8547fa86de780fc0ac YELLOW DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java index ff43fff03..4f17aa427 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java @@ -146,15 +146,11 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> { dragDetected(evt, this, item); }); this.setOnDragOver(evt -> { - System.out.println("Over " + item.toString()); dragOver(evt, item); }); this.setOnDragDropped(evt -> { dragDropped(evt, item); }); - this.setOnDragExited(evt -> { - System.out.println("Exited " + item.toString()); - }); } else { this.setText(null); this.setGraphic(null); diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings index f455fa32c..d865ad8ab 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings @@ -8,5 +8,5 @@ EDragGesture.java 5cfa098d3877db11981c2750e5e103156d62fc5e GREEN FeedbackChange.java b088fa89af648f1674f2f9c1f7f99d585ce801ca GREEN GridCanvasVisual.java 734027d56af342cd01ff445ba9347b8dbb6c83c2 GREEN MVCBundleManager.java 2b4ab114c55b30a3d98d7135458f8f3ddd244d58 GREEN -MouseState.java 793fbc9628bb96c3359a3c496d3cc94f5ec2585d YELLOW +MouseState.java 3d9993f799d5d74bc74ac03b46e4a1857c4d267e YELLOW SVGExporter.java 2211f06d81c7b0523ae52dc832410a76875a9e07 GREEN diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/MouseState.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/MouseState.java index 793fbc962..3d9993f79 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/MouseState.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/MouseState.java @@ -35,6 +35,7 @@ import javafx.scene.input.DragEvent; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; +import javafx.scene.input.TransferMode; /** * Class for monitoring mouse operations including clicking, dragging and linking @@ -339,7 +340,10 @@ public final class MouseState { lastMouseLocation = viewer.convertEventToDiagramCoordinates(event.getX(), event.getY(), source); if(ctrl != null) { - ctrl.handleExternalDNDDragOver(event.getDragboard(), lastMouseLocation); + if(ctrl.handleExternalDNDDragOver(event.getDragboard(), lastMouseLocation)) { + event.acceptTransferModes(TransferMode.ANY); + event.consume(); + } } } }; @@ -358,7 +362,10 @@ public final class MouseState { lastMouseLocation = viewer.convertEventToDiagramCoordinates(event.getX(), event.getY(), source); if(ctrl != null) { - ctrl.handleExternalDNDDrop(event.getDragboard(), lastMouseLocation); + if(ctrl.handleExternalDNDDrop(event.getDragboard(), lastMouseLocation)) { + event.setDropCompleted(true); + event.consume(); + } } } }; diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings index b57e572dd..31a38c967 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings @@ -4,7 +4,7 @@ EObjectActionBase.java 4ef9f8be59e64d4838acc9e268d418ba5d94fa1a GREEN EReferenceListPropertySectionBase.java 7390dd7bfdc979e8ff0c5c30c67ab7b6c9d70c92 GREEN EReferencePropertySectionBase.java 0548da6778516003257f59d0b4c2b60d458be3b6 GREEN EditorBase.java 9c09fff92945256bb8680992ae7bb2c78f47b150 GREEN -FXEditorBase.java 545085c3270f09d69b609f328792e904ebda23ff GREEN +FXEditorBase.java 40caf638c7b4c02da5aece0d9d58883bce630e76 YELLOW IListPropertySection.java 8bb00fe7959583e794ff9437b7a77404c9a9e70f GREEN LWFXEFEditorBase.java f6b160b700a0287021402b5702beb2bfdce3dc2e GREEN ModelEditorBindingBase.java b9b1a1c5a48a6e677d1f57ad55a6126d9703c4b5 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java index 545085c32..40caf638c 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java @@ -47,7 +47,6 @@ public abstract class FXEditorBase<T extends EObject> extends EditorBase<T> FXCanvas canvas = new FXCanvas(parent, SWT.NONE); Scene scene = new Scene(createSceneRoot()); canvas.setScene(scene); - getSite().setSelectionProvider(this); } -- GitLab