From: jpbruyere Date: Wed, 10 Aug 2016 12:24:30 +0000 (+0200) Subject: TreeView expand delegate creation in IMLReader X-Git-Tag: v0.4~11^2~1 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=13b1a9755a9e036122dd2f3e29714bbb5141118c;p=jp%2Fcrow.git TreeView expand delegate creation in IMLReader --- diff --git a/src/GraphicObjects/TemplatedControl.cs b/src/GraphicObjects/TemplatedControl.cs index 63bdbb21..422a45ec 100644 --- a/src/GraphicObjects/TemplatedControl.cs +++ b/src/GraphicObjects/TemplatedControl.cs @@ -167,10 +167,10 @@ namespace Crow using (IMLReader iTmp = new IMLReader (null, itemTmp)) { ItemTemplates [dataType] = - new ItemTemplate (iTmp.RootType, iTmp.GetLoader ()); + new ItemTemplate (iTmp.RootType, iTmp.GetLoader (), dataType, datas); } if (!string.IsNullOrEmpty (datas)) - ItemTemplates [dataType].CreateExpandDelegate(this, dataType, datas); + ItemTemplates [dataType].CreateExpandDelegate(this); continue; } diff --git a/src/IMLReader.cs b/src/IMLReader.cs index 1b2a5efb..87426726 100644 --- a/src/IMLReader.cs +++ b/src/IMLReader.cs @@ -111,6 +111,7 @@ namespace Crow string templatePath = reader.GetAttribute ("Template"); //string itemTemplatePath = reader.GetAttribute ("ItemTemplate"); + List itemTemplateIds = new List (); bool inlineTemplate = false; reader.Read (); @@ -121,7 +122,7 @@ namespace Crow inlineTemplate = true; reader.Read (); - readChildren (reader, crowType); + readChildren (reader, crowType,true); continue; } else if (reader.Name == "ItemTemplate") { string dataType = "default", datas = "", path = ""; @@ -137,20 +138,10 @@ namespace Crow using (IMLReader iTmp = new IMLReader (null, reader.ReadInnerXml ())) { string uid = Guid.NewGuid ().ToString (); Interface.Instantiators [uid] = - new ItemTemplate (iTmp.RootType, iTmp.GetLoader ()); - reader.il.Emit (OpCodes.Ldloc_0);//load TempControl ref - reader.il.Emit (OpCodes.Ldfld,//load ItemTemplates dic field - typeof(TemplatedControl).GetField("ItemTemplates")); - reader.il.Emit (OpCodes.Ldstr, dataType);//load key - reader.il.Emit (OpCodes.Ldstr, uid);//load value - reader.il.Emit (OpCodes.Callvirt, - typeof(Interface).GetMethod ("GetItemTemplate")); - reader.il.Emit (OpCodes.Callvirt, - typeof(Dictionary).GetMethod ("set_Item", - new Type[] { typeof(string), typeof(ItemTemplate) })); + new ItemTemplate (iTmp.RootType, iTmp.GetLoader (), dataType, datas); + + itemTemplateIds.Add (new string[] { dataType, uid, datas }); } -// if (!string.IsNullOrEmpty (datas)) -// ItemTemplates [dataType].CreateExpandDelegate(this, dataType, datas); continue; } @@ -173,6 +164,32 @@ namespace Crow crowType.GetMethod ("loadTemplate", BindingFlags.Instance | BindingFlags.NonPublic)); } } + foreach (string[] iTempId in itemTemplateIds) { + reader.il.Emit (OpCodes.Ldloc_0);//load TempControl ref + reader.il.Emit (OpCodes.Ldfld,//load ItemTemplates dic field + typeof(TemplatedControl).GetField("ItemTemplates")); + reader.il.Emit (OpCodes.Ldstr, iTempId[0]);//load key + reader.il.Emit (OpCodes.Ldstr, iTempId[1]);//load value + reader.il.Emit (OpCodes.Callvirt, + typeof(Interface).GetMethod ("GetItemTemplate")); + reader.il.Emit (OpCodes.Callvirt, + typeof(Dictionary).GetMethod ("set_Item", + new Type[] { typeof(string), typeof(ItemTemplate) })); + + if (!string.IsNullOrEmpty (iTempId [2])) { + //expand delegate creation + reader.il.Emit (OpCodes.Ldloc_0);//load TempControl ref + reader.il.Emit (OpCodes.Ldfld,//load ItemTemplates dic field + typeof(TemplatedControl).GetField ("ItemTemplates")); + reader.il.Emit (OpCodes.Ldstr, iTempId [0]);//load key + reader.il.Emit (OpCodes.Callvirt, + typeof(Dictionary).GetMethod ("get_Item", + new Type[] { typeof(string) })); + reader.il.Emit (OpCodes.Ldloc_0);//load root of treeView + reader.il.Emit (OpCodes.Callvirt, + typeof(ItemTemplate).GetMethod ("CreateExpandDelegate")); + } + } } } @@ -229,7 +246,7 @@ namespace Crow /// /// Parse child node an generate corresponding msil /// - void readChildren(IMLReader reader, Type crowType){ + void readChildren(IMLReader reader, Type crowType, bool templateLoading = false){ MethodInfo miAddChild = null; bool endTagReached = false; while (reader.Read()){ @@ -250,7 +267,7 @@ namespace Crow miAddChild = typeof(Group).GetMethod ("AddChild"); else if (typeof(Container).IsAssignableFrom (crowType)) miAddChild = typeof(Container).GetMethod ("SetChild"); - else if (typeof(TemplatedContainer).IsAssignableFrom (crowType)) + else if (typeof(TemplatedContainer).IsAssignableFrom (crowType)&&!templateLoading) miAddChild = typeof(TemplatedContainer).GetProperty("Content").GetSetMethod(); else if (typeof(TemplatedControl).IsAssignableFrom (crowType)) miAddChild = typeof(TemplatedControl).GetMethod ("loadTemplate", diff --git a/src/ItemTemplate.cs b/src/ItemTemplate.cs index ebc7b282..1afefe2b 100644 --- a/src/ItemTemplate.cs +++ b/src/ItemTemplate.cs @@ -32,18 +32,22 @@ namespace Crow { public class ItemTemplate : Instantiator { public EventHandler Expand; + string strDataType; + string fetchMethodName; #region CTOR public ItemTemplate(string path) : base(path) { } - public ItemTemplate (Type _root, Interface.LoaderInvoker _loader) + public ItemTemplate (Type _root, Interface.LoaderInvoker _loader,string _dataType, string _fetchDataMethod) :base(_root, _loader) { + strDataType = _dataType; + fetchMethodName = _fetchDataMethod; } #endregion - public void CreateExpandDelegate (TemplatedControl host, string strDataType, string method){ + public void CreateExpandDelegate (TemplatedControl host){ Type dataType = Type.GetType(strDataType); Type hostType = typeof(TemplatedControl);//not sure is the best place to put the dyn method Type evtType = typeof(EventHandler); @@ -54,7 +58,7 @@ namespace Crow Type handlerArgsType = evtParams [1].ParameterType; Type [] args = { typeof (object), typeof (object), handlerArgsType }; - DynamicMethod dm = new DynamicMethod ("dyn_expand_" + method, + DynamicMethod dm = new DynamicMethod ("dyn_expand_" + fetchMethodName, typeof (void), args, hostType); @@ -81,7 +85,7 @@ namespace Crow il.Emit (OpCodes.Ldarg_1); il.Emit (OpCodes.Callvirt, typeof(GraphicObject).GetProperty("DataSource").GetGetMethod ()); - MethodInfo miGetDatas = dataType.GetMethod (method, new Type[] {}); + MethodInfo miGetDatas = dataType.GetMethod (fetchMethodName, new Type[] {}); il.Emit (OpCodes.Callvirt, miGetDatas); il.Emit (OpCodes.Callvirt, listBoxType.GetProperty("Data").GetSetMethod ());