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, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
75 __pWantToFailList = new (std::nothrow) LinkedListT<_TouchGestureDetector*>;
76 SysTryCatch(NID_UI, __pWantToFailList, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
78 __pCurrentWantToFailList = new (std::nothrow) LinkedListT<_TouchGestureDetector*>;
79 SysTryCatch(NID_UI, __pCurrentWantToFailList, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
86 if (__pEventListenerList)
88 delete __pEventListenerList;
89 __pEventListenerList = null;
92 if (__pWantToFailList)
94 delete __pWantToFailList;
95 __pWantToFailList = null;
98 if (__pCurrentWantToFailList)
100 delete __pCurrentWantToFailList;
101 __pCurrentWantToFailList = null;
105 _TouchGestureDetector::~_TouchGestureDetector(void)
107 delete __pEventListenerList;
108 __pEventListenerList = null;
110 delete __pWantToFailList;
111 __pWantToFailList = null;
113 delete __pCurrentWantToFailList;
114 __pCurrentWantToFailList = null;
120 _TouchGestureDetector::AddGestureListener(const _ITouchGestureEventListener& listener)
122 bool exist = __pEventListenerList->Contains(const_cast <_ITouchGestureEventListener*>(&listener));
125 SysTryReturnResult(NID_UI,
126 __pEventListenerList->Add(const_cast <_ITouchGestureEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
127 "System error occurred.");
134 _TouchGestureDetector::RemoveGestureListener(const _ITouchGestureEventListener& listener)
136 if (__pEventListenerList->GetCount() == 0)
138 return E_INVALID_CONDITION;
141 SysTryReturnResult(NID_UI,
142 __pEventListenerList->Remove(const_cast <_ITouchGestureEventListener*>(&listener)) == E_SUCCESS, E_SYSTEM,
143 "System error occurred.");
148 IListT <_ITouchGestureEventListener*>*
149 _TouchGestureDetector::GetGestureListenerList(void) const
151 return __pEventListenerList;
155 _TouchGestureDetector::SetDelegate(const _ITouchGestureDelegate& delegator)
157 __pDelegator = const_cast<_ITouchGestureDelegate*>(&delegator);
160 _ITouchGestureDelegate*
161 _TouchGestureDetector::GetDelegate(void) const
167 _TouchGestureDetector::SetControl(const _Control& control)
169 __gestureContol = control.GetHandle();
175 _TouchGestureDetector::GetControl(void) const
177 _ControlManager* pControlManager = _ControlManager::GetInstance();
178 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
180 return pControlManager->GetObject(__gestureContol);
183 _TouchGestureDetectorState
184 _TouchGestureDetector::GetDetectorState(void) const
186 return __currentState;
190 _TouchGestureDetector::SetDetectorType(_TouchGestureDetectorType type)
195 _TouchGestureDetectorType
196 _TouchGestureDetector::GetDetectorType(void) const
202 _TouchGestureDetector::SetDelayTouchEventEnabled(bool enabled)
204 __isTouchEventDelayed = enabled;
208 _TouchGestureDetector::IsDelayTouchEventEnabled(void) const
210 return __isTouchEventDelayed;
214 _TouchGestureDetector::SetCancelTouchEventOnSuccessEnabled(bool enabled)
216 __isTouchCanceledOnSuccess = enabled;
220 _TouchGestureDetector::IsCancelTouchEventOnSuccessEnabled(void) const
222 return __isTouchCanceledOnSuccess;
226 _TouchGestureDetector::SetUserData(void* pUserData)
228 __pUserData = pUserData;
232 _TouchGestureDetector::GetUserData(void) const
238 _TouchGestureDetector::ExistWaitingList(void) const
242 if (__pCurrentWantToFailList && (__pCurrentWantToFailList->GetCount() > 0))
251 _TouchGestureDetector::StartOnFailureOf(const _TouchGestureDetector& gesture)
253 SysTryReturnResult(NID_UI, IsPossibleToAddFailList(gesture), E_SYSTEM, "param gesture also waits you to fail.");
255 _TouchGestureDetector* pGesture = const_cast < _TouchGestureDetector* >(&gesture);
256 bool exist = __pWantToFailList->Contains(pGesture);
259 SysTryReturnResult(NID_UI, __pWantToFailList->Add(pGesture) == E_SUCCESS,
260 E_SYSTEM, "System error occurred.");
267 _TouchGestureDetector::IsPossibleToAddFailList(const _TouchGestureDetector& gesture)
269 IListT<_TouchGestureDetector*>* pList = gesture.GetWantToFailList();
275 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
278 while(pEnumerator->MoveNext() == E_SUCCESS)
280 _TouchGestureDetector* pGesture = null;
281 pEnumerator->GetCurrent(pGesture);
282 if (pGesture == null)
287 if (pGesture == this)
299 _TouchGestureDetector::SetDetectorState(_TouchGestureDetectorState state)
301 __currentState = state;
303 if (state == _TOUCH_GESTURE_DETECTOR_STATE_READY)
305 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = __pWantToFailList->GetEnumeratorN();
309 while(pEnumerator->MoveNext() == E_SUCCESS)
311 _TouchGestureDetector* pGesture = null;
312 pEnumerator->GetCurrent(pGesture);
313 if (pGesture == null)
318 bool exist = __pCurrentWantToFailList->Contains(pGesture);
321 __pCurrentWantToFailList->Add(pGesture);
328 if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED || state == _TOUCH_GESTURE_DETECTOR_STATE_CHANGED || state == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED)
330 if (ExistWaitingList())
332 __isDetectionStarted = true;
333 __currentState = _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS_AND_WAIT;
337 _Control* pControl = GetControl();
340 IListT <_TouchGestureDetector*>* pList = pControl->GetStartedGestureDetectorListN();
343 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
346 while(pEnumerator->MoveNext() == E_SUCCESS)
348 _TouchGestureDetector* pStartedGestureDetector = null;
349 pEnumerator->GetCurrent(pStartedGestureDetector);
350 if (pStartedGestureDetector && (pStartedGestureDetector == this))
352 _TouchGestureDetectorEventType eventType = pStartedGestureDetector->GetGestureDetectorEventType();
353 if (eventType == _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_DISCRETE ||
354 (eventType == _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_CONTINUOUS && state == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED))
356 pControl->SetStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
366 ProcessPublicListener(*this);
367 ProcessCoreListener(*this);
368 NotifyStateChanged();
370 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
372 _Control* pControl = GetControl();
375 IListT <_TouchGestureDetector*>* pList = pControl->GetStartedGestureDetectorListN();
378 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
381 while(pEnumerator->MoveNext() == E_SUCCESS)
383 _TouchGestureDetector* pStartedGestureDetector = null;
384 pEnumerator->GetCurrent(pStartedGestureDetector);
385 if (pStartedGestureDetector && (pStartedGestureDetector == this))
387 pControl->SetStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_FAILED);
396 NotifyStateChanged();
398 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
400 if (!IsGestureStarted())
405 SetGestureStart(false);
408 _TouchGestureDetectorState currentState = GetDetectorState();
409 if (( !__isDetectionStarted && currentState == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED) || currentState == _TOUCH_GESTURE_DETECTOR_STATE_FAILED || currentState == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
416 _TouchGestureDetector::SetToDefaultState(void)
418 __pCurrentWantToFailList->RemoveAll();
419 __isDetectionStarted = false;
420 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_READY);
423 _TouchGestureDetectorEventType
424 _TouchGestureDetector::GetGestureDetectorEventType(void)
426 _TouchGestureDetectorType type = GetDetectorType();
428 if (type == _TOUCH_GESTURE_DETECTOR_TYPE_PINCH ||type == _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM
429 ||type == _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION || type == _TOUCH_GESTURE_DETECTOR_TYPE_PANNING)
431 return _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_CONTINUOUS;
435 return _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_DISCRETE;
440 _TouchGestureDetector::GetDescription(void)
444 switch (GetDetectorType())
446 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
447 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM";
450 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
451 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_TAP";
454 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
455 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS";
458 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
459 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_PINCH";
462 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
463 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_FLICK";
466 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
467 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_ROTATION";
470 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
471 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_PANNING";
478 String description(L"");
480 description.Format(LOG_LEN_MAX, L"%ls state(%d) delay(%d) cancelonSuccess(%d)",
481 type.GetPointer(), GetDetectorState(),
482 IsDelayTouchEventEnabled(), IsCancelTouchEventOnSuccessEnabled());
487 IListT <_TouchGestureDetector*>*
488 _TouchGestureDetector::GetWantToFailList(void) const
490 return __pWantToFailList;
494 _TouchGestureDetector::ProcessPublicListener(_TouchGestureDetector& gesture)
496 _TouchGestureDetectorImpl* pImpl = static_cast<_TouchGestureDetectorImpl*>(gesture.GetUserData());
502 IListT<ITouchGestureEventListener*>* pPublicList = pImpl->GetGestureEventListenerList();
508 IEnumeratorT<ITouchGestureEventListener*>* pEnumerator = pPublicList->GetEnumeratorN();
509 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
511 while(pEnumerator->MoveNext() == E_SUCCESS)
513 ITouchGestureEventListener* pListener = null;
514 pEnumerator->GetCurrent(pListener);
516 if (pListener == null)
521 switch(gesture.GetDetectorType())
523 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
525 ITouchTapGestureEventListener* pPublicListener = dynamic_cast<ITouchTapGestureEventListener*>(pListener);
526 TouchTapGestureDetector* pPublicGestureDetector = dynamic_cast<TouchTapGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
528 if (pPublicListener && pPublicGestureDetector)
530 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
532 pPublicListener->OnTapGestureCanceled(*pPublicGestureDetector);
533 gesture.SetToDefaultState();
535 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
537 pPublicListener->OnTapGestureDetected(*pPublicGestureDetector);
543 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
545 ITouchLongPressGestureEventListener* pPublicListener = dynamic_cast<ITouchLongPressGestureEventListener*>(pListener);
546 TouchLongPressGestureDetector* pPublicGestureDetector = dynamic_cast<TouchLongPressGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
548 if (pPublicListener && pPublicGestureDetector)
550 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
552 pPublicListener->OnLongPressGestureCanceled(*pPublicGestureDetector);
553 gesture.SetToDefaultState();
555 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
557 pPublicListener->OnLongPressGestureDetected(*pPublicGestureDetector);
563 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
565 ITouchPinchGestureEventListener* pPublicListener = dynamic_cast<ITouchPinchGestureEventListener*>(pListener);
566 TouchPinchGestureDetector* pPublicGestureDetector = dynamic_cast<TouchPinchGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
568 if (pPublicListener && pPublicGestureDetector)
570 switch(gesture.GetDetectorState())
572 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
573 pPublicListener->OnPinchGestureStarted(*pPublicGestureDetector);
576 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
577 pPublicListener->OnPinchGestureChanged(*pPublicGestureDetector);
580 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
581 pPublicListener->OnPinchGestureFinished(*pPublicGestureDetector);
584 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
585 pPublicListener->OnPinchGestureCanceled(*pPublicGestureDetector);
586 gesture.SetToDefaultState();
596 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
598 ITouchFlickGestureEventListener* pPublicListener = dynamic_cast<ITouchFlickGestureEventListener*>(pListener);
599 TouchFlickGestureDetector* pPublicGestureDetector = dynamic_cast<TouchFlickGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
601 if (pPublicListener && pPublicGestureDetector)
603 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
605 pPublicListener->OnFlickGestureCanceled(*pPublicGestureDetector);
606 gesture.SetToDefaultState();
608 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
610 pPublicListener->OnFlickGestureDetected(*pPublicGestureDetector);
616 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
618 ITouchRotationGestureEventListener* pPublicListener = dynamic_cast<ITouchRotationGestureEventListener*>(pListener);
619 TouchRotationGestureDetector* pPublicGestureDetector = dynamic_cast<TouchRotationGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
621 if (pPublicListener && pPublicGestureDetector)
623 switch(gesture.GetDetectorState())
625 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
626 pPublicListener->OnRotationGestureStarted(*pPublicGestureDetector);
629 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
630 pPublicListener->OnRotationGestureChanged(*pPublicGestureDetector);
633 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
634 pPublicListener->OnRotationGestureFinished(*pPublicGestureDetector);
637 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
638 pPublicListener->OnRotationGestureCanceled(*pPublicGestureDetector);
639 gesture.SetToDefaultState();
649 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
651 ITouchPanningGestureEventListener* pPublicListener = dynamic_cast<ITouchPanningGestureEventListener*>(pListener);
652 TouchPanningGestureDetector* pPublicGestureDetector = dynamic_cast<TouchPanningGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
654 if (pPublicListener && pPublicGestureDetector)
656 switch(gesture.GetDetectorState())
658 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
659 pPublicListener->OnPanningGestureStarted(*pPublicGestureDetector);
662 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
663 pPublicListener->OnPanningGestureChanged(*pPublicGestureDetector);
666 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
667 pPublicListener->OnPanningGestureFinished(*pPublicGestureDetector);
670 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
671 pPublicListener->OnPanningGestureCanceled(*pPublicGestureDetector);
672 gesture.SetToDefaultState();
682 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
685 ITouchCustomGestureEventListener* pPublicListener = dynamic_cast<ITouchCustomGestureEventListener*>(pListener);
689 switch(gesture.GetDetectorState())
691 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
692 pPublicListener->OnCustomGestureStarted(pImpl->GetPublic());
695 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
696 pPublicListener->OnCustomGestureChanged(pImpl->GetPublic());
699 case _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS:
700 pPublicListener->OnCustomGestureFinished(pImpl->GetPublic());
703 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
704 pPublicListener->OnCustomGestureCanceled(pImpl->GetPublic());
705 gesture.SetToDefaultState();
720 _TouchGestureDetector::ProcessCoreListener(_TouchGestureDetector& gesture)
722 IListT <_ITouchGestureEventListener*>* pList = gesture.GetGestureListenerList();
728 IEnumeratorT<_ITouchGestureEventListener*>* pEnumerator = pList->GetEnumeratorN();
729 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
731 while(pEnumerator->MoveNext() == E_SUCCESS)
733 _ITouchGestureEventListener* pListener = null;
734 pEnumerator->GetCurrent(pListener);
736 if (pListener == null)
741 switch(gesture.GetDetectorType())
743 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
745 _ITouchTapGestureEventListener* pCoreListener = dynamic_cast<_ITouchTapGestureEventListener*>(pListener);
746 _TouchTapGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchTapGestureDetector*>(&gesture);
748 if (pCoreListener && pCoreGestureDetector)
750 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
752 pCoreListener->OnTapGestureCanceled(*pCoreGestureDetector);
753 pCoreGestureDetector->SetToDefaultState();
755 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
757 pCoreListener->OnTapGestureDetected(*pCoreGestureDetector);
763 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
765 _ITouchLongPressGestureEventListener* pCoreListener = dynamic_cast<_ITouchLongPressGestureEventListener*>(pListener);
766 _TouchLongPressGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchLongPressGestureDetector*>(&gesture);
768 if (pCoreListener && pCoreGestureDetector)
770 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
772 pCoreListener->OnLongPressGestureCanceled(*pCoreGestureDetector);
773 pCoreGestureDetector->SetToDefaultState();
775 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
777 pCoreListener->OnLongPressGestureDetected(*pCoreGestureDetector);
783 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
785 _ITouchPinchGestureEventListener* pCoreListener = dynamic_cast<_ITouchPinchGestureEventListener*>(pListener);
786 _TouchPinchGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchPinchGestureDetector*>(&gesture);
788 if (pCoreListener && pCoreGestureDetector)
790 switch(GetDetectorState())
792 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
793 pCoreListener->OnPinchGestureStarted(*pCoreGestureDetector);
796 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
797 pCoreListener->OnPinchGestureChanged(*pCoreGestureDetector);
800 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
801 pCoreListener->OnPinchGestureFinished(*pCoreGestureDetector);
804 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
805 pCoreListener->OnPinchGestureCanceled(*pCoreGestureDetector);
806 pCoreGestureDetector->SetToDefaultState();
816 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
818 _ITouchFlickGestureEventListener* pCoreListener = dynamic_cast<_ITouchFlickGestureEventListener*>(pListener);
819 _TouchFlickGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchFlickGestureDetector*>(&gesture);
821 if (pCoreListener && pCoreGestureDetector)
823 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
825 pCoreListener->OnFlickGestureCanceled(*pCoreGestureDetector);
826 pCoreGestureDetector->SetToDefaultState();
828 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
830 pCoreListener->OnFlickGestureDetected(*pCoreGestureDetector);
836 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
838 _ITouchRotationGestureEventListener* pCoreListener = dynamic_cast<_ITouchRotationGestureEventListener*>(pListener);
839 _TouchRotationGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchRotationGestureDetector*>(&gesture);
841 if (pCoreListener && pCoreGestureDetector)
843 switch(GetDetectorState())
845 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
846 pCoreListener->OnRotationGestureStarted(*pCoreGestureDetector);
849 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
850 pCoreListener->OnRotationGestureChanged(*pCoreGestureDetector);
853 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
854 pCoreListener->OnRotationGestureFinished(*pCoreGestureDetector);
857 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
858 pCoreListener->OnRotationGestureCanceled(*pCoreGestureDetector);
859 pCoreGestureDetector->SetToDefaultState();
869 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
871 _ITouchPanningGestureEventListener* pCoreListener = dynamic_cast<_ITouchPanningGestureEventListener*>(pListener);
872 _TouchPanningGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchPanningGestureDetector*>(&gesture);
874 if (pCoreListener && pCoreGestureDetector)
876 switch(GetDetectorState())
878 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
879 pCoreListener->OnPanningGestureStarted(*pCoreGestureDetector);
882 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
883 pCoreListener->OnPanningGestureChanged(*pCoreGestureDetector);
886 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
887 pCoreListener->OnPanningGestureFinished(*pCoreGestureDetector);
890 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
891 pCoreListener->OnPanningGestureCanceled(*pCoreGestureDetector);
892 pCoreGestureDetector->SetToDefaultState();
902 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
905 _ITouchCustomGestureEventListener* pCoreListener = dynamic_cast<_ITouchCustomGestureEventListener*>(pListener);
909 switch(GetDetectorState())
911 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
912 pCoreListener->OnCustomGestureStarted(gesture);
915 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
916 pCoreListener->OnCustomGestureChanged(gesture);
919 case _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS:
920 pCoreListener->OnCustomGestureFinished(gesture);
923 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
924 pCoreListener->OnCustomGestureCanceled(gesture);
925 gesture.SetToDefaultState();
940 _TouchGestureDetector::NotifyStateChanged(void)
942 _ControlManager* pControlManager = _ControlManager::GetInstance();
943 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
945 _Control* pControl = GetControl();
946 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_CONDITION, "[E_INVALID_CONDITION] invalid GestureDetectorControl()");
948 IListT<_TouchGestureDetector*>* pGestureList = pControlManager->GetGestureDetectorList();
949 if (!pGestureList || (pGestureList && pGestureList->GetCount() == 0))
951 pGestureList = pControl->GetGestureDetectorList();
956 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
959 while(pEnumerator->MoveNext() == E_SUCCESS)
961 _TouchGestureDetector* pGestureDetector = null;
962 pEnumerator->GetCurrent(pGestureDetector);
963 if (pGestureDetector == null || !pGestureDetector->ExistWaitingList())
968 IListT<_TouchGestureDetector*>* pWaitingList = pGestureDetector->GetWantToFailList();
971 IEnumeratorT<_TouchGestureDetector*>* pWaitingEnumerator = pWaitingList->GetEnumeratorN();
972 if (pWaitingEnumerator)
974 while(pWaitingEnumerator->MoveNext() == E_SUCCESS)
976 _TouchGestureDetector* pWaitingGestureDetector = null;
977 pWaitingEnumerator->GetCurrent(pWaitingGestureDetector);
978 if (pWaitingGestureDetector == null)
983 if (pWaitingGestureDetector == this)
985 pGestureDetector->OnGestureDetectorStateChanged(*this);
988 delete pWaitingEnumerator;
996 ProcessGestureCondition();
1000 _TouchGestureDetector::ProcessGestureCondition(void)
1002 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1003 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1005 _Control* pControl = GetControl();
1006 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_CONDITION, "[E_INVALID_CONDITION] invalid GestureDetectorControl()");
1008 //send delayed touch event when all gestures set delayed touch events decided its state(success or failed) and all failed.
1009 if (!pControl->IsDelayedTouchEventEnabled() && pControl->IsPossibleToSendDelayedTouchEvent() && !pControl->IsSentDelayedEvent())
1011 SendDelayedTouchEvent(pControl);
1014 if (pControl->IsCancelOnGestureSuccess())
1016 pTouchManager->SetTouchCancelOnGesture(true);
1017 pTouchManager->SetTouchCanceled(null);
1018 pTouchManager->SetTouchCanceledOnGestureSuccess(true);
1021 bool allDetected = true;
1022 IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = pControl->GetStartedGestureDetectorEnumeratorN();
1025 while(pMapEnumerator->MoveNext() == E_SUCCESS)
1027 _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
1028 pMapEnumerator->GetValue(state);
1030 if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED)
1032 allDetected = false;
1036 delete pMapEnumerator;
1041 pControl->ClearStartedGestureDetectorList();
1046 _TouchGestureDetector::SendDelayedTouchEvent(_Control* pControl)
1048 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1049 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1051 //send delayed event if all started gesture are failed.
1052 IListT<_TouchInfo*>* pList = pControl->GetTouchInfoList();
1055 IEnumeratorT<_TouchInfo*>* pEnumerator = pList->GetEnumeratorN();
1058 while(pEnumerator->MoveNext() == E_SUCCESS)
1060 _TouchInfo* pTouchInfo = null;
1061 pEnumerator->GetCurrent(pTouchInfo);
1062 if (pTouchInfo == null)
1067 pControl->SetSendingDelayedEvent(true);
1068 pTouchManager->SendEvent(pControl, *pTouchInfo);
1071 pControl->SetSendingDelayedEvent(false);
1072 pControl->SetSentDelayedEvent(true);
1077 IListT<_TouchGestureDetector*>*
1078 _TouchGestureDetector::GetCurrentWantToFailList(void) const
1080 return __pCurrentWantToFailList;
1084 _TouchGestureDetector::OnGestureDetectorStateChanged(const _TouchGestureDetector& gestureDetector)
1086 if (GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS_AND_WAIT)
1088 _TouchGestureDetectorState state = gestureDetector.GetDetectorState();
1089 if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
1091 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
1093 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
1095 IListT<_TouchGestureDetector*>* pWaitingList = GetCurrentWantToFailList();
1098 bool exist = pWaitingList->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
1101 _TouchGestureDetector* pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
1102 pWaitingList->Remove(pGestureDetector);
1105 _TouchGestureDetectorType type = GetDetectorType();
1106 if (type != _TOUCH_GESTURE_DETECTOR_TYPE_PINCH && type != _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION && type != _TOUCH_GESTURE_DETECTOR_TYPE_PANNING)
1108 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
1112 else if (GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_READY)
1114 _TouchGestureDetectorState state = gestureDetector.GetDetectorState();
1116 if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
1118 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
1120 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
1122 IListT<_TouchGestureDetector*>* pWaitingList = GetCurrentWantToFailList();
1125 bool exist = pWaitingList->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
1128 _TouchGestureDetector* pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
1129 pWaitingList->Remove(pGestureDetector);
1137 _TouchGestureDetector::SetGestureStart(bool start)
1139 __isDetectionStarted = start;
1143 _Control* pControl = GetControl();
1146 pControl->AddStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_STARTED);
1152 _TouchGestureDetector::IsGestureStarted(void) const
1154 return __isDetectionStarted;
1158 _TouchGestureDetector::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1164 _TouchGestureDetector::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1170 _TouchGestureDetector::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1176 _TouchGestureDetector::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1182 _TouchGestureDetector::OnTouchGestureDetectorAdded(void)
1187 _TouchGestureDetector::OnTouchGestureDetectorRemoved(void)