add listenerOnly flg for indicator touch behavior, fix VE type window touch bug
authorminkyu kim <imetjade.kim@samsung.com>
Thu, 29 Aug 2013 03:05:15 +0000 (12:05 +0900)
committerminkyu kim <imetjade.kim@samsung.com>
Thu, 29 Aug 2013 03:05:15 +0000 (12:05 +0900)
Change-Id: I98f8385f0ae64cc5de0040b0693f8d2cbec047e7

src/ui/FUi_EflUiEventManager.cpp
src/ui/FUi_TouchManager.cpp
src/ui/inc/FUi_TouchManager.h

index ba83930..e567db6 100644 (file)
@@ -638,7 +638,8 @@ public:
 
                if (status == _TOUCH_PRESSED)
                {
-                       _Control* pControl = GetTarget(current.x, current.y, pRootControl);
+                       pTouchManager->SetListenerOnly(pointId, false);
+                       _Control* pControl = GetTarget(current.x, current.y, pRootControl, pointId);
 
                        if (pControl == null)
                        {
@@ -713,76 +714,114 @@ private:
        _TouchEvent(const _TouchEvent& rhs);
        _TouchEvent& operator =(const _TouchEvent& rhs);
 
-       _Control* GetTarget(int x, int y, const _Control* pRootControl) const
+       _Control* GetTarget(int x, int y, const _Control* pRootControl, int pointId) const
        {
                ClearLastResult();
 
                _TouchManager* pTouchManager = _TouchManager::GetInstance();
                SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
 
-               _Control* pCapturedControl = pTouchManager->GetCapturedControl();
-               _Control* pControl = null;
-
                _ControlManager* pControlManager = _ControlManager::GetInstance();
                SysTryReturn(NID_UI, pControlManager, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
 
+               _Control* pControl = null;
+
                Tizen::Graphics::FloatPoint ptf(static_cast<float>(x), static_cast<float>(y));
 
-               _ControlVisualElement* pRootControlElement = null;
                if (pRootControl)
                {
-                       pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
+                       _ControlVisualElement* pRootControlElement = dynamic_cast<_ControlVisualElement*>(pRootControl->GetVisualElement());
+                       if (pRootControlElement == null)
+                       {
+                               SetLastResult(E_SYSTEM);
+                               return null;
+                       }
+
+                       _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
+                       if (pControlVisualElement)
+                       {
+                               pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
+                       }
                }
                else
                {
-                       _Window* pWindow = null;
-                       pWindow = pControlManager->GetTouchedWindow();
-                       if (pWindow == null)
+                       _Window* pTouchedWindow = pControlManager->GetTouchedWindow();
+                       if (pTouchedWindow == null)
                        {
                                SetLastResult(E_SYSTEM);
                                return null;
                        }
 
-                       int owneeCount = pWindow->GetOwneeCount();
-                       if (owneeCount > 0)
+                       _RootVisualElement* pRootVisualElement = pTouchedWindow->GetRootVisualElement();
+                       if (pRootVisualElement == null)
                        {
-                               _Window* pOwneeWindow = null;
+                               SetLastResult(E_SYSTEM);
+                               return null;
+                       }
+
+                       Tizen::Graphics::Rectangle touchedWindowBounds = pTouchedWindow->GetBounds();
+                       ptf.x = static_cast<float>(x - touchedWindowBounds.x);
+                       ptf.y = static_cast<float>(y - touchedWindowBounds.y);
 
-                               for(int i =owneeCount-1; i>=0; i--)
+                       Tizen::Base::Collection::IList* pList = pRootVisualElement->GetChildrenN();
+                       if (!pList)
+                       {
+                               SetLastResult(E_SYSTEM);
+                               return null;
+                       }
+
+                       int count = pList->GetCount();
+                       for (int i = count-1; i>=0; i--)
+                       {
+                               _ControlVisualElement* pChildControlVisualElement = dynamic_cast<_ControlVisualElement*>(pList->GetAt(i));
+                               if (pChildControlVisualElement)
                                {
-                                       pOwneeWindow = pWindow->GetOwnee(i);
-                                       if (pOwneeWindow && pOwneeWindow->GetVisibleState() == true && pOwneeWindow->GetEnableState())
+                                       _Control* pChildControl = static_cast<_Control*>(pChildControlVisualElement->GetUserData());
+                                       if (pChildControl == null)
                                        {
-                                               Tizen::Graphics::Rectangle rc(pOwneeWindow->GetAbsoluteBounds(true));
-                                               if ((x >= rc.x) && (x <= (rc.x + rc.width)) && (y >= rc.y) && (y <= (rc.y + rc.height)))
+                                               continue;
+                                       }
+
+                                       _Window* pChildWindow = dynamic_cast<_Window*>(pChildControl);
+                                       if (pChildWindow == null)
+                                       {
+                                               continue;
+                                       }
+
+                                       Tizen::Graphics::FloatPoint tempPoint(ptf);
+
+                                       if (pChildWindow && pChildWindow->GetWindowType() == _WINDOW_TYPE_VE)
+                                       {
+                                               Tizen::Graphics::Rectangle windowBounds = pChildWindow->GetBounds();
+                                               tempPoint.x = static_cast<float>(tempPoint.x - windowBounds.x);
+                                               tempPoint.y = static_cast<float>(tempPoint.y - windowBounds.y);
+                                       }
+
+                                       _ControlVisualElement* pControlVisualElement = pChildControlVisualElement->GetControlChildAtPoint(tempPoint);
+                                       if (pControlVisualElement)
+                                       {
+                                               pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
+                                               if (pControl == null)
+                                               {
+                                                       pControl = dynamic_cast<_Control*>(pTouchedWindow);
+                                                       pTouchManager->SetListenerOnly(pointId, true);
+                                                       if (pList)
+                                                       {
+                                                               delete pList;
+                                                       }
+                                                       return pControl;
+                                               }
+                                               else
                                                {
-                                                       pWindow = pOwneeWindow;
                                                        break;
                                                }
                                        }
                                }
                        }
-
-                       Rectangle winBounds = pWindow->GetBounds();
-
-                       ptf.x = static_cast<float>(x - winBounds.x);
-                       ptf.y = static_cast<float>(y - winBounds.y);
-
-                       pRootControlElement = dynamic_cast <_ControlVisualElement*>(pWindow->GetVisualElement());
-               }
-
-               if (pRootControlElement == null)
-               {
-                       SetLastResult(E_SYSTEM);
-                       return null;
-               }
-
-               _ControlVisualElement* pControlVisualElement = pRootControlElement->GetControlChildAtPoint(ptf);
-               if (pControlVisualElement)
-               {
-                       pControl = static_cast <_Control*>(pControlVisualElement->GetUserData());
+                       delete pList;
                }
 
+               _Control* pCapturedControl = pTouchManager->GetCapturedControl();
                if (pCapturedControl)
                {
                        if (pTouchManager->IsCaptureAllowedOwnerBounds())
index dc6ab35..c5077c5 100644 (file)
@@ -618,6 +618,11 @@ _TouchManager::_TouchManager(void)
        r = pEventManager->AddTouchEventListener(*__pTouchEventListener);
        SysTryCatch(NID_UI, r == E_SUCCESS, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
+       for (int i = 0; i<999; i++)
+       {
+               __listenerOnly[i] = false;
+       }
+
        return;
 
 CATCH:
@@ -971,6 +976,18 @@ _TouchManager::IsTouchAllowed(void)
        return __touchAllowed;
 }
 
+void
+_TouchManager::SetListenerOnly(int pointId, bool listenerOnly)
+{
+       __listenerOnly[pointId] = listenerOnly;
+}
+
+bool
+_TouchManager::IsListenerOnly(int pointId)
+{
+       return __listenerOnly[pointId];
+}
+
 bool
 _TouchManager::IsInTouchMoveAllowanceBounds(const _Control& source, const _TouchInfo& touchInfo)
 {
index 333f67d..74044ac 100644 (file)
@@ -388,6 +388,10 @@ public:
 
        _Control* GetChangedTouchableTarget(void);
 
+       void SetListenerOnly(int pointId, bool listenerOnly);
+
+       bool IsListenerOnly(int pointId);
+
 private:
        /**
        * This is the default class constructor.
@@ -426,6 +430,7 @@ private:
        bool __captureAllowOwnerBounds;
        bool __isSendingDelayedEvent;
        bool __touchCanceledOnGestureSuccess;
+       bool __listenerOnly[999];
        _Control* __changedTouchableTarget;
 }; // _TouchManager