From 10762a8b9cfa1eca94842a8f57c1f748a495d1b5 Mon Sep 17 00:00:00 2001 From: woojin nam Date: Tue, 25 Jun 2013 14:11:10 +0000 Subject: [PATCH] Revert "Revert "apply FocusUi to ContextMenu" This reverts commit 4d4d373ab1dbec28dbd03121c9ae622ce7022d9a" This reverts commit cad225e63a3ce69b91545d0c4d9098b4152e7c35 Change-Id: I7c040b8692c84127f8bfaa0ab1a39810377f9598 --- src/ui/controls/FUiCtrl_ContextMenu.cpp | 31 +++ .../controls/FUiCtrl_ContextMenuGridPresenter.cpp | 218 +++++++++++++++++++ .../controls/FUiCtrl_ContextMenuListPresenter.cpp | 235 +++++++++++++++++++++ src/ui/inc/FUiCtrl_ContextMenu.h | 7 + src/ui/inc/FUiCtrl_ContextMenuGridPresenter.h | 10 + src/ui/inc/FUiCtrl_ContextMenuListPresenter.h | 9 + src/ui/inc/FUiCtrl_IContextMenuPresenter.h | 7 + 7 files changed, 517 insertions(+) diff --git a/src/ui/controls/FUiCtrl_ContextMenu.cpp b/src/ui/controls/FUiCtrl_ContextMenu.cpp index 2ab89db..413b541 100644 --- a/src/ui/controls/FUiCtrl_ContextMenu.cpp +++ b/src/ui/controls/FUiCtrl_ContextMenu.cpp @@ -170,6 +170,7 @@ _ContextMenu::CreateContextMenuN(const FloatPoint& point, enum ContextMenuCoreSt GET_SHAPE_CONFIG(CONTEXTMENU::LIST_ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, minHeight); pContextMenu->__pScrollPanel = _ScrollPanel::CreateScrollPanelN(FloatRectangle(0.0f, 0.0f, minWidth, minHeight), SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL, false, false); pContextMenu->__pScrollPanel->SetTouchPressThreshold(TOUCH_PRESS_THRESHOLD_INSENSITIVE); + pContextMenu->__pScrollPanel->SetFocusable(false); _Scroll* pScroll = pContextMenu->__pScrollPanel->GetScrollBar(); SysTryCatch(NID_UI_CTRL, pScroll, , E_INVALID_STATE, "[E_INVALID_STATE] _Scroll isn't constructed"); @@ -1245,6 +1246,36 @@ _ContextMenu::OnOwnerChanged(_Control* pOldOwner) } } +bool +_ContextMenu::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo) +{ + return __pContextMenuPresenter->OnKeyPressed(source, keyInfo); +} + +bool +_ContextMenu::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo) +{ + return __pContextMenuPresenter->OnKeyReleased(source, keyInfo); +} + +bool +_ContextMenu::IsChildControlFocusManage(void) const +{ + return __pContextMenuPresenter->IsChildControlFocusManage(); +} + +void +_ContextMenu::OnDrawFocus(void) +{ + __pContextMenuPresenter->OnDrawFocus(); +} + +void +_ContextMenu::OnFocusModeStateChanged(void) +{ + __pContextMenuPresenter->OnFocusModeStateChanged(); +} + _AccessibilityElement* _ContextMenu::GetAccessibilityElement(const int mainIndex) const { diff --git a/src/ui/controls/FUiCtrl_ContextMenuGridPresenter.cpp b/src/ui/controls/FUiCtrl_ContextMenuGridPresenter.cpp index 26f5d6d..d9a123e 100644 --- a/src/ui/controls/FUiCtrl_ContextMenuGridPresenter.cpp +++ b/src/ui/controls/FUiCtrl_ContextMenuGridPresenter.cpp @@ -82,6 +82,8 @@ _ContextMenuGridPresenter::_ContextMenuGridPresenter(_ContextMenu* pContextMenu) , __dividerHeight(0.0f) , __bgPressedMargin(0.0f) , __anchorPopupOverlap(0.0f) + , __enterKeyPressed(false) + , __focusedIndex(-1) { } @@ -1337,6 +1339,7 @@ _ContextMenuGridPresenter::DrawItem(Tizen::Graphics::Canvas* pCanvas) } ContextMenuItemDrawingType itemType = pItem->GetType(); + if (itemType == CONTEXT_MENU_ITEM_DRAWING_TYPE_TEXT) { FloatRectangle drawRect = rect; @@ -1399,6 +1402,24 @@ _ContextMenuGridPresenter::DrawItem(Tizen::Graphics::Canvas* pCanvas) DrawBitmap(*pCanvas, drawRect, *pBitmap); } } + + if (__focusedIndex == i) + { + FloatRectangle pressedDrawRect = pItem->GetPressedDrawRect(); + + Bitmap* pBitmap = null; + result r = GET_BITMAP_CONFIG_N(FOCUSUI::FOCUS, BITMAP_PIXEL_FORMAT_ARGB8888, pBitmap); + SysTryReturn(NID_UI_CTRL, pBitmap, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed."); + + if (r == E_SUCCESS) + { + DrawBitmap(*pCanvas, pressedDrawRect, *pBitmap); + } + + delete pBitmap; + pBitmap = null; + } + } return r; @@ -1485,6 +1506,7 @@ _ContextMenuGridPresenter::OnTouchReleased(const _Control& source, const _TouchI if (__touchOutRect == true) { + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); } @@ -1495,6 +1517,7 @@ _ContextMenuGridPresenter::OnTouchReleased(const _Control& source, const _TouchI if (pActionEvent == null) { + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); return true; } @@ -1506,6 +1529,7 @@ _ContextMenuGridPresenter::OnTouchReleased(const _Control& source, const _TouchI { __selectedIndex = -1; __pressedIndex = -1; + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); return true; } @@ -1519,11 +1543,13 @@ _ContextMenuGridPresenter::OnTouchReleased(const _Control& source, const _TouchI if (pEventArg == null) { + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); return true; } PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP, __pContextMenu); + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); pActionEvent->Fire(*pEventArg); } @@ -1592,6 +1618,198 @@ _ContextMenuGridPresenter::OnTouchMoved(const _Control& source, const _TouchInfo return true; } +bool +_ContextMenuGridPresenter::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo) +{ + _KeyCode keyCode = keyInfo.GetKeyCode(); + + switch (keyCode) + { + case _KEY_LEFT: + // fall through + case _KEY_UP: + { + if (__enterKeyPressed) + { + __enterKeyPressed = false; + __selectedIndex = -1; + } + + if (__focusedIndex <= 0) + { + break; + } + + --__focusedIndex; + _ContextMenuItem* pItem = __pModel->GetItem(__focusedIndex); + pItem->SetFocused(true); + Draw(); + + break; + } + case _KEY_RIGHT: + // fall through + case _KEY_DOWN: + { + if (__enterKeyPressed) + { + __enterKeyPressed = false; + __selectedIndex = -1; + } + + if (__focusedIndex >= __pModel->GetItemCount() - 1) + { + break; + } + + ++__focusedIndex; + _ContextMenuItem* pItem = __pModel->GetItem(__focusedIndex); + pItem->SetFocused(true); + Draw(); + + break; + } + case _KEY_ENTER: + { + if (__focusedIndex == -1) + { + return true; + } + + __enterKeyPressed = true; + __selectedIndex = __focusedIndex; + + _ContextMenuItem* pItem = __pModel->GetItem(__focusedIndex); + pItem->SetFocused(true); + Draw(); + + break; + } + case _KEY_BACKSPACE: + { + if (__focusedIndex == -1) + { + return true; + } + + _ContextMenuItem* pItem = __pModel->GetItem(__focusedIndex); + if (pItem != null) + { + pItem->SetFocused(false); + } + __enterKeyPressed = false; + __selectedIndex = -1; + __focusedIndex = -1; + + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + break; + } + default: + return false; + } + + return true; +} + +bool +_ContextMenuGridPresenter::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo) +{ + _KeyCode keyCode = keyInfo.GetKeyCode(); + + switch (keyCode) + { + case _KEY_LEFT: + // fall through + case _KEY_UP: + // fall through + case _KEY_RIGHT: + // fall through + case _KEY_DOWN: + // fall through + case _KEY_BACKSPACE: + return true; + case _KEY_ENTER: + { + if (!__enterKeyPressed) + { + return true; + } + + __enterKeyPressed = false; + + _ActionEvent* pActionEvent = __pContextMenu->GetActionEvent(); + + if (pActionEvent == null) + { + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + return true; + } + + _ContextMenuItem* pItem = __pModel->GetItem(__selectedIndex); + if (pItem == null) + { + __selectedIndex = -1; + __pressedIndex = -1; + __focusedIndex = -1; + pItem->SetFocused(false); + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + return true; + } + + __selectedIndex = -1; + __pressedIndex = -1; + __focusedIndex = -1; + + int actionId = pItem->GetActionId(); + + IEventArg* pEventArg = _ActionEvent::CreateActionEventArgN(actionId); + + if (pEventArg == null) + { + pItem->SetFocused(false); + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + return true; + } + + pItem->SetFocused(false); + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + pActionEvent->Fire(*pEventArg); + + break; + } + default: + return false; + } + + return true; +} + +bool +_ContextMenuGridPresenter::IsChildControlFocusManage(void) const +{ + return true; +} + +void +_ContextMenuGridPresenter::OnDrawFocus(void) +{ + __focusedIndex = 0; + __selectedIndex = -1; + Draw(); +} + +void +_ContextMenuGridPresenter::OnFocusModeStateChanged(void) +{ + __focusedIndex = -1; + Draw(); +} + void _ContextMenuGridPresenter::OnFontChanged(Font* pFont) { diff --git a/src/ui/controls/FUiCtrl_ContextMenuListPresenter.cpp b/src/ui/controls/FUiCtrl_ContextMenuListPresenter.cpp index f3ad757..120d63b 100644 --- a/src/ui/controls/FUiCtrl_ContextMenuListPresenter.cpp +++ b/src/ui/controls/FUiCtrl_ContextMenuListPresenter.cpp @@ -83,6 +83,7 @@ _ContextMenuListPresenter::_ContextMenuListPresenter(_ContextMenu* pContextMenu) , __itemFontSize(0.0f) , __dividerHeight(0.0f) , __anchorPopupOverlap(0.0f) + , __enterKeyPressed(false) { } @@ -997,6 +998,7 @@ _ContextMenuListPresenter::OnTouchReleased(const _Control& source, const _TouchI if (!itemRect.Contains(touchPosition)) { __selectedIndex = -1; + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); return true; @@ -1010,6 +1012,7 @@ _ContextMenuListPresenter::OnTouchReleased(const _Control& source, const _TouchI pItem = __pModel->GetItem(__selectedIndex); __selectedIndex = -1; + __pContextMenu->SetFocused(false); __pContextMenu->SetVisibleState(false); int actionId = pItem->GetActionId(); @@ -1065,6 +1068,238 @@ _ContextMenuListPresenter::OnTouchCanceled(const _Control& source, const _TouchI return true; } +bool +_ContextMenuListPresenter::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo) +{ + _KeyCode keyCode = keyInfo.GetKeyCode(); + _Control* pFocusedControl = null; + _Window* pTop = source.GetRootWindow(); + if (pTop) + { + pFocusedControl = pTop->GetCurrentFocusControl(); + } + + int focusedIndex = -1; + + for (int i = 0; i < __pModel->GetItemCount(); i++) + { + _ContextMenuItem* pItem = __pModel->GetItem(i); + if (pFocusedControl == pItem) + { + focusedIndex = i; + break; + } + } + + switch (keyCode) + { + case _KEY_UP: + { + if (focusedIndex == -1) + { + return true; + } + + if (__enterKeyPressed) + { + __enterKeyPressed = false; + _ContextMenuItem* pItem = __pModel->GetItem(focusedIndex); + pItem->SetAndInvalidate(false); + } + + if (focusedIndex <= 0) + { + break; + } + + _ContextMenuItem* pItem = __pModel->GetItem(--focusedIndex); + if(pItem != null) + { + pItem->SetFocused(true); + pItem->DrawFocus(); + } + break; + } + case _KEY_DOWN: + { + if (focusedIndex == -1) + { + return true; + } + + if (__enterKeyPressed) + { + __enterKeyPressed = false; + _ContextMenuItem* pItem = __pModel->GetItem(focusedIndex); + pItem->SetAndInvalidate(false); + } + + if (focusedIndex >= __pModel->GetItemCount() - 1) + { + break; + } + + _ContextMenuItem* pItem = __pModel->GetItem(++focusedIndex); + if(pItem != null) + { + pItem->SetFocused(true); + pItem->DrawFocus(); + } + break; + } + case _KEY_ENTER: + { + if (focusedIndex == -1) + { + return true; + } + + __enterKeyPressed = true; + _ContextMenuItem* pItem = __pModel->GetItem(focusedIndex); + pItem->SetAndInvalidate(true); + + break; + } + case _KEY_BACKSPACE: + { + if (focusedIndex == -1) + { + return true; + } + + _ContextMenuItem* pItem = __pModel->GetItem(focusedIndex); + if (pItem != null) + { + pItem->SetAndInvalidate(false); + pItem->SetFocused(false); + pItem->DrawFocus(); + pItem->SetAndInvalidate(false); + } + + __enterKeyPressed = false; + __selectedIndex = -1; + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + break; + } + default: + return false; + } + + return true; +} + +bool +_ContextMenuListPresenter::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo) +{ + _KeyCode keyCode = keyInfo.GetKeyCode(); + + switch (keyCode) + { + case _KEY_UP: + // fall through + case _KEY_DOWN: + // fall through + case _KEY_BACKSPACE: + return true; + case _KEY_ENTER: + { + if (!__enterKeyPressed) + { + return true; + } + + __enterKeyPressed = false; + + _Control* pFocusedControl = null; + _Window* pTop = source.GetRootWindow(); + if (pTop) + { + pFocusedControl = pTop->GetCurrentFocusControl(); + } + + _ContextMenuItem* pItem = null; + + for (int i = 0; i < __pModel->GetItemCount(); i++) + { + pItem = __pModel->GetItem(i); + if (pFocusedControl == pItem) + { + break; + } + } + + if (pItem == null) + { + return false; + } + + pItem->SetFocused(false); + pItem->DrawFocus(); + pItem->SetAndInvalidate(false); + + __selectedIndex = -1; + __pContextMenu->SetFocused(false); + __pContextMenu->SetVisibleState(false); + + int actionId = pItem->GetActionId(); + + _ActionEvent* pActionEvent = __pContextMenu->GetActionEvent(); + if (pActionEvent == null) + { + return true; + } + + IEventArg* pEventArg = _ActionEvent::CreateActionEventArgN(actionId); + if (pEventArg == null) + { + return true; + } + + pActionEvent->Fire(*pEventArg); + + break; + } + default: + return false; + } + + return true; +} + +bool +_ContextMenuListPresenter::IsChildControlFocusManage(void) const +{ + return true; +} + +void +_ContextMenuListPresenter::OnDrawFocus(void) +{ + _ContextMenuItem* pItem = __pModel->GetItem(0); + if (pItem != null) + { + pItem->SetFocused(true); + pItem->DrawFocus(); + } +} + +void +_ContextMenuListPresenter::OnFocusModeStateChanged(void) +{ + _Control* pFocusedControl = null; + _Window* pTop = __pContextMenu->GetRootWindow(); + if (pTop) + { + pFocusedControl = pTop->GetCurrentFocusControl(); + } + + if (pFocusedControl != null) + { + pFocusedControl->SetFocused(false); + } +} + void _ContextMenuListPresenter::OnFontChanged(Tizen::Graphics::Font* pFont) { diff --git a/src/ui/inc/FUiCtrl_ContextMenu.h b/src/ui/inc/FUiCtrl_ContextMenu.h index 04c2db7..7ab6a2b 100644 --- a/src/ui/inc/FUiCtrl_ContextMenu.h +++ b/src/ui/inc/FUiCtrl_ContextMenu.h @@ -205,6 +205,13 @@ public: virtual void OnChangeLayout(_ControlOrientation orientation); virtual void OnOwnerChanged(_Control* pOldOwner); + // Focus Ui + virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo); + virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo); + virtual bool IsChildControlFocusManage(void) const; + virtual void OnDrawFocus(void); + virtual void OnFocusModeStateChanged(void); + virtual bool OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element); virtual bool OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element); virtual bool OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element); diff --git a/src/ui/inc/FUiCtrl_ContextMenuGridPresenter.h b/src/ui/inc/FUiCtrl_ContextMenuGridPresenter.h index 42b0899..dbec523 100644 --- a/src/ui/inc/FUiCtrl_ContextMenuGridPresenter.h +++ b/src/ui/inc/FUiCtrl_ContextMenuGridPresenter.h @@ -78,6 +78,13 @@ public: virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo); virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo); + // Focus Ui + virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo); + virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo); + virtual bool IsChildControlFocusManage(void) const; + virtual void OnDrawFocus(void); + virtual void OnFocusModeStateChanged(void); + virtual void OnFontChanged(Tizen::Graphics::Font* pFont); virtual void OnFontInfoRequested(unsigned long& style, float& size); @@ -147,6 +154,9 @@ private: float __dividerHeight; float __bgPressedMargin; float __anchorPopupOverlap; + + bool __enterKeyPressed; + int __focusedIndex; }; // _ContextMenuGridPresenter }}} // Tizen::Ui: Control diff --git a/src/ui/inc/FUiCtrl_ContextMenuListPresenter.h b/src/ui/inc/FUiCtrl_ContextMenuListPresenter.h index f387e13..a8d73ab 100644 --- a/src/ui/inc/FUiCtrl_ContextMenuListPresenter.h +++ b/src/ui/inc/FUiCtrl_ContextMenuListPresenter.h @@ -78,6 +78,13 @@ public: virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo); virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo); + // Focus Ui + virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo); + virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo); + virtual bool IsChildControlFocusManage(void) const; + virtual void OnDrawFocus(void); + virtual void OnFocusModeStateChanged(void); + virtual void OnFontChanged(Tizen::Graphics::Font* pFont); virtual void OnFontInfoRequested(unsigned long& style, float& size); @@ -140,6 +147,8 @@ private: float __itemFontSize; float __dividerHeight; float __anchorPopupOverlap; + + bool __enterKeyPressed; }; // _ContextMenuListPresenter }}} // Tizen::Ui: Control diff --git a/src/ui/inc/FUiCtrl_IContextMenuPresenter.h b/src/ui/inc/FUiCtrl_IContextMenuPresenter.h index 8f65119..503ebe3 100644 --- a/src/ui/inc/FUiCtrl_IContextMenuPresenter.h +++ b/src/ui/inc/FUiCtrl_IContextMenuPresenter.h @@ -88,6 +88,13 @@ public: virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo) = 0; virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo) = 0; + // Focus Ui + virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo) { return false; }; + virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo) { return false; }; + virtual bool IsChildControlFocusManage(void) const { return false; }; + virtual void OnDrawFocus(void) {}; + virtual void OnFocusModeStateChanged(void) {}; + virtual void OnFontChanged(Tizen::Graphics::Font* pFont) = 0; virtual void OnFontInfoRequested(unsigned long& style, float& size) = 0; -- 2.7.4