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_KeyEventManager.cpp
19 * @brief This is the implementation file for _KeyEventManager class.
21 * @see Tizen::Ui::_KeyEventManager
27 #include <FBaseColIEnumeratorT.h>
28 #include <FBaseRtIEventListener.h>
29 #include <FUiControl.h>
30 #include <FBaseSysLog.h>
32 #include "FUi_KeyEventManager.h"
33 #include "FUi_KeyEventManagerImpl.h"
34 #include "FUi_Control.h"
35 #include "FUi_ControlImpl.h"
36 #include "FUi_ControlManager.h"
37 #include "FUi_IKeyEventListener.h"
38 #include "FUi_UiEventManager.h"
39 #include "FUi_UiKeyEvent.h"
42 using namespace Tizen::Ui;
43 using namespace Tizen::Base::Collection;
47 class _KeyEventListener
48 : public _IKeyEventListener
49 , virtual public _IUiEventListener
50 , virtual public Tizen::Base::Runtime::IEventListener
53 _KeyEventListener(void)
57 virtual ~_KeyEventListener(void)
61 virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
63 _KeyEventManager* pKeyManager = _KeyEventManager::GetInstance();
64 SysTryReturn(NID_UI, pKeyManager, false, E_SYSTEM, "[E_SYSTEM] System error occurred. ");
66 LinkedListT<Tizen::Ui::_IKeyEventListener*>* pList = pKeyManager->GetKeyEventListener();
68 bool isFiltered = false;
72 IEnumeratorT<_IKeyEventListener*>* pEnumerator = pList->GetEnumeratorN();
76 while (pEnumerator->MoveNext() == E_SUCCESS)
78 _IKeyEventListener* pKeyEventListener = null;
79 pEnumerator->GetCurrent(pKeyEventListener);
81 if (pKeyEventListener != null)
83 isFiltered = pKeyEventListener->OnKeyPressed(source, keyInfo);
86 //only call first key listener
87 if (keyInfo.GetKeyCode() == _KEY_END)
100 virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
102 _KeyEventManager* pKeyManager = _KeyEventManager::GetInstance();
103 SysTryReturn(NID_UI, pKeyManager, false, E_SYSTEM, "[E_SYSTEM] System error occurred. ");
105 LinkedListT<Tizen::Ui::_IKeyEventListener*>* pList = pKeyManager->GetKeyEventListener();
106 bool isFiltered = false;
110 IEnumeratorT<_IKeyEventListener*>* pEnumerator = pList->GetEnumeratorN();
114 while (pEnumerator->MoveNext() == E_SUCCESS)
116 _IKeyEventListener* pKeyEventListener = null;
117 pEnumerator->GetCurrent(pKeyEventListener);
119 if (pKeyEventListener != null)
121 isFiltered = pKeyEventListener->OnKeyReleased(source, keyInfo);
124 //only call first key listener
125 if (keyInfo.GetKeyCode() == _KEY_END)
141 namespace Tizen { namespace Ui
144 _KeyEventManager* _KeyEventManager::__pInstance = null;
146 _KeyEventManager::_KeyEventManager(void)
147 : __pKeyEventListeners(null)
148 , __pKeyEventListener(null)
149 , __pKeyCapturingMap(null)
151 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
152 SysTryReturnVoidResult(NID_UI, pEventManager, E_SYSTEM, "[E_SYSTEM] System error occurred.");
154 __pKeyEventListener = new (std::nothrow)_KeyEventListener;
155 SysTryReturnVoidResult(NID_UI, __pKeyEventListener, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
157 __pKeyCapturingMap = new (std::nothrow) HashMapT<_KeyCode, _ControlHandle>;
158 SysTryCatch(NID_UI, __pKeyCapturingMap, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
159 SysTryCatch(NID_UI, __pKeyCapturingMap->Construct() == E_SUCCESS, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
161 __pKeyEventListeners = new (std::nothrow) LinkedListT<Tizen::Ui::_IKeyEventListener*>;
162 SysTryCatch(NID_UI, __pKeyEventListeners, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
164 pEventManager->AddKeyEventListener(*__pKeyEventListener);
169 if (__pKeyEventListener)
171 delete __pKeyEventListener;
172 __pKeyEventListener = null;
175 if (__pKeyCapturingMap)
177 delete __pKeyCapturingMap;
178 __pKeyCapturingMap = null;
182 _KeyEventManager::~_KeyEventManager(void)
184 if (__pKeyEventListeners)
186 delete __pKeyEventListeners;
187 __pKeyEventListeners = null;
190 if (__pKeyEventListener)
192 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
195 pEventManager->RemoveKeyEventListener(*__pKeyEventListener);
198 delete __pKeyEventListener;
199 __pKeyEventListener = null;
202 if (__pKeyCapturingMap)
204 delete __pKeyCapturingMap;
205 __pKeyCapturingMap = null;
210 _KeyEventManager::Initialize(void)
212 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
214 if (__pInstance == null)
216 pthread_once(&once_block, InitializeInstance);
221 _KeyEventManager::GetInstance(void)
227 _KeyEventManager::InitializeInstance(void)
231 if (__pInstance == null)
233 __pInstance = new (std::nothrow) _KeyEventManager;
234 SysTryReturnVoidResult(NID_UI, __pInstance != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
239 _KeyEventManager::ReleaseInstance(void)
249 _KeyEventManager::AddKeyEventListener(const _IKeyEventListener& listener)
251 __pKeyEventListeners->Add(const_cast<_IKeyEventListener*>(&listener));
256 _KeyEventManager::RemoveKeyEventListener(const _IKeyEventListener& listener)
258 __pKeyEventListeners->Remove(const_cast<_IKeyEventListener*>(&listener));
261 LinkedListT<Tizen::Ui::_IKeyEventListener*>*
262 _KeyEventManager::GetKeyEventListener(void) const
264 return __pKeyEventListeners;
268 _KeyEventManager::GetCapturingControl(_KeyCode keyCode) const
270 _ControlManager* pControlManager = _ControlManager::GetInstance();
271 SysAssert(pControlManager != null);
273 _ControlHandle handle;
274 __pKeyCapturingMap->GetValue(keyCode, handle);
275 return pControlManager->GetObject(handle);
279 _KeyEventManager::SetCapturingControl(const _Control& control, _KeyCode keyCode, bool captureAllowed)
284 __pKeyCapturingMap->ContainsKey(keyCode, exist);
288 __pKeyCapturingMap->Remove(keyCode);
291 __pKeyCapturingMap->Add(keyCode, control.GetHandle());
295 __pKeyCapturingMap->Add(keyCode, _ControlHandle());