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)
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 pDateTimeBar->__pDateTimeBarPresenter = _DateTimeBarPresenter::CreateInstanceN(*pDateTimeBar);
99 SysTryCatch(NID_UI_CTRL, pDateTimeBar->__pDateTimeBarPresenter != null, , r,
100 "[%s] Propagating.", GetErrorMessage(r));
102 pDateTimeBar->__pDateTimeChangeEvent = new (std::nothrow) _DateTimeChangeEvent(*pDateTimeBar);
103 SysTryCatch(NID_UI_CTRL, (pDateTimeBar->__pDateTimeChangeEvent != null), , E_OUT_OF_MEMORY,
104 "[E_OUT_OF_MEMORY] Memory allocation failed.");
106 pDateTimeBar->AcquireHandle();
108 if (pDateTimeBar->GetVisualElement() != null)
110 pDateTimeBar->GetVisualElement()->SetSurfaceOpaque(false);
113 pDateTimeBar->__pGestureFlick = new (std::nothrow) _TouchFlickGestureDetector();
114 SysTryCatch(NID_UI_CTRL, (pDateTimeBar->__pGestureFlick != null), , E_OUT_OF_MEMORY,
115 "[E_OUT_OF_MEMORY] Memory allocation failed.");
117 pDateTimeBar->AddGestureDetector(*(pDateTimeBar->__pGestureFlick));
118 SysTryCatch(NID_UI_CTRL, (GetLastResult() == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
120 r = pDateTimeBar->__pGestureFlick->AddGestureListener(*pDateTimeBar);
121 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
123 pDateTimeBar->InitializeAccessibilityElement();
132 _DateTimeBar::SetPositionAndAlignment(const FloatPoint& point, _DateTimeBarAlignment alignment)
136 result r = E_SUCCESS;
137 SetAlignment(alignment);
139 r = __pDateTimeBarPresenter->LoadArrowBitmap();
140 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
144 r = GET_SHAPE_CONFIG(DATETIMEBAR::ITEM_HEIGHT, GetOrientation(), height);
145 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
150 if (alignment == DATETIME_BAR_ALIGN_DOWN)
152 SetPosition(FloatPoint(point.x, point.y));
157 SetPosition(FloatPoint(point.x, point.y - height));
160 __pDateTimeBarPresenter->CalculateWindowBounds();
165 _DateTimeBarAlignment
166 _DateTimeBar::GetAlignment(void) const
172 _DateTimeBar::SetAlignment(_DateTimeBarAlignment alignment)
174 __alignment = alignment;
179 _DateTimeBar::OnDraw(void)
183 __pDateTimeBarPresenter->Draw();
188 _DateTimeBar::RemoveAllItems(void)
192 result r = E_SUCCESS;
194 r = __pDateTimeBarPresenter->RemoveAllItems();
195 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
201 _DateTimeBar::SetInitialValue(int minValue, int maxValue, int displayValue, _DateTimeId boxId)
205 result r = E_SUCCESS;
207 SetSelectedBoxId(boxId);
209 __pDateTimeBarPresenter->SetMinimumValue(minValue);
210 __pDateTimeBarPresenter->SetMaximumValue(maxValue);
212 r = __pDateTimeBarPresenter->AddItems(displayValue);
213 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
219 _DateTimeBar::GetSelectedBoxId(void) const
221 return __selectedBoxId;
225 _DateTimeBar::SetSelectedBoxId(_DateTimeId boxId)
227 __selectedBoxId = boxId;
233 _DateTimeBar::InitializeAccessibilityElement(void)
235 if (likely(!(_AccessibilityManager::IsActivated())))
240 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
244 pContainer->Activate(true);
245 pContainer->AddListener(*this);
252 _DateTimeBar::GetItemCount(void) const
256 return __pDateTimeBarPresenter->GetItemCount();
260 _DateTimeBar::AddActionEventListener(const _IActionEventListener& listener)
264 result r = E_SUCCESS;
266 if (__pActionEvent == null)
268 __pActionEvent = _ActionEvent::CreateInstanceN(*this);
269 SysTryReturn(NID_UI_CTRL, __pActionEvent != null, E_SYSTEM, E_SYSTEM,
270 "[%s] Propagating.", GetErrorMessage(r));
272 r = __pActionEvent->AddListener(listener);
273 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
279 _DateTimeBar::RemoveActionEventListener(const _IActionEventListener& listener)
283 result r = E_OBJ_NOT_FOUND;
287 r = __pActionEvent->RemoveListener(listener);
290 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
296 _DateTimeBar::AddDateTimeChangeEventListener(const _IDateTimeChangeEventListener& listener)
300 return __pDateTimeChangeEvent->AddListener(listener);
304 _DateTimeBar::RemoveDateTimeChangeEventListener(const _IDateTimeChangeEventListener& listener)
308 return __pDateTimeChangeEvent->RemoveListener(listener);
312 _DateTimeBar::FireDateTimeChangeEvent(_DateTimeChangeStatus status)
316 _DateTimeChangeEventArg* pDateTimeEventArg = new (std::nothrow) _DateTimeChangeEventArg(status);
317 SysTryReturn(NID_UI_CTRL, (pDateTimeEventArg != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
318 "[E_OUT_OF_MEMORY] Memory allocation failed.");
320 __pDateTimeChangeEvent->Fire(*pDateTimeEventArg);
326 _DateTimeBar::FireActionEvent(int actionId)
332 Tizen::Base::Runtime::IEventArg* pEventArg = _ActionEvent::CreateActionEventArgN(actionId);
333 result r = GetLastResult();
334 SysTryReturn(NID_UI_CTRL, pEventArg, false, r, "[%s] Propagating.", GetErrorMessage(r));
336 __pActionEvent->Fire(*pEventArg);
343 _DateTimeBar::CalculateArrowBounds(const FloatRectangle& bounds)
347 FloatRectangle arrowBounds(0.0f, 0.0f, 0.0f, 0.0f);
349 arrowBounds = __pDateTimeBarPresenter->GetArrowBounds();
350 arrowBounds.x = bounds.x + (bounds.width / 2.0f) - (arrowBounds.width / 2.0f);
351 arrowBounds.x -= __pDateTimeBarPresenter->GetWindowBounds().x;
353 __pDateTimeBarPresenter->SetArrowBounds(arrowBounds);
359 _DateTimeBar::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
363 return __pDateTimeBarPresenter->OnTouchPressed(source, touchinfo);
367 _DateTimeBar::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
371 return __pDateTimeBarPresenter->OnTouchReleased(source, touchinfo);
375 _DateTimeBar::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
379 return __pDateTimeBarPresenter->OnTouchMoved(source, touchinfo);
383 _DateTimeBar::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
387 return __pDateTimeBarPresenter->OnTouchCanceled(source, touchinfo);
391 _DateTimeBar::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
395 gesture.GetDistance(xDistance, yDistance);
396 int duration = gesture.GetDuration();
397 return __pDateTimeBarPresenter->OnFlickGestureDetected(xDistance, yDistance, duration);
401 _DateTimeBar::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
407 _DateTimeBar::OnTouchMoveHandled(const Tizen::Ui::_Control& control)
411 return __pDateTimeBarPresenter->OnTouchMoveHandled(control);
415 _DateTimeBar::OnAttachedToMainTree(void)
419 return _Window::OnAttachedToMainTree();
423 _DateTimeBar::OnDetachingFromMainTree(void)
425 return _Window::OnDetachingFromMainTree();
429 _DateTimeBar::OnActivated(void)
433 SetTouchCapture(true, true);
434 return _Window::OnActivated();
438 _DateTimeBar::OnDeactivated(void)
440 ReleaseTouchCapture();
442 if (__pOwner != null)
444 __pOwner->Invalidate();
447 return _Window::OnDeactivated();
451 _DateTimeBar::AddAccessibilityElement(const FloatRectangle& itemBounds, const String& itemText)
453 if (likely(!(_AccessibilityManager::IsActivated())))
458 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
461 _AccessibilityElement* pAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
462 SysTryReturnVoidResult(NID_UI_CTRL, pAccessibilityElement != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
464 String labelText = itemText;
465 pAccessibilityElement->SetBounds(itemBounds);
466 pAccessibilityElement->SetLabel(labelText);
467 pAccessibilityElement->SetTrait(GetAccessibilityTraitValue());
468 pContainer->AddElement(*pAccessibilityElement);
469 __accessibilityElements.Add(pAccessibilityElement);
476 _DateTimeBar::RemoveAllAccessibilityElement(void)
478 if (likely(!(_AccessibilityManager::IsActivated())))
483 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
485 if (pContainer == null)
490 _AccessibilityElement* pAccessibilityElement = null;
492 while (__accessibilityElements.GetCount() > 0)
494 if ((__accessibilityElements.GetAt(0, pAccessibilityElement)) == E_SUCCESS)
496 __accessibilityElements.RemoveAt(0);
497 pContainer->RemoveElement(*pAccessibilityElement);
501 __accessibilityElements.RemoveAt(0);
509 _DateTimeBar::GetAccessibilityTraitValue()
511 AccessibilityTraits traitsValue = ACCESSIBILITY_TRAITS_NONE;
513 if (GetSelectedBoxId() == DATETIME_ID_DAY)
515 traitsValue = ACCESSIBILITY_TRAITS_DAY;
517 else if (GetSelectedBoxId() == DATETIME_ID_MONTH)
519 traitsValue = ACCESSIBILITY_TRAITS_MONTH;
521 else if (GetSelectedBoxId() == DATETIME_ID_YEAR)
523 traitsValue = ACCESSIBILITY_TRAITS_YEAR;
525 else if (GetSelectedBoxId() == DATETIME_ID_HOUR)
527 traitsValue = ACCESSIBILITY_TRAITS_HOUR;
529 else if (GetSelectedBoxId() == DATETIME_ID_MINUTE)
531 traitsValue = ACCESSIBILITY_TRAITS_MINUTE;
538 _DateTimeBar::GetMonthValue(int month) const
545 monthValue = L"January";
548 monthValue = L"February";
551 monthValue = L"March";
554 monthValue = L"April";
560 monthValue = L"June";
563 monthValue = L"July";
566 monthValue = L"August";
569 monthValue = L"September";
572 monthValue = L"October";
575 monthValue = L"November";
578 monthValue = L"December";
588 _DateTimeBar::SetFont(Font& pFont)
590 __pDateTimeBarPresenter->SetFont(pFont);
596 _DateTimeBar::SetParentWindowBounds(FloatRectangle& parentWindowBounds)
598 __parentWindowBounds = parentWindowBounds;
603 _DateTimeBar::GetParentWindowBounds() const
605 return __parentWindowBounds;
609 _DateTimeBar::RefreshItems(void)
613 if (GetSelectedBoxId() == DATETIME_ID_MONTH)
615 GET_SHAPE_CONFIG(DATETIMEBAR::MONTH_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
617 else if (GetSelectedBoxId() == DATETIME_ID_YEAR)
619 GET_SHAPE_CONFIG(DATETIMEBAR::YEAR_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
623 GET_SHAPE_CONFIG(DATETIMEBAR::DAY_ITEM_WIDTH, _ControlManager::GetInstance()->GetOrientation(), itemWidth);
626 __pDateTimeBarPresenter->SetInitialAnimationValue(itemWidth);
628 __pDateTimeBarPresenter->StartAnimationEffect();
634 _DateTimeBar::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
636 return __pDateTimeBarPresenter->OnAccessibilityFocusMovedNext(control, element);
640 _DateTimeBar::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
642 return __pDateTimeBarPresenter->OnAccessibilityFocusMovedPrevious(control, element);
646 _DateTimeBar::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
651 _DateTimeBar::OnAccessibilityReadedElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
656 _DateTimeBar::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
662 _DateTimeBar::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
668 _DateTimeBar::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
674 _DateTimeBar::OnAccessibilityValueIncreased(const Tizen::Ui::_AccessibilityContainer&, const Tizen::Ui::_AccessibilityElement&)
680 _DateTimeBar::OnAccessibilityValueDecreased(const Tizen::Ui::_AccessibilityContainer&, const Tizen::Ui::_AccessibilityElement&)
685 }}} // Tizen::Ui::Controls