[NUI] introduce CreateViewStyle that is alternative to GetViewStyle (#1681)
[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             Initialize();
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             Initialize();
53         }
54
55         /// <summary>
56         /// Creates a new instance of a Switch with style.
57         /// </summary>
58         /// <param name="switchStyle">Create Switch by style customized by user.</param>
59         /// <since_tizen> 8 </since_tizen>
60         public Switch(SwitchStyle switchStyle) : base(switchStyle)
61         {
62             Initialize();
63         }
64
65         /// <summary>
66         /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
67         /// </summary>
68         /// <since_tizen> 6 </since_tizen>
69         public event EventHandler<SelectEventArgs> SelectedEvent;
70
71         /// <summary>
72         /// Get style of switch.
73         /// </summary>
74         /// <since_tizen> 8 </since_tizen>
75         public new SwitchStyle Style => ViewStyle as SwitchStyle;
76
77         /// <summary>
78         /// Apply style to switch.
79         /// </summary>
80         /// <param name="viewStyle">The style to apply.</param>
81         [EditorBrowsable(EditorBrowsableState.Never)]
82         public override void ApplyStyle(ViewStyle viewStyle)
83         {
84             base.ApplyStyle(viewStyle);
85
86             SwitchStyle swStyle = viewStyle as SwitchStyle;
87
88             if (null != swStyle)
89             {
90                 if (swStyle.Track != null)
91                 {
92                     Track.ApplyStyle(swStyle.Track);
93                 }
94
95                 if (swStyle.Thumb != null)
96                 {
97                     Thumb.ApplyStyle(swStyle.Thumb);
98                 }
99             }
100         }
101
102         /// <summary>
103         /// Switch's track part.
104         /// </summary>
105         [EditorBrowsable(EditorBrowsableState.Never)]
106         public ImageView Track
107         {
108             get
109             {
110                 if (track == null)
111                 {
112                     track = new ImageView()
113                     {
114                         PositionUsesPivotPoint = true,
115                         ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
116                         PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
117                         WidthResizePolicy = ResizePolicyType.FillToParent,
118                         HeightResizePolicy = ResizePolicyType.FillToParent
119                     };
120
121                     var extension = (SwitchExtension)Extension;
122                     if (extension != null)
123                     {
124                         track = extension.OnCreateTrack(this, track);
125                     }
126                     Add(track);
127                 }
128                 return track;
129             }
130             internal set
131             {
132                 track = value;
133             }
134         }
135
136         /// <summary>
137         /// Switch's thumb part.
138         /// </summary>
139         [EditorBrowsable(EditorBrowsableState.Never)]
140         public ImageView Thumb
141         {
142             get
143             {
144                 if (thumb == null)
145                 {
146                     thumb = new ImageView()
147                     {
148                         PositionUsesPivotPoint = true,
149                         ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
150                         PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
151                         WidthResizePolicy = ResizePolicyType.Fixed,
152                         HeightResizePolicy = ResizePolicyType.Fixed
153                     };
154
155                     var extension = (SwitchExtension)Extension;
156                     if (extension != null)
157                     {
158                         thumb = extension.OnCreateThumb(this, thumb);
159                     }
160                     Add(thumb);
161                 }
162                 return thumb;
163             }
164             internal set
165             {
166                 thumb = value;
167             }
168         }
169
170         /// <summary>
171         /// Switch's track part.
172         /// </summary>
173         /// <since_tizen> 6 </since_tizen>
174         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
175         [EditorBrowsable(EditorBrowsableState.Never)]
176         public string SwitchBackgroundImageURL
177         {
178             get
179             {
180                 return Style?.Track?.ResourceUrl?.All;
181             }
182             set
183             {
184                 if (null != value && null != Style?.Track)
185                 {
186                     Style.Track.ResourceUrl = value;
187                 }
188             }
189         }
190
191         /// <summary>
192         /// Background image's resource url selector in Switch.
193         /// </summary>
194         /// <since_tizen> 6 </since_tizen>
195         public StringSelector SwitchBackgroundImageURLSelector
196         {
197             get
198             {
199                 StringSelector strSl = new StringSelector();
200                 strSl.Clone(Style?.Track?.ResourceUrl);
201                 return strSl;
202             }
203             set
204             {
205                 if (null != value && null != Style?.Track)
206                 {
207                     Style.Track.ResourceUrl = value;
208                 }
209             }
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 Style?.Thumb?.ResourceUrl?.All;
221             }
222             set
223             {
224                 if (null != value && null != Style?.Thumb)
225                 {
226                     Style.Thumb.ResourceUrl = value;
227                 }
228             }
229         }
230
231         /// <summary>
232         /// Handler image's resource url selector in Switch.
233         /// </summary>
234         /// <since_tizen> 6 </since_tizen>
235         public StringSelector SwitchHandlerImageURLSelector
236         {
237             get
238             {
239                 StringSelector strSl = new StringSelector();
240                 strSl.Clone(Style?.Thumb?.ResourceUrl);
241                 return strSl;
242             }
243             set
244             {
245                 if (null != value && null != Style?.Thumb)
246                 {
247                     Style.Thumb.ResourceUrl = value;
248                 }
249             }
250         }
251
252         /// <summary>
253         /// Handler image's size in Switch.
254         /// </summary>
255         /// <since_tizen> 6 </since_tizen>
256         public Size SwitchHandlerImageSize
257         {
258             get
259             {
260                 return Style?.Thumb?.Size;
261             }
262             set
263             {
264                 if (null != Style?.Thumb)
265                 {
266                     Style.Thumb.Size = value;
267                 }
268             }
269         }
270
271         /// <summary>
272         /// Dispose Switch and all children on it.
273         /// </summary>
274         /// <param name="type">Dispose type.</param>
275         /// <since_tizen> 6 </since_tizen>
276         protected override void Dispose(DisposeTypes type)
277         {
278             if (disposed) return;
279
280             if (type == DisposeTypes.Explicit)
281             {
282                 Utility.Dispose(Thumb);
283                 Utility.Dispose(Track);
284             }
285
286             base.Dispose(type);
287         }
288
289         /// <summary>
290         /// Called after a key event is received by the view that has had its focus set.
291         /// </summary>
292         /// <param name="key">The key event.</param>
293         /// <returns>True if the key event should be consumed.</returns>
294         /// <since_tizen> 6 </since_tizen>
295         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
296         [EditorBrowsable(EditorBrowsableState.Never)]
297         public override bool OnKey(Key key)
298         {
299             if (!IsEnabled || null == key) return false;
300
301             bool ret = base.OnKey(key);
302             if (key.State == Key.StateType.Up)
303             {
304                 if (key.KeyPressedName == "Return")
305                 {
306                     OnSelect();
307                 }
308             }
309
310             return ret;
311         }
312
313         /// <summary>
314         /// Called after a touch event is received by the owning view.<br />
315         /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
316         /// </summary>
317         /// <param name="touch">The touch event.</param>
318         /// <returns>True if the event should be consumed.</returns>
319         /// <since_tizen> 6 </since_tizen>
320         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
321         [EditorBrowsable(EditorBrowsableState.Never)]
322         public override bool OnTouch(Touch touch)
323         {
324             if(!IsEnabled || null == touch) return false;
325
326             PointStateType state = touch.GetState(0);
327             bool ret = base.OnTouch(touch);
328             switch (state)
329             {
330                 case PointStateType.Up:
331                     OnSelect();
332                     break;
333                 default:
334                     break;
335             }
336             return ret;
337         }
338
339         /// <summary>
340         /// Get Switch style.
341         /// </summary>
342         /// <returns>The default switch style.</returns>
343         /// <since_tizen> 8 </since_tizen>
344         protected override ViewStyle CreateViewStyle()
345         {
346             return new SwitchStyle();
347         }
348
349         private void Initialize()
350         {
351             Style.IsSelectable = true;
352         }
353
354         /// <summary>
355         /// Theme change callback when theme is changed, this callback will be trigger.
356         /// </summary>
357         /// <param name="sender">The sender</param>
358         /// <param name="e">The event data</param>
359         /// <since_tizen> 8 </since_tizen>
360         protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
361         {
362             SwitchStyle switchStyle = StyleManager.Instance.GetViewStyle(style) as SwitchStyle;
363             if (null != switchStyle)
364             {
365                 Style.CopyFrom(switchStyle);
366             }
367         }
368
369         private void OnSelect()
370         {
371             if (SelectedEvent != null)
372             {
373                 SelectEventArgs eventArgs = new SelectEventArgs();
374                 eventArgs.IsSelected = IsSelected;
375                 SelectedEvent(this, eventArgs);
376             }
377         }
378
379         /// <summary>
380         /// SelectEventArgs is a class to record item selected arguments which will sent to user.
381         /// </summary>
382         /// <since_tizen> 6 </since_tizen>
383         public class SelectEventArgs : EventArgs
384         {
385             /// <summary> Select state of Switch </summary>
386             /// <since_tizen> 6 </since_tizen>
387             public bool IsSelected;
388         }
389
390         /// <summary>
391         /// Get current track part to the attached SwitchExtension.
392         /// </summary>
393         /// <remarks>
394         /// It returns null if the passed extension is invaild.
395         /// </remarks>
396         /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
397         /// <return>The switch's track part.</return>
398         [EditorBrowsable(EditorBrowsableState.Never)]
399         public ImageView GetCurrentTrack(SwitchExtension extension)
400         {
401             return (extension == Extension) ? Track : null;
402         }
403
404          /// <summary>
405         /// Get current thumb part to the attached SwitchExtension.
406         /// </summary>
407         /// <remarks>
408         /// It returns null if the passed extension is invaild.
409         /// </remarks>
410         /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
411         /// <return>The switch's thumb part.</return>
412         [EditorBrowsable(EditorBrowsableState.Never)]
413         public ImageView GetCurrentThumb(SwitchExtension extension)
414         {
415             return (extension == Extension) ? Thumb : null;
416         }
417     }
418 }