2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0/
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_FocusManagerImpl.cpp
19 * @brief This is the implementation file for _FocusManagerImpl class.
24 #include <unique_ptr.h>
25 #include "FUi_FocusManagerImpl.h"
26 #include "FUi_ControlImpl.h"
27 #include "FUi_WindowImpl.h"
28 #include "FUi_ControlManager.h"
29 #include "FUiCtrl_Form.h"
30 #include "FUi_UiEventManager.h"
31 #include "FUi_ResourceManager.h"
32 #include "FUi_UiKeyEvent.h"
33 #include "FUi_Window.h"
34 #include "FUiCtrl_Frame.h"
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
40 using namespace Tizen::Ui::Controls;
41 using namespace Tizen::Ui::Animations;
43 namespace Tizen { namespace Ui
45 ////////////////////////////////////////////////////////////////////////////////
46 /// _FocusManagerImpl class Lifecycle
47 _FocusManagerImpl* _FocusManagerImpl::__pInstance = null;
49 _FocusManagerImpl::_FocusManagerImpl(void)
51 result r = _UiEventManager::GetInstance()->AddPostKeyEventListener(*this);
52 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
54 r = _UiEventManager::GetInstance()->AddTouchEventListener(*this);
55 SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
59 _FocusManagerImpl::~_FocusManagerImpl(void)
65 _FocusManagerImpl::Initialize(void)
67 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
69 if (__pInstance == null)
71 pthread_once(&once_block, InitializeInstance);
76 _FocusManagerImpl::GetInstance(void)
82 _FocusManagerImpl::InitializeInstance(void)
86 if (__pInstance == null)
88 __pInstance = new (std::nothrow) _FocusManagerImpl;
89 SysTryReturnVoidResult(NID_UI, __pInstance != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
94 _FocusManagerImpl::ReleaseInstance(void)
103 ////////////////////////////////////////////////////////////////////////////////
104 /// _FocusManagerImpl class Operation
107 _FocusManagerImpl::GetCurrentFocusOwner(void) const
109 _Control* pFocus = _ControlManager::GetInstance()->GetFocusedControl();
115 _ControlImpl* pFocusImpl = static_cast <_ControlImpl*>(pFocus->GetUserData());
116 SysAssert(pFocusImpl);
123 _FocusManagerImpl::GetCurrentFocusedWindow(void) const
125 _Control* pFocus = _ControlManager::GetInstance()->GetFocusedControl();
130 _Window* pWindow = pFocus->GetRootWindow();
133 _WindowImpl* pWindowImpl = static_cast <_WindowImpl*>(static_cast <_ControlImpl*>(pWindow->GetUserData()));
134 SysAssert(pWindowImpl);
140 _FocusManagerImpl::GetNextIndex(int currentIndex, FocusDirection focusDirection, const IListT<_Control*>* pFocusControlList) const
142 int nextIndex = currentIndex;
143 if (focusDirection == FOCUS_DIRECTION_DOWNWARD)
146 if (nextIndex == pFocusControlList->GetCount())
156 nextIndex = pFocusControlList->GetCount() - 1;
165 _FocusManagerImpl::IsFocusable(_Control* pControl) const
167 bool isFocusalbe = pControl->IsFocusable();
168 bool enableState = pControl->GetEnableState();
169 bool visibleState = pControl->GetVisibleState();
170 if (enableState && visibleState && isFocusalbe)
178 _FocusManagerImpl::StartFocusTraversal(_Control* pControl, FocusDirection focusDirection)
180 bool focusMode = pControl->IsFocusModeStateEnabled();
181 if (focusMode == false && pControl->IsFocused())
183 if (IsFocusable(pControl))
185 __pCurrentFocusUiControl = pControl;
186 pControl->DrawFocus();
187 pControl->SetFocusModeStateEnabled(true);
192 if (focusDirection == FOCUS_DIRECTION_DOWNWARD)
194 _Control* pFocusControl = pControl->GetNextFocus();
197 pFocusControl->SetFocused();
198 pFocusControl->DrawFocus();
204 _Control* pFocusControl = pControl->GetPreviousFocus();
207 pFocusControl->SetFocused();
208 pFocusControl->DrawFocus();
213 IListT<_Control*>* pFocusControlList = null;
214 _Window* pTop = pControl->GetRootWindow();
217 _Frame* pFrame = dynamic_cast<_Frame*>(pTop);
220 _Form* pForm = pFrame->GetCurrentForm();
221 pFocusControlList = pForm->GetFocusList();
225 pFocusControlList = pTop->GetFocusList();
229 if (pFocusControlList)
231 unique_ptr<IEnumeratorT<_Control*> > pEnum (pFocusControlList->GetEnumeratorN());
232 SysTryReturnVoidResult(NID_UI_CTRL, pEnum, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
234 bool findNextFocusControl = false;
235 _Control* pNextFocusControl = null;
236 while (pEnum->MoveNext() == E_SUCCESS)
238 _Control* pEnumeratorControl = null;
239 pEnum->GetCurrent(pEnumeratorControl);
241 //Find current focused control
242 if (pControl == pEnumeratorControl)
244 //Find next focusable control.
245 index = GetNextIndex(index, focusDirection, pFocusControlList);
247 while (pFocusControlList->GetAt(index, pNextFocusControl) == E_SUCCESS)
249 if (IsFocusable(pNextFocusControl))
251 if (pNextFocusControl != pControl)
253 pNextFocusControl->SetFocused();
254 pNextFocusControl->SetFocusModeStateEnabled(true);
255 pControl->SetFocusModeStateEnabled(false);
257 findNextFocusControl = true;
262 index = GetNextIndex(index, focusDirection, pFocusControlList);
267 if (findNextFocusControl == true)
275 __pCurrentFocusUiControl = pNextFocusControl;
276 if (pNextFocusControl && findNextFocusControl == true)
278 _Control* pParentControl = pNextFocusControl->GetParent();
281 pParentControl->OnChildControlFocusMoved(*pNextFocusControl);
283 pNextFocusControl->DrawFocus();
289 _FocusManagerImpl::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
291 _KeyCode keyCode = keyInfo.GetKeyCode();
293 if(keyCode == _KEY_TAB)
295 FocusDirection focusDirection = FOCUS_DIRECTION_DOWNWARD;
296 if (keyInfo.GetKeyModifier() & _KEY_MODIFIER_SHIFT)
298 focusDirection = FOCUS_DIRECTION_UPWARD;
301 _Control* pControl = const_cast<_Control*> (&source);
302 StartFocusTraversal(pControl, focusDirection);
307 _FocusManagerImpl::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
313 _FocusManagerImpl::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
315 if (__pCurrentFocusUiControl)
317 __pCurrentFocusUiControl->RemoveFocusRing();
318 __pCurrentFocusUiControl->SetFocusModeStateEnabled(false);
319 __pCurrentFocusUiControl = null;
325 _FocusManagerImpl::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
331 _FocusManagerImpl:: OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
337 _FocusManagerImpl::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)