Merge "Build engineering for variability (17)"
diff --git a/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/EdgeActionEditPart.java b/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/EdgeActionEditPart.java
index f051976..9dcb87c 100644
--- a/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/EdgeActionEditPart.java
+++ b/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/EdgeActionEditPart.java
@@ -588,7 +588,7 @@
 	}
 
 	/**
-	 * @generated
+	 * @generated NOT
 	 */
 	protected void handleNotificationEvent(Notification event) {
 		Object feature = event.getFeature();
@@ -619,6 +619,10 @@
 				}
 			}
 		}
+		if (event.getEventType() == Notification.SET) {
+			getParent().refresh();
+			refreshVisuals();
+		}
 		super.handleNotificationEvent(event);
 	}
 
diff --git a/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/NodeActionEditPart.java b/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/NodeActionEditPart.java
index 66f0986..7f2a7ac 100644
--- a/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/NodeActionEditPart.java
+++ b/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/parts/NodeActionEditPart.java
@@ -588,7 +588,7 @@
 	}
 
 	/**
-	 * @generated
+	 * @generated NOT
 	 */
 	protected void handleNotificationEvent(Notification event) {
 		Object feature = event.getFeature();
@@ -619,6 +619,9 @@
 				}
 			}
 		}
+		if (event.getEventType() == Notification.SET) {
+			getParent().refresh();
+		}
 		super.handleNotificationEvent(event);
 	}
 
diff --git a/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/policies/UnitCompartmentCanonicalEditPolicy.java b/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/policies/UnitCompartmentCanonicalEditPolicy.java
index fb3c5f9..92bc490 100644
--- a/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/policies/UnitCompartmentCanonicalEditPolicy.java
+++ b/plugins/org.eclipse.emf.henshin.diagram/src/org/eclipse/emf/henshin/diagram/edit/policies/UnitCompartmentCanonicalEditPolicy.java
@@ -16,6 +16,7 @@
 import java.util.List;
 
 import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.henshin.diagram.edit.parts.InvocationEditPart;
@@ -23,6 +24,7 @@
 import org.eclipse.emf.henshin.diagram.part.HenshinNodeDescriptor;
 import org.eclipse.emf.henshin.diagram.part.HenshinVisualIDRegistry;
 import org.eclipse.emf.henshin.model.HenshinPackage;
+import org.eclipse.emf.henshin.model.Parameter;
 import org.eclipse.emf.henshin.model.Unit;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.commands.Command;
@@ -183,10 +185,42 @@
 			if (view.getElement() instanceof Unit && unitView.getElement() instanceof Unit) {
 				Unit unit = (Unit) unitView.getElement();
 				Unit subUnit = (Unit) view.getElement();
-				return !unit.getSubUnits(false).contains(subUnit);
+				EList<Unit> subUnits = unit.getSubUnits(false);
+				for(Unit sub : subUnits) {
+					boolean result = unitSignaturesIdentical(subUnit, sub);
+					if(result) {
+						return result;
+					}
+				}
 			}
 		}
 		return super.shouldDeleteView(view);
 	}
+	
+	/**
+	 * Checks whether the signatures of two Units are identical.
+	 * 
+	 * @param unit1
+	 * @param unit2
+	 * @return true, if the units have matching names and parameters.
+	 */
+	private boolean unitSignaturesIdentical(Unit unit1, Unit unit2) {
+		boolean result = false;
 
+		result = unit1.getName().equals(unit2.getName());
+		if (result) {
+			for (Parameter unit1Param : unit1.getParameters()) {
+				Parameter unit2Param = unit2.getParameter(unit1Param.getName());
+				result = result && unit2Param != null && isMatchingParameterType(unit1Param, unit2Param);
+				if(result) {
+					return result;
+				}
+			}
+		}
+		return result;
+	}
+	
+	private boolean isMatchingParameterType(Parameter param1, Parameter param2) {
+		return (param1.getType() == null && param2.getType() == null) || param1.getType().equals(param2.getType());
+	}
 }