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_UiTouchEvent.cpp
19 * @brief This is the implementation file for the _UiTouchEvent class.
22 #include <FBaseResult.h>
23 #include <FBaseColIEnumeratorT.h>
24 #include <FBaseSysLog.h>
25 #include "FUi_UiTouchEvent.h"
26 #include "FUi_ITouchEventListener.h"
27 #include "FUi_ITouchEventPreviewer.h"
28 #include "FUi_Control.h"
29 #include "FUi_ControlManager.h"
30 #include "FUi_TouchGestureDetector.h"
31 #include "FUi_TouchManager.h"
32 #include "FUi_ITouchGestureDelegate.h"
33 #include "FUi_ControlImpl.h"
34 #include "FUi_TouchEventArg.h"
35 #include "FUi_ControlManager.h"
36 #include "FUi_CoordinateSystemUtils.h"
39 extern void _UiPrintControl(const Tizen::Ui::_Control& control, bool printChildren);
43 using namespace std::tr1;
44 using namespace Tizen::Base::Collection;
45 using namespace Tizen::Graphics;
47 namespace Tizen { namespace Ui
49 _TouchInfo::_TouchInfo(void)
51 , __touchStatus(_TOUCH_PRESSED)
52 , __currentPosition(0, 0)
58 _TouchInfo::_TouchInfo(unsigned long pointId, _TouchStatus status, const Tizen::Graphics::Point& current, const bool isFlick, long long timeStamp)
60 , __touchStatus(status)
61 , __isFlicked(isFlick)
62 , __timeStamp(timeStamp)
64 __currentPosition = _CoordinateSystemUtils::ConvertToFloat(current);
67 _TouchInfo::_TouchInfo(unsigned long pointId, _TouchStatus status, const Tizen::Graphics::FloatPoint& current, const bool isFlick, long long timeStamp)
69 , __touchStatus(status)
70 , __currentPosition(current)
71 , __isFlicked(isFlick)
72 , __timeStamp(timeStamp)
76 _TouchInfo::_TouchInfo(const _TouchInfo& rhs)
77 : __pointId(rhs.__pointId)
78 , __touchStatus(rhs.__touchStatus)
79 , __currentPosition(rhs.__currentPosition)
80 , __isFlicked(rhs.__isFlicked)
81 , __timeStamp(rhs.__timeStamp)
86 _TouchInfo::operator =(const _TouchInfo& rhs)
90 __pointId = rhs.__pointId;
91 __touchStatus = rhs.__touchStatus;
92 __currentPosition = rhs.__currentPosition;
93 __isFlicked = rhs.__isFlicked;
94 __timeStamp = rhs.__timeStamp;
100 _TouchInfo::~_TouchInfo(void)
105 _TouchInfo::GetTouchStatus(void) const
107 return __touchStatus;
110 Tizen::Graphics::FloatPoint
111 _TouchInfo::GetCurrentPosition(void) const
113 return __currentPosition;
117 _TouchInfo::GetPointId(void) const
123 _TouchInfo::IsFlicked(void) const
129 _TouchInfo::GetTimeStamp(void) const
135 _TouchInfo::SetTouchInfo(unsigned long pointId, _TouchStatus status, Tizen::Graphics::Point& current, bool isFlick, long long timeStamp)
138 __touchStatus = status;
139 __currentPosition = _CoordinateSystemUtils::ConvertToFloat(current);
140 __isFlicked = isFlick;
141 __timeStamp = timeStamp;
145 _TouchInfo::SetTouchInfo(unsigned long pointId, _TouchStatus status, Tizen::Graphics::FloatPoint& current, bool isFlick, long long timeStamp)
148 __touchStatus = status;
149 __currentPosition = current;
150 __isFlicked = isFlick;
151 __timeStamp = timeStamp;
154 _MouseInfo::_MouseInfo(void)
156 , __touchStatus(_TOUCH_PRESSED)
157 , __currentPosition(0, 0)
165 _MouseInfo::_MouseInfo(unsigned long pointId, _TouchStatus status, const Tizen::Graphics::FloatPoint& current, int zAxis, int buttons, const bool isFlick, long long timeStamp)
167 , __touchStatus(status)
168 , __currentPosition(current)
171 , __isFlicked(isFlick)
172 , __timeStamp(timeStamp)
176 _MouseInfo::_MouseInfo(const _MouseInfo& rhs)
177 : __pointId(rhs.__pointId)
178 , __touchStatus(rhs.__touchStatus)
179 , __currentPosition(rhs.__currentPosition)
180 , __zAxis(rhs.__zAxis)
181 , __buttons(rhs.__buttons)
182 , __isFlicked(rhs.__isFlicked)
183 , __timeStamp(rhs.__timeStamp)
188 _MouseInfo::operator =(const _MouseInfo& rhs)
192 __pointId = rhs.__pointId;
193 __touchStatus = rhs.__touchStatus;
194 __currentPosition = rhs.__currentPosition;
195 __zAxis = rhs.__zAxis;
196 __buttons = rhs.__buttons;
197 __isFlicked = rhs.__isFlicked;
198 __timeStamp = rhs.__timeStamp;
204 _MouseInfo::~_MouseInfo(void)
209 _MouseInfo::GetTouchStatus(void) const
211 return __touchStatus;
214 Tizen::Graphics::FloatPoint
215 _MouseInfo::GetCurrentPosition(void) const
217 return __currentPosition;
221 _MouseInfo::GetPointId(void) const
227 _MouseInfo::GetZAxis(void) const
233 _MouseInfo::GetButtons(void) const
239 _MouseInfo::IsFlicked(void) const
245 _MouseInfo::GetTimeStamp(void) const
251 _MouseInfo::SetTouchInfo(unsigned long pointId, _TouchStatus status, Tizen::Graphics::Point& current, int zAxis, int buttons, bool isFlick, long long timeStamp)
254 __touchStatus = status;
255 __currentPosition = _CoordinateSystemUtils::ConvertToFloat(current);
258 __isFlicked = isFlick;
259 __timeStamp = timeStamp;
263 _MouseInfo::SetTouchInfo(unsigned long pointId, _TouchStatus status, Tizen::Graphics::FloatPoint& current, int zAxis, int buttons, bool isFlick, long long timeStamp)
266 __touchStatus = status;
267 __currentPosition = current;
270 __isFlicked = isFlick;
271 __timeStamp = timeStamp;
274 _UiTouchEvent::_UiTouchEvent(const _UiObjectHandle& destination, const _TouchInfo& touchInfo, _UiEventRouteType routeType, const _UiObjectHandle& source)
275 : _UiEvent(destination, source, routeType)
276 , __touchInfo(touchInfo)
277 , __pForcedControlList(new (std::nothrow) LinkedListT<_Control*>)
281 _UiTouchEvent::~_UiTouchEvent(void)
285 _UiTouchEvent::_UiTouchEvent(const _UiTouchEvent& rhs)
287 , __touchInfo(rhs.__touchInfo)
288 , __pForcedControlList(rhs.__pForcedControlList)
293 _UiTouchEvent::operator =(const _UiTouchEvent& rhs)
295 _UiEvent::operator =(rhs);
299 __touchInfo = rhs.__touchInfo;
300 __pForcedControlList = rhs.__pForcedControlList;
307 _UiTouchEvent::GetTouchInfo(void) const
313 _UiTouchEvent::CloneN(void) const
315 return new (std::nothrow) _UiTouchEvent(*this);
319 _UiTouchEvent::GetEventType(void) const
321 return _UI_EVENT_TOUCH;
325 _UiTouchEvent::IsEventEnabled(const _Control& control) const
327 if (!_UiEvent::IsEventEnabled(control))
332 if (GetTouchInfo()->GetTouchStatus() != _TOUCH_CANCELED)
334 if (!control.IsInputEventEnabled())
344 _UiTouchEvent::OnPreviewEventProcessing(const _Control& control, bool& isFiltered)
346 result r = E_SUCCESS;
348 const _TouchInfo* pTouchInfo = GetTouchInfo();
349 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
351 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
353 _ITouchEventPreviewer* pTouchEventPreviewer = control.GetPropagatedTouchEventListener();
354 SysTryReturn(NID_UI, pTouchEventPreviewer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
356 r = FirePreviewListener(pTouchEventPreviewer, &control, isFiltered);
363 _UiTouchEvent::OnEventProcessing(const _Control& control, bool& isFiltered)
365 result r = E_SUCCESS;
367 bool doesControlExist = false;
369 const _TouchInfo* pTouchInfo = GetTouchInfo();
370 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
372 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
374 ProcessGesture(control, isFiltered);
378 doesControlExist = __pForcedControlList->Contains(const_cast<_Control*>(&control));
380 if (doesControlExist)
382 bool isForcedFiltered = false;
383 ProcessGesture(control, isForcedFiltered);
385 if (isForcedFiltered)
392 if (!ExistGlobalGesture() || GetAccessibilityEvent())
394 if(!isFiltered || doesControlExist)
396 _ITouchEventListener* pTouchEventListener = control.GetPropagatedTouchEventListener();
397 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
399 r = FireListener(pTouchEventListener, &control, true, isFiltered);
407 _UiTouchEvent::OnListenerProcessing(const _IUiEventListener& listener, bool& isFiltered)
409 _ITouchEventListener* pTouchEventListener = dynamic_cast <_ITouchEventListener*>(const_cast <_IUiEventListener*>(&listener));
410 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
412 return FireListener(pTouchEventListener, null, true, isFiltered);
416 _UiTouchEvent::OnEventHandled(const _Control& control)
418 _Control* pTarget = const_cast<_Control*>(GetControl(GetDestination()));
419 SysTryReturn(NID_UI, pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
421 const _TouchInfo* pTouchInfo = GetTouchInfo();
422 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
424 result r = E_SUCCESS;
426 switch (pTouchInfo->GetTouchStatus())
429 pTarget->GetPropagatedTouchEventListener()->OnTouchPressHandled(control);
433 pTarget->GetPropagatedTouchEventListener()->OnTouchMoveHandled(control);
436 case _TOUCH_RELEASED:
437 pTarget->GetPropagatedTouchEventListener()->OnTouchReleaseHandled(control);
440 case _TOUCH_CANCELED:
441 pTarget->GetPropagatedTouchEventListener()->OnTouchCancelHandled(control);
453 _UiTouchEvent::FireListener(const _ITouchEventListener* pListener, const _Control* pControl, bool isTouchEvent, bool& isFiltered)
455 _ITouchEventListener* pTouchEventListener = const_cast <_ITouchEventListener*>(pListener);
456 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
458 result r = E_SUCCESS;
460 const _TouchInfo* pTouchInfo = GetTouchInfo();
461 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
463 const _Control* pTarget = GetControl(GetOriginalDestination());
466 SysLog(NID_UI, "pTarget == null, Call ResetTouchInfo.");
467 _TouchManager* pTouchManager = _TouchManager::GetInstance();
468 pTouchManager->ResetTouchInfo();
473 if (ResetTouchInfo(pTarget, *pTouchInfo) == E_SUCCESS)
479 FloatPoint point(0, 0);
483 _TouchManager* pTouchManager = _TouchManager::GetInstance();
484 SysAssert(pTouchManager != null)
486 point = GetRelativePoint(*pControl, pTouchInfo->GetCurrentPosition());
488 if (isTouchEvent && (pTouchInfo->GetTouchStatus() != _TOUCH_CANCELED))
490 if (!pTouchManager->IsTouchAllowed() || (pTouchManager->IsTouchAllowed() && pTouchManager->IsTouchCanceledOnGestureSuccess())
491 || (!pControl->IsMultiTouchEnabled() && pTouchInfo->GetPointId() > 0))
500 point = GetRelativePoint(*pTarget, pTouchInfo->GetCurrentPosition());
503 _TouchInfo touchInfo(pTouchInfo->GetPointId(), pTouchInfo->GetTouchStatus(), point, false, pTouchInfo->GetTimeStamp());
505 switch (touchInfo.GetTouchStatus())
508 isFiltered = pTouchEventListener->OnTouchPressed(*pTarget, touchInfo);
511 case _TOUCH_RELEASED:
512 isFiltered = pTouchEventListener->OnTouchReleased(*pTarget, touchInfo);
516 isFiltered = pTouchEventListener->OnTouchMoved(*pTarget, touchInfo);
519 // 2.0 compatibility for touch simulate
520 case _TOUCH_LONG_PRESSED:
522 case _TOUCH_DOUBLE_PRESSED:
524 void* pData = pTarget->GetUserData();
527 _ControlImpl* pTargetImpl = static_cast<_ControlImpl*>(pData);
530 pTargetImpl->GenerateTouchEvent(touchInfo);
536 case _TOUCH_CANCELED:
537 isFiltered = pTouchEventListener->OnTouchCanceled(*pTarget, touchInfo);
548 SysLog(NID_UI, "Event Consumed : isFiltered is True : pControl %x", pControl);
549 //_UiPrintControl(*pControl, false);
551 SysLog(NID_UI, "Event Consumed : isFiltered is True : pTarget %x", pTarget);
558 _UiTouchEvent::FirePreviewListener(const _ITouchEventPreviewer* pListener, const _Control* pControl, bool& isFiltered)
560 _ITouchEventPreviewer* pTouchEventPreviewer = const_cast <_ITouchEventPreviewer*>(pListener);
561 SysTryReturn(NID_UI, pTouchEventPreviewer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
563 result r = E_SUCCESS;
565 const _TouchInfo* pTouchInfo = GetTouchInfo();
566 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
568 const _Control* pTarget = GetControl(GetDestination());
570 FloatPoint point = GetRelativePoint(*pControl, pTouchInfo->GetCurrentPosition());
572 if (!pControl->IsMultiTouchEnabled() && pTouchInfo->GetPointId() > 0)
578 _TouchInfo touchInfo(pTouchInfo->GetPointId(), pTouchInfo->GetTouchStatus(), point, false, pTouchInfo->GetTimeStamp());
580 _UiTouchEventDelivery eventDelivery = _UI_TOUCH_EVENT_DELIVERY_NO;
582 //condition 1) if target is not enabled multi touch, point id should be 0
583 //2) target is enabled multi touch
584 switch (touchInfo.GetTouchStatus())
587 eventDelivery = pTouchEventPreviewer->OnPreviewTouchPressed(*pTarget, touchInfo);
591 case _TOUCH_RELEASED:
592 eventDelivery = pTouchEventPreviewer->OnPreviewTouchReleased(*pTarget, touchInfo);
597 eventDelivery = pTouchEventPreviewer->OnPreviewTouchMoved(*pTarget, touchInfo);
601 case _TOUCH_CANCELED:
602 eventDelivery = pTouchEventPreviewer->OnPreviewTouchCanceled(*pTarget, touchInfo);
610 if (eventDelivery != _UI_TOUCH_EVENT_DELIVERY_NO)
612 // isFiltered = (eventDelivery == _UI_TOUCH_EVENT_DELIVERY_FORCED_YES);
615 if (eventDelivery == _UI_TOUCH_EVENT_DELIVERY_FORCED_YES)
617 __pForcedControlList->Add(const_cast<_Control*>(pControl));
629 _UiTouchEvent::ProcessGesture(const _Control& control, bool& isFiltered)
631 if (control.IsSendingDelayedEvent())
636 IListT<_TouchGestureDetector*>* pGestureList = control.GetGestureDetectorList();
637 if (!pGestureList || (pGestureList && (pGestureList->GetCount() <= 0)))
642 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
643 SysTryReturn(NID_UI, pEnumerator, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
645 while (pEnumerator->MoveNext() == E_SUCCESS)
647 _TouchGestureDetector* pGestureDetector = null;
648 pEnumerator->GetCurrent(pGestureDetector);
650 if (!pGestureDetector)
655 _ITouchGestureDelegate* pDelegator = pGestureDetector->GetDelegate();
658 FireListener(pDelegator, &control, false, isFiltered);
667 _UiTouchEvent::GetRelativePoint(const _Control& control, const FloatPoint& point) const
669 FloatPoint relativePoint(point);
670 FloatRectangle absRect = control.GetAbsoluteBoundsF();
672 relativePoint.x -= absRect.x;
673 relativePoint.y -= absRect.y;
675 return relativePoint;
679 _UiTouchEvent::ResetTouchInfo(const _Control* pControl, const _TouchInfo& touchInfo)
681 _TouchManager* pTouchManager = _TouchManager::GetInstance();
682 SysTryReturnResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] System error occurred. ");
684 if (pControl == null)
686 if (touchInfo.GetTouchStatus() == _TOUCH_RELEASED)
688 pTouchManager->ResetTouchInfo();
694 return E_INVALID_CONDITION;
698 _UiTouchEvent::ExistGlobalGesture(void)
700 _ControlManager* pControlManager = _ControlManager::GetInstance();
701 SysTryReturn(NID_UI, pControlManager, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
705 IListT<_TouchGestureDetector*>* pGestureList = pControlManager->GetGestureDetectorList();
706 if (pGestureList && (pGestureList->GetCount() > 0))
714 _UiMouseEvent::_UiMouseEvent(const _UiObjectHandle& destination, const _MouseInfo& mouseInfo, _UiEventRouteType routeType, const _UiObjectHandle& source)
715 : _UiEvent(destination, source, routeType)
716 , __mouseInfo(mouseInfo)
717 , __pForcedControlList(new (std::nothrow) LinkedListT<_Control*>)
721 _UiMouseEvent::~_UiMouseEvent(void)
725 _UiMouseEvent::_UiMouseEvent(const _UiMouseEvent& rhs)
727 , __mouseInfo(rhs.__mouseInfo)
728 , __pForcedControlList(rhs.__pForcedControlList)
733 _UiMouseEvent::operator =(const _UiMouseEvent& rhs)
735 _UiEvent::operator =(rhs);
739 __mouseInfo = rhs.__mouseInfo;
740 __pForcedControlList = rhs.__pForcedControlList;
747 _UiMouseEvent::GetTouchInfo(void) const
753 _UiMouseEvent::CloneN(void) const
755 return new (std::nothrow) _UiMouseEvent(*this);
759 _UiMouseEvent::GetEventType(void) const
761 return _UI_EVENT_TOUCH;
765 _UiMouseEvent::IsEventEnabled(const _Control& control) const
767 if (!_UiEvent::IsEventEnabled(control))
772 if (GetTouchInfo()->GetTouchStatus() != _TOUCH_CANCELED)
774 if (!control.IsInputEventEnabled())
784 _UiMouseEvent::OnPreviewEventProcessing(const _Control& control, bool& isFiltered)
786 result r = E_SUCCESS;
788 const _MouseInfo* pMouseInfo = GetTouchInfo();
789 SysTryReturn(NID_UI, pMouseInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
791 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
793 _ITouchEventPreviewer* pTouchEventPreviewer = control.GetPropagatedTouchEventListener();
794 SysTryReturn(NID_UI, pTouchEventPreviewer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
796 r = FirePreviewListener(pTouchEventPreviewer, &control, isFiltered);
803 _UiMouseEvent::OnEventProcessing(const _Control& control, bool& isFiltered)
805 result r = E_SUCCESS;
807 bool doesControlExist = false;
809 const _MouseInfo* pMouseInfo = GetTouchInfo();
810 SysTryReturn(NID_UI, pMouseInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
812 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
814 ProcessGesture(control, isFiltered);
818 doesControlExist = __pForcedControlList->Contains(const_cast<_Control*>(&control));
820 if (doesControlExist)
822 bool isForcedFiltered = false;
823 ProcessGesture(control, isForcedFiltered);
825 if (isForcedFiltered)
832 if (!ExistGlobalGesture() || GetAccessibilityEvent())
834 if(!isFiltered || doesControlExist)
836 _ITouchEventListener* pTouchEventListener = control.GetPropagatedTouchEventListener();
837 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
839 r = FireListener(pTouchEventListener, &control, true, isFiltered);
847 _UiMouseEvent::OnListenerProcessing(const _IUiEventListener& listener, bool& isFiltered)
849 _ITouchEventListener* pTouchEventListener = dynamic_cast <_ITouchEventListener*>(const_cast <_IUiEventListener*>(&listener));
850 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
852 return FireListener(pTouchEventListener, null, true, isFiltered);
856 _UiMouseEvent::OnEventHandled(const _Control& control)
858 _Control* pTarget = const_cast<_Control*>(GetControl(GetDestination()));
859 SysTryReturn(NID_UI, pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
861 const _MouseInfo* pMouseInfo = GetTouchInfo();
862 SysTryReturn(NID_UI, pMouseInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
864 result r = E_SUCCESS;
866 switch (pMouseInfo->GetTouchStatus())
869 pTarget->GetPropagatedTouchEventListener()->OnTouchPressHandled(control);
873 pTarget->GetPropagatedTouchEventListener()->OnTouchMoveHandled(control);
876 case _TOUCH_RELEASED:
877 pTarget->GetPropagatedTouchEventListener()->OnTouchReleaseHandled(control);
880 case _TOUCH_CANCELED:
881 pTarget->GetPropagatedTouchEventListener()->OnTouchCancelHandled(control);
893 _UiMouseEvent::FireListener(const _ITouchEventListener* pListener, const _Control* pControl, bool isTouchEvent, bool& isFiltered)
895 _ITouchEventListener* pTouchEventListener = const_cast <_ITouchEventListener*>(pListener);
896 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
898 result r = E_SUCCESS;
900 const _MouseInfo* pMouseInfo = GetTouchInfo();
901 SysTryReturn(NID_UI, pMouseInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
903 const _Control* pTarget = GetControl(GetOriginalDestination());
906 SysLog(NID_UI, "pTarget == null, Call ResetTouchInfo.");
907 _TouchManager* pTouchManager = _TouchManager::GetInstance();
908 pTouchManager->ResetTouchInfo();
913 if (ResetTouchInfo(pTarget, *pMouseInfo) == E_SUCCESS)
919 FloatPoint point(0, 0);
923 _TouchManager* pTouchManager = _TouchManager::GetInstance();
924 SysAssert(pTouchManager != null)
926 point = GetRelativePoint(*pControl, pMouseInfo->GetCurrentPosition());
930 point = GetRelativePoint(*pTarget, pMouseInfo->GetCurrentPosition());
933 _MouseInfo mouseInfo(pMouseInfo->GetPointId(), pMouseInfo->GetTouchStatus(), point, pMouseInfo->GetZAxis(), pMouseInfo->GetButtons(), false, pMouseInfo->GetTimeStamp());
935 switch (mouseInfo.GetTouchStatus())
938 isFiltered = pTouchEventListener->OnMousePressed(*pTarget, mouseInfo);
941 case _TOUCH_RELEASED:
942 isFiltered = pTouchEventListener->OnMouseReleased(*pTarget, mouseInfo);
946 isFiltered = pTouchEventListener->OnMouseMoved(*pTarget, mouseInfo);
950 isFiltered = pTouchEventListener->OnMouseWheeled(*pTarget, mouseInfo);
961 SysLog(NID_UI, "Event Consumed : isFiltered is True : pControl %x", pControl);
962 //_UiPrintControl(*pControl, false);
964 SysLog(NID_UI, "Event Consumed : isFiltered is True : pTarget %x", pTarget);
971 _UiMouseEvent::FirePreviewListener(const _ITouchEventPreviewer* pListener, const _Control* pControl, bool& isFiltered)
973 _ITouchEventPreviewer* pTouchEventPreviewer = const_cast <_ITouchEventPreviewer*>(pListener);
974 SysTryReturn(NID_UI, pTouchEventPreviewer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
976 result r = E_SUCCESS;
978 const _MouseInfo* pMouseInfo = GetTouchInfo();
979 SysTryReturn(NID_UI, pMouseInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
981 const _Control* pTarget = GetControl(GetDestination());
983 FloatPoint point = GetRelativePoint(*pControl, pMouseInfo->GetCurrentPosition());
985 if (!pControl->IsMultiTouchEnabled() && pMouseInfo->GetPointId() > 0)
991 _MouseInfo mouseInfo(pMouseInfo->GetPointId(), pMouseInfo->GetTouchStatus(), point, pMouseInfo->GetZAxis(), pMouseInfo->GetButtons(), false, pMouseInfo->GetTimeStamp());
993 _UiTouchEventDelivery eventDelivery = _UI_TOUCH_EVENT_DELIVERY_NO;
995 //condition 1) if target is not enabled multi touch, point id should be 0
996 //2) target is enabled multi touch
997 switch (mouseInfo.GetTouchStatus())
1000 eventDelivery = pTouchEventPreviewer->OnPreviewMousePressed(*pTarget, mouseInfo);
1003 case _TOUCH_RELEASED:
1004 eventDelivery = pTouchEventPreviewer->OnPreviewMouseReleased(*pTarget, mouseInfo);
1008 eventDelivery = pTouchEventPreviewer->OnPreviewMouseMoved(*pTarget, mouseInfo);
1012 eventDelivery = pTouchEventPreviewer->OnPreviewMouseWheeled(*pTarget, mouseInfo);
1020 if (eventDelivery != _UI_TOUCH_EVENT_DELIVERY_NO)
1022 // isFiltered = (eventDelivery == _UI_TOUCH_EVENT_DELIVERY_FORCED_YES);
1025 if (eventDelivery == _UI_TOUCH_EVENT_DELIVERY_FORCED_YES)
1027 __pForcedControlList->Add(const_cast<_Control*>(pControl));
1039 _UiMouseEvent::ProcessGesture(const _Control& control, bool& isFiltered)
1041 if (control.IsSendingDelayedEvent())
1046 IListT<_TouchGestureDetector*>* pGestureList = control.GetGestureDetectorList();
1047 if (!pGestureList || (pGestureList && (pGestureList->GetCount() <= 0)))
1052 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
1053 SysTryReturn(NID_UI, pEnumerator, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1055 while (pEnumerator->MoveNext() == E_SUCCESS)
1057 _TouchGestureDetector* pGestureDetector = null;
1058 pEnumerator->GetCurrent(pGestureDetector);
1060 if (!pGestureDetector)
1065 _ITouchGestureDelegate* pDelegator = pGestureDetector->GetDelegate();
1068 FireListener(pDelegator, &control, false, isFiltered);
1077 _UiMouseEvent::GetRelativePoint(const _Control& control, const FloatPoint& point) const
1079 FloatPoint relativePoint(point);
1080 FloatRectangle absRect = control.GetAbsoluteBoundsF();
1082 relativePoint.x -= absRect.x;
1083 relativePoint.y -= absRect.y;
1085 return relativePoint;
1089 _UiMouseEvent::ResetTouchInfo(const _Control* pControl, const _MouseInfo& mouseInfo)
1091 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1092 SysTryReturnResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] System error occurred. ");
1094 if (pControl == null)
1096 if (mouseInfo.GetTouchStatus() == _TOUCH_RELEASED)
1098 pTouchManager->ResetTouchInfo();
1104 return E_INVALID_CONDITION;
1108 _UiMouseEvent::ExistGlobalGesture(void)
1110 _ControlManager* pControlManager = _ControlManager::GetInstance();
1111 SysTryReturn(NID_UI, pControlManager, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
1115 IListT<_TouchGestureDetector*>* pGestureList = pControlManager->GetGestureDetectorList();
1116 if (pGestureList && (pGestureList->GetCount() > 0))