From: jpbruyere Date: Wed, 21 Dec 2016 09:45:51 +0000 (+0100) Subject: use class BindingDefinition to store source and target data's X-Git-Tag: v0.5.1~63^2~20 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=c382841870f704e28b473d73b7fbc9e57a4f678a;p=jp%2Fcrow.git use class BindingDefinition to store source and target data's modifié : src/IML/BindingDefinition.cs modifié : src/IML/Context.cs modifié : src/Instantiator.cs --- 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