[NUI] TCSACR-226 code change (#1032)
[platform/core/csapi/tizenfx.git] / src / ElmSharp / ElmSharp / GenItemClass.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using System.Collections.Generic;
19 using System.Runtime.InteropServices;
20
21 namespace ElmSharp
22 {
23     /// <summary>
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".
26     /// </summary>
27     /// <since_tizen> preview </since_tizen>
28     public class GenItemClass : IDisposable
29     {
30         static Dictionary<IntPtr, EvasObject> s_HandleToEvasObject = new Dictionary<IntPtr, EvasObject>();
31
32         /// <summary>
33         /// The delegate to define <see cref="GetTextHandler"/>.
34         /// </summary>
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);
40
41         /// <summary>
42         /// The delegate to define <see cref="GetContentHandler"/>.
43         /// </summary>
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);
49
50         /// <summary>
51         /// The delegate to define <see cref="DeleteHandler"/>.
52         /// </summary>
53         /// <param name="data">The item data.</param>
54         /// <since_tizen> preview </since_tizen>
55         public delegate void DeleteDelegate(object data);
56
57         /// <summary>
58         /// The delegate to define <see cref="ReusableContentHandler"/>.
59         /// </summary>
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);
66
67         ItemClass _itemClass;
68         IntPtr _unmanagedPtr = IntPtr.Zero;
69         string _style;
70
71         /// <summary>
72         /// Creates and initializes a new instance of the GenItemClass.
73         /// </summary>
74         /// <param name="style">The item display style.</param>
75         /// <since_tizen> preview </since_tizen>
76         public GenItemClass(string style)
77         {
78             _style = style;
79             IntPtr unmanaged = CreateItemClass();
80
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;
88
89             ReleaseItemClass(unmanaged);
90         }
91
92         /// <summary>
93         /// Destroys the GenItemClass object.
94         /// </summary>
95         ~GenItemClass()
96         {
97             Dispose(false);
98         }
99
100         /// <summary>
101         /// Gets the item style.
102         /// </summary>
103         /// <since_tizen> preview </since_tizen>
104         public string ItemStyle { get { return _style; } }
105
106         /// <summary>
107         /// Gets or sets the callback that defines how to display the item text.
108         /// If get, return <see cref="GetTextDelegate"/>.
109         /// </summary>
110         /// <since_tizen> preview </since_tizen>
111         public GetTextDelegate GetTextHandler { get; set; }
112
113         /// <summary>
114         /// Gets or sets the callback that defines how to display the item content.
115         /// If get, return <see cref="GetContentDelegate"/>.
116         /// </summary>
117         /// <since_tizen> preview </since_tizen>
118         public GetContentDelegate GetContentHandler { get; set; }
119
120         /// <summary>
121         /// Gets or sets the callback that defines how to delete the item text and content.
122         /// If get, return <see cref="DeleteDelegate"/>.
123         /// </summary>
124         /// <since_tizen> preview </since_tizen>
125         public DeleteDelegate DeleteHandler { get; set; }
126
127         /// <summary>
128         /// Gets or sets the callback that defines how to reuse the item content.
129         /// If get, return <see cref="GetReusableContentDelegate"/>.
130         /// </summary>
131         /// <since_tizen> preview </since_tizen>
132         public GetReusableContentDelegate ReusableContentHandler { get; set; }
133
134         internal IntPtr UnmanagedPtr
135         {
136             get
137             {
138                 if (_unmanagedPtr == IntPtr.Zero)
139                 {
140                     _unmanagedPtr = Marshal.AllocHGlobal(Marshal.SizeOf(_itemClass));
141                     Marshal.StructureToPtr(_itemClass, _unmanagedPtr, false);
142                 }
143                 return _unmanagedPtr;
144             }
145         }
146
147         /// <summary>
148         /// Releases all the resources currently used by this instance.
149         /// </summary>
150         /// <param name="disposing">
151         /// true if the managed resources should be disposed,
152         /// otherwise false.
153         /// </param>
154         /// <since_tizen> preview </since_tizen>
155         protected virtual void Dispose(bool disposing)
156         {
157             if (_unmanagedPtr != IntPtr.Zero)
158             {
159                 Marshal.FreeHGlobal(_unmanagedPtr);
160                 _unmanagedPtr = IntPtr.Zero;
161             }
162         }
163
164         /// <summary>
165         /// Destroys the current object.
166         /// </summary>
167         /// <since_tizen> preview </since_tizen>
168         public void Dispose()
169         {
170             Dispose(true);
171             GC.SuppressFinalize(this);
172         }
173
174         internal void SendItemDeleted(object data)
175         {
176             // data is user inserted value with GenItem
177             DeleteHandler?.Invoke(data);
178         }
179
180         /// <summary>
181         /// Creates a new GenList item class in a given GenList widget.
182         /// </summary>
183         /// <returns>The new item class object.</returns>
184         /// <since_tizen> preview </since_tizen>
185         protected virtual IntPtr CreateItemClass()
186         {
187             return Interop.Elementary.elm_genlist_item_class_new();
188         }
189
190         /// <summary>
191         /// Removes an item class in a given GenList widget.
192         /// </summary>
193         /// <param name="unmanagedPtr">The object to be removed.</param>
194         /// <since_tizen> preview </since_tizen>
195         protected virtual void ReleaseItemClass(IntPtr unmanagedPtr)
196         {
197             Interop.Elementary.elm_genlist_item_class_free(unmanagedPtr);
198         }
199
200         string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part)
201         {
202             GenItem item = ItemObject.GetItemById((int)data) as GenItem;
203             return GetTextHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
204         }
205
206         IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part)
207         {
208             GenItem item = ItemObject.GetItemById((int)data) as GenItem;
209             EvasObject evasObject = GetContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part));
210             if (evasObject != null)
211             {
212                 s_HandleToEvasObject[evasObject.Handle] = evasObject;
213                 evasObject.Deleted += EvasObjectDeleted;
214             }
215             return evasObject;
216         }
217
218         void EvasObjectDeleted(object sender, EventArgs e)
219         {
220             if(sender is EvasObject evasObject)
221                 s_HandleToEvasObject.Remove(evasObject);
222         }
223
224         IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old)
225         {
226             IntPtr reusedHandle = IntPtr.Zero;
227             GenItem item = ItemObject.GetItemById((int)data) as GenItem;
228             if (s_HandleToEvasObject.ContainsKey(old))
229             {
230                 reusedHandle = ReusableContentHandler?.Invoke(item?.Data, Marshal.PtrToStringAnsi(part), s_HandleToEvasObject[old]);
231             }
232             return reusedHandle;
233         }
234
235         void DelCallback(IntPtr data, IntPtr obj)
236         {
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
243         }
244     }
245
246     /// <summary>
247     /// It represents the gengrid item class definition field details.
248     /// </summary>
249     /// <since_tizen> preview </since_tizen>
250     public class GenGridItemClass : GenItemClass
251     {
252         /// <summary>
253         /// Create the GenGridItemClass instance.
254         /// </summary>
255         /// <param name="style">The item display style.</param>
256         /// <since_tizen> preview </since_tizen>
257         public GenGridItemClass(string style) : base(style)
258         {
259         }
260
261         /// <summary>
262         /// Adds a new gengrid item class in a given GenGrid widget.
263         /// </summary>
264         /// <returns>The new instance.</returns>
265         /// <since_tizen> preview </since_tizen>
266         protected override IntPtr CreateItemClass()
267         {
268             return Interop.Elementary.elm_gengrid_item_class_new();
269         }
270
271         /// <summary>
272         /// Removes the item class in a given GenGrid widget.
273         /// </summary>
274         /// <param name="unmanagedPtr">The object to be removed.</param>
275         /// <since_tizen> preview </since_tizen>
276         protected override void ReleaseItemClass(IntPtr unmanagedPtr)
277         {
278             Interop.Elementary.elm_gengrid_item_class_free(unmanagedPtr);
279         }
280     }
281
282     [StructLayout(LayoutKind.Sequential)]
283     internal class ItemClass
284     {
285         /// <since_tizen> preview </since_tizen>
286         public delegate string GetTextCallback(IntPtr data, IntPtr obj, IntPtr part);
287
288         /// <since_tizen> preview </since_tizen>
289         public delegate IntPtr GetContentCallback(IntPtr data, IntPtr obj, IntPtr part);
290
291         /// <since_tizen> preview </since_tizen>
292         public delegate int GetStateCallback(IntPtr data, IntPtr obj, IntPtr part);
293
294         /// <since_tizen> preview </since_tizen>
295         public delegate void DelCallback(IntPtr data, IntPtr obj);
296
297         /// <since_tizen> preview </since_tizen>
298         public delegate int FilterCallback(IntPtr data, IntPtr obj, IntPtr key);
299
300         /// <since_tizen> preview </since_tizen>
301         public delegate IntPtr GetReusableContentCallback(IntPtr data, IntPtr obj, IntPtr part, IntPtr old);
302
303         public int version;
304         public uint refCount;
305         public int deleteMe;
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;
315     }
316 }