2 * Copyright(c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 using System.ComponentModel;
19 using System.Diagnostics;
20 using Tizen.NUI.BaseComponents;
21 using Tizen.NUI.Components.Extension;
23 namespace Tizen.NUI.Components
26 /// Switch is one kind of common component, it can be used as selector.
27 /// User can handle Navigation by adding/inserting/deleting NavigationItem.
29 /// <since_tizen> 6 </since_tizen>
30 public class Switch : Button
32 private ImageView track = null;
33 private ImageView thumb = null;
38 /// Creates a new instance of a Switch.
40 /// <since_tizen> 6 </since_tizen>
41 public Switch() : base()
46 /// Creates a new instance of a Switch with style.
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)
55 /// Creates a new instance of a Switch with style.
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)
64 /// Initialize AT-SPI object.
66 [EditorBrowsable(EditorBrowsableState.Never)]
67 public override void OnInitialize()
69 track = new ImageView()
71 EnableControlStatePropagation = true
73 thumb = new ImageView();
77 SetAccessibilityConstructor(Role.ToggleButton);
86 /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
88 [EditorBrowsable(EditorBrowsableState.Never)]
89 protected override AccessibilityStates AccessibilityCalculateStates()
91 var states = base.AccessibilityCalculateStates();
92 states.Set(AccessibilityState.Checked, this.IsSelected);
97 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
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;
104 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
106 /// <since_tizen> 8 </since_tizen>
107 public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
110 /// Return currently applied style.
113 /// Modifying contents in style may cause unexpected behaviour.
115 /// <since_tizen> 8 </since_tizen>
116 public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
119 /// Apply style to switch.
121 /// <param name="viewStyle">The style to apply.</param>
122 [EditorBrowsable(EditorBrowsableState.Never)]
123 public override void ApplyStyle(ViewStyle viewStyle)
125 if (viewStyle is SwitchStyle switchStyle)
127 if (Extension is SwitchExtension extension)
131 track = extension.OnCreateTrack(this, track);
132 thumb = extension.OnCreateThumb(this, thumb);
136 if (switchStyle.Track != null)
138 Track.ApplyStyle(switchStyle.Track);
141 if (switchStyle.Thumb != null)
143 Thumb.ApplyStyle(switchStyle.Thumb);
147 base.ApplyStyle(viewStyle);
151 /// Switch's track part.
153 /// <since_tizen> 8 </since_tizen>
154 public ImageView Track
164 /// Switch's thumb part.
166 /// <since_tizen> 8 </since_tizen>
167 public ImageView Thumb
177 /// Background image's resource url selector in Switch.
179 /// <since_tizen> 6 </since_tizen>
180 public StringSelector SwitchBackgroundImageURLSelector
182 get => new StringSelector(track.ResourceUrlSelector);
185 Debug.Assert(track != null);
186 track.ResourceUrlSelector = value;
191 /// Handler image's resource url in Switch.
193 /// <since_tizen> 6 </since_tizen>
194 public string SwitchHandlerImageURL
198 return Thumb.ResourceUrl;
202 Thumb.ResourceUrl = value;
207 /// Handler image's resource url selector in Switch.
208 /// Getter returns copied selector value if exist, null otherwise.
210 /// <since_tizen> 6 </since_tizen>
211 public StringSelector SwitchHandlerImageURLSelector
213 get => new StringSelector(thumb.ResourceUrlSelector);
216 Debug.Assert(thumb != null);
217 thumb.ResourceUrlSelector = value;
222 /// Handler image's size in Switch.
224 /// <since_tizen> 6 </since_tizen>
225 public Size SwitchHandlerImageSize
238 /// Dispose Switch and all children on it.
240 /// <param name="type">Dispose type.</param>
241 /// <since_tizen> 6 </since_tizen>
242 protected override void Dispose(DisposeTypes type)
244 if (disposed) return;
246 if (type == DisposeTypes.Explicit)
248 Utility.Dispose(Thumb);
249 Utility.Dispose(Track);
256 /// Called after a key event is received by the view that has had its focus set.
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)
263 return base.OnKey(key);
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 />
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
278 return base.OnTouch(touch);
282 /// Get Switch style.
284 /// <returns>The default switch style.</returns>
285 /// <since_tizen> 8 </since_tizen>
286 protected override ViewStyle CreateViewStyle()
288 return new SwitchStyle();
292 [EditorBrowsable(EditorBrowsableState.Never)]
293 protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
295 base.OnControlStateChanged(controlStateChangedInfo);
302 bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
304 if (previousSelected != IsSelected)
311 [EditorBrowsable(EditorBrowsableState.Never)]
312 protected override void LayoutItems()
317 track.LowerToBottom();
320 private void OnSelect()
324 EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, IsSelected);
327 ((SwitchExtension)Extension)?.OnSelectedChanged(this);
329 if (SelectedEvent != null)
331 SelectEventArgs eventArgs = new SelectEventArgs();
332 eventArgs.IsSelected = IsSelected;
333 SelectedEvent(this, eventArgs);
336 if (SelectedChanged != null)
338 SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
339 eventArgs.IsSelected = IsSelected;
340 SelectedChanged(this, eventArgs);
345 /// SelectEventArgs is a class to record item selected arguments which will sent to user.
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
354 /// <summary> Select state of Switch </summary>
355 /// <since_tizen> 6 </since_tizen>
356 public bool IsSelected;