Add FindTraversalControlFromChild
authorkeonpyo.kong <keonpyo.kong@samsung.com>
Wed, 12 Jun 2013 07:00:00 +0000 (16:00 +0900)
committerkeonpyo.kong <keonpyo.kong@samsung.com>
Wed, 12 Jun 2013 07:00:06 +0000 (16:00 +0900)
Change-Id: I7f963f22d7b6816ff41900fbe7cf7991f0371fbd
Signed-off-by: keonpyo.kong <keonpyo.kong@samsung.com>
src/ui/FUi_ContainerImpl.cpp
src/ui/FUi_FocusManagerImpl.cpp
src/ui/inc/FUi_FocusManagerImpl.h

index d24e218..9d97ff7 100644 (file)
@@ -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
index 82e93b8..2cf9c82 100644 (file)
@@ -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<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)
 {
@@ -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);
                }
        }
index 843aec2..cd2de8a 100644 (file)
@@ -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;