Release 4.0.0-preview1-00051
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / ItemFactory.cs
1 /** Copyright (c) 2017 Samsung Electronics Co., Ltd.
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 *
15 */
16
17 using System.Reflection;
18
19 namespace Tizen.NUI
20 {
21     using Tizen.NUI.BaseComponents;
22     internal class ItemFactory : global::System.IDisposable
23     {
24         private global::System.Runtime.InteropServices.HandleRef swigCPtr;
25         protected bool swigCMemOwn;
26
27         internal ItemFactory(global::System.IntPtr cPtr, bool cMemoryOwn)
28         {
29             swigCMemOwn = cMemoryOwn;
30             swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
31         }
32
33         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(ItemFactory obj)
34         {
35             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
36         }
37
38         //A Flag to check who called Dispose(). (By User or DisposeQueue)
39         private bool isDisposeQueued = false;
40         //A Flat to check if it is already disposed.
41         protected bool disposed = false;
42
43
44         ~ItemFactory()
45         {
46             if (!isDisposeQueued)
47             {
48                 isDisposeQueued = true;
49                 DisposeQueue.Instance.Add(this);
50             }
51         }
52
53         public void Dispose()
54         {
55             //Throw excpetion if Dispose() is called in separate thread.
56             if (!Window.IsInstalled())
57             {
58                 throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
59             }
60
61             if (isDisposeQueued)
62             {
63                 Dispose(DisposeTypes.Implicit);
64             }
65             else
66             {
67                 Dispose(DisposeTypes.Explicit);
68                 System.GC.SuppressFinalize(this);
69             }
70         }
71
72         protected virtual void Dispose(DisposeTypes type)
73         {
74             if (disposed)
75             {
76                 return;
77             }
78
79             if (type == DisposeTypes.Explicit)
80             {
81                 //Called by User
82                 //Release your own managed resources here.
83                 //You should release all of your own disposable objects here.
84
85             }
86
87             //Release your own unmanaged resources here.
88             //You should not access any managed member here except static instance.
89             //because the execution order of Finalizes is non-deterministic.
90
91             if (swigCPtr.Handle != global::System.IntPtr.Zero)
92             {
93                 if (swigCMemOwn)
94                 {
95                     swigCMemOwn = false;
96                     NDalicPINVOKE.delete_ItemFactory(swigCPtr);
97                 }
98                 swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
99             }
100
101             disposed = true;
102         }
103
104         public virtual uint GetNumberOfItems()
105         {
106             uint ret = NDalicPINVOKE.ItemFactory_GetNumberOfItems(swigCPtr);
107             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
108             return ret;
109         }
110
111         public virtual View NewItem(uint itemId)
112         {
113             View ret = new View(NDalicPINVOKE.ItemFactory_NewItem(swigCPtr, itemId), true);
114             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
115             return ret;
116         }
117
118         public virtual void ItemReleased(uint itemId, View view)
119         {
120             if (SwigDerivedClassHasMethod("ItemReleased", swigMethodTypes2)) NDalicPINVOKE.ItemFactory_ItemReleasedSwigExplicitItemFactory(swigCPtr, itemId, View.getCPtr(view)); else NDalicPINVOKE.ItemFactory_ItemReleased(swigCPtr, itemId, View.getCPtr(view));
121             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
122         }
123
124         public ItemFactory() : this(NDalicPINVOKE.new_ItemFactory(), true)
125         {
126             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
127             SwigDirectorConnect();
128         }
129
130         private void SwigDirectorConnect()
131         {
132             if (SwigDerivedClassHasMethod("GetNumberOfItems", swigMethodTypes0))
133                 swigDelegate0 = new SwigDelegateItemFactory_0(SwigDirectorGetNumberOfItems);
134             if (SwigDerivedClassHasMethod("NewItem", swigMethodTypes1))
135                 swigDelegate1 = new SwigDelegateItemFactory_1(SwigDirectorNewItem);
136             if (SwigDerivedClassHasMethod("ItemReleased", swigMethodTypes2))
137                 swigDelegate2 = new SwigDelegateItemFactory_2(SwigDirectorItemReleased);
138             NDalicPINVOKE.ItemFactory_director_connect(swigCPtr, swigDelegate0, swigDelegate1, swigDelegate2);
139         }
140
141         private bool SwigDerivedClassHasMethod(string methodName, global::System.Type[] methodTypes)
142         {
143             global::System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
144             bool hasDerivedMethod = this.GetType().GetTypeInfo().IsSubclassOf(typeof(ItemFactory));
145             NUILog.Debug("hasDerivedMethod=" + hasDerivedMethod);
146             return hasDerivedMethod && (methodInfo != null);
147         }
148
149         private uint SwigDirectorGetNumberOfItems()
150         {
151             return GetNumberOfItems();
152         }
153
154         private global::System.IntPtr SwigDirectorNewItem(uint itemId)
155         {
156             return View.getCPtr(NewItem(itemId)).Handle;
157         }
158
159         private void SwigDirectorItemReleased(uint itemId, global::System.IntPtr actor)
160         {
161             ItemReleased(itemId, new View(actor, true));
162         }
163
164         public delegate uint SwigDelegateItemFactory_0();
165         public delegate global::System.IntPtr SwigDelegateItemFactory_1(uint itemId);
166         public delegate void SwigDelegateItemFactory_2(uint itemId, global::System.IntPtr actor);
167
168         private SwigDelegateItemFactory_0 swigDelegate0;
169         private SwigDelegateItemFactory_1 swigDelegate1;
170         private SwigDelegateItemFactory_2 swigDelegate2;
171
172         private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { };
173         private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(uint) };
174         private static global::System.Type[] swigMethodTypes2 = new global::System.Type[] { typeof(uint), typeof(View) };
175     }
176
177 }