From 8a82897080b387dcde7f7ec484666b69050604af Mon Sep 17 00:00:00 2001 From: "keonpyo.kong" Date: Wed, 12 Jun 2013 16:00:00 +0900 Subject: [PATCH] Add FindTraversalControlFromChild Change-Id: I7f963f22d7b6816ff41900fbe7cf7991f0371fbd Signed-off-by: keonpyo.kong --- src/ui/FUi_ContainerImpl.cpp | 2 +- src/ui/FUi_FocusManagerImpl.cpp | 94 +++++++++++++++++++++++++++++++++++++-- src/ui/inc/FUi_FocusManagerImpl.h | 2 + 3 files changed, 93 insertions(+), 5 deletions(-) diff --git a/src/ui/FUi_ContainerImpl.cpp b/src/ui/FUi_ContainerImpl.cpp index d24e218..9d97ff7 100644 --- a/src/ui/FUi_ContainerImpl.cpp +++ b/src/ui/FUi_ContainerImpl.cpp @@ -636,7 +636,6 @@ void _ContainerImpl::OnChangeLayout(_ControlOrientation orientation) { result r = E_SUCCESS; - _ControlImpl::OnChangeLayout(orientation); if (orientation == _CONTROL_ORIENTATION_PORTRAIT && !__portraitLayout.IsNull()) { @@ -648,6 +647,7 @@ _ContainerImpl::OnChangeLayout(_ControlOrientation orientation) r = GetCore().SetCurrentLayout(__landscapeLayout->GetCore()); SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] Failed to set up the current layout as landscape."); } + _ControlImpl::OnChangeLayout(orientation); } void diff --git a/src/ui/FUi_FocusManagerImpl.cpp b/src/ui/FUi_FocusManagerImpl.cpp index 82e93b8..2cf9c82 100644 --- a/src/ui/FUi_FocusManagerImpl.cpp +++ b/src/ui/FUi_FocusManagerImpl.cpp @@ -175,6 +175,81 @@ _FocusManagerImpl::IsFocusable(_Control* pControl) const return false; } +_Control* +_FocusManagerImpl::FindTraversalControlFromChild(_Control* pControl) +{ + IListT<_Control*>* pFocusControlList = null; + bool findNextFocusControl = false; + + _Window* pTop = pControl->GetRootWindow(); + if (pTop) + { + pFocusControlList = pTop->GetFocusList(); + } + + if (pFocusControlList) + { + unique_ptr > pEnum (pFocusControlList->GetEnumeratorN()); + + while (pEnum->MoveNext() == E_SUCCESS) + { + _Control* pEnumeratorControl = null; + pEnum->GetCurrent(pEnumeratorControl); + + //Find current focused control + if (pControl == pEnumeratorControl) + { + findNextFocusControl = true; + } + } + } + + if (findNextFocusControl == false) + { + _Control* pParent = pControl->GetParent(); + if (pParent) + { + return FindTraversalControlFromChild(pParent); + } + } + else + { + return pControl; + } + +} + +bool +_FocusManagerImpl::IsFocusControlListControl(_Control* pControl) const +{ + IListT<_Control*>* pFocusControlList = null; + bool findNextFocusControl = false; + + _Window* pTop = pControl->GetRootWindow(); + if (pTop) + { + pFocusControlList = pTop->GetFocusList(); + } + + if (pFocusControlList) + { + unique_ptr > pEnum (pFocusControlList->GetEnumeratorN()); + while (pEnum->MoveNext() == E_SUCCESS) + { + _Control* pEnumeratorControl = null; + pEnum->GetCurrent(pEnumeratorControl); + + //Find current focused control + if (pControl == pEnumeratorControl) + { + return true; + } + } + } + + return false; +} + void _FocusManagerImpl::StartFocusTraversal(_Control* pControl, FocusDirection focusDirection) { @@ -184,8 +259,13 @@ _FocusManagerImpl::StartFocusTraversal(_Control* pControl, FocusDirection focusD _Control* pFocusTraversalControl = pTop->GetFocusTraversalControl(); if (pFocusTraversalControl) { - pControl = pTop->GetFocusTraversalControl(); - pControl->SetFocused(); + pControl = pFocusTraversalControl; + } + else + { + _Control* pTraversalControl = FindTraversalControlFromChild(pControl); + pTop->SetFocusTraversalControl(pTraversalControl); + } } @@ -194,7 +274,10 @@ _FocusManagerImpl::StartFocusTraversal(_Control* pControl, FocusDirection focusD { if (IsFocusable(pControl)) { - pTop->SetFocusTraversalControl(pControl); + if (IsFocusControlListControl(pControl)) + { + pTop->SetFocusTraversalControl(pControl); + } pControl->DrawFocus(); pControl->SetFocusModeStateEnabled(true); return; @@ -315,6 +398,9 @@ _FocusManagerImpl::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo bool _FocusManagerImpl::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo) { + _Control* pSourceControl = const_cast<_Control*>(&source); + pSourceControl->SetFocusModeStateEnabled(false); + _Window* pTop = source.GetRootWindow(); if (pTop) { @@ -322,7 +408,7 @@ _FocusManagerImpl::OnTouchPressed(const _Control& source, const _TouchInfo& touc if (pFocusTraversalControl) { pFocusTraversalControl->RemoveFocusRing(); - pFocusTraversalControl->SetFocusModeStateEnabled(false); + pFocusTraversalControl->SetFocusModeStateEnabled(false); pTop->SetFocusTraversalControl(null); } } diff --git a/src/ui/inc/FUi_FocusManagerImpl.h b/src/ui/inc/FUi_FocusManagerImpl.h index 843aec2..cd2de8a 100644 --- a/src/ui/inc/FUi_FocusManagerImpl.h +++ b/src/ui/inc/FUi_FocusManagerImpl.h @@ -129,6 +129,8 @@ private: void StartFocusTraversal(_Control* pControl, FocusDirection focusDirection); int GetNextIndex(int currentIndex, FocusDirection focusDirection, const Tizen::Base::Collection::IListT<_Control*>* pFocusControlList) const; bool IsFocusable(_Control* pControl) const; + _Control* FindTraversalControlFromChild(_Control* pControl); + bool IsFocusControlListControl(_Control* pControl) const; private: static _FocusManagerImpl* __pInstance; -- 2.7.4