[NUI] Introduce CollectionView and related classes. (#2525)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Components / Controls / RecyclerView / Item / RecyclerViewItem.Internal.cs
1 using System;
2 using System.ComponentModel;
3 using Tizen.NUI.BaseComponents;
4 using Tizen.NUI.Components.Extension;
5 using Tizen.NUI.Accessibility; // To use AccessibilityManager
6
7 namespace Tizen.NUI.Components
8 {
9     public partial class RecyclerViewItem
10     {
11         internal RecyclerView ParentItemsView = null;
12         internal object ParentGroup = null;
13         internal bool isGroupHeader;
14         internal bool isGroupFooter;
15         private bool styleApplied = false;
16
17         /// <summary>
18         /// Update ViewItem State.
19         /// </summary>
20         internal void UpdateState()
21         {
22             if (!styleApplied) return;
23
24             ControlState sourceState = ControlState;
25             ControlState targetState;
26
27             // Normal, Disabled
28             targetState = IsEnabled ? ControlState.Normal : ControlState.Disabled;
29
30             // Selected, DisabledSelected
31             if (IsSelected) targetState += ControlState.Selected;
32
33             // Pressed, PressedSelected
34             if (IsPressed) targetState += ControlState.Pressed;
35
36             // Focused, FocusedPressed, FocusedPressedSelected, DisabledFocused, DisabledSelectedFocused
37             if (IsFocused) targetState += ControlState.Focused;
38
39             if (sourceState != targetState)
40             {
41                 ControlState = targetState;
42                 OnUpdate();
43             }
44         }
45
46         internal override bool OnAccessibilityActivated()
47         {
48             if (!IsEnabled)
49             {
50                 return false;
51             }
52
53             // Touch Down
54             IsPressed = true;
55             UpdateState();
56
57             // Touch Up
58             bool clicked = IsPressed && IsEnabled;
59             IsPressed = false;
60
61             if (IsSelectable)
62             {
63                 //IsSelected = !IsSelected;
64             }
65             else
66             {
67                 UpdateState();
68             }
69
70             if (clicked)
71             {
72                 ClickedEventArgs eventArgs = new ClickedEventArgs();
73                 OnClickedInternal(eventArgs);
74             }
75             return true;
76         }
77
78         /// <summary>
79         /// Called when the ViewItem is Clicked by a user
80         /// </summary>
81         /// <param name="eventArgs">The click information.</param>
82         [EditorBrowsable(EditorBrowsableState.Never)]
83         protected virtual void OnClicked(ClickedEventArgs eventArgs)
84         {
85             //Console.WriteLine("On Clicked Called {0}", this.Index);
86         }
87
88         /// <summary>
89         /// Called when the ViewItem need to be updated
90         /// </summary>
91         [EditorBrowsable(EditorBrowsableState.Never)]
92         protected override void OnUpdate()
93         {
94             base.OnUpdate();
95             UpdateContent();
96         }
97
98         /// <inheritdoc/>
99         [EditorBrowsable(EditorBrowsableState.Never)]
100         protected override bool HandleControlStateOnTouch(Touch touch)
101         {
102             if (!IsEnabled || null == touch)
103             {
104                 return false;
105             }
106
107             PointStateType state = touch.GetState(0);
108
109             switch (state)
110             {
111                 case PointStateType.Down:
112                     IsPressed = true;
113                     UpdateState();
114                     return true;
115                 case PointStateType.Interrupted:
116                     IsPressed = false;
117                     UpdateState();
118                     return true;
119                 case PointStateType.Up:
120                     {
121                         bool clicked = IsPressed && IsEnabled;
122                         IsPressed = false;
123
124                         if (!clicked) return true;
125
126                         if (IsSelectable)
127                         {
128                             if (ParentItemsView as CollectionView)
129                             {
130                                 CollectionView colView = ParentItemsView as CollectionView;
131                                 switch (colView.SelectionMode)
132                                 {
133                                     case ItemSelectionMode.SingleSelection :
134                                         colView.SelectedItem = IsSelected ? null : BindingContext;
135                                         break;
136                                     case ItemSelectionMode.MultipleSelections :
137                                         var selectedItems = colView.SelectedItems;
138                                         if (selectedItems.Contains(BindingContext)) selectedItems.Remove(BindingContext);
139                                         else selectedItems.Add(BindingContext);
140                                         break;
141                                     case ItemSelectionMode.None :
142                                         break;
143                                 }
144                             }
145                         }
146                         else
147                         {
148                             // Extension : Extension?.SetTouchInfo(touch);
149                             UpdateState();
150                         }
151
152                         if (clicked)
153                         {
154                             ClickedEventArgs eventArgs = new ClickedEventArgs();
155                             OnClickedInternal(eventArgs);
156                         }
157
158                         return true;
159                     }
160                 default:
161                     break;
162             }
163             return base.HandleControlStateOnTouch(touch);
164         }
165
166
167         /// <summary>
168         /// Measure child, it can be override.
169         /// </summary>
170         [EditorBrowsable(EditorBrowsableState.Never)]
171         protected virtual void MeasureChild()
172         {
173         }
174
175         /// <summary>
176         /// Layout child, it can be override.
177         /// </summary>
178         [EditorBrowsable(EditorBrowsableState.Never)]
179         protected virtual void LayoutChild()
180         {
181         }
182
183         /// <summary>
184         /// Dispose Item and all children on it.
185         /// </summary>
186         /// <param name="type">Dispose type.</param>
187         protected override void Dispose(DisposeTypes type)
188         {
189             if (disposed)
190             {
191                 return;
192             }
193
194             if (type == DisposeTypes.Explicit)
195             {
196                 //
197             }
198
199             base.Dispose(type);
200         }
201
202         /// <inheritdoc/>
203         [EditorBrowsable(EditorBrowsableState.Never)]
204         protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
205         {
206             if (controlStateChangedInfo == null) throw new ArgumentNullException(nameof(controlStateChangedInfo));
207             base.OnControlStateChanged(controlStateChangedInfo);
208
209             var stateEnabled = !controlStateChangedInfo.CurrentState.Contains(ControlState.Disabled);
210
211             if (IsEnabled != stateEnabled)
212             {
213                 IsEnabled = stateEnabled;
214             }
215
216             var statePressed = controlStateChangedInfo.CurrentState.Contains(ControlState.Pressed);
217
218             if (IsPressed != statePressed)
219             {
220                 IsPressed = statePressed;
221             }
222         }
223
224         /// <summary>
225         /// Get ViewItem style.
226         /// </summary>
227         /// <returns>The default ViewItem style.</returns>
228         [EditorBrowsable(EditorBrowsableState.Never)]
229         protected override ViewStyle CreateViewStyle()
230         {
231             return new RecyclerViewItemStyle();
232         }
233
234         /// <summary>
235         /// It is hijack by using protected, style copy problem when class inherited from Button.
236         /// </summary>
237         [EditorBrowsable(EditorBrowsableState.Never)]
238         private void Initialize()
239         {
240             //FIXME!
241             IsCreateByXaml = true;
242             Layout = new AbsoluteLayout();
243             UpdateState();
244
245             AccessibilityManager.Instance.SetAccessibilityAttribute(this, AccessibilityManager.AccessibilityAttribute.Trait, "ViewItem");
246         }
247
248         /// <summary>
249         /// Update the Content. it can be override.
250         /// </summary>
251         [EditorBrowsable(EditorBrowsableState.Never)]
252         protected virtual void UpdateContent()
253         {
254             MeasureChild();
255             LayoutChild();
256
257             Sensitive = IsEnabled;
258         }
259
260
261         /// FIXME!! This has to be done in Element or View class.
262         /// <inheritdoc/>
263         [EditorBrowsable(EditorBrowsableState.Never)]
264         protected override void OnBindingContextChanged()
265         {
266             foreach (View child in Children)
267             {
268                 SetChildInheritedBindingContext(child, BindingContext);
269             }
270         }
271
272         private void OnClickedInternal(ClickedEventArgs eventArgs)
273         {
274             Command?.Execute(CommandParameter);
275             OnClicked(eventArgs);
276
277             Clicked?.Invoke(this, eventArgs);
278         }
279     }
280 }