[NUI] Change all CallingConvention to `Cdecl`
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Events / PanGestureDetector.cs
index bdf55b5..a862df1 100755 (executable)
@@ -55,7 +55,7 @@ namespace Tizen.NUI
         }
 
         private DaliEventHandler<object, DetectedEventArgs> detectedEventHandler;
-        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         private delegate void DetectedCallbackType(IntPtr actor, IntPtr panGesture);
         private DetectedCallbackType detectedCallback;
 
@@ -71,19 +71,25 @@ namespace Tizen.NUI
                 if (detectedEventHandler == null)
                 {
                     detectedCallback = OnPanGestureDetected;
-                    DetectedSignal().Connect(detectedCallback);
+                    using PanGestureDetectedSignal signal = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(SwigCPtr), false);
+                    signal?.Connect(detectedCallback);
                 }
-
                 detectedEventHandler += value;
             }
-
             remove
             {
                 detectedEventHandler -= value;
-
-                if (detectedEventHandler == null && DetectedSignal().Empty() == false)
+                if (detectedEventHandler == null)
                 {
-                    DetectedSignal().Disconnect(detectedCallback);
+                    using PanGestureDetectedSignal signal = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(SwigCPtr), false);
+                    if (signal?.Empty() == false)
+                    {
+                        signal?.Disconnect(detectedCallback);
+                        if (signal?.Empty() == true)
+                        {
+                            detectedCallback = null;
+                        }
+                    }
                 }
             }
         }
@@ -342,6 +348,18 @@ namespace Tizen.NUI
         }
 
         /// <summary>
+        /// Set a maximum duration of motion event that is able to live on the pan gesture event queue.
+        /// If duration exceed it, the motion event is discarded.
+        /// </summary>
+        /// <param name="maximumAgeMilliSecond">Maximum age of motion events as milliseconds</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void SetMaximumMotionEventAge(uint maximumAgeMilliSecond)
+        {
+            Interop.PanGestureDetector.SetMaximumMotionEventAge(SwigCPtr, maximumAgeMilliSecond);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
         /// Retrieves the minimum number of touches required for the pan gesture to be detected.
         /// </summary>
         /// <returns>The minimum touches required</returns>
@@ -368,6 +386,18 @@ namespace Tizen.NUI
         }
 
         /// <summary>
+        /// Retrieves the maximum age for the pan gesture motion as milliseconds.
+        /// </summary>
+        /// <returns>The maximum age of motion events as milliseconds</returns>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public uint GetMaximumMotionEventAge()
+        {
+            uint ret = Interop.PanGestureDetector.GetMaximumMotionEventAge(SwigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
         /// The pan gesture is only emitted if the pan occurs in the direction specified by this method with a +/- threshold allowance.<br />
         /// If an angle of 0.0 degrees is specified and the threshold is 45 degrees then the acceptable direction range is from -45 to 45 degrees.<br />
         /// The angle added using this API is only checked when the gesture first starts, after that, this detector will emit the gesture regardless of what angle the pan is moving.
@@ -513,27 +543,87 @@ namespace Tizen.NUI
             return ret;
         }
 
-        internal PanGestureDetectedSignal DetectedSignal()
+        /// <summary>
+        /// override it to clean-up your own resources.
+        /// </summary>
+        /// <param name="type"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override void Dispose(DisposeTypes type)
         {
-            PanGestureDetectedSignal ret = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(SwigCPtr), false);
-            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            return ret;
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (HasBody())
+            {
+                if (detectedCallback != null)
+                {
+                    using PanGestureDetectedSignal signal = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(GetBaseHandleCPtrHandleRef), false);
+                    signal?.Disconnect(detectedCallback);
+                    detectedCallback = null;
+                }
+            }
+            base.Dispose(type);
         }
 
         /// This will not be public opened.
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
         {
-            if (detectedCallback != null)
-            {
-                DetectedSignal().Disconnect(detectedCallback);
-            }
-
             Interop.PanGestureDetector.DeletePanGestureDetector(swigCPtr);
         }
 
         private void OnPanGestureDetected(IntPtr actor, IntPtr panGesture)
         {
+            if (IsNativeHandleInvalid())
+            {
+                if (this.Disposed)
+                {
+                    if (detectedEventHandler != null)
+                    {
+                        var process = global::System.Diagnostics.Process.GetCurrentProcess();
+                        var processId = process?.Id ?? -1;
+                        var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
+                        var me = this.GetType().FullName;
+
+                        Tizen.Log.Error("NUI", $"Error! NUI's native dali object is already disposed. " +
+                            $"OR the native dali object handle of NUI becomes null! \n" +
+                            $" process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
+
+                        process?.Dispose();
+                    }
+                }
+                else
+                {
+                    if (this.IsDisposeQueued)
+                    {
+                        var process = global::System.Diagnostics.Process.GetCurrentProcess();
+                        var processId = process?.Id ?? -1;
+                        var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
+                        var me = this.GetType().FullName;
+
+                        //in this case, this object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked!
+                        Tizen.Log.Error("NUI", "in this case, the View object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked! just return here! \n" +
+                            $"process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
+
+                        process?.Dispose();
+                        return;
+                    }
+                }
+            }
+
             if (detectedEventHandler != null)
             {
                 DetectedEventArgs e = new DetectedEventArgs();
@@ -545,6 +635,12 @@ namespace Tizen.NUI
                     e.View = Registry.GetManagedBaseHandleFromRefObject(actor) as View;
                 }
 
+                // If DispatchGestureEvents is false, no gesture events are dispatched.
+                if (e.View != null && e.View.DispatchGestureEvents == false)
+                {
+                    return;
+                }
+
                 e.PanGesture = Tizen.NUI.PanGesture.GetPanGestureFromPtr(panGesture);
                 detectedEventHandler(this, e);
             }