]> O.S.I.I.S - jp/crow.git/commitdiff
binding emiting in Instanciator
authorjpbruyere <jp.bruyere@hotmail.com>
Tue, 9 Aug 2016 11:56:33 +0000 (13:56 +0200)
committerjpbruyere <jp.bruyere@hotmail.com>
Tue, 9 Aug 2016 11:56:33 +0000 (13:56 +0200)
modifié :         src/CompilerServices/CompilerServices.cs
remove CurrentInterface property for now from GraphicObject, some
parentings are failing
modifié :         src/GraphicObjects/GraphicObject.cs

src/CompilerServices/CompilerServices.cs
src/GraphicObjects/GraphicObject.cs

index ebb365c9baaa5321e03459b2239a969d4922c961..80b4d5351f043a2ab095a18b449fd9055d22c5b4 100644 (file)
@@ -12,6 +12,8 @@ namespace Crow
 {
        public static class CompilerServices
        {
+               static MethodInfo miAddBinding = typeof(GraphicObject).GetMethod ("BindMember");
+
                public static void BuildInstanciator(IMLInstantiatorBuilder builder, Type crowType){
                        string tmpXml = builder.ReadOuterXml ();
 
@@ -52,6 +54,8 @@ namespace Crow
                                                reader.il.Emit (OpCodes.Callvirt,//add child
                                                        typeof(PrivateContainer).GetMethod ("SetChild", BindingFlags.Instance | BindingFlags.NonPublic));                                               
                                        }
+                                       reader.il.Emit (OpCodes.Ldloc_0);
+                                       reader.il.Emit (OpCodes.Callvirt, crowType.GetMethod ("ResolveBindings"));
                                }
                        }
 
@@ -69,18 +73,26 @@ namespace Crow
                                        reader.il.Emit (OpCodes.Ldloc_0);
                                        reader.il.Emit (OpCodes.Callvirt, typeof(GraphicObject).GetMethod ("loadDefaultValues"));
 
+                                       MethodInfo miAddBinding = typeof(GraphicObject).GetMethod ("BindMember");
+
                                        while (reader.MoveToNextAttribute ()) {
                                                if (reader.Name == "Style")
                                                        continue;
 
-                                               PropertyInfo pi = crowType.GetProperty (reader.Name);
-
+                                               MemberInfo mi = crowType.GetMember (reader.Name).FirstOrDefault();
+                                               if (mi == null)
+                                                       throw new Exception ("Member '" + reader.Name + "' not found in " + crowType.Name);
+                                               if (mi.MemberType == MemberTypes.Event) {
+                                                       emitBindingCreation (reader.il, reader.Name, reader.Value);
+                                                       continue;
+                                               }
+                                               PropertyInfo pi = mi as PropertyInfo;
                                                if (pi == null)
                                                        throw new Exception ("Member '" + reader.Name + "' not found in " + crowType.Name);
 
-                                               if (reader.Value.StartsWith("{"))
-                                                       Debug.WriteLine("Binding => " + pi.Name + ": " + reader.Value);
-                                               else
+                                               if (reader.Value.StartsWith ("{")) {
+                                                       emitBindingCreation (reader.il, reader.Name, reader.Value.Substring (1, reader.Value.Length - 2));
+                                               }else
                                                        CompilerServices.EmitSetValue (reader.il, pi, reader.Value);
 
                                        }
@@ -96,6 +108,12 @@ namespace Crow
                        }
                        builder.il.Emit (OpCodes.Pop);//pop saved ref to current object
                }
+               static void emitBindingCreation(ILGenerator il, string memberName, string expression){
+                       il.Emit (OpCodes.Ldloc_0);
+                       il.Emit (OpCodes.Ldstr, memberName);
+                       il.Emit (OpCodes.Ldstr, expression);
+                       il.Emit (OpCodes.Callvirt, miAddBinding);
+               }
                static void readChildren(IMLInstantiatorBuilder reader, Type crowType){
                        MethodInfo miAddChild = null;
                        bool endTagReached = false;
index 94e3f5e7feb06394f20c62d4613ce288bcb73e85..88166fe6ea2a760d965c4ae773fe4f30fc5c2d5b 100644 (file)
@@ -666,7 +666,7 @@ namespace Crow
                        if (Width == Measure.Fit || Height == Measure.Fit)
                                RegisterForLayouting (LayoutingType.Sizing);
                        else if (RegisteredLayoutings == LayoutingType.None)
-                               CurrentInterface.EnqueueForRepaint (this);
+                               Interface.CurrentInterface.EnqueueForRepaint (this);
                }
                /// <summary> query an update of the content, a redraw </summary>
                [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -674,19 +674,19 @@ namespace Crow
                {
                        bmp = null;
                        if (RegisteredLayoutings == LayoutingType.None)
-                               CurrentInterface.EnqueueForRepaint (this);
-               }
-               public Interface CurrentInterface {
-                       get {
-                               ILayoutable tmp = this.Parent;
-                               while (tmp != null) {
-                                       if (tmp is Interface)
-                                               return tmp as Interface;
-                                       tmp = tmp.Parent;
-                               }
-                               return null;
-                       }
+                               Interface.CurrentInterface.EnqueueForRepaint (this);
                }
+//             public Interface CurrentInterface {
+//                     get {
+//                             ILayoutable tmp = this.Parent;
+//                             while (tmp != null) {
+//                                     if (tmp is Interface)
+//                                             return tmp as Interface;
+//                                     tmp = tmp.Parent;
+//                             }
+//                             return null;
+//                     }
+//             }
 
                #region Layouting