diff options
| author | j-p <jp.bruyere@live.be> | 2016-09-06 16:52:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-09-06 16:52:57 +0200 |
| commit | 348f7e0ba05fb95472d85a42ab09fc5de85176ff (patch) | |
| tree | e09ba9e5123d9775f7e8bed6a3ac13c72444be6e /src/GraphicObjects/ListBox.cs | |
| parent | 6c2ececc6442b26f6788229d09bba83b919c099c (diff) | |
| parent | 801c274f1d022f658176deefe2a6bc9e2c398613 (diff) | |
Merge pull request #30 from jpbruyere/TreeViewItemAsTemplatedGroup
Tree view and list as templated group, templatedGroup will hold data handling
Diffstat (limited to 'src/GraphicObjects/ListBox.cs')
| -rw-r--r-- | src/GraphicObjects/ListBox.cs | 200 |
1 files changed, 1 insertions, 199 deletions
diff --git a/src/GraphicObjects/ListBox.cs b/src/GraphicObjects/ListBox.cs index ffbaf3e8..82a4014b 100644 --- a/src/GraphicObjects/ListBox.cs +++ b/src/GraphicObjects/ListBox.cs @@ -30,210 +30,12 @@ using System.Threading; namespace Crow { - public class ListBox : TemplatedControl + public class ListBox : TemplatedGroup { #region CTOR public ListBox () : base() {} #endregion - #region events - public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged; - #endregion - - Group _list; - GenericStack _gsList; - IList data; - int _selectedIndex; - int itemPerPage = 50; - Thread loadingThread = null; - volatile bool cancelLoading = false; - - [XmlAttributeAttribute]public IList Data { - get { - return data; - } - set { - if (value == data) - return; - - cancelLoadingThread (); - - data = value; - - NotifyValueChanged ("Data", data); - - lock (CurrentInterface.UpdateMutex) - _list.ClearChildren (); - if (_gsList.Orientation == Orientation.Horizontal) - _gsList.Width = -1; - else - _gsList.Height = -1; - - if (data == null) - return; - - loadingThread = new Thread (loading); - loadingThread.IsBackground = true; - loadingThread.Start (); - //loadPage(1); - - NotifyValueChanged ("SelectedIndex", _selectedIndex); - NotifyValueChanged ("SelectedItem", SelectedItem); - SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem)); - } - } - - [XmlAttributeAttribute][DefaultValue(-1)]public int SelectedIndex{ - get { return _selectedIndex; } - set { - if (value == _selectedIndex) - return; - - _selectedIndex = value; - - NotifyValueChanged ("SelectedIndex", _selectedIndex); - NotifyValueChanged ("SelectedItem", SelectedItem); - SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem)); - } - } - [XmlIgnore]public virtual object SelectedItem{ - get { return data == null ? null : _selectedIndex < 0 ? null : data[_selectedIndex]; } - } - protected void raiseSelectedItemChanged(){ - SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem)); - } - - #region TemplatedControl override - protected override void loadTemplate (GraphicObject template = null) - { - base.loadTemplate (template); - _list = this.child.FindByName ("List") as Group; - if (_list == null) - throw new Exception ("ListBox Template MUST contain a Goup widget named 'List'."); - _gsList = _list as GenericStack; - } - #endregion - - void loading(){ - if (ItemTemplates == null) - ItemTemplates = new Dictionary<string, ItemTemplate> (); - if (!ItemTemplates.ContainsKey ("default")) - ItemTemplates ["default"] = Interface.GetItemTemplate (ItemTemplate); - - for (int i = 1; i <= (data.Count / itemPerPage) + 1; i++) { - if (cancelLoading) - return; - loadPage (i); - } - } - void cancelLoadingThread(){ - if (loadingThread == null) - return; - if (!loadingThread.IsAlive) - return; - cancelLoading = true; - loadingThread.Join (); - cancelLoading = false; - } - void loadPage(int pageNum) - { - #if DEBUG_LOAD - Stopwatch loadingTime = new Stopwatch (); - loadingTime.Start (); - #endif - - Group page = _list.Clone () as Group; - - page.Name = "page" + pageNum; - - //reset size to fit in the dir of the stacking - //because _list total size is forced to approx size - if (_gsList.Orientation == Orientation.Horizontal) { - page.Width = Measure.Fit; - page.BindMember ("Height", "../HeightPolicy"); - } else { - page.Height = Measure.Fit; - page.BindMember ("Width", "../WidthPolicy"); - } - - for (int i = (pageNum - 1) * itemPerPage; i < pageNum * itemPerPage; i++) { - if (i >= data.Count) - break; - if (cancelLoading) - return; - - loadItem (i, page); - - //g.LogicalParent = this; - } - - lock (CurrentInterface.LayoutMutex) - _list.AddChild (page); - - #if DEBUG_LOAD - loadingTime.Stop (); - Debug.WriteLine("Listbox {2} Loading: {0} ticks \t, {1} ms", - loadingTime.ElapsedTicks, - loadingTime.ElapsedMilliseconds, this.ToString()); - #endif - } - protected void loadItem(int i, Group page){ - GraphicObject g = null; - ItemTemplate iTemp = null; - Type dataType = data [i].GetType (); - - if (ItemTemplates.ContainsKey (dataType.FullName)) - iTemp = ItemTemplates [dataType.FullName]; - else - iTemp = ItemTemplates ["default"]; - - lock (CurrentInterface.LayoutMutex) { - g = iTemp.CreateInstance(CurrentInterface); - page.AddChild (g); - g.DataSource = data [i]; - } - - registerItemClick (g); - - if (iTemp.Expand != null && g is Expandable) { - (g as Expandable).Expand += iTemp.Expand; - } - } - protected virtual void registerItemClick(GraphicObject g){ - g.MouseClick += itemClick; - } - protected void _list_LayoutChanged (object sender, LayoutingEventArgs e) - { -#if DEBUG_LAYOUTING - Debug.WriteLine("list_LayoutChanged"); -#endif - if (_gsList.Orientation == Orientation.Horizontal) { - if (e.LayoutType == LayoutingType.Width) - _gsList.Width = approxSize; - } else if (e.LayoutType == LayoutingType.Height) - _gsList.Height = approxSize; - } - int approxSize - { - get { - if (data == null) - return -1; - GenericStack page1 = _list.FindByName ("page1") as GenericStack; - if (page1 == null) - return -1; - - return page1.Orientation == Orientation.Horizontal ? - data.Count < itemPerPage ? - -1: - (int)Math.Ceiling ((double)page1.Slot.Width / (double)itemPerPage * (double)(data.Count+1)): - data.Count < itemPerPage ? - -1: - (int)Math.Ceiling ((double)page1.Slot.Height / (double)itemPerPage * (double)(data.Count+1)); - } - } - internal virtual void itemClick(object sender, MouseButtonEventArgs e){ - SelectedIndex = data.IndexOf((sender as GraphicObject).DataSource); - } } } |