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 a kind of <see cref="Button"/> component that uses icon part as a toggle shape.
27 /// The icon part consists of track and thumb.
29 /// <since_tizen> 6 </since_tizen>
30 public partial class Switch : Button
32 private ImageView thumb = null;
37 /// Creates a new instance of a Switch.
39 /// <since_tizen> 6 </since_tizen>
40 public Switch() : base()
45 /// Creates a new instance of a Switch with style.
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)
54 /// Creates a new instance of a Switch with style.
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)
63 /// Initialize AT-SPI object.
65 [EditorBrowsable(EditorBrowsableState.Never)]
66 public override void OnInitialize()
69 SetAccessibilityConstructor(Role.ToggleButton);
78 /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
80 [EditorBrowsable(EditorBrowsableState.Never)]
81 protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
83 var accessibilityStates = base.AccessibilityCalculateStates(states);
84 FlagSetter(ref accessibilityStates, AccessibilityStates.Checked, this.IsSelected);
85 return accessibilityStates;
89 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
91 /// <since_tizen> 6 </since_tizen>
92 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChanged event instead.")]
93 public event EventHandler<SelectEventArgs> SelectedEvent;
96 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
98 /// <since_tizen> 8 </since_tizen>
99 public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
102 /// Return currently applied style.
105 /// Modifying contents in style may cause unexpected behaviour.
107 /// <since_tizen> 8 </since_tizen>
108 public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
111 /// Apply style to switch.
113 /// <param name="viewStyle">The style to apply.</param>
114 [EditorBrowsable(EditorBrowsableState.Never)]
115 public override void ApplyStyle(ViewStyle viewStyle)
117 if (viewStyle is SwitchStyle switchStyle)
119 if (Extension is SwitchExtension extension)
123 Icon = extension.OnCreateTrack(this, Icon);
124 thumb = extension.OnCreateThumb(this, thumb);
129 if (switchStyle.Track != null)
131 Track.ApplyStyle(switchStyle.Track);
134 if (switchStyle.Thumb != null)
136 Thumb.ApplyStyle(switchStyle.Thumb);
140 base.ApplyStyle(viewStyle);
144 /// Switch's track part.
146 /// <since_tizen> 8 </since_tizen>
147 public ImageView Track
157 /// Switch's thumb part.
159 /// <since_tizen> 8 </since_tizen>
160 public ImageView Thumb
170 /// Switch's track part image url selector.
172 /// <since_tizen> 6 </since_tizen>
173 public StringSelector SwitchBackgroundImageURLSelector
177 return GetValue(SwitchBackgroundImageURLSelectorProperty) as StringSelector;
181 SetValue(SwitchBackgroundImageURLSelectorProperty, value);
182 NotifyPropertyChanged();
185 private StringSelector InternalSwitchBackgroundImageURLSelector
187 get => new StringSelector(Icon.ResourceUrlSelector);
190 Debug.Assert(Icon != null);
191 Icon.ResourceUrlSelector = value;
196 /// Handler image's resource url in Switch.
198 /// <since_tizen> 6 </since_tizen>
199 public string SwitchHandlerImageURL
203 return GetValue(SwitchHandlerImageURLProperty) as string;
207 SetValue(SwitchHandlerImageURLProperty, value);
208 NotifyPropertyChanged();
211 private string InternalSwitchHandlerImageURL
215 return Thumb.ResourceUrl;
219 Thumb.ResourceUrl = value;
224 /// Handler image's resource url selector in Switch.
225 /// Getter returns copied selector value if exist, null otherwise.
227 /// <since_tizen> 6 </since_tizen>
228 public StringSelector SwitchHandlerImageURLSelector
232 return GetValue(SwitchHandlerImageURLSelectorProperty) as StringSelector;
236 SetValue(SwitchHandlerImageURLSelectorProperty, value);
237 NotifyPropertyChanged();
240 private StringSelector InternalSwitchHandlerImageURLSelector
242 get => new StringSelector(thumb.ResourceUrlSelector);
245 Debug.Assert(thumb != null);
246 thumb.ResourceUrlSelector = value;
251 /// Handler image's size in Switch.
253 /// <since_tizen> 6 </since_tizen>
254 public Size SwitchHandlerImageSize
258 return GetValue(SwitchHandlerImageSizeProperty) as Size;
262 SetValue(SwitchHandlerImageSizeProperty, value);
263 NotifyPropertyChanged();
266 private Size InternalSwitchHandlerImageSize
279 /// Dispose Switch and all children on it.
281 /// <param name="type">Dispose type.</param>
282 /// <since_tizen> 6 </since_tizen>
283 protected override void Dispose(DisposeTypes type)
285 if (disposed) return;
287 if (type == DisposeTypes.Explicit)
289 Utility.Dispose(thumb);
296 /// Called after a key event is received by the view that has had its focus set.
298 /// <param name="key">The key event.</param>
299 /// <returns>True if the key event should be consumed.</returns>
300 /// <since_tizen> 8 </since_tizen>
301 public override bool OnKey(Key key)
303 return base.OnKey(key);
307 /// Called after a touch event is received by the owning view.<br />
308 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
310 /// <param name="touch">The touch event.</param>
311 /// <returns>True if the event should be consumed.</returns>
312 /// <since_tizen> 8 </since_tizen>
313 [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
314 #pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
315 public override bool OnTouch(Touch touch)
316 #pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
318 return base.OnTouch(touch);
322 /// Get Switch style.
324 /// <returns>The default switch style.</returns>
325 /// <since_tizen> 8 </since_tizen>
326 protected override ViewStyle CreateViewStyle()
328 return new SwitchStyle();
332 [EditorBrowsable(EditorBrowsableState.Never)]
333 protected override ImageView CreateIcon()
335 var icon = new ImageView()
337 AccessibilityHighlightable = false,
338 EnableControlStatePropagation = true
341 thumb = new ImageView();
348 [EditorBrowsable(EditorBrowsableState.Never)]
349 protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
351 base.OnControlStateChanged(controlStateChangedInfo);
358 bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
360 if (previousSelected != IsSelected)
366 private void OnSelect()
368 if (Accessibility.Accessibility.Enabled && IsHighlighted)
370 EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, IsSelected);
373 ((SwitchExtension)Extension)?.OnSelectedChanged(this);
375 if (SelectedEvent != null)
377 SelectEventArgs eventArgs = new SelectEventArgs();
378 eventArgs.IsSelected = IsSelected;
379 SelectedEvent(this, eventArgs);
382 if (SelectedChanged != null)
384 SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
385 eventArgs.IsSelected = IsSelected;
386 SelectedChanged(this, eventArgs);
391 /// SelectEventArgs is a class to record item selected arguments which will sent to user.
393 /// <since_tizen> 6 </since_tizen>
394 /// It will be removed in API10
395 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChangedEventArgs instead.")]
396 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
397 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
398 public class SelectEventArgs : EventArgs
400 /// <summary> Select state of Switch </summary>
401 /// <since_tizen> 6 </since_tizen>
402 public bool IsSelected;