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 /// <since_tizen> preview </since_tizen>
28 public class GenItemClass : IDisposable
30 static Dictionary<IntPtr, EvasObject> s_HandleToEvasObject = new Dictionary<IntPtr, EvasObject>();
33 /// The delegate to define <see cref="GetTextHandler"/>.
35 /// <param name="data">The item data.</param>
36 /// <param name="part">The part where the data should be shown.</param>
37 /// <returns>Return string that should be shown.</returns>
38 /// <since_tizen> preview </since_tizen>
39 public delegate string GetTextDelegate(object data, string part);
42 /// The delegate to define <see cref="GetContentHandler"/>.
44 /// <param name="data">The item data.</param>
45 /// <param name="part">The part where the data should be shown.</param>
46 /// <returns>Return content that should be shown.</returns>
47 /// <since_tizen> preview </since_tizen>
48 public delegate EvasObject GetContentDelegate(object data, string part);
51 /// The delegate to define <see cref="DeleteHandler"/>.
53 /// <param name="data">The item data.</param>
54 /// <since_tizen> preview </since_tizen>
55 public delegate void DeleteDelegate(object data);
58 /// The delegate to define <see cref="ReusableContentHandler"/>.
60 /// <param name="data">The item data.</param>
61 /// <param name="part">The part where the data should be shown.</param>
62 /// <param name="old">The content that has been added in gengrid.</param>
63 /// <returns>Return content that should be shown.</returns>
64 /// <since_tizen> preview </since_tizen>
65 public delegate EvasObject GetReusableContentDelegate(object data, string part, EvasObject old);
68 IntPtr _unmanagedPtr = IntPtr.Zero;
72 /// Creates and initializes a new instance of the GenItemClass.
74 /// <param name="style">The item display style.</param>
75 /// <since_tizen> preview </since_tizen>
76 public GenItemClass(string style)
79 IntPtr unmanaged = CreateItemClass();
81 _itemClass = Marshal.PtrToStructure<ItemClass>(unmanaged);
82 _itemClass.itemStyle = style;
83 _itemClass.textCallback = GetTextCallback;
84 _itemClass.contentCallback = GetContentCallback;
85 _itemClass.stateCallback = null;
86 _itemClass.delCallback = DelCallback;
87 _itemClass.reusableContentCallback = GetReusableContentCallback;
89 ReleaseItemClass(unmanaged);
93 /// Destroys the GenItemClass object.
101 /// Gets the item style.
103 /// <since_tizen> preview </since_tizen>
104 public string ItemStyle { get { return _style; } }
107 /// Gets or sets the callback that defines how to display the item text.
108 /// If get, return <see cref="GetTextDelegate"/>.
110 /// <since_tizen> preview </since_tizen>
111 public GetTextDelegate GetTextHandler { get; set; }
114 /// Gets or sets the callback that defines how to display the item content.
115 /// If get, return <see cref="GetContentDelegate"/>.
117 /// <since_tizen> preview </since_tizen>
118 public GetContentDelegate GetContentHandler { get; set; }
121 /// Gets or sets the callback that defines how to delete the item text and content.
122 /// If get, return <see cref="DeleteDelegate"/>.
124 /// <since_tizen> preview </since_tizen>
125 public DeleteDelegate DeleteHandler { get; set; }
128 /// Gets or sets the callback that defines how to reuse the item content.
129 /// If get, return <see cref="GetReusableContentDelegate"/>.
131 /// <since_tizen> preview </since_tizen>
132 public GetReusableContentDelegate ReusableContentHandler { get; set; }
134 internal IntPtr UnmanagedPtr
138 if (_unmanagedPtr == IntPtr.Zero)
140 _unmanagedPtr = Marshal.AllocHGlobal(Marshal.SizeOf(_itemClass));
141 Marshal.StructureToPtr(_itemClass, _unmanagedPtr, false);
143 return _unmanagedPtr;
148 /// Releases all the resources currently used by this instance.
150 /// <param name="disposing">
151 /// true if the managed resources should be disposed,
154 /// <since_tizen> preview </since_tizen>
155 protected virtual void Dispose(bool disposing)
157 if (_unmanagedPtr != IntPtr.Zero)
159 Marshal.FreeHGlobal(_unmanagedPtr);
160 _unmanagedPtr = IntPtr.Zero;
165 /// Destroys the current object.
167 /// <since_tizen> preview </since_tizen>
168 public void Dispose()
171 GC.SuppressFinalize(this);
174 internal void SendItemDeleted(object data)
176 // data is user inserted value with GenItem
177 DeleteHandler?.Invoke(data);
181 /// Creates a new GenList item class in a given GenList widget.
183 /// <returns>The new item class object.</returns>
184 /// <since_tizen> preview </since_tizen>
185 protected virtual IntPtr CreateItemClass()
187 return Interop.Elementary.elm_genlist_item_class_new();
191 /// Removes an item class in a given GenList widget.
193 /// <param name="unmanagedPtr">The object to be removed.</param>
194 /// <since_tizen> preview </since_tizen>
195 protected virtual void ReleaseItemClass(IntPtr unmanagedPtr)
197 Interop.Elementary.elm_genlist_item_class_free(unmanagedPtr);
200 string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part)
202 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
203 return GetTextHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
206 IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part)
208 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
209 EvasObject evasObject = GetContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
210 if (evasObject != null)
212 s_HandleToEvasObject[evasObject.Handle] = evasObject;
213 evasObject.Deleted += EvasObjectDeleted;
218 void EvasObjectDeleted(object sender, EventArgs e)
220 IntPtr handle = (sender as EvasObject).Handle;
221 s_HandleToEvasObject.Remove(handle);
224 IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old)
226 IntPtr reusedHandle = IntPtr.Zero;
227 GenItem item = ItemObject.GetItemById((int)data) as GenItem;
228 if (s_HandleToEvasObject.ContainsKey(old))
230 reusedHandle = ReusableContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part), s_HandleToEvasObject[old]);
235 void DelCallback(IntPtr data, IntPtr obj)
237 // We can't use this callback
238 // because, when item was deleted
239 // First, ItemObject deleted callback was called
240 // and We need to clean up ItemObject related objects
241 // This callback was called after ItemObject deleted callback was completed.
242 // So, We can't get resource reletated with ItemObject
247 /// It represents the gengrid item class definition field details.
249 /// <since_tizen> preview </since_tizen>
250 public class GenGridItemClass : GenItemClass
253 /// Create the GenGridItemClass instance.
255 /// <param name="style">The item display style.</param>
256 /// <since_tizen> preview </since_tizen>
257 public GenGridItemClass(string style) : base(style)
262 /// Adds a new gengrid item class in a given GenGrid widget.
264 /// <returns>The new instance.</returns>
265 /// <since_tizen> preview </since_tizen>
266 protected override IntPtr CreateItemClass()
268 return Interop.Elementary.elm_gengrid_item_class_new();
272 /// Removes the item class in a given GenGrid widget.
274 /// <param name="unmanagedPtr">The object to be removed.</param>
275 /// <since_tizen> preview </since_tizen>
276 protected override void ReleaseItemClass(IntPtr unmanagedPtr)
278 Interop.Elementary.elm_gengrid_item_class_free(unmanagedPtr);
282 [StructLayout(LayoutKind.Sequential)]
283 internal class ItemClass
285 /// <since_tizen> preview </since_tizen>
286 public delegate string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part);
288 /// <since_tizen> preview </since_tizen>
289 public delegate IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part);
291 /// <since_tizen> preview </since_tizen>
292 public delegate int GetStateCallback(IntPtr data, IntPtr obj, IntPtr part);
294 /// <since_tizen> preview </since_tizen>
295 public delegate void DelCallback(IntPtr data, IntPtr obj);
297 /// <since_tizen> preview </since_tizen>
298 public delegate int FilterCallback(IntPtr data, IntPtr obj, IntPtr key);
300 /// <since_tizen> preview </since_tizen>
301 public delegate IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old);
304 public uint refCount;
306 public string itemStyle;
307 public readonly string decorateItemStyle;
308 public readonly string decorateAllItemStyle;
309 public GetTextCallback textCallback;
310 public GetContentCallback contentCallback;
311 public GetStateCallback stateCallback;
312 public DelCallback delCallback;
313 public FilterCallback filterCallback;
314 public GetReusableContentCallback reusableContentCallback;