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<IEnumeratorT<_Control*> > 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<IEnumeratorT<_Control*> > 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)
{
_Control* pFocusTraversalControl = pTop->GetFocusTraversalControl();
if (pFocusTraversalControl)
{
- pControl = pTop->GetFocusTraversalControl();
- pControl->SetFocused();
+ pControl = pFocusTraversalControl;
+ }
+ else
+ {
+ _Control* pTraversalControl = FindTraversalControlFromChild(pControl);
+ pTop->SetFocusTraversalControl(pTraversalControl);
+
}
}
{
if (IsFocusable(pControl))
{
- pTop->SetFocusTraversalControl(pControl);
+ if (IsFocusControlListControl(pControl))
+ {
+ pTop->SetFocusTraversalControl(pControl);
+ }
pControl->DrawFocus();
pControl->SetFocusModeStateEnabled(true);
return;
bool
_FocusManagerImpl::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
{
+ _Control* pSourceControl = const_cast<_Control*>(&source);
+ pSourceControl->SetFocusModeStateEnabled(false);
+
_Window* pTop = source.GetRootWindow();
if (pTop)
{
if (pFocusTraversalControl)
{
pFocusTraversalControl->RemoveFocusRing();
- pFocusTraversalControl->SetFocusModeStateEnabled(false);
+ pFocusTraversalControl->SetFocusModeStateEnabled(false);
pTop->SetFocusTraversalControl(null);
}
}