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