Hold added object reference in ItemObject
[platform/core/csapi/tizenfx.git] / src / ElmSharp / ElmSharp / ItemObject.cs
index 77ca614..fb44251 100644 (file)
@@ -12,6 +12,7 @@ namespace ElmSharp
         private static Dictionary<IntPtr, ItemObject> s_HandleToItemTable = new Dictionary<IntPtr, ItemObject>();
         private static int s_globalId = 0;
 
+        readonly Dictionary<string, EvasObject> _partContents = new Dictionary<string, EvasObject>();
         Interop.Evas.SmartCallback _deleteCallback;
         IntPtr _handle = IntPtr.Zero;
 
@@ -23,14 +24,23 @@ namespace ElmSharp
             Handle = handle;
         }
 
-        ~ItemObject()
-        {
-            if (Handle != IntPtr.Zero)
-                Interop.Elementary.elm_object_item_del(Handle);
-        }
+        // C# Finalizer was called on GC thread
+        // So, We can't access to EFL object
+        // And When Finalizer was called, Field can be already released.
+        //~ItemObject()
+        //{
+        //    if (Handle != IntPtr.Zero)
+        //        Interop.Elementary.elm_object_item_del(Handle);
+        //}
 
         public int Id { get; private set; }
 
+        public bool IsEnabled
+        {
+            get { return !Interop.Elementary.elm_object_item_disabled_get(Handle); }
+            set { Interop.Elementary.elm_object_item_disabled_set(Handle, !value); }
+        }
+
         internal IntPtr Handle
         {
             get
@@ -52,7 +62,7 @@ namespace ElmSharp
             }
         }
 
-        internal event EventHandler Deleted;
+        public event EventHandler Deleted;
 
         public void Delete()
         {
@@ -72,6 +82,7 @@ namespace ElmSharp
                 Interop.Elementary.elm_object_item_part_content_unset(Handle, part);
             }
             Interop.Elementary.elm_object_item_part_content_set(Handle, part, content);
+            _partContents[part ?? "__default__"] = content;
         }
 
         public void SetPartText(string part, string text)
@@ -111,6 +122,15 @@ namespace ElmSharp
         {
             Deleted?.Invoke(this, EventArgs.Empty);
             OnInvalidate();
+            if (s_IdToItemTable.ContainsKey(Id))
+            {
+                s_IdToItemTable.Remove(Id);
+            }
+            if (s_HandleToItemTable.ContainsKey(_handle))
+            {
+                s_HandleToItemTable.Remove(_handle);
+            }
+            _partContents.Clear();
             _handle = IntPtr.Zero;
         }