2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.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
9 // http://www.apache.org/licenses/LICENSE-2.0/
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.
18 * @file FUi_TouchGestureDetector.cpp
19 * @brief This is the implementation file for %_TouchGestureDetector class
22 * This file contains the implementation of %_TouchGestureDetector class.
26 #include <FBaseSysLog.h>
27 #include <FBase_Log.h>
28 #include <FUiITouchFlickGestureEventListener.h>
29 #include <FUiITouchLongPressGestureEventListener.h>
30 #include <FUiITouchTapGestureEventListener.h>
31 #include <FUiITouchPinchGestureEventListener.h>
32 #include <FUiITouchPanningGestureEventListener.h>
33 #include <FUiITouchRotationGestureEventListener.h>
34 #include <FUiITouchCustomGestureEventListener.h>
35 #include "FUi_TouchManager.h"
36 #include "FUi_ITouchFlickGestureEventListener.h"
37 #include "FUi_ITouchLongPressGestureEventListener.h"
38 #include "FUi_ITouchTapGestureEventListener.h"
39 #include "FUi_ITouchPinchGestureEventListener.h"
40 #include "FUi_ITouchPanningGestureEventListener.h"
41 #include "FUi_ITouchRotationGestureEventListener.h"
42 #include "FUi_ITouchCustomGestureEventListener.h"
43 #include "FUi_TouchFlickGestureDetectorImpl.h"
44 #include "FUi_TouchLongPressGestureDetectorImpl.h"
45 #include "FUi_TouchTapGestureDetectorImpl.h"
46 #include "FUi_TouchPinchGestureDetectorImpl.h"
47 #include "FUi_TouchPanningGestureDetectorImpl.h"
48 #include "FUi_TouchRotationGestureDetectorImpl.h"
49 #include "FUi_ControlManager.h"
51 using namespace Tizen::Base;
52 using namespace Tizen::Base::Collection;
53 using namespace Tizen::Graphics;
55 namespace Tizen { namespace Ui
58 _TouchGestureDetector::_TouchGestureDetector(void)
59 : __isTouchEventDelayed(false)
60 , __isTouchCanceledOnSuccess(false)
61 , __isDetectionStarted(false)
62 , __currentState(_TOUCH_GESTURE_DETECTOR_STATE_READY)
63 , __type(_TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM)
66 , __pWantToFailList(null)
67 , __pCurrentWantToFailList(null)
68 , __pEventListenerList(null)
72 __pEventListenerList = new (std::nothrow) LinkedListT<_ITouchGestureEventListener*>;
73 SysTryReturnVoidResult(NID_UI, __pEventListenerList,
74 E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
76 __pWantToFailList = new (std::nothrow) LinkedListT<_TouchGestureDetector*>;
77 SysTryCatch(NID_UI, __pWantToFailList, ,
78 E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
80 __pCurrentWantToFailList = new (std::nothrow) LinkedListT<_TouchGestureDetector*>;
81 SysTryCatch(NID_UI, __pCurrentWantToFailList, ,
82 E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
89 if (__pEventListenerList)
91 delete __pEventListenerList;
92 __pEventListenerList = null;
95 if (__pWantToFailList)
97 delete __pWantToFailList;
98 __pWantToFailList = null;
101 if (__pCurrentWantToFailList)
103 delete __pCurrentWantToFailList;
104 __pCurrentWantToFailList = null;
108 _TouchGestureDetector::~_TouchGestureDetector(void)
110 delete __pEventListenerList;
111 __pEventListenerList = null;
113 delete __pWantToFailList;
114 __pWantToFailList = null;
116 delete __pCurrentWantToFailList;
117 __pCurrentWantToFailList = null;
123 _TouchGestureDetector::AddGestureListener(const _ITouchGestureEventListener& listener)
125 bool exist = __pEventListenerList->Contains(const_cast <_ITouchGestureEventListener*>(&listener));
128 SysTryReturnResult(NID_UI,
129 __pEventListenerList->Add(const_cast <_ITouchGestureEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
130 "[E_SYSTEM] System error occurred.");
137 _TouchGestureDetector::RemoveGestureListener(const _ITouchGestureEventListener& listener)
139 if (__pEventListenerList->GetCount() == 0)
141 return E_INVALID_CONDITION;
144 SysTryReturnResult(NID_UI,
145 __pEventListenerList->Remove(const_cast <_ITouchGestureEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
146 "[E_SYSTEM] System error occurred.");
151 IListT <_ITouchGestureEventListener*>*
152 _TouchGestureDetector::GetGestureListenerList(void) const
154 return __pEventListenerList;
158 _TouchGestureDetector::SetDelegate(const _ITouchGestureDelegate& delegator)
160 __pDelegator = const_cast<_ITouchGestureDelegate*>(&delegator);
163 _ITouchGestureDelegate*
164 _TouchGestureDetector::GetDelegate(void) const
170 _TouchGestureDetector::SetControl(const _Control& control)
172 __gestureContol = control.GetHandle();
178 _TouchGestureDetector::GetControl(void) const
180 _ControlManager* pControlManager = _ControlManager::GetInstance();
181 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
183 return pControlManager->GetObject(__gestureContol);
186 _TouchGestureDetectorState
187 _TouchGestureDetector::GetDetectorState(void) const
189 return __currentState;
193 _TouchGestureDetector::SetDetectorType(_TouchGestureDetectorType type)
198 _TouchGestureDetectorType
199 _TouchGestureDetector::GetDetectorType(void) const
205 _TouchGestureDetector::SetDelayTouchEventEnabled(bool enabled)
207 __isTouchEventDelayed = enabled;
211 _TouchGestureDetector::IsDelayTouchEventEnabled(void) const
213 return __isTouchEventDelayed;
217 _TouchGestureDetector::SetCancelTouchEventOnSuccessEnabled(bool enabled)
219 __isTouchCanceledOnSuccess = enabled;
223 _TouchGestureDetector::IsCancelTouchEventOnSuccessEnabled(void) const
225 return __isTouchCanceledOnSuccess;
229 _TouchGestureDetector::SetUserData(void* pUserData)
231 __pUserData = pUserData;
235 _TouchGestureDetector::GetUserData(void) const
241 _TouchGestureDetector::ExistWaitingList(void) const
245 if (__pCurrentWantToFailList && (__pCurrentWantToFailList->GetCount() > 0))
254 _TouchGestureDetector::StartOnFailureOf(const _TouchGestureDetector& gesture)
256 SysTryReturnResult(NID_UI, IsPossibleToAddFailList(gesture), E_SYSTEM, "[E_SYSTEM] param gesture also waits you to fail.");
258 _TouchGestureDetector* pGesture = const_cast < _TouchGestureDetector* >(&gesture);
259 bool exist = __pWantToFailList->Contains(pGesture);
262 SysTryReturnResult(NID_UI, __pWantToFailList->Add(pGesture) == E_SUCCESS,
263 E_SYSTEM, "[E_SYSTEM] System error occurred.");
270 _TouchGestureDetector::IsPossibleToAddFailList(const _TouchGestureDetector& gesture)
272 IListT<_TouchGestureDetector*>* pList = gesture.GetWantToFailList();
278 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
281 while(pEnumerator->MoveNext() == E_SUCCESS)
283 _TouchGestureDetector* pGesture = null;
284 pEnumerator->GetCurrent(pGesture);
285 if (pGesture == null)
290 if (pGesture == this)
302 _TouchGestureDetector::SetDetectorState(_TouchGestureDetectorState state)
304 __currentState = state;
306 if (state == _TOUCH_GESTURE_DETECTOR_STATE_READY)
308 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = __pWantToFailList->GetEnumeratorN();
312 while(pEnumerator->MoveNext() == E_SUCCESS)
314 _TouchGestureDetector* pGesture = null;
315 pEnumerator->GetCurrent(pGesture);
316 if (pGesture == null)
321 bool exist = __pCurrentWantToFailList->Contains(pGesture);
324 __pCurrentWantToFailList->Add(pGesture);
331 if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED || state == _TOUCH_GESTURE_DETECTOR_STATE_CHANGED || state == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED)
333 if (ExistWaitingList())
335 __isDetectionStarted = true;
336 __currentState = _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS_AND_WAIT;
340 _Control* pControl = GetControl();
343 IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = pControl->GetStartedGestureDetectorEnumeratorN();
346 while(pMapEnumerator->MoveNext() == E_SUCCESS)
348 _TouchGestureDetector* pStartedGestureDetector = null;
349 pMapEnumerator->GetKey(pStartedGestureDetector);
351 if (pStartedGestureDetector && (pStartedGestureDetector == this))
353 _TouchGestureDetectorEventType eventType = pStartedGestureDetector->GetGestureDetectorEventType();
354 if (eventType == _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_DISCRETE ||
355 (eventType == _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_CONTINUOUS && state == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED))
357 pControl->SetStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
361 delete pMapEnumerator;
365 ProcessPublicListener(*this);
366 ProcessCoreListener(*this);
367 NotifyStateChanged();
369 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
371 _Control* pControl = GetControl();
374 IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = pControl->GetStartedGestureDetectorEnumeratorN();
377 while(pMapEnumerator->MoveNext() == E_SUCCESS)
379 _TouchGestureDetector* pStartedGestureDetector = null;
380 pMapEnumerator->GetKey(pStartedGestureDetector);
382 if (pStartedGestureDetector && (pStartedGestureDetector == this))
384 pControl->SetStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_FAILED);
387 delete pMapEnumerator;
391 NotifyStateChanged();
393 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
395 if (!IsGestureStarted())
400 SetGestureStart(false);
403 _TouchGestureDetectorState currentState = GetDetectorState();
404 if (( !__isDetectionStarted && currentState == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED) || currentState == _TOUCH_GESTURE_DETECTOR_STATE_FAILED || currentState == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
411 _TouchGestureDetector::SetToDefaultState(void)
413 __pCurrentWantToFailList->RemoveAll();
414 __isDetectionStarted = false;
415 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_READY);
418 _TouchGestureDetectorEventType
419 _TouchGestureDetector::GetGestureDetectorEventType(void)
421 _TouchGestureDetectorType type = GetDetectorType();
423 if (type == _TOUCH_GESTURE_DETECTOR_TYPE_PINCH ||type == _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM
424 ||type == _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION || type == _TOUCH_GESTURE_DETECTOR_TYPE_PANNING)
426 return _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_CONTINUOUS;
430 return _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_DISCRETE;
435 _TouchGestureDetector::GetDescription(void)
439 switch (GetDetectorType())
441 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
442 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM";
445 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
446 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_TAP";
449 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
450 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS";
453 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
454 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_PINCH";
457 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
458 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_FLICK";
461 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
462 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_ROTATION";
465 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
466 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_PANNING";
473 String description(L"");
475 description.Format(LOG_LEN_MAX, L"%ls state(%d) delay(%d) cancelonSuccess(%d)",
476 type.GetPointer(), GetDetectorState(),
477 IsDelayTouchEventEnabled(), IsCancelTouchEventOnSuccessEnabled());
482 IListT <_TouchGestureDetector*>*
483 _TouchGestureDetector::GetWantToFailList(void) const
485 return __pWantToFailList;
489 _TouchGestureDetector::ProcessPublicListener(_TouchGestureDetector& gesture)
491 _TouchGestureDetectorImpl* pImpl = static_cast<_TouchGestureDetectorImpl*>(gesture.GetUserData());
497 IListT<ITouchGestureEventListener*>* pPublicList = pImpl->GetGestureEventListenerList();
503 IEnumeratorT<ITouchGestureEventListener*>* pEnumerator = pPublicList->GetEnumeratorN();
504 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
506 while(pEnumerator->MoveNext() == E_SUCCESS)
508 ITouchGestureEventListener* pListener = null;
509 pEnumerator->GetCurrent(pListener);
511 if (pListener == null)
516 switch(gesture.GetDetectorType())
518 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
520 ITouchTapGestureEventListener* pPublicListener = dynamic_cast<ITouchTapGestureEventListener*>(pListener);
521 TouchTapGestureDetector* pPublicGestureDetector = dynamic_cast<TouchTapGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
523 if (pPublicListener && pPublicGestureDetector)
525 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
527 pPublicListener->OnTapGestureCanceled(*pPublicGestureDetector);
528 gesture.SetToDefaultState();
530 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
532 pPublicListener->OnTapGestureDetected(*pPublicGestureDetector);
538 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
540 ITouchLongPressGestureEventListener* pPublicListener = dynamic_cast<ITouchLongPressGestureEventListener*>(pListener);
541 TouchLongPressGestureDetector* pPublicGestureDetector = dynamic_cast<TouchLongPressGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
543 if (pPublicListener && pPublicGestureDetector)
545 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
547 pPublicListener->OnLongPressGestureCanceled(*pPublicGestureDetector);
548 gesture.SetToDefaultState();
550 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
552 pPublicListener->OnLongPressGestureDetected(*pPublicGestureDetector);
558 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
560 ITouchPinchGestureEventListener* pPublicListener = dynamic_cast<ITouchPinchGestureEventListener*>(pListener);
561 TouchPinchGestureDetector* pPublicGestureDetector = dynamic_cast<TouchPinchGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
563 if (pPublicListener && pPublicGestureDetector)
565 switch(gesture.GetDetectorState())
567 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
568 pPublicListener->OnPinchGestureStarted(*pPublicGestureDetector);
571 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
572 pPublicListener->OnPinchGestureChanged(*pPublicGestureDetector);
575 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
576 pPublicListener->OnPinchGestureFinished(*pPublicGestureDetector);
579 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
580 pPublicListener->OnPinchGestureCanceled(*pPublicGestureDetector);
581 gesture.SetToDefaultState();
591 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
593 ITouchFlickGestureEventListener* pPublicListener = dynamic_cast<ITouchFlickGestureEventListener*>(pListener);
594 TouchFlickGestureDetector* pPublicGestureDetector = dynamic_cast<TouchFlickGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
596 if (pPublicListener && pPublicGestureDetector)
598 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
600 pPublicListener->OnFlickGestureCanceled(*pPublicGestureDetector);
601 gesture.SetToDefaultState();
603 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
605 pPublicListener->OnFlickGestureDetected(*pPublicGestureDetector);
611 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
613 ITouchRotationGestureEventListener* pPublicListener = dynamic_cast<ITouchRotationGestureEventListener*>(pListener);
614 TouchRotationGestureDetector* pPublicGestureDetector = dynamic_cast<TouchRotationGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
616 if (pPublicListener && pPublicGestureDetector)
618 switch(gesture.GetDetectorState())
620 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
621 pPublicListener->OnRotationGestureStarted(*pPublicGestureDetector);
624 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
625 pPublicListener->OnRotationGestureChanged(*pPublicGestureDetector);
628 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
629 pPublicListener->OnRotationGestureFinished(*pPublicGestureDetector);
632 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
633 pPublicListener->OnRotationGestureCanceled(*pPublicGestureDetector);
634 gesture.SetToDefaultState();
644 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
646 ITouchPanningGestureEventListener* pPublicListener = dynamic_cast<ITouchPanningGestureEventListener*>(pListener);
647 TouchPanningGestureDetector* pPublicGestureDetector = dynamic_cast<TouchPanningGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
649 if (pPublicListener && pPublicGestureDetector)
651 switch(gesture.GetDetectorState())
653 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
654 pPublicListener->OnPanningGestureStarted(*pPublicGestureDetector);
657 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
658 pPublicListener->OnPanningGestureChanged(*pPublicGestureDetector);
661 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
662 pPublicListener->OnPanningGestureFinished(*pPublicGestureDetector);
665 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
666 pPublicListener->OnPanningGestureCanceled(*pPublicGestureDetector);
667 gesture.SetToDefaultState();
677 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
680 ITouchCustomGestureEventListener* pPublicListener = dynamic_cast<ITouchCustomGestureEventListener*>(pListener);
684 switch(gesture.GetDetectorState())
686 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
687 pPublicListener->OnCustomGestureStarted(pImpl->GetPublic());
690 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
691 pPublicListener->OnCustomGestureChanged(pImpl->GetPublic());
694 case _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS:
695 pPublicListener->OnCustomGestureFinished(pImpl->GetPublic());
698 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
699 pPublicListener->OnCustomGestureCanceled(pImpl->GetPublic());
700 gesture.SetToDefaultState();
715 _TouchGestureDetector::ProcessCoreListener(_TouchGestureDetector& gesture)
717 IListT <_ITouchGestureEventListener*>* pList = gesture.GetGestureListenerList();
723 IEnumeratorT<_ITouchGestureEventListener*>* pEnumerator = pList->GetEnumeratorN();
724 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
726 while(pEnumerator->MoveNext() == E_SUCCESS)
728 _ITouchGestureEventListener* pListener = null;
729 pEnumerator->GetCurrent(pListener);
731 if (pListener == null)
736 switch(gesture.GetDetectorType())
738 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
740 _ITouchTapGestureEventListener* pCoreListener = dynamic_cast<_ITouchTapGestureEventListener*>(pListener);
741 _TouchTapGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchTapGestureDetector*>(&gesture);
743 if (pCoreListener && pCoreGestureDetector)
745 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
747 pCoreListener->OnTapGestureCanceled(*pCoreGestureDetector);
748 pCoreGestureDetector->SetToDefaultState();
750 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
752 pCoreListener->OnTapGestureDetected(*pCoreGestureDetector);
758 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
760 _ITouchLongPressGestureEventListener* pCoreListener = dynamic_cast<_ITouchLongPressGestureEventListener*>(pListener);
761 _TouchLongPressGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchLongPressGestureDetector*>(&gesture);
763 if (pCoreListener && pCoreGestureDetector)
765 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
767 pCoreListener->OnLongPressGestureCanceled(*pCoreGestureDetector);
768 pCoreGestureDetector->SetToDefaultState();
770 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
772 pCoreListener->OnLongPressGestureDetected(*pCoreGestureDetector);
778 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
780 _ITouchPinchGestureEventListener* pCoreListener = dynamic_cast<_ITouchPinchGestureEventListener*>(pListener);
781 _TouchPinchGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchPinchGestureDetector*>(&gesture);
783 if (pCoreListener && pCoreGestureDetector)
785 switch(GetDetectorState())
787 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
788 pCoreListener->OnPinchGestureStarted(*pCoreGestureDetector);
791 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
792 pCoreListener->OnPinchGestureChanged(*pCoreGestureDetector);
795 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
796 pCoreListener->OnPinchGestureFinished(*pCoreGestureDetector);
799 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
800 pCoreListener->OnPinchGestureCanceled(*pCoreGestureDetector);
801 pCoreGestureDetector->SetToDefaultState();
811 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
813 _ITouchFlickGestureEventListener* pCoreListener = dynamic_cast<_ITouchFlickGestureEventListener*>(pListener);
814 _TouchFlickGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchFlickGestureDetector*>(&gesture);
816 if (pCoreListener && pCoreGestureDetector)
818 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
820 pCoreListener->OnFlickGestureCanceled(*pCoreGestureDetector);
821 pCoreGestureDetector->SetToDefaultState();
823 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
825 pCoreListener->OnFlickGestureDetected(*pCoreGestureDetector);
831 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
833 _ITouchRotationGestureEventListener* pCoreListener = dynamic_cast<_ITouchRotationGestureEventListener*>(pListener);
834 _TouchRotationGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchRotationGestureDetector*>(&gesture);
836 if (pCoreListener && pCoreGestureDetector)
838 switch(GetDetectorState())
840 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
841 pCoreListener->OnRotationGestureStarted(*pCoreGestureDetector);
844 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
845 pCoreListener->OnRotationGestureChanged(*pCoreGestureDetector);
848 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
849 pCoreListener->OnRotationGestureFinished(*pCoreGestureDetector);
852 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
853 pCoreListener->OnRotationGestureCanceled(*pCoreGestureDetector);
854 pCoreGestureDetector->SetToDefaultState();
864 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
866 _ITouchPanningGestureEventListener* pCoreListener = dynamic_cast<_ITouchPanningGestureEventListener*>(pListener);
867 _TouchPanningGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchPanningGestureDetector*>(&gesture);
869 if (pCoreListener && pCoreGestureDetector)
871 switch(GetDetectorState())
873 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
874 pCoreListener->OnPanningGestureStarted(*pCoreGestureDetector);
877 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
878 pCoreListener->OnPanningGestureChanged(*pCoreGestureDetector);
881 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
882 pCoreListener->OnPanningGestureFinished(*pCoreGestureDetector);
885 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
886 pCoreListener->OnPanningGestureCanceled(*pCoreGestureDetector);
887 pCoreGestureDetector->SetToDefaultState();
897 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
900 _ITouchCustomGestureEventListener* pCoreListener = dynamic_cast<_ITouchCustomGestureEventListener*>(pListener);
904 switch(GetDetectorState())
906 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
907 pCoreListener->OnCustomGestureStarted(gesture);
910 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
911 pCoreListener->OnCustomGestureChanged(gesture);
914 case _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS:
915 pCoreListener->OnCustomGestureFinished(gesture);
918 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
919 pCoreListener->OnCustomGestureCanceled(gesture);
920 gesture.SetToDefaultState();
935 _TouchGestureDetector::NotifyStateChanged(void)
937 _ControlManager* pControlManager = _ControlManager::GetInstance();
938 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
940 _Control* pControl = GetControl();
941 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_CONDITION, "[E_INVALID_CONDITION] invalid GestureDetectorControl()");
943 IListT<_TouchGestureDetector*>* pGestureList = pControlManager->GetGestureDetectorList();
944 if (!pGestureList || (pGestureList && pGestureList->GetCount() == 0))
946 pGestureList = pControl->GetGestureDetectorList();
951 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
954 while(pEnumerator->MoveNext() == E_SUCCESS)
956 _TouchGestureDetector* pGestureDetector = null;
957 pEnumerator->GetCurrent(pGestureDetector);
958 if (pGestureDetector == null || !pGestureDetector->ExistWaitingList())
963 IListT<_TouchGestureDetector*>* pWaitingList = pGestureDetector->GetWantToFailList();
966 IEnumeratorT<_TouchGestureDetector*>* pWaitingEnumerator = pWaitingList->GetEnumeratorN();
967 if (pWaitingEnumerator)
969 while(pWaitingEnumerator->MoveNext() == E_SUCCESS)
971 _TouchGestureDetector* pWaitingGestureDetector = null;
972 pWaitingEnumerator->GetCurrent(pWaitingGestureDetector);
973 if (pWaitingGestureDetector == null)
978 if (pWaitingGestureDetector == this)
980 pGestureDetector->OnGestureDetectorStateChanged(*this);
983 delete pWaitingEnumerator;
991 ProcessGestureCondition();
995 _TouchGestureDetector::ProcessGestureCondition(void)
997 _TouchManager* pTouchManager = _TouchManager::GetInstance();
998 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1000 _Control* pControl = GetControl();
1001 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_CONDITION, "[E_INVALID_CONDITION] invalid GestureDetectorControl()");
1003 //send delayed touch event when all gestures set delayed touch events decided its state(success or failed) and all failed.
1004 if (!pControl->IsDelayedTouchEventEnabled() && pControl->IsPossibleToSendDelayedTouchEvent() && !pControl->IsSentDelayedEvent())
1006 SendDelayedTouchEvent(pControl);
1009 if (pControl->IsCancelOnGestureSuccess())
1011 pTouchManager->SetTouchCancelOnGesture(true);
1012 pTouchManager->SetTouchCanceled(null);
1013 pTouchManager->SetTouchCanceledOnGestureSuccess(true);
1016 bool allDetected = true;
1017 IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = pControl->GetStartedGestureDetectorEnumeratorN();
1020 while(pMapEnumerator->MoveNext() == E_SUCCESS)
1022 _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
1023 pMapEnumerator->GetValue(state);
1025 if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED)
1027 allDetected = false;
1031 delete pMapEnumerator;
1036 pControl->ClearStartedGestureDetectorList();
1041 _TouchGestureDetector::SendDelayedTouchEvent(_Control* pControl)
1043 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1044 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1046 //send delayed event if all started gesture are failed.
1047 IListT<_TouchInfo*>* pList = pControl->GetTouchInfoList();
1050 IEnumeratorT<_TouchInfo*>* pEnumerator = pList->GetEnumeratorN();
1053 while(pEnumerator->MoveNext() == E_SUCCESS)
1055 _TouchInfo* pTouchInfo = null;
1056 pEnumerator->GetCurrent(pTouchInfo);
1057 if (pTouchInfo == null)
1062 pControl->SetSendingDelayedEvent(true);
1063 pTouchManager->SendEvent(pControl, *pTouchInfo);
1066 pControl->SetSendingDelayedEvent(false);
1067 pControl->SetSentDelayedEvent(true);
1072 IListT<_TouchGestureDetector*>*
1073 _TouchGestureDetector::GetCurrentWantToFailList(void) const
1075 return __pCurrentWantToFailList;
1079 _TouchGestureDetector::OnGestureDetectorStateChanged(const _TouchGestureDetector& gestureDetector)
1081 if (GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS_AND_WAIT)
1083 _TouchGestureDetectorState state = gestureDetector.GetDetectorState();
1084 if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
1086 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
1088 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
1090 IListT<_TouchGestureDetector*>* pWaitingList = GetCurrentWantToFailList();
1093 bool exist = pWaitingList->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
1096 _TouchGestureDetector* pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
1097 pWaitingList->Remove(pGestureDetector);
1100 _TouchGestureDetectorType type = GetDetectorType();
1101 if (type != _TOUCH_GESTURE_DETECTOR_TYPE_PINCH && type != _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION && type != _TOUCH_GESTURE_DETECTOR_TYPE_PANNING)
1103 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
1107 else if (GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_READY)
1109 _TouchGestureDetectorState state = gestureDetector.GetDetectorState();
1111 if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
1113 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
1115 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
1117 IListT<_TouchGestureDetector*>* pWaitingList = GetCurrentWantToFailList();
1120 bool exist = pWaitingList->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
1123 _TouchGestureDetector* pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
1124 pWaitingList->Remove(pGestureDetector);
1132 _TouchGestureDetector::SetGestureStart(bool start)
1134 __isDetectionStarted = start;
1138 _Control* pControl = GetControl();
1141 pControl->AddStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_STARTED);
1147 _TouchGestureDetector::IsGestureStarted(void) const
1149 return __isDetectionStarted;
1153 _TouchGestureDetector::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1159 _TouchGestureDetector::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1165 _TouchGestureDetector::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1171 _TouchGestureDetector::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1177 _TouchGestureDetector::OnTouchGestureDetectorAdded(void)
1182 _TouchGestureDetector::OnTouchGestureDetectorRemoved(void)