From 4286d71381fc66526b77cd73f267737048dd6d2e Mon Sep 17 00:00:00 2001 From: Florian Hoelzl <hoelzl@fortiss.org> Date: Tue, 18 Feb 2020 15:35:43 +0100 Subject: [PATCH] Kernel: added DND utility class. 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 | 16 +++- .../fortiss/tooling/base/ui/utils/.ratings | 1 + .../tooling/base/ui/utils/FXDNDUtils.java | 76 +++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/FXDNDUtils.java 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 33125106f..9519e4321 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 9af59e8e586c8251d174108a2ce2fcdee5e75782 GREEN +EObjectDiagramController.java a34479522e68cd5f6dc64ca322eab3a56a95602a 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 9af59e8e5..a34479522 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 @@ -18,6 +18,8 @@ import static java.util.Objects.requireNonNull; import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createDisplayMenu; import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext; import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu; +import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.canCompose; +import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.compose; import java.util.List; @@ -33,6 +35,7 @@ import org.fortiss.tooling.kernel.ui.service.IContextMenuService; import javafx.scene.Node; import javafx.scene.control.MenuItem; +import javafx.scene.input.Dragboard; /** * Diagram controller that uses the {@link IElementCompositorService} to create context menu @@ -41,7 +44,6 @@ import javafx.scene.control.MenuItem; * @author hoelzl */ public class EObjectDiagramController<T extends EObject> extends ControllerBase { - /** The model change provider. */ private final EObjectModelChangeProvider modelChangeProvider; @@ -85,4 +87,16 @@ public class EObjectDiagramController<T extends EObject> extends ControllerBase result.add(createDisplayMenu(getViewer())); return result; } + + /** {@inheritDoc} */ + @Override + public boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation) { + return canCompose(db, diagramLocation, getModelElement()); + } + + /** {@inheritDoc} */ + @Override + public boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation) { + return compose(db, diagramLocation, getModelElement()); + } } 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 673e0fc65..64b02a527 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,6 +2,7 @@ AbstractNameEditingSupport.java c57336a0e0da18711a1610ca667dfea76728807f GREEN ActionUtils.java 322f43d4f92f992daef8ac88eb0f9197c840c89b GREEN DragAndDropBaseUtils.java d375377f9124f6113b2a295e6b0e09ac8966e564 GREEN EllipseLayoutUIUtils.java 4dd9dbd96a45e8c455c019caa19e4a50f18336af GREEN +FXDNDUtils.java 5572358a950e932a65dfa053ca02e2fbbef5568e RED 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 new file mode 100644 index 000000000..5572358a9 --- /dev/null +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/FXDNDUtils.java @@ -0,0 +1,76 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2020 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.tooling.base.ui.utils; + +import static org.fortiss.tooling.kernel.service.IPrototypeService.PROTOTYPE_DATA_FORMAT; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramCoordinate; +import org.fortiss.tooling.kernel.extension.data.Prototype; +import org.fortiss.tooling.kernel.service.ICommandStackService; +import org.fortiss.tooling.kernel.service.IElementCompositorService; +import org.fortiss.tooling.kernel.service.IPrototypeService; + +import javafx.scene.input.Dragboard; + +/** + * Utility methods for JavaFX drag-and-drop. + * + * @author hoelzl + */ +public final class FXDNDUtils { + /** Returns whether element composition can be done via {@link IElementCompositorService}. */ + public static boolean canCompose(Dragboard db, DiagramCoordinate location, 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); + } + return null; + } + + /** Composes the elements using {@link IElementCompositorService}. */ + public static boolean compose(Dragboard db, DiagramCoordinate location, 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 false; + } + + /** Constructor. */ + private FXDNDUtils() { + // prevent instantiation + } +} -- GitLab