{
}
+bool
+_Control::IsChildControlFocusManage(void) const
+{
+ return false;
+}
+
result
_Control::SetFontFromFile(const String& fileName)
{
{
return __fontFileName;
}
+void
+_Control::DrawFocus(void)
+{
+ _IControlDelegate& delegate = GetControlDelegate();
+ delegate.OnDrawFocus();
+}
}} // Tizen::Ui
GetCore().OnChildControlFocusMoved(control);
}
+bool
+_ControlImpl::IsChildControlFocusManage(void) const
+{
+ GetCore().IsChildControlFocusManage();
+}
void
_ControlImpl::SetTouchPressThreshold(float distance)
{
#include <FApp_AppInfo.h>
#include <FGrp_CoordinateSystem.h>
#include <FSys_SystemInfoImpl.h>
+#include "FUi_FocusManagerImpl.h"
#include "FUi_ControlImplManager.h"
#include "FUi_ControlManager.h"
#include "FUi_WindowImpl.h"
_ControlManager::Initialize();
+ _KeyEventManagerImpl::Initialize();
+ _FocusManagerImpl::Initialize();
result r = InitializeTestbuddyManager();
SetLastResult(r);
}
{
_ControlManager::Release();
+ _FocusManagerImpl::ReleaseInstance();
+ _KeyEventManagerImpl::ReleaseInstance();
+
delete __pInstance;
__pInstance = null;
}
_ControlImplManager::_ControlImplManager(void)
: __pFrameImpl(null)
{
- _KeyEventManagerImpl::Initialize();
- _FocusManagerImpl::Initialize();
}
_ControlImplManager::~_ControlImplManager(void)
{
- _FocusManagerImpl::ReleaseInstance();
- _KeyEventManagerImpl::ReleaseInstance();
}
_WindowImpl*
*
*/
+#include <unique_ptr.h>
#include "FUi_FocusManagerImpl.h"
#include "FUi_ControlImpl.h"
#include "FUi_WindowImpl.h"
#include "FUi_ControlManager.h"
+#include "FUiCtrl_Form.h"
+#include "FUi_UiEventManager.h"
+#include "FUi_ResourceManager.h"
+#include "FUi_UiKeyEvent.h"
+using namespace std;
+using namespace Tizen::Base::Collection;
+using namespace Tizen::Graphics;
+using namespace Tizen::Ui;
+using namespace Tizen::Ui::Controls;
+using namespace Tizen::Ui::Animations;
namespace Tizen { namespace Ui
{
_FocusManagerImpl::_FocusManagerImpl(void)
{
- //NOHING
+ result r = _UiEventManager::GetInstance()->AddPostKeyEventListener(*this);
+ SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
}
return pWindowImpl;
}
+int
+_FocusManagerImpl::GetNextIndex(int currentIndex, FocusDirection focusDirection, const IListT<_Control*>* pFocusControlList)
+{
+ int nextIndex = currentIndex;
+ if (focusDirection == FOCUS_DIRECTION_DOWNWARD)
+ {
+ ++nextIndex;
+ if (nextIndex == pFocusControlList->GetCount())
+ {
+ nextIndex = 0;
+ }
+ }
+ else
+ {
+ --nextIndex;
+ if (nextIndex < 0)
+ {
+ nextIndex = pFocusControlList->GetCount() - 1;
+ }
+ }
+ return nextIndex;
+
+
+}
+
+void
+_FocusManagerImpl::StartFocusTraversal(_Control* pControl, FocusDirection focusDirection)
+{
+ if (focusDirection == FOCUS_DIRECTION_DOWNWARD)
+ {
+ _Control* pFocusControl = pControl->GetNextFocus();
+ if (pFocusControl)
+ {
+ pFocusControl->SetFocused();
+ pFocusControl->DrawFocus();
+ return;
+ }
+ }
+ else
+ {
+ _Control* pFocusControl = pControl->GetPreviousFocus();
+ if (pFocusControl)
+ {
+ pFocusControl->SetFocused();
+ pFocusControl->DrawFocus();
+ return;
+ }
+ }
+
+ _Form* pForm = null;
+ _Control* pParentControl = pControl;
+
+ while(pControl)
+ {
+ pForm = dynamic_cast<_Form*>(pParentControl);
+
+ if (pForm != null)
+ {
+ break;
+ }
+ else
+ {
+ pParentControl = pParentControl->GetParent();
+ }
+ }
+
+ IListT<_Control*>* pFocusControlList = pForm->GetFocusList();
+ unique_ptr<IEnumeratorT<_Control*> > pEnum (pFocusControlList->GetEnumeratorN());
+
+ int index = 0;
+ bool findNextFocusControl = false;
+ _Control* pFocusControl = null;
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ _Control* pEnumeratorControl = null;
+ pEnum->GetCurrent(pEnumeratorControl);
+
+ //Find current focused control
+ if (pControl == pEnumeratorControl)
+ {
+ //Find next focusable control.
+ index = GetNextIndex(index, focusDirection, pFocusControlList);
+ while (pFocusControlList->GetAt(index, pFocusControl) == E_SUCCESS)
+ {
+ bool isFocusalbe = pFocusControl->IsFocusable();
+ bool enableState = pFocusControl->GetEnableState();
+ bool visibleState = pFocusControl->GetVisibleState();
+ if (enableState == true && visibleState == true && isFocusalbe == true)
+ {
+ pFocusControl->SetFocused();
+ findNextFocusControl = true;
+ break;
+ }
+ else
+ {
+ index = GetNextIndex(index, focusDirection, pFocusControlList);
+ }
+ }
+ }
+
+ if (findNextFocusControl == true)
+ {
+ break;
+ }
+
+ index ++;
+ }
+
+ if (pFocusControl && findNextFocusControl == true)
+ {
+ _Control* pParentControl = pFocusControl->GetParent();
+ if (pParentControl)
+ {
+ pParentControl->OnChildControlFocusMoved(*pFocusControl);
+ }
+ pFocusControl->DrawFocus();
+ }
+}
+
+bool
+_FocusManagerImpl::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
+{
+ _KeyCode keyCode = keyInfo.GetKeyCode();
+
+ if(keyCode == _KEY_TAB)
+ {
+ FocusDirection focusDirection = FOCUS_DIRECTION_DOWNWARD;
+ if (keyInfo.GetKeyModifier() & _KEY_MODIFIER_SHIFT)
+ {
+ focusDirection = FOCUS_DIRECTION_UPWARD;
+ }
+
+ _Control* pControl = const_cast<_Control*> (&source);
+ StartFocusTraversal(pControl, focusDirection);
+ }
+ return true;
+}
+bool
+_FocusManagerImpl::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
+{
+ return true;
+}
} } //Tizen::Ui
*/
#include <new>
+#include <unique_ptr.h>
#include <FBaseErrorDefine.h>
#include <FBaseInteger.h>
#include <FBaseSysLog.h>
+#include <FBaseColArrayListT.h>
#include <FGrpFloatRectangle.h>
#include <FBase_Log.h>
#include <FGrp_BitmapImpl.h>
#include "FUiCtrl_Indicator.h"
#include "FUi_SystemUtilImpl.h"
+using namespace std;
using namespace Tizen::Ui::Animations;
using namespace Tizen::Ui;
using namespace Tizen::Base; // Rotation
using namespace Tizen::Base::Runtime;
+using namespace Tizen::Base::Collection;
using namespace Tizen::Graphics;
namespace Tizen { namespace Ui { namespace Controls
return true;
}
+void
+_Form::MakeFocusList(const _Control* pControl, IListT<_Control*>* pFocusControlList) const
+{
+ int childCount = pControl->GetChildCount();
+ for(int i = 0; i < childCount; i++)
+ {
+ _Control* pChildControl = pControl->GetChild(i);
+ Rectangle rect = pChildControl->GetAbsoluteBounds();
+ unique_ptr<IEnumeratorT<_Control*> > pEnum (pFocusControlList->GetEnumeratorN());
+ int index = 0;
+ while (pEnum->MoveNext() == E_SUCCESS)
+ {
+ _Control* pEnumeratorControl = null;
+ pEnum->GetCurrent(pEnumeratorControl);
+ if (pEnumeratorControl != null)
+ {
+ Rectangle enumeratorRect = pEnumeratorControl->GetAbsoluteBounds();
+ if(enumeratorRect.y > rect.y)
+ {
+ break;
+ }
+ else if (enumeratorRect.y == rect.y)
+ {
+ if(enumeratorRect.x > rect.x)
+ {
+ break;
+ }
+ }
+
+ index ++;
+ }
+ }
+ pFocusControlList->InsertAt(pChildControl, index);
+ }
+}
+
+void
+_Form::MakeChildContainerFocusList(_Control* pControl, int startIndex) const
+{
+ unique_ptr<IListT<_Control*> > pTempList (new (std::nothrow) ArrayListT<_Control*>);
+ SysTryReturnVoidResult(NID_UI_CTRL, pTempList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+ MakeFocusList(pControl, pTempList.get());
+
+ unique_ptr<IEnumeratorT<_Control*> > pTempEnum(pTempList->GetEnumeratorN());
+ int index = ++startIndex;
+ while (pTempEnum->MoveNext() == E_SUCCESS)
+ {
+ _Control* pEnumeratorControl = null;
+ pTempEnum->GetCurrent(pEnumeratorControl);
+ __pFocusControlList->InsertAt(pEnumeratorControl, index);
+ index ++;
+ }
+}
+
+IListT<_Control*>*
+_Form::GetFocusList(void) const
+{
+ if(!__pFocusControlList)
+ {
+ __pFocusControlList.reset(new (std::nothrow) ArrayListT<_Control*>);
+ SysTryReturn(NID_UI, __pFocusControlList, null, E_SYSTEM, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+ MakeFocusList(this, __pFocusControlList.get());
+
+ unique_ptr<IEnumeratorT<_Control*> > pEnum(__pFocusControlList->GetEnumeratorN());
+ int i =0;
+ int nextContainerIndex = -1;
+ while ( pEnum->MoveNext() == E_SUCCESS)
+ {
+ _Control* pEnumeratorControl = null;
+ pEnum->GetCurrent(pEnumeratorControl);
+ _ContainerImpl* pTempContainerImpl = dynamic_cast<_ContainerImpl*>(static_cast <_ControlImpl* >(pEnumeratorControl->GetUserData()));
+
+ if (pTempContainerImpl != null && (nextContainerIndex < i))
+ {
+ if (pEnumeratorControl->IsChildControlFocusManage() == false)
+ {
+ MakeChildContainerFocusList(pEnumeratorControl, i);
+ nextContainerIndex = i;
+ pEnum.reset(__pFocusControlList->GetEnumeratorN());
+ i = -1;
+ }
+ }
+ i++;
+ }
+ __pFocusControlList->InsertAt(dynamic_cast<_Control*> (const_cast<_Form*>(this)), 0);
+ }
+
+ return __pFocusControlList.get();
+}
+
}}} // Tizen::Ui::Controls
{
return true;
}
+
+void
+_ScrollPanel::OnChildControlFocusMoved(const _Control& control)
+{
+ __pScrollPanelPresenter->OnChildControlFocusMoved(control);
+}
+
bool
_ScrollPanel::OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction)
{
return false;
}
+void
+_ScrollPanelPresenter::OnChildControlFocusMoved(const _Control& control)
+{
+ ScrollToControlWhenOutOfView(control);
+}
+
bool
_ScrollPanelPresenter::OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction)
{
return pAnimation;
}
+bool
+_TableView::IsChildControlFocusManage(void) const
+{
+ return true;
+}
}}} // Tizen::Ui::Controls
#ifndef _FUI_CTRL_INTERNAL_FORM_H_
#define _FUI_CTRL_INTERNAL_FORM_H_
+#include <unique_ptr.h>
#include <FUiCtrlControlsTypes.h>
#include <FUiCtrlOverlayRegion.h>
#include "FUi_Control.h"
virtual void OnChildVisibleStateChanged(const _Control& child);
virtual void OnBoundsChanged(void);
+// Focus UI
+ Tizen::Base::Collection::IListT<_Control*>* GetFocusList(void) const;
+ void MakeFocusList(const _Control* pControl, Tizen::Base::Collection::IListT<_Control*>* pFocusControlList) const;
+ void MakeChildContainerFocusList(_Control* pControl, int startIndex) const;
+
// Accessor
protected:
result SetPresenter(const _FormPresenter& formPresenter);
//Back button action ID
static const int ID_BACK_BUTTON = -10;
+ //For Focus UI
+ mutable std::unique_ptr<Tizen::Base::Collection::IListT<_Control*> > __pFocusControlList;
+
friend class _Frame;
friend class _OverlayRegionImpl;
}; // _Form
virtual bool OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
+ // Focus UI
+ void OnChildControlFocusMoved(const _Control& control);
+
// scroll animation event listener
virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
virtual bool OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element);
virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
+ // Focus UI
+ virtual void OnChildControlFocusMoved(const _Control& control);
+
// scroll event listener
virtual void OnScrollEndReached(_Control& source, ScrollEndEvent type);
virtual void OnScrollPositionChanged(_Control& source, float scrollPosition);
// VE Value Animation
Tizen::Ui::Animations::VisualElementValueAnimation* GetVisualElementValueAnimation(const Tizen::Base::String& keyName) const;
+ // Focus Ui
+ virtual bool IsChildControlFocusManage(void) const;
protected:
// Properties
result SetPropertyItemDividerColor(const Variant& itemDividerColor);
virtual void OnBackgroundColorChanged(Tizen::Graphics::Color& backgroundColor) = 0;
virtual void OnDrawFocus(void) = 0;
virtual void OnChildControlFocusMoved(const _Control& control) = 0;
+ virtual bool IsChildControlFocusManage(void) const = 0;
};
class _IPropagatedTouchEventListener
virtual void OnBackgroundColorChanged(Tizen::Graphics::Color& backgroundColor);
virtual void OnDrawFocus(void);
virtual void OnChildControlFocusMoved(const _Control& control);
+ virtual bool IsChildControlFocusManage(void) const;
// Control Hierarchy - Common
bool HasParent(void) const;
void SetNextFocus(_Control* pNextFocus);
_Control* GetPreviousFocus() const;
_Control* GetNextFocus() const;
+ void DrawFocus(void);
// Clipping
bool IsClipToParent(void) const;
virtual void OnBackgroundColorChanged(Tizen::Graphics::Color& backgroundColor);
virtual void OnDrawFocus(void);
virtual void OnChildControlFocusMoved(const _Control& control);
+ virtual bool IsChildControlFocusManage(void) const;
// Event Callbacks
virtual bool OnKeyPressed(const _ControlImpl& source, const _KeyInfo& keyInfo);
#ifndef _FUI_INTERNAL_FOCUS_MANAGER_IMPL_H_
#define _FUI_INTERNAL_FOCUS_MANAGER_IMPL_H_
-// Includes
+#include <FUi_IKeyEventListener.h>
+#include <FUiAnim_VisualElement.h>
+#include <FBaseColIListT.h>
#include <FBaseObject.h>
+namespace Tizen { namespace Ui { namespace Animations
+{
+class VisualElement;
+}}} //Tizen::Ui::Animations
+
namespace Tizen { namespace Ui
{
+class _Control;
class _ControlImpl;
class _WindowImpl;
+enum FocusDirection
+{
+ FOCUS_DIRECTION_DOWNWARD,
+ FOCUS_DIRECTION_UPWARD
+};
+
+
/**
* @class FocusManager
* @brief This class manages the application's current focus owned by the UI control
*/
class _FocusManagerImpl
: public Tizen::Base::Object
+ , public Tizen::Ui::_IKeyEventListener
{
public:
/**
static void InitializeInstance(void);
+ virtual bool OnKeyPressed(const Tizen::Ui::_Control& source, const Tizen::Ui::_KeyInfo& keyInfo);
+ virtual bool OnKeyReleased(const Tizen::Ui::_Control& source, const Tizen::Ui::_KeyInfo& keyInfo);
+
+ void StartFocusTraversal(_Control* pControl, FocusDirection focusDirection);
+ int GetNextIndex(int currentIndex, FocusDirection focusDirection, const Tizen::Base::Collection::IListT<_Control*>* pFocusControlList);
+ Tizen::Ui::Animations::VisualElement* __pFocusVe;
+
private:
static _FocusManagerImpl* __pInstance;
}; // _FocusManagerImpl
}}//Tizen::Ui
-#endif // _FUI_INTERNAL_FOCUS_MANAGER_IMPL_H_
\ No newline at end of file
+#endif // _FUI_INTERNAL_FOCUS_MANAGER_IMPL_H_