2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an ”AS IS” BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiCtrl_OptionMenu.cpp
20 * @brief This is the implementation file for the _OptionMenu class.
23 #include <FBaseErrorDefine.h>
24 #include <FBaseSysLog.h>
25 #include <FBaseColIEnumeratorT.h>
27 #include <FGrp_BitmapImpl.h>
28 #include "FUi_ControlImplManager.h"
29 #include "FUi_EcoreEvasMgr.h"
30 #include "FUi_ResourceManager.h"
31 #include "FUiAnim_VisualElement.h"
32 #include "FUiAnim_AnimationManager.h"
33 #include "FUi_AccessibilityContainer.h"
34 #include "FUi_AccessibilityElement.h"
35 #include "FUiCtrl_ActionEvent.h"
36 #include "FUiCtrl_Form.h"
37 #include "FUiCtrl_Frame.h"
38 #include "FUiCtrl_OptionMenu.h"
39 #include "FUiCtrl_Scroll.h"
40 #include "FUiCtrl_ContextMenu.h"
41 #include "FUiCtrl_OptionMenuItem.h"
42 #include "FUi_TouchManager.h"
44 using namespace Tizen::Graphics;
45 using namespace Tizen::Base;
46 using namespace Tizen::Media;
47 using namespace Tizen::Ui;
48 using namespace Tizen::Ui::Animations;
49 using namespace Runtime;
52 static const float TOUCH_PRESS_THRESHOLD_INSENSITIVE = 0.16f;
55 namespace Tizen { namespace Ui { namespace Controls
58 IMPLEMENT_PROPERTY(_OptionMenu);
60 _OptionMenu::_OptionMenu(void)
61 : __pOptionMenuPresenter(null)
63 , __isAttachedToMainTree(false)
64 , __isMaxVisibleCountSet(false)
66 , __currentFocusedIndex(-1)
67 , __windowRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
68 , __bodyRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
69 , __itemRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
70 , __pActionEvent(null)
71 , __pBackgroundNormalBitmap(null)
72 , __pBackgroundEffectBitmap(null)
73 , __layout(_CONTROL_ORIENTATION_PORTRAIT)
74 , __rotation(_CONTROL_ROTATION_0)
75 , __pScrollPanel(null)
77 , __pCurrentFrame(null)
80 __backgroundColor = Color(255, 255, 255, 255);
82 __textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = Color(255, 255, 255, 255);
83 __textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = Color(255, 255, 255, 255);
84 __textColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = Color(255, 255, 255, 255);
86 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = Color(255, 255, 255, 255);
87 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = Color(255, 255, 255, 255);
88 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = Color(255, 255, 255, 255);
91 _OptionMenu::~_OptionMenu(void)
93 if (__isAttachedToMainTree && GetOwner() != null)
95 GetOwner()->UnlockInputEvent();
98 __pCurrentFrame = null;
100 if (__pScrollPanel != null)
102 __pScrollPanel->DetachAllChildren();
103 DetachChild(*__pScrollPanel);
104 delete __pScrollPanel;
105 __pScrollPanel = null;
108 if (__pSubMenu != null)
115 delete __pOptionMenuPresenter;
116 __pOptionMenuPresenter = null;
118 delete __pBackgroundNormalBitmap;
119 __pBackgroundNormalBitmap = null;
121 delete __pBackgroundEffectBitmap;
122 __pBackgroundEffectBitmap = null;
124 delete __pActionEvent;
125 __pActionEvent = null;
127 __actionId.RemoveAll();
129 RemoveAllAccessibilityElement();
133 _OptionMenu::CreateOptionMenuN(void)
135 result r = E_SUCCESS;
136 float minWidth = 0.0f;
137 float minHeight = 0.0f;
138 _OptionMenu* pOptionMenu = null;
139 _ScrollPanel* pScrollPanel = null;
140 _Scroll* pScroll = null;
142 GET_SHAPE_CONFIG(OPTIONMENU::LIST_MIN_WIDTH, _CONTROL_ORIENTATION_PORTRAIT, minWidth);
143 GET_SHAPE_CONFIG(OPTIONMENU::LIST_ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, minHeight);
145 pOptionMenu = new (std::nothrow) _OptionMenu();
146 SysTryReturn(NID_UI_CTRL, pOptionMenu != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
148 r = pOptionMenu->CreateRootVisualElement();
149 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
151 pOptionMenu->SetFocusable(true);
153 r = pOptionMenu->Initialize();
154 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to Initialize.", GetErrorMessage(r));
156 r = pOptionMenu->Install();
157 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to Install.", GetErrorMessage(r));
159 pOptionMenu->AcquireHandle();
160 pOptionMenu->SetTouchPressThreshold(TOUCH_PRESS_THRESHOLD_INSENSITIVE);
162 pOptionMenu->SetMovable(false);
163 pOptionMenu->SetResizable(false);
165 if (pOptionMenu->GetAccessibilityContainer() != null)
167 pOptionMenu->GetAccessibilityContainer()->Activate(true);
168 pOptionMenu->GetAccessibilityContainer()->AddListener(*pOptionMenu);
171 pScrollPanel = _ScrollPanel::CreateScrollPanelN(FloatRectangle(0.0f, 0.0f, minWidth, minHeight), SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL, false, false);
172 pScrollPanel->SetTouchPressThreshold(TOUCH_PRESS_THRESHOLD_INSENSITIVE);
174 pScroll = pScrollPanel->GetScrollBar();
175 SysTryCatch(NID_UI_CTRL, pScroll, , E_INVALID_STATE, "[%s] _Scroll is not constructed", GetErrorMessage(E_INVALID_STATE));
176 pScroll->SetContextMenuScrollType(true);
178 pOptionMenu->AttachChild(*(pScrollPanel));
180 pOptionMenu->__pScrollPanel = pScrollPanel;
192 _OptionMenu::GetScrollPanel(void)
194 return __pScrollPanel;
198 _OptionMenu::OnFocusGained(const _Control &source)
200 __currentFocusedIndex = 0;
207 _OptionMenu::OnFocusLost(const _Control &source)
209 __pOptionMenuPresenter->ClearFocus();
216 _OptionMenu::OnDrawFocus(void)
220 GetScrollPanel()->ScrollToTop();
222 __currentFocusedIndex = 0;
223 __pOptionMenuPresenter->DrawFocus(__currentFocusedIndex);
230 _OptionMenu::OnFocusModeStateChanged(void)
233 __pOptionMenuPresenter->ClearFocus();
238 _OptionMenu::OnKeyPressed(const _Control &source, const _KeyInfo &keyInfo)
240 _KeyCode keyCode = keyInfo.GetKeyCode();
244 if (keyCode == _KEY_TAB || keyCode == _KEY_UP || keyCode == _KEY_DOWN)
247 __currentFocusedIndex = 0;
248 __pOptionMenuPresenter->DrawFocus(__currentFocusedIndex);
254 int dividerHeight = 0;
255 int count = GetMaximumVisibleItemsCount();
256 int totalItemCount = GetItemCount();
258 GET_SHAPE_CONFIG(OPTIONMENU::ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, height);
259 GET_SHAPE_CONFIG(OPTIONMENU::LIST_DIVIDER_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, dividerHeight);
264 if (__currentFocusedIndex < totalItemCount - 1)
266 if (__currentFocusedIndex < count - 1)
268 __currentFocusedIndex++;
272 int pos = GetScrollPanel()->GetScrollPosition();
273 GetScrollPanel()->SetScrollPosition(pos + height + 2 * dividerHeight);
274 __currentFocusedIndex++;
279 __currentFocusedIndex = totalItemCount - 1;
284 if (__currentFocusedIndex > 0)
286 if (__currentFocusedIndex < count - 1)
288 __currentFocusedIndex--;
292 int pos = GetScrollPanel()->GetScrollPosition();
293 GetScrollPanel()->SetScrollPosition(pos - height - 2 * dividerHeight);
294 __currentFocusedIndex--;
299 __currentFocusedIndex = 0;
307 __pOptionMenuPresenter->DrawFocus(__currentFocusedIndex);
313 _OptionMenu::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
315 _KeyCode keyCode = keyInfo.GetKeyCode();
317 if (keyCode == _KEY_ENTER && __isFocused)
319 __pOptionMenuPresenter->OnEnterKeyReleased(__currentFocusedIndex);
323 if (keyCode == _KEY_ESC || keyCode == _KEY_BACK)
326 __pOptionMenuPresenter->ClearFocus();
328 SetVisibleState(false);
332 if (keyCode == _KEY_CONTEXT_MENU || keyCode == _KEY_MENU)
334 if (__isAttachedToMainTree)
336 SetVisibleState(false);
350 _OptionMenu::Install(void)
352 result r = E_SUCCESS;
354 // load bitmap of a background and arrow
356 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to load bitmap.");
358 r = __actionId.Construct();
359 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to construct arraylist.");
361 _OptionMenuPresenter* pPresenter = new (std::nothrow) _OptionMenuPresenter(this);
362 SysTryReturnResult(NID_UI_CTRL, pPresenter != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
364 SetPresenter(*pPresenter);
366 r = pPresenter->Install();
372 _OptionMenu::Initialize(void)
374 result r = E_SUCCESS;
375 FloatDimension screen(0.0f, 0.0f);
376 Color backgroundColor(0, 0, 0, 0);
377 Color backgroundSelectedColor(0, 0, 0, 0);
378 Color itemTextColor(0, 0, 0, 0);
379 Color itemTextSelectedColor(0, 0, 0, 0);
381 screen = _ControlManager::GetInstance()->GetScreenSizeF();
383 r = SetBounds(FloatRectangle(0.0f, 0.0f, screen.width, screen.height));
384 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set option menu bounds.");
389 GET_COLOR_CONFIG(OPTIONMENU::ITEM_BG_NORMAL, backgroundColor);
390 GET_COLOR_CONFIG(OPTIONMENU::ITEM_BG_PRESSED, backgroundSelectedColor);
391 GET_COLOR_CONFIG(OPTIONMENU::ITEM_TEXT_NORMAL, itemTextColor);
392 GET_COLOR_CONFIG(OPTIONMENU::ITEM_TEXT_PRESSED, itemTextSelectedColor);
394 __backgroundColor = backgroundColor;
395 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = backgroundColor;
396 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = backgroundSelectedColor;
397 __textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = itemTextColor;
398 __textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = itemTextSelectedColor;
400 if (GetVisualElement() != null)
402 GetVisualElement()->SetSurfaceOpaque(false);
409 _OptionMenu::SetPresenter(const _OptionMenuPresenter& OptionMenuPresenter)
411 __pOptionMenuPresenter = const_cast <_OptionMenuPresenter*>(&OptionMenuPresenter);
417 _OptionMenu::OnDraw(void)
419 __pOptionMenuPresenter->Draw();
421 if(unlikely((_AccessibilityManager::IsActivated())))
423 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_FIRST_ITEM);
430 _OptionMenu::OnAttachedToMainTree(void)
432 result r = E_SUCCESS;
434 __isAttachedToMainTree = true;
436 _Control* pOwner = GetOwner();
439 __pCurrentFrame = dynamic_cast<_Frame*>(_ControlManager::GetInstance()->GetCurrentFrame());
440 SysTryReturnResult(NID_UI_CTRL, __pCurrentFrame != null, E_SYSTEM, "Current frame instance is not available.");
442 _Form* pForm = __pCurrentFrame->GetCurrentForm();
443 pForm != null ? SetOwner(pForm) : SetOwner(__pCurrentFrame);
449 pOwner->LockInputEvent();
452 if (__pCurrentFrame != null)
454 __pCurrentFrame->AddFrameEventListener(*this);
457 __layout = pOwner->GetOrientation();
459 _Window* pOwnerWindow = pOwner->GetRootWindow();
461 if (pOwnerWindow != null)
463 int ownerRotation = GetEcoreEvasMgr()->GetEcoreEvas()->GetWindowRotation(*pOwnerWindow);
464 switch (ownerRotation)
467 __rotation = _CONTROL_ROTATION_0;
471 __rotation = _CONTROL_ROTATION_90;
475 __rotation = _CONTROL_ROTATION_180;
479 __rotation = _CONTROL_ROTATION_270;
483 __rotation = _CONTROL_ROTATION_0;
488 __pOptionMenuPresenter->CalculateItemMaximumWidth();
490 r = __pOptionMenuPresenter->CalculateWindowRect();
491 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
493 GetEcoreEvasMgr()->GetEcoreEvas()->SetWindowBounds(*this, GetBoundsF());
495 SetAllAccessibilityElement();
497 _VisualElement* pVisualElement = GetVisualElement();
498 FloatRectangle pBounds = pVisualElement->GetBounds();
499 float oldBoundsX = pBounds.x;
500 float oldBoundsY = pBounds.y;
502 pVisualElement->SetBounds(pBounds);
503 pVisualElement->SetOpacity(0.0f);
505 bool enable = pVisualElement->IsImplicitAnimationEnabled();
507 pVisualElement->SetImplicitAnimationEnabled(true);
509 pBounds.x = oldBoundsX;
510 pBounds.y = oldBoundsY;
511 pVisualElement->SetBounds(pBounds);
512 pVisualElement->SetOpacity(1.0f);
514 pVisualElement->SetImplicitAnimationEnabled(enable);
516 return _Window::OnAttachedToMainTree();
520 _OptionMenu::OnDetachingFromMainTree(void)
522 ReleaseTouchCapture();
524 if (__pCurrentFrame != null)
526 __pCurrentFrame->RemoveFrameEventListener(*this);
529 _Control* pOwner = GetOwner();
532 pOwner->UnlockInputEvent();
535 __isAttachedToMainTree = false;
537 __pScrollPanel->ScrollToTop();
539 return _Window::OnDetachingFromMainTree();
543 _OptionMenu::OnFrameDeactivated(const _Frame& source)
546 SetVisibleState(false);
551 _OptionMenu::OnFrameActivated(const _Frame& source)
557 _OptionMenu::OnFrameMinimized(const _Frame& source)
562 _OptionMenu::OnFrameRestored(const _Frame& source)
568 _OptionMenu::OnActivated(void)
570 _TouchManager* pTouchManager = _TouchManager::GetInstance();
572 if (pTouchManager != null)
574 pTouchManager->SetTouchCanceled(null);
576 SetTouchCapture(false, false);
578 return _Window::OnActivated();
582 _OptionMenu::OnDeactivated(void)
584 __pOptionMenuPresenter->ResetSelectedItem();
585 return _Window::OnDeactivated();
589 _OptionMenu::AddItem(const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
591 result r = E_SUCCESS;
593 SysTryReturnResult(NID_UI_CTRL, (GetItemIndexFromActionId(actionId) == -1), E_SYSTEM, "A system error has occurred."
594 " The option menu already has an item with the same action id (%d)", actionId);
596 r = __pOptionMenuPresenter->AddItem(text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
597 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to add a item.");
599 __actionId.Add(actionId);
601 if (__isAttachedToMainTree)
603 __pOptionMenuPresenter->CalculateWindowRect();
610 _OptionMenu::InsertItemAt(int mainIndex, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
612 result r = E_SUCCESS;
614 SysTryReturnResult(NID_UI_CTRL, (GetItemIndexFromActionId(actionId) == -1), E_SYSTEM, "A system error has occurred."
615 " The option menu already has an item with the same action id (%d)", actionId);
617 r = __pOptionMenuPresenter->InsertItem(mainIndex, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
618 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to add a item.");
620 __actionId.InsertAt(actionId, mainIndex);
622 if (__isAttachedToMainTree)
624 __pOptionMenuPresenter->CalculateWindowRect();
631 _OptionMenu::GetItemIndexFromActionId(int actionId) const
633 return __pOptionMenuPresenter->GetItemIndexFromActionId(actionId);
637 _OptionMenu::SetItemAt(int mainIndex, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
639 result r = E_SUCCESS;
641 r = __pOptionMenuPresenter->SetItem(mainIndex, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
642 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set a item.");
644 __actionId.SetAt(actionId, mainIndex);
646 if (__isAttachedToMainTree)
648 __pOptionMenuPresenter->CalculateWindowRect();
655 _OptionMenu::AddSubItem(int mainIndex, const String& text, int actionId)
657 result r = __pOptionMenuPresenter->AddSubItem(mainIndex, text, actionId);
658 SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
660 if (__pSubMenu != null && mainIndex == __subMenuIndex)
662 __pSubMenu->AddItem(text, actionId, null, null, null);
669 _OptionMenu::InsertSubItemAt(int mainIndex, int subIndex, const String& text, int actionId)
671 result r = __pOptionMenuPresenter->InsertSubItemAt(mainIndex, subIndex, text, actionId);
672 SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
674 if (__pSubMenu != null && mainIndex == __subMenuIndex)
676 __pSubMenu->InsertItem(subIndex, text, actionId, null, null, null);
683 _OptionMenu::SetSubItemAt(int mainIndex, int subIndex, const String& text, int actionId)
685 result r = __pOptionMenuPresenter->SetSubItemAt(mainIndex, subIndex, text, actionId);
686 SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
688 if (__pSubMenu != null && mainIndex == __subMenuIndex)
690 __pSubMenu->SetItem(subIndex, text, actionId, null, null, null);
697 _OptionMenu::RemoveSubItemAt(int mainIndex, int subIndex)
699 result r = __pOptionMenuPresenter->RemoveSubItemAt(mainIndex, subIndex);
700 SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "Propagating.");
702 if (__pSubMenu != null && mainIndex == __subMenuIndex)
704 __pSubMenu->RemoveItemAt(subIndex);
711 _OptionMenu::GetSubItemCount(int mainIndex) const
713 return __pOptionMenuPresenter->GetSubItemCount(mainIndex);
717 _OptionMenu::GetSubItemIndexFromActionId(int actionId) const
719 return __pOptionMenuPresenter->GetSubItemIndexFromActionId(actionId);
723 _OptionMenu::GetSubItemActionIdAt(int mainIndex, int subIndex) const
725 return __pOptionMenuPresenter->GetSubItemActionIdAt(mainIndex, subIndex);
730 _OptionMenu::ShowSubMenu(int mainIndex, _OptionMenuItem& item)
732 if (__pSubMenu != null)
737 float textSize = 0.0f;
738 float itemHeight = 0.0f;
740 GET_SHAPE_CONFIG(OPTIONMENU::TEXT_SIZE, GetOrientation(), textSize);
741 GET_SHAPE_CONFIG(OPTIONMENU::LIST_ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, itemHeight);
743 FloatRectangle itemBounds = item.GetBoundsF();
744 itemBounds.height = itemHeight;
745 float scrollPosition = __pScrollPanel->GetScrollPosition();
746 FloatPoint anchorPosition(0.0f, 0.0f);
747 ContextMenuCoreAlign alignment = CONTEXT_MENU_CORE_ALIGN_RIGHT;
749 if (__rotation == _CONTROL_ROTATION_270 && __layout == _CONTROL_ORIENTATION_LANDSCAPE)
751 alignment = CONTEXT_MENU_CORE_ALIGN_LEFT;
755 alignment = CONTEXT_MENU_CORE_ALIGN_RIGHT;
758 anchorPosition = FloatPoint(GetBoundsF().x + itemBounds.x + itemBounds.width / 2.0f, GetBoundsF().y + itemBounds.y + itemBounds.height / 2.0f - scrollPosition);
760 __pSubMenu = _ContextMenu::CreateContextMenuN(anchorPosition, CONTEXT_MENU_CORE_STYLE_LIST, alignment);
762 if (__pSubMenu == null)
764 return GetLastResult();
767 __pSubMenu->SetFocusable(true);
769 if (__pSubMenu->GetOwner() == null)
771 _Frame* pFrame = dynamic_cast<_Frame*>(_ControlManager::GetInstance()->GetCurrentFrame());
772 SysTryReturnResult(NID_UI_CTRL, pFrame != null, E_SYSTEM, "This instance is not constructed.");
774 _Form* pForm = pFrame->GetCurrentForm();
777 __pSubMenu->SetOwner(pForm);
781 __pSubMenu->SetOwner(pFrame);
785 __pSubMenu->Initialize();
786 __pSubMenu->AddActionEventListener(*this);
788 _OptionMenuItem* pSubItem = null;
789 int subItemCount = item.GetSubItemCount();
790 for (int subIndex = 0; subIndex < subItemCount; subIndex++)
792 pSubItem = item.GetSubItem(subIndex);
793 if (pSubItem != null)
795 __pSubMenu->AddItem(pSubItem->GetText(), pSubItem->GetActionId(), null, null, null);
800 __subMenuIndex = mainIndex;
806 _OptionMenu::IsSubMenuShown(void) const
808 return (__pSubMenu != null) && __pSubMenu->IsAttached();
812 _OptionMenu::DestroySubMenu(void)
814 SysTryReturnResult(NID_UI_CTRL, __pSubMenu != null, E_SYSTEM, "A system error has occured. __pSubMenu is null.");
826 _OptionMenu::InsertItem(int index, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
828 result r = E_SUCCESS;
830 r = __pOptionMenuPresenter->InsertItem(index, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
831 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to insert a item.");
833 __actionId.InsertAt(actionId, index);
835 if (__isAttachedToMainTree)
837 __pOptionMenuPresenter->CalculateWindowRect();
844 _OptionMenu::SetItem(int index, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
846 result r = E_SUCCESS;
848 r = __pOptionMenuPresenter->SetItem(index, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
849 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set a item.");
851 __actionId.SetAt(actionId, index);
853 if (__isAttachedToMainTree)
855 __pOptionMenuPresenter->CalculateWindowRect();
862 _OptionMenu::RemoveItemAt(int index)
864 result r = E_SUCCESS;
866 r = __pOptionMenuPresenter->DeleteItem(index);
867 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to remove a item.");
869 __actionId.RemoveAt(index);
871 if (__isAttachedToMainTree)
873 __pOptionMenuPresenter->CalculateWindowRect();
880 _OptionMenu::RemoveAllItems(void)
882 result r = E_SUCCESS;
884 r = __pOptionMenuPresenter->DeleteItemAll();
885 SysTryReturnVoidResult(NID_UI_CTRL, (r == E_SUCCESS), r, "[%s] Failed to remove all items.", GetErrorMessage(r));
887 __actionId.RemoveAll();
889 if (__isAttachedToMainTree)
891 __pOptionMenuPresenter->CalculateWindowRect();
899 _OptionMenu::GetItemCount(void) const
901 return __actionId.GetCount();
905 _OptionMenu::GetItemIndexAt(int actionId) const
907 int count = __actionId.GetCount();
909 for (int i = 0; i < count; i++)
911 int index = GetItemActionIdAt(i);
913 if (actionId == index)
923 _OptionMenu::GetItemActionIdAt(int index) const
925 int count = __actionId.GetCount();
928 if (count <= 0 || index >= count)
933 __actionId.GetAt(index, actionId);
939 _OptionMenu::SetWindowRect(const FloatRectangle& rect)
947 _OptionMenu::GetWindowRect(void) const
953 _OptionMenu::SetBodyRect(const FloatRectangle& rect)
961 _OptionMenu::GetBodyRect(void) const
967 _OptionMenu::SetItemRect(const FloatRectangle& rect)
975 _OptionMenu::GetItemRect(void) const
981 _OptionMenu::SetPropertyMaxVisibleItemsCount(const Variant& count)
983 int showCount = count.ToInt();
985 SysTryReturnResult(NID_UI_CTRL, showCount > 0, E_INVALID_ARG, "Invalid argument is used. Count is invalid.");
987 __showItemCount = showCount;
993 _OptionMenu::GetPropertyMaxVisibleItemsCount(void) const
995 return Variant(__showItemCount);
999 _OptionMenu::GetMaximumVisibleItemsCount(void) const
1001 Variant count = GetProperty("maxVisibleItemsCount");
1003 return count.ToInt();
1007 _OptionMenu::SetShowItemCount(int count)
1011 r = SetProperty("maxVisibleItemsCount", Variant(count));
1012 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to set property.");
1014 if (__isAttachedToMainTree)
1016 __pOptionMenuPresenter->CalculateWindowRect();
1017 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to calculate window.");
1024 _OptionMenu::SetPropertyColor(const Variant& color)
1026 __backgroundColor = color.ToColor();
1028 result r = LoadColorReplacedBitmap(__backgroundColor);
1029 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has occurred. Failed to load the color replacement bitmap.");
1035 _OptionMenu::GetPropertyColor(void) const
1037 return Variant(__backgroundColor);
1041 _OptionMenu::SetColor(const Graphics::Color& color)
1043 return SetProperty("color", Variant(color));
1047 _OptionMenu::GetColor(void) const
1049 Variant color = GetProperty("color");
1051 return color.ToColor();
1055 _OptionMenu::SetMaxVisibleItemsCount(int maxItemsCount)
1057 result r = SetPropertyMaxVisibleItemsCount(maxItemsCount);
1058 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1060 __isMaxVisibleCountSet = true;
1062 if (__isAttachedToMainTree)
1064 __pOptionMenuPresenter->CalculateWindowRect();
1071 _OptionMenu::SetPropertyNormalItemColor(const Variant& color)
1073 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = color.ToColor();
1075 return __pOptionMenuPresenter->ApplyColorProperty();
1079 _OptionMenu::GetPropertyNormalItemColor(void) const
1081 return Variant(__itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL]);
1085 _OptionMenu::SetPropertyPressedItemColor(const Variant& color)
1087 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = color.ToColor();
1089 return __pOptionMenuPresenter->ApplyColorProperty();
1093 _OptionMenu::GetPropertyPressedItemColor(void) const
1095 return Variant(__itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED]);
1099 _OptionMenu::SetPropertyHighlightedItemColor(const Variant & color)
1101 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = color.ToColor();
1103 return __pOptionMenuPresenter->ApplyColorProperty();
1107 _OptionMenu::GetPropertyHighlightedItemColor(void) const
1109 return Variant(__itemColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED]);
1113 _OptionMenu::SetItemColor(enum OptionMenuCoreItemStatus status, const Graphics::Color& color)
1115 result r = E_SUCCESS;
1117 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1119 r = SetProperty("normalItemColor", Variant(color));
1121 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1123 r = SetProperty("pressedItemColor", Variant(color));
1127 r = SetProperty("highlightedItemColor", Variant(color));
1134 _OptionMenu::GetItemColor(enum OptionMenuCoreItemStatus status) const
1138 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1140 Variant color = GetProperty("normalItemColor");
1141 itemColor = color.ToColor();
1144 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1146 Variant color = GetProperty("pressedItemColor");
1147 itemColor = color.ToColor();
1152 Variant color = GetProperty("highlightedItemColor");
1153 itemColor = color.ToColor();
1160 _OptionMenu::SetPropertyNormalItemTextColor(const Variant& color)
1162 __textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = color.ToColor();
1164 return __pOptionMenuPresenter->ApplyColorProperty();
1168 _OptionMenu::GetPropertyNormalItemTextColor(void) const
1170 return Variant(__textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL]);
1174 _OptionMenu::SetPropertyPressedItemTextColor(const Variant& color)
1176 __textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = color.ToColor();
1178 return __pOptionMenuPresenter->ApplyColorProperty();
1182 _OptionMenu::GetPropertyPressedItemTextColor(void) const
1184 return Variant(__textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED]);
1188 _OptionMenu::SetPropertyHighlightedItemTextColor(const Variant & color)
1190 __textColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = color.ToColor();
1192 return __pOptionMenuPresenter->ApplyColorProperty();
1196 _OptionMenu::GetPropertyHighlightedItemTextColor(void) const
1198 return Variant(__textColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED]);
1202 _OptionMenu::SetTextColor(enum OptionMenuCoreItemStatus status, const Graphics::Color& color)
1204 result r = E_SUCCESS;
1206 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1208 r = SetProperty("normalItemTextColor", Variant(color));
1210 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1212 r = SetProperty("pressedItemTextColor", Variant(color));
1216 r = SetProperty("highlightedItemTextColor", Variant(color));
1223 _OptionMenu::GetTextColor(enum OptionMenuCoreItemStatus status) const
1227 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1229 Variant color = GetProperty("normalItemTextColor");
1230 textColor = color.ToColor();
1233 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1235 Variant color = GetProperty("pressedItemTextColor");
1236 textColor = color.ToColor();
1241 Variant color = GetProperty("highlightedItemTextColor");
1242 textColor = color.ToColor();
1249 _OptionMenu::AddActionEventListener(const _IActionEventListener& listener)
1251 result r = E_SUCCESS;
1253 if (__pActionEvent == null)
1255 __pActionEvent = _ActionEvent::CreateInstanceN(*this);
1256 SysTryReturnResult(NID_UI_CTRL, __pActionEvent != null, GetLastResult(), "Propagating.");
1258 r = __pActionEvent->AddListener(listener);
1259 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to remove action event listener.");
1265 delete __pActionEvent;
1266 __pActionEvent = null;
1271 _OptionMenu::RemoveActionEventListener(const _IActionEventListener& listener)
1273 SysTryReturnResult(NID_UI_CTRL, __pActionEvent != null, E_INVALID_STATE,
1274 "The action event instance isn't constructed.");
1276 result r = E_SUCCESS;
1278 r = __pActionEvent->RemoveListener(listener);
1279 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to remove action event listener");
1285 _OptionMenu::FireActionEvent(int actionId)
1287 IEventArg* pArg = _ActionEvent::CreateActionEventArgN(actionId);
1288 result r = GetLastResult();
1289 SysTryReturnResult(NID_UI_CTRL, (pArg != null), r, "Propagating.");
1291 r = __pActionEvent->Fire(*pArg);
1297 _OptionMenu::GetActionEvent(void) const
1299 return __pActionEvent;
1303 _OptionMenu::LoadBitmap(void)
1305 result r = E_SUCCESS;
1306 Color backgroundColor;
1308 r = GET_BITMAP_CONFIG_N(OPTIONMENU::BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pBackgroundEffectBitmap);
1309 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to load bitmap.");
1311 backgroundColor = GetColor();
1313 r = LoadColorReplacedBitmap(backgroundColor);
1314 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to load bitmap.");
1319 delete __pBackgroundEffectBitmap;
1320 __pBackgroundEffectBitmap = null;
1326 _OptionMenu::LoadColorReplacedBitmap(const Color& color)
1328 result r = E_SUCCESS;
1330 // Delete old bitmap
1331 if (__pBackgroundNormalBitmap != null)
1333 delete __pBackgroundNormalBitmap;
1334 __pBackgroundNormalBitmap = null;
1337 r = GET_REPLACED_BITMAP_CONFIG_N(OPTIONMENU::BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, color, __pBackgroundNormalBitmap);
1338 r = GetLastResult();
1339 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Failed to load bitmap.");
1345 _OptionMenu::GetBackgroundNormalBitmap(void) const
1347 return __pBackgroundNormalBitmap;
1351 _OptionMenu::GetBackgroundEffectBitmap(void) const
1353 return __pBackgroundEffectBitmap;
1356 _UiTouchEventDelivery
1357 _OptionMenu::OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1359 return __pOptionMenuPresenter->OnPreviewTouchPressed(source, touchinfo);
1363 _OptionMenu::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1365 return __pOptionMenuPresenter->OnTouchPressed(source, touchinfo);
1368 _UiTouchEventDelivery
1369 _OptionMenu::OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1371 return __pOptionMenuPresenter->OnPreviewTouchMoved(source, touchinfo);
1375 _OptionMenu::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1377 return __pOptionMenuPresenter->OnTouchMoved(source, touchinfo);
1380 _UiTouchEventDelivery
1381 _OptionMenu::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1383 return __pOptionMenuPresenter->OnPreviewTouchReleased(source, touchinfo);
1387 _OptionMenu::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1389 return __pOptionMenuPresenter->OnTouchReleased(source, touchinfo);
1393 _OptionMenu::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1395 __pOptionMenuPresenter->OnTouchCanceled(source, touchinfo);
1397 SetVisibleState(false);
1403 _OptionMenu::OnActionPerformed(const _Control& source, int actionId)
1405 __pOptionMenuPresenter->OnActionPerformed(source, actionId);
1409 _OptionMenu::OnFontChanged(Font* pFont)
1411 return __pOptionMenuPresenter->OnFontChanged(pFont);
1415 _OptionMenu::OnFontInfoRequested(unsigned long& style, float& size)
1417 return __pOptionMenuPresenter->OnFontInfoRequested(style, size);
1421 _OptionMenu::OnChangeLayout(_ControlRotation rotation)
1423 __layout = GetOwner()->GetOrientation();
1425 if (!__isMaxVisibleCountSet)
1427 GET_SHAPE_CONFIG(OPTIONMENU::MAX_VISIBLE_ITEM_COUNT, __layout, __showItemCount);
1430 if (__isAttachedToMainTree)
1432 if(__rotation != rotation)
1434 SetVisibleState(false);
1438 __rotation = rotation;
1440 __pOptionMenuPresenter->ResetSelectedItem();
1444 _OptionMenu::OnOwnerChanged(_Control* pOldOwner)
1446 if (!__isAttachedToMainTree)
1451 _Control* pOwner = GetOwner();
1453 if (pOldOwner != null)
1455 pOldOwner->UnlockInputEvent();
1460 pOwner->LockInputEvent();
1464 _AccessibilityElement*
1465 _OptionMenu::GetAccessibilityElement(const int mainIndex) const
1467 _AccessibilityElement* pElement = null;
1468 result r = __accessibilityElements.GetAt(mainIndex, pElement);
1469 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed at AccessibilityElement.", GetErrorMessage(r));
1480 _OptionMenu::AddAccessibilityElement(const _AccessibilityElement& element)
1482 __accessibilityElements.Add(const_cast<_AccessibilityElement*>(&element));
1486 _OptionMenu::SetAllAccessibilityElement(void)
1488 RemoveAllAccessibilityElement();
1489 __pOptionMenuPresenter->SetAllAccessibilityElement();
1493 _OptionMenu::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1499 _OptionMenu::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1505 _OptionMenu::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1511 _OptionMenu::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1517 _OptionMenu::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1523 _OptionMenu::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1529 _OptionMenu::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1531 SetVisibleState(false);
1537 _OptionMenu::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1543 _OptionMenu::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1549 _OptionMenu::RemoveAllAccessibilityElement(void)
1551 _AccessibilityContainer* pAccessibilityContainer = GetAccessibilityContainer();
1552 if (pAccessibilityContainer != null && pAccessibilityContainer->IsActivated())
1554 pAccessibilityContainer->RemoveAllElement();
1561 _OptionMenu::GetItemFromPosition(const FloatPoint& position) const
1563 return __pOptionMenuPresenter->GetItemFromPosition(position);
1567 _OptionMenu::FindItem(int index) const
1569 return __pOptionMenuPresenter->FindItem(index);
1573 _OptionMenu::SetTopDrawnItemIndex(int index)
1575 return __pOptionMenuPresenter->SetTopDrawnItemIndex(index);
1579 _OptionMenu::GetLayout(void) const
1585 _OptionMenu::GetRotation(void) const
1590 }}} // Tizen::Ui: Control