]> O.S.I.I.S - jp/crow.git/commitdiff
use class BindingDefinition to store source and target data's
authorjpbruyere <jp.bruyere@hotmail.com>
Wed, 21 Dec 2016 09:45:51 +0000 (10:45 +0100)
committerjpbruyere <jp.bruyere@hotmail.com>
Wed, 21 Dec 2016 09:45:51 +0000 (10:45 +0100)
modifié :         src/IML/BindingDefinition.cs
modifié :         src/IML/Context.cs
modifié :         src/Instantiator.cs

src/IML/BindingDefinition.cs
src/IML/Context.cs
src/Instantiator.cs

index dd76f18318e6135500c70fdfcbf27a3c86d27374..e357fcac0de822896409bab558753d8d654e9404 100644 (file)
@@ -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;
index 4c664700272691b1aeca10e2b1d1437979d03744..09329e1b35863d7b9b5ddf62a14ab52f1be8eb30 100644 (file)
@@ -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));
index b7ce8e9960825bfc702857ee155e29330f2ea690..c546e633c9df6a6ceacb227d79c613ff57a57a66 100644 (file)
@@ -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