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.
19 * @file FUi_TouchManager.cpp
20 * @brief This is the implementation file for _TouchManager class.
24 #include <FUiTouchGestureDetector.h>
25 #include <FBaseSysLog.h>
27 #include "FUi_UiTouchEvent.h"
28 #include "FUi_UiEventManager.h"
29 #include "FUi_ITouchEventListener.h"
30 #include "FUi_TouchGestureDetector.h"
31 #include "FUi_ControlManager.h"
32 #include "FUi_Control.h"
33 #include "FUi_TouchManager.h"
34 #include "FUi_ControlImpl.h"
35 #include "FUi_ResourceManager.h"
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
43 class _TouchEventListener
44 : public _ITouchEventListener
45 , virtual public _IUiEventListener
46 , virtual public Tizen::Base::Runtime::IEventListener
49 _TouchEventListener(void)
53 virtual ~_TouchEventListener(void)
57 virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
59 _TouchManager* pTouchManager = _TouchManager::GetInstance();
60 SysTryReturn(NID_UI, pTouchManager, false, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
62 if (touchinfo.GetPointId() == SINGLE_POINT_ID)
64 pTouchManager->SetTouchAllowed(true);
65 pTouchManager->SetTouchCanceledOnGestureSuccess(false);
66 pTouchManager->SetTouchControlSource(source);
67 pTouchManager->SetFocusedControlSource(source);
71 _Control* pTouchedControl = pTouchManager->GetTouchControlSource();
72 if (pTouchedControl == null)
74 pTouchManager->SetTouchAllowed(true);
75 pTouchManager->SetTouchControlSource(source);
76 pTouchManager->SetFocusedControlSource(source);
80 if (!pTouchManager->IsSendingDelayedEvent())
85 result r = pTouchManager->AddPoint(touchinfo.GetPointId(), touchinfo.GetCurrentPosition(), _TOUCH_PRESSED);
86 SysTryReturn(NID_UI, r == E_SUCCESS, true, E_SYSTEM, "[E_SYSTEM] System error occurred.");
91 virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
93 _TouchManager* pTouchManager = _TouchManager::GetInstance();
94 SysTryReturn(NID_UI, pTouchManager, false, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
96 if (!pTouchManager->IsTouchAllowed())
101 if (!pTouchManager->IsSendingDelayedEvent())
106 result r = pTouchManager->AddPoint(touchinfo.GetPointId(), touchinfo.GetCurrentPosition(), _TOUCH_RELEASED);
107 SysTryReturn(NID_UI, r == E_SUCCESS, true, E_SYSTEM, "[E_SYSTEM] System error occurred.");
112 virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
114 _TouchManager* pTouchManager = _TouchManager::GetInstance();
115 SysTryReturn(NID_UI, pTouchManager, false, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
117 if (!pTouchManager->IsTouchAllowed())
122 if(!pTouchManager->IsInTouchMoveAllowanceBounds(source, touchinfo))
127 if (!pTouchManager->IsSendingDelayedEvent())
132 result r = pTouchManager->AddPoint(touchinfo.GetPointId(), touchinfo.GetCurrentPosition(), _TOUCH_MOVED);
141 virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
143 _TouchManager* pTouchManager = _TouchManager::GetInstance();
144 SysTryReturn(NID_UI, pTouchManager, false, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
146 if (pTouchManager->IsTouchCanceledOnGestureSuccess() == false)
148 CancelGesture(source, touchinfo);
151 _ITouchEventListener* pTouchedControlEventListener = source.GetPropagatedTouchEventListener();
153 if (pTouchedControlEventListener != null)
155 pTouchManager->SetTouchAllowed(false);
156 pTouchManager->ResetTouchInfo();
163 void CancelGesture(const _Control& source, const _TouchInfo& touchinfo)
165 IListT <_TouchGestureDetector*>* pGestureList = source.GetGestureDetectorList();
169 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
173 while(pEnumerator->MoveNext() == E_SUCCESS)
175 _TouchGestureDetector* pGestureDetector = null;
176 pEnumerator->GetCurrent(pGestureDetector);
178 if (pGestureDetector == null)
183 if (pGestureDetector->IsGestureStarted())
185 pGestureDetector->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_CANCELED);
186 pGestureDetector->ProcessPublicListener(*pGestureDetector);
187 pGestureDetector->ProcessCoreListener(*pGestureDetector);
191 pGestureDetector->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_CANCELED);
194 pGestureDetector->OnTouchCanceled(source, touchinfo);
203 namespace Tizen { namespace Ui
206 _MultiFingerInfo::_MultiFingerInfo(void)
207 : __currentPointId(0)
208 , __generatedPointId(0)
210 , __pFingerInfoMap(null)
212 __pFingerInfoMap = new (std::nothrow) HashMapT<int, _FingerInfo*>;
213 SysTryReturnVoidResult(NID_UI, __pFingerInfoMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
214 SysTryCatch(NID_UI, __pFingerInfoMap->Construct() == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error occurred.");
218 delete __pFingerInfoMap;
219 __pFingerInfoMap = null;
223 _MultiFingerInfo::~_MultiFingerInfo(void)
225 RemoveFingerInfoList();
229 _MultiFingerInfo::RemoveFingerInfoList(void)
231 IMapEnumeratorT<int, _FingerInfo*>* pEnumerator = __pFingerInfoMap->GetMapEnumeratorN();
234 while(pEnumerator->MoveNext() == E_SUCCESS)
236 _FingerInfo* pFingerInfo = null;
237 pEnumerator->GetValue(pFingerInfo);
248 __pFingerInfoMap->RemoveAll();
249 delete __pFingerInfoMap;
250 __pFingerInfoMap = null;
254 _MultiFingerInfo::GeneratePointId(unsigned long deviceId)
256 if (__pointCount == 0)
258 InitializeFingerInfo();
261 _FingerInfo* pFingerInfo = null;
262 __pFingerInfoMap->GetValue(deviceId, pFingerInfo);
264 unsigned int pointId = 0;
265 pointId = __generatedPointId;
267 if (pFingerInfo == null)
269 pFingerInfo = new (std::nothrow) _FingerInfo;
270 SysTryReturn(NID_UI, pFingerInfo, INVALID_POINT_ID, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] GeneratePointId - Memory allocation failed.");
272 pFingerInfo->SetDeviceId(deviceId);
273 pFingerInfo->SetPointId(pointId);
274 __pFingerInfoMap->Add(deviceId, pFingerInfo);
278 pFingerInfo->SetDeviceId(deviceId);
279 pFingerInfo->SetPointId(pointId);
280 __pFingerInfoMap->SetValue(deviceId, pFingerInfo);
283 __currentPointId = pointId;
284 __generatedPointId++;
290 _MultiFingerInfo::GetPointId(unsigned long deviceId) const
292 _FingerInfo* pFingerInfo = null;
293 __pFingerInfoMap->GetValue(deviceId, pFingerInfo);
294 if (pFingerInfo == null)
296 return INVALID_POINT_ID;
299 return pFingerInfo->GetPointId();
303 _MultiFingerInfo::GetCurrentPointId(void) const
305 return __currentPointId;
309 _MultiFingerInfo::GetPosition(unsigned long id) const
311 FloatPoint errorPoint(-1, -1);
313 IListT<_FingerInfo*>* pFingerList = __pFingerInfoMap->GetValuesN();
316 IEnumeratorT<_FingerInfo*>* pEnumerator = pFingerList->GetEnumeratorN();
319 while(pEnumerator->MoveNext() == E_SUCCESS)
321 _FingerInfo* pFingerInfo = null;
322 pEnumerator->GetCurrent(pFingerInfo);
324 if (pFingerInfo == null)
329 if (pFingerInfo->GetPointId() == id)
333 return pFingerInfo->GetPoint();
345 _MultiFingerInfo::GetScreenPoint(unsigned long id) const
347 FloatPoint errorPoint(-1, -1);
349 IListT<_FingerInfo*>* pFingerList = __pFingerInfoMap->GetValuesN();
352 IEnumeratorT<_FingerInfo*>* pEnumerator = pFingerList->GetEnumeratorN();
355 while(pEnumerator->MoveNext() == E_SUCCESS)
357 _FingerInfo* pFingerInfo = null;
358 pEnumerator->GetCurrent(pFingerInfo);
360 if (pFingerInfo == null)
365 if (pFingerInfo->GetPointId() == id)
369 return pFingerInfo->GetScreenPoint();
381 _MultiFingerInfo::GetStartPoint(unsigned long id) const
383 FloatPoint errorPoint(-1, -1);
385 IListT<_FingerInfo*>* pFingerList = __pFingerInfoMap->GetValuesN();
388 IEnumeratorT<_FingerInfo*>* pEnumerator = pFingerList->GetEnumeratorN();
391 while(pEnumerator->MoveNext() == E_SUCCESS)
393 _FingerInfo* pFingerInfo = null;
394 pEnumerator->GetCurrent(pFingerInfo);
396 if (pFingerInfo == null)
401 if (pFingerInfo->GetPointId() == id)
405 return pFingerInfo->GetStartPoint();
417 _MultiFingerInfo::GetStatus(unsigned long id) const
419 IListT<_FingerInfo*>* pFingerList = __pFingerInfoMap->GetValuesN();
422 IEnumeratorT<_FingerInfo*>* pEnumerator = pFingerList->GetEnumeratorN();
425 while(pEnumerator->MoveNext() == E_SUCCESS)
427 _FingerInfo* pFingerInfo = null;
428 pEnumerator->GetCurrent(pFingerInfo);
430 if (pFingerInfo == null)
435 if (pFingerInfo->GetPointId() == id)
439 return pFingerInfo->GetStatus();
447 return _TOUCH_PRESSED;
451 _MultiFingerInfo::GetPointCount(void) const
456 IListT<_FingerInfo*>*
457 _MultiFingerInfo::GetMultiFingerListN(void) const
459 IListT<_FingerInfo*>* pFingerInfoMapList = __pFingerInfoMap->GetValuesN();
460 SysTryReturn(NID_UI, pFingerInfoMapList, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
462 return pFingerInfoMapList;
466 _MultiFingerInfo::ResetFingerInfo(void)
469 __currentPointId = 0;
470 __generatedPointId = 0;
474 _MultiFingerInfo::InitializeFingerInfo(void)
476 IListT<_FingerInfo*>* pFingerList = __pFingerInfoMap->GetValuesN();
480 IEnumeratorT<_FingerInfo*>* pEnumerator = pFingerList->GetEnumeratorN();
483 while(pEnumerator->MoveNext() == E_SUCCESS)
485 _FingerInfo* pFingerInfo = null;
486 pEnumerator->GetCurrent(pFingerInfo);
488 if (pFingerInfo == null)
493 pFingerInfo->SetStatus(_TOUCH_FOCUS_OUT);
494 pFingerInfo->SetPointId(INVALID_POINT_ID);
495 __pFingerInfoMap->SetValue(pFingerInfo->GetDeviceId(), pFingerInfo);
504 _MultiFingerInfo::SetFingerInfo(unsigned long pointId, const FloatPoint& point, const FloatPoint& screenPoint, const _TouchStatus status)
506 _FingerInfo* pFingerInfo = null;
508 IListT<_FingerInfo*>* pFingerList = __pFingerInfoMap->GetValuesN();
511 IEnumeratorT<_FingerInfo*>* pEnumerator = pFingerList->GetEnumeratorN();
514 while(pEnumerator->MoveNext() == E_SUCCESS)
516 pEnumerator->GetCurrent(pFingerInfo);
517 if (pFingerInfo == null)
522 if (pFingerInfo->GetPointId() == pointId)
533 if (pFingerInfo == null)
535 SysLog(NID_UI, "Failed to SetFingerInfo, pFingerInfo is null");
536 return E_INVALID_CONDITION;
542 pFingerInfo->SetStartPoint(screenPoint);
543 pFingerInfo->SetPoint(screenPoint, point);
544 pFingerInfo->SetStatus(_TOUCH_PRESSED);
545 pFingerInfo->SetMoveReady(false);
550 if (pFingerInfo->GetStatus() == _TOUCH_RELEASED || pFingerInfo->GetStatus() == _TOUCH_FOCUS_OUT || pFingerInfo->GetPoint() == point)
552 return E_INVALID_CONDITION;
555 pFingerInfo->SetPoint(screenPoint, point);
556 pFingerInfo->SetStatus(_TOUCH_MOVED);
559 case _TOUCH_RELEASED:
560 if (pFingerInfo->GetStatus() == _TOUCH_RELEASED || pFingerInfo->GetStatus() == _TOUCH_FOCUS_OUT)
562 SysLog(NID_UI,"OnTouchReleased without OnTouchPressed");
564 return E_INVALID_CONDITION;
567 pFingerInfo->SetPoint(screenPoint, point);
568 pFingerInfo->SetStatus(_TOUCH_RELEASED);
569 pFingerInfo->SetMoveReady(false);
572 if (__pointCount == 0 )
574 __currentPointId = 0;
575 __generatedPointId = 0;
579 case _TOUCH_CANCELED:
580 pFingerInfo->SetStatus(_TOUCH_CANCELED);
587 __pFingerInfoMap->SetValue(pFingerInfo->GetDeviceId(), pFingerInfo);
591 _TouchManager* _TouchManager::__pInstance = null;
593 _TouchManager::_TouchManager(void)
594 : __pMultiFingerInfo(null)
595 , __touchCanceled(false)
596 , __touchAllowed(true)
597 , __pTouchEventListener(null)
598 , __captureAllowOutOfBounds(false)
599 , __captureAllowOwnerBounds(false)
600 , __isSendingDelayedEvent(true)
601 , __touchCanceledOnGestureSuccess(false)
602 , __changedTouchableTarget(null)
606 result r = E_SUCCESS;
607 _UiEventManager* pEventManager = null;
609 __pMultiFingerInfo = new (std::nothrow) _MultiFingerInfo;
610 SysTryReturnVoidResult(NID_UI, __pMultiFingerInfo, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
612 __pTouchEventListener = new (std::nothrow) _TouchEventListener;
613 SysTryCatch(NID_UI, __pTouchEventListener, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
615 pEventManager = _UiEventManager::GetInstance();
616 SysTryCatch(NID_UI, pEventManager, , E_SYSTEM, "[E_SYSTEM] _UiEventManager does not exist.");
618 r = pEventManager->AddTouchEventListener(*__pTouchEventListener);
619 SysTryCatch(NID_UI, r == E_SUCCESS, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
624 delete __pMultiFingerInfo;
625 __pMultiFingerInfo = null;
627 if (__pTouchEventListener)
629 delete __pTouchEventListener;
630 __pTouchEventListener = null;
634 _TouchManager::~_TouchManager(void)
636 delete __pMultiFingerInfo;
637 __pMultiFingerInfo = null;
639 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
642 pEventManager->RemoveTouchEventListener(*__pTouchEventListener);
645 delete __pTouchEventListener;
646 __pTouchEventListener = null;
650 _TouchManager::Initialize(void)
652 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
654 if (__pInstance == null)
656 pthread_once(&once_block, InitializeInstance);
662 _TouchManager::GetInstance(void)
668 _TouchManager::InitializeInstance(void)
672 if (__pInstance == null)
674 __pInstance = new (std::nothrow) _TouchManager;
675 SysTryReturnVoidResult(NID_UI, __pInstance != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
680 _TouchManager::ReleaseInstance(void)
690 _TouchManager::AddPoint(unsigned long pointId, const FloatPoint& point, _TouchStatus status)
692 FloatPoint screenPos(point.x, point.y);
693 FloatPoint controlPos(0, 0);
695 _Control* pControl = GetTouchControlSource();
698 controlPos.x = pControl->GetAbsoluteBounds().x;
699 controlPos.y = pControl->GetAbsoluteBounds().y;
701 screenPos.x += controlPos.x;
702 screenPos.y += controlPos.y;
705 return __pMultiFingerInfo->SetFingerInfo(pointId, point, screenPos, status);
709 _TouchManager::GetPointId(unsigned long deviceId) const
711 return __pMultiFingerInfo->GetPointId(deviceId);
714 Tizen::Graphics::FloatPoint
715 _TouchManager::GetStartPoint(unsigned long pointId) const
717 return __pMultiFingerInfo->GetStartPoint(pointId);
721 _TouchManager::GetCurrentPointId(void) const
723 return __pMultiFingerInfo->GetCurrentPointId();
727 _TouchManager::GeneratePointId(const unsigned long deviceId) const
729 return __pMultiFingerInfo->GeneratePointId(deviceId);
733 _TouchManager::GetPosition(unsigned long id) const
735 return __pMultiFingerInfo->GetPosition(id);
739 _TouchManager::GetScreenPoint(unsigned long id) const
741 return __pMultiFingerInfo->GetScreenPoint(id);
745 _TouchManager::GetTouchStatus(const unsigned long id) const
747 return (static_cast <TouchStatus>(__pMultiFingerInfo->GetStatus(id)));
751 _TouchManager::GetPointCount(void) const
753 return __pMultiFingerInfo->GetPointCount();
757 _TouchManager::SetTouchControlSource(const _Control& source)
759 __touchControlHandle = source.GetHandle();
763 _TouchManager::GetTouchControlSource(void) const
765 _ControlManager* pControlManager = _ControlManager::GetInstance();
766 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
768 return pControlManager->GetObject(__touchControlHandle);
772 _TouchManager::SetFocusedControlSource(const _Control& source)
774 __focusedControlHandle = source.GetHandle();
778 _TouchManager::GetFocusedControlSource(void) const
780 _ControlManager* pControlManager = _ControlManager::GetInstance();
781 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
783 return pControlManager->GetObject(__focusedControlHandle);
787 _TouchManager::SendEvent(_Control* pControl, const _TouchInfo& touchInfo)
789 SysTryReturnResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] pControl is null.");
791 _UiTouchEvent event(pControl->GetHandle(), touchInfo, _UI_EVENT_ROUTE_DIRECT);
793 _Control* pTouchedControl = GetTouchControlSource();
796 event.SetOriginalDestination(*pTouchedControl);
799 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
800 SysTryReturnResult(NID_UI, pEventManager, E_SYSTEM, "[E_SYSTEM] _UiEventManager does not exist.");
802 __isSendingDelayedEvent = false;
803 result r = pEventManager->SendEvent(event);
804 __isSendingDelayedEvent = true;
810 _TouchManager::SetTouchCancelOnGesture(bool onlyTouchEvent)
812 __touchCanceledOnGestureSuccess = onlyTouchEvent;
816 _TouchManager::SetTouchCanceled(_Control* pControl)
818 if (GetTouchControlSource())
820 if (pControl != null && pControl != GetTouchControlSource())
825 FloatPoint currentPoint(0, 0);
826 _TouchInfo touchInfo;
828 if (GetTouchControlSource()->IsMultiTouchEnabled())
830 currentPoint.x = GetScreenPoint(GetCurrentPointId()).x;
831 currentPoint.y = GetScreenPoint(GetCurrentPointId()).y;
833 _TouchInfo multiTouchInfo(GetCurrentPointId(), _TOUCH_CANCELED, currentPoint, false, 0);
834 touchInfo = multiTouchInfo;
838 currentPoint.x = GetScreenPoint(SINGLE_POINT_ID).x;
839 currentPoint.y = GetScreenPoint(SINGLE_POINT_ID).y;
841 _TouchInfo singleTouchInfo(SINGLE_POINT_ID, _TOUCH_CANCELED, currentPoint, false, 0);
842 touchInfo = singleTouchInfo;
845 _UiTouchEvent event(GetTouchControlSource()->GetHandle(), touchInfo);
847 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
848 SysTryReturnVoidResult(NID_UI, pEventManager, E_SYSTEM, "[E_SYSTEM] _UiEventManager does not exist.");
850 _TouchManager* pTouchManager = _TouchManager::GetInstance();
851 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
853 result r = pTouchManager->AddPoint(touchInfo.GetPointId(), currentPoint, _TOUCH_CANCELED);
854 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] System error occurred.");
856 SysLog(NID_UI, "SendTouchCancelEvent");
857 pEventManager->SendEvent(event);
859 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
860 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
862 int count = pFingerInfoList->GetCount();
864 for (int i = 0; i < count; i++)
866 _FingerInfo* pFingerInfo = null;
867 pFingerInfoList->GetAt(i, pFingerInfo);
868 if (pFingerInfo == null)
873 if (pFingerInfo->GetPointId() == touchInfo.GetPointId())
875 pFingerInfo->SetPointId(INVALID_POINT_ID);
879 delete pFingerInfoList;
881 SetLastResult(E_SUCCESS);
882 _ResourceManager::GetInstance()->ResetFeedback();
886 _TouchManager::SetTouchReleased(void)
888 if (GetTouchControlSource() && GetTouchControlSource()->IsAttachedToMainTree())
890 FloatPoint currentPoint(0, 0);
891 _TouchInfo touchInfo;
893 if (GetTouchControlSource()->IsMultiTouchEnabled())
895 currentPoint.x = GetScreenPoint(GetCurrentPointId()).x;
896 currentPoint.y = GetScreenPoint(GetCurrentPointId()).y;
898 _TouchInfo multiTouchInfo(GetCurrentPointId(), _TOUCH_RELEASED, currentPoint, false, 0);
899 touchInfo = multiTouchInfo;
903 currentPoint.x = GetScreenPoint(SINGLE_POINT_ID).x;
904 currentPoint.y = GetScreenPoint(SINGLE_POINT_ID).y;
906 _TouchInfo singleTouchInfo(SINGLE_POINT_ID, _TOUCH_RELEASED, currentPoint, false, 0);
907 touchInfo = singleTouchInfo;
910 _UiTouchEvent event(GetTouchControlSource()->GetHandle(), touchInfo);
912 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
913 SysTryReturnVoidResult(NID_UI, pEventManager, E_SYSTEM, "[E_SYSTEM] _UiEventManager does not exist.");
915 pEventManager->SendEvent(event);
917 _TouchManager* pTouchManager = _TouchManager::GetInstance();
918 SysTryReturnVoidResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] _TouchManager does not exist.");
920 IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
921 SysTryReturnVoidResult(NID_UI, pFingerInfoList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
923 int count = pFingerInfoList->GetCount();
925 for (int i = 0; i < count; i++)
927 _FingerInfo* pFingerInfo = null;
928 pFingerInfoList->GetAt(i, pFingerInfo);
929 if (pFingerInfo == null)
934 if (pFingerInfo->GetPointId() == touchInfo.GetPointId())
936 pFingerInfo->SetPointId(INVALID_POINT_ID);
940 delete pFingerInfoList;
943 SetLastResult(E_SUCCESS);
947 _TouchManager::IsTouchCanceledOnGestureSuccess(void) const
949 return __touchCanceledOnGestureSuccess;
953 _TouchManager::SetTouchCanceledOnGestureSuccess(bool cancel)
955 __touchCanceledOnGestureSuccess = cancel;
959 _TouchManager::SetTouchAllowed(bool allowed)
961 __touchAllowed = allowed;
965 _TouchManager::IsTouchAllowed(void)
967 return __touchAllowed;
971 _TouchManager::IsInTouchMoveAllowanceBounds(const _Control& source, const _TouchInfo& touchInfo)
973 IListT<_FingerInfo*>* pFingerInfoList = GetMultiFingerInfoListN();
974 SysTryReturn(NID_UI, pFingerInfoList, false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
976 const int count = pFingerInfoList->GetCount();
978 for (int i = 0; i < count; i++)
980 _FingerInfo* pFingerInfo = null;
981 pFingerInfoList->GetAt(i, pFingerInfo);
982 if (pFingerInfo == null)
987 if (pFingerInfo->GetPointId() == touchInfo.GetPointId())
989 if (pFingerInfo->GetMoveReady() == true)
991 delete pFingerInfoList;
992 pFingerInfoList = null;
996 FloatPoint tmpPoint = GetStartPoint(touchInfo.GetPointId());
997 Rectangle absBounds = source.GetAbsoluteBounds();
999 FloatPoint startPoint(tmpPoint.x - absBounds.x, tmpPoint.y - absBounds.y);
1000 FloatPoint currentPoint = touchInfo.GetCurrentPosition();
1002 //SysLog(NID_UI, "[Touch Test] tmpPoint(%d, %d) absBounds(%d, %d) startPoint(%d, %d) currentPoint(%d, %d)",
1003 // tmpPoint.x, tmpPoint.y, absBounds.x, absBounds.y, startPoint.x, startPoint.y, currentPoint.x, currentPoint.y);
1005 int distance = int(hypot(abs(startPoint.x-currentPoint.x), abs(startPoint.y-currentPoint.y)));
1007 if (distance >= source.GetTouchPressThresholdPixel())
1009 pFingerInfo->SetMoveReady(true);
1011 delete pFingerInfoList;
1017 delete pFingerInfoList;
1022 _TouchManager::SetCapturedControl(const _Control* pControl, bool allowOutOfBounds, bool allowOwnerBounds)
1026 __capturedControlHandle = pControl->GetHandle();
1030 __capturedControlHandle = _ControlHandle();
1033 __captureAllowOutOfBounds = allowOutOfBounds;
1034 __captureAllowOwnerBounds = allowOwnerBounds;
1038 _TouchManager::GetCapturedControl(void) const
1040 _ControlManager* pControlManager = _ControlManager::GetInstance();
1041 SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] _ControlManager does not exist.");
1043 return pControlManager->GetObject(__capturedControlHandle);
1047 _TouchManager::IsCaptureAllowedOutOfBounds(void) const
1049 return __captureAllowOutOfBounds;
1053 _TouchManager::IsCaptureAllowedOwnerBounds(void) const
1055 return __captureAllowOwnerBounds;
1059 _TouchManager::ResetTouchInfo(void)
1061 __pMultiFingerInfo->ResetFingerInfo();
1063 _Control* pControl = GetTouchControlSource();
1066 IListT <_TouchGestureDetector*>* pGestureList = pControl->GetGestureDetectorList();
1070 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
1074 while(pEnumerator->MoveNext() == E_SUCCESS)
1076 _TouchGestureDetector* pGestureDetector = null;
1077 pEnumerator->GetCurrent(pGestureDetector);
1079 if (pGestureDetector == null)
1084 pGestureDetector->SetDetectorState(_TOUCH_GESTURE_DETECTOR_STATE_CANCELED);
1085 pGestureDetector->ProcessCoreListener(*pGestureDetector);
1092 __touchAllowed = false;
1095 IListT<_FingerInfo*>*
1096 _TouchManager::GetMultiFingerInfoListN(void) const
1098 return __pMultiFingerInfo->GetMultiFingerListN();
1102 _TouchManager::IsSendingDelayedEvent(void) const
1104 return __isSendingDelayedEvent;
1108 _TouchManager::SetChangedTouchableTarget(_Control* pTarget)
1110 __changedTouchableTarget = pTarget;
1114 _TouchManager::GetChangedTouchableTarget(void)
1116 return __changedTouchableTarget;