2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
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.Collections.Generic;
19 using System.Runtime.InteropServices;
24 /// It represents the GenGrid or GenList item class definition field details.
25 /// It has some display styles, such as "default", "full" and "group_index".
27 public class GenItemClass : IDisposable
29 static Dictionary<IntPtr, EvasObject> s_HandleToEvasObject = new Dictionary<IntPtr, EvasObject>();
32 /// The delegate to define <see cref="GetTextHandler"/>.
34 /// <param name="data">The item data.</param>
35 /// <param name="part">The part where the data should be shown.</param>
36 /// <returns>Return string that should be shown.</returns>
37 public delegate string GetTextDelegate(object data, string part);
40 /// The delegate to define <see cref="GetContentHandler"/>.
42 /// <param name="data">The item data.</param>
43 /// <param name="part">The part where the data should be shown.</param>
44 /// <returns>Return content that should be shown.</returns>
45 public delegate EvasObject GetContentDelegate(object data, string part);
48 /// The delegate to define <see cref="DeleteHandler"/>.
50 /// <param name="data">The item data.</param>
51 public delegate void DeleteDelegate(object data);
54 /// The delegate to define <see cref="ReusableContentHandler"/>.
56 /// <param name="data">The item data.</param>
57 /// <param name="part">The part where the data should be shown.</param>
58 /// <param name="old">The content has been added in gengrid.</param>
59 /// <returns>Return content that should be shown.</returns>
60 public delegate EvasObject GetReusableContentDelegate(object data, string part, EvasObject old);
63 IntPtr _unmanagedPtr = IntPtr.Zero;
67 /// Creates and initializes a new instance of the GenItemClass.
69 /// <param name="style">The item display style.</param>
70 public GenItemClass(string style)
73 IntPtr unmanaged = CreateItemClass();
75 _itemClass = Marshal.PtrToStructure<ItemClass>(unmanaged);
76 _itemClass.itemStyle = style;
77 _itemClass.textCallback = GetTextCallback;
78 _itemClass.contentCallback = GetContentCallback;
79 _itemClass.stateCallback = null;
80 _itemClass.delCallback = DelCallback;
81 _itemClass.reusableContentCallback = GetReusableContentCallback;
83 ReleaseItemClass(unmanaged);
87 /// Destroy the GenItemClass object.
95 /// Gets the item style.
97 public string ItemStyle { get { return _style; } }
100 /// Gets or sets the callback that defines how to display item text.
101 /// If get, return <see cref="GetTextDelegate"/>.
103 public GetTextDelegate GetTextHandler { get; set; }
106 /// Gets or sets the callback that defines how to display item content.
107 /// If get, return <see cref="GetContentDelegate"/>.
109 public GetContentDelegate GetContentHandler { get; set; }
112 /// Gets or sets the callback that defines how to delete item text and content.
113 /// If get, return <see cref="DeleteDelegate"/>.
115 public DeleteDelegate DeleteHandler { get; set; }
118 /// Gets or sets the callback that defines how to reuse item content.
119 /// If get, return <see cref="GetReusableContentDelegate"/>.
121 public GetReusableContentDelegate ReusableContentHandler { get; set; }
123 internal IntPtr UnmanagedPtr
127 if (_unmanagedPtr == IntPtr.Zero)
129 _unmanagedPtr = Marshal.AllocHGlobal(Marshal.SizeOf(_itemClass));
130 Marshal.StructureToPtr(_itemClass, _unmanagedPtr, false);
132 return _unmanagedPtr;
137 /// Releases all resources currently used by this instance.
139 /// <param name="disposing">
140 /// true if managed resources should be disposed
141 /// otherwise, false.
143 protected virtual void Dispose(bool disposing)
145 if (_unmanagedPtr != IntPtr.Zero)
147 Marshal.FreeHGlobal(_unmanagedPtr);
148 _unmanagedPtr = IntPtr.Zero;
153 /// Destroy current object
155 public void Dispose()
158 GC.SuppressFinalize(this);
161 internal void SendItemDeleted(object data)
163 // data is user inserted value with GenItem
164 DeleteHandler?.Invoke(data);
168 /// Create a new genlist item class in a given genlist widget.
170 /// <returns>The new item class object.</returns>
171 protected virtual IntPtr CreateItemClass()
173 return Interop.Elementary.elm_genlist_item_class_new();
177 /// Remove an item class in a given genlist widget.
179 /// <param name="unmanagedPtr">The object to be removed.</param>
180 protected virtual void ReleaseItemClass(IntPtr unmanagedPtr)
182 Interop.Elementary.elm_genlist_item_class_free(unmanagedPtr);
185 string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part)
187 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
188 return GetTextHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
191 IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part)
193 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
194 EvasObject evasObject = GetContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
195 if (evasObject != null)
197 s_HandleToEvasObject[evasObject.Handle] = evasObject;
198 evasObject.Deleted += EvasObjectDeleted;
203 void EvasObjectDeleted(object sender, EventArgs e)
205 IntPtr handle = (sender as EvasObject).Handle;
206 s_HandleToEvasObject.Remove(handle);
209 IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old)
211 IntPtr reusedHandle = IntPtr.Zero;
212 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
213 if (s_HandleToEvasObject.ContainsKey(old))
215 reusedHandle = ReusableContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part), s_HandleToEvasObject[old]);
220 void DelCallback(IntPtr data, IntPtr obj)
222 // We can't use this callback
223 // because, when item was deleted
224 // First, ItemObject deleted callback was called
225 // and We need to clean up ItemObject related objects
226 // This callback was called after ItemObject deleted callback was completed.
227 // So, We can't get resource reletated with ItemObject
232 /// It represents the GenGrid item class definition field details.
234 public class GenGridItemClass : GenItemClass
237 /// Create the GenGridItemClass instance.
239 /// <param name="style">The item display style.</param>
240 public GenGridItemClass(string style) : base(style)
245 /// Add a new gengrid item class in a given gengrid widget.
247 /// <returns>The new instance.</returns>
248 protected override IntPtr CreateItemClass()
250 return Interop.Elementary.elm_gengrid_item_class_new();
254 /// Remove an item class in a given gengrid widget.
256 /// <param name="unmanagedPtr">The object to be removed.</param>
257 protected override void ReleaseItemClass(IntPtr unmanagedPtr)
259 Interop.Elementary.elm_gengrid_item_class_free(unmanagedPtr);
263 [StructLayout(LayoutKind.Sequential)]
264 internal class ItemClass
266 public delegate string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part);
268 public delegate IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part);
270 public delegate int GetStateCallback(IntPtr data, IntPtr obj, IntPtr part);
272 public delegate void DelCallback(IntPtr data, IntPtr obj);
274 public delegate int FilterCallback(IntPtr data, IntPtr obj, IntPtr key);
276 public delegate IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old);
279 public uint refCount;
281 public string itemStyle;
282 public readonly string decorateItemStyle;
283 public readonly string decorateAllItemStyle;
284 public GetTextCallback textCallback;
285 public GetContentCallback contentCallback;
286 public GetStateCallback stateCallback;
287 public DelCallback delCallback;
288 public FilterCallback filterCallback;
289 public GetReusableContentCallback reusableContentCallback;