Bug 427186 - Connections not visible when modeling a sub-process using
push down
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/ConnectionRoute.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/ConnectionRoute.java
index e8a159d..ecc7458 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/ConnectionRoute.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/ConnectionRoute.java
@@ -214,15 +214,10 @@
 							// TODO: figure out why connection crossing detection isn't working!
 //							i = o1.crossings.size() - o2.crossings.size();
 							if (i==0) {
-								i = o1.getLength() - o2.getLength();
-//								int m = Math.max(o1.getLength(), o2.getLength());
-//								double r = 0;
-//								if (m>0)
-//									r = (double)Math.abs(i)/(double)m;
-//								if (r<0.2 )
+								i = o1.getPoints().size() - o2.getPoints().size();
 								if (i==0)
 								{
-									i = o1.getPoints().size() - o2.getPoints().size();
+									i = o1.getLength() - o2.getLength();
 //									if (i==0) {
 //										BoundaryAnchor ba1 = AnchorUtil.findNearestBoundaryAnchor(source, o1.get(0));
 //										BoundaryAnchor ba2 = AnchorUtil.findNearestBoundaryAnchor(source, o2.get(0));
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ShapeLayoutManager.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ShapeLayoutManager.java
index def6fce..7fb2514 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ShapeLayoutManager.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ShapeLayoutManager.java
@@ -204,9 +204,9 @@
 		}
 
 		// TODO: remove this temporary hack to fix Manhattan Router issue
-		for (ContainerShape child : childShapes) {
-			FeatureSupport.updateConnections(editor.getDiagramTypeProvider().getFeatureProvider(), child);
-		}
+//		for (ContainerShape child : childShapes) {
+//			FeatureSupport.updateConnections(editor.getDiagramTypeProvider().getFeatureProvider(), child);
+//		}
 	}
 
 	private void stackShapes(ContainerShape container, List<ContainerShape> unconnectedShapes) {
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/ConnectionLayerClippingStrategy.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/ConnectionLayerClippingStrategy.java
index 744f6ca..81643ea 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/ConnectionLayerClippingStrategy.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/ConnectionLayerClippingStrategy.java
@@ -13,6 +13,8 @@
 import org.eclipse.bpmn2.BaseElement;
 import org.eclipse.bpmn2.MessageFlow;
 import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNEdge;
+import org.eclipse.bpmn2.di.BPMNShape;
 import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
 import org.eclipse.bpmn2.modeler.ui.features.flow.MessageFlowFeatureContainer;
 import org.eclipse.draw2d.Figure;
@@ -80,16 +82,25 @@
 					else if (businessObject!=null) {
 						EObject container = businessObject.eContainer();
 						if (container instanceof SubProcess) {
-							for (PictogramElement pe : Graphiti.getLinkService().getPictogramElements(diagram, container)) {
-								if (pe instanceof ContainerShape) {
-									// don't clip connection if the source or target is this SubProcess
-									EObject sourceBo = BusinessObjectUtil.getFirstBaseElement(source);
-									EObject targetBo = BusinessObjectUtil.getFirstBaseElement(target);
-									if (sourceBo!=container && targetBo!=container)
-										return getClip((ContainerShape)pe);
+							// don't clip if contents of SubProcess have been moved to a different
+							// BPMNDiagram ("pushed down")
+							BPMNEdge bpmnEdge = BusinessObjectUtil.getFirstElementOfType(connection, BPMNEdge.class);
+							if (bpmnEdge!=null) {
+								for (PictogramElement pe : Graphiti.getLinkService().getPictogramElements(diagram, container)) {
+									if (pe instanceof ContainerShape) {
+										BPMNShape bpmnShape = BusinessObjectUtil.getFirstElementOfType(pe, BPMNShape.class);
+										if (bpmnShape!=null) {
+											if (bpmnShape.eContainer()!=bpmnEdge.eContainer())
+												continue;
+										}
+										// don't clip connection if the source or target is this SubProcess
+										EObject sourceBo = BusinessObjectUtil.getFirstBaseElement(source);
+										EObject targetBo = BusinessObjectUtil.getFirstBaseElement(target);
+										if (sourceBo!=container && targetBo!=container)
+											return getClip((ContainerShape)pe);
+									}
 								}
-							}
-							
+							}								
 						}
 					}
 				}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/PushdownFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/PushdownFeature.java
index 2eef905..f7a01bb 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/PushdownFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/PushdownFeature.java
@@ -29,6 +29,7 @@
 import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
 import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
 import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
 import org.eclipse.bpmn2.modeler.ui.ImageProvider;
 import org.eclipse.bpmn2.modeler.ui.features.choreography.ChoreographyUtil;
 import org.eclipse.dd.di.DiagramElement;
@@ -44,6 +45,7 @@
 import org.eclipse.graphiti.mm.algorithms.styles.Point;
 import org.eclipse.graphiti.mm.algorithms.styles.Style;
 import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
 import org.eclipse.graphiti.mm.pictograms.ContainerShape;
 import org.eclipse.graphiti.mm.pictograms.Diagram;
 import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
@@ -149,6 +151,7 @@
 
 		Diagram newDiagram = DIUtils.getOrCreateDiagram(getDiagramBehavior(), newBpmnDiagram);
 		ILocation loc = Graphiti.getLayoutService().getLocationRelativeToDiagram(shape);
+		List <EObject> moved = new ArrayList<EObject>();
 		
 		for (FlowElement fe : container.getFlowElements()) {
 			DiagramElement de = DIUtils.findDiagramElement(fe);
@@ -158,10 +161,13 @@
 			newPlane.getPlaneElement().add(de);
 			
 			List <PictogramElement> pes = Graphiti.getLinkService().getPictogramElements(oldDiagram, fe);
-			List <EObject> moved = new ArrayList<EObject>();
 			for (PictogramElement pe : pes) {
 				PictogramElement pictogramElement = null;
-				if (pe instanceof Shape) {
+				if (pe instanceof ConnectionDecorator) {
+					// this will be moved as part of the connection
+					continue;
+				}
+				else if (pe instanceof Shape) {
 					if (BusinessObjectUtil.getFirstElementOfType(pe, BPMNShape.class)!=null) {
 						newDiagram.getChildren().add((Shape)pe);
 						pictogramElement = pe;
@@ -193,26 +199,26 @@
 							newDiagram.getPictogramLinks().add((PictogramLink)o);
 							moved.add(o);
 						}
-						else if (o instanceof Color) {
-							newDiagram.getColors().add((Color)o);
-							moved.add(o);
-						}
-						else if (o instanceof Font) {
-							newDiagram.getFonts().add((Font)o);
-							moved.add(o);
-						}
-						else if (o instanceof Style) {
-							newDiagram.getStyles().add((Style)o);
-							moved.add(o);
-						}
+//						else if (o instanceof Color) {
+//							newDiagram.getColors().add((Color)o);
+//							moved.add(o);
+//						}
+//						else if (o instanceof Font) {
+//							newDiagram.getFonts().add((Font)o);
+//							moved.add(o);
+//						}
+//						else if (o instanceof Style) {
+//							newDiagram.getStyles().add((Style)o);
+//							moved.add(o);
+//						}
 					}
 				}
 			}
-			oldDiagram.getPictogramLinks().removeAll(moved);
-			oldDiagram.getColors().removeAll(moved);
-			oldDiagram.getFonts().removeAll(moved);
-			oldDiagram.getStyles().removeAll(moved);
 		}
+		oldDiagram.getPictogramLinks().removeAll(moved);
+//		oldDiagram.getColors().removeAll(moved);
+//		oldDiagram.getFonts().removeAll(moved);
+//		oldDiagram.getStyles().removeAll(moved);
 
 		// collapse the sub process
 		if (AbstractExpandableActivityFeatureContainer.isExpandableElement(container)) {