2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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"
36 using namespace std::tr1;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Graphics;
40 namespace Tizen { namespace Ui
42 _TouchInfo::_TouchInfo(void)
44 , __touchStatus(_TOUCH_PRESSED)
45 , __currentPosition(0, 0)
51 _TouchInfo::_TouchInfo(unsigned long pointId, _TouchStatus status, const Tizen::Graphics::Point& current, const bool isFlick, long long timeStamp)
53 , __touchStatus(status)
54 , __currentPosition(current)
55 , __isFlicked(isFlick)
56 , __timeStamp(timeStamp)
60 _TouchInfo::_TouchInfo(const _TouchInfo& rhs)
61 : __pointId(rhs.__pointId)
62 , __touchStatus(rhs.__touchStatus)
63 , __currentPosition(rhs.__currentPosition)
64 , __isFlicked(rhs.__isFlicked)
65 , __timeStamp(rhs.__timeStamp)
70 _TouchInfo::operator =(const _TouchInfo& rhs)
74 __pointId = rhs.__pointId;
75 __touchStatus = rhs.__touchStatus;
76 __currentPosition = rhs.__currentPosition;
77 __isFlicked = rhs.__isFlicked;
78 __timeStamp = rhs.__timeStamp;
84 _TouchInfo::~_TouchInfo(void)
89 _TouchInfo::GetTouchStatus(void) const
94 Tizen::Graphics::Point
95 _TouchInfo::GetCurrentPosition(void) const
97 return __currentPosition;
101 _TouchInfo::GetPointId(void) const
107 _TouchInfo::IsFlicked(void) const
113 _TouchInfo::GetTimeStamp(void) const
119 _TouchInfo::SetTouchInfo(unsigned long pointId, _TouchStatus status, Tizen::Graphics::Point& current, bool isFlick, long long timeStamp)
122 __touchStatus = status;
123 __currentPosition = current;
124 __isFlicked = isFlick;
125 __timeStamp = timeStamp;
128 _UiTouchEvent::_UiTouchEvent(const _UiObjectHandle& destination, const _TouchInfo& touchInfo, _UiEventRouteType routeType, const _UiObjectHandle& source)
129 : _UiEvent(destination, source, routeType)
130 , __touchInfo(touchInfo)
131 , __pForcedGestureList(new (std::nothrow) LinkedListT<_Control*>)
135 _UiTouchEvent::~_UiTouchEvent(void)
139 _UiTouchEvent::_UiTouchEvent(const _UiTouchEvent& rhs)
141 , __touchInfo(rhs.__touchInfo)
142 , __pForcedGestureList(rhs.__pForcedGestureList)
147 _UiTouchEvent::operator =(const _UiTouchEvent& rhs)
149 _UiEvent::operator =(rhs);
153 __touchInfo = rhs.__touchInfo;
154 __pForcedGestureList = rhs.__pForcedGestureList;
161 _UiTouchEvent::GetTouchInfo(void) const
167 _UiTouchEvent::CloneN(void) const
169 return new (std::nothrow) _UiTouchEvent(*this);
173 _UiTouchEvent::GetEventType(void) const
175 return _UI_EVENT_TOUCH;
179 _UiTouchEvent::OnPreviewEventProcessing(const _Control& control, bool& isFiltered)
181 result r = E_SUCCESS;
183 const _TouchInfo* pTouchInfo = GetTouchInfo();
184 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
186 if (!control.IsInputEnabled() && pTouchInfo->GetTouchStatus() != _TOUCH_CANCELED)
191 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
193 _ITouchEventPreviewer* pTouchEventPreviewer = control.GetEventPreviewer<_UI_EVENT_TOUCH, _ITouchEventPreviewer*>();
194 SysTryReturn(NID_UI, pTouchEventPreviewer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
196 r = FirePreviewListener(pTouchEventPreviewer, &control, isFiltered);
203 _UiTouchEvent::OnEventProcessing(const _Control& control, bool& isFiltered)
205 result r = E_SUCCESS;
207 bool doesControlExist = false;
209 const _TouchInfo* pTouchInfo = GetTouchInfo();
210 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
212 if (!control.IsInputEnabled() && pTouchInfo->GetTouchStatus() != _TOUCH_CANCELED)
217 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
219 ProcessGesture(control, isFiltered);
223 doesControlExist = __pForcedGestureList->Contains(const_cast<_Control*>(&control));
225 if (doesControlExist)
227 bool isForcedFiltered = false;
228 ProcessGesture(control, isForcedFiltered);
230 if (isForcedFiltered)
237 if ((!ExistGlobalGesture() || GetAccessibilityEvent()) && !isFiltered)
239 _ITouchEventListener* pTouchEventListener = control.GetPropagatedTouchEventListener();
240 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
242 r = FireListener(pTouchEventListener, &control, true, isFiltered);
249 _UiTouchEvent::OnListenerProcessing(const _IUiEventListener& listener, bool& isFiltered)
251 _ITouchEventListener* pTouchEventListener = dynamic_cast <_ITouchEventListener*>(const_cast <_IUiEventListener*>(&listener));
252 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
254 return FireListener(pTouchEventListener, null, true, isFiltered);
258 _UiTouchEvent::OnEventHandled(const _Control& control)
260 _Control* pTarget = const_cast<_Control*>(GetControl(GetDestination()));
261 SysTryReturn(NID_UI, pTarget, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
263 const _TouchInfo* pTouchInfo = GetTouchInfo();
264 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
266 result r = E_SUCCESS;
268 switch (pTouchInfo->GetTouchStatus())
271 pTarget->GetPropagatedTouchEventListener()->OnTouchPressHandled(control);
275 pTarget->GetPropagatedTouchEventListener()->OnTouchMoveHandled(control);
278 case _TOUCH_RELEASED:
279 pTarget->GetPropagatedTouchEventListener()->OnTouchReleaseHandled(control);
282 case _TOUCH_CANCELED:
283 pTarget->GetPropagatedTouchEventListener()->OnTouchCancelHandled(control);
295 _UiTouchEvent::FireListener(const _ITouchEventListener* pListener, const _Control* pControl, bool isTouchEvent, bool& isFiltered)
297 _ITouchEventListener* pTouchEventListener = const_cast <_ITouchEventListener*>(pListener);
298 SysTryReturn(NID_UI, pTouchEventListener, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
300 result r = E_SUCCESS;
302 const _TouchInfo* pTouchInfo = GetTouchInfo();
303 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
305 const _Control* pTarget = GetControl(GetOriginalDestination());
308 SysLog(NID_UI, "pTarget == null, Call ResetTouchInfo.");
309 _TouchManager* pTouchManager = _TouchManager::GetInstance();
310 pTouchManager->ResetTouchInfo();
316 if (ResetTouchInfo(pTarget, *pTouchInfo) == E_SUCCESS)
326 _TouchManager* pTouchManager = _TouchManager::GetInstance();
327 SysAssert(pTouchManager != null)
329 point = GetRelativePoint(*pControl, pTouchInfo->GetCurrentPosition());
331 if (isTouchEvent && (pTouchInfo->GetTouchStatus() != _TOUCH_CANCELED))
333 if (!pTouchManager->IsTouchAllowed() || (pTouchManager->IsTouchAllowed() && pTouchManager->IsTouchCanceledOnGestureSuccess())
334 || (!pControl->IsMultiTouchEnabled() && pTouchInfo->GetPointId() > 0))
343 point = GetRelativePoint(*pTarget, pTouchInfo->GetCurrentPosition());
346 _TouchInfo touchInfo(pTouchInfo->GetPointId(), pTouchInfo->GetTouchStatus(), point, false, pTouchInfo->GetTimeStamp());
348 switch (touchInfo.GetTouchStatus())
351 isFiltered = pTouchEventListener->OnTouchPressed(*pTarget, touchInfo);
354 case _TOUCH_RELEASED:
355 isFiltered = pTouchEventListener->OnTouchReleased(*pTarget, touchInfo);
359 isFiltered = pTouchEventListener->OnTouchMoved(*pTarget, touchInfo);
362 // 2.0 compatibility for touch simulate
363 case _TOUCH_LONG_PRESSED:
365 case _TOUCH_DOUBLE_PRESSED:
367 void* pData = pTarget->GetUserData();
370 _ControlImpl* pTargetImpl = static_cast<_ControlImpl*>(pData);
373 pTargetImpl->GenerateTouchEvent(touchInfo);
379 case _TOUCH_CANCELED:
380 isFiltered = pTouchEventListener->OnTouchCanceled(*pTarget, touchInfo);
391 _UiTouchEvent::FirePreviewListener(const _ITouchEventPreviewer* pListener, const _Control* pControl, bool& isFiltered)
393 _ITouchEventPreviewer* pTouchEventPreviewer = const_cast <_ITouchEventPreviewer*>(pListener);
394 SysTryReturn(NID_UI, pTouchEventPreviewer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
396 result r = E_SUCCESS;
398 const _TouchInfo* pTouchInfo = GetTouchInfo();
399 SysTryReturn(NID_UI, pTouchInfo, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
401 const _Control* pTarget = GetControl(GetDestination());
403 Point point = GetRelativePoint(*pControl, pTouchInfo->GetCurrentPosition());
405 _TouchInfo touchInfo(pTouchInfo->GetPointId(), pTouchInfo->GetTouchStatus(), point, false, pTouchInfo->GetTimeStamp());
407 _UiTouchEventDelivery eventDelivery = _UI_TOUCH_EVENT_DELIVERY_NO;
409 //condition 1) if target is not enabled multi touch, point id should be 0
410 //2) target is enabled multi touch
411 switch (touchInfo.GetTouchStatus())
414 eventDelivery = pTouchEventPreviewer->OnPreviewTouchPressed(*pTarget, touchInfo);
418 case _TOUCH_RELEASED:
419 eventDelivery = pTouchEventPreviewer->OnPreviewTouchReleased(*pTarget, touchInfo);
424 eventDelivery = pTouchEventPreviewer->OnPreviewTouchMoved(*pTarget, touchInfo);
428 case _TOUCH_CANCELED:
429 eventDelivery = pTouchEventPreviewer->OnPreviewTouchCanceled(*pTarget, touchInfo);
437 if (eventDelivery != _UI_TOUCH_EVENT_DELIVERY_NO)
439 // isFiltered = (eventDelivery == _UI_TOUCH_EVENT_DELIVERY_FORCED_YES);
442 if (eventDelivery == _UI_TOUCH_EVENT_DELIVERY_FORCED_YES)
444 __pForcedGestureList->Add(const_cast<_Control*>(pControl));
456 _UiTouchEvent::ProcessGesture(const _Control& control, bool& isFiltered)
458 if (control.IsSendingDelayedEvent())
463 IListT<_TouchGestureDetector*>* pGestureList = control.GetGestureDetectorList();
464 if (!pGestureList || (pGestureList && (pGestureList->GetCount() <= 0)))
469 IEnumeratorT<_TouchGestureDetector*>* pEnumerator = pGestureList->GetEnumeratorN();
470 SysTryReturn(NID_UI, pEnumerator, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] System error occurred.");
472 while (pEnumerator->MoveNext() == E_SUCCESS)
474 _TouchGestureDetector* pGestureDetector = null;
475 pEnumerator->GetCurrent(pGestureDetector);
477 if (!pGestureDetector)
482 _ITouchGestureDelegate* pDelegator = pGestureDetector->GetDelegate();
485 FireListener(pDelegator, &control, false, isFiltered);
494 _UiTouchEvent::GetRelativePoint(const _Control& control, const Point& point) const
496 Point relativePoint(point);
497 Rectangle absRect = control.GetAbsoluteBounds();
499 relativePoint.x -= absRect.x;
500 relativePoint.y -= absRect.y;
502 return relativePoint;
506 _UiTouchEvent::ResetTouchInfo(const _Control* pControl, const _TouchInfo& touchInfo)
508 _TouchManager* pTouchManager = _TouchManager::GetInstance();
509 SysTryReturnResult(NID_UI, pTouchManager, E_SYSTEM, "[E_SYSTEM] System error occurred. ");
511 if (pControl == null)
513 if (touchInfo.GetTouchStatus() == _TOUCH_RELEASED)
515 pTouchManager->ResetTouchInfo();
521 return E_INVALID_CONDITION;
525 _UiTouchEvent::ExistGlobalGesture(void)
527 _ControlManager* pControlManager = _ControlManager::GetInstance();
528 SysTryReturn(NID_UI, pControlManager, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
532 IListT<_TouchGestureDetector*>* pGestureList = pControlManager->GetGestureDetectorList();
533 if (pGestureList && (pGestureList->GetCount() > 0))