Allow VisualEffectMappings's for LinkMappings - bridge and templates
diff --git a/plugins/org.eclipse.gmf.bridge/src/org/eclipse/gmf/internal/bridge/genmodel/DiagramGenModelTransformer.java b/plugins/org.eclipse.gmf.bridge/src/org/eclipse/gmf/internal/bridge/genmodel/DiagramGenModelTransformer.java
index d698526..36ae51d 100644
--- a/plugins/org.eclipse.gmf.bridge/src/org/eclipse/gmf/internal/bridge/genmodel/DiagramGenModelTransformer.java
+++ b/plugins/org.eclipse.gmf.bridge/src/org/eclipse/gmf/internal/bridge/genmodel/DiagramGenModelTransformer.java
@@ -589,8 +589,12 @@
 			genNode.getBehaviour().add(openDiagramPolicy);
 		}
 
+		createVisualEffects(mapping, genNode, mapping.getDiagramNode());
+	}
+
+	private void createVisualEffects(MappingEntry mapping, GenCommonBase genCommon, DiagramElement diagramElement) {
 		for (VisualEffectMapping visualEffectMapping : mapping.getVisualEffects()) {
-			createVisualEffect(genNode, visualEffectMapping);
+			createVisualEffect(genCommon, visualEffectMapping, diagramElement);
 		}
 	}
 
@@ -634,6 +638,8 @@
 		if (!rcp) {
 			myNavigatorProcessor.process(gl);
 		}
+
+		createVisualEffects(lme, gl, lme.getDiagramLink());
 	}
 
 	@Override
@@ -665,11 +671,11 @@
 		return label;
 	}
 
-	private void createVisualEffect(GenNode node, VisualEffectMapping mapping) {
+	private void createVisualEffect(GenCommonBase parent, VisualEffectMapping mapping, DiagramElement parentDiagramElement) {
 		addOclToolingPlugin();
-		
+
 		GenVisualEffect visualEffect = GMFGenFactory.eINSTANCE.createGenVisualEffect();
-		node.getBehaviour().add(visualEffect);
+		parent.getBehaviour().add(visualEffect);
 
 		Pin graphPin = mapping.getDiagramPin();
 
@@ -680,7 +686,7 @@
 
 		String operationName = graphPin.getOperationName();
 
-		FigureDescriptor graphFigureDescriptor = mapping.getParentNode().getDiagramNode().getFigure();
+		FigureDescriptor graphFigureDescriptor = parentDiagramElement.getFigure();
 
 		if (!hasFigurePin(graphFigureDescriptor.getActualFigure(), graphPin)) {
 			for (ChildAccess graphChildAccess : graphFigureDescriptor.getAccessors()) {
@@ -695,8 +701,8 @@
 		visualEffect.setOperationType(graphPin.getOperationType());
 		visualEffect.setOclExpression(mapping.getOclExpression());
 
-		String editPolicyQualifiedClassName = node.getDiagram().getEditPoliciesPackageName() + '.'//
-				+ CodeGenUtil.capName(CodeGenUtil.validJavaIdentifier(name)) + node.getVisualID() //
+		String editPolicyQualifiedClassName = parent.getDiagram().getEditPoliciesPackageName() + '.'//
+				+ CodeGenUtil.capName(CodeGenUtil.validJavaIdentifier(name)) + parent.getVisualID() //
 				+ "Policy";
 
 		visualEffect.setEditPolicyQualifiedClassName(editPolicyQualifiedClassName);
@@ -709,9 +715,9 @@
 				: (RealFigure) figure;
 		return realFigure.getPins().contains(pin);
 	}
-	
+
 	private void addOclToolingPlugin() {
-		final String pluginId = "org.eclipse.gmf.tooling.runtime.ocl.expressions";
+		final String pluginId = "org.eclipse.gmf.tooling.runtime.ocl";
 		EList<String> reguiredPlugins = getGenEssence().getPlugin().getRequiredPlugins();
 		if (!reguiredPlugins.contains(pluginId)) {
 			reguiredPlugins.add(pluginId);
@@ -1065,7 +1071,7 @@
 	// XXX perhaps, combining #createValueExpression and #createGenConstraint into a single method makes sense?
 	private ValueExpression createValueExpression(org.eclipse.gmf.mappings.ValueExpression valueExpression) {
 		addOclToolingPlugin();
-		
+
 		if (valueExpression instanceof Constraint) {
 			return createGenConstraint((Constraint) valueExpression);
 		}
diff --git a/plugins/org.eclipse.gmf.codegen/src/org/eclipse/gmf/codegen/util/Generator.java b/plugins/org.eclipse.gmf.codegen/src/org/eclipse/gmf/codegen/util/Generator.java
index d81812b..cb58ac3 100644
--- a/plugins/org.eclipse.gmf.codegen/src/org/eclipse/gmf/codegen/util/Generator.java
+++ b/plugins/org.eclipse.gmf.codegen/src/org/eclipse/gmf/codegen/util/Generator.java
@@ -124,6 +124,7 @@
 			for (GenLinkLabel label : next.getLabels()) {
 				generateLinkLabelEditPart(label);
 			}
+			generateVisualEffectEditPolicies(next);
 		}
 		generateDiagram();
 		//
@@ -280,7 +281,11 @@
 				generateNodeLabelEditPart(label);
 			}
 		}
-		for (Behaviour behaviour : node.getBehaviour()) {
+		generateVisualEffectEditPolicies(node);
+	}
+	
+	private void generateVisualEffectEditPolicies(GenCommonBase commonBase) throws InterruptedException {
+		for (Behaviour behaviour : commonBase.getBehaviour()) {
 			if (behaviour instanceof GenVisualEffect) {
 				GenVisualEffect visualEffect = (GenVisualEffect) behaviour;
 				generateVisualEffectEditPolicy(visualEffect);
diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/diagram/editpolicies/VisualEffectEditPolicy.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/diagram/editpolicies/VisualEffectEditPolicy.xpt
index c3eb115..dad7df8 100644
--- a/plugins/org.eclipse.gmf.codegen/templates/xpt/diagram/editpolicies/VisualEffectEditPolicy.xpt
+++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/diagram/editpolicies/VisualEffectEditPolicy.xpt
@@ -1,8 +1,9 @@
 «IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'»

+«IMPORT 'http://www.eclipse.org/emf/2002/GenModel'»

 «IMPORT 'http://www.eclipse.org/emf/2002/Ecore'»

-«IMPORT 'http://www.eclipse.org/ocl/1.1.0/Ecore'»

 

 «EXTENSION xpt::diagram::Utils»

+«EXTENSION xpt::GenModelUtils»

 

 «DEFINE VisualEffectEditPolicy FOR gmfgen::GenVisualEffect-»

 «EXPAND xpt::Common::copyright FOR subject.getDiagram().editorGen-»

@@ -36,6 +37,8 @@
 	«EXPAND getHostImpl-»

 	

 	«EXPAND getExpressionBody-»

+	

+	«EXPAND getContext-»	

 «ENDDEFINE»

 

 «DEFINE setVisualEffectValue FOR gmfgen::GenVisualEffect-»

@@ -65,11 +68,43 @@
 «DEFINE getExpressionBody FOR gmfgen::GenVisualEffect-»

 	«EXPAND xpt::Common::generatedMemberComment»

 	@Override

-	protected String getExpressionBody() {

-		return «getOclExpressionString()»; «EXPAND xpt::Common::nonNLS»

+	protected String getExpressionBody() {	

+			return 

+	«IF subject.oclIsKindOf(gmfgen::GenLink)-»

+		«EXPAND expressionLinkEnds FOR subject.oclAsType(gmfgen::GenLink).modelFacet-»

+	«ENDIF-»   

+		       «getOclExpressionString()»; «EXPAND xpt::Common::nonNLS»

 	}

 «ENDDEFINE»

 

+«DEFINE expressionLinkEnds FOR gmfgen::LinkModelFacet»«ENDDEFINE»

+

+«DEFINE expressionLinkEnds FOR gmfgen::FeatureLinkModelFacet-»

+	«IF metaFeature.ecoreFeature.upperBound = 1-»

+		«EXPAND expressionLinkEnds('', '.'+metaFeature.ecoreFeature.name)-»

+	«ELSE-»	

+		«LET getReverse(metaFeature) AS reverseMetaFeature-»

+			«IF reverseMetaFeature <> null-»

+				«EXPAND expressionLinkEnds('.'+reverseMetaFeature.ecoreFeature.name, '')-»				

+			«ELSEIF metaFeature.ecoreFeature.oclAsType(ecore::EReference).containment-»

+				«EXPAND expressionLinkEnds('.oclAsType(ecore::EObject).eContainer().oclAsType('+getSourceType().ecoreClass.name+')', '')-»

+			«ELSE-»

+				/* unable to set up both link ends */			

+			«ENDIF-»

+		«ENDLET-»

+	«ENDIF-»	

+«ENDDEFINE»

+

+«DEFINE expressionLinkEnds FOR gmfgen::TypeLinkModelFacet-»

+	«EXPAND expressionLinkEnds('.'+sourceMetaFeature.ecoreFeature.name, '.'+targetMetaFeature.ecoreFeature.name)-»

+«ENDDEFINE»

+

+«DEFINE expressionLinkEnds(sourcePath : String, targetPath : String) FOR gmfgen::LinkModelFacet-»

+		" let _src : «getSourceType().ecoreClass.name» = self«sourcePath» in " //

+				+ " let _dst : «getTargetType().ecoreClass.name» = self«targetPath» in " //

+				+

+«ENDDEFINE»

+

 «DEFINE callOperation FOR gmfgen::GenVisualEffect-»

 getHostImpl().getPrimaryShape().«operationName-»

 «ENDDEFINE»

@@ -82,13 +117,6 @@
 	«ENDLET-»	

 «ENDDEFINE»

 

-«REM» 

-«DEFINE setVisualEffectValueOnVisiblePin FOR gmfgen::GenVisualEffect-»

-	«EXPAND setVisualEffectValueOfType(self) FOR getOperationRuntimeType()»

-	«EXPAND callOperation»((Boolean)value);	

-«ENDDEFINE»

-«ENDREM»

-

 «DEFINE setVisualEffectValueOnCustomPin FOR gmfgen::GenVisualEffect-»

 	«EXPAND setVisualEffectValueOfType(self) FOR getOperationRuntimeType()»

 «ENDDEFINE»

@@ -122,3 +150,64 @@
 	«ENDFOREACH-»

 «ENDDEFINE»

 

+«DEFINE getContext FOR gmfgen::GenVisualEffect-»

+	«IF subject.oclIsKindOf(gmfgen::GenLink)-»

+		«EXPAND getContext FOR subject.oclAsType(gmfgen::GenLink).modelFacet-»

+	«ENDIF-»

+«ENDDEFINE»

+

+«DEFINE getContext FOR gmfgen::LinkModelFacet»«ENDDEFINE»

+

+«DEFINE getContext FOR gmfgen::FeatureLinkModelFacet-»

+	«EXPAND xpt::Common::generatedMemberComment»

+	@Override

+	protected org.eclipse.emf.ecore.EObject getContext() {

+	«IF metaFeature.ecoreFeature.upperBound = 1-»

+		«EXPAND getContextBody('source', 'target', getSourceType(), getTargetType(), metaFeature)-»

+	«ELSE-»	

+		«LET getReverse(metaFeature) AS reverseMetaFeature-»

+			«IF reverseMetaFeature <> null or metaFeature.ecoreFeature.oclAsType(ecore::EReference).containment-»

+				«EXPAND getContextBody('target', 'source', getTargetType(), getSourceType(), reverseMetaFeature)-»

+			«ELSE-»

+				// unable to pass both link ends 

+				return null;			

+			«ENDIF-»

+		«ENDLET-»

+	«ENDIF-»	

+	}

+«ENDDEFINE»

+

+

+«DEFINE getContextBody(selfName : String, 

+					   oppositeName : String,

+					   selfType : genmodel::GenClass,

+					   oppositeType : genmodel::GenClass,

+					   selfFeature : genmodel::GenFeature) FOR gmfgen::FeatureLinkModelFacet-»

+		org.eclipse.gmf.runtime.notation.Edge hostModel = (org.eclipse.gmf.runtime.notation.Edge) host().getModel();

+		org.eclipse.gmf.runtime.notation.View targetModel = hostModel.getTarget();

+		org.eclipse.gmf.runtime.notation.View sourceModel = hostModel.getSource();

+

+		if (targetModel == null || sourceModel == null) { 

+			return null;

+		}

+

+		org.eclipse.emf.ecore.EObject «selfName»SemanticModel = org.eclipse.gmf.runtime.diagram.core.util.ViewUtil.resolveSemanticElement(«selfName»Model);

+		// need to check actual opposite of the semantic element, since diagram opposite could be not up to date

+		«REM»(selfFeature = null) if link is multiplicity containment without opposite«ENDREM-»

+		«IF selfFeature <> null-»		 

+			«EXPAND MetaModel::QualifiedClassName FOR selfType» «selfName»TypedModel = «EXPAND MetaModel::CastEObject(selfName + 'SemanticModel') FOR selfType»;

+		«ENDIF-»

+		org.eclipse.emf.ecore.EObject «oppositeName»SemanticModel =

+			«IF selfFeature <> null-»

+				«EXPAND MetaModel::getFeatureValue(selfName + 'TypedModel', oppositeType) FOR selfFeature»

+			«ELSE-»

+				«selfName»SemanticModel.eContainer()

+			«ENDIF-»

+		;				

+

+		if («oppositeName»SemanticModel == null) {

+			return null;

+		}

+

+		return «selfName»SemanticModel; 

+«ENDDEFINE»
\ No newline at end of file