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()
70 EnableControlStatePropagation = true
72 thumb = new ImageView();
76 SetAccessibilityConstructor(Role.ToggleButton);
85 /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
87 [EditorBrowsable(EditorBrowsableState.Never)]
88 protected override AccessibilityStates AccessibilityCalculateStates()
90 var states = base.AccessibilityCalculateStates();
91 states.Set(AccessibilityState.Checked, this.IsSelected);
96 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
98 /// <since_tizen> 6 </since_tizen>
99 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChanged event instead.")]
100 public event EventHandler<SelectEventArgs> SelectedEvent;
103 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
105 /// <since_tizen> 8 </since_tizen>
106 public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
109 /// Return currently applied style.
112 /// Modifying contents in style may cause unexpected behaviour.
114 /// <since_tizen> 8 </since_tizen>
115 public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
118 /// Apply style to switch.
120 /// <param name="viewStyle">The style to apply.</param>
121 [EditorBrowsable(EditorBrowsableState.Never)]
122 public override void ApplyStyle(ViewStyle viewStyle)
124 if (viewStyle is SwitchStyle switchStyle)
126 if (Extension is SwitchExtension extension)
130 track = extension.OnCreateTrack(this, track);
131 thumb = extension.OnCreateThumb(this, thumb);
135 if (switchStyle.Track != null)
137 Track.ApplyStyle(switchStyle.Track);
140 if (switchStyle.Thumb != null)
142 Thumb.ApplyStyle(switchStyle.Thumb);
146 base.ApplyStyle(viewStyle);
150 /// Switch's track part.
152 /// <since_tizen> 8 </since_tizen>
153 public ImageView Track
163 /// Switch's thumb part.
165 /// <since_tizen> 8 </since_tizen>
166 public ImageView Thumb
176 /// Background image's resource url selector in Switch.
178 /// <since_tizen> 6 </since_tizen>
179 public StringSelector SwitchBackgroundImageURLSelector
181 get => track == null ? null : new StringSelector((Selector<string>)track.GetValue(ImageView.ResourceUrlSelectorProperty));
182 set => track?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
186 /// Handler image's resource url in Switch.
188 /// <since_tizen> 6 </since_tizen>
189 public string SwitchHandlerImageURL
193 return Thumb.ResourceUrl;
197 Thumb.ResourceUrl = value;
202 /// Handler image's resource url selector in Switch.
203 /// Getter returns copied selector value if exist, null otherwise.
205 /// <since_tizen> 6 </since_tizen>
206 public StringSelector SwitchHandlerImageURLSelector
208 get => thumb == null ? null : new StringSelector((Selector<string>)thumb.GetValue(ImageView.ResourceUrlSelectorProperty));
209 set => thumb?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
213 /// Handler image's size in Switch.
215 /// <since_tizen> 6 </since_tizen>
216 public Size SwitchHandlerImageSize
229 /// Dispose Switch and all children on it.
231 /// <param name="type">Dispose type.</param>
232 /// <since_tizen> 6 </since_tizen>
233 protected override void Dispose(DisposeTypes type)
235 if (disposed) return;
237 if (type == DisposeTypes.Explicit)
239 Utility.Dispose(Thumb);
240 Utility.Dispose(Track);
247 /// Called after a key event is received by the view that has had its focus set.
249 /// <param name="key">The key event.</param>
250 /// <returns>True if the key event should be consumed.</returns>
251 /// <since_tizen> 8 </since_tizen>
252 public override bool OnKey(Key key)
254 return base.OnKey(key);
258 /// Called after a touch event is received by the owning view.<br />
259 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
261 /// <param name="touch">The touch event.</param>
262 /// <returns>True if the event should be consumed.</returns>
263 /// <since_tizen> 8 </since_tizen>
264 [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
265 #pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
266 public override bool OnTouch(Touch touch)
267 #pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
269 return base.OnTouch(touch);
273 /// Get Switch style.
275 /// <returns>The default switch style.</returns>
276 /// <since_tizen> 8 </since_tizen>
277 protected override ViewStyle CreateViewStyle()
279 return new SwitchStyle();
283 [EditorBrowsable(EditorBrowsableState.Never)]
284 protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
286 base.OnControlStateChanged(controlStateChangedInfo);
293 bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
295 if (previousSelected != IsSelected)
302 [EditorBrowsable(EditorBrowsableState.Never)]
303 protected override void LayoutItems()
308 track.LowerToBottom();
311 private void OnSelect()
315 EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, IsSelected);
318 ((SwitchExtension)Extension)?.OnSelectedChanged(this);
320 if (SelectedEvent != null)
322 SelectEventArgs eventArgs = new SelectEventArgs();
323 eventArgs.IsSelected = IsSelected;
324 SelectedEvent(this, eventArgs);
327 if (SelectedChanged != null)
329 SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
330 eventArgs.IsSelected = IsSelected;
331 SelectedChanged(this, eventArgs);
336 /// SelectEventArgs is a class to record item selected arguments which will sent to user.
338 /// <since_tizen> 6 </since_tizen>
339 /// It will be removed in API10
340 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChangedEventArgs instead.")]
341 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
342 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
343 public class SelectEventArgs : EventArgs
345 /// <summary> Select state of Switch </summary>
346 /// <since_tizen> 6 </since_tizen>
347 public bool IsSelected;