modify license, permission and remove ^M char
[platform/framework/native/uifw.git] / src / ui / FUi_EflUiEventManager.cpp
index 0332129..0e6ac6d 100644 (file)
@@ -2,14 +2,14 @@
 // Open Service Platform
 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
 //
-// Licensed under the Flora License, Version 1.0 (the License);
+// Licensed under the Apache License, Version 2.0 (the License);
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://floralicense.org/license/
+//     http://www.apache.org/licenses/LICENSE-2.0/
 //
 // Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an AS IS BASIS,
+// distributed under the License is distributed on an ”AS IS” BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
@@ -429,17 +429,60 @@ public:
                return pControlManager->GetObject(controlHandle);
        }
 
+       result AddParentControl(int pointId, const _ControlHandle& controlHandle)
+       {
+               bool exist = false;
+               result r = E_SUCCESS;
+
+               __pParentTargetMap->ContainsKey(pointId, exist);
+
+               if (exist)
+               {
+                       r = __pParentTargetMap->Remove(pointId);
+                       SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+               }
+
+               r = __pParentTargetMap->Add(pointId, controlHandle);
+               SysTryReturnResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+
+               return r;
+       }
+
+       _Control* GetParentControl(int pointId)
+       {
+               SysTryReturn(NID_UI, __pParentTargetMap, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+
+               _ControlHandle controlHandle;
+
+               __pParentTargetMap->GetValue(pointId, controlHandle);
+
+               _ControlManager* pControlManager = _ControlManager::GetInstance();
+               result r = GetLastResult();
+               SysTryReturn(NID_UI, pControlManager, null, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               return pControlManager->GetObject(controlHandle);
+       }
+
 private:
        _TouchEventManager(void)
        {
+               result r = E_SUCCESS;
                unique_ptr<HashMapT<int, _ControlHandle> > pTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
                SysTryReturnVoidResult(NID_UI, pTargetMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
 
-               result r = pTargetMap->Construct();
+               r = pTargetMap->Construct();
                SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
                __pTargetMap = move(pTargetMap);
 
+               unique_ptr<HashMapT<int, _ControlHandle> > pParentTargetMap(new (std::nothrow) HashMapT<int, _ControlHandle>);
+               SysTryReturnVoidResult(NID_UI, pParentTargetMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+
+               r = pParentTargetMap->Construct();
+               SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+               __pParentTargetMap = move(pParentTargetMap);
+
                SetLastResult(E_SUCCESS);
        }
 
@@ -453,6 +496,7 @@ private:
 private:
        static _TouchEventManager* __pInstance;
        unique_ptr<HashMapT<int, _ControlHandle> > __pTargetMap;
+       unique_ptr<HashMapT<int, _ControlHandle> > __pParentTargetMap;
 };
 
 _TouchEventManager* _TouchEventManager::__pInstance = null;
@@ -491,7 +535,7 @@ public:
                                        continue;
                                }
 
-                               if (pFingerInfo->GetDeviceId() == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
+                               if (static_cast<int>(pFingerInfo->GetDeviceId()) == deviceId && pFingerInfo->GetStatus() == _TOUCH_PRESSED)
                                {
                                        pTouchManager->ResetTouchInfo();
                                        SysLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pFingerInfo->GetPointId());
@@ -534,12 +578,19 @@ public:
                        {
                                pTouchManager->ResetTouchInfo();
                                SysLog(NID_UI, "ResetTouchInfo x(%d), y(%d), deviceID(%d), pointID(%d)", current.x, current.y, deviceId, pointId);
-                               ClearLastResult();
+                               SysTryReturnVoidResult(NID_UI, false, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
                        }
                        else
                        {
                                r = __pTouchEventManager->AddControl(pointId, pControl->GetHandle());
                                SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+
+                               _Control* pParent = pControl->GetParent();
+                               if (pParent)
+                               {
+                                       r = __pTouchEventManager->AddParentControl(pointId, pParent->GetHandle());
+                                       SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+                               }
                        }
                }
                else
@@ -605,10 +656,18 @@ private:
                                        pControl = pCapturedControl;
                                }
 
-                               Tizen::Graphics::Rectangle ownerRc((dynamic_cast<_Window*>(pCapturedControl)->GetOwner())->GetAbsoluteBounds());
-                               if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
+                               _Window * pWindow = dynamic_cast<_Window*>(pCapturedControl);
+                               if (pWindow)
                                {
-                                       pControl = dynamic_cast<_Window*>(pCapturedControl)->GetOwner();
+                                       _Control* pOwner = pWindow->GetOwner();
+                                       if (pOwner)
+                                       {
+                                               Tizen::Graphics::Rectangle ownerRc(pOwner->GetAbsoluteBounds());
+                                               if ((x >= ownerRc.x) && (x <= (ownerRc.x + ownerRc.width)) && (y >= ownerRc.y) && (y <= (ownerRc.y + ownerRc.height)))
+                                               {
+                                                       pControl = pOwner;
+                                               }
+                                       }
                                }
 
                                Tizen::Graphics::Rectangle rc(pCapturedControl->GetAbsoluteBounds());
@@ -802,6 +861,29 @@ OnKeyReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
 }
 
 Eina_Bool
+OnClipboardMessageReceived(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
+{
+       Ecore_X_Event_Client_Message *pEv = static_cast<Ecore_X_Event_Client_Message*>(pEventInfo);
+
+       if (pEv->message_type != ecore_x_atom_get("CBHM_MSG"))
+       {
+               return ECORE_CALLBACK_PASS_ON;
+       }
+
+       if (!strcmp("SET_OWNER", pEv->data.b))
+       {
+               _KeyEvent event(KEY_PRESSED, _KEY_OEM_1, 0, pEv);
+               SysLog(NID_UI, "KeyName = clipboard, KeyCode = _KEY_OEM_1, KeyModifier = 0");
+               event.Send();
+
+               SetLastResult(E_SUCCESS);
+       }
+
+       return ECORE_CALLBACK_PASS_ON;
+}
+
+
+Eina_Bool
 OnTouchPressed(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
 {
        Ecore_Event_Mouse_Button* pEv = static_cast <Ecore_Event_Mouse_Button*>(pEventInfo);
@@ -848,7 +930,7 @@ OnTouchReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
        result r = GetLastResult();
        if (r!= E_SUCCESS)
        {
-               SysLogException(NID_UI, E_SUCCESS, "ResetTouchInfo");
+               SysLog(NID_UI, "ResetTouchInfo [%s] Propagating.", GetErrorMessage(r));
                pTouchManager->SetTouchAllowed(false);
                pTouchManager->ResetTouchInfo();
 
@@ -871,14 +953,16 @@ OnTouchReleased(void* pData __UNUSED__, int type __UNUSED__, void* pEventInfo)
                        continue;
                }
 
-               if (pFingerInfo->GetDeviceId() == pEv->multi.device)
-       {
+               if (static_cast<int>(pFingerInfo->GetDeviceId()) == pEv->multi.device)
+               {
                        pFingerInfo->SetPointId(INVALID_POINT_ID);
                        break;
                }
        }
        delete pFingerInfoList;
 
+       pTouchManager->SetChangedTouchableTarget(null);
+
        SetLastResult(E_SUCCESS);
        return ECORE_CALLBACK_PASS_ON;
 }
@@ -1064,6 +1148,7 @@ OnEvasTouchPressed(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEv
        _Control* pControl = static_cast<_Control*>(pData);
        SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
 
+       SysLog(NID_UI, "OnEvasTouchPressed - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
        _TouchEvent event(0, _TOUCH_PRESSED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
 
        result r = GetLastResult();
@@ -1087,6 +1172,7 @@ OnEvasTouchReleased(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pE
        _Control* pControl = static_cast<_Control*>(pData);
        SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
 
+       SysLog(NID_UI, "OnEvasTouchReleased - x(%d), y(%d)", pEv->canvas.x, pEv->canvas.y);
        _TouchEvent event(0, _TOUCH_RELEASED, pEv->canvas.x, pEv->canvas.y, pEv->timestamp, pControl);
 
        result r = GetLastResult();
@@ -1110,6 +1196,7 @@ OnEvasTouchMoved(void* pData, Evas* pEvas, Evas_Object* pEvasObject, void* pEven
        _Control* pControl = static_cast<_Control*>(pData);
        SysTryReturnVoidResult(NID_UI, pControl, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
 
+       SysLog(NID_UI, "OnEvasTouchMoved - x(%d), y(%d)", pEv->cur.canvas.x, pEv->cur.canvas.x);
        _TouchEvent event(0, _TOUCH_MOVED, pEv->cur.canvas.x, pEv->cur.canvas.y, pEv->timestamp, pControl);
 
        result r = GetLastResult();
@@ -1182,6 +1269,12 @@ _EflUiEventManager::_EflUiEventManager(void)
 
        pEventHandlers->Add(pEventHandler);
 
+       // clipboard key
+       pEventHandler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, OnClipboardMessageReceived, null);
+       SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
+
+       pEventHandlers->Add(pEventHandler);
+
        // Touch
        pEventHandler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouchPressed, null);
        SysTryReturnVoidResult(NID_UI, pEventHandler, E_SYSTEM, "[E_SYSTEM] A system error occurred.");