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.
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)
55 _DateTimeBar::~_DateTimeBar(void)
57 ReleaseTouchCapture();
59 if (__pDateTimeChangeEvent != null)
61 delete __pDateTimeChangeEvent;
62 __pDateTimeChangeEvent = null;
67 delete __pActionEvent;
68 __pActionEvent = null;
71 delete __pDateTimeBarPresenter;
72 __pDateTimeBarPresenter = null;
74 delete __pGestureFlick;
75 __pGestureFlick = null;
77 RemoveAllAccessibilityElement();
83 _DateTimeBar::CreateDateTimeBarN(_Control& owner)
88 _DateTimeBar* pDateTimeBar = new (std::nothrow) _DateTimeBar;
89 SysTryReturn(NID_UI_CTRL, pDateTimeBar != null, null, E_OUT_OF_MEMORY,
90 "[E_OUT_OF_MEMORY] Memory allocation failed.");
92 r = pDateTimeBar->CreateRootVisualElement();
93 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
95 pDateTimeBar->__pOwner = &owner;
97 // if SetActivationEnabled is removed, then remove IsActivatedOnOpen CallBack as well.
98 pDateTimeBar->SetActivationEnabled(false);
100 pDateTimeBar->__pDateTimeBarPresenter = _DateTimeBarPresenter::CreateInstanceN(*pDateTimeBar);
102 SysTryCatch(NID_UI_CTRL, pDateTimeBar->__pDateTimeBarPresenter != null, , r,
103 "[%s] Propagating.", GetErrorMessage(r));
105 pDateTimeBar->__pDateTimeChangeEvent = new (std::nothrow) _DateTimeChangeEvent(*pDateTimeBar);
106 SysTryCatch(NID_UI_CTRL, (pDateTimeBar->__pDateTimeChangeEvent != null), , E_OUT_OF_MEMORY,
107 "[E_OUT_OF_MEMORY] Memory allocation failed.");
109 pDateTimeBar->AcquireHandle();
111 if (pDateTimeBar->GetVisualElement() != null)
113 pDateTimeBar->GetVisualElement()->SetSurfaceOpaque(false);
116 pDateTimeBar->__pGestureFlick = new (std::nothrow) _TouchFlickGestureDetector();
117 SysTryCatch(NID_UI_CTRL, (pDateTimeBar->__pGestureFlick != null), , E_OUT_OF_MEMORY,
118 "[E_OUT_OF_MEMORY] Memory allocation failed.");
120 pDateTimeBar->AddGestureDetector(*(pDateTimeBar->__pGestureFlick));
121 SysTryCatch(NID_UI_CTRL, (GetLastResult() == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
123 r = pDateTimeBar->__pGestureFlick->AddGestureListener(*pDateTimeBar);
124 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
126 pDateTimeBar->InitializeAccessibilityElement();
135 _DateTimeBar::IsActivatedOnOpen(void) const
141 _DateTimeBar::SetPositionAndAlignment(const FloatPoint& point, _DateTimeBarAlignment alignment)
145 result r = E_SUCCESS;
146 SetAlignment(alignment);
148 r = __pDateTimeBarPresenter->LoadArrowBitmap();
149 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
153 r = GET_SHAPE_CONFIG(DATETIMEBAR::ITEM_HEIGHT, GetOrientation(), height);
154 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
159 if (alignment == DATETIME_BAR_ALIGN_DOWN)
161 SetPosition(FloatPoint(point.x, point.y));
166 SetPosition(FloatPoint(point.x, point.y - height));
169 __pDateTimeBarPresenter->CalculateWindowBounds();
174 _DateTimeBarAlignment
175 _DateTimeBar::GetAlignment(void) const
181 _DateTimeBar::SetAlignment(_DateTimeBarAlignment alignment)
183 __alignment = alignment;
188 _DateTimeBar::OnDraw(void)
192 __pDateTimeBarPresenter->Draw();
197 _DateTimeBar::RemoveAllItems(void)
201 result r = E_SUCCESS;
203 r = __pDateTimeBarPresenter->RemoveAllItems();
204 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
210 _DateTimeBar::SetInitialValue(int minValue, int maxValue, int displayValue, _DateTimeId boxId)
214 result r = E_SUCCESS;
216 SetSelectedBoxId(boxId);
218 __pDateTimeBarPresenter->SetMinimumValue(minValue);
219 __pDateTimeBarPresenter->SetMaximumValue(maxValue);
221 r = __pDateTimeBarPresenter->AddItems(displayValue);
222 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
228 _DateTimeBar::GetSelectedBoxId(void) const
230 return __selectedBoxId;
234 _DateTimeBar::SetSelectedBoxId(_DateTimeId boxId)
236 __selectedBoxId = boxId;
242 _DateTimeBar::InitializeAccessibilityElement(void)
244 if (likely(!(_AccessibilityManager::IsActivated())))
249 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
253 pContainer->Activate(true);
254 pContainer->AddListener(*this);
261 _DateTimeBar::GetItemCount(void) const
265 return __pDateTimeBarPresenter->GetItemCount();
269 _DateTimeBar::AddActionEventListener(const _IActionEventListener& listener)
273 result r = E_SUCCESS;
275 if (__pActionEvent == null)
277 __pActionEvent = _ActionEvent::CreateInstanceN(*this);
278 SysTryReturn(NID_UI_CTRL, __pActionEvent != null, E_SYSTEM, E_SYSTEM,
279 "[%s] Propagating.", GetErrorMessage(r));
281 r = __pActionEvent->AddListener(listener);
282 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
288 _DateTimeBar::RemoveActionEventListener(const _IActionEventListener& listener)
292 result r = E_OBJ_NOT_FOUND;
296 r = __pActionEvent->RemoveListener(listener);
299 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
305 _DateTimeBar::AddDateTimeChangeEventListener(const _IDateTimeChangeEventListener& listener)
309 return __pDateTimeChangeEvent->AddListener(listener);
313 _DateTimeBar::RemoveDateTimeChangeEventListener(const _IDateTimeChangeEventListener& listener)
317 return __pDateTimeChangeEvent->RemoveListener(listener);
321 _DateTimeBar::FireDateTimeChangeEvent(_DateTimeChangeStatus status)
325 _DateTimeChangeEventArg* pDateTimeEventArg = new (std::nothrow) _DateTimeChangeEventArg(status);
326 SysTryReturn(NID_UI_CTRL, (pDateTimeEventArg != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
327 "[E_OUT_OF_MEMORY] Memory allocation failed.");
329 __pDateTimeChangeEvent->Fire(*pDateTimeEventArg);
335 _DateTimeBar::FireActionEvent(int actionId)
341 Tizen::Base::Runtime::IEventArg* pEventArg = _ActionEvent::CreateActionEventArgN(actionId);
342 result r = GetLastResult();
343 SysTryReturn(NID_UI_CTRL, pEventArg, false, r, "[%s] Propagating.", GetErrorMessage(r));
345 __pActionEvent->Fire(*pEventArg);
352 _DateTimeBar::CalculateArrowBounds(const FloatRectangle& bounds)
356 FloatRectangle arrowBounds(0.0f, 0.0f, 0.0f, 0.0f);
358 arrowBounds = __pDateTimeBarPresenter->GetArrowBounds();
359 arrowBounds.x = bounds.x + (bounds.width / 2.0f) - (arrowBounds.width / 2.0f);
360 arrowBounds.x -= __pDateTimeBarPresenter->GetWindowBounds().x;
362 __pDateTimeBarPresenter->SetArrowBounds(arrowBounds);
368 _DateTimeBar::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
372 return __pDateTimeBarPresenter->OnTouchPressed(source, touchinfo);
376 _DateTimeBar::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
380 return __pDateTimeBarPresenter->OnTouchReleased(source, touchinfo);
384 _DateTimeBar::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
388 return __pDateTimeBarPresenter->OnTouchMoved(source, touchinfo);
392 _DateTimeBar::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
396 return __pDateTimeBarPresenter->OnTouchCanceled(source, touchinfo);
400 _DateTimeBar::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
404 gesture.GetDistance(xDistance, yDistance);
405 int duration = gesture.GetDuration();
406 return __pDateTimeBarPresenter->OnFlickGestureDetected(xDistance, yDistance, duration);
410 _DateTimeBar::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
416 _DateTimeBar::OnTouchMoveHandled(const Tizen::Ui::_Control& control)
420 return __pDateTimeBarPresenter->OnTouchMoveHandled(control);
424 _DateTimeBar::OnAttachedToMainTree(void)
430 if (GetSelectedBoxId() == DATETIME_ID_MONTH)
432 GET_SHAPE_CONFIG(DATETIMEBAR::MONTH_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
434 else if (GetSelectedBoxId() == DATETIME_ID_YEAR)
436 GET_SHAPE_CONFIG(DATETIMEBAR::YEAR_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
440 GET_SHAPE_CONFIG(DATETIMEBAR::DAY_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
443 __pDateTimeBarPresenter->SetInitialAnimationValue(itemWidth);
445 __pDateTimeBarPresenter->StartAnimationEffect();
447 SetTouchCapture(true, true);
449 return _Window::OnAttachedToMainTree();
453 _DateTimeBar::OnDetachingFromMainTree(void)
455 ReleaseTouchCapture();
457 return _Window::OnDetachingFromMainTree();
461 _DateTimeBar::AddAccessibilityElement(const FloatRectangle& itemBounds, const String& itemText)
463 if (likely(!(_AccessibilityManager::IsActivated())))
468 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
471 _AccessibilityElement* pAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
472 SysTryReturnVoidResult(NID_UI_CTRL, pAccessibilityElement != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
474 String labelText = itemText;
475 pAccessibilityElement->SetBounds(itemBounds);
476 pAccessibilityElement->SetLabel(labelText);
477 pAccessibilityElement->SetTrait(GetAccessibilityTraitValue());
478 pContainer->AddElement(*pAccessibilityElement);
479 __accessibilityElements.Add(pAccessibilityElement);
486 _DateTimeBar::RemoveAllAccessibilityElement(void)
488 if (likely(!(_AccessibilityManager::IsActivated())))
493 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
495 if (pContainer == null)
500 _AccessibilityElement* pAccessibilityElement = null;
502 while (__accessibilityElements.GetCount() > 0)
504 if ((__accessibilityElements.GetAt(0, pAccessibilityElement)) == E_SUCCESS)
506 __accessibilityElements.RemoveAt(0);
507 pContainer->RemoveElement(*pAccessibilityElement);
511 __accessibilityElements.RemoveAt(0);
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::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
621 return __pDateTimeBarPresenter->OnAccessibilityFocusMovedNext(control, element);
625 _DateTimeBar::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
627 return __pDateTimeBarPresenter->OnAccessibilityFocusMovedPrevious(control, element);
631 _DateTimeBar::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
636 _DateTimeBar::OnAccessibilityReadedElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
641 _DateTimeBar::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
647 _DateTimeBar::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
653 _DateTimeBar::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
659 _DateTimeBar::OnAccessibilityValueIncreased(const Tizen::Ui::_AccessibilityContainer&, const Tizen::Ui::_AccessibilityElement&)
665 _DateTimeBar::OnAccessibilityValueDecreased(const Tizen::Ui::_AccessibilityContainer&, const Tizen::Ui::_AccessibilityElement&)
670 }}} // Tizen::Ui::Controls