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);
92 /// Gets the item style.
94 public string ItemStyle { get { return _style; } }
97 /// Gets or sets the callback that defines how to display item text.
98 /// If get, return <see cref="GetTextDelegate"/>.
100 public GetTextDelegate GetTextHandler { get; set; }
103 /// Gets or sets the callback that defines how to display item content.
104 /// If get, return <see cref="GetContentDelegate"/>.
106 public GetContentDelegate GetContentHandler { get; set; }
109 /// Gets or sets the callback that defines how to delete item text and content.
110 /// If get, return <see cref="DeleteDelegate"/>.
112 public DeleteDelegate DeleteHandler { get; set; }
115 /// Gets or sets the callback that defines how to reuse item content.
116 /// If get, return <see cref="GetReusableContentDelegate"/>.
118 public GetReusableContentDelegate ReusableContentHandler { get; set; }
120 internal IntPtr UnmanagedPtr
124 if (_unmanagedPtr == IntPtr.Zero)
126 _unmanagedPtr = Marshal.AllocHGlobal(Marshal.SizeOf(_itemClass));
127 Marshal.StructureToPtr(_itemClass, _unmanagedPtr, false);
129 return _unmanagedPtr;
133 protected virtual void Dispose(bool disposing)
135 if (_unmanagedPtr != IntPtr.Zero)
137 Marshal.FreeHGlobal(_unmanagedPtr);
138 _unmanagedPtr = IntPtr.Zero;
142 public void Dispose()
145 GC.SuppressFinalize(this);
148 internal void SendItemDeleted(object data)
150 // data is user inserted value with GenItem
151 DeleteHandler?.Invoke(data);
154 protected virtual IntPtr CreateItemClass()
156 return Interop.Elementary.elm_genlist_item_class_new();
159 protected virtual void ReleaseItemClass(IntPtr unmanagedPtr)
161 Interop.Elementary.elm_genlist_item_class_free(unmanagedPtr);
164 string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part)
166 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
167 return GetTextHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
170 IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part)
172 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
173 EvasObject evasObject = GetContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
174 if (evasObject != null)
176 s_HandleToEvasObject[evasObject.Handle] = evasObject;
177 evasObject.Deleted += EvasObjectDeleted;
182 void EvasObjectDeleted(object sender, EventArgs e)
184 IntPtr handle = (sender as EvasObject).Handle;
185 s_HandleToEvasObject.Remove(handle);
188 IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old)
190 IntPtr reusedHandle = IntPtr.Zero;
191 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
192 if (s_HandleToEvasObject.ContainsKey(old))
194 reusedHandle = ReusableContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part), s_HandleToEvasObject[old]);
199 void DelCallback(IntPtr data, IntPtr obj)
201 // We can't use this callback
202 // because, when item was deleted
203 // First, ItemObject deleted callback was called
204 // and We need to clean up ItemObject related objects
205 // This callback was called after ItemObject deleted callback was completed.
206 // So, We can't get resource reletated with ItemObject
210 public class GenGridItemClass : GenItemClass
212 public GenGridItemClass(string style) : base(style)
216 protected override IntPtr CreateItemClass()
218 return Interop.Elementary.elm_gengrid_item_class_new();
221 protected override void ReleaseItemClass(IntPtr unmanagedPtr)
223 Interop.Elementary.elm_gengrid_item_class_free(unmanagedPtr);
227 [StructLayout(LayoutKind.Sequential)]
228 internal class ItemClass
230 public delegate string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part);
232 public delegate IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part);
234 public delegate int GetStateCallback(IntPtr data, IntPtr obj, IntPtr part);
236 public delegate void DelCallback(IntPtr data, IntPtr obj);
238 public delegate int FilterCallback(IntPtr data, IntPtr obj, IntPtr key);
240 public delegate IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old);
243 public uint refCount;
245 public string itemStyle;
246 public readonly string decorateItemStyle;
247 public readonly string decorateAllItemStyle;
248 public GetTextCallback textCallback;
249 public GetContentCallback contentCallback;
250 public GetStateCallback stateCallback;
251 public DelCallback delCallback;
252 public FilterCallback filterCallback;
253 public GetReusableContentCallback reusableContentCallback;