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 IListT <_TouchGestureDetector*>* pList = pControl->GetStartedGestureDetectorListN();
346 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
349 while(pEnumerator->MoveNext() == E_SUCCESS)
351 _TouchGestureDetector* pStartedGestureDetector = null;
352 pEnumerator->GetCurrent(pStartedGestureDetector);
353 if (pStartedGestureDetector && (pStartedGestureDetector == this))
355 _TouchGestureDetectorEventType eventType = pStartedGestureDetector->GetGestureDetectorEventType();
356 if (eventType == _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_DISCRETE ||
357 (eventType == _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_CONTINUOUS && state == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED))
359 pControl->SetStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
369 ProcessPublicListener(*this);
370 ProcessCoreListener(*this);
371 NotifyStateChanged();
373 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
375 _Control* pControl = GetControl();
378 IListT <_TouchGestureDetector*>* pList = pControl->GetStartedGestureDetectorListN();
381 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pList->GetEnumeratorN();
384 while(pEnumerator->MoveNext() == E_SUCCESS)
386 _TouchGestureDetector* pStartedGestureDetector = null;
387 pEnumerator->GetCurrent(pStartedGestureDetector);
388 if (pStartedGestureDetector && (pStartedGestureDetector == this))
390 pControl->SetStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_FAILED);
399 NotifyStateChanged();
401 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
403 if (!IsGestureStarted())
408 SetGestureStart(false);
411 _TouchGestureDetectorState currentState = GetDetectorState();
412 if (( !__isDetectionStarted && currentState == _TOUCH_GESTURE_DETECTOR_STATE_FINISHED) || currentState == _TOUCH_GESTURE_DETECTOR_STATE_FAILED || currentState == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
419 _TouchGestureDetector::SetToDefaultState(void)
421 __pCurrentWantToFailList->RemoveAll();
422 __isDetectionStarted = false;
423 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_READY);
426 _TouchGestureDetectorEventType
427 _TouchGestureDetector::GetGestureDetectorEventType(void)
429 _TouchGestureDetectorType type = GetDetectorType();
431 if (type == _TOUCH_GESTURE_DETECTOR_TYPE_PINCH ||type == _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM
432 ||type == _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION || type == _TOUCH_GESTURE_DETECTOR_TYPE_PANNING)
434 return _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_CONTINUOUS;
438 return _TOUCH_GESTURE_DETECTOR_EVENT_TYPE_DISCRETE;
443 _TouchGestureDetector::GetDescription(void)
447 switch (GetDetectorType())
449 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
450 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM";
453 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
454 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_TAP";
457 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
458 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS";
461 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
462 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_PINCH";
465 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
466 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_FLICK";
469 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
470 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_ROTATION";
473 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
474 type = L"_TOUCH_GESTURE_DETECTOR_TYPE_PANNING";
481 String description(L"");
483 description.Format(LOG_LEN_MAX, L"%ls state(%d) delay(%d) cancelonSuccess(%d)",
484 type.GetPointer(), GetDetectorState(),
485 IsDelayTouchEventEnabled(), IsCancelTouchEventOnSuccessEnabled());
490 IListT <_TouchGestureDetector*>*
491 _TouchGestureDetector::GetWantToFailList(void) const
493 return __pWantToFailList;
497 _TouchGestureDetector::ProcessPublicListener(_TouchGestureDetector& gesture)
499 _TouchGestureDetectorImpl* pImpl = static_cast<_TouchGestureDetectorImpl*>(gesture.GetUserData());
505 IListT<ITouchGestureEventListener*>* pPublicList = pImpl->GetGestureEventListenerList();
511 IEnumeratorT<ITouchGestureEventListener*>* pEnumerator = pPublicList->GetEnumeratorN();
512 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
514 while(pEnumerator->MoveNext() == E_SUCCESS)
516 ITouchGestureEventListener* pListener = null;
517 pEnumerator->GetCurrent(pListener);
519 if (pListener == null)
524 switch(gesture.GetDetectorType())
526 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
528 ITouchTapGestureEventListener* pPublicListener = dynamic_cast<ITouchTapGestureEventListener*>(pListener);
529 TouchTapGestureDetector* pPublicGestureDetector = dynamic_cast<TouchTapGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
531 if (pPublicListener && pPublicGestureDetector)
533 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
535 pPublicListener->OnTapGestureCanceled(*pPublicGestureDetector);
536 gesture.SetToDefaultState();
538 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
540 pPublicListener->OnTapGestureDetected(*pPublicGestureDetector);
546 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
548 ITouchLongPressGestureEventListener* pPublicListener = dynamic_cast<ITouchLongPressGestureEventListener*>(pListener);
549 TouchLongPressGestureDetector* pPublicGestureDetector = dynamic_cast<TouchLongPressGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
551 if (pPublicListener && pPublicGestureDetector)
553 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
555 pPublicListener->OnLongPressGestureCanceled(*pPublicGestureDetector);
556 gesture.SetToDefaultState();
558 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
560 pPublicListener->OnLongPressGestureDetected(*pPublicGestureDetector);
566 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
568 ITouchPinchGestureEventListener* pPublicListener = dynamic_cast<ITouchPinchGestureEventListener*>(pListener);
569 TouchPinchGestureDetector* pPublicGestureDetector = dynamic_cast<TouchPinchGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
571 if (pPublicListener && pPublicGestureDetector)
573 switch(gesture.GetDetectorState())
575 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
576 pPublicListener->OnPinchGestureStarted(*pPublicGestureDetector);
579 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
580 pPublicListener->OnPinchGestureChanged(*pPublicGestureDetector);
583 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
584 pPublicListener->OnPinchGestureFinished(*pPublicGestureDetector);
587 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
588 pPublicListener->OnPinchGestureCanceled(*pPublicGestureDetector);
589 gesture.SetToDefaultState();
599 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
601 ITouchFlickGestureEventListener* pPublicListener = dynamic_cast<ITouchFlickGestureEventListener*>(pListener);
602 TouchFlickGestureDetector* pPublicGestureDetector = dynamic_cast<TouchFlickGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
604 if (pPublicListener && pPublicGestureDetector)
606 if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
608 pPublicListener->OnFlickGestureCanceled(*pPublicGestureDetector);
609 gesture.SetToDefaultState();
611 else if (gesture.GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
613 pPublicListener->OnFlickGestureDetected(*pPublicGestureDetector);
619 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
621 ITouchRotationGestureEventListener* pPublicListener = dynamic_cast<ITouchRotationGestureEventListener*>(pListener);
622 TouchRotationGestureDetector* pPublicGestureDetector = dynamic_cast<TouchRotationGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
624 if (pPublicListener && pPublicGestureDetector)
626 switch(gesture.GetDetectorState())
628 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
629 pPublicListener->OnRotationGestureStarted(*pPublicGestureDetector);
632 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
633 pPublicListener->OnRotationGestureChanged(*pPublicGestureDetector);
636 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
637 pPublicListener->OnRotationGestureFinished(*pPublicGestureDetector);
640 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
641 pPublicListener->OnRotationGestureCanceled(*pPublicGestureDetector);
642 gesture.SetToDefaultState();
652 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
654 ITouchPanningGestureEventListener* pPublicListener = dynamic_cast<ITouchPanningGestureEventListener*>(pListener);
655 TouchPanningGestureDetector* pPublicGestureDetector = dynamic_cast<TouchPanningGestureDetector*>(dynamic_cast<TouchGestureDetector*>(&pImpl->GetPublic()));
657 if (pPublicListener && pPublicGestureDetector)
659 switch(gesture.GetDetectorState())
661 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
662 pPublicListener->OnPanningGestureStarted(*pPublicGestureDetector);
665 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
666 pPublicListener->OnPanningGestureChanged(*pPublicGestureDetector);
669 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
670 pPublicListener->OnPanningGestureFinished(*pPublicGestureDetector);
673 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
674 pPublicListener->OnPanningGestureCanceled(*pPublicGestureDetector);
675 gesture.SetToDefaultState();
685 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
688 ITouchCustomGestureEventListener* pPublicListener = dynamic_cast<ITouchCustomGestureEventListener*>(pListener);
692 switch(gesture.GetDetectorState())
694 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
695 pPublicListener->OnCustomGestureStarted(pImpl->GetPublic());
698 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
699 pPublicListener->OnCustomGestureChanged(pImpl->GetPublic());
702 case _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS:
703 pPublicListener->OnCustomGestureFinished(pImpl->GetPublic());
706 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
707 pPublicListener->OnCustomGestureCanceled(pImpl->GetPublic());
708 gesture.SetToDefaultState();
723 _TouchGestureDetector::ProcessCoreListener(_TouchGestureDetector& gesture)
725 IListT <_ITouchGestureEventListener*>* pList = gesture.GetGestureListenerList();
731 IEnumeratorT<_ITouchGestureEventListener*>* pEnumerator = pList->GetEnumeratorN();
732 SysTryReturnVoidResult(NID_UI, pEnumerator, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
734 while(pEnumerator->MoveNext() == E_SUCCESS)
736 _ITouchGestureEventListener* pListener = null;
737 pEnumerator->GetCurrent(pListener);
739 if (pListener == null)
744 switch(gesture.GetDetectorType())
746 case _TOUCH_GESTURE_DETECTOR_TYPE_TAP:
748 _ITouchTapGestureEventListener* pCoreListener = dynamic_cast<_ITouchTapGestureEventListener*>(pListener);
749 _TouchTapGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchTapGestureDetector*>(&gesture);
751 if (pCoreListener && pCoreGestureDetector)
753 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
755 pCoreListener->OnTapGestureCanceled(*pCoreGestureDetector);
756 pCoreGestureDetector->SetToDefaultState();
758 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
760 pCoreListener->OnTapGestureDetected(*pCoreGestureDetector);
766 case _TOUCH_GESTURE_DETECTOR_TYPE_LONG_PRESS:
768 _ITouchLongPressGestureEventListener* pCoreListener = dynamic_cast<_ITouchLongPressGestureEventListener*>(pListener);
769 _TouchLongPressGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchLongPressGestureDetector*>(&gesture);
771 if (pCoreListener && pCoreGestureDetector)
773 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
775 pCoreListener->OnLongPressGestureCanceled(*pCoreGestureDetector);
776 pCoreGestureDetector->SetToDefaultState();
778 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
780 pCoreListener->OnLongPressGestureDetected(*pCoreGestureDetector);
786 case _TOUCH_GESTURE_DETECTOR_TYPE_PINCH:
788 _ITouchPinchGestureEventListener* pCoreListener = dynamic_cast<_ITouchPinchGestureEventListener*>(pListener);
789 _TouchPinchGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchPinchGestureDetector*>(&gesture);
791 if (pCoreListener && pCoreGestureDetector)
793 switch(GetDetectorState())
795 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
796 pCoreListener->OnPinchGestureStarted(*pCoreGestureDetector);
799 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
800 pCoreListener->OnPinchGestureChanged(*pCoreGestureDetector);
803 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
804 pCoreListener->OnPinchGestureFinished(*pCoreGestureDetector);
807 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
808 pCoreListener->OnPinchGestureCanceled(*pCoreGestureDetector);
809 pCoreGestureDetector->SetToDefaultState();
819 case _TOUCH_GESTURE_DETECTOR_TYPE_FLICK:
821 _ITouchFlickGestureEventListener* pCoreListener = dynamic_cast<_ITouchFlickGestureEventListener*>(pListener);
822 _TouchFlickGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchFlickGestureDetector*>(&gesture);
824 if (pCoreListener && pCoreGestureDetector)
826 if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_CANCELED)
828 pCoreListener->OnFlickGestureCanceled(*pCoreGestureDetector);
829 pCoreGestureDetector->SetToDefaultState();
831 else if (pCoreGestureDetector->GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
833 pCoreListener->OnFlickGestureDetected(*pCoreGestureDetector);
839 case _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION:
841 _ITouchRotationGestureEventListener* pCoreListener = dynamic_cast<_ITouchRotationGestureEventListener*>(pListener);
842 _TouchRotationGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchRotationGestureDetector*>(&gesture);
844 if (pCoreListener && pCoreGestureDetector)
846 switch(GetDetectorState())
848 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
849 pCoreListener->OnRotationGestureStarted(*pCoreGestureDetector);
852 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
853 pCoreListener->OnRotationGestureChanged(*pCoreGestureDetector);
856 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
857 pCoreListener->OnRotationGestureFinished(*pCoreGestureDetector);
860 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
861 pCoreListener->OnRotationGestureCanceled(*pCoreGestureDetector);
862 pCoreGestureDetector->SetToDefaultState();
872 case _TOUCH_GESTURE_DETECTOR_TYPE_PANNING:
874 _ITouchPanningGestureEventListener* pCoreListener = dynamic_cast<_ITouchPanningGestureEventListener*>(pListener);
875 _TouchPanningGestureDetector* pCoreGestureDetector = dynamic_cast<_TouchPanningGestureDetector*>(&gesture);
877 if (pCoreListener && pCoreGestureDetector)
879 switch(GetDetectorState())
881 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
882 pCoreListener->OnPanningGestureStarted(*pCoreGestureDetector);
885 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
886 pCoreListener->OnPanningGestureChanged(*pCoreGestureDetector);
889 case _TOUCH_GESTURE_DETECTOR_STATE_FINISHED:
890 pCoreListener->OnPanningGestureFinished(*pCoreGestureDetector);
893 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
894 pCoreListener->OnPanningGestureCanceled(*pCoreGestureDetector);
895 pCoreGestureDetector->SetToDefaultState();
905 case _TOUCH_GESTURE_DETECTOR_TYPE_CUSTOM:
908 _ITouchCustomGestureEventListener* pCoreListener = dynamic_cast<_ITouchCustomGestureEventListener*>(pListener);
912 switch(GetDetectorState())
914 case _TOUCH_GESTURE_DETECTOR_STATE_STARTED:
915 pCoreListener->OnCustomGestureStarted(gesture);
918 case _TOUCH_GESTURE_DETECTOR_STATE_CHANGED:
919 pCoreListener->OnCustomGestureChanged(gesture);
922 case _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS:
923 pCoreListener->OnCustomGestureFinished(gesture);
926 case _TOUCH_GESTURE_DETECTOR_STATE_CANCELED:
927 pCoreListener->OnCustomGestureCanceled(gesture);
928 gesture.SetToDefaultState();
943 _TouchGestureDetector::NotifyStateChanged(void)
945 _ControlManager* pControlManager = _ControlManager::GetInstance();
946 SysTryReturnVoidResult(NID_UI, pControlManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
948 _Control* pControl = GetControl();
949 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_CONDITION, "[E_INVALID_CONDITION] invalid GestureDetectorControl()");
951 IListT<_TouchGestureDetector*>* pGestureList = pControlManager->GetGestureDetectorList();
952 if (!pGestureList || (pGestureList && pGestureList->GetCount() == 0))
954 pGestureList = pControl->GetGestureDetectorList();
959 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
962 while(pEnumerator->MoveNext() == E_SUCCESS)
964 _TouchGestureDetector* pGestureDetector = null;
965 pEnumerator->GetCurrent(pGestureDetector);
966 if (pGestureDetector == null || !pGestureDetector->ExistWaitingList())
971 IListT<_TouchGestureDetector*>* pWaitingList = pGestureDetector->GetWantToFailList();
974 IEnumeratorT<_TouchGestureDetector*>* pWaitingEnumerator = pWaitingList->GetEnumeratorN();
975 if (pWaitingEnumerator)
977 while(pWaitingEnumerator->MoveNext() == E_SUCCESS)
979 _TouchGestureDetector* pWaitingGestureDetector = null;
980 pWaitingEnumerator->GetCurrent(pWaitingGestureDetector);
981 if (pWaitingGestureDetector == null)
986 if (pWaitingGestureDetector == this)
988 pGestureDetector->OnGestureDetectorStateChanged(*this);
991 delete pWaitingEnumerator;
999 ProcessGestureCondition();
1003 _TouchGestureDetector::ProcessGestureCondition(void)
1005 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1006 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1008 _Control* pControl = GetControl();
1009 SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_CONDITION, "[E_INVALID_CONDITION] invalid GestureDetectorControl()");
1011 //send delayed touch event when all gestures set delayed touch events decided its state(success or failed) and all failed.
1012 if (!pControl->IsDelayedTouchEventEnabled() && pControl->IsPossibleToSendDelayedTouchEvent() && !pControl->IsSentDelayedEvent())
1014 SendDelayedTouchEvent(pControl);
1017 if (pControl->IsCancelOnGestureSuccess())
1019 pTouchManager->SetTouchCancelOnGesture(true);
1020 pTouchManager->SetTouchCanceled(null);
1021 pTouchManager->SetTouchCanceledOnGestureSuccess(true);
1024 bool allDetected = true;
1025 IMapEnumeratorT <_TouchGestureDetector*, _TouchGestureDetectorState>* pMapEnumerator = pControl->GetStartedGestureDetectorEnumeratorN();
1028 while(pMapEnumerator->MoveNext() == E_SUCCESS)
1030 _TouchGestureDetectorState state = _TOUCH_GESTURE_DETECTOR_STATE_READY;
1031 pMapEnumerator->GetValue(state);
1033 if (state == _TOUCH_GESTURE_DETECTOR_STATE_STARTED)
1035 allDetected = false;
1039 delete pMapEnumerator;
1044 pControl->ClearStartedGestureDetectorList();
1049 _TouchGestureDetector::SendDelayedTouchEvent(_Control* pControl)
1051 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1052 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1054 //send delayed event if all started gesture are failed.
1055 IListT<_TouchInfo*>* pList = pControl->GetTouchInfoList();
1058 IEnumeratorT<_TouchInfo*>* pEnumerator = pList->GetEnumeratorN();
1061 while(pEnumerator->MoveNext() == E_SUCCESS)
1063 _TouchInfo* pTouchInfo = null;
1064 pEnumerator->GetCurrent(pTouchInfo);
1065 if (pTouchInfo == null)
1070 pControl->SetSendingDelayedEvent(true);
1071 pTouchManager->SendEvent(pControl, *pTouchInfo);
1074 pControl->SetSendingDelayedEvent(false);
1075 pControl->SetSentDelayedEvent(true);
1080 IListT<_TouchGestureDetector*>*
1081 _TouchGestureDetector::GetCurrentWantToFailList(void) const
1083 return __pCurrentWantToFailList;
1087 _TouchGestureDetector::OnGestureDetectorStateChanged(const _TouchGestureDetector& gestureDetector)
1089 if (GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS_AND_WAIT)
1091 _TouchGestureDetectorState state = gestureDetector.GetDetectorState();
1092 if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
1094 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
1096 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
1098 IListT<_TouchGestureDetector*>* pWaitingList = GetCurrentWantToFailList();
1101 bool exist = pWaitingList->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
1104 _TouchGestureDetector* pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
1105 pWaitingList->Remove(pGestureDetector);
1108 _TouchGestureDetectorType type = GetDetectorType();
1109 if (type != _TOUCH_GESTURE_DETECTOR_TYPE_PINCH && type != _TOUCH_GESTURE_DETECTOR_TYPE_ROTATION && type != _TOUCH_GESTURE_DETECTOR_TYPE_PANNING)
1111 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_SUCCESS);
1115 else if (GetDetectorState() == _TOUCH_GESTURE_DETECTOR_STATE_READY)
1117 _TouchGestureDetectorState state = gestureDetector.GetDetectorState();
1119 if (state == _TOUCH_GESTURE_DETECTOR_STATE_SUCCESS)
1121 SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_FAILED);
1123 else if (state == _TOUCH_GESTURE_DETECTOR_STATE_FAILED)
1125 IListT<_TouchGestureDetector*>* pWaitingList = GetCurrentWantToFailList();
1128 bool exist = pWaitingList->Contains(const_cast<_TouchGestureDetector*>(&gestureDetector));
1131 _TouchGestureDetector* pGestureDetector = const_cast<_TouchGestureDetector*>(&gestureDetector);
1132 pWaitingList->Remove(pGestureDetector);
1140 _TouchGestureDetector::SetGestureStart(bool start)
1142 __isDetectionStarted = start;
1146 _Control* pControl = GetControl();
1149 pControl->AddStartedGestureDetector(*this, _TOUCH_GESTURE_DETECTOR_STATE_STARTED);
1155 _TouchGestureDetector::IsGestureStarted(void) const
1157 return __isDetectionStarted;
1161 _TouchGestureDetector::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1167 _TouchGestureDetector::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1173 _TouchGestureDetector::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1179 _TouchGestureDetector::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1185 _TouchGestureDetector::OnTouchGestureDetectorAdded(void)
1190 _TouchGestureDetector::OnTouchGestureDetectorRemoved(void)