aboutsummaryrefslogtreecommitdiffstatsci
path: root/src
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2016-12-21 10:45:51 +0100
committerjpbruyere <jp.bruyere@hotmail.com>2016-12-21 10:45:51 +0100
commitc382841870f704e28b473d73b7fbc9e57a4f678a (patch)
tree14f4bd979bee6725936f365d5529deeec68f4de8 /src
parent37199aaa7104294355cbc81ecd9088103b7d29be (diff)
use class BindingDefinition to store source and target data's
modifié : src/IML/BindingDefinition.cs modifié : src/IML/Context.cs modifié : src/Instantiator.cs
Diffstat (limited to 'src')
-rw-r--r--src/IML/BindingDefinition.cs14
-rw-r--r--src/IML/Context.cs5
-rw-r--r--src/Instantiator.cs58
3 files changed, 37 insertions, 40 deletions
diff --git a/src/IML/BindingDefinition.cs b/src/IML/BindingDefinition.cs
index dd76f183..e357fcac 100644
--- a/src/IML/BindingDefinition.cs
+++ b/src/IML/BindingDefinition.cs
@@ -27,14 +27,18 @@ namespace Crow.IML
/// </summary>
public class BindingDefinition
{
- public NodeAddress SourceNA;
- public string SourceMember;
- public NodeAddress TargetNA;
- public string TargetMember;
- public string TargetName;
+ public NodeAddress SourceNA = null;
+ public string SourceMember = "";
+ public NodeAddress TargetNA = null;
+ public string TargetMember = "";
+ public string TargetName = "";
public bool TwoWay = false;
#region CTOR
+ public BindingDefinition (NodeAddress _sourceNA, string _sourceMember){
+ SourceNA = _sourceNA;
+ SourceMember = _sourceMember;
+ }
public BindingDefinition (NodeAddress _sourceNA, string _sourceMember, NodeAddress _targetNA, string _targetMember, string _targetName = "", bool _twoWay = false)
{
SourceNA = _sourceNA;
diff --git a/src/IML/Context.cs b/src/IML/Context.cs
index 4c664700..09329e1b 100644
--- a/src/IML/Context.cs
+++ b/src/IML/Context.cs
@@ -85,6 +85,11 @@ namespace Crow.IML
nodeBindings [origMember] = new List<MemberAddress> ();
nodeBindings [origMember].Add (new MemberAddress (destNA, destMember));
}
+ public void StorePropertyBinding(BindingDefinition bindDef){
+ StorePropertyBinding (bindDef.TargetNA, bindDef.TargetMember, bindDef.SourceNA, bindDef.SourceMember);
+ if (bindDef.TwoWay)
+ StorePropertyBinding (bindDef.SourceNA, bindDef.SourceMember, bindDef.TargetNA, bindDef.TargetMember);
+ }
void initILGen ()
{
il.DeclareLocal (typeof (GraphicObject));
diff --git a/src/Instantiator.cs b/src/Instantiator.cs
index b7ce8e99..c546e633 100644
--- a/src/Instantiator.cs
+++ b/src/Instantiator.cs
@@ -416,54 +416,44 @@ namespace Crow
/// <param name="targetNA">Target Node Address</param>
/// <param name="targetMember">Target member name</param>
/// <param name="targetName">Target node name</param>
- bool splitBindingExp(NodeAddress sourceNA, string expression, out NodeAddress targetNA, out string targetMember, out string targetName){
- bool twoWay = false;
- targetName = "";
+ BindingDefinition splitBindingExp(NodeAddress sourceNA, string sourceMember, string expression){
+ BindingDefinition bindingDef = new BindingDefinition(sourceNA, sourceMember);
if (string.IsNullOrEmpty (expression)) {
- targetNA = null;
- targetMember = "";
+ return bindingDef;
} else {
if (expression.StartsWith ("²")) {
- twoWay = true;
+ bindingDef.TwoWay = true;
expression = expression.Substring (1);
}
string[] bindingExp = expression.Split ('/');
- if (bindingExp.Length == 1)
- targetNA = null;//datasource binding
- else
- targetNA = getNodeAdressFromBindingExp (sourceNA, bindingExp);
+ if (bindingExp.Length > 1)
+ bindingDef.TargetNA = getNodeAdressFromBindingExp (sourceNA, bindingExp);
string [] bindTrg = bindingExp.Last().Split ('.');
if (bindTrg.Length == 1)
- targetMember = bindTrg [0];
+ bindingDef.TargetMember = bindTrg [0];
else if (bindTrg.Length == 2) {
//named target
- targetName = bindTrg[0];
- targetMember = bindTrg [1];
+ bindingDef.TargetName = bindTrg[0];
+ bindingDef.TargetMember = bindTrg [1];
} else
throw new Exception ("Syntax error in binding, expected 'go dot member'");
}
- return twoWay;
+ return bindingDef;
}
void readPropertyBinding (Context ctx, string sourceMember, string expression)
- {
- string targetMember, targetName;
- NodeAddress sourceNA = ctx.CurrentNodeAddress, targetNA;
-
- bool twoWay = splitBindingExp (sourceNA, expression, out targetNA, out targetMember, out targetName);
+ {
+ NodeAddress sourceNA = ctx.CurrentNodeAddress;
+ BindingDefinition bindingDef = splitBindingExp (sourceNA, sourceMember, expression);
- if (targetNA == null) {//bind on data source
- emitDataSourceBindingDelegate (ctx, sourceMember, targetMember);
- return;
- }
-
- ctx.StorePropertyBinding (targetNA, targetMember, sourceNA, sourceMember);
-// if (twoWay)
-// ctx.StorePropertyBinding (currentNode, sourceMember, targetNA, memberName);
+ if (bindingDef.TargetNA == null)//bind on data source
+ emitDataSourceBindingDelegate (ctx, sourceMember, bindingDef.TargetMember);
+ else
+ ctx.StorePropertyBinding (bindingDef);
}
/// <summary>
/// Gets the node adress from binding expression splitted with '/' starting at a given node
@@ -634,17 +624,15 @@ namespace Crow
ctx.emitCachedDelegateHandlerAddition(dmIdx, sourceEvent);
}
- void emitHandlerBinding (Context ctx, EventInfo sourceEvent, string expression){
- string memberName, namedNode;
- NodeAddress currentNode = ctx.CurrentNodeAddress, targetNA;
-
- splitBindingExp (currentNode, expression, out targetNA, out memberName, out namedNode);
+ void emitHandlerBinding (Context ctx, EventInfo sourceEvent, string expression){
+ NodeAddress currentNode = ctx.CurrentNodeAddress;
+ BindingDefinition bindingDef = splitBindingExp (currentNode, sourceEvent.Name, expression);
string bindOnEventName = null;
- if (targetNA == null)//datasource handler
+ if (bindingDef.TargetNA == null)//datasource handler
bindOnEventName = "DataSourceChanged";
- else if (targetNA.Count == 0)//out of tree template handler
+ else if (bindingDef.TargetNA.Count == 0)//out of tree template handler
bindOnEventName = "ParentChanged";
if (!string.IsNullOrEmpty(bindOnEventName)){
@@ -662,7 +650,7 @@ namespace Crow
//fetch method in datasource and test if it exist
il.Emit (OpCodes.Ldarg_2);//load new datasource
il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
- il.Emit (OpCodes.Ldstr, memberName);//load handler method name
+ il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);//load handler method name
il.Emit (OpCodes.Call, typeof(CompilerServices).GetMethod("getMethodInfoWithReflexion", BindingFlags.Static | BindingFlags.Public));
il.Emit (OpCodes.Stloc_0);//save MethodInfo
il.Emit (OpCodes.Ldloc_0);//push mi for test if null