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