[NUI] Call ProcessorOnceEvent after all event finished
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Common / ProcessorController.cs
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
18 using System.Runtime.InteropServices;
19 using System;
20 using System.ComponentModel;
21
22 namespace Tizen.NUI
23 {
24     /// <summary>
25     /// Singleton class.
26     /// ProcessorController handles ProcessorCallbacks those are requested to be called for each end of event process.
27     /// If there are works those required to be called after all of the event process for the efficiency, add them ProcessorController.
28     /// The calling order is not guaranteed but ProcessorCallbackes of LayoutController those are added by using AddLayoutControllerProcessor,
29     /// are called after ordinaly ProcessCallbacks added by AddProcessor.
30     ///
31     /// The added callbacks will be called every time of event tick.
32     /// If the callback is not be wanted to be called anymore, remove it.
33     /// </summary>
34     internal sealed class ProcessorController : Disposable
35     {
36         private static ProcessorController instance = null;
37
38         private ProcessorController() : this(Interop.ProcessorController.New(), true)
39         {
40         }
41
42         internal ProcessorController(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
43         {
44             processorCallback = new ProcessorEventHandler(Process);
45             processorPostCallback = new ProcessorEventHandler(PostProcess);
46             Interop.ProcessorController.SetCallback(SwigCPtr, processorCallback);
47             Interop.ProcessorController.SetPostCallback(SwigCPtr, processorPostCallback);
48         }
49
50         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
51         internal delegate void ProcessorEventHandler();
52
53         private ProcessorEventHandler processorCallback = null;
54         private ProcessorEventHandler processorPostCallback = null;
55
56         public event EventHandler ProcessorOnceEvent;
57         public event EventHandler ProcessorEvent;
58         public event EventHandler LayoutProcessorEvent;
59
60         public static ProcessorController Instance
61         {
62             get
63             {
64                 if (instance == null)
65                 {
66                     instance = new ProcessorController();
67                 }
68                 return instance;
69             }
70         }
71
72         public void Process()
73         {
74             ProcessorOnceEvent?.Invoke(this, null);
75             ProcessorOnceEvent = null;
76             ProcessorEvent?.Invoke(this, null);
77             LayoutProcessorEvent?.Invoke(this, null);
78         }
79
80         public void PostProcess()
81         {
82             ProcessorOnceEvent?.Invoke(this, null);
83             ProcessorOnceEvent = null;
84         }
85
86         /// <summary>
87         /// Dispose ProcessorController.
88         /// </summary>
89         [EditorBrowsable(EditorBrowsableState.Never)]
90         protected override void Dispose(DisposeTypes type)
91         {
92             Interop.ProcessorController.RemoveCallback(SwigCPtr, processorCallback);
93             Interop.ProcessorController.RemovePostCallback(SwigCPtr, processorPostCallback);
94             ProcessorOnceEvent = null;
95             ProcessorEvent = null;
96             LayoutProcessorEvent = null;
97             GC.SuppressFinalize(this);
98
99             base.Dispose(type);
100         }
101
102         /// <summary>
103         /// Awake ProcessorController.
104         /// It will call ProcessController.processorCallback and ProcessController.processorPostCallback hardly.
105         /// </summary>
106         /// <note>
107         /// When event thread is not in idle state, This function will be ignored.
108         /// </note>
109         [EditorBrowsable(EditorBrowsableState.Never)]
110         public void Awake()
111         {
112             Interop.ProcessorController.Awake(SwigCPtr);
113         }
114     } // class ProcessorController
115 } // namespace Tizen.NUI