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_DateTimeBar.cpp
20 * @brief This is the implementation file for the _DateTimeBar class.
23 #include "FUiAnim_VisualElement.h"
24 #include "FUi_AccessibilityContainer.h"
25 #include "FUi_AccessibilityElement.h"
26 #include "FUi_ResourceManager.h"
27 #include "FUiCtrl_DateTimeBar.h"
28 #include "FUiCtrl_DateTimeBarPresenter.h"
29 #include "FUiCtrl_ActionEvent.h"
30 #include "FUiCtrl_Frame.h"
31 #include "FUiCtrl_Form.h"
32 #include "FUi_CoordinateSystemUtils.h"
34 using namespace Tizen::Graphics;
35 using namespace Tizen::Media;
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Ui::Animations;
40 namespace Tizen { namespace Ui { namespace Controls
42 _DateTimeBar::_DateTimeBar(void)
43 : __pDateTimeBarPresenter(null)
44 , __pActionEvent(null)
45 , __selectedBoxId(DATETIME_ID_NONE)
46 , __alignment(DATETIME_BAR_ALIGN_DOWN)
47 , __pDateTimeChangeEvent(null)
48 , __pGestureFlick(null)
49 , __parentWindowBounds(0.0f, 0.0f, 0.0f, 0.0f)
51 , __accessibilityFocusOutIndex(-1)
56 _DateTimeBar::~_DateTimeBar(void)
58 ReleaseTouchCapture();
60 if (__pDateTimeChangeEvent != null)
62 delete __pDateTimeChangeEvent;
63 __pDateTimeChangeEvent = null;
68 delete __pActionEvent;
69 __pActionEvent = null;
72 delete __pDateTimeBarPresenter;
73 __pDateTimeBarPresenter = null;
75 delete __pGestureFlick;
76 __pGestureFlick = null;
78 RemoveAllAccessibilityElement();
84 _DateTimeBar::CreateDateTimeBarN(_Control& owner)
89 _DateTimeBar* pDateTimeBar = new (std::nothrow) _DateTimeBar;
90 SysTryReturn(NID_UI_CTRL, pDateTimeBar != null, null, E_OUT_OF_MEMORY,
91 "[E_OUT_OF_MEMORY] Memory allocation failed.");
93 r = pDateTimeBar->CreateRootVisualElement();
94 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
96 pDateTimeBar->__pOwner = &owner;
98 pDateTimeBar->__pDateTimeBarPresenter = _DateTimeBarPresenter::CreateInstanceN(*pDateTimeBar);
100 SysTryCatch(NID_UI_CTRL, pDateTimeBar->__pDateTimeBarPresenter != null, , r,
101 "[%s] Propagating.", GetErrorMessage(r));
103 pDateTimeBar->__pDateTimeChangeEvent = new (std::nothrow) _DateTimeChangeEvent(*pDateTimeBar);
104 SysTryCatch(NID_UI_CTRL, (pDateTimeBar->__pDateTimeChangeEvent != null), , E_OUT_OF_MEMORY,
105 "[E_OUT_OF_MEMORY] Memory allocation failed.");
107 pDateTimeBar->AcquireHandle();
109 if (pDateTimeBar->GetVisualElement() != null)
111 pDateTimeBar->GetVisualElement()->SetSurfaceOpaque(false);
114 pDateTimeBar->__pGestureFlick = new (std::nothrow) _TouchFlickGestureDetector();
115 SysTryCatch(NID_UI_CTRL, (pDateTimeBar->__pGestureFlick != null), , E_OUT_OF_MEMORY,
116 "[E_OUT_OF_MEMORY] Memory allocation failed.");
118 pDateTimeBar->AddGestureDetector(*(pDateTimeBar->__pGestureFlick));
119 SysTryCatch(NID_UI_CTRL, (GetLastResult() == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
121 r = pDateTimeBar->__pGestureFlick->AddGestureListener(*pDateTimeBar);
122 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
124 pDateTimeBar->InitializeAccessibilityElement();
133 _DateTimeBar::SetPositionAndAlignment(const FloatPoint& point, _DateTimeBarAlignment alignment)
137 result r = E_SUCCESS;
138 SetAlignment(alignment);
140 r = __pDateTimeBarPresenter->LoadArrowBitmap();
141 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
145 r = GET_SHAPE_CONFIG(DATETIMEBAR::ITEM_HEIGHT, GetOrientation(), height);
146 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
151 if (alignment == DATETIME_BAR_ALIGN_DOWN)
153 SetPosition(FloatPoint(point.x, point.y));
158 SetPosition(FloatPoint(point.x, point.y - height));
161 __pDateTimeBarPresenter->CalculateWindowBounds();
166 _DateTimeBarAlignment
167 _DateTimeBar::GetAlignment(void) const
173 _DateTimeBar::SetAlignment(_DateTimeBarAlignment alignment)
175 __alignment = alignment;
180 _DateTimeBar::OnDraw(void)
184 __pDateTimeBarPresenter->Draw();
189 _DateTimeBar::RemoveAllItems(void)
193 result r = E_SUCCESS;
195 r = __pDateTimeBarPresenter->RemoveAllItems();
196 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
202 _DateTimeBar::SetInitialValue(int minValue, int maxValue, int displayValue, _DateTimeId boxId)
206 result r = E_SUCCESS;
208 SetSelectedBoxId(boxId);
210 __pDateTimeBarPresenter->SetMinimumValue(minValue);
211 __pDateTimeBarPresenter->SetMaximumValue(maxValue);
213 r = __pDateTimeBarPresenter->AddItems(displayValue);
214 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
220 _DateTimeBar::GetSelectedBoxId(void) const
222 return __selectedBoxId;
226 _DateTimeBar::SetSelectedBoxId(_DateTimeId boxId)
228 __selectedBoxId = boxId;
234 _DateTimeBar::InitializeAccessibilityElement(void)
237 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
241 pContainer->Activate(true);
242 pContainer->AddListener(*this);
249 _DateTimeBar::GetItemCount(void) const
253 return __pDateTimeBarPresenter->GetItemCount();
257 _DateTimeBar::AddActionEventListener(const _IActionEventListener& listener)
261 result r = E_SUCCESS;
263 if (__pActionEvent == null)
265 __pActionEvent = _ActionEvent::CreateInstanceN(*this);
266 SysTryReturn(NID_UI_CTRL, __pActionEvent != null, E_SYSTEM, E_SYSTEM,
267 "[%s] Propagating.", GetErrorMessage(r));
269 r = __pActionEvent->AddListener(listener);
270 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
276 _DateTimeBar::RemoveActionEventListener(const _IActionEventListener& listener)
280 result r = E_OBJ_NOT_FOUND;
284 r = __pActionEvent->RemoveListener(listener);
287 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
293 _DateTimeBar::AddDateTimeChangeEventListener(const _IDateTimeChangeEventListener& listener)
297 return __pDateTimeChangeEvent->AddListener(listener);
301 _DateTimeBar::RemoveDateTimeChangeEventListener(const _IDateTimeChangeEventListener& listener)
305 return __pDateTimeChangeEvent->RemoveListener(listener);
309 _DateTimeBar::FireDateTimeChangeEvent(_DateTimeChangeStatus status)
313 _DateTimeChangeEventArg* pDateTimeEventArg = new (std::nothrow) _DateTimeChangeEventArg(status);
314 SysTryReturn(NID_UI_CTRL, (pDateTimeEventArg != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
315 "[E_OUT_OF_MEMORY] Memory allocation failed.");
317 __pDateTimeChangeEvent->Fire(*pDateTimeEventArg);
323 _DateTimeBar::FireActionEvent(int actionId)
329 Tizen::Base::Runtime::IEventArg* pEventArg = _ActionEvent::CreateActionEventArgN(actionId);
330 result r = GetLastResult();
331 SysTryReturn(NID_UI_CTRL, pEventArg, false, r, "[%s] Propagating.", GetErrorMessage(r));
333 __pActionEvent->Fire(*pEventArg);
340 _DateTimeBar::CalculateArrowBounds(const FloatRectangle& bounds)
344 FloatRectangle arrowBounds(0.0f, 0.0f, 0.0f, 0.0f);
346 arrowBounds = __pDateTimeBarPresenter->GetArrowBounds();
347 arrowBounds.x = bounds.x + (bounds.width / 2.0f) - (arrowBounds.width / 2.0f);
348 arrowBounds.x -= __pDateTimeBarPresenter->GetWindowBounds().x;
350 __pDateTimeBarPresenter->SetArrowBounds(arrowBounds);
356 _DateTimeBar::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
360 return __pDateTimeBarPresenter->OnTouchPressed(source, touchinfo);
364 _DateTimeBar::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
368 return __pDateTimeBarPresenter->OnTouchReleased(source, touchinfo);
372 _DateTimeBar::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
376 return __pDateTimeBarPresenter->OnTouchMoved(source, touchinfo);
380 _DateTimeBar::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
384 return __pDateTimeBarPresenter->OnTouchCanceled(source, touchinfo);
388 _DateTimeBar::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
392 gesture.GetDistance(xDistance, yDistance);
393 int duration = gesture.GetDuration();
394 return __pDateTimeBarPresenter->OnFlickGestureDetected(xDistance, yDistance, duration);
398 _DateTimeBar::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
404 _DateTimeBar::OnTouchMoveHandled(const Tizen::Ui::_Control& control)
408 return __pDateTimeBarPresenter->OnTouchMoveHandled(control);
412 _DateTimeBar::OnAttachedToMainTree(void)
416 return _Window::OnAttachedToMainTree();
420 _DateTimeBar::OnDetachingFromMainTree(void)
422 return _Window::OnDetachingFromMainTree();
426 _DateTimeBar::OnActivated(void)
430 SetTouchCapture(true, true);
431 return _Window::OnActivated();
435 _DateTimeBar::OnDeactivated(void)
437 ReleaseTouchCapture();
439 return _Window::OnDeactivated();
443 _DateTimeBar::AddAccessibilityElement(const FloatRectangle& itemBounds, const String& itemText)
445 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
446 SysTryReturnVoidResult(NID_UI_CTRL, (pContainer != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
448 _AccessibilityElement* pAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
449 SysTryReturnVoidResult(NID_UI_CTRL, pAccessibilityElement != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
451 String labelText = itemText;
452 pAccessibilityElement->SetBounds(itemBounds);
453 pAccessibilityElement->SetLabel(labelText);
454 pAccessibilityElement->SetTrait(GetAccessibilityTraitValue());
455 pContainer->AddElement(*pAccessibilityElement);
456 __accessibilityElements.Add(pAccessibilityElement);
462 _DateTimeBar::InsertAccessibilityElementAt(int index, const FloatRectangle& itemBounds, const String& itemText)
464 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
465 SysTryReturnVoidResult(NID_UI_CTRL, (pContainer != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
467 _AccessibilityElement* pAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
468 SysTryReturnVoidResult(NID_UI_CTRL, pAccessibilityElement != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
470 String labelText = itemText;
471 pAccessibilityElement->SetBounds(itemBounds);
472 pAccessibilityElement->SetLabel(labelText);
473 pAccessibilityElement->SetTrait(GetAccessibilityTraitValue());
474 pContainer->InsertElement(*pAccessibilityElement, index);
475 __accessibilityElements.InsertAt(pAccessibilityElement, index);
481 _DateTimeBar::RemoveAccessibilityElementAt(int index)
483 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
484 SysTryReturnVoidResult(NID_UI_CTRL, (pContainer != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
486 _AccessibilityElement* pAccessibilityElement = null;
487 __accessibilityElements.GetAt(index, pAccessibilityElement);
489 if (pAccessibilityElement != null)
491 __accessibilityElements.RemoveAt(index);
492 pContainer->RemoveElement(*pAccessibilityElement);
499 _DateTimeBar::RemoveAllAccessibilityElement(void)
501 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
502 SysTryReturnVoidResult(NID_UI_CTRL, (pContainer != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
504 _AccessibilityElement* pAccessibilityElement = null;
506 while (__accessibilityElements.GetCount() > 0)
508 if ((__accessibilityElements.GetAt(0, pAccessibilityElement)) == E_SUCCESS)
510 __accessibilityElements.RemoveAt(0);
511 pContainer->RemoveElement(*pAccessibilityElement);
519 _DateTimeBar::GetAccessibilityTraitValue()
521 AccessibilityTraits traitsValue = ACCESSIBILITY_TRAITS_NONE;
523 if (GetSelectedBoxId() == DATETIME_ID_DAY)
525 traitsValue = ACCESSIBILITY_TRAITS_DAY;
527 else if (GetSelectedBoxId() == DATETIME_ID_MONTH)
529 traitsValue = ACCESSIBILITY_TRAITS_MONTH;
531 else if (GetSelectedBoxId() == DATETIME_ID_YEAR)
533 traitsValue = ACCESSIBILITY_TRAITS_YEAR;
535 else if (GetSelectedBoxId() == DATETIME_ID_HOUR)
537 traitsValue = ACCESSIBILITY_TRAITS_HOUR;
539 else if (GetSelectedBoxId() == DATETIME_ID_MINUTE)
541 traitsValue = ACCESSIBILITY_TRAITS_MINUTE;
548 _DateTimeBar::GetMonthValue(int month) const
555 monthValue = L"January";
558 monthValue = L"February";
561 monthValue = L"March";
564 monthValue = L"April";
570 monthValue = L"June";
573 monthValue = L"July";
576 monthValue = L"August";
579 monthValue = L"September";
582 monthValue = L"October";
585 monthValue = L"November";
588 monthValue = L"December";
598 _DateTimeBar::SetFont(Font& pFont)
600 __pDateTimeBarPresenter->SetFont(pFont);
606 _DateTimeBar::SetParentWindowBounds(FloatRectangle& parentWindowBounds)
608 __parentWindowBounds = parentWindowBounds;
613 _DateTimeBar::GetParentWindowBounds() const
615 return __parentWindowBounds;
619 _DateTimeBar::RefreshItems(void)
623 if (GetSelectedBoxId() == DATETIME_ID_MONTH)
625 GET_SHAPE_CONFIG(DATETIMEBAR::MONTH_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
627 else if (GetSelectedBoxId() == DATETIME_ID_YEAR)
629 GET_SHAPE_CONFIG(DATETIMEBAR::YEAR_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
633 GET_SHAPE_CONFIG(DATETIMEBAR::DAY_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
636 __pDateTimeBarPresenter->SetInitialAnimationValue(itemWidth);
638 __pDateTimeBarPresenter->StartAnimationEffect();
640 if (unlikely((_AccessibilityManager::IsActivated())))
642 _AccessibilityElement* pAccessibilityElement = GetAccessibilityElementAt(__pDateTimeBarPresenter->GetSelectedItemIndex() - 1);
644 if (pAccessibilityElement != null)
646 _AccessibilityManager::GetInstance()->SetGlobalFocusedElement(*pAccessibilityElement);
654 _DateTimeBar::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
656 return __pDateTimeBarPresenter->OnAccessibilityFocusMovedNext(control, element);
660 _DateTimeBar::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
662 return __pDateTimeBarPresenter->OnAccessibilityFocusMovedPrevious(control, element);
666 _DateTimeBar::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
672 _DateTimeBar::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
678 _DateTimeBar::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
680 if (__accessibilityFocusOutIndex == -1)
687 if (GetSelectedBoxId() == DATETIME_ID_MONTH)
689 GET_SHAPE_CONFIG(DATETIMEBAR::MONTH_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
691 else if (GetSelectedBoxId() == DATETIME_ID_YEAR)
693 GET_SHAPE_CONFIG(DATETIMEBAR::YEAR_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
697 GET_SHAPE_CONFIG(DATETIMEBAR::DAY_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
700 _AccessibilityElement* pFocusInAccessibilityElement = null;
702 int focusInIndex = GetIndexFromAccessibilityElementPoint(FloatPoint(element.GetBounds().x, element.GetBounds().y));
704 pFocusInAccessibilityElement = GetAccessibilityElementAt(focusInIndex);
706 if (__accessibilityFocusOutIndex < focusInIndex)
708 if (pFocusInAccessibilityElement != null && (pFocusInAccessibilityElement->GetBounds().x + pFocusInAccessibilityElement->GetBounds().width >
709 __pDateTimeBarPresenter->GetWindowBounds().x + __pDateTimeBarPresenter->GetWindowBounds().width))
711 __pDateTimeBarPresenter->MoveNext();
715 else if (__accessibilityFocusOutIndex > focusInIndex)
717 if(pFocusInAccessibilityElement != null && pFocusInAccessibilityElement->GetBounds().x < 0)
719 __pDateTimeBarPresenter->MovePrevious();
727 _DateTimeBar::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
729 __accessibilityFocusOutIndex = GetIndexFromAccessibilityElementPoint(FloatPoint(element.GetBounds().x, element.GetBounds().y));
735 _DateTimeBar::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
741 _DateTimeBar::OnAccessibilityValueIncreased(const Tizen::Ui::_AccessibilityContainer&, const Tizen::Ui::_AccessibilityElement&)
747 _DateTimeBar::OnAccessibilityValueDecreased(const Tizen::Ui::_AccessibilityContainer&, const Tizen::Ui::_AccessibilityElement&)
752 _AccessibilityElement*
753 _DateTimeBar::GetAccessibilityElementAt(int index) const
755 _AccessibilityElement* pAccessibilityElement = null;
757 __accessibilityElements.GetAt(index, pAccessibilityElement);
759 return pAccessibilityElement;
763 _DateTimeBar::GetIndexFromAccessibilityElementPoint(const FloatPoint& point) const
765 _AccessibilityElement* pAccessibilityElement = null;
767 for (int index = __accessibilityElements.GetCount() -1; index >= 0; index--)
769 if ((__accessibilityElements.GetAt(index, pAccessibilityElement)) == E_SUCCESS)
771 if (pAccessibilityElement->GetBounds().Contains(point))
781 }}} // Tizen::Ui::Controls