1 /* Copyright (c) 2022 Samsung Electronics Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
17 using System.ComponentModel;
18 using Tizen.NUI.BaseComponents;
19 using Tizen.NUI.Binding;
21 namespace Tizen.NUI.Components
24 /// This class provides a basic item for CollectionView.
26 /// <since_tizen> 9 </since_tizen>
27 public partial class RecyclerViewItem : Control
30 /// Property of boolean Enable flag.
32 /// <since_tizen> 9 </since_tizen>
33 public static readonly BindableProperty IsEnabledProperty = View.IsEnabledProperty;
36 /// Property of boolean Selected flag.
38 /// <since_tizen> 9 </since_tizen>
39 public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(RecyclerViewItem), false, propertyChanged: (bindable, oldValue, newValue) =>
41 var instance = (RecyclerViewItem)bindable;
44 bool newSelected = (bool)newValue;
45 if (instance.isSelected != newSelected)
47 instance.isSelected = newSelected;
49 if (instance.isSelectable)
51 instance.UpdateState();
56 defaultValueCreator: (bindable) =>
58 var instance = (RecyclerViewItem)bindable;
59 return instance.isSelectable && instance.isSelected;
63 /// Property of boolean Selectable flag.
65 /// <since_tizen> 9 </since_tizen>
66 public static readonly BindableProperty IsSelectableProperty = BindableProperty.Create(nameof(IsSelectable), typeof(bool), typeof(RecyclerViewItem), true, propertyChanged: (bindable, oldValue, newValue) =>
68 var instance = (RecyclerViewItem)bindable;
71 bool newSelectable = (bool)newValue;
72 if (instance.isSelectable != newSelectable)
74 instance.isSelectable = newSelectable;
75 instance.UpdateState();
79 defaultValueCreator: (bindable) => ((RecyclerViewItem)bindable).isSelectable);
81 private bool isSelected = false;
82 private bool isSelectable = true;
83 private RecyclerViewItemStyle ItemStyle => ViewStyle as RecyclerViewItemStyle;
85 static RecyclerViewItem() { }
88 /// Creates a new instance of RecyclerViewItem.
90 /// <since_tizen> 9 </since_tizen>
91 public RecyclerViewItem() : base()
96 /// Creates a new instance of RecyclerViewItem with style.
98 /// <param name="style">Create RecyclerViewItem by special style defined in UX.</param>
99 /// <since_tizen> 9 </since_tizen>
100 public RecyclerViewItem(string style) : base(style)
105 /// Creates a new instance of a RecyclerViewItem with style.
107 /// <param name="itemStyle">Create RecyclerViewItem by style customized by user.</param>
108 /// <since_tizen> 9 </since_tizen>
109 public RecyclerViewItem(RecyclerViewItemStyle itemStyle) : base(itemStyle)
114 /// An event for the RecyclerViewItem clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.
116 /// <since_tizen> 9 </since_tizen>
117 public event EventHandler<ClickedEventArgs> Clicked;
120 /// Flag to decide RecyclerViewItem can be selected or not.
122 /// <since_tizen> 9 </since_tizen>
123 public bool IsSelectable
125 get => (bool)GetValue(IsSelectableProperty);
126 set => SetValue(IsSelectableProperty, value);
130 /// Flag to decide selected state in RecyclerViewItem.
132 /// <since_tizen> 9 </since_tizen>
133 public bool IsSelected
135 get => (bool)GetValue(IsSelectedProperty);
136 set => SetValue(IsSelectedProperty, value);
140 /// Flag to decide enabled state in RecyclerViewItem.
141 /// Set enabled state false makes item untouchable and unfocusable.
143 /// <since_tizen> 9 </since_tizen>
144 public bool IsEnabled
146 get => base.IsEnabled;
149 base.IsEnabled = value;
154 /// Data index which is binded to item.
155 /// Can access to data using this index.
157 [EditorBrowsable(EditorBrowsableState.Never)]
158 public int Index { get; internal set; } = 0;
161 /// DataTemplate of this view object
163 [EditorBrowsable(EditorBrowsableState.Never)]
164 public DataTemplate Template { get; internal set; }
167 /// State of Realization
169 [EditorBrowsable(EditorBrowsableState.Never)]
170 public bool IsRealized { get; internal set; }
171 internal bool IsHeader { get; set; }
172 internal bool IsFooter { get; set; }
173 internal bool IsPressed { get; set; } = false;
176 /// Called after a key event is received by the view that has had its focus set.
178 /// <param name="key">The key event.</param>
179 /// <returns>True if the key event should be consumed.</returns>
180 [EditorBrowsable(EditorBrowsableState.Never)]
181 public override bool OnKey(Key key)
183 bool clicked = false;
185 if (!IsEnabled || null == key || null == BindingContext)
190 if (key.State == Key.StateType.Down)
192 if (key.KeyPressedName == "Return")
198 else if (key.State == Key.StateType.Up)
200 if (key.KeyPressedName == "Return")
202 clicked = IsPressed && IsEnabled;
208 // Extension : Extension?.SetTouchInfo(touch);
209 if (ParentItemsView is CollectionView colView)
211 switch (colView.SelectionMode)
213 case ItemSelectionMode.Single:
214 colView.SelectedItem = IsSelected ? null : BindingContext;
216 case ItemSelectionMode.SingleAlways:
217 if (colView.SelectedItem != BindingContext)
218 colView.SelectedItem = BindingContext;
220 case ItemSelectionMode.Multiple:
221 var selectedItems = colView.SelectedItems;
222 if (selectedItems.Contains(BindingContext)) selectedItems.Remove(BindingContext);
223 else selectedItems.Add(BindingContext);
225 case ItemSelectionMode.None:
233 ClickedEventArgs eventArgs = new ClickedEventArgs();
234 OnClickedInternal(eventArgs);
240 return base.OnKey(key) || clicked;
244 /// Called when the control gain key input focus. Should be overridden by derived classes if they need to customize what happens when the focus is gained.
246 [EditorBrowsable(EditorBrowsableState.Never)]
247 public override void OnFocusGained()
249 base.OnFocusGained();
254 /// Called when the control loses key input focus.
255 /// Should be overridden by derived classes if they need to customize
256 /// what happens when the focus is lost.
258 [EditorBrowsable(EditorBrowsableState.Never)]
259 public override void OnFocusLost()
266 /// Apply style to RecyclerViewItem.
268 /// <param name="viewStyle">The style to apply.</param>
269 /// <since_tizen> 9 </since_tizen>
270 public override void ApplyStyle(ViewStyle viewStyle)
272 styleApplied = false;
274 base.ApplyStyle(viewStyle);
275 if (viewStyle != null)
277 //Extension = RecyclerViewItemStyle.CreateExtension();
278 //FIXME : currently padding and margin are not applied by ApplyStyle automatically as missing binding features.
279 Padding = new Extents(viewStyle.Padding);
280 Margin = new Extents(viewStyle.Margin);
287 /// Get ViewItem style.
289 /// <returns>The default ViewItem style.</returns>
290 /// <since_tizen> 9 </since_tizen>
291 protected override ViewStyle CreateViewStyle()
293 return new RecyclerViewItemStyle();
297 /// Called when the ViewItem is Clicked by a user
299 /// <param name="eventArgs">The click information.</param>
300 /// <since_tizen> 9 </since_tizen>
301 protected virtual void OnClicked(ClickedEventArgs eventArgs)
303 //Console.WriteLine("On Clicked Called {0}", this.Index);
307 /// <since_tizen> 9 </since_tizen>
308 protected override void Dispose(DisposeTypes type)
315 if (type == DisposeTypes.Explicit)