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_ResourceManager.h"
30 #include "FUiAnim_VisualElement.h"
31 #include "FUiAnim_AnimationManager.h"
32 #include "FUi_AccessibilityContainer.h"
33 #include "FUi_AccessibilityElement.h"
34 #include "FUiCtrl_ActionEvent.h"
35 #include "FUiCtrl_Form.h"
36 #include "FUiCtrl_Frame.h"
37 #include "FUiCtrl_OptionMenu.h"
38 #include "FUiCtrl_Scroll.h"
39 #include "FUiCtrl_ContextMenu.h"
40 #include "FUiCtrl_OptionMenuItem.h"
41 #include "FUi_TouchManager.h"
43 using namespace Tizen::Graphics;
44 using namespace Tizen::Base;
45 using namespace Tizen::Media;
46 using namespace Tizen::Ui::Animations;
47 using namespace Runtime;
50 static const float TOUCH_PRESS_THRESHOLD_INSENSITIVE = 0.16f;
53 namespace Tizen { namespace Ui { namespace Controls
56 IMPLEMENT_PROPERTY(_OptionMenu);
58 _OptionMenu::_OptionMenu(void)
59 : __pOptionMenuPresenter(null)
61 , __isAttachedToMainTree(false)
62 , __isMaxVisibleCountSet(false)
64 , __currentFocusedIndex(-1)
65 , __windowRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
66 , __bodyRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
67 , __itemRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
68 , __pActionEvent(null)
69 , __pBackgroundNormalBitmap(null)
70 , __pBackgroundEffectBitmap(null)
71 , __layout(_CONTROL_ORIENTATION_PORTRAIT)
72 , __pScrollPanel(null)
76 __backgroundColor = Color(255, 255, 255, 255);
78 __textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = Color(255, 255, 255, 255);
79 __textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = Color(255, 255, 255, 255);
80 __textColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = Color(255, 255, 255, 255);
82 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = Color(255, 255, 255, 255);
83 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = Color(255, 255, 255, 255);
84 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = Color(255, 255, 255, 255);
87 _OptionMenu::~_OptionMenu(void)
89 if (__isAttachedToMainTree && GetOwner() != null)
91 GetOwner()->UnlockInputEvent();
96 __pScrollPanel->DetachAllChildren();
97 DetachChild(*__pScrollPanel);
98 delete __pScrollPanel;
99 __pScrollPanel = null;
102 if (__pSubMenu != null)
109 delete __pOptionMenuPresenter;
110 __pOptionMenuPresenter = null;
112 if (__pBackgroundNormalBitmap != null)
114 delete __pBackgroundNormalBitmap;
115 __pBackgroundNormalBitmap = null;
118 if (__pBackgroundEffectBitmap != null)
120 delete __pBackgroundEffectBitmap;
121 __pBackgroundEffectBitmap = null;
126 delete __pActionEvent;
127 __pActionEvent = null;
130 __actionId.RemoveAll();
132 RemoveAllAccessibilityElement();
136 _OptionMenu::CreateOptionMenuN(void)
138 result r = E_SUCCESS;
139 float minWidth = 0.0f;
140 float minHeight = 0.0f;
141 _OptionMenu* pOptionMenu = null;
142 _ScrollPanel* pScrollPanel = null;
143 _Scroll* pScroll = null;
145 GET_SHAPE_CONFIG(OPTIONMENU::LIST_MIN_WIDTH, _CONTROL_ORIENTATION_PORTRAIT, minWidth);
146 GET_SHAPE_CONFIG(OPTIONMENU::LIST_ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, minHeight);
148 pOptionMenu = new (std::nothrow) _OptionMenu();
149 SysTryReturn(NID_UI_CTRL, pOptionMenu != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
151 r = pOptionMenu->CreateRootVisualElement();
152 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
154 pOptionMenu->SetFocusable(true);
156 r = pOptionMenu->Initialize();
157 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to Initialize.", GetErrorMessage(r));
159 r = pOptionMenu->Install();
160 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed to Install.", GetErrorMessage(r));
162 pOptionMenu->AcquireHandle();
163 pOptionMenu->SetTouchPressThreshold(TOUCH_PRESS_THRESHOLD_INSENSITIVE);
165 pOptionMenu->SetMovable(false);
166 pOptionMenu->SetResizable(false);
168 if (pOptionMenu->GetAccessibilityContainer() != null)
170 pOptionMenu->GetAccessibilityContainer()->Activate(true);
171 pOptionMenu->GetAccessibilityContainer()->AddListener(*pOptionMenu);
174 pScrollPanel = _ScrollPanel::CreateScrollPanelN(FloatRectangle(0.0f, 0.0f, minWidth, minHeight), SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL, false, false);
175 pScrollPanel->SetTouchPressThreshold(TOUCH_PRESS_THRESHOLD_INSENSITIVE);
177 pScroll = pScrollPanel->GetScrollBar();
178 SysTryCatch(NID_UI_CTRL, pScroll, , E_INVALID_STATE, "[E_INVALID_STATE] _Scroll isn't constructed");
179 pScroll->SetContextMenuScrollType(true);
181 pOptionMenu->AttachChild(*(pScrollPanel));
183 pOptionMenu->__pScrollPanel = pScrollPanel;
195 _OptionMenu::GetScrollPanel(void)
197 return __pScrollPanel;
201 _OptionMenu::OnFocusGained(const _Control &source)
203 __currentFocusedIndex = 0;
210 _OptionMenu::OnFocusLost(const _Control &source)
218 _OptionMenu::OnDrawFocus(void)
222 GetScrollPanel()->ScrollToTop();
224 __currentFocusedIndex = 0;
225 __pOptionMenuPresenter->DrawFocus(__currentFocusedIndex);
232 _OptionMenu::OnFocusModeStateChanged(void)
235 __pOptionMenuPresenter->ClearFocus();
240 _OptionMenu::OnKeyPressed(const _Control &source, const _KeyInfo &keyInfo)
242 _KeyCode keyCode = keyInfo.GetKeyCode();
246 if (keyCode == _KEY_TAB || keyCode == _KEY_UP || keyCode == _KEY_DOWN)
249 __currentFocusedIndex = 0;
250 __pOptionMenuPresenter->DrawFocus(__currentFocusedIndex);
256 int dividerHeight = 0;
257 int count = GetMaximumVisibleItemsCount();
258 int totalItemCount = GetItemCount();
260 GET_SHAPE_CONFIG(OPTIONMENU::ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, height);
261 GET_SHAPE_CONFIG(OPTIONMENU::LIST_DIVIDER_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, dividerHeight);
266 if (__currentFocusedIndex < totalItemCount - 1)
268 if (__currentFocusedIndex < count - 1)
270 __currentFocusedIndex++;
274 int pos = GetScrollPanel()->GetScrollPosition();
275 GetScrollPanel()->SetScrollPosition(pos + height + 2 * dividerHeight);
276 __currentFocusedIndex++;
281 __currentFocusedIndex = totalItemCount - 1;
286 if (__currentFocusedIndex > 0)
288 if (__currentFocusedIndex < count - 1)
290 __currentFocusedIndex--;
294 int pos = GetScrollPanel()->GetScrollPosition();
295 GetScrollPanel()->SetScrollPosition(pos - height - 2 * dividerHeight);
296 __currentFocusedIndex--;
301 __currentFocusedIndex = 0;
309 __pOptionMenuPresenter->DrawFocus(__currentFocusedIndex);
315 _OptionMenu::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
317 _KeyCode keyCode = keyInfo.GetKeyCode();
319 if (keyCode == _KEY_ENTER && __isFocused)
321 __pOptionMenuPresenter->OnEnterKeyReleased(__currentFocusedIndex);
325 if (keyCode == _KEY_ESC || keyCode == _KEY_BACK)
328 __pOptionMenuPresenter->ClearFocus();
330 SetVisibleState(false);
334 if (keyCode == _KEY_CONTEXT_MENU || keyCode == _KEY_MENU)
336 if (__isAttachedToMainTree)
338 SetVisibleState(false);
352 _OptionMenu::Install(void)
354 result r = E_SUCCESS;
356 // load bitmap of a background and arrow
358 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to load bitmap.");
360 r = __actionId.Construct();
361 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to construct arraylist.");
363 _OptionMenuPresenter* pPresenter = new (std::nothrow) _OptionMenuPresenter(this);
364 SysTryReturnResult(NID_UI_CTRL, pPresenter != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
366 SetPresenter(*pPresenter);
368 r = pPresenter->Install();
374 _OptionMenu::Initialize(void)
376 result r = E_SUCCESS;
377 FloatDimension screen(0.0f, 0.0f);
378 Color backgroundColor(0, 0, 0, 0);
379 Color backgroundSelectedColor(0, 0, 0, 0);
380 Color itemTextColor(0, 0, 0, 0);
381 Color itemTextSelectedColor(0, 0, 0, 0);
383 screen = _ControlManager::GetInstance()->GetScreenSizeF();
385 r = SetBounds(FloatRectangle(0.0f, 0.0f, screen.width, screen.height));
386 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "SetBounds failed.");
391 GET_COLOR_CONFIG(OPTIONMENU::ITEM_BG_NORMAL, backgroundColor);
392 GET_COLOR_CONFIG(OPTIONMENU::ITEM_BG_PRESSED, backgroundSelectedColor);
393 GET_COLOR_CONFIG(OPTIONMENU::ITEM_TEXT_NORMAL, itemTextColor);
394 GET_COLOR_CONFIG(OPTIONMENU::ITEM_TEXT_PRESSED, itemTextSelectedColor);
396 __backgroundColor = backgroundColor;
397 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = backgroundColor;
398 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = backgroundSelectedColor;
399 __textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = itemTextColor;
400 __textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = itemTextSelectedColor;
402 if (GetVisualElement() != null)
404 GetVisualElement()->SetSurfaceOpaque(false);
411 _OptionMenu::SetPresenter(const _OptionMenuPresenter& OptionMenuPresenter)
413 __pOptionMenuPresenter = const_cast <_OptionMenuPresenter*>(&OptionMenuPresenter);
419 _OptionMenu::OnDraw(void)
421 __pOptionMenuPresenter->Draw();
423 if(unlikely((_AccessibilityManager::IsActivated())))
425 _AccessibilityManager::GetInstance()->RequestAutoReading(_ACCESSIBILITY_AUTO_READING_MODE_FIRST_ITEM);
432 _OptionMenu::OnAttachedToMainTree(void)
434 result r = E_SUCCESS;
436 __layout = _ControlManager::GetInstance()->GetOrientation();
437 __isAttachedToMainTree = true;
438 _Control* pOwner = GetOwner();
441 _Frame* pFrame = dynamic_cast<_Frame*>(_ControlManager::GetInstance()->GetCurrentFrame());
442 SysTryReturn(NID_UI_CTRL, pFrame != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Current frame instance is not available.");
444 _Form* pForm = pFrame->GetCurrentForm();
445 pForm != null ? SetOwner(pForm) : SetOwner(pFrame);
449 pOwner->LockInputEvent();
452 r = __pOptionMenuPresenter->CalculateWindowRect();
453 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
455 SetAllAccessibilityElement();
457 _VisualElement* pVisualElement = GetVisualElement();
458 FloatRectangle pBounds = pVisualElement->GetBounds();
459 float oldBoundsX = pBounds.x;
460 float oldBoundsY = pBounds.y;
462 pVisualElement->SetBounds(pBounds);
463 pVisualElement->SetOpacity(0.0f);
465 bool enable = pVisualElement->IsImplicitAnimationEnabled();
467 pVisualElement->SetImplicitAnimationEnabled(true);
469 pBounds.x = oldBoundsX;
470 pBounds.y = oldBoundsY;
471 pVisualElement->SetBounds(pBounds);
472 pVisualElement->SetOpacity(1.0f);
474 pVisualElement->SetImplicitAnimationEnabled(enable);
476 return _Window::OnAttachedToMainTree();
480 _OptionMenu::OnDetachingFromMainTree(void)
482 ReleaseTouchCapture();
484 _Control* pOwner = GetOwner();
487 pOwner->UnlockInputEvent();
490 __isAttachedToMainTree = false;
492 __pScrollPanel->ScrollToTop();
494 return _Window::OnDetachingFromMainTree();
498 _OptionMenu::OnActivated(void)
500 _TouchManager* pTouchManager = _TouchManager::GetInstance();
504 pTouchManager->SetTouchCanceled(null);
506 SetTouchCapture(false, false);
508 return _Window::OnActivated();
512 _OptionMenu::OnDeactivated(void)
514 __pOptionMenuPresenter->ResetSelectedItem();
515 return _Window::OnDeactivated();
519 _OptionMenu::AddItem(const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
521 result r = E_SUCCESS;
523 SysTryReturn(NID_UI_CTRL, (GetItemIndexFromActionId(actionId) == -1), E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has occurred."
524 " The option menu already has an item with the same action id (%d)", actionId);
526 r = __pOptionMenuPresenter->AddItem(text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
527 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to add a item.");
529 __actionId.Add(actionId);
531 __pOptionMenuPresenter->CalculateWindowRect();
537 _OptionMenu::InsertItemAt(int mainIndex, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
539 result r = E_SUCCESS;
541 SysTryReturn(NID_UI_CTRL, (GetItemIndexFromActionId(actionId) == -1), E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has occurred."
542 " The option menu already has an item with the same action id (%d)", actionId);
544 r = __pOptionMenuPresenter->InsertItem(mainIndex, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
545 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to add a item.");
547 __actionId.InsertAt(actionId, mainIndex);
549 __pOptionMenuPresenter->CalculateWindowRect();
555 _OptionMenu::GetItemIndexFromActionId(int actionId) const
557 return __pOptionMenuPresenter->GetItemIndexFromActionId(actionId);
561 _OptionMenu::SetItemAt(int mainIndex, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
563 result r = E_SUCCESS;
565 r = __pOptionMenuPresenter->SetItem(mainIndex, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
566 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to set a item.");
568 __actionId.SetAt(actionId, mainIndex);
570 __pOptionMenuPresenter->CalculateWindowRect();
576 _OptionMenu::AddSubItem(int mainIndex, const String& text, int actionId)
578 result r = __pOptionMenuPresenter->AddSubItem(mainIndex, text, actionId);
579 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
581 if (__pSubMenu != null && mainIndex == __subMenuIndex)
583 __pSubMenu->AddItem(text, actionId, null, null, null);
590 _OptionMenu::InsertSubItemAt(int mainIndex, int subIndex, const String& text, int actionId)
592 result r = __pOptionMenuPresenter->InsertSubItemAt(mainIndex, subIndex, text, actionId);
593 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
595 if (__pSubMenu != null && mainIndex == __subMenuIndex)
597 __pSubMenu->InsertItem(subIndex, text, actionId, null, null, null);
604 _OptionMenu::SetSubItemAt(int mainIndex, int subIndex, const String& text, int actionId)
606 result r = __pOptionMenuPresenter->SetSubItemAt(mainIndex, subIndex, text, actionId);
607 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
609 if (__pSubMenu != null && mainIndex == __subMenuIndex)
611 __pSubMenu->SetItem(subIndex, text, actionId, null, null, null);
618 _OptionMenu::RemoveSubItemAt(int mainIndex, int subIndex)
620 result r = __pOptionMenuPresenter->RemoveSubItemAt(mainIndex, subIndex);
621 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
623 if (__pSubMenu != null && mainIndex == __subMenuIndex)
625 __pSubMenu->RemoveItemAt(subIndex);
632 _OptionMenu::GetSubItemCount(int mainIndex) const
634 return __pOptionMenuPresenter->GetSubItemCount(mainIndex);
638 _OptionMenu::GetSubItemIndexFromActionId(int actionId) const
640 return __pOptionMenuPresenter->GetSubItemIndexFromActionId(actionId);
644 _OptionMenu::GetSubItemActionIdAt(int mainIndex, int subIndex) const
646 return __pOptionMenuPresenter->GetSubItemActionIdAt(mainIndex, subIndex);
651 _OptionMenu::ShowSubMenu(int mainIndex, _OptionMenuItem& item)
653 if (__pSubMenu != null)
658 float textSize = 0.0f;
659 float itemHeight = 0.0f;
661 GET_SHAPE_CONFIG(OPTIONMENU::TEXT_SIZE, GetOrientation(), textSize);
662 GET_SHAPE_CONFIG(OPTIONMENU::LIST_ITEM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, itemHeight);
664 FloatRectangle itemBounds = item.GetBoundsF();
665 itemBounds.height = itemHeight;
666 float scrollPosition = __pScrollPanel->GetScrollPosition();
667 FloatPoint anchorPosition(0.0f, 0.0f);
668 _ControlRotation rotation = _ControlManager::GetInstance()->GetScreenRotation();
669 ContextMenuCoreAlign alignment = CONTEXT_MENU_CORE_ALIGN_RIGHT;
671 if (rotation == _CONTROL_ROTATION_270 && __layout == _CONTROL_ORIENTATION_LANDSCAPE)
673 alignment = CONTEXT_MENU_CORE_ALIGN_LEFT;
677 alignment = CONTEXT_MENU_CORE_ALIGN_RIGHT;
680 anchorPosition = FloatPoint(GetBoundsF().x + itemBounds.x + itemBounds.width / 2.0f, GetBoundsF().y + itemBounds.y + itemBounds.height / 2.0f - scrollPosition);
682 __pSubMenu = _ContextMenu::CreateContextMenuN(anchorPosition, CONTEXT_MENU_CORE_STYLE_LIST, alignment);
684 if (__pSubMenu == null)
686 return GetLastResult();
689 __pSubMenu->SetFocusable(true);
691 if (__pSubMenu->GetOwner() == null)
693 _Frame* pFrame = dynamic_cast<_Frame*>(_ControlManager::GetInstance()->GetCurrentFrame());
694 SysTryReturn(NID_UI_CTRL, pFrame != null, E_SYSTEM,
695 E_SYSTEM, "[E_SYSTEM] This instance is not constructed.");
697 _Form* pForm = pFrame->GetCurrentForm();
700 __pSubMenu->SetOwner(pForm);
704 __pSubMenu->SetOwner(pFrame);
708 __pSubMenu->Initialize();
709 __pSubMenu->AddActionEventListener(*this);
711 _OptionMenuItem* pSubItem = null;
712 int subItemCount = item.GetSubItemCount();
713 for (int subIndex = 0; subIndex < subItemCount; subIndex++)
715 pSubItem = item.GetSubItem(subIndex);
716 if (pSubItem != null)
718 __pSubMenu->AddItem(pSubItem->GetText(), pSubItem->GetActionId(), null, null, null);
723 __subMenuIndex = mainIndex;
729 _OptionMenu::IsSubMenuShown(void) const
731 return (__pSubMenu != null) && __pSubMenu->IsAttached();
735 _OptionMenu::DestroySubMenu(void)
737 if (__pSubMenu == null)
752 _OptionMenu::InsertItem(int index, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
754 result r = E_SUCCESS;
756 r = __pOptionMenuPresenter->InsertItem(index, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
757 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to insert a item.");
759 __actionId.InsertAt(actionId, index);
761 __pOptionMenuPresenter->CalculateWindowRect();
767 _OptionMenu::SetItem(int index, const String& text, int actionId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
769 result r = E_SUCCESS;
771 r = __pOptionMenuPresenter->SetItem(index, text, actionId, pNormalBitmap, pPressedBitmap, pHighlightedBitmap);
772 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to set a item.");
774 __actionId.SetAt(actionId, index);
776 __pOptionMenuPresenter->CalculateWindowRect();
782 _OptionMenu::RemoveItemAt(int index)
784 result r = E_SUCCESS;
786 r = __pOptionMenuPresenter->DeleteItem(index);
787 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to remove a item.");
789 __actionId.RemoveAt(index);
791 __pOptionMenuPresenter->CalculateWindowRect();
797 _OptionMenu::RemoveAllItems(void)
799 result r = E_SUCCESS;
801 r = __pOptionMenuPresenter->DeleteItemAll();
802 SysTryReturnVoidResult(NID_UI_CTRL, (r == E_SUCCESS), r, "[%s] Failed to remove all items.", GetErrorMessage(r));
804 __actionId.RemoveAll();
806 __pOptionMenuPresenter->CalculateWindowRect();
813 _OptionMenu::GetItemCount(void) const
815 return __actionId.GetCount();
819 _OptionMenu::GetItemIndexAt(int actionId) const
821 int count = __actionId.GetCount();
823 for (int i = 0; i < count; i++)
825 int index = GetItemActionIdAt(i);
827 if (actionId == index)
837 _OptionMenu::GetItemActionIdAt(int index) const
839 int count = __actionId.GetCount();
842 if (count <= 0 || index >= count)
847 __actionId.GetAt(index, actionId);
853 _OptionMenu::SetWindowRect(const FloatRectangle& rect)
861 _OptionMenu::GetWindowRect(void) const
867 _OptionMenu::SetBodyRect(const FloatRectangle& rect)
875 _OptionMenu::GetBodyRect(void) const
881 _OptionMenu::SetItemRect(const FloatRectangle& rect)
889 _OptionMenu::GetItemRect(void) const
895 _OptionMenu::SetPropertyMaxVisibleItemsCount(const Variant& count)
897 int showCount = count.ToInt();
901 SysLogException(NID_UI_CTRL, E_INVALID_ARG, "Count is invalid.");
902 return E_INVALID_ARG;
905 __showItemCount = showCount;
911 _OptionMenu::GetPropertyMaxVisibleItemsCount(void) const
913 return Tizen::Ui::Variant(__showItemCount);
917 _OptionMenu::GetMaximumVisibleItemsCount(void) const
919 Variant count = GetProperty("maxVisibleItemsCount");
921 return count.ToInt();
925 _OptionMenu::SetShowItemCount(int count)
929 r = SetProperty("maxVisibleItemsCount", Variant(count));
930 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to set property.");
932 r = __pOptionMenuPresenter->CalculateWindowRect();
933 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to calculate window.");
939 _OptionMenu::SetPropertyColor(const Variant& color)
941 __backgroundColor = color.ToColor();
943 result r = LoadColorReplacedBitmap(__backgroundColor);
944 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[%s] A system error occurred. Failed to load the color replacement bitmap.", GetErrorMessage(r));
950 _OptionMenu::GetPropertyColor(void) const
952 return Tizen::Ui::Variant(__backgroundColor);
956 _OptionMenu::SetColor(const Graphics::Color& color)
958 return SetProperty("color", Variant(color));
962 _OptionMenu::GetColor(void) const
964 Variant color = GetProperty("color");
966 return color.ToColor();
970 _OptionMenu::SetMaxVisibleItemsCount(int maxItemsCount)
972 result r = SetPropertyMaxVisibleItemsCount(maxItemsCount);
973 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
975 __isMaxVisibleCountSet = true;
977 __pOptionMenuPresenter->CalculateWindowRect();
983 _OptionMenu::SetPropertyNormalItemColor(const Variant& color)
985 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = color.ToColor();
987 return __pOptionMenuPresenter->ApplyColorProperty();
991 _OptionMenu::GetPropertyNormalItemColor(void) const
993 return Tizen::Ui::Variant(__itemColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL]);
997 _OptionMenu::SetPropertyPressedItemColor(const Variant& color)
999 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = color.ToColor();
1001 return __pOptionMenuPresenter->ApplyColorProperty();
1005 _OptionMenu::GetPropertyPressedItemColor(void) const
1007 return Tizen::Ui::Variant(__itemColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED]);
1011 _OptionMenu::SetPropertyHighlightedItemColor(const Variant & color)
1013 __itemColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = color.ToColor();
1015 return __pOptionMenuPresenter->ApplyColorProperty();
1019 _OptionMenu::GetPropertyHighlightedItemColor(void) const
1021 return Tizen::Ui::Variant(__itemColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED]);
1025 _OptionMenu::SetItemColor(enum OptionMenuCoreItemStatus status, const Graphics::Color& color)
1027 result r = E_SUCCESS;
1029 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1031 r = SetProperty("normalItemColor", Variant(color));
1033 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1035 r = SetProperty("pressedItemColor", Variant(color));
1039 r = SetProperty("highlightedItemColor", Variant(color));
1046 _OptionMenu::GetItemColor(enum OptionMenuCoreItemStatus status) const
1050 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1052 Variant color = GetProperty("normalItemColor");
1053 itemColor = color.ToColor();
1056 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1058 Variant color = GetProperty("pressedItemColor");
1059 itemColor = color.ToColor();
1064 Variant color = GetProperty("highlightedItemColor");
1065 itemColor = color.ToColor();
1072 _OptionMenu::SetPropertyNormalItemTextColor(const Variant& color)
1074 __textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL] = color.ToColor();
1076 return __pOptionMenuPresenter->ApplyColorProperty();
1080 _OptionMenu::GetPropertyNormalItemTextColor(void) const
1082 return Tizen::Ui::Variant(__textColor[OPTION_MENU_CORE_ITEM_STATUS_NORMAL]);
1086 _OptionMenu::SetPropertyPressedItemTextColor(const Variant& color)
1088 __textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED] = color.ToColor();
1090 return __pOptionMenuPresenter->ApplyColorProperty();
1094 _OptionMenu::GetPropertyPressedItemTextColor(void) const
1096 return Tizen::Ui::Variant(__textColor[OPTION_MENU_CORE_ITEM_STATUS_PRESSED]);
1100 _OptionMenu::SetPropertyHighlightedItemTextColor(const Variant & color)
1102 __textColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED] = color.ToColor();
1104 return __pOptionMenuPresenter->ApplyColorProperty();
1108 _OptionMenu::GetPropertyHighlightedItemTextColor(void) const
1110 return Tizen::Ui::Variant(__textColor[OPTION_MENU_CORE_ITEM_STATUS_HIGHLIGHTED]);
1114 _OptionMenu::SetTextColor(enum OptionMenuCoreItemStatus status, const Graphics::Color& color)
1116 result r = E_SUCCESS;
1118 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1120 r = SetProperty("normalItemTextColor", Variant(color));
1122 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1124 r = SetProperty("pressedItemTextColor", Variant(color));
1128 r = SetProperty("highlightedItemTextColor", Variant(color));
1135 _OptionMenu::GetTextColor(enum OptionMenuCoreItemStatus status) const
1139 if (status == OPTION_MENU_CORE_ITEM_STATUS_NORMAL)
1141 Variant color = GetProperty("normalItemTextColor");
1142 textColor = color.ToColor();
1145 else if (status == OPTION_MENU_CORE_ITEM_STATUS_PRESSED)
1147 Variant color = GetProperty("pressedItemTextColor");
1148 textColor = color.ToColor();
1153 Variant color = GetProperty("highlightedItemTextColor");
1154 textColor = color.ToColor();
1161 _OptionMenu::AddActionEventListener(const _IActionEventListener& listener)
1163 result r = E_SUCCESS;
1165 if (__pActionEvent == null)
1167 __pActionEvent = _ActionEvent::CreateInstanceN(*this);
1168 SysTryReturn(NID_UI_CTRL, __pActionEvent != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1170 r = __pActionEvent->AddListener(listener);
1171 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to remove an action event listener.");
1177 delete __pActionEvent;
1178 __pActionEvent = null;
1183 _OptionMenu::RemoveActionEventListener(const _IActionEventListener& listener)
1185 SysTryReturn(NID_UI_CTRL, __pActionEvent != null, E_INVALID_STATE, E_INVALID_STATE,
1186 "[E_INVALID_STATE] The action event instance isn't constructed.");
1188 result r = E_SUCCESS;
1190 r = __pActionEvent->RemoveListener(listener);
1191 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "Failed to remove an action event listener");
1197 _OptionMenu::FireActionEvent(int actionId)
1199 IEventArg* pArg = _ActionEvent::CreateActionEventArgN(actionId);
1200 result r = GetLastResult();
1201 SysTryReturn(NID_UI_CTRL, (pArg != null), r, r, "[%s] Propagating.", GetErrorMessage(r));
1203 r = __pActionEvent->Fire(*pArg);
1209 _OptionMenu::GetActionEvent(void) const
1211 return __pActionEvent;
1215 _OptionMenu::LoadBitmap(void)
1217 result r = E_SUCCESS;
1218 Color backgroundColor;
1220 r = GET_BITMAP_CONFIG_N(OPTIONMENU::BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pBackgroundEffectBitmap);
1221 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to load bitmap.");
1223 backgroundColor = GetColor();
1225 r = LoadColorReplacedBitmap(backgroundColor);
1226 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to load bitmap.");
1231 delete __pBackgroundEffectBitmap;
1232 __pBackgroundEffectBitmap = null;
1238 _OptionMenu::LoadColorReplacedBitmap(const Color& color)
1240 result r = E_SUCCESS;
1241 Bitmap* ptempNormalBitmap = null;
1243 // Delete old bitmap
1244 if (__pBackgroundNormalBitmap != null)
1246 delete __pBackgroundNormalBitmap;
1247 __pBackgroundNormalBitmap = null;
1250 r = GET_BITMAP_CONFIG_N(OPTIONMENU::BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, ptempNormalBitmap);
1251 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "Failed to load bitmap.");
1253 __pBackgroundNormalBitmap = _BitmapImpl::GetColorReplacedBitmapN(*ptempNormalBitmap, Color::GetColor(COLOR_ID_MAGENTA), color);
1254 SysTryCatch(NID_UI_CTRL, __pBackgroundNormalBitmap != null, , GetLastResult(), "[%s] Propagating.",
1255 GetErrorMessage(GetLastResult()));
1256 delete ptempNormalBitmap;
1261 delete ptempNormalBitmap;
1263 delete __pBackgroundNormalBitmap;
1264 __pBackgroundNormalBitmap = null;
1270 _OptionMenu::GetBackgroundNormalBitmap(void) const
1272 return __pBackgroundNormalBitmap;
1276 _OptionMenu::GetBackgroundEffectBitmap(void) const
1278 return __pBackgroundEffectBitmap;
1281 _UiTouchEventDelivery
1282 _OptionMenu::OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1284 return __pOptionMenuPresenter->OnPreviewTouchPressed(source, touchinfo);
1288 _OptionMenu::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1290 return __pOptionMenuPresenter->OnTouchPressed(source, touchinfo);
1293 _UiTouchEventDelivery
1294 _OptionMenu::OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1296 return __pOptionMenuPresenter->OnPreviewTouchMoved(source, touchinfo);
1300 _OptionMenu::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1302 return __pOptionMenuPresenter->OnTouchMoved(source, touchinfo);
1305 _UiTouchEventDelivery
1306 _OptionMenu::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1308 return __pOptionMenuPresenter->OnPreviewTouchReleased(source, touchinfo);
1312 _OptionMenu::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1314 return __pOptionMenuPresenter->OnTouchReleased(source, touchinfo);
1318 _OptionMenu::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1320 __pOptionMenuPresenter->OnTouchCanceled(source, touchinfo);
1322 SetVisibleState(false);
1328 _OptionMenu::OnActionPerformed(const _Control& source, int actionId)
1330 __pOptionMenuPresenter->OnActionPerformed(source, actionId);
1334 _OptionMenu::OnFontChanged(Font* pFont)
1336 return __pOptionMenuPresenter->OnFontChanged(pFont);
1340 _OptionMenu::OnFontInfoRequested(unsigned long& style, float& size)
1342 return __pOptionMenuPresenter->OnFontInfoRequested(style, size);
1346 _OptionMenu::OnChangeLayout(_ControlRotation rotation)
1348 __layout = GetOwner()->GetOrientation();
1350 if (!__isMaxVisibleCountSet)
1352 GET_SHAPE_CONFIG(OPTIONMENU::MAX_VISIBLE_ITEM_COUNT, __layout, __showItemCount);
1355 __pOptionMenuPresenter->ResetSelectedItem();
1356 __pOptionMenuPresenter->CalculateWindowRect();
1360 _OptionMenu::OnOwnerChanged(_Control* pOldOwner)
1362 if (!__isAttachedToMainTree)
1367 _Control* pOwner = GetOwner();
1369 if (pOldOwner != null)
1371 pOldOwner->UnlockInputEvent();
1376 pOwner->LockInputEvent();
1380 _AccessibilityElement*
1381 _OptionMenu::GetAccessibilityElement(const int mainIndex) const
1383 _AccessibilityElement* pElement = null;
1384 result r = __accessibilityElements.GetAt(mainIndex, pElement);
1385 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Failed at AccessibilityElement.", GetErrorMessage(r));
1396 _OptionMenu::AddAccessibilityElement(const _AccessibilityElement& element)
1398 __accessibilityElements.Add(const_cast<_AccessibilityElement*>(&element));
1402 _OptionMenu::SetAllAccessibilityElement(void)
1404 RemoveAllAccessibilityElement();
1405 __pOptionMenuPresenter->SetAllAccessibilityElement();
1409 _OptionMenu::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1415 _OptionMenu::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1421 _OptionMenu::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1427 _OptionMenu::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1433 _OptionMenu::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1439 _OptionMenu::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1445 _OptionMenu::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1447 SetVisibleState(false);
1453 _OptionMenu::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1459 _OptionMenu::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
1465 _OptionMenu::RemoveAllAccessibilityElement(void)
1467 _AccessibilityContainer* pAccessibilityContainer = GetAccessibilityContainer();
1468 if (pAccessibilityContainer && pAccessibilityContainer->IsActivated())
1470 pAccessibilityContainer->RemoveAllElement();
1477 _OptionMenu::GetItemFromPosition(const FloatPoint& position) const
1479 return __pOptionMenuPresenter->GetItemFromPosition(position);
1483 _OptionMenu::FindItem(int index) const
1485 return __pOptionMenuPresenter->FindItem(index);
1489 _OptionMenu::SetTopDrawnItemIndex(int index)
1491 return __pOptionMenuPresenter->SetTopDrawnItemIndex(index);
1495 _OptionMenu::GetLayout(void) const
1500 }}} // Tizen::Ui: Control