2 * Copyright(c) 2017 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 namespace Tizen.NUI.BaseComponents
22 using System.Runtime.InteropServices;
25 /// Base class for derived Scrollables that contains actors that can be scrolled manually
26 /// (via touch) or automatically.
28 /// <since_tizen> 3 </since_tizen>
29 public class Scrollable : View
31 private global::System.Runtime.InteropServices.HandleRef swigCPtr;
33 internal Scrollable(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicPINVOKE.Scrollable_SWIGUpcast(cPtr), cMemoryOwn)
35 swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
38 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Scrollable obj)
40 return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
44 /// you can override it to clean-up your own resources.
46 /// <param name="type">DisposeTypes</param>
47 /// <since_tizen> 3 </since_tizen>
48 protected override void Dispose(DisposeTypes type)
55 if (type == DisposeTypes.Explicit)
58 //Release your own managed resources here.
59 //You should release all of your own disposable objects here.
63 //Release your own unmanaged resources here.
64 //You should not access any managed member here except static instance.
65 //because the execution order of Finalizes is non-deterministic.
68 DisConnectFromSignals();
71 if (swigCPtr.Handle != global::System.IntPtr.Zero)
76 NDalicPINVOKE.delete_Scrollable(swigCPtr);
78 swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
84 private void DisConnectFromSignals()
87 global::System.Runtime.InteropServices.HandleRef currentCPtr = swigCPtr;
89 // Use BaseHandle CPtr as current might have been deleted already in derived classes.
90 swigCPtr = GetBaseHandleCPtrHandleRef;
92 if (_scrollableCompletedCallbackDelegate != null)
94 this.ScrollCompletedSignal().Disconnect(_scrollableCompletedCallbackDelegate);
97 if (_scrollableUpdatedCallbackDelegate != null)
99 this.ScrollUpdatedSignal().Disconnect(_scrollableUpdatedCallbackDelegate);
102 if (_scrollableStartedCallbackDelegate != null)
104 this.ScrollStartedSignal().Disconnect(_scrollableStartedCallbackDelegate);
107 // BaseHandle CPtr is used in Registry and there is danger of deletion if we keep using it here.
108 // Restore current CPtr.
109 swigCPtr = currentCPtr;
113 /// The scroll animation started event arguments.
115 /// <since_tizen> 3 </since_tizen>
116 public class StartedEventArgs : EventArgs
118 private Vector2 _vector2;
123 /// <since_tizen> 3 </since_tizen>
124 public Vector2 Vector2
138 /// The scrollable updated event arguments.
140 /// <since_tizen> 3 </since_tizen>
141 public class UpdatedEventArgs : EventArgs
143 private Vector2 _vector2;
148 /// <since_tizen> 3 </since_tizen>
149 public Vector2 Vector2
163 /// The scroll animation completed event arguments.
165 /// <since_tizen> 3 </since_tizen>
166 public class CompletedEventArgs : EventArgs
168 private Vector2 _vector2;
173 /// <since_tizen> 3 </since_tizen>
174 public Vector2 Vector2
187 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
188 private delegate void StartedCallbackDelegate(IntPtr vector2);
189 private DaliEventHandler<object, StartedEventArgs> _scrollableStartedEventHandler;
190 private StartedCallbackDelegate _scrollableStartedCallbackDelegate;
192 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
193 private delegate void UpdatedCallbackDelegate(IntPtr vector2);
194 private DaliEventHandler<object, UpdatedEventArgs> _scrollableUpdatedEventHandler;
195 private UpdatedCallbackDelegate _scrollableUpdatedCallbackDelegate;
197 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
198 private delegate void CompletedCallbackDelegate(IntPtr vector2);
199 private DaliEventHandler<object, CompletedEventArgs> _scrollableCompletedEventHandler;
200 private CompletedCallbackDelegate _scrollableCompletedCallbackDelegate;
203 /// The ScrollStarted event emitted when the Scrollable has moved (whether by touch or animation).
205 /// <since_tizen> 3 </since_tizen>
206 public event DaliEventHandler<object, StartedEventArgs> ScrollStarted
212 // Restricted to only one listener
213 if (_scrollableStartedEventHandler == null)
215 _scrollableStartedEventHandler += value;
217 _scrollableStartedCallbackDelegate = new StartedCallbackDelegate(OnStarted);
218 this.ScrollStartedSignal().Connect(_scrollableStartedCallbackDelegate);
227 if (_scrollableStartedEventHandler != null)
229 this.ScrollStartedSignal().Disconnect(_scrollableStartedCallbackDelegate);
232 _scrollableStartedEventHandler -= value;
237 private void OnStarted(IntPtr vector2)
239 StartedEventArgs e = new StartedEventArgs();
241 // Populate all members of "e" (StartedEventArgs) with real data
242 e.Vector2 = Tizen.NUI.Vector2.GetVector2FromPtr(vector2);
244 if (_scrollableStartedEventHandler != null)
246 //here we send all data to user event handlers
247 _scrollableStartedEventHandler(this, e);
253 /// The ScrollUpdated event emitted when the Scrollable has moved (whether by touch or animation).
255 /// <since_tizen> 3 </since_tizen>
256 public event DaliEventHandler<object, UpdatedEventArgs> ScrollUpdated
262 // Restricted to only one listener
263 if (_scrollableUpdatedEventHandler == null)
265 _scrollableUpdatedEventHandler += value;
267 _scrollableUpdatedCallbackDelegate = new UpdatedCallbackDelegate(OnUpdated);
268 this.ScrollUpdatedSignal().Connect(_scrollableUpdatedCallbackDelegate);
277 if (_scrollableUpdatedEventHandler != null)
279 this.ScrollUpdatedSignal().Disconnect(_scrollableUpdatedCallbackDelegate);
282 _scrollableUpdatedEventHandler -= value;
287 private void OnUpdated(IntPtr vector2)
289 UpdatedEventArgs e = new UpdatedEventArgs();
291 // Populate all members of "e" (UpdatedEventArgs) with real data
292 e.Vector2 = Tizen.NUI.Vector2.GetVector2FromPtr(vector2);
294 if (_scrollableUpdatedEventHandler != null)
296 //here we send all data to user event handlers
297 _scrollableUpdatedEventHandler(this, e);
303 /// The ScrollCompleted event emitted when the Scrollable has completed movement
304 /// (whether by touch or animation).
306 /// <since_tizen> 3 </since_tizen>
307 public event DaliEventHandler<object, CompletedEventArgs> ScrollCompleted
313 // Restricted to only one listener
314 if (_scrollableCompletedEventHandler == null)
316 _scrollableCompletedEventHandler += value;
318 _scrollableCompletedCallbackDelegate = new CompletedCallbackDelegate(OnCompleted);
319 this.ScrollCompletedSignal().Connect(_scrollableCompletedCallbackDelegate);
328 if (_scrollableCompletedEventHandler != null)
330 this.ScrollCompletedSignal().Disconnect(_scrollableCompletedCallbackDelegate);
333 _scrollableCompletedEventHandler -= value;
338 private void OnCompleted(IntPtr vector2)
340 CompletedEventArgs e = new CompletedEventArgs();
342 // Populate all members of "e" (CompletedEventArgs) with real data
343 e.Vector2 = Tizen.NUI.Vector2.GetVector2FromPtr(vector2);
345 if (_scrollableCompletedEventHandler != null)
347 //here we send all data to user event handlers
348 _scrollableCompletedEventHandler(this, e);
354 /// Enumeration for the instance of properties belonging to the Scrollable class.
356 /// <since_tizen> 3 </since_tizen>
357 public new class Property
360 /// The color of the overshoot effect.
362 /// <since_tizen> 3 </since_tizen>
363 public static readonly int OVERSHOOT_EFFECT_COLOR = NDalicPINVOKE.Scrollable_Property_OVERSHOOT_EFFECT_COLOR_get();
365 /// The speed of overshoot animation in pixels per second.
367 /// <since_tizen> 3 </since_tizen>
368 public static readonly int OVERSHOOT_ANIMATION_SPEED = NDalicPINVOKE.Scrollable_Property_OVERSHOOT_ANIMATION_SPEED_get();
370 /// Whether to enables or disable scroll overshoot.
372 /// <since_tizen> 3 </since_tizen>
373 public static readonly int OVERSHOOT_ENABLED = NDalicPINVOKE.Scrollable_Property_OVERSHOOT_ENABLED_get();
375 /// The size of the overshoot.
377 /// <since_tizen> 3 </since_tizen>
378 public static readonly int OVERSHOOT_SIZE = NDalicPINVOKE.Scrollable_Property_OVERSHOOT_SIZE_get();
380 /// scrollToAlphaFunction.
382 /// <since_tizen> 3 </since_tizen>
383 public static readonly int SCROLL_TO_ALPHA_FUNCTION = NDalicPINVOKE.Scrollable_Property_SCROLL_TO_ALPHA_FUNCTION_get();
385 /// scrollRelativePosition
387 /// <since_tizen> 3 </since_tizen>
388 public static readonly int SCROLL_RELATIVE_POSITION = NDalicPINVOKE.Scrollable_Property_SCROLL_RELATIVE_POSITION_get();
390 /// scrollPositionMin
392 /// <since_tizen> 3 </since_tizen>
393 public static readonly int SCROLL_POSITION_MIN = NDalicPINVOKE.Scrollable_Property_SCROLL_POSITION_MIN_get();
395 /// scrollPositionMinX.
397 /// <since_tizen> 3 </since_tizen>
398 public static readonly int SCROLL_POSITION_MIN_X = NDalicPINVOKE.Scrollable_Property_SCROLL_POSITION_MIN_X_get();
400 /// scrollPositionMinY.
402 /// <since_tizen> 3 </since_tizen>
403 public static readonly int SCROLL_POSITION_MIN_Y = NDalicPINVOKE.Scrollable_Property_SCROLL_POSITION_MIN_Y_get();
405 /// scrollPositionMax.
407 /// <since_tizen> 3 </since_tizen>
408 public static readonly int SCROLL_POSITION_MAX = NDalicPINVOKE.Scrollable_Property_SCROLL_POSITION_MAX_get();
410 /// scrollPositionMaxX.
412 /// <since_tizen> 3 </since_tizen>
413 public static readonly int SCROLL_POSITION_MAX_X = NDalicPINVOKE.Scrollable_Property_SCROLL_POSITION_MAX_X_get();
415 /// scrollPositionMaxY.
417 /// <since_tizen> 3 </since_tizen>
418 public static readonly int SCROLL_POSITION_MAX_Y = NDalicPINVOKE.Scrollable_Property_SCROLL_POSITION_MAX_Y_get();
420 /// canScrollVertical
422 /// <since_tizen> 3 </since_tizen>
423 public static readonly int CAN_SCROLL_VERTICAL = NDalicPINVOKE.Scrollable_Property_CAN_SCROLL_VERTICAL_get();
425 /// canScrollHorizontal.
427 /// <since_tizen> 3 </since_tizen>
428 public static readonly int CAN_SCROLL_HORIZONTAL = NDalicPINVOKE.Scrollable_Property_CAN_SCROLL_HORIZONTAL_get();
433 /// Create an instance of scrollable.
435 /// <since_tizen> 3 </since_tizen>
436 public Scrollable() : this(NDalicPINVOKE.new_Scrollable__SWIG_0(), true)
438 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
441 private bool IsOvershootEnabled()
443 bool ret = NDalicPINVOKE.Scrollable_IsOvershootEnabled(swigCPtr);
444 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
448 private void SetOvershootEnabled(bool enable)
450 NDalicPINVOKE.Scrollable_SetOvershootEnabled(swigCPtr, enable);
451 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
454 private void SetOvershootEffectColor(Vector4 color)
456 NDalicPINVOKE.Scrollable_SetOvershootEffectColor(swigCPtr, Vector4.getCPtr(color));
457 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
460 private Vector4 GetOvershootEffectColor()
462 Vector4 ret = new Vector4(NDalicPINVOKE.Scrollable_GetOvershootEffectColor(swigCPtr), true);
463 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
467 private void SetOvershootAnimationSpeed(float pixelsPerSecond)
469 NDalicPINVOKE.Scrollable_SetOvershootAnimationSpeed(swigCPtr, pixelsPerSecond);
470 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
473 private float GetOvershootAnimationSpeed()
475 float ret = NDalicPINVOKE.Scrollable_GetOvershootAnimationSpeed(swigCPtr);
476 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
480 internal ScrollableSignal ScrollStartedSignal()
482 ScrollableSignal ret = new ScrollableSignal(NDalicPINVOKE.Scrollable_ScrollStartedSignal(swigCPtr), false);
483 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
487 internal ScrollableSignal ScrollUpdatedSignal()
489 ScrollableSignal ret = new ScrollableSignal(NDalicPINVOKE.Scrollable_ScrollUpdatedSignal(swigCPtr), false);
490 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
494 internal ScrollableSignal ScrollCompletedSignal()
496 ScrollableSignal ret = new ScrollableSignal(NDalicPINVOKE.Scrollable_ScrollCompletedSignal(swigCPtr), false);
497 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
502 /// Sets and Gets the color of the overshoot effect.
504 /// <since_tizen> 3 </since_tizen>
505 public Vector4 OvershootEffectColor
509 Vector4 temp = new Vector4(0.0f, 0.0f, 0.0f, 0.0f);
510 GetProperty(Scrollable.Property.OVERSHOOT_EFFECT_COLOR).Get(temp);
515 SetProperty(Scrollable.Property.OVERSHOOT_EFFECT_COLOR, new Tizen.NUI.PropertyValue(value));
520 /// Sets and Gets the speed of overshoot animation in pixels per second.
522 /// <since_tizen> 3 </since_tizen>
523 public float OvershootAnimationSpeed
528 GetProperty(Scrollable.Property.OVERSHOOT_ANIMATION_SPEED).Get(out temp);
533 SetProperty(Scrollable.Property.OVERSHOOT_ANIMATION_SPEED, new Tizen.NUI.PropertyValue(value));
538 /// Checks if scroll overshoot has been enabled or not.
540 /// <since_tizen> 3 </since_tizen>
541 public bool OvershootEnabled
546 GetProperty(Scrollable.Property.OVERSHOOT_ENABLED).Get(out temp);
551 SetProperty(Scrollable.Property.OVERSHOOT_ENABLED, new Tizen.NUI.PropertyValue(value));
556 /// Gets and Sets OvershootSize property.
558 /// <since_tizen> 3 </since_tizen>
559 public Vector2 OvershootSize
563 Vector2 temp = new Vector2(0.0f, 0.0f);
564 GetProperty(Scrollable.Property.OVERSHOOT_SIZE).Get(temp);
569 SetProperty(Scrollable.Property.OVERSHOOT_SIZE, new Tizen.NUI.PropertyValue(value));
574 /// Gets and Sets ScrollToAlphaFunction property.
576 /// <since_tizen> 3 </since_tizen>
577 public int ScrollToAlphaFunction
582 GetProperty(Scrollable.Property.SCROLL_TO_ALPHA_FUNCTION).Get(out temp);
587 SetProperty(Scrollable.Property.SCROLL_TO_ALPHA_FUNCTION, new Tizen.NUI.PropertyValue(value));
592 /// Gets and Sets ScrollRelativePosition property.
594 /// <since_tizen> 3 </since_tizen>
595 public Vector2 ScrollRelativePosition
599 Vector2 temp = new Vector2(0.0f, 0.0f);
600 GetProperty(Scrollable.Property.SCROLL_RELATIVE_POSITION).Get(temp);
605 SetProperty(Scrollable.Property.SCROLL_RELATIVE_POSITION, new Tizen.NUI.PropertyValue(value));
610 /// Gets and Sets ScrollPositionMin property.
612 /// <since_tizen> 3 </since_tizen>
613 public Vector2 ScrollPositionMin
617 Vector2 temp = new Vector2(0.0f, 0.0f);
618 GetProperty(Scrollable.Property.SCROLL_POSITION_MIN).Get(temp);
623 SetProperty(Scrollable.Property.SCROLL_POSITION_MIN, new Tizen.NUI.PropertyValue(value));
628 /// Gets and Sets ScrollPositionMax property.
630 /// <since_tizen> 3 </since_tizen>
631 public Vector2 ScrollPositionMax
635 Vector2 temp = new Vector2(0.0f, 0.0f);
636 GetProperty(Scrollable.Property.SCROLL_POSITION_MAX).Get(temp);
641 SetProperty(Scrollable.Property.SCROLL_POSITION_MAX, new Tizen.NUI.PropertyValue(value));
646 /// Gets and Sets CanScrollVertical property.
648 /// <since_tizen> 3 </since_tizen>
649 public bool CanScrollVertical
654 GetProperty(Scrollable.Property.CAN_SCROLL_VERTICAL).Get(out temp);
659 SetProperty(Scrollable.Property.CAN_SCROLL_VERTICAL, new Tizen.NUI.PropertyValue(value));
664 /// Gets and Sets CanScrollHorizontal property.
666 /// <since_tizen> 3 </since_tizen>
667 public bool CanScrollHorizontal
672 GetProperty(Scrollable.Property.CAN_SCROLL_HORIZONTAL).Get(out temp);
677 SetProperty(Scrollable.Property.CAN_SCROLL_HORIZONTAL, new Tizen.NUI.PropertyValue(value));