2 * Copyright(c) 2019 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 Tizen.NUI.BaseComponents;
20 using Tizen.NUI.Components.Extension;
22 namespace Tizen.NUI.Components
25 /// Switch is one kind of common component, it can be used as selector.
26 /// User can handle Navigation by adding/inserting/deleting NavigationItem.
28 /// <since_tizen> 6 </since_tizen>
29 public class Switch : Button
31 private ImageView track = null;
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()
68 track = new ImageView();
69 thumb = new ImageView();
73 SetAccessibilityConstructor(Role.ToggleButton);
82 /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
84 [EditorBrowsable(EditorBrowsableState.Never)]
85 protected override AccessibilityStates AccessibilityCalculateStates()
87 var states = base.AccessibilityCalculateStates();
88 states.Set(AccessibilityState.Checked, this.IsSelected);
93 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
95 /// <since_tizen> 6 </since_tizen>
96 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChanged event instead.")]
97 public event EventHandler<SelectEventArgs> SelectedEvent;
100 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
102 /// <since_tizen> 8 </since_tizen>
103 public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
106 /// Return currently applied style.
109 /// Modifying contents in style may cause unexpected behaviour.
111 /// <since_tizen> 8 </since_tizen>
112 public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
115 /// Apply style to switch.
117 /// <param name="viewStyle">The style to apply.</param>
118 [EditorBrowsable(EditorBrowsableState.Never)]
119 public override void ApplyStyle(ViewStyle viewStyle)
121 if (viewStyle is SwitchStyle switchStyle)
123 if (Extension is SwitchExtension extension)
127 track = extension.OnCreateTrack(this, track);
128 thumb = extension.OnCreateThumb(this, thumb);
132 if (switchStyle.Track != null)
134 Track.ApplyStyle(switchStyle.Track);
137 if (switchStyle.Thumb != null)
139 Thumb.ApplyStyle(switchStyle.Thumb);
143 base.ApplyStyle(viewStyle);
147 /// Switch's track part.
149 /// <since_tizen> 8 </since_tizen>
150 public ImageView Track
160 /// Switch's thumb part.
162 /// <since_tizen> 8 </since_tizen>
163 public ImageView Thumb
173 /// Background image's resource url selector in Switch.
175 /// <since_tizen> 6 </since_tizen>
176 public StringSelector SwitchBackgroundImageURLSelector
178 get => track == null ? null : new StringSelector((Selector<string>)track.GetValue(ImageView.ResourceUrlSelectorProperty));
179 set => track?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
183 /// Handler image's resource url in Switch.
185 /// <since_tizen> 6 </since_tizen>
186 public string SwitchHandlerImageURL
190 return Thumb.ResourceUrl;
194 Thumb.ResourceUrl = value;
199 /// Handler image's resource url selector in Switch.
200 /// Getter returns copied selector value if exist, null otherwise.
202 /// <since_tizen> 6 </since_tizen>
203 public StringSelector SwitchHandlerImageURLSelector
205 get => thumb == null ? null : new StringSelector((Selector<string>)thumb.GetValue(ImageView.ResourceUrlSelectorProperty));
206 set => thumb?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
210 /// Handler image's size in Switch.
212 /// <since_tizen> 6 </since_tizen>
213 public Size SwitchHandlerImageSize
226 /// Dispose Switch and all children on it.
228 /// <param name="type">Dispose type.</param>
229 /// <since_tizen> 6 </since_tizen>
230 protected override void Dispose(DisposeTypes type)
232 if (disposed) return;
234 if (type == DisposeTypes.Explicit)
236 Utility.Dispose(Thumb);
237 Utility.Dispose(Track);
244 /// Called after a key event is received by the view that has had its focus set.
246 /// <param name="key">The key event.</param>
247 /// <returns>True if the key event should be consumed.</returns>
248 /// <since_tizen> 8 </since_tizen>
249 public override bool OnKey(Key key)
251 return base.OnKey(key);
255 /// Called after a touch event is received by the owning view.<br />
256 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
258 /// <param name="touch">The touch event.</param>
259 /// <returns>True if the event should be consumed.</returns>
260 /// <since_tizen> 8 </since_tizen>
261 [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
262 #pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
263 public override bool OnTouch(Touch touch)
264 #pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
266 return base.OnTouch(touch);
270 /// Get Switch style.
272 /// <returns>The default switch style.</returns>
273 /// <since_tizen> 8 </since_tizen>
274 protected override ViewStyle CreateViewStyle()
276 return new SwitchStyle();
280 [EditorBrowsable(EditorBrowsableState.Never)]
281 protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
283 base.OnControlStateChanged(controlStateChangedInfo);
290 bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
292 if (previousSelected != IsSelected)
299 [EditorBrowsable(EditorBrowsableState.Never)]
300 protected override void LayoutItems()
305 track.LowerToBottom();
308 private void OnSelect()
312 EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, IsSelected);
315 ((SwitchExtension)Extension)?.OnSelectedChanged(this);
317 if (SelectedEvent != null)
319 SelectEventArgs eventArgs = new SelectEventArgs();
320 eventArgs.IsSelected = IsSelected;
321 SelectedEvent(this, eventArgs);
324 if (SelectedChanged != null)
326 SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
327 eventArgs.IsSelected = IsSelected;
328 SelectedChanged(this, eventArgs);
333 /// SelectEventArgs is a class to record item selected arguments which will sent to user.
335 /// <since_tizen> 6 </since_tizen>
336 /// It will be removed in API10
337 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChangedEventArgs instead.")]
338 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
339 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
340 public class SelectEventArgs : EventArgs
342 /// <summary> Select state of Switch </summary>
343 /// <since_tizen> 6 </since_tizen>
344 public bool IsSelected;