2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
18 * @file FUiCtrl_OptionMenu.cpp
19 * @brief This is the implementation file for the _OptionMenu class.
22 #include <FBaseColIEnumeratorT.h>
24 #include "FUiCtrl_OptionMenu.h"
25 #include "FUiCtrl_OptionMenuPresenter.h"
26 #include "FUiCtrl_ActionEvent.h"
27 #include "FUiCtrl_ContextMenu.h"
28 #include "FUiCtrl_Frame.h"
29 #include "FUiCtrl_Form.h"
30 #include "FUiAnim_VisualElement.h"
31 #include "FUi_AccessibilityContainer.h"
32 #include "FUi_AccessibilityElement.h"
33 #include "FUi_ResourceManager.h"
35 using namespace Tizen::Base;
36 using namespace Tizen::Base::Collection;
37 using namespace Tizen::Base::Runtime;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
41 namespace Tizen { namespace Ui { namespace Controls
44 _OptionMenu::_OptionMenu(void)
46 , __pOptionMenuPresenter(null)
47 , __pActionEvent(null)
53 _OptionMenu::~_OptionMenu(void)
55 delete __pOptionMenuPresenter;
56 __pOptionMenuPresenter = null;
58 if (__pActionEvent != null)
60 delete __pActionEvent;
61 __pActionEvent = null;
64 if (__pSubMenu != null)
71 RemoveAllAccessibilityElement();
75 _OptionMenu::CreateOptionMenuN(void)
77 _OptionMenu* pOptionMenu = new (std::nothrow) _OptionMenu;
78 SysTryReturn(NID_UI_CTRL, (pOptionMenu != null), null, E_OUT_OF_MEMORY,
79 "[E_OUT_OF_MEMORY] Memory allocation failed.");
81 result r = GetLastResult();
82 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), null, r, "[%s] Propagating.", GetErrorMessage(r));
84 #if defined(MULTI_WINDOW)
85 r = pOptionMenu->CreateRootVisualElement();
86 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
89 pOptionMenu->AcquireHandle();
91 SysTryCatch(NID_UI_CTRL, (pOptionMenu->GetVisualElement() != null), , E_SYSTEM,
92 "[E_SYSTEM] A system error has occurred. Failed to get _VisualElement instance.");
94 pOptionMenu->__pOptionMenuPresenter = _OptionMenuPresenter::CreateInstanceN(*pOptionMenu);
96 SysTryCatch(NID_UI_CTRL, (pOptionMenu->__pOptionMenuPresenter != null), , r,
97 "[%s] Propagating.", GetErrorMessage(r));
99 r = pOptionMenu->__pOptionMenuPresenter->InitializeTextObject();
100 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
102 r = pOptionMenu->__pOptionMenuPresenter->InitializeVisualElement();
103 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
105 pOptionMenu->__pActionEvent = _ActionEvent::CreateInstanceN(*pOptionMenu);
107 SysTryCatch(NID_UI_CTRL, (pOptionMenu->__pActionEvent != null), , r,
108 "[%s] Propagating.", GetErrorMessage(r));
110 // Set alpha merge to VisualElement
111 pOptionMenu->GetVisualElement()->SetSurfaceOpaque(false);
112 pOptionMenu->SetBackgroundColor(Color());
114 pOptionMenu->SetMovable(false);
115 pOptionMenu->SetResizable(false);
117 if (pOptionMenu->GetAccessibilityContainer() != null)
119 pOptionMenu->GetAccessibilityContainer()->Activate(true);
129 _OptionMenu::AddActionEventListener(const _IActionEventListener& listener)
131 return __pActionEvent->AddListener(listener);
135 _OptionMenu::RemoveActionEventListener(const _IActionEventListener& listener)
137 return __pActionEvent->RemoveListener(listener);
141 _OptionMenu::FireActionEvent(int actionId)
143 IEventArg* pArg = _ActionEvent::CreateActionEventArgN(actionId);
144 result r = GetLastResult();
145 SysTryReturn(NID_UI_CTRL, (pArg != null), r, r, "[%s] Propagating.", GetErrorMessage(r));
147 r = __pActionEvent->Fire(*pArg);
153 _OptionMenu::AddItem(const String& text, int actionId)
155 result r = __pOptionMenuPresenter->AddItem(text, actionId);
157 if (likely(!(_AccessibilityManager::IsActivated())))
164 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
165 if (pContainer != null)
167 _AccessibilityElement* pElement = new (std::nothrow) _AccessibilityElement(true);
168 if (pElement != null)
170 pElement->SetLabel(text);
171 pElement->SetTrait(ACCESSIBILITY_TRAITS_BUTTON);
172 pElement->SetHint(L"Double tap to select");
173 // pElement->SetTrait(ACCESSIBILITY_TRAITS_OPTIONMENU);
174 pContainer->AddElement(*pElement);
175 __accessibilityElements.Add(pElement);
176 SetBoundsAllAccessibilityElement();
185 _OptionMenu::InsertItemAt(int mainIndex, const String& text, int actionId)
187 result r = __pOptionMenuPresenter->InsertItemAt(mainIndex, text, actionId);
189 if (likely(!(_AccessibilityManager::IsActivated())))
196 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
197 if (pContainer != null)
199 _AccessibilityElement* pElement = new (std::nothrow) _AccessibilityElement(true);
200 if (pElement != null)
202 pElement->SetLabel(text);
203 pElement->SetTrait(ACCESSIBILITY_TRAITS_BUTTON);
204 pElement->SetHint(L"Double tap to select");
205 // pElement->SetTrait(ACCESSIBILITY_TRAITS_OPTIONMENU);
206 pContainer->InsertElement(*pElement, mainIndex);
207 __accessibilityElements.InsertAt(pElement, mainIndex);
208 SetBoundsAllAccessibilityElement();
217 _OptionMenu::SetItemAt(int mainIndex, const String& text, int actionId)
219 result r = __pOptionMenuPresenter->SetItemAt(mainIndex, text, actionId);
221 if (likely(!(_AccessibilityManager::IsActivated())))
228 _AccessibilityElement* pElement = GetAccessibilityElement(mainIndex);
229 if (pElement != null)
231 pElement->SetLabel(text);
239 _OptionMenu::RemoveItemAt(int mainIndex)
241 result r = __pOptionMenuPresenter->RemoveItemAt(mainIndex);
243 if (likely(!(_AccessibilityManager::IsActivated())))
250 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
251 if (pContainer != null)
253 _AccessibilityElement* pElement = GetAccessibilityElement(mainIndex);
254 if (pElement != null)
256 pContainer->RemoveElement(*pElement);
257 __accessibilityElements.RemoveAt(mainIndex);
258 SetBoundsAllAccessibilityElement();
267 _OptionMenu::GetItemCount(void) const
269 return __pOptionMenuPresenter->GetItemCount();
273 _OptionMenu::GetItemIndexFromActionId(int actionId) const
275 return __pOptionMenuPresenter->GetItemIndexFromActionId(actionId);
279 _OptionMenu::GetItemActionIdAt(int mainIndex) const
281 return __pOptionMenuPresenter->GetItemActionIdAt(mainIndex);
285 _OptionMenu::AddSubItem(int mainIndex, const String& text, int actionId)
287 result r = __pOptionMenuPresenter->AddSubItem(mainIndex, text, actionId);
288 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
290 if (__pSubMenu != null && mainIndex == __subMenuIndex)
292 __pSubMenu->AddItem(text, actionId, null, null, null);
298 _OptionMenu::InsertSubItemAt(int mainIndex, int subIndex, const String& text, int actionId)
300 result r = __pOptionMenuPresenter->InsertSubItemAt(mainIndex, subIndex, text, actionId);
301 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
303 if (__pSubMenu != null && mainIndex == __subMenuIndex)
305 __pSubMenu->InsertItem(subIndex, text, actionId, null, null, null);
312 _OptionMenu::SetSubItemAt(int mainIndex, int subIndex, const String& text, int actionId)
314 result r = __pOptionMenuPresenter->SetSubItemAt(mainIndex, subIndex, text, actionId);
315 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
317 if (__pSubMenu != null && mainIndex == __subMenuIndex)
319 __pSubMenu->SetItem(subIndex, text, actionId, null, null, null);
326 _OptionMenu::RemoveSubItemAt(int mainIndex, int subIndex)
328 result r = __pOptionMenuPresenter->RemoveSubItemAt(mainIndex, subIndex);
329 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
331 if (__pSubMenu != null && mainIndex == __subMenuIndex)
333 __pSubMenu->RemoveItemAt(subIndex);
340 _OptionMenu::GetSubItemCount(int mainIndex) const
342 return __pOptionMenuPresenter->GetSubItemCount(mainIndex);
346 _OptionMenu::GetSubItemIndexFromActionId(int actionId) const
348 return __pOptionMenuPresenter->GetSubItemIndexFromActionId(actionId);
352 _OptionMenu::GetSubItemActionIdAt(int mainIndex, int subIndex) const
354 return __pOptionMenuPresenter->GetSubItemActionIdAt(mainIndex, subIndex);
358 _OptionMenu::IsSubMenuShown(void) const
360 return (__pSubMenu != null) && __pSubMenu->IsAttached();
364 _OptionMenu::ShowSubMenu(int mainIndex, _OptionMenuItem& item)
366 if (__pSubMenu != null)
372 Font* pFont = __pOptionMenuPresenter->GetFont();
373 GET_SHAPE_CONFIG(OPTIONMENU::TEXT_SIZE, GetOrientation(), textSize);
375 Rectangle itemBounds = __pOptionMenuPresenter->GetItemBounds(mainIndex);
376 Point anchorPosition(GetBounds().x + itemBounds.x + itemBounds.width / 2,
377 GetBounds().y + itemBounds.y + itemBounds.height / 2 - textSize / 2);
378 __pSubMenu = _ContextMenu::CreateContextMenuN(anchorPosition,
379 CONTEXT_MENU_CORE_STYLE_LIST,
380 CONTEXT_MENU_CORE_ALIGN_UP);
381 if (__pSubMenu == null)
383 return GetLastResult();
386 if (__pSubMenu->GetOwner() == null)
388 _Frame* pFrame = dynamic_cast<_Frame*>(_ControlManager::GetInstance()->GetCurrentFrame());
389 SysTryReturn(NID_UI_CTRL, pFrame != null, E_SYSTEM,
390 E_SYSTEM, "[E_SYSTEM] This instance is not constructed.");
392 _Form* pForm = pFrame->GetCurrentForm();
395 __pSubMenu->SetOwner(pForm);
399 __pSubMenu->SetOwner(pFrame);
403 __pSubMenu->Initialize();
404 __pSubMenu->AddActionEventListener(*this);
406 _OptionMenuItem* pSubItem = null;
407 int subItemCount = item.GetSubItemCount();
408 for (int subIndex = 0; subIndex < subItemCount; subIndex++)
410 pSubItem = item.GetSubItem(subIndex);
411 if (pSubItem != null)
413 __pSubMenu->AddItem(pSubItem->GetText(), pSubItem->GetActionId(), null, null, null);
419 __pSubMenu->SetFont(pFont->GetFaceName());
424 __subMenuIndex = mainIndex;
430 _OptionMenu::DestroySubMenu(void)
432 if (__pSubMenu == null)
445 _AccessibilityElement*
446 _OptionMenu::GetAccessibilityElement(int mainIndex)
448 if (likely(!(_AccessibilityManager::IsActivated())))
453 _AccessibilityElement* pElement = null;
454 result r = E_SUCCESS;
456 if(likely(!(_AccessibilityManager::IsActivated())))
461 r = __accessibilityElements.GetAt(mainIndex,pElement);
462 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), null, r, "[%s] Propagating.", GetErrorMessage(r));
467 _OptionMenu::OnDraw()
469 __pOptionMenuPresenter->Draw();
473 _OptionMenu::OnChangeLayout(_ControlOrientation orientation)
475 __pOptionMenuPresenter->OnChangeLayout(orientation);
479 _OptionMenu::OnBoundsChanged(void)
481 SetBoundsAllAccessibilityElement();
485 _OptionMenu::OnAttachingToMainTree(const _Control* pParent)
487 result r = __pOptionMenuPresenter->OnAttachingToMainTree(pParent);
493 return _Window::OnAttachingToMainTree(pParent);
497 _OptionMenu::OnAttachedToMainTree(void)
499 __pOptionMenuPresenter->OnAttachedToMainTree();
504 _OptionMenu::OnDetachingFromMainTree(void)
506 __pOptionMenuPresenter->OnDetachingFromMainTree();
508 return _Window::OnDetachingFromMainTree();
512 _OptionMenu::OnVisibleStateChanged(void)
514 #if defined(MULTI_WINDOW)
515 _Window::OnVisibleStateChanged();
518 __pOptionMenuPresenter->OnVisibleStateChanged();
522 _OptionMenu::OnActivated(void)
524 _Window::OnActivated();
526 if (GetOwner() != null)
528 ChangeLayout(GetOwner()->GetOrientation());
532 ChangeLayout(_ControlManager::GetInstance()->GetOrientation());
535 if (__pOptionMenuPresenter != null)
537 __pOptionMenuPresenter->CalculateBounds();
539 __pOptionMenuPresenter->PrepareAnimation();
540 __pOptionMenuPresenter->SetOptionMenuVisibility(true);
547 _OptionMenu::OnDeactivated(void)
549 ReleaseTouchCapture();
550 _Window::OnDeactivated();
554 _OptionMenu::OnFontChanged(Font* pFont)
556 __pOptionMenuPresenter->OnFontChanged(pFont);
561 _OptionMenu::OnFontInfoRequested(unsigned long& style, int& size)
563 __pOptionMenuPresenter->OnFontInfoRequested(style, size);
568 _OptionMenu::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
570 return __pOptionMenuPresenter->OnTouchPressed(source, touchinfo);
574 _OptionMenu::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
576 return __pOptionMenuPresenter->OnTouchReleased(source, touchinfo);
580 _OptionMenu::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
582 return __pOptionMenuPresenter->OnTouchMoved(source, touchinfo);
586 _OptionMenu::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
588 return __pOptionMenuPresenter->OnTouchCanceled(source, touchinfo);
592 _OptionMenu::OnActionPerformed(const _Control& source, int actionId)
594 __pOptionMenuPresenter->OnActionPerformed(source, actionId);
598 _OptionMenu::SetBoundsAllAccessibilityElement(void)
600 if (likely(!(_AccessibilityManager::IsActivated())))
605 _AccessibilityElement* pElement = null;
606 IEnumeratorT<_AccessibilityElement*>* pEnumerator = __accessibilityElements.GetEnumeratorN();
608 while (pEnumerator->MoveNext() == E_SUCCESS)
610 if (pEnumerator->GetCurrent(pElement) == E_SUCCESS)
612 pElement->SetBounds(__pOptionMenuPresenter->GetItemBounds(index));
620 _OptionMenu::RemoveAllAccessibilityElement(void)
622 if (likely(!(_AccessibilityManager::IsActivated())))
627 _AccessibilityElement* pElement = null;
628 while (__accessibilityElements.GetCount() > 0)
630 if ((__accessibilityElements.GetAt(0, pElement)) == E_SUCCESS)
632 __accessibilityElements.RemoveAt(0);
633 pElement->GetParent()->RemoveElement(*pElement);
637 __accessibilityElements.RemoveAt(0);
642 }}} // Tizen::Ui::Controls