]> O.S.I.I.S - jp/crow.git/commitdiff
- Item template
authorjpbruyere <jp.bruyere@hotmail.com>
Wed, 3 Jun 2015 13:11:24 +0000 (15:11 +0200)
committerjpbruyere <jp.bruyere@hotmail.com>
Wed, 3 Jun 2015 13:11:24 +0000 (15:11 +0200)
- Null binding for template items with "{}"

Templates/ItemTemplate.goml
Tests/GOLIBTest_Listbox.cs
src/CompilerServices/CompilerServices.cs
src/GraphicObjects/ListBox.cs
src/GraphicObjects/TemplatedControl.cs
src/Interface.cs

index e437096631b322540d0e1310a6bf8b38f9c142f0..c35332e970dfd94bd7e29c3536d14a84103c505a 100755 (executable)
@@ -1,2 +1,5 @@
 <?xml version="1.0"?>\r
-<Label Text="{Field}"/>\r
+<Label Margin="2" Focusable="true" Text="{}" \r
+       MouseEnter="{Background=SteelBlue}"\r
+       MouseLeave="{Background=Transparent}"\r
+/>\r
index cd7cd83a3586ade9ab1b68911523a6b40ac35e5f..624bc2c7b16436c9094de6eb9a0cde9d28cd7bc3 100644 (file)
@@ -17,13 +17,13 @@ using System.Collections.Generic;
 \r
 namespace test\r
 {\r
-       public class ClsItem : IValueChange\r
+       public class ClsItem\r
        {\r
-               #region IValueChange implementation\r
-\r
-               public event EventHandler<ValueChangeEventArgs> ValueChanged;\r
-\r
-               #endregion\r
+//             #region IValueChange implementation\r
+//\r
+//             public event EventHandler<ValueChangeEventArgs> ValueChanged;\r
+//\r
+//             #endregion\r
 \r
                public string field;\r
 \r
@@ -33,7 +33,7 @@ namespace test
                        }\r
                        set {\r
                                field = value;\r
-                               ValueChanged.Raise(this, new ValueChangeEventArgs ("Field", null, field));\r
+                               //ValueChanged.Raise(this, new ValueChangeEventArgs ("Field", null, field));\r
                        }\r
                }\r
 \r
@@ -56,12 +56,24 @@ namespace test
                        : base(1024, 600,"test")\r
                {}\r
 \r
-               public List<ClsItem> TestList = new List<ClsItem>(new ClsItem[] \r
+//             public List<ClsItem> TestList = new List<ClsItem>(new ClsItem[] \r
+//                     {\r
+//                             new ClsItem("string 1"),\r
+//                             new ClsItem("string 2"),\r
+//                             new ClsItem("string 3")\r
+//                     });\r
+               public List<string> TestList = new List<string>(new string[] \r
                        {\r
-                               new ClsItem("string 1"),\r
-                               new ClsItem("string 2"),\r
-                               new ClsItem("string 3")\r
-                       });\r
+                               "string 1",\r
+                               "string 2",\r
+                               "string 3"\r
+                       });             \r
+//             string[] TestList = new string[] \r
+//                     {\r
+//                             "string 1",\r
+//                             "string 2",\r
+//                             "string 3"\r
+//                     };      \r
                ListBox g;\r
 \r
                protected override void OnLoad (EventArgs e)\r
@@ -69,8 +81,10 @@ namespace test
                        base.OnLoad (e);\r
                        LoadInterface("Interfaces/test_Listbox.goml", out g);\r
 \r
-                       ValueChanged.Raise(this, new ValueChangeEventArgs ("TestList", null, TestList));\r
-                       TestList [1].Field = "test string";\r
+//                     TestList [1].Field = "test string";\r
+//                     ValueChanged.Raise(this, new ValueChangeEventArgs ("TestList", null, TestList));\r
+\r
+\r
                }\r
                protected override void OnRenderFrame (FrameEventArgs e)\r
                {\r
index f8bbcdf01de18798a37d425f9ed3e4e854d676c5..6f00d36d895299445734366397c37e3eea03220d 100644 (file)
@@ -154,27 +154,41 @@ namespace go
                        evtFi.SetValue(es.Source, del);
                }
 
-               public static void CreateBinding(DynAttribute binding, object _source)
-               {
-                       
+               public static void ResolveBinding(DynAttribute binding, object _source)
+               {                       
                        Type srcType = _source.GetType ();
                        Type dstType = binding.Source.GetType ();
 
+                       MemberInfo miDst = dstType.GetMember (binding.MemberName).FirstOrDefault ();
                        MemberInfo miSrc = srcType.GetMember (binding.Value).FirstOrDefault();
-                       Type srcValueType = null;
-                       if (miSrc.MemberType == MemberTypes.Property)
-                               srcValueType = (miSrc as PropertyInfo).PropertyType;
-                       else if (miSrc.MemberType == MemberTypes.Field) 
-                               srcValueType = (miSrc as FieldInfo).FieldType;
-                       else
-                               throw new Exception("unandled source type for binding");
 
+                       //initialize target with actual value
+                       if (miDst.MemberType == MemberTypes.Property) {
+                               if (miSrc == null)//if no member is provided for binding, source raw value is taken
+                                       (miDst as PropertyInfo).GetSetMethod ().Invoke (binding.Source, new object[] { _source });
+                               else if (miSrc.MemberType == MemberTypes.Property)
+                                       (miDst as PropertyInfo).GetSetMethod ().Invoke (binding.Source, new object[] { (miSrc as PropertyInfo).GetGetMethod ().Invoke (_source, null) });
+                               else if (miSrc.MemberType == MemberTypes.Field)                         
+                                       (miDst as PropertyInfo).GetSetMethod ().Invoke (binding.Source, new object[] { (miSrc as FieldInfo).GetValue (_source) });                      
+                       } else if (miDst.MemberType == MemberTypes.Field) {
+                               if (miSrc == null)//if no member is provided for binding, source raw value is taken
+                                       (miDst as FieldInfo).SetValue (binding.Source, _source );
+                               else if (miSrc.MemberType == MemberTypes.Property)
+                                       (miDst as FieldInfo).SetValue (binding.Source, (miSrc as PropertyInfo).GetGetMethod ().Invoke (_source, null));
+                               else if (miSrc.MemberType == MemberTypes.Field)                         
+                                       (miDst as FieldInfo).SetValue (binding.Source, (miSrc as FieldInfo).GetValue (_source));                                                        
+                       }else
+                               throw new Exception("unandled destination member type for binding");
+                       
                        #region Retrieve EventHandler parameter type
                        EventInfo ei = srcType.GetEvent ("ValueChanged");
+                       if (ei == null)
+                               return; //no dynamic update if ValueChanged interface is not implemented
+
                        MethodInfo evtInvoke = ei.EventHandlerType.GetMethod ("Invoke");
                        ParameterInfo[] evtParams = evtInvoke.GetParameters ();
-
                        Type handlerArgsType = evtParams [1].ParameterType;
+
                        #endregion
 
                        Type[] args = {typeof(object), handlerArgsType};
@@ -214,7 +228,7 @@ namespace go
 
                        string[] srcLines = binding.Value.Trim().Split (new char[] { ';' });
                        foreach (string srcLine in srcLines) {
-                               MethodInfo infoWriteLine = typeof(System.Diagnostics.Debug).GetMethod("WriteLine", new Type[] { typeof(string) });
+                               //MethodInfo infoWriteLine = typeof(System.Diagnostics.Debug).GetMethod("WriteLine", new Type[] { typeof(string) });
 
                                string statement = srcLine.Trim ();
 
@@ -232,23 +246,23 @@ namespace go
                                FieldInfo fiNewValue = typeof(ValueChangeEventArgs).GetField("NewValue");
                                il.Emit(OpCodes.Ldfld, fiNewValue);
 
-                               PropertyInfo piTarget = dstType.GetProperty(binding.MemberName);
+
                                MethodInfo miToStr = typeof(object).GetMethod("ToString",Type.EmptyTypes);
+                               PropertyInfo piTarget = dstType.GetProperty(binding.MemberName);
 
+                               Type srcValueType = null;
+                               if (miSrc.MemberType == MemberTypes.Property)
+                                       srcValueType = (miSrc as PropertyInfo).PropertyType;
+                               else if (miSrc.MemberType == MemberTypes.Field) 
+                                       srcValueType = (miSrc as FieldInfo).FieldType;
+                               else
+                                       throw new Exception("unandled source member type for binding");
+                               
                                if (!srcValueType.IsValueType)
                                        il.Emit(OpCodes.Castclass, srcValueType);
                                if (piTarget.PropertyType == typeof(string))
                                        il.Emit(OpCodes.Callvirt, miToStr);
                                il.Emit(OpCodes.Callvirt, piTarget.GetSetMethod());
-
-                               //initialize target with actual value
-                               if (miSrc.MemberType == MemberTypes.Property)
-                                       piTarget.GetSetMethod().Invoke(binding.Source, new object[] { (miSrc as PropertyInfo).GetGetMethod().Invoke(_source,null)});
-                               else if (miSrc.MemberType == MemberTypes.Field){ 
-                                       MethodInfo miSetTarget = piTarget.GetSetMethod();
-                                       FieldInfo fiSource = miSrc as FieldInfo;
-                                       miSetTarget.Invoke(binding.Source, new object[] { fiSource.GetValue(_source)});
-                               }
                        }
                        il.MarkLabel(labFailed);
                        il.Emit(OpCodes.Ret);
index 869eae2ac76a8ea2d8d80db64765a3f0f459674a..1f0ccf5eeafee461963aedb1c21f7153d9ef9179 100644 (file)
@@ -41,22 +41,32 @@ namespace go
                }
                #endregion
 
-               IList data;
+               ICollection data;
+               int _selectedIndex;
+
+               public int SelectedIndex{
+                       get { return _selectedIndex; }
+                       set { _selectedIndex = value; }
+               }
 
                [XmlAttributeAttribute()][DefaultValue(null)]
-               public IList Data {
+               public ICollection Data {
                        get {
                                return data;
                        }
-                       set {
-                               if (data == value)
-                                       return;
-                               
+                       set {                           
                                data = value;
 
-
+                               _list.Children.Clear ();
+                               if (data == null)
+                                       return;
                                foreach (var item in data) {
-                                       _list.addChild(Interface.Load ("#go.Templates.ItemTemplate.goml", item));
+                                       GraphicObject g = Interface.Load ("#go.Templates.ItemTemplate.goml", item);
+//                                     g.Tag = item;
+//                                     g.MouseClick += (object sender, OpenTK.Input.MouseButtonEventArgs e) => {
+//                                             
+//                                     };
+                                       _list.addChild(g);
 
                                }
                        }
index 7b9db04716b51f19b9b03660a5a50299156d4f64..df84307683045e4fa235639495db6cc1d9503f27 100644 (file)
@@ -24,7 +24,7 @@ using System.ComponentModel;
 
 namespace go
 {
-       public abstract class TemplatedControl : Container
+       public abstract class TemplatedControl : Container, IXmlSerializable
        {
                public TemplatedControl () : base()
                {
@@ -52,6 +52,52 @@ namespace go
                        //prevent name searching in template
                        return nameToFind == this.Name ? this : null;
                }
+
+               #region IXmlSerializable
+
+               public override System.Xml.Schema.XmlSchema GetSchema()
+               {
+                       return null;
+               }
+               public override void ReadXml(System.Xml.XmlReader reader)
+               {
+                       base.ReadXml(reader);
+
+//                     using (System.Xml.XmlReader subTree = reader.ReadSubtree())
+//                     {
+//                             subTree.Read(); //skip current node
+//                             subTree.Read(); //read first child
+//
+//                             if (!subTree.IsStartElement())
+//                                     return;
+//
+//                             Type t = Type.GetType("go." + subTree.Name);
+//                             GraphicObject go = (GraphicObject)Activator.CreateInstance(t);                                
+//
+//                             (go as IXmlSerializable).ReadXml(subTree);
+//
+//                             setChild(go);
+//
+//                             subTree.Read();
+//
+//                             if (!subTree.IsStartElement())
+//                                     return;
+//
+//                     }
+               }
+               public override void WriteXml(System.Xml.XmlWriter writer)
+               {
+                       base.WriteXml(writer);
+//
+//                     if (child == null)
+//                             return;
+//
+//                     writer.WriteStartElement(child.GetType().Name);
+//                     (child as IXmlSerializable).WriteXml(writer);
+//                     writer.WriteEndElement();
+               }
+
+               #endregion
        }
 }
 
index 0d0425ed4f4e704a5d49000df19ad31e0a317962..2b80564ffdcca4ae59706f7eedcaf9d9bf7dd408 100644 (file)
@@ -103,6 +103,8 @@ namespace go
                }
                public static void Load<T>(string file, out T result, object hostClass = null)
                {
+                       //result = (T)(Load (file, hostClass) as object);
+
                        EventsToResolve = new List<DynAttribute>();
                        Bindings = new List<DynAttribute> ();
 
@@ -142,7 +144,7 @@ namespace go
                        while (Bindings.Count > 0) {
                                DynAttribute binding = Bindings [0];
                                Bindings.RemoveAt (0);
-                               CompilerServices.CreateBinding (binding, hostClass);
+                               CompilerServices.ResolveBinding (binding, hostClass);
                        }
 //                     foreach (DynAttribute binding in Bindings) {
 ////                           Type tSource = binding.Source.GetType ();
@@ -193,7 +195,7 @@ namespace go
                        while (Bindings.Count > 0) {
                                DynAttribute binding = Bindings [0];
                                Bindings.RemoveAt (0);
-                               CompilerServices.CreateBinding (binding, hostClass);
+                               CompilerServices.ResolveBinding (binding, hostClass);
                        }
 
 //                     foreach (DynAttribute binding in Bindings) {