From c382841870f704e28b473d73b7fbc9e57a4f678a Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Wed, 21 Dec 2016 10:45:51 +0100 Subject: [PATCH] =?utf8?q?use=20class=20BindingDefinition=20to=20store=20s?= =?utf8?q?ource=20and=20target=20data's=20=09modifi=C3=A9=C2=A0:=20=20=20?= =?utf8?q?=20=20=20=20=20=20src/IML/BindingDefinition.cs=20=09modifi=C3=A9?= =?utf8?q?=C2=A0:=20=20=20=20=20=20=20=20=20src/IML/Context.cs=20=09modifi?= =?utf8?q?=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20src/Instantiator.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/IML/BindingDefinition.cs | 14 +++++---- src/IML/Context.cs | 5 ++++ src/Instantiator.cs | 58 ++++++++++++++---------------------- 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 /// 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 (); 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 /// Target Node Address /// Target member name /// Target node name - 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); } /// /// 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 -- 2.47.3