*
*/
using System;
+using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Tizen.NUI.Binding;
/// <since_tizen> 3 </since_tizen>
public class BaseHandle : Element, global::System.IDisposable
{
+ private static Dictionary<IntPtr, HashSet<object>> nativeBindedHolder = new Dictionary<IntPtr, HashSet<object>>();
+
/// <summary>
/// swigCMemOwn
/// </summary>
if (SwigCPtr.Handle != IntPtr.Zero)
{
var nativeSwigCPtr = swigCPtr.Handle;
+
+ ClearHolder(nativeSwigCPtr);
+
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
if (swigCMemOwn)
{
Interop.BaseHandle.DeleteBaseHandle(swigCPtr.Handle);
}
+ /// <summary>
+ /// Adds the specified object to the set of objects that have been bound to the native object.
+ /// </summary>
+ /// <param name="obj">The object to add.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected void AddToNativeHolder(object obj)
+ {
+ if (IsDisposedOrQueued)
+ {
+ return;
+ }
+
+ if (!nativeBindedHolder.TryGetValue(swigCPtr.Handle, out var holders))
+ {
+ nativeBindedHolder.Add(swigCPtr.Handle, holders = new HashSet<object>());
+ }
+
+ holders.Add(obj);
+ }
+
+ /// <summary>
+ /// Removes the specified object from the set of objects that have been bound to the native object.
+ /// </summary>
+ /// <param name="obj">The object to remove.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected void RemoveFromNativeHolder(object obj)
+ {
+ if (IsDisposedOrQueued)
+ {
+ return;
+ }
+
+ if (nativeBindedHolder.TryGetValue(swigCPtr.Handle, out var holders))
+ {
+ holders.Remove(obj);
+
+ if (holders.Count == 0)
+ {
+ nativeBindedHolder.Remove(swigCPtr.Handle);
+ }
+ }
+ }
+
/// <summary>
/// Contains event arguments for the FocusChangeRequested event.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
protected internal bool IsDisposeQueued => isDisposeQueued;
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected internal bool IsDisposedOrQueued => disposed || isDisposeQueued;
+
+ static private void ClearHolder(IntPtr handle)
+ {
+ nativeBindedHolder.Remove(handle);
+ }
+
[Conditional("NUI_DISPOSE_DEBUG_ON")]
private void disposeDebuggingCtor()
{