Removing Tizen.Xamarin.Forms.Extensions
[profile/tv/apps/dotnet/mediahub.git] / TVMediaHub / TVMediaHub.Tizen / Extensions / DropdownListRenderer.cs
1 using ElmSharp;
2 using System;
3 using System.Collections;
4 using System.Collections.Generic;
5 using System.Collections.Specialized;
6 using System.ComponentModel;
7 using Tizen.Xamarin.Forms.Extension;
8 using Tizen.Xamarin.Forms.Extension.Renderer;
9 using Xamarin.Forms;
10 using Xamarin.Forms.Platform.Tizen;
11 using TForms = Xamarin.Forms.Platform.Tizen.Forms;
12
13 [assembly: ExportRenderer(typeof(DropdownList), typeof(DropdownListRenderer))]
14
15 namespace Tizen.Xamarin.Forms.Extension.Renderer
16 {
17     public class DropdownListRenderer : ViewRenderer<DropdownList, Hoversel>
18     {
19         class DropdownItem : BindableObject
20         {
21             public static readonly BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(DropdownItem), default(string));
22
23             public string Text
24             {
25                 get { return (string)GetValue(TextProperty); }
26                 set { SetValue(TextProperty, value); }
27             }
28
29             public HoverselItem HoverselItem { get; set; }
30             public object Data { get; set; }
31         }
32
33         Dictionary<HoverselItem, DropdownItem> _items = new Dictionary<HoverselItem, DropdownItem>();
34         Dictionary<object, DropdownItem> _objectMap = new Dictionary<object, DropdownItem>();
35         object _selectedItem = null;
36
37         protected override void OnElementChanged(ElementChangedEventArgs<DropdownList> e)
38         {
39             if (Control == null)
40             {
41                 var dropdownList = new Hoversel((TForms.Context as FormsApplication).MainWindow);
42                 SetNativeControl(dropdownList);
43                 Control.ItemSelected += OnHoverselItemSelected;
44                 Control.Dismissed += OnDismissed;
45                 Control.Expanded += OnExpanded;
46             }
47             if (e.OldElement != null)
48             {
49                 e.OldElement.ExpandChangeRequested -= OnExpandChangeRequested;
50                 e.OldElement.CollectionChanged -= OnCollectionChanged;
51                 ClearItems();
52             }
53             if (e.NewElement != null)
54             {
55                 e.NewElement.ExpandChangeRequested += OnExpandChangeRequested;
56                 e.NewElement.CollectionChanged += OnCollectionChanged;
57                 Control.HoverParent = (TForms.Context as FormsApplication).MainWindow;
58
59                 AddItems(e.NewElement.ItemsSource);
60                 UpdateIsExpanded();
61                 UpdateSelectedItem();
62             }
63             base.OnElementChanged(e);
64         }
65
66         void OnHoverselItemSelected(object sender, HoverselItemEventArgs e)
67         {
68             Element.SelectedItem = GetItem(e.Item)?.Data;
69         }
70
71         void OnExpanded(object sender, EventArgs e)
72         {
73             Element?.SetValue(DropdownList.IsExpandedPropertyKey, true);
74         }
75
76         void OnDismissed(object sender, EventArgs e)
77         {
78             Element?.SetValue(DropdownList.IsExpandedPropertyKey, false);
79         }
80
81         protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
82         {
83             if (e.PropertyName == DropdownList.IsExpandedProperty.PropertyName)
84             {
85                 UpdateIsExpanded();
86             }
87             else if (e.PropertyName == DropdownList.DisplayMemberPathProperty.PropertyName)
88             {
89                 UpdateDisplayMemberPath();
90             }
91             else if (e.PropertyName == DropdownList.SelectedItemProperty.PropertyName)
92             {
93                 UpdateSelectedItem();
94             }
95             else if (e.PropertyName == DropdownList.ItemsSourceProperty.PropertyName)
96             {
97                 UpdateItemSource();
98             }
99             base.OnElementPropertyChanged(sender, e);
100         }
101
102         void UpdateItemSource()
103         {
104             ClearItems();
105             AddItems(Element.ItemsSource);
106         }
107
108         void UpdateIsExpanded()
109         {
110             if (Element.IsExpanded)
111             {
112                 Control.HoverBegin();
113             }
114             else
115             {
116                 Control.HoverEnd();
117             }
118         }
119
120         void UpdateSelectedItem()
121         {
122             _selectedItem = Element.SelectedItem;
123             DropdownItem item = GetItem(Element.SelectedItem);
124             if (item == null)
125             {
126                 Element.SelectedItem = null;
127                 Control.Text = string.Empty;
128             }
129             else
130             {
131                 Control.Text = item.Text;
132             }
133         }
134
135         void OnExpandChangeRequested(object sender, DropdownList.ExpandRequestArgs e)
136         {
137             if (e.IsExpand)
138             {
139                 Control.HoverBegin();
140             }
141             else
142             {
143                 Control.HoverEnd();
144             }
145         }
146
147         void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
148         {
149             if (e.NewItems != null)
150             {
151                 AddItems(e.NewItems);
152             }
153             if (e.OldItems != null)
154             {
155                 RemoveItems(e.OldItems);
156             }
157             if (e.Action == NotifyCollectionChangedAction.Reset)
158             {
159                 ClearItems();
160             }
161         }
162
163         void AddItems(IEnumerable items)
164         {
165             foreach (object item in items)
166             {
167                 DropdownItem dropdownItem = new DropdownItem()
168                 {
169                     Data = item,
170                 };
171                 if (!string.IsNullOrEmpty(Element.DisplayMemberPath))
172                 {
173                     dropdownItem.SetBinding(DropdownItem.TextProperty, new Binding(Element.DisplayMemberPath));
174                 }
175                 else
176                 {
177                     dropdownItem.Text = item.ToString();
178                 }
179                 dropdownItem.BindingContext = item;
180                 dropdownItem.HoverselItem = Control.AddItem(dropdownItem.Text);
181                 dropdownItem.PropertyChanged += OnDropdownItemTextChanged;
182                 _items[dropdownItem.HoverselItem] = dropdownItem;
183                 _objectMap[item] = dropdownItem;
184             }
185         }
186
187         void OnDropdownItemTextChanged(object sender, PropertyChangedEventArgs e)
188         {
189             if (e.PropertyName == DropdownItem.TextProperty.PropertyName)
190             {
191                 DropdownItem item = (DropdownItem)sender;
192                 item.HoverselItem?.SetPartText("default", item.Text);
193                 if (_selectedItem == item.Data)
194                 {
195                     Control.Text = item.Text;
196                 }
197             }
198         }
199
200         void UpdateDisplayMemberPath()
201         {
202             foreach (var item in _items.Values)
203             {
204                 if (!string.IsNullOrEmpty(Element.DisplayMemberPath))
205                 {
206                     item.SetBinding(DropdownItem.TextProperty, new Binding(Element.DisplayMemberPath));
207                 }
208                 else
209                 {
210                     item.Text = item.Data.ToString();
211                 }
212             }
213             UpdateSelectedItem();
214         }
215
216         void RemoveItems(IEnumerable items)
217         {
218             foreach (object item in items)
219             {
220                 var dropdownItem = GetItem(item);
221                 if (Element.SelectedItem == dropdownItem.Data)
222                 {
223                     Element.SelectedItem = null;
224                 }
225                 dropdownItem.PropertyChanged -= OnDropdownItemTextChanged;
226                 _items.Remove(dropdownItem.HoverselItem);
227                 _objectMap.Remove(item);
228                 dropdownItem.HoverselItem.Delete();
229             }
230         }
231
232         void ClearItems()
233         {
234             Control.Clear();
235             _items.Clear();
236             _objectMap.Clear();
237
238             Element.SelectedItem = null;
239         }
240
241         DropdownItem GetItem(object obj)
242         {
243             if (obj == null)
244                 return null;
245             DropdownItem item = null;
246             _objectMap.TryGetValue(obj, out item);
247             return item;
248         }
249
250         DropdownItem GetItem(HoverselItem selItem)
251         {
252             if (selItem == null)
253                 return null;
254             DropdownItem item = null;
255             _items.TryGetValue(selItem, out item);
256             return item;
257         }
258     }
259 }