[573272] Fixed drag and drop problem with broken connections

Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=573272
Change-Id: Ia5165842e4d03509b181c67f4c76c5b1e67330e9
diff --git a/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/policies/FBAddToSubAppLayoutEditPolicy.java b/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/policies/FBAddToSubAppLayoutEditPolicy.java
index 3581c83..d0ea867 100644
--- a/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/policies/FBAddToSubAppLayoutEditPolicy.java
+++ b/plugins/org.eclipse.fordiac.ide.application/src/org/eclipse/fordiac/ide/application/policies/FBAddToSubAppLayoutEditPolicy.java
@@ -1,6 +1,7 @@
 /*******************************************************************************
  * Copyright (c) 2013, 2016 AIT, fortiss GmbH
  * 				 2018 Johannes Kepler University
+ * 				 2021 Primetals Technologies Austria GmbH
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License 2.0 which is available at
@@ -13,6 +14,8 @@
  *     - initial API and implementation and/or initial documentation
  *   Alois Zoitl - Reworked this policy to confirm to latest model and to readd
  *                 the AddtoSubapp functionality.
+ *   Michael Oberlehner, Lukas Wais
+ *   	- implemented drag and drop, added move to parent
  *******************************************************************************/
 package org.eclipse.fordiac.ide.application.policies;
 
@@ -49,39 +52,40 @@
 
 		if (isDragAndDropRequestFromSubAppToSubApp(request, getTargetEditPart(request))) {
 			final List editParts = ((ChangeBoundsRequest) request).getEditParts();
-
+			final SubAppForFBNetworkEditPart dropEditPart = (SubAppForFBNetworkEditPart) getTargetEditPart(request);
 			final CompoundCommand commandos = new CompoundCommand();
 			for (final Object editPart : editParts) {
 				if (((editPart instanceof EditPart)
 						&& (((EditPart) editPart).getModel() instanceof FBNetworkElement))) {
 					final FBNetworkElement dragEditPartModel = (FBNetworkElement) ((EditPart) editPart).getModel();
-					final SubAppForFBNetworkEditPart dropEditPart = (SubAppForFBNetworkEditPart) getTargetEditPart(
-							request);
+
 					if (dragEditPartModel.isNestedInSubApp()
 							&& isChildFromDropTarget(dragEditPartModel, dropEditPart)) {
 						final Rectangle bounds = getOuterSubappEditPart(editPart).getFigure().getBounds();
-						commandos.add(new MoveElementFromSubAppCommand(dragEditPartModel,
-								bounds, MoveOperation.DRAG_AND_DROP_TO_SUBAPP));
-					} else {
-						commandos.add(new AddElementsToSubAppCommand(dropEditPart.getModel(), editParts));
+						commandos.add(new MoveElementFromSubAppCommand(dragEditPartModel, bounds,
+								MoveOperation.DRAG_AND_DROP_TO_SUBAPP));
 					}
 				}
 			}
-			return commandos;
 
+			if (commandos.isEmpty()) {
+				return new AddElementsToSubAppCommand(dropEditPart.getModel(), editParts);
+			}
+			return commandos;
 		}
 		return super.getAddCommand(request);
 	}
 
-	private SubAppForFBNetworkEditPart getOuterSubappEditPart(final Object editPart) {
+	private static SubAppForFBNetworkEditPart getOuterSubappEditPart(final Object editPart) {
 		return (SubAppForFBNetworkEditPart) ((AbstractFBNElementEditPart) editPart).getParent().getParent();
 	}
 
-	public boolean isDragAndDropRequestFromSubAppToSubApp(Request generic, EditPart targetEditPart) {
+	public static boolean isDragAndDropRequestFromSubAppToSubApp(Request generic, EditPart targetEditPart) {
 		return (generic instanceof ChangeBoundsRequest) && (targetEditPart instanceof SubAppForFBNetworkEditPart);
 	}
 
-	private boolean isChildFromDropTarget(FBNetworkElement dragEditPartModel, SubAppForFBNetworkEditPart dropEditPart) {
+	private static boolean isChildFromDropTarget(FBNetworkElement dragEditPartModel,
+			SubAppForFBNetworkEditPart dropEditPart) {
 		if ((dragEditPartModel.getOuterFBNetworkElement() == null)
 				|| (dragEditPartModel.getOuterFBNetworkElement().getOuterFBNetworkElement() == null)) {
 			return false;