/*
- * Copyright(c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright(c) 2021 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
using System;
using System.ComponentModel;
+using System.Diagnostics;
using Tizen.NUI.BaseComponents;
using Tizen.NUI.Components.Extension;
namespace Tizen.NUI.Components
{
/// <summary>
- /// Switch is one kind of common component, it can be used as selector.
- /// User can handle Navigation by adding/inserting/deleting NavigationItem.
+ /// Switch is a kind of <see cref="Button"/> component that uses icon part as a toggle shape.
+ /// The icon part consists of track and thumb.
/// </summary>
/// <since_tizen> 6 </since_tizen>
- public class Switch : Button
+ public partial class Switch : Button
{
- private ImageView track = null;
private ImageView thumb = null;
static Switch() { }
/// <since_tizen> 6 </since_tizen>
public Switch() : base()
{
- Initialize();
}
/// <summary>
/// <since_tizen> 8 </since_tizen>
public Switch(string style) : base(style)
{
- Initialize();
}
/// <summary>
/// <since_tizen> 8 </since_tizen>
public Switch(SwitchStyle switchStyle) : base(switchStyle)
{
- Initialize();
+ }
+
+ /// <summary>
+ /// Initialize AT-SPI object.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void OnInitialize()
+ {
+ base.OnInitialize();
+ SetAccessibilityConstructor(Role.ToggleButton);
+
+ IsSelectable = true;
+#if PROFILE_MOBILE
+ Feedback = true;
+#endif
+ }
+
+ /// <summary>
+ /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+ {
+ var accessibilityStates = base.AccessibilityCalculateStates(states);
+ FlagSetter(ref accessibilityStates, AccessibilityStates.Checked, this.IsSelected);
+ return accessibilityStates;
}
/// <summary>
/// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
/// </summary>
/// <since_tizen> 6 </since_tizen>
+ [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChanged event instead.")]
public event EventHandler<SelectEventArgs> SelectedEvent;
/// <summary>
- /// Get style of switch.
+ /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
/// </summary>
/// <since_tizen> 8 </since_tizen>
- public new SwitchStyle Style => ViewStyle as SwitchStyle;
+ public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
+
+ /// <summary>
+ /// Return currently applied style.
+ /// </summary>
+ /// <remarks>
+ /// Modifying contents in style may cause unexpected behaviour.
+ /// </remarks>
+ /// <since_tizen> 8 </since_tizen>
+ public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
/// <summary>
/// Apply style to switch.
[EditorBrowsable(EditorBrowsableState.Never)]
public override void ApplyStyle(ViewStyle viewStyle)
{
- base.ApplyStyle(viewStyle);
-
- SwitchStyle swStyle = viewStyle as SwitchStyle;
-
- if (null != swStyle)
+ if (viewStyle is SwitchStyle switchStyle)
{
- if (swStyle.Track != null)
+ if (Extension is SwitchExtension extension)
{
- Track.ApplyStyle(swStyle.Track);
+ Icon.Unparent();
+ thumb.Unparent();
+ Icon = extension.OnCreateTrack(this, Icon);
+ thumb = extension.OnCreateThumb(this, thumb);
+ Icon.Add(thumb);
+ LayoutItems();
}
- if (swStyle.Thumb != null)
+ if (switchStyle.Track != null)
{
- Thumb.ApplyStyle(swStyle.Thumb);
+ Track.ApplyStyle(switchStyle.Track);
+ }
+
+ if (switchStyle.Thumb != null)
+ {
+ Thumb.ApplyStyle(switchStyle.Thumb);
}
}
+
+ base.ApplyStyle(viewStyle);
}
/// <summary>
/// <since_tizen> 8 </since_tizen>
public ImageView Track
{
- get
- {
- if (track == null)
- {
- track = new ImageView()
- {
- PositionUsesPivotPoint = true,
- ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
- PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
- WidthResizePolicy = ResizePolicyType.FillToParent,
- HeightResizePolicy = ResizePolicyType.FillToParent
- };
-
- var extension = (SwitchExtension)Extension;
- if (extension != null)
- {
- track = extension.OnCreateTrack(this, track);
- }
- Add(track);
- }
- return track;
- }
+ get => Icon;
internal set
{
- track = value;
+ Icon = value;
}
}
/// <since_tizen> 8 </since_tizen>
public ImageView Thumb
{
- get
- {
- if (thumb == null)
- {
- thumb = new ImageView()
- {
- PositionUsesPivotPoint = true,
- ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
- PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
- WidthResizePolicy = ResizePolicyType.Fixed,
- HeightResizePolicy = ResizePolicyType.Fixed
- };
-
- var extension = (SwitchExtension)Extension;
- if (extension != null)
- {
- thumb = extension.OnCreateThumb(this, thumb);
- }
- Add(thumb);
- }
- return thumb;
- }
+ get => thumb;
internal set
{
thumb = value;
}
/// <summary>
- /// Background image's resource url selector in Switch.
+ /// Switch's track part image url selector.
/// </summary>
/// <since_tizen> 6 </since_tizen>
public StringSelector SwitchBackgroundImageURLSelector
{
get
{
- StringSelector strSl = new StringSelector();
- strSl.Clone(Style?.Track?.ResourceUrl);
- return strSl;
+ return GetValue(SwitchBackgroundImageURLSelectorProperty) as StringSelector;
}
set
{
- if (null != value && null != Style?.Track)
- {
- Style.Track.ResourceUrl = value;
- }
+ SetValue(SwitchBackgroundImageURLSelectorProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private StringSelector InternalSwitchBackgroundImageURLSelector
+ {
+ get => Icon?.ResourceUrlSelector == null ? null : new StringSelector(Icon.ResourceUrlSelector);
+ set
+ {
+ Debug.Assert(Icon != null);
+ Icon.ResourceUrlSelector = value;
}
}
{
get
{
- return Style?.Thumb?.ResourceUrl?.All;
+ return GetValue(SwitchHandlerImageURLProperty) as string;
}
set
{
- if (null != value && null != Style?.Thumb)
- {
- Style.Thumb.ResourceUrl = value;
- }
+ SetValue(SwitchHandlerImageURLProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private string InternalSwitchHandlerImageURL
+ {
+ get
+ {
+ return Thumb.ResourceUrl;
+ }
+ set
+ {
+ Thumb.ResourceUrl = value;
}
}
/// <summary>
/// Handler image's resource url selector in Switch.
+ /// Getter returns copied selector value if exist, null otherwise.
/// </summary>
/// <since_tizen> 6 </since_tizen>
public StringSelector SwitchHandlerImageURLSelector
{
get
{
- StringSelector strSl = new StringSelector();
- strSl.Clone(Style?.Thumb?.ResourceUrl);
- return strSl;
+ return GetValue(SwitchHandlerImageURLSelectorProperty) as StringSelector;
}
set
{
- if (null != value && null != Style?.Thumb)
- {
- Style.Thumb.ResourceUrl = value;
- }
+ SetValue(SwitchHandlerImageURLSelectorProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private StringSelector InternalSwitchHandlerImageURLSelector
+ {
+ get => new StringSelector(thumb.ResourceUrlSelector);
+ set
+ {
+ Debug.Assert(thumb != null);
+ thumb.ResourceUrlSelector = value;
}
}
{
get
{
- return Style?.Thumb?.Size;
+ return GetValue(SwitchHandlerImageSizeProperty) as Size;
}
set
{
- if (null != Style?.Thumb)
- {
- Style.Thumb.Size = value;
- }
+ SetValue(SwitchHandlerImageSizeProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private Size InternalSwitchHandlerImageSize
+ {
+ get
+ {
+ return Thumb.Size;
+ }
+ set
+ {
+ Thumb.Size = value;
}
}
if (type == DisposeTypes.Explicit)
{
- Utility.Dispose(Thumb);
- Utility.Dispose(Track);
+ Utility.Dispose(thumb);
}
base.Dispose(type);
/// <since_tizen> 8 </since_tizen>
public override bool OnKey(Key key)
{
- if (!IsEnabled || null == key) return false;
-
- bool ret = base.OnKey(key);
- if (key.State == Key.StateType.Up)
- {
- if (key.KeyPressedName == "Return")
- {
- OnSelect();
- }
- }
-
- return ret;
+ return base.OnKey(key);
}
/// <summary>
/// <param name="touch">The touch event.</param>
/// <returns>True if the event should be consumed.</returns>
/// <since_tizen> 8 </since_tizen>
+ [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
+#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
public override bool OnTouch(Touch touch)
+#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
{
- if(!IsEnabled || null == touch) return false;
-
- PointStateType state = touch.GetState(0);
- bool ret = base.OnTouch(touch);
- switch (state)
- {
- case PointStateType.Up:
- OnSelect();
- break;
- default:
- break;
- }
- return ret;
+ return base.OnTouch(touch);
}
/// <summary>
return new SwitchStyle();
}
- private void Initialize()
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected override ImageView CreateIcon()
{
- Style.IsSelectable = true;
+ var icon = new ImageView()
+ {
+ AccessibilityHighlightable = false,
+ EnableControlStatePropagation = true
+ };
+
+ thumb = new ImageView();
+ icon.Add(thumb);
+
+ return icon;
}
- /// <summary>
- /// Theme change callback when theme is changed, this callback will be trigger.
- /// </summary>
- /// <param name="sender">The sender</param>
- /// <param name="e">The event data</param>
+ /// <inheritdoc/>
[EditorBrowsable(EditorBrowsableState.Never)]
- protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
+ protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
{
- SwitchStyle switchStyle = StyleManager.Instance.GetViewStyle(StyleName) as SwitchStyle;
- if (null != switchStyle)
+ base.OnControlStateChanged(controlStateChangedInfo);
+
+ if (!IsSelectable)
{
- Style.CopyFrom(switchStyle);
+ return;
+ }
+
+ bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
+
+ if (previousSelected != IsSelected)
+ {
+ OnSelect();
}
}
private void OnSelect()
{
+ if (Accessibility.Accessibility.Enabled && IsHighlighted)
+ {
+ EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, IsSelected);
+ }
+
+ ((SwitchExtension)Extension)?.OnSelectedChanged(this);
+
if (SelectedEvent != null)
{
SelectEventArgs eventArgs = new SelectEventArgs();
eventArgs.IsSelected = IsSelected;
SelectedEvent(this, eventArgs);
}
+
+ if (SelectedChanged != null)
+ {
+ SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
+ eventArgs.IsSelected = IsSelected;
+ SelectedChanged(this, eventArgs);
+ }
}
/// <summary>
/// SelectEventArgs is a class to record item selected arguments which will sent to user.
/// </summary>
/// <since_tizen> 6 </since_tizen>
+ /// It will be removed in API10
+ [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChangedEventArgs instead.")]
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
public class SelectEventArgs : EventArgs
{
/// <summary> Select state of Switch </summary>
/// <since_tizen> 6 </since_tizen>
public bool IsSelected;
}
-
- /// <summary>
- /// Get current track part to the attached SwitchExtension.
- /// </summary>
- /// <remarks>
- /// It returns null if the passed extension is invaild.
- /// </remarks>
- /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
- /// <return>The switch's track part.</return>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public ImageView GetCurrentTrack(SwitchExtension extension)
- {
- return (extension == Extension) ? Track : null;
- }
-
- /// <summary>
- /// Get current thumb part to the attached SwitchExtension.
- /// </summary>
- /// <remarks>
- /// It returns null if the passed extension is invaild.
- /// </remarks>
- /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
- /// <return>The switch's thumb part.</return>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public ImageView GetCurrentThumb(SwitchExtension extension)
- {
- return (extension == Extension) ? Thumb : null;
- }
}
}