[NUI] sync DevelNUI and master
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Components / Controls / Switch.cs
1 /*
2  * Copyright(c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 using System;
18 using System.ComponentModel;
19 using System.Diagnostics;
20 using Tizen.NUI.BaseComponents;
21 using Tizen.NUI.Components.Extension;
22
23 namespace Tizen.NUI.Components
24 {
25     /// <summary>
26     /// Switch is one kind of common component, it can be used as selector.
27     /// User can handle Navigation by adding/inserting/deleting NavigationItem.
28     /// </summary>
29     /// <since_tizen> 6 </since_tizen>
30     public class Switch : Button
31     {
32         private ImageView track = null;
33         private ImageView thumb = null;
34
35         static Switch() { }
36
37         /// <summary>
38         /// Creates a new instance of a Switch.
39         /// </summary>
40         /// <since_tizen> 6 </since_tizen>
41         public Switch() : base()
42         {
43         }
44
45         /// <summary>
46         /// Creates a new instance of a Switch with style.
47         /// </summary>
48         /// <param name="style">Create Switch by special style defined in UX.</param>
49         /// <since_tizen> 8 </since_tizen>
50         public Switch(string style) : base(style)
51         {
52         }
53
54         /// <summary>
55         /// Creates a new instance of a Switch with style.
56         /// </summary>
57         /// <param name="switchStyle">Create Switch by style customized by user.</param>
58         /// <since_tizen> 8 </since_tizen>
59         public Switch(SwitchStyle switchStyle) : base(switchStyle)
60         {
61         }
62
63         /// <summary>
64         /// Initialize AT-SPI object.
65         /// </summary>
66         [EditorBrowsable(EditorBrowsableState.Never)]
67         public override void OnInitialize()
68         {
69             track = new ImageView()
70             {
71                 EnableControlStatePropagation = true
72             };
73             thumb = new ImageView();
74             track.Add(thumb);
75
76             base.OnInitialize();
77             SetAccessibilityConstructor(Role.ToggleButton);
78
79             IsSelectable = true;
80 #if PROFILE_MOBILE
81             Feedback = true;
82 #endif
83         }
84
85         /// <summary>
86         /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
87         /// </summary>
88         [EditorBrowsable(EditorBrowsableState.Never)]
89         protected override AccessibilityStates AccessibilityCalculateStates()
90         {
91             var states = base.AccessibilityCalculateStates();
92             states.Set(AccessibilityState.Checked, this.IsSelected);
93             return states;
94         }
95
96         /// <summary>
97         /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
98         /// </summary>
99         /// <since_tizen> 6 </since_tizen>
100         [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChanged event instead.")]
101         public event EventHandler<SelectEventArgs> SelectedEvent;
102
103         /// <summary>
104         /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
105         /// </summary>
106         /// <since_tizen> 8 </since_tizen>
107         public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
108
109         /// <summary>
110         /// Return currently applied style.
111         /// </summary>
112         /// <remarks>
113         /// Modifying contents in style may cause unexpected behaviour.
114         /// </remarks>
115         /// <since_tizen> 8 </since_tizen>
116         public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
117
118         /// <summary>
119         /// Apply style to switch.
120         /// </summary>
121         /// <param name="viewStyle">The style to apply.</param>
122         [EditorBrowsable(EditorBrowsableState.Never)]
123         public override void ApplyStyle(ViewStyle viewStyle)
124         {
125             if (viewStyle is SwitchStyle switchStyle)
126             {
127                 if (Extension is SwitchExtension extension)
128                 {
129                     track.Unparent();
130                     thumb.Unparent();
131                     track = extension.OnCreateTrack(this, track);
132                     thumb = extension.OnCreateThumb(this, thumb);
133                     track.Add(thumb);
134                 }
135
136                 if (switchStyle.Track != null)
137                 {
138                     Track.ApplyStyle(switchStyle.Track);
139                 }
140
141                 if (switchStyle.Thumb != null)
142                 {
143                     Thumb.ApplyStyle(switchStyle.Thumb);
144                 }
145             }
146
147             base.ApplyStyle(viewStyle);
148         }
149
150         /// <summary>
151         /// Switch's track part.
152         /// </summary>
153         /// <since_tizen> 8 </since_tizen>
154         public ImageView Track
155         {
156             get => track;
157             internal set
158             {
159                 track = value;
160             }
161         }
162
163         /// <summary>
164         /// Switch's thumb part.
165         /// </summary>
166         /// <since_tizen> 8 </since_tizen>
167         public ImageView Thumb
168         {
169             get => thumb;
170             internal set
171             {
172                 thumb = value;
173             }
174         }
175
176         /// <summary>
177         /// Background image's resource url selector in Switch.
178         /// </summary>
179         /// <since_tizen> 6 </since_tizen>
180         public StringSelector SwitchBackgroundImageURLSelector
181         {
182             get => new StringSelector(track.ResourceUrlSelector);
183             set
184             {
185                 Debug.Assert(track != null);
186                 track.ResourceUrlSelector = value;
187             }
188         }
189
190         /// <summary>
191         /// Handler image's resource url in Switch.
192         /// </summary>
193         /// <since_tizen> 6 </since_tizen>
194         public string SwitchHandlerImageURL
195         {
196             get
197             {
198                 return Thumb.ResourceUrl;
199             }
200             set
201             {
202                 Thumb.ResourceUrl = value;
203             }
204         }
205
206         /// <summary>
207         /// Handler image's resource url selector in Switch.
208         /// Getter returns copied selector value if exist, null otherwise.
209         /// </summary>
210         /// <since_tizen> 6 </since_tizen>
211         public StringSelector SwitchHandlerImageURLSelector
212         {
213             get => new StringSelector(thumb.ResourceUrlSelector);
214             set
215             {
216                 Debug.Assert(thumb != null);
217                 thumb.ResourceUrlSelector = value;
218             }
219         }
220
221         /// <summary>
222         /// Handler image's size in Switch.
223         /// </summary>
224         /// <since_tizen> 6 </since_tizen>
225         public Size SwitchHandlerImageSize
226         {
227             get
228             {
229                 return Thumb.Size;
230             }
231             set
232             {
233                 Thumb.Size = value;
234             }
235         }
236
237         /// <summary>
238         /// Dispose Switch and all children on it.
239         /// </summary>
240         /// <param name="type">Dispose type.</param>
241         /// <since_tizen> 6 </since_tizen>
242         protected override void Dispose(DisposeTypes type)
243         {
244             if (disposed) return;
245
246             if (type == DisposeTypes.Explicit)
247             {
248                 Utility.Dispose(Thumb);
249                 Utility.Dispose(Track);
250             }
251
252             base.Dispose(type);
253         }
254
255         /// <summary>
256         /// Called after a key event is received by the view that has had its focus set.
257         /// </summary>
258         /// <param name="key">The key event.</param>
259         /// <returns>True if the key event should be consumed.</returns>
260         /// <since_tizen> 8 </since_tizen>
261         public override bool OnKey(Key key)
262         {
263             return base.OnKey(key);
264         }
265
266         /// <summary>
267         /// Called after a touch event is received by the owning view.<br />
268         /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
269         /// </summary>
270         /// <param name="touch">The touch event.</param>
271         /// <returns>True if the event should be consumed.</returns>
272         /// <since_tizen> 8 </since_tizen>
273         [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
274 #pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
275         public override bool OnTouch(Touch touch)
276 #pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
277         {
278             return base.OnTouch(touch);
279         }
280
281         /// <summary>
282         /// Get Switch style.
283         /// </summary>
284         /// <returns>The default switch style.</returns>
285         /// <since_tizen> 8 </since_tizen>
286         protected override ViewStyle CreateViewStyle()
287         {
288             return new SwitchStyle();
289         }
290
291         /// <inheritdoc/>
292         [EditorBrowsable(EditorBrowsableState.Never)]
293         protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
294         {
295             base.OnControlStateChanged(controlStateChangedInfo);
296
297             if (!IsSelectable)
298             {
299                 return;
300             }
301
302             bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
303
304             if (previousSelected != IsSelected)
305             {
306                 OnSelect();
307             }
308         }
309
310         /// <inheritdoc/>
311         [EditorBrowsable(EditorBrowsableState.Never)]
312         protected override void LayoutItems()
313         {
314             base.LayoutItems();
315             track.Unparent();
316             Add(track);
317             track.LowerToBottom();
318         }
319
320         private void OnSelect()
321         {
322             if (IsHighlighted)
323             {
324                 EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, IsSelected);
325             }
326
327             ((SwitchExtension)Extension)?.OnSelectedChanged(this);
328
329             if (SelectedEvent != null)
330             {
331                 SelectEventArgs eventArgs = new SelectEventArgs();
332                 eventArgs.IsSelected = IsSelected;
333                 SelectedEvent(this, eventArgs);
334             }
335
336             if (SelectedChanged != null)
337             {
338                 SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
339                 eventArgs.IsSelected = IsSelected;
340                 SelectedChanged(this, eventArgs);
341             }
342         }
343
344         /// <summary>
345         /// SelectEventArgs is a class to record item selected arguments which will sent to user.
346         /// </summary>
347         /// <since_tizen> 6 </since_tizen>
348         /// It will be removed in API10
349         [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChangedEventArgs instead.")]
350         [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
351         [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
352         public class SelectEventArgs : EventArgs
353         {
354             /// <summary> Select state of Switch </summary>
355             /// <since_tizen> 6 </since_tizen>
356             public bool IsSelected;
357         }
358     }
359 }