]> O.S.I.I.S - jp/crow.git/commitdiff
add DataTest property to TemplatedGroup for testing data members in addition to data...
authorjpbruyere <jp.bruyere@hotmail.com>
Tue, 18 Oct 2016 16:07:49 +0000 (18:07 +0200)
committerjpbruyere <jp.bruyere@hotmail.com>
Tue, 18 Oct 2016 16:07:49 +0000 (18:07 +0200)
src/GraphicObjects/TemplatedGroup.cs

index 500e5ea658df86782f0cac756098fd8adbb5979b..7fb3ceff6ce776af6d9a79d133cbfc69a42686af 100644 (file)
@@ -36,7 +36,7 @@ namespace Crow
                #endregion
 
                protected Group items;
-               string _itemTemplate;
+               string _itemTemplate, _dataTest;
 
                #region events
                public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged;
@@ -56,6 +56,9 @@ namespace Crow
                //but then i should test if null in msil gen
                public Dictionary<string, ItemTemplate> ItemTemplates = new Dictionary<string, Crow.ItemTemplate>();
 
+               /// <summary>
+               /// Default item template
+               /// </summary>
                [XmlAttributeAttribute][DefaultValue("#Crow.Templates.ItemTemplate.goml")]
                public string ItemTemplate {
                        get { return _itemTemplate; }
@@ -81,6 +84,24 @@ namespace Crow
                        else
                                NotifyValueChanged ("HasChildren", true);
                }
+               /// <summary>
+               /// Use to define condition on Data item for selecting among ItemTemplates.
+               /// Default value is 'TypeOf' for selecting Template depending on Type of Data.
+               /// Other possible values are properties of Data
+               /// </summary>
+               /// <value>The data property test.</value>
+               [XmlAttributeAttribute][DefaultValue("TypeOf")]
+               public string DataTest {
+                       get { return _dataTest; }
+                       set {
+                               if (value == _dataTest)
+                                       return;
+
+                               _dataTest = value;
+
+                               NotifyValueChanged("DataTest", _dataTest);
+                       }
+               }
                #endregion
 
                public virtual List<GraphicObject> Items{ get { return items.Children; }}
@@ -113,7 +134,7 @@ namespace Crow
 
                                NotifyValueChanged ("Data", data);
 
-                               lock (CurrentInterface.UpdateMutex)
+                               //lock (CurrentInterface.UpdateMutex)
                                        ClearItems ();
 
                                if (data == null)
@@ -303,17 +324,6 @@ namespace Crow
 
                        page.Name = "page" + pageNum;
 
-//                     //reset size to fit in the dir of the stacking
-//                     //because items total size is forced to approx size
-//                     if (_gsList.Orientation == Orientation.Horizontal) {
-//                             page.Width = Measure.Fit;
-                               page.BindMember ("Height", "../HeightPolicy");
-                               page.BindMember ("Width", "../WidthPolicy");
-//                     } else {
-//                             page.Height = Measure.Fit;
-//                             page.BindMember ("Width", "../WidthPolicy");
-//                     }
-
                        for (int i = (pageNum - 1) * itemPerPage; i < pageNum * itemPerPage; i++) {
                                if (i >= data.Count)
                                        break;
@@ -335,13 +345,24 @@ namespace Crow
                        loadingTime.ElapsedMilliseconds, this.ToString());
                        #endif
                }
+               string getItempKey(Type dataType, object o){
+                       try {
+                               return dataType.GetProperty (_dataTest).GetGetMethod ().Invoke (o, null).ToString();
+                       } catch (Exception ex) {
+                               return dataType.FullName;
+                       }
+               }
                protected void loadItem(int i, Group page){
                        GraphicObject g = null;
                        ItemTemplate iTemp = null;
                        Type dataType = data [i].GetType ();
+                       string itempKey = dataType.FullName;
+
+                       if (_dataTest != "TypeOf")
+                               itempKey = getItempKey (dataType, data [i]);
 
-                       if (ItemTemplates.ContainsKey (dataType.FullName))
-                               iTemp = ItemTemplates [dataType.FullName];
+                       if (ItemTemplates.ContainsKey (itempKey))
+                                       iTemp = ItemTemplates [itempKey];
                        else
                                iTemp = ItemTemplates ["default"];
 
@@ -349,6 +370,8 @@ namespace Crow
                                g = iTemp.CreateInstance(CurrentInterface);
                                page.AddChild (g);
                                g.DataSource = data [i];
+                               if (typeof(IBindable).IsAssignableFrom (dataType))
+                                       CompilerServices.ResolveBindings ((data [i] as IBindable).Bindings);
                        }
 
                        registerItemClick (g);