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()
69 SetAccessibilityConstructor(Role.ToggleButton);
77 /// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
79 [EditorBrowsable(EditorBrowsableState.Never)]
80 protected override AccessibilityStates AccessibilityCalculateStates()
82 var states = base.AccessibilityCalculateStates();
83 states.Set(AccessibilityState.Checked, this.IsSelected);
88 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
90 /// <since_tizen> 6 </since_tizen>
91 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChanged event instead.")]
92 public event EventHandler<SelectEventArgs> SelectedEvent;
95 /// An event for the item selected signal which can be used to subscribe or unsubscribe the event handler provided by the user.
97 /// <since_tizen> 8 </since_tizen>
98 public event EventHandler<SelectedChangedEventArgs> SelectedChanged;
101 /// Return currently applied style.
104 /// Modifying contents in style may cause unexpected behaviour.
106 /// <since_tizen> 8 </since_tizen>
107 public new SwitchStyle Style => (SwitchStyle)(ViewStyle as SwitchStyle)?.Clone();
110 /// Apply style to switch.
112 /// <param name="viewStyle">The style to apply.</param>
113 [EditorBrowsable(EditorBrowsableState.Never)]
114 public override void ApplyStyle(ViewStyle viewStyle)
116 SwitchStyle swStyle = viewStyle as SwitchStyle;
120 if (swStyle.Track != null)
122 Track.ApplyStyle(swStyle.Track);
125 if (swStyle.Thumb != null)
127 Thumb.ApplyStyle(swStyle.Thumb);
131 base.ApplyStyle(viewStyle);
135 /// Switch's track part.
137 /// <since_tizen> 8 </since_tizen>
138 public ImageView Track
144 track = new ImageView()
146 PositionUsesPivotPoint = true,
147 ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
148 PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
149 WidthResizePolicy = ResizePolicyType.FillToParent,
150 HeightResizePolicy = ResizePolicyType.FillToParent
153 var extension = (SwitchExtension)Extension;
154 if (extension != null)
156 track = extension.OnCreateTrack(this, track);
169 /// Switch's thumb part.
171 /// <since_tizen> 8 </since_tizen>
172 public ImageView Thumb
178 thumb = new ImageView()
180 PositionUsesPivotPoint = true,
181 ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
182 PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
183 WidthResizePolicy = ResizePolicyType.Fixed,
184 HeightResizePolicy = ResizePolicyType.Fixed
187 var extension = (SwitchExtension)Extension;
188 if (extension != null)
190 thumb = extension.OnCreateThumb(this, thumb);
203 /// Background image's resource url selector in Switch.
205 /// <since_tizen> 6 </since_tizen>
206 public StringSelector SwitchBackgroundImageURLSelector
208 get => track == null ? null : new StringSelector((Selector<string>)track.GetValue(ImageView.ResourceUrlSelectorProperty));
209 set => track?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
213 /// Handler image's resource url in Switch.
215 /// <since_tizen> 6 </since_tizen>
216 public string SwitchHandlerImageURL
220 return Thumb.ResourceUrl;
224 Thumb.ResourceUrl = value;
229 /// Handler image's resource url selector in Switch.
230 /// Getter returns copied selector value if exist, null otherwise.
232 /// <since_tizen> 6 </since_tizen>
233 public StringSelector SwitchHandlerImageURLSelector
235 get => thumb == null ? null : new StringSelector((Selector<string>)thumb.GetValue(ImageView.ResourceUrlSelectorProperty));
236 set => thumb?.SetValue(ImageView.ResourceUrlSelectorProperty, value);
240 /// Handler image's size in Switch.
242 /// <since_tizen> 6 </since_tizen>
243 public Size SwitchHandlerImageSize
256 /// Dispose Switch and all children on it.
258 /// <param name="type">Dispose type.</param>
259 /// <since_tizen> 6 </since_tizen>
260 protected override void Dispose(DisposeTypes type)
262 if (disposed) return;
264 if (type == DisposeTypes.Explicit)
266 Utility.Dispose(Thumb);
267 Utility.Dispose(Track);
274 /// Called after a key event is received by the view that has had its focus set.
276 /// <param name="key">The key event.</param>
277 /// <returns>True if the key event should be consumed.</returns>
278 /// <since_tizen> 8 </since_tizen>
279 public override bool OnKey(Key key)
281 return base.OnKey(key);
285 /// Called after a touch event is received by the owning view.<br />
286 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
288 /// <param name="touch">The touch event.</param>
289 /// <returns>True if the event should be consumed.</returns>
290 /// <since_tizen> 8 </since_tizen>
291 [Obsolete("Deprecated in API8; Will be removed in API10. Please use OnClicked instead.")]
292 #pragma warning disable CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
293 public override bool OnTouch(Touch touch)
294 #pragma warning restore CS0809 // Obsolete member overrides non-obsolete member, It will be removed in API10
296 return base.OnTouch(touch);
300 /// Get Switch style.
302 /// <returns>The default switch style.</returns>
303 /// <since_tizen> 8 </since_tizen>
304 protected override ViewStyle CreateViewStyle()
306 return new SwitchStyle();
310 [EditorBrowsable(EditorBrowsableState.Never)]
311 protected override void OnControlStateChanged(ControlStateChangedEventArgs controlStateChangedInfo)
313 base.OnControlStateChanged(controlStateChangedInfo);
320 bool previousSelected = controlStateChangedInfo.PreviousState.Contains(ControlState.Selected);
322 if (previousSelected != IsSelected)
328 private void OnSelect()
332 EmitAccessibilityStateChangedEvent(AccessibilityState.Checked, IsSelected);
335 ((SwitchExtension)Extension)?.OnSelectedChanged(this);
337 if (SelectedEvent != null)
339 SelectEventArgs eventArgs = new SelectEventArgs();
340 eventArgs.IsSelected = IsSelected;
341 SelectedEvent(this, eventArgs);
344 if (SelectedChanged != null)
346 SelectedChangedEventArgs eventArgs = new SelectedChangedEventArgs();
347 eventArgs.IsSelected = IsSelected;
348 SelectedChanged(this, eventArgs);
353 /// SelectEventArgs is a class to record item selected arguments which will sent to user.
355 /// <since_tizen> 6 </since_tizen>
356 /// It will be removed in API10
357 [Obsolete("Deprecated in API8; Will be removed in API10. Please use SelectedChangedEventArgs instead.")]
358 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
359 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
360 public class SelectEventArgs : EventArgs
362 /// <summary> Select state of Switch </summary>
363 /// <since_tizen> 6 </since_tizen>
364 public bool IsSelected;