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_KeyEventManagerImpl.cpp
19 * @brief This is the implementation file for _KeyEventManagerImpl class.
21 * @see Tizen::Ui::_KeyEventManagerImpl
27 #include <FBaseColIEnumeratorT.h>
28 #include <FBaseRtIEventListener.h>
29 #include <FUiIKeyEventListener.h>
30 #include <FUiControl.h>
31 #include <FBaseSysLog.h>
32 #include "FUi_KeyEventManagerImpl.h"
33 #include "FUi_ControlImpl.h"
34 #include "FUi_Control.h"
35 #include "FUi_KeyEventManager.h"
38 using namespace Tizen::Ui;
40 namespace Tizen { namespace Ui
43 ////////////////////////////////////////////////////////////////////////////////
44 /// _KeyEventManagerImpl class Lifecycle
46 class _KeyEventManagerImpl::PublicEventListener
47 : public _IKeyEventListener
48 , virtual public _IUiEventListener
49 , virtual public Tizen::Base::Runtime::IEventListener
52 PublicEventListener(_KeyEventManagerImpl& mgrImpl)
53 : __keyMgrImpl(mgrImpl)
57 virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
59 if (keyInfo.GetKeyCode() > _KEY_HARDWARE_MAX)
64 Tizen::Base::Collection::IEnumeratorT<IKeyEventListener*>* pEnum = __keyMgrImpl.__pPublicKeyEventListeners->GetEnumeratorN();
65 _ControlImpl* pImpl = static_cast<_ControlImpl*>(source.GetUserData());
66 SysTryCatch(NID_UI, pImpl != null, , E_SYSTEM, "[E_SYSTEM] System error occurred. ");
70 while (pEnum->MoveNext() == E_SUCCESS)
72 IKeyEventListener* pKeyEventListener = null;
73 pEnum->GetCurrent(pKeyEventListener);
75 if (pKeyEventListener != null)
77 pKeyEventListener->OnKeyPressed(pImpl->GetPublic(), static_cast<KeyCode>(keyInfo.GetKeyCode()));
90 virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
92 if (keyInfo.GetKeyCode() > _KEY_HARDWARE_MAX)
97 Tizen::Base::Collection::IEnumeratorT<IKeyEventListener*>* pEnum = __keyMgrImpl.__pPublicKeyEventListeners->GetEnumeratorN();
98 _ControlImpl* pImpl = static_cast<_ControlImpl*>(source.GetUserData());
99 SysTryCatch(NID_UI, pImpl != null, , E_SYSTEM, "[E_SYSTEM] System error occurred. ");
103 while (pEnum->MoveNext() == E_SUCCESS)
105 IKeyEventListener* pKeyEventListener = null;
106 pEnum->GetCurrent(pKeyEventListener);
108 if (pKeyEventListener != null)
110 pKeyEventListener->OnKeyReleased(pImpl->GetPublic(), static_cast<KeyCode>(keyInfo.GetKeyCode()));
124 PublicEventListener(const PublicEventListener&);
125 PublicEventListener& operator =(const PublicEventListener&);
128 _KeyEventManagerImpl& __keyMgrImpl;
132 _KeyEventManagerImpl* _KeyEventManagerImpl::__pInstance = null;
134 _KeyEventManagerImpl::_KeyEventManagerImpl(void)
136 __pPublicKeyEventListeners = new (std::nothrow) Tizen::Base::Collection::LinkedListT <IKeyEventListener*>;
137 SysTryReturnVoidResult(NID_UI, __pPublicKeyEventListeners, E_OUT_OF_MEMORY,
138 "[E_OUT_OF_MEMORY] Memory allocation failed.");
140 __pKeyEventListeners = new (std::nothrow) PublicEventListener(*this);
141 SysTryReturnVoidResult(NID_UI, __pKeyEventListeners, E_OUT_OF_MEMORY,
142 "[E_OUT_OF_MEMORY] Memory allocation failed.");
144 _KeyEventManager* pKeyMgr = _KeyEventManager::GetInstance();
145 SysTryReturnVoidResult(NID_UI, pKeyMgr, E_SYSTEM,
146 "[E_SYSTEM] pKeyMgr == null");
148 pKeyMgr->AddKeyEventListener(*__pKeyEventListeners);
151 _KeyEventManagerImpl::~_KeyEventManagerImpl(void)
153 if (__pPublicKeyEventListeners)
155 delete __pPublicKeyEventListeners;
156 __pPublicKeyEventListeners = null;
159 if (__pKeyEventListeners)
161 delete __pKeyEventListeners;
162 __pKeyEventListeners = null;
167 _KeyEventManagerImpl::Initialize(void)
169 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
171 if (__pInstance == null)
173 pthread_once(&once_block, InitializeInstance);
177 _KeyEventManagerImpl*
178 _KeyEventManagerImpl::GetInstance(void)
184 _KeyEventManagerImpl::InitializeInstance(void)
188 if (__pInstance == null)
190 __pInstance = new (std::nothrow) _KeyEventManagerImpl;
191 SysTryReturnVoidResult(NID_UI, __pInstance != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
196 _KeyEventManagerImpl::ReleaseInstance(void)
205 ////////////////////////////////////////////////////////////////////////////////
206 /// KeyEventManager class Operation
209 _KeyEventManagerImpl::AddKeyEventListener(IKeyEventListener& listener)
211 __pPublicKeyEventListeners->Add(&listener);
216 _KeyEventManagerImpl::RemoveKeyEventListener(IKeyEventListener& listener)
218 __pPublicKeyEventListeners->Remove(&listener);
222 _KeyEventManagerImpl::GetKeyCapturingControl(KeyCode keyCode) const
224 _KeyEventManager* pKeyEventManager = _KeyEventManager::GetInstance();
225 SysAssert(pKeyEventManager != null);
227 _Control* pCapturedControl = pKeyEventManager->GetCapturingControl(static_cast<_KeyCode>(keyCode));
228 if (pCapturedControl)
230 _ControlImpl* pControlImpl = static_cast<_ControlImpl*>(pCapturedControl->GetUserData());