<?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}"
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 ();
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)
}
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);
}
/// <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;
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;
}
}
}
} catch (Exception ex) {
- Debug.WriteLine (ex.ToString ());
+ Console.WriteLine (ex.ToString ());
return;
}
/// </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;
if (dstType.IsValueType)
return Activator.CreateInstance (dstType);
} catch (Exception ex) {
- Debug.WriteLine (ex.ToString ());
+ Console.WriteLine (ex.ToString ());
return "";
}
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)) {
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;
}
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
}
}
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
}
}
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);
//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);
//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)
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
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
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;
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) {
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);
il.DeclareLocal (typeof(object));
+#if DEBUG_BINDING
+ il.EmitWriteLine ($"DYN Called => {delname}");
+#endif
+
il.Emit (OpCodes.Nop);
int i = 0;
ctx.emitCachedDelegateHandlerAddition (dmIdx, CompilerServices.eiValueChange, origine);
#if DEBUG_BINDING
- Debug.WriteLine("\tCrow property binding: " + dm.Name);
+ Console.WriteLine("\tCrow property binding: " + dm.Name);
#endif
}
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
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;
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);
//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);
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);
//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
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
}
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
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
}
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;
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);
//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);
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);
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);
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);
}
#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
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);
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");
/// <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>
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 () {
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");
_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
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;
--- /dev/null
+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;
+ }
+}
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);
}
rootDataLevel = true;
DbgLogger.StartEvent(DbgEvtType.GOLockUpdate, this);
-
lock (IFace.UpdateMutex) {
OnDataSourceChanged (this, dse);
NotifyValueChangedAuto (DataSource);
}
-
DbgLogger.EndEvent (DbgEvtType.GOLockUpdate);
}
get {
#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>