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