Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / FUi_TouchGestureTimerManager.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18  * @file                FUi_TouchGestureTimerManager.cpp
19  * @brief               This is the implementation file for %_TouchGestureTimerManager class
20  * @version             2.0
21  *
22  * This file contains the implementation of %_TouchGestureTimerManager class.
23  *
24  */
25
26 // includes
27 #include "FUi_ControlManager.h"
28 #include "FUi_TouchGestureTimerManager.h"
29 #include "FUi_TouchTapGestureDetector.h"
30 #include "FUi_TouchLongPressGestureDetector.h"
31 #include "FUi_Control.h"
32
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Base::Runtime;
35 using namespace Tizen::Graphics;
36
37 namespace Tizen { namespace Ui
38 {
39 class _TouchGestureTimerManager::_TouchGestureTimerListener
40         : public ITimerEventListener
41 {
42 public:
43         _TouchGestureTimerListener(_TouchGestureTimerManager& mgr)
44                 : __pManager(&mgr)
45         {
46         }
47
48         virtual void OnTimerExpired(Timer& timer)
49         {
50                 if (!__pManager)
51                 {
52                         return;
53                 }
54                 __pManager->SetTimerState(false);
55                 _TouchGestureDetector* pGestureDetector = __pManager->GetGestureDetector();
56
57                 if (pGestureDetector)
58                 {
59                         switch(pGestureDetector->GetDetectorType())
60                         {
61                         case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
62                         {
63                                 _TouchTapGestureDetector* pTapGesture = dynamic_cast<_TouchTapGestureDetector*>(pGestureDetector);
64
65                                 if (pTapGesture && pTapGesture->IsGestureStarted())
66                                 {
67                                         pTapGesture->SetGestureStart(false);
68
69                                         if (pTapGesture->IsAllTapped() && pTapGesture->IsInBounds())
70                                         {
71                                                 pTapGesture->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
72                                         }
73                                         else
74                                         {
75                                                 pTapGesture->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
76                                         }
77                                 }
78
79                                 pTapGesture->ClearTapInfoList();
80                         }
81                         break;
82
83                         case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
84                         {
85                                 _TouchLongPressGestureDetector* pLongPressGesture = dynamic_cast<_TouchLongPressGestureDetector*>(pGestureDetector);
86
87                                 if (pLongPressGesture && pLongPressGesture->IsGestureStarted())
88                                 {
89                                         pLongPressGesture->SetGestureStart(false);
90
91                                         if (pLongPressGesture->IsPressed())
92                                         {
93                                                 pLongPressGesture->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
94                                         }
95                                         else
96                                         {
97                                                 pLongPressGesture->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
98                                         }
99                                 }
100
101                                 pLongPressGesture->ClearLongPressInfoList();
102                         }
103                         break;
104
105                         default:
106                         break;
107                         }
108                 }
109
110                 if (__pManager)
111                 {
112                         __pManager->SetTimerExpiredState(true);
113                 }
114         }
115
116         void SetTouchGestureTimerManager(_TouchGestureTimerManager* pManager)
117         {
118                 __pManager = pManager;
119         }
120
121 private:
122         _TouchGestureTimerManager* __pManager;
123 };
124
125 _TouchGestureTimerManager::_TouchGestureTimerManager(const _TouchGestureDetector& gestureDetector)
126         : __isTimerExpired(false)
127         , __isTimerStarted(false)
128         , __pTimer(null)
129         , __pTimerListener(null)
130 {
131         ClearLastResult();
132
133         result r = E_SUCCESS;
134
135         __pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
136         __pTimerListener = new (std::nothrow) _TouchGestureTimerListener(*this);
137         SysTryReturnVoidResult(NID_UI, __pTimerListener, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. ");
138
139         __pTimer = new (std::nothrow) Timer;
140         SysTryCatch(NID_UI, __pTimer, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
141
142         r = __pTimer->Construct(*__pTimerListener);
143         SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
144
145         return;
146
147 CATCH:
148         if (__pTimerListener)
149         {
150                 __pTimerListener->SetTouchGestureTimerManager(null);
151                 delete __pTimerListener;
152                 __pTimerListener = null;
153         }
154
155         if (__pTimer)
156         {
157                 delete __pTimer;
158                 __pTimer = null;
159         }
160 }
161
162 _TouchGestureTimerManager::~_TouchGestureTimerManager(void)
163 {
164         if (__pTimer)
165         {
166                 __pTimer->Cancel();
167
168                 delete __pTimer;
169                 __pTimer = null;
170         }
171
172         if (__pTimerListener)
173         {
174                 __pTimerListener->SetTouchGestureTimerManager(null);
175                 delete __pTimerListener;
176                 __pTimerListener = null;
177         }
178 }
179
180 _TouchGestureDetector*
181 _TouchGestureTimerManager::GetGestureDetector(void) const
182 {
183         return __pGestureDetector;
184 }
185
186 bool
187 _TouchGestureTimerManager::IsTimerStarted(void)
188 {
189         return __isTimerStarted;
190 }
191
192 void
193 _TouchGestureTimerManager::SetTimerState(bool started)
194 {
195         __isTimerStarted = started;
196 }
197
198 void
199 _TouchGestureTimerManager::SetTimerExpiredState(bool expired)
200 {
201         __isTimerExpired = expired;
202 }
203
204 result
205 _TouchGestureTimerManager::StartTimer(int time)
206 {
207         SysTryReturnResult(NID_UI, __pTimer != null, E_SYSTEM, "[E_SYSTEM] System error occurred. ");
208
209         result r = __pTimer->Start(time);
210         SysTryReturnResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating", GetErrorMessage(r));
211
212         __isTimerStarted = true;
213         __isTimerExpired = false;
214
215         return E_SUCCESS;
216 }
217
218 bool
219 _TouchGestureTimerManager::IsTimerExpired(void)
220 {
221         return __isTimerExpired;
222 }
223
224 result
225 _TouchGestureTimerManager::CancelTimer(void)
226 {
227         result r = __pTimer->Cancel();
228         SysTryReturnResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating", GetErrorMessage(r));
229
230         __isTimerStarted = false;
231         __isTimerExpired = true;
232
233         return E_SUCCESS;
234 }
235
236 }} // Tizen::Ui
237