/*
- * 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>
public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
/// <summary>
- /// Return a copied Style instance of Switch
+ /// Return currently applied style.
/// </summary>
/// <remarks>
- /// It returns copied Style instance and changing it does not effect to the Switch.
- /// Style setting is possible by using constructor or the function of ApplyStyle(ViewStyle viewStyle)
+ /// Modifying contents in style may cause unexpected behaviour.
/// </remarks>
/// <since_tizen> 8 </since_tizen>
- public new SwitchStyle Style
- {
- get
- {
- var result = new SwitchStyle(ViewStyle as SwitchStyle);
- result.CopyPropertiesFromView(this);
- result.Track.CopyPropertiesFromView(Track);
- result.Thumb.CopyPropertiesFromView(Thumb);
- return result;
- }
- }
+ 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 => track == null ? null : new StringSelector((Selector<string>)track.GetValue(ImageView.ResourceUrlSelectorProperty));
- set => track?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
+ get
+ {
+ return GetValue(SwitchBackgroundImageURLSelectorProperty) as StringSelector;
+ }
+ set
+ {
+ SetValue(SwitchBackgroundImageURLSelectorProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private StringSelector InternalSwitchBackgroundImageURLSelector
+ {
+ get => Icon?.ResourceUrlSelector == null ? null : new StringSelector(Icon.ResourceUrlSelector);
+ set
+ {
+ Debug.Assert(Icon != null);
+ Icon.ResourceUrlSelector = value;
+ }
}
/// <summary>
{
get
{
+ return GetValue(SwitchHandlerImageURLProperty) as string;
+ }
+ set
+ {
+ SetValue(SwitchHandlerImageURLProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private string InternalSwitchHandlerImageURL
+ {
+ get
+ {
return Thumb.ResourceUrl;
}
set
/// <since_tizen> 6 </since_tizen>
public StringSelector SwitchHandlerImageURLSelector
{
- get => thumb == null ? null : new StringSelector((Selector<string>)thumb.GetValue(ImageView.ResourceUrlSelectorProperty));
- set => thumb?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
+ get
+ {
+ return GetValue(SwitchHandlerImageURLSelectorProperty) as StringSelector;
+ }
+ set
+ {
+ SetValue(SwitchHandlerImageURLSelectorProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private StringSelector InternalSwitchHandlerImageURLSelector
+ {
+ get => new StringSelector(thumb.ResourceUrlSelector);
+ set
+ {
+ Debug.Assert(thumb != null);
+ thumb.ResourceUrlSelector = value;
+ }
}
/// <summary>
{
get
{
+ return GetValue(SwitchHandlerImageSizeProperty) as Size;
+ }
+ set
+ {
+ SetValue(SwitchHandlerImageSizeProperty, value);
+ NotifyPropertyChanged();
+ }
+ }
+ private Size InternalSwitchHandlerImageSize
+ {
+ get
+ {
return Thumb.Size;
}
set
if (type == DisposeTypes.Explicit)
{
- Utility.Dispose(Thumb);
- Utility.Dispose(Track);
+ Utility.Dispose(thumb);
}
base.Dispose(type);
/// <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
{
return base.OnTouch(touch);
}
/// <inheritdoc/>
[EditorBrowsable(EditorBrowsableState.Never)]
+ protected override ImageView CreateIcon()
+ {
+ var icon = new ImageView()
+ {
+ AccessibilityHighlightable = false,
+ EnableControlStatePropagation = true
+ };
+
+ thumb = new ImageView();
+ icon.Add(thumb);
+
+ return icon;
+ }
+
+ /// <inheritdoc/>
+ [EditorBrowsable(EditorBrowsableState.Never)]
protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
{
base.OnControlStateChanged(controlStateChangedInfo);
}
}
- private void Initialize()
- {
- IsSelectable = true;
- }
-
private void OnSelect()
{
+ if (Accessibility.Accessibility.Enabled && IsHighlighted)
+ {
+ EmitAccessibilityStatesChangedEvent(AccessibilityStates.Checked, IsSelected);
+ }
+
((SwitchExtension)Extension)?.OnSelectedChanged(this);
if (SelectedEvent != null)
/// 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
{