]> O.S.I.I.S - jp/crow.git/commitdiff
use console for binding debug output
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 14 Mar 2021 01:05:18 +0000 (02:05 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 14 Mar 2021 01:05:18 +0000 (02:05 +0100)
Crow/Templates/Button.template
Crow/src/DebugUtils/DebugLogger.cs
Crow/src/IML/CompilerServices.cs
Crow/src/IML/Instantiator.cs
Crow/src/IML/MemberAddress.cs
Crow/src/Interface.cs
Crow/src/ObservableList.cs
Crow/src/Text/SpanCharReader.cs [new file with mode: 0644]
Crow/src/Widgets/TemplatedControl.cs
Crow/src/Widgets/Widget.cs

index c46da8c6b881bfdc4fbd76a69dd72d3c62215561..ca1119a5d5ade99be6fbf586a016ca4a568ebe25 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<Border Background="{./Background}" Name="Content"
+<Border Background="{./Background}" Name="Content"  Width="Stretched" Height="Stretched"
        Foreground="Transparent" CornerRadius="{../CornerRadius}" BorderWidth="1"
        MouseEnter="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black};{caption.Foreground=White}"
        MouseLeave="{Foreground=Transparent};{caption.Foreground=LightGrey}"
index 0696c4e83a86db38336cdace3d240f0848952bb4..207ae2178cda0571e33381deef3e87c509938979 100644 (file)
@@ -89,7 +89,7 @@ namespace Crow
                public static bool ConsoleOutput = true;
 
                static bool logevt (DbgEvtType evtType)
-                       => (evtType & DiscardEvents) == 0 && (evtType & IncludeEvents) != 0;
+                       => (evtType & DiscardEvents) == 0 && (evtType & IncludeEvents) == IncludeEvents;
 
 
                static object logMutex = new object ();
index d8033b2831361622c9c1c61cfd1bd651abb14947..1bf378a99be930b528e7add990dd4747f1753fda 100644 (file)
@@ -270,7 +270,7 @@ namespace Crow.IML
                static MemberInfo getMemberInfoWithReflexion(object instance, string member){
             Type t = instance.GetType();
 #if DEBUG_BINDING_FUNC_CALLS
-                       System.Diagnostics.Debug.WriteLine ($"getMemberInfoWithReflexion ({instance},{member}); type:{t}");
+                       Console.WriteLine ($"getMemberInfoWithReflexion ({instance},{member}); type:{t}");
 #endif
             MemberInfo mi = t.GetMember (member)?.FirstOrDefault();
                        if (mi == null)
@@ -279,7 +279,7 @@ namespace Crow.IML
                }
                static MethodInfo getMethodInfoWithReflexion(object instance, string method){
 #if DEBUG_BINDING_FUNC_CALLS
-            System.Diagnostics.Debug.WriteLine ($"getMethodInfoWithReflexion ({instance},{method}); type:{instance.GetType ()}");
+            Console.WriteLine ($"getMethodInfoWithReflexion ({instance},{method}); type:{instance.GetType ()}");
 #endif
             return instance.GetType ().GetMethod (method, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                }
@@ -291,7 +291,7 @@ namespace Crow.IML
                /// <param name="destMember">Destination member</param>
                static void setValueWithReflexion(object dest, object value, string destMember){
 #if DEBUG_BINDING_FUNC_CALLS
-            System.Diagnostics.Debug.WriteLine ($"setValueWithReflexion (dest:{dest},value:{value},member:{destMember});");
+            Console.WriteLine ($"setValueWithReflexion (dest:{dest},value:{value},member:{destMember});");
 #endif
             Type destType = null;
                        Type origType = null;
@@ -300,7 +300,7 @@ namespace Crow.IML
                        MemberInfo miDest = getMemberInfoWithReflexion (dest, destMember);
 
                        if (miDest == null) {
-                               Debug.WriteLine ("Reverse template binding error: " + destMember + " not found in " + dest);
+                               Console.WriteLine ("Reverse template binding error: " + destMember + " not found in " + dest);
                                return;
                        }
 
@@ -323,7 +323,7 @@ namespace Crow.IML
                                        }
                                }
                        } catch (Exception ex) {
-                               Debug.WriteLine (ex.ToString ());
+                               Console.WriteLine (ex.ToString ());
                                return;
                        }
 
@@ -338,7 +338,7 @@ namespace Crow.IML
                /// </summary>
                static object getValueWithReflexion(object instance, MemberInfo mi){
 #if DEBUG_BINDING_FUNC_CALLS
-            System.Diagnostics.Debug.WriteLine ($"getValueWithReflexion ({instance},{mi});");
+            Console.WriteLine ($"getValueWithReflexion ({instance},{mi});");
 #endif
             object tmp = null;
                        Type dstType = null;
@@ -368,7 +368,7 @@ namespace Crow.IML
                                if (dstType.IsValueType)
                                        return Activator.CreateInstance (dstType);                              
                        } catch (Exception ex) {
-                               Debug.WriteLine (ex.ToString ());
+                               Console.WriteLine (ex.ToString ());
                                return "";
                        }
 
@@ -380,7 +380,7 @@ namespace Crow.IML
                        if (knownExtMethods.ContainsKey (key))
                                return knownExtMethods [key];
 
-                       //System.Diagnostics.Debug.WriteLine ($"*** search extension method: {t};{methodName} => key={key}");
+                       //System.Diagnostics.Console.WriteLine ($"*** search extension method: {t};{methodName} => key={key}");
 
                        MethodInfo mi = null;
                        if (!TryGetExtensionMethods (Assembly.GetEntryAssembly (), t, methodName, out mi)) {
@@ -755,7 +755,7 @@ namespace Crow.IML
                        FieldInfo fiEvt = getEventHandlerField (t, eventName);
                        if (fiEvt == null) {
 #if DEBUG_BINDING
-                               Debug.WriteLine ("RemoveHandlerByName: Event '" + eventName + "' not found in " + instance);
+                               Console.WriteLine ("RemoveHandlerByName: Event '" + eventName + "' not found in " + instance);
 #endif
                                return;
                        }
@@ -766,7 +766,7 @@ namespace Crow.IML
                                        if (d.Method.Name == delegateName) {
                                                eiEvt.RemoveEventHandler (instance, d);
 #if DEBUG_BINDING
-                                               Debug.WriteLine ("\tremoveEventHandlerByName: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName);
+                                               Console.WriteLine ("\tremoveEventHandlerByName: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName);
 #endif
                                        }
                                }
@@ -785,7 +785,7 @@ namespace Crow.IML
                                        if (d.Target == target) {
                                                eiEvt.RemoveEventHandler (instance, d);
 #if DEBUG_BINDING
-                                               Debug.WriteLine ("\tremoveEventHandlerByTarget: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName);
+                                               Console.WriteLine ("\tremoveEventHandlerByTarget: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName);
 #endif
                                        }
                                }
@@ -798,7 +798,7 @@ namespace Crow.IML
                        Type t = instance.GetType ();
                        MethodInfo mi = t.GetMethod (method, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                        if (mi == null) {
-                               Debug.WriteLine ("Handler Method '{0}' not found in '{1}'", method, t);
+                               Console.WriteLine ("Handler Method '{0}' not found in '{1}'", method, t);
                                return null;
                        }
                        return Delegate.CreateDelegate (eventType, instance, mi);
@@ -879,7 +879,7 @@ namespace Crow.IML
                //get value from member of object
                internal static object getDataTypeAndFetch (object data, string fetchMethod){
                        Type dataType = data.GetType();
-                       //System.Diagnostics.Debug.WriteLine ($"get data type and fetch {data}.{fetchMethod}");
+                       //Console.WriteLine ($"get data type and fetch {data}.{fetchMethod}");
                        MethodInfo miGetDatas = dataType.GetMethod (fetchMethod, new Type[] {});
                        if (miGetDatas == null)
                                miGetDatas = CompilerServices.SearchExtMethod (dataType, fetchMethod);
@@ -902,7 +902,7 @@ namespace Crow.IML
                //TODO:memberinfo found here must be cached
                internal static object getValue (Type dataType, object data, string member)
                {
-                       //System.Diagnostics.Debug.WriteLine ($"get value: {dataType} ; {data} ; {member}");
+                       //Console.WriteLine ($"get value: {dataType} ; {data} ; {member}");
 
                        MethodInfo miGetDatas = dataType.GetMethod (member, new Type [] { });
                        if (miGetDatas != null)
index a7ca4f2f3271f3ab2c15cd6722e7aa2f0c5e9770..34f904b7b9cdec51f9cdc8590fa141cf54cdb69d 100644 (file)
@@ -588,7 +588,7 @@ namespace Crow.IML {
                        BindingDefinition bindingDef = sourceNA.GetBindingDef (sourceMember, expression);
 
 #if DEBUG_BINDING
-                       Debug.WriteLine("Property Binding: " + bindingDef.ToString());
+                       Console.WriteLine("Property Binding: " + bindingDef.ToString());
 #endif
 
                        if (bindingDef.IsDataSourceBinding) {//bind on data source
@@ -629,6 +629,10 @@ namespace Crow.IML {
                        il.Emit (OpCodes.Ldstr, eventName);//2nd arg event name
                        il.Emit (OpCodes.Ldstr, delegateName);//3d arg: delegate name
                        il.Emit (OpCodes.Call, CompilerServices.miRemEvtHdlByName);
+#if DEBUG_BINDING
+                       il.EmitWriteLine ($"remove old ds handler: evtname:{eventName} delname:{delegateName} dsside:{DSSide}");
+#endif
+
                        il.MarkLabel(cancel);
                }
                #endregion
@@ -648,7 +652,7 @@ namespace Crow.IML {
                static Delegate compileDynEventHandler (EventInfo sourceEvent, string expression, NodeAddress currentNode = null)
                {
 #if DEBUG_BINDING
-                       Debug.WriteLine ("\tCompile Event {0}: {1}", sourceEvent.Name, expression);
+                       Console.WriteLine ("\tCompile Event {0}: {1}", sourceEvent.Name, expression);
 #endif
                        Type lopType = null;
 
@@ -770,7 +774,7 @@ namespace Crow.IML {
                        BindingDefinition bindingDef = currentNode.GetBindingDef (sourceEvent.Name, expression);
 
                        #if DEBUG_BINDING
-                       Debug.WriteLine("Event Binding: " + bindingDef.ToString());
+                       Console.WriteLine("Event Binding: " + bindingDef.ToString());
                        #endif
 
                        if (bindingDef.IsTemplateBinding | bindingDef.IsDataSourceBinding) {
@@ -861,7 +865,8 @@ namespace Crow.IML {
                        Type origineNodeType = origine.NodeType;
 
                        //value changed dyn method
-                       DynamicMethod dm = new DynamicMethod ("dyn_valueChanged" + NewId,
+                       string delname = "dyn_valueChanged" + NewId;
+                       DynamicMethod dm = new DynamicMethod (delname,
                                typeof (void), CompilerServices.argsValueChange, true);
                        ILGenerator il = dm.GetILGenerator (64);
 
@@ -869,6 +874,10 @@ namespace Crow.IML {
 
                        il.DeclareLocal (typeof(object));
 
+#if DEBUG_BINDING
+                       il.EmitWriteLine ($"DYN Called => {delname}");
+#endif
+
                        il.Emit (OpCodes.Nop);
 
                        int i = 0;
@@ -953,7 +962,7 @@ namespace Crow.IML {
                        ctx.emitCachedDelegateHandlerAddition (dmIdx, CompilerServices.eiValueChange, origine);
 
                        #if DEBUG_BINDING
-                       Debug.WriteLine("\tCrow property binding: " + dm.Name);
+                       Console.WriteLine("\tCrow property binding: " + dm.Name);
                        #endif
 
                }
@@ -1025,7 +1034,7 @@ namespace Crow.IML {
 
                                foreach (MemberAddress ma in bindingCase.Value) {
                                        if (ma.Address.Count == 0){
-                                               Debug.WriteLine("\t\tBUG: reverse template binding in normal template binding");
+                                               Console.WriteLine("\t\tBUG: reverse template binding in normal template binding");
                                                continue;//template binding
                                        }
                                        //first we try to get memberInfo of new parent, if it doesn't exist, it's a propery less binding
@@ -1112,7 +1121,7 @@ namespace Crow.IML {
                void emitDataSourceBindings (IMLContext ctx, BindingDefinition bindingDef, Type dsType)
                {
 #if DEBUG_BINDING_FUNC_CALLS
-                       System.Diagnostics.Debug.WriteLine ($"emitDataSourceBindings with data type knows: {bindingDef}");
+                       Console.WriteLine ($"emitDataSourceBindings with data type knows: {bindingDef} dstype: {dsType}");
 #endif
                        DynamicMethod dm = null;
                        ILGenerator il = null;
@@ -1133,6 +1142,10 @@ namespace Crow.IML {
 
                                il.DeclareLocal (typeof (object));
 
+#if DEBUG_BINDING
+                               il.EmitWriteLine ($"DYN Called => {delName}");
+#endif
+
                                //load value changed member name onto the stack
                                il.Emit (OpCodes.Ldarg_2);//TODO:check _2??? not _1??
                                il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
@@ -1174,7 +1187,8 @@ namespace Crow.IML {
                        //the actual value of the origin member of the datasource and then will bind the value changed
                        //dyn methode.
                        //dm is bound to the instanciator instance to have access to cached dyn meth and delegates
-                       dm = new DynamicMethod ("dyn_dschanged" + NewId,
+                       string dschangeddelname = "dyn_dschanged" + NewId;
+                       dm = new DynamicMethod (dschangeddelname,
                                typeof (void),
                                CompilerServices.argsBoundDSChange, true);
 
@@ -1186,7 +1200,9 @@ namespace Crow.IML {
                        Label cancel = il.DefineLabel ();
                        Label newDSIsNull = il.DefineLabel ();
                        Label cancelInit = il.DefineLabel ();
-
+#if DEBUG_BINDING
+                       il.EmitWriteLine ($"DYN Called => {dschangeddelname}");
+#endif
 
                        il.Emit (OpCodes.Ldarg_2);//load datasource change arg
                        il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
@@ -1206,6 +1222,9 @@ namespace Crow.IML {
                                //il.Emit (OpCodes.Call, CompilerServices.miGetMDToken);
                                //il.Emit (OpCodes.Ldc_I4, dsType.MetadataToken);
                                il.Emit (OpCodes.Brfalse, newDSIsNull);
+#if DEBUG_BINDING
+                               il.EmitWriteLine ($"\tNew ds is of expected type: {dsType}");
+#endif
                        }
 
                        #region fetch initial Value
@@ -1219,6 +1238,9 @@ namespace Crow.IML {
                                        if (mbType != piSource.PropertyType)
                                                CompilerServices.emitConvert (il, mbType, piSource.PropertyType);
                                        il.Emit (OpCodes.Callvirt, piSource.GetSetMethod ());
+#if DEBUG_BINDING
+                                       il.EmitWriteLine ($"{dschangeddelname}: fetch initial value for binding: {bindingDef}");
+#endif
                                }
                        }
                        #endregion
@@ -1249,6 +1271,9 @@ namespace Crow.IML {
 
                        }
                        il.MarkLabel (newDSIsNull);
+#if DEBUG_BINDING
+                       il.EmitWriteLine ($"\tNew ds is NULL, expected type = {dsType}");
+#endif
                        il.Emit (OpCodes.Ret);
 
                        //store dschange delegate in instatiator instance for access while instancing graphic object
@@ -1263,8 +1288,8 @@ namespace Crow.IML {
                        ctx.emitCachedDelegateHandlerAddition (delDSIndex, CompilerServices.eiDSChange);
 
 #if DEBUG_BINDING
-                       Debug.WriteLine("\tDataSource ValueChanged: " + delName);
-                       Debug.WriteLine("\tDataSource Changed: " + dm.Name);
+                       Console.WriteLine("\tDataSource ValueChanged: " + delName);
+                       Console.WriteLine("\tDataSource Changed: " + dm.Name);
 #endif
                }
 
@@ -1290,7 +1315,7 @@ namespace Crow.IML {
                public Delegate emitDataSourceBindings (PropertyInfo piSource, BindingDefinition bindingDef){           
 
 #if DEBUG_BINDING_FUNC_CALLS
-                       System.Diagnostics.Debug.WriteLine ($"emitDataSourceBindings: {bindingDef}");
+                       Console.WriteLine ($"emitDataSourceBindings: {bindingDef}");
 #endif
                        DynamicMethod dm = null;
                        ILGenerator il = null;
@@ -1310,6 +1335,10 @@ namespace Crow.IML {
 
                                il.DeclareLocal (typeof(object));
 
+#if DEBUG_BINDING
+                               il.EmitWriteLine ($"DYN Called => {delName}");
+#endif
+
                                //load value changed member name onto the stack
                                il.Emit (OpCodes.Ldarg_2);
                                il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
@@ -1351,7 +1380,8 @@ namespace Crow.IML {
                        //the actual value of the origin member of the datasource and then will bind the value changed
                        //dyn methode.
                        //dm is bound to the instanciator instance to have access to cached dyn meth and delegates
-                       dm = new DynamicMethod ("dyn_dschanged" + NewId,
+                       string dschanged_delName = "dyn_dschanged" + NewId;
+                       dm = new DynamicMethod (dschanged_delName,
                                typeof (void),
                                CompilerServices.argsBoundDSChange, true);
 
@@ -1366,6 +1396,9 @@ namespace Crow.IML {
                        System.Reflection.Emit.Label cancelInit = il.DefineLabel ();
 
                        il.Emit (OpCodes.Nop);
+#if DEBUG_BINDING
+                       il.EmitWriteLine ($"dyn method call: {dschanged_delName}");
+#endif
 
                        il.Emit (OpCodes.Ldarg_2);//load datasource change arg
                        il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
@@ -1445,8 +1478,8 @@ namespace Crow.IML {
                        il.Emit (OpCodes.Ret);
 
 #if DEBUG_BINDING
-                       Debug.WriteLine("\tDataSource ValueChanged: " + delName);
-                       Debug.WriteLine("\tDataSource Changed: " + dm.Name);
+                       Console.WriteLine("\tDataSource ValueChanged: " + delName);
+                       Console.WriteLine("\tDataSource Changed: " + dm.Name);
 #endif
 
                        return dm.CreateDelegate (CompilerServices.ehTypeDSChange, this);
@@ -1481,7 +1514,7 @@ namespace Crow.IML {
                        foreach (string m in destMember.Split('.')) {
                                MemberInfo miDest = curType.GetMember (m).FirstOrDefault ();
                                if (miDest == null) {
-                                       Debug.WriteLine ($"Member '{destMember}' not found in new DataSource '{dest}' of '{orig}'");
+                                       Console.WriteLine ($"Member '{destMember}' not found in new DataSource '{dest}' of '{orig}'");
                                        return;
                                }
                                miDests.Add (miDest);
@@ -1489,7 +1522,7 @@ namespace Crow.IML {
                        }
 
 #if DEBUG_BINDING
-                       Debug.WriteLine ("DS Reverse binding: Member '{0}' found in new DS '{1}' of '{2}'", destMember, dest, orig);
+                       Console.WriteLine ("DS Reverse binding: Member '{0}' found in new DS '{1}' of '{2}'", destMember, dest, orig);
 #endif
 
 #region ValueChanged emit
@@ -1501,6 +1534,9 @@ namespace Crow.IML {
                        Stack<LocalBuilder> locals = new Stack<LocalBuilder> ();
 
                        System.Reflection.Emit.Label endMethod = il.DefineLabel ();
+#if DEBUG_BINDING
+                       il.EmitWriteLine ($"DYN Called => {delName}");
+#endif
 
                        //load value changed member name onto the stack
                        il.Emit (OpCodes.Ldarg_2);
index 6797e8ea6c7f9c1329447bc07b8deb0066184f33..3acc8e4676e54c485347da259d46d40858f4d365 100644 (file)
@@ -90,7 +90,7 @@ namespace Crow.IML
                bool tryFindMember ()
                {
 #if DEBUG_BINDING_FUNC_CALLS
-            System.Diagnostics.Debug.WriteLine ($"tryFindMember ({Address},{member})");
+            Console.WriteLine ($"tryFindMember ({Address},{member})");
 #endif
                        if (member != null)
                                throw new Exception ("member already found");
index 5dbac92f4d7d9938e116b0fcbc26f6d914f67baf..66b9b594546b4daba6a8d9b445f56fb722209902 100644 (file)
@@ -452,7 +452,7 @@ namespace Crow
                /// <summary>
                /// default templates dic by metadata token
                /// </summary>
-               public Dictionary<int, Instantiator> DefaultTemplates;
+               public Dictionary<string, Instantiator> DefaultTemplates;
                /// <summary>
                /// Item templates stored with their index
                /// </summary>
@@ -564,7 +564,7 @@ namespace Crow
                        Styling = new Dictionary<string, Style> (initCapacity);
                        DefaultValuesLoader = new Dictionary<string, LoaderInvoker> (initCapacity);
                        Instantiators = new Dictionary<string, Instantiator> (initCapacity);
-                       DefaultTemplates = new Dictionary<int, Instantiator> (initCapacity);                    
+                       DefaultTemplates = new Dictionary<string, Instantiator> (initCapacity);                 
                        ItemTemplates = new Dictionary<string, ItemTemplate> (initCapacity);
                }
                void loadThemeFiles () {
@@ -588,9 +588,9 @@ namespace Crow
                                                path = Path.Combine (Theme, "DefaultTemplates");
                                                foreach (string iml in Directory.GetFiles (path, "*.*", SearchOption.AllDirectories)) {
                                                        string resId = $"#{iml.Substring (path.Length + 1).Replace (Path.DirectorySeparatorChar, '.')}";
-                                                       int mdTok = Instantiator.tryGetGOType (resId.Substring (6, resId.Length - 15)).MetadataToken;
+                                                       //int mdTok = Instantiator.tryGetGOType (resId.Substring (6, resId.Length - 15)).MetadataToken;
                                                        using (Stream s = new FileStream (iml, FileMode.Open, FileAccess.Read))
-                                                               DefaultTemplates[mdTok] = new IML.Instantiator (this, s, resId);
+                                                               DefaultTemplates[resId] = new IML.Instantiator (this, s, resId);
                                                }
                                        }
                                        path = Path.Combine (Theme, "IML");
@@ -1454,6 +1454,11 @@ namespace Crow
 
                        _activeWidget.onMouseUp (_activeWidget, new MouseButtonEventArgs (MousePosition.X, MousePosition.Y, button, InputAction.Release));
 
+                       if (_activeWidget == null) {
+                               Debug.WriteLine ("[BUG]Mystery reset of _activeWidget");
+                               return true;
+                       }
+
                        if (doubleClickTriggered)
                                _activeWidget.onMouseDoubleClick (_activeWidget, new MouseButtonEventArgs (MousePosition.X, MousePosition.Y, button, InputAction.Press));
                        else
index 0087ea5ea5d9fa52b6f006a84878a26d94b73147..e87226cdf5036ba81f1f9591b53c24f78d5e2662 100644 (file)
@@ -76,6 +76,11 @@ namespace Crow
                        SelectedIndex++;
                        ListAdd.Raise (this, new ListChangedEventArg (selectedIndex, SelectedItem));
                }
+               public void Replace (T oldValue, T newValue) {
+                       int idx = IndexOf (oldValue);
+                       base[idx] = newValue;
+                       ListEdit.Raise (this, new ListChangedEventArg (idx, newValue));
+               }
                public void RaiseEdit () {
                        if (selectedIndex < 0)
                                return;
diff --git a/Crow/src/Text/SpanCharReader.cs b/Crow/src/Text/SpanCharReader.cs
new file mode 100644 (file)
index 0000000..b8f4256
--- /dev/null
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Crow.src.Text
+{
+    public ref struct SpanCharReader
+    {
+        int curPos;
+        ReadOnlySpan<char> buffer;
+
+        public SpanCharReader (string text) {
+            buffer = text.AsSpan ();
+            curPos = 0;
+        }
+
+        public int CurrentPosition => curPos;
+
+        public void Seek (int position) => curPos = position;
+
+        public Char Peak () => buffer[curPos];
+        public Char Read () => buffer[curPos++];
+        public ReadOnlySpan<char> Get (int fromPosition) => buffer.Slice (fromPosition, curPos - fromPosition);
+        public bool EndOfSpan => curPos >= buffer.Length;
+    }
+}
index 9f60e0a8a903577d552846094977783337dca2bf..5110d941a56beb8a01d3849fcadcdbf15876d434 100644 (file)
@@ -115,16 +115,15 @@ namespace Crow
                                this.ClearTemplateBinding();
                        
                        if (template == null) {
-                               int mdTok = this.GetType ().MetadataToken;
-
-                               if (!IFace.DefaultTemplates.ContainsKey (mdTok)) {
-                                       string defTmpId = this.GetType ().FullName + ".template";
+                               string defTmpId = this.GetType ().FullName + ".template";
+                               if (!IFace.DefaultTemplates.ContainsKey (defTmpId)) {
+                                       
                                        Stream s = IFace.GetStreamFromPath ("#" + defTmpId);
                                        if (s == null)
                                                throw new Exception (string.Format ("No default template found for '{0}'", this.GetType ().FullName));
-                                       IFace.DefaultTemplates [mdTok] = new IML.Instantiator (IFace, s, defTmpId);
+                                       IFace.DefaultTemplates [defTmpId] = new IML.Instantiator (IFace, s, defTmpId);
                                }
-                               this.SetChild (IFace.DefaultTemplates[mdTok].CreateInstance());
+                               this.SetChild (IFace.DefaultTemplates[defTmpId].CreateInstance());
                        }else
                                this.SetChild (template);
                }
index 8e44759c36e35910f3b93b00fe0d7308c598291b..eb963926beb370637d763c80ca1362e065125399 100644 (file)
@@ -982,12 +982,10 @@ namespace Crow
                                        rootDataLevel = true;
 
                                DbgLogger.StartEvent(DbgEvtType.GOLockUpdate, this);
-
                                lock (IFace.UpdateMutex) {
                                        OnDataSourceChanged (this, dse);
                                        NotifyValueChangedAuto (DataSource);
                                }
-
                                DbgLogger.EndEvent (DbgEvtType.GOLockUpdate);
                        }
                        get {
@@ -1025,7 +1023,7 @@ namespace Crow
                        #endif
 
                        #if DEBUG_BINDING
-                       Debug.WriteLine("New DataSource for => {0} \n\t{1}=>{2}", this.ToString(),e.OldDataSource,e.NewDataSource);
+                       Console.WriteLine("New DataSource for => {0} \n\t{1}=>{2}", this.ToString(),e.OldDataSource,e.NewDataSource);
                        #endif
                }
                /// <summary>