[EXaml] Refactor EXaml
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / EXaml / Operation / AddEvent.cs
index 4971a10..a444926 100755 (executable)
@@ -26,23 +26,45 @@ namespace Tizen.NUI.EXaml
 {
     internal class AddEvent : Operation
     {
-        public AddEvent(int instanceIndex, int elementIndex, int eventIndex, int valueIndex)
+        public AddEvent(GlobalDataList globalDataList, List<object> operationInfo)
         {
-            this.instanceIndex = instanceIndex;
-            this.elementIndex = elementIndex;
-            this.eventIndex = eventIndex;
-            this.valueIndex = valueIndex;
+            instanceIndex = (int)operationInfo[0];
+            elementIndex = (int)operationInfo[1];
+            eventIndex = (int)operationInfo[2];
+            valueIndex = (int)operationInfo[3];
+            this.globalDataList = globalDataList;
         }
 
+        private GlobalDataList globalDataList;
+
         public void Do()
         {
-            object instance = LoadEXaml.GatheredInstances[instanceIndex];
-            object element = LoadEXaml.GatheredInstances[elementIndex];
-            var eventInfo = GatherEvent.GatheredEvents[eventIndex];
+            object instance = globalDataList.GatheredInstances[instanceIndex];
+            object element = globalDataList.GatheredInstances[elementIndex];
+            var eventInfo = globalDataList.GatheredEvents[eventIndex];
             try
             {
-                var methodInfo = GatherMethod.GatheredMethods[valueIndex];
-                eventInfo.AddEventHandler(instance, methodInfo.CreateDelegate(eventInfo.EventHandlerType, element));
+                var methodInfo = globalDataList.GatheredMethods[valueIndex];
+                Delegate eventDelegate = null;
+
+                if (methodInfo.IsStatic)
+                {
+                    eventDelegate = methodInfo.CreateDelegate(eventInfo.EventHandlerType);
+                }
+                else
+                {
+                    eventDelegate = methodInfo.CreateDelegate(eventInfo.EventHandlerType, element);
+                }
+
+                if (null != eventDelegate)
+                {
+                    eventInfo.AddEventHandler(instance, eventDelegate);
+                    globalDataList.RemoveEventOperations.Add(new RemoveEvent(eventDelegate, instance, eventInfo));
+                }
+                else
+                {
+                    throw new Exception($"Can't create delegate for method {methodInfo.DeclaringType.FullName}.{methodInfo.Name}");
+                }
             }
             catch (ArgumentException ae)
             {