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());
+ }
}