Fork for IVI: mesa fixing
[profile/ivi/uifw.git] / src / ui / controls / FUiCtrl_EditDate.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://floralicense.org/license/
10 //
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.
16 //
17
18 /**
19  * @file                FUiCtrl_EditDate.cpp
20  * @brief               This is the implementation file for the _EditDate class.
21  */
22
23 #include <vconf.h>
24 #include "FUi_AccessibilityContainer.h"
25 #include "FUi_AccessibilityElement.h"
26 #include "FUi_ResourceManager.h"
27 #include "FUiAnim_VisualElement.h"
28 #include "FUiCtrl_EditDate.h"
29 #include "FUiCtrl_EditDatePresenter.h"
30 #include "FUiCtrl_Form.h"
31 #include "FUiCtrl_Frame.h"
32 #include "FUiCtrl_DateTimeUtils.h"
33
34 using namespace Tizen::Graphics;
35 using namespace Tizen::Base;
36 using namespace Tizen::Base::Runtime;
37 using namespace Tizen::Ui;
38
39 namespace Tizen { namespace Ui { namespace Controls
40 {
41
42 IMPLEMENT_PROPERTY(_EditDate);
43
44 _EditDate::_EditDate(void)
45         : __pEditDatePresenter(null)
46         , __pDateChangeEvent(null)
47         , __pDateTimeBar(null)
48         , __absoluteBounds(Rectangle())
49         , __title()
50         , __pAccessibilityTitleElement(null)
51         , __pAccessibilityYearElement(null)
52         , __pAccessibilityMonthElement(null)
53         , __pAccessibilityDayElement(null)
54 {
55 }
56
57 _EditDate::~_EditDate(void)
58 {
59         delete __pDateTimeBar;
60         __pDateTimeBar = null;
61
62         delete __pEditDatePresenter;
63         __pEditDatePresenter = null;
64
65         if (__pDateChangeEvent != null)
66         {
67                 delete __pDateChangeEvent;
68                 __pDateChangeEvent = null;
69         }
70
71         if (__pAccessibilityTitleElement)
72         {
73                 __pAccessibilityTitleElement->Activate(false);
74                 __pAccessibilityTitleElement = null;
75         }
76         if (__pAccessibilityYearElement)
77         {
78                 __pAccessibilityYearElement->Activate(false);
79                 __pAccessibilityYearElement = null;
80         }
81         if (__pAccessibilityMonthElement)
82         {
83                 __pAccessibilityMonthElement->Activate(false);
84                 __pAccessibilityMonthElement = null;
85         }
86         if (__pAccessibilityDayElement)
87         {
88                 __pAccessibilityDayElement->Activate(false);
89                 __pAccessibilityDayElement = null;
90         }
91 }
92
93 _EditDate*
94 _EditDate::CreateEditDateN(const String& title)
95 {
96         result r = E_SUCCESS;
97
98         _AccessibilityContainer* pContainer = null;
99
100         _EditDate* pEditDate = new (std::nothrow) _EditDate;
101         SysTryReturn(NID_UI_CTRL, pEditDate, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
102
103         pEditDate->GetVisualElement()->SetSurfaceOpaque(false);
104
105         pEditDate->__pEditDatePresenter = _EditDatePresenter::CreateInstanceN(*pEditDate, title);
106
107         r = pEditDate->CreateDateTimeBar();
108         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
109
110         pEditDate->__pEditDatePresenter->Initialize();
111         r = GetLastResult();
112         SysTryCatch(NID_UI_CTRL, pEditDate->__pEditDatePresenter, , r, "[%s] Propagating.", GetErrorMessage(r));
113
114         pEditDate->__pEditDatePresenter->SetCurrentDate();
115
116         if (title.IsEmpty() != true)
117         {
118                 pEditDate->__title = title;
119         }
120
121         pEditDate->SetResizable(false);
122
123         pContainer = pEditDate->GetAccessibilityContainer();
124
125         if (pContainer)
126         {
127                 pContainer->Activate(true);
128         }
129
130         pEditDate->AcquireHandle();
131
132         return pEditDate;
133
134 CATCH:
135         delete pEditDate;
136         return null;
137 }
138
139 result
140 _EditDate::CreateDateTimeBar(void)
141 {
142         result r = E_SUCCESS;
143
144         __pDateTimeBar = _DateTimeBar::CreateDateTimeBarN();
145         r = GetLastResult();
146         SysTryReturn(NID_UI_CTRL, (__pDateTimeBar != null), r, r, "[%s] Propagating.", GetErrorMessage(r));
147
148         r = __pDateTimeBar->AddActionEventListener(*this);
149         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
150
151         r = __pDateTimeBar->AddDateTimeChangeEventListener(*this);
152         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
153
154         return r;
155
156 CATCH:
157         delete __pDateTimeBar;
158         return r;
159 }
160
161 result
162 _EditDate::AddDateChangeEventListener(const _IDateTimeChangeEventListener& listener)
163 {
164         if (__pDateChangeEvent == null)
165         {
166                 __pDateChangeEvent = new (std::nothrow) _DateTimeChangeEvent(*this);
167                 SysTryReturn(NID_UI_CTRL, (__pDateChangeEvent != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
168                                 "[E_OUT_OF_MEMORY] Memory allocation failed.");
169         }
170
171         result r = __pDateChangeEvent->AddListener(listener);
172         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
173
174         return E_SUCCESS;
175 }
176
177 result
178 _EditDate::RemoveDateChangeEventListener(const _IDateTimeChangeEventListener& listener)
179 {
180         result r = E_OBJ_NOT_FOUND;
181
182         if (__pDateChangeEvent)
183         {
184                 r = __pDateChangeEvent->RemoveListener(listener);
185         }
186
187         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
188
189         return E_SUCCESS;
190 }
191
192 void
193 _EditDate::SetDate(const DateTime& date)
194 {
195         SetProperty("date", Variant(date));
196         return;
197 }
198
199 result
200 _EditDate::SetPropertyDate(const Variant& date)
201 {
202         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
203                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
204
205         __pEditDatePresenter->SetDate(date.ToDateTime());
206
207         UpdateAccessibilityElement();
208         return E_SUCCESS;
209 }
210
211 DateTime
212 _EditDate::GetDate(void) const
213 {
214         Variant date = GetProperty("date");
215
216         return date.ToDateTime();
217 }
218
219 Variant
220 _EditDate::GetPropertyDate(void) const
221 {
222         DateTime date;
223
224         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
225                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
226
227         date = __pEditDatePresenter->GetDate();
228
229         return Variant(date);
230 }
231
232 result
233 _EditDate::SetDay(int day)
234 {
235         result r = E_SUCCESS;
236
237         SetProperty("day", Variant(day));
238
239         r = GetLastResult();
240
241         return r;
242 }
243
244 result
245 _EditDate::SetPropertyDay(const Variant& day)
246 {
247         result r = E_SUCCESS;
248
249         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
250                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
251
252         r = __pEditDatePresenter->SetDay(day.ToInt());
253
254         if (r == E_SUCCESS)
255         {
256                 UpdateAccessibilityElement();
257         }
258
259         return r;
260 }
261
262 int
263 _EditDate::GetDay(void) const
264 {
265         Variant day = GetProperty("day");
266
267         return day.ToInt();
268 }
269
270 Variant
271 _EditDate::GetPropertyDay(void) const
272 {
273         int day = -1;
274
275         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
276                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
277
278         day = __pEditDatePresenter->GetDay();
279
280         return Variant(day);
281 }
282
283 result
284 _EditDate::SetMonth(int month)
285 {
286         result r = E_SUCCESS;
287
288         SetProperty("month", Variant(month));
289
290         r = GetLastResult();
291
292         return r;
293 }
294
295 result
296 _EditDate::SetPropertyMonth(const Variant& month)
297 {
298         result r = E_SUCCESS;
299
300         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
301                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
302
303         r = __pEditDatePresenter->SetMonth(month.ToInt());
304
305         if (r == E_SUCCESS)
306         {
307                 UpdateAccessibilityElement();
308         }
309
310         return r;
311 }
312
313 int
314 _EditDate::GetMonth(void) const
315 {
316         Variant month = GetProperty("month");
317
318         return month.ToInt();
319 }
320
321 Variant
322 _EditDate::GetPropertyMonth(void) const
323 {
324         int month = -1;
325
326         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
327                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
328
329         month = __pEditDatePresenter->GetMonth();
330
331         return Variant(month);
332 }
333
334 result
335 _EditDate::SetYear(int year)
336 {
337         result r = E_SUCCESS;
338
339         SetProperty("year", Variant(year));
340
341         r = GetLastResult();
342
343         return r;
344 }
345
346 result
347 _EditDate::SetPropertyYear(const Variant& year)
348 {
349         result r = E_SUCCESS;
350
351         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
352                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
353
354         r = __pEditDatePresenter->SetYear(year.ToInt());
355
356         if (r == E_SUCCESS)
357         {
358                 UpdateAccessibilityElement();
359         }
360
361         return r;
362 }
363
364 int
365 _EditDate::GetYear(void) const
366 {
367         Variant year = GetProperty("year");
368
369         return year.ToInt();
370 }
371
372 Variant
373 _EditDate::GetPropertyYear(void) const
374 {
375         int year = -1;
376
377         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
378                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
379
380         year = __pEditDatePresenter->GetYear();
381
382         return Variant(year);
383 }
384
385 void
386 _EditDate::SetCurrentDate(void)
387 {
388         SysTryReturnVoidResult(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM,
389                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
390
391         __pEditDatePresenter->SetCurrentDate();
392
393         UpdateAccessibilityElement();
394
395         return;
396 }
397
398 void
399 _EditDate::SetDatePickerEnabled(bool enable)
400 {
401         SetProperty("datePickerEnabled", Variant(enable));
402         return;
403 }
404
405 result
406 _EditDate::SetPropertyDatePickerEnabled(const Variant& enable)
407 {
408         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
409                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
410
411         __pEditDatePresenter->SetDatePickerEnabled(enable.ToBool());
412
413         return E_SUCCESS;
414 }
415
416 bool
417 _EditDate::IsDatePickerEnabled(void) const
418 {
419         Variant enable = GetProperty("datePickerEnabled");
420
421         return enable.ToBool();
422 }
423
424 Variant
425 _EditDate::GetPropertyDatePickerEnabled(void) const
426 {
427         bool enable = false;
428
429         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
430                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
431
432         enable = __pEditDatePresenter->IsDatePickerEnabled();
433
434         return Variant(enable);
435 }
436
437 result
438 _EditDate::SetYearRange(int minYear, int maxYear)
439 {
440         result r = E_SUCCESS;
441
442         SysTryReturn(NID_UI_CTRL, (maxYear >= DATETIME_YEAR_MIN && maxYear <= DATETIME_YEAR_MAX), E_INVALID_ARG, E_INVALID_ARG,
443                         "[E_INVALID_ARG] maxYear(%d) must be greater than or equal to %d and less than or equal to %d.",
444                         maxYear, DATETIME_YEAR_MIN, DATETIME_YEAR_MAX);
445
446         SysTryReturn(NID_UI_CTRL, (minYear >= DATETIME_YEAR_MIN && minYear <= DATETIME_YEAR_MAX), E_INVALID_ARG, E_INVALID_ARG,
447                         "[E_INVALID_ARG] minYear(%d) must be greater than or equal to %d and less than or equal to %d.",
448                         minYear, DATETIME_YEAR_MIN, DATETIME_YEAR_MAX);
449
450         SysTryReturn(NID_UI_CTRL, (maxYear >= minYear), E_INVALID_ARG, E_INVALID_ARG,
451                         "[E_INVALID_ARG] maxYear(%d) must be greater than or equal to minYear(%d).", maxYear, minYear);
452
453         Variant oldMinYear = GetPropertyMinYearRange();
454
455         r = SetPropertyMinYearRange(Variant(minYear));
456         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
457
458         r = SetPropertyMaxYearRange(Variant(maxYear));
459
460         if (IsFailed(r))
461         {
462                 SetPropertyMinYearRange(oldMinYear);
463         }
464
465         return r;
466 }
467
468 result
469 _EditDate::SetMinYearRange(int minYear)
470 {
471         result r = E_SUCCESS;
472
473         r = SetProperty("minYearRange", Variant(minYear));
474
475         return r;
476 }
477
478 result
479 _EditDate::SetMaxYearRange(int maxYear)
480 {
481         result r = E_SUCCESS;
482
483         r = SetProperty("maxYearRange", Variant(maxYear));
484
485         return r;
486 }
487
488 result
489 _EditDate::SetPropertyMinYearRange(const Variant& minYear)
490 {
491         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
492                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
493
494         return __pEditDatePresenter->SetMinYear(minYear.ToInt());
495 }
496
497 result
498 _EditDate::SetPropertyMaxYearRange(const Variant& maxYear)
499 {
500         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), E_SYSTEM, E_SYSTEM,
501                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
502
503         return __pEditDatePresenter->SetMaxYear(maxYear.ToInt());
504 }
505
506 result
507 _EditDate::GetYearRange(int& minYear, int& maxYear) const
508 {
509         result r = E_SUCCESS;
510
511         minYear = GetMinYearRange();
512         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
513         maxYear = GetMaxYearRange();
514         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
515
516         return r;
517 }
518
519 int
520 _EditDate::GetMinYearRange(void) const
521 {
522         Variant minYear = GetProperty("minYearRange");
523
524         return minYear.ToInt();
525 }
526
527 int
528 _EditDate::GetMaxYearRange(void) const
529 {
530         Variant maxYear = GetProperty("maxYearRange");
531
532         return maxYear.ToInt();
533 }
534
535 Variant
536 _EditDate::GetPropertyMinYearRange(void) const
537 {
538         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
539                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
540
541         int minYear = 0;
542
543         minYear = __pEditDatePresenter->GetMinYear();
544
545         return Variant(minYear);
546 }
547
548 Variant
549 _EditDate::GetPropertyMaxYearRange(void) const
550 {
551         SysTryReturn(NID_UI_CTRL, (__pEditDatePresenter != null), Variant(), E_SYSTEM,
552                         "[E_SYSTEM] A system error has occurred. The _EditDatePresenter instance is null.");
553
554         int maxYear = 0;
555
556         maxYear = __pEditDatePresenter->GetMaxYear();
557
558         return Variant(maxYear);
559 }
560
561 result
562 _EditDate::CalculateDateTimeBarPosition(void)
563 {
564         result r = E_SUCCESS;
565         Rectangle absoluteBounds;
566         Rectangle parentBounds;
567         Rectangle frameBounds;
568
569         absoluteBounds = GetAbsoluteBounds();
570
571         _Frame* pFrame = dynamic_cast<_Frame*>(_ControlManager::GetInstance()->GetCurrentFrame());
572         SysTryReturn(NID_UI_CTRL, pFrame != null, E_SYSTEM, E_SYSTEM,
573                         "[E_SYSTEM] A system error has occurred. Failed to get frame instance.");
574
575         _Form* pForm = pFrame->GetCurrentForm();
576         SysTryReturn(NID_UI_CTRL, pForm != null, E_SYSTEM, E_SYSTEM,
577                         "[E_SYSTEM] A system error has occurred. Failed to get form instance.");
578
579         parentBounds = pForm->GetClientBounds();
580         frameBounds = pFrame->GetAbsoluteBounds();
581
582         int dateTimeBarHeight = 0;
583         GET_SHAPE_CONFIG(DATETIMEBAR::ITEM_HEIGHT, GetOrientation(), dateTimeBarHeight);
584
585         Rectangle parentWindowBounds = GetParentWindowBounds();
586         int bottomMargin = 0;
587         // DateTimeBar top margin can be used as Editdate's bottom margin.
588         GET_SHAPE_CONFIG(DATETIMEBAR::TOP_MARGIN, GetOrientation(), bottomMargin);
589
590         int bottomPosition = 0;
591         bottomPosition = absoluteBounds.y + absoluteBounds.height + bottomMargin + dateTimeBarHeight;
592
593         GetDateTimeBar()->SetParentWindowBounds(parentWindowBounds);
594
595         if (bottomPosition > frameBounds.y + parentBounds.y + parentBounds.height)
596         {
597                 r = GetDateTimeBar()->SetPositionAndAlignment(Point(parentWindowBounds.x, absoluteBounds.y), DATETIME_BAR_ALIGN_UP);
598                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
599         }
600         else
601         {
602                 r = GetDateTimeBar()->SetPositionAndAlignment(Point(parentWindowBounds.x, absoluteBounds.y + absoluteBounds.height + bottomMargin), DATETIME_BAR_ALIGN_DOWN);
603                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
604         }
605
606         __absoluteBounds = absoluteBounds;
607
608         return r;
609 }
610
611 void
612 _EditDate::OnDraw(void)
613 {
614         if (GetDateTimeBar() != null)
615         {
616                 CalculateDateTimeBarPosition();
617         }
618
619         __pEditDatePresenter->Draw();
620         return;
621 }
622
623 result
624 _EditDate::OnAttachedToMainTree(void)
625 {
626         if (likely(!(_AccessibilityManager::IsActivated())))
627         {
628                 return E_SUCCESS;
629         }
630
631         Rectangle dayBounds = __pEditDatePresenter->GetDateAreaBounds(DATETIME_ID_DAY);
632         Rectangle monthBounds = __pEditDatePresenter->GetDateAreaBounds(DATETIME_ID_MONTH);
633         Rectangle yearBounds = __pEditDatePresenter->GetDateAreaBounds(DATETIME_ID_YEAR);
634
635         _AccessibilityContainer* pContainer = GetAccessibilityContainer();
636         if (pContainer)
637         {
638
639                 if (__pAccessibilityTitleElement == null)
640                 {
641                         __pAccessibilityTitleElement = new _AccessibilityElement(true);
642                         __pAccessibilityTitleElement->SetBounds(GetBounds());
643                         __pAccessibilityTitleElement->SetTrait(ACCESSIBILITY_TRAITS_NONE);
644                         pContainer->AddElement(*__pAccessibilityTitleElement);
645                 }
646
647                 if (__pAccessibilityYearElement == null && __pAccessibilityMonthElement == null && __pAccessibilityDayElement == null)
648                 {
649                         String hintText(L"Double tap to edit");
650
651                         __pAccessibilityYearElement = new _AccessibilityElement(true);
652                         __pAccessibilityYearElement->SetBounds(yearBounds);
653                         __pAccessibilityYearElement->SetTrait(ACCESSIBILITY_TRAITS_YEAR);
654                         __pAccessibilityYearElement->SetHint(hintText);
655
656                         __pAccessibilityMonthElement = new _AccessibilityElement(true);
657                         __pAccessibilityMonthElement->SetBounds(monthBounds);
658                         __pAccessibilityMonthElement->SetTrait(ACCESSIBILITY_TRAITS_MONTH);
659                         __pAccessibilityMonthElement->SetHint(hintText);
660
661                         __pAccessibilityDayElement = new _AccessibilityElement(true);
662                         __pAccessibilityDayElement->SetBounds(dayBounds);
663                         __pAccessibilityDayElement->SetTrait(ACCESSIBILITY_TRAITS_DAY);
664                         __pAccessibilityDayElement->SetHint(hintText);
665
666                         switch (__pEditDatePresenter->GetLocaleDateFormat())
667                         {
668                         case SETTING_DATE_FORMAT_DD_MM_YYYY:
669                                 pContainer->AddElement(*__pAccessibilityDayElement);
670                                 pContainer->AddElement(*__pAccessibilityMonthElement);
671                                 pContainer->AddElement(*__pAccessibilityYearElement);
672                                 break;
673                         case SETTING_DATE_FORMAT_MM_DD_YYYY:
674                                 pContainer->AddElement(*__pAccessibilityMonthElement);
675                                 pContainer->AddElement(*__pAccessibilityDayElement);
676                                 pContainer->AddElement(*__pAccessibilityYearElement);
677                                 break;
678                         case SETTING_DATE_FORMAT_YYYY_MM_DD:
679                                 pContainer->AddElement(*__pAccessibilityYearElement);
680                                 pContainer->AddElement(*__pAccessibilityMonthElement);
681                                 pContainer->AddElement(*__pAccessibilityDayElement);
682                                 break;
683                         case SETTING_DATE_FORMAT_YYYY_DD_MM:
684                                 pContainer->AddElement(*__pAccessibilityYearElement);
685                                 pContainer->AddElement(*__pAccessibilityDayElement);
686                                 pContainer->AddElement(*__pAccessibilityMonthElement);
687                                 break;
688                         default:
689                                 break;
690                         }
691
692                         UpdateAccessibilityElement();
693                 }
694         }
695         return E_SUCCESS;
696 }
697
698 void
699 _EditDate::OnBoundsChanged(void)
700 {
701         __pEditDatePresenter->Initialize();
702
703         if (__pAccessibilityTitleElement)
704         {
705                 __pAccessibilityTitleElement->SetBounds(__pEditDatePresenter->GetTitleBounds());
706         }
707         if (__pAccessibilityYearElement)
708         {
709                 __pAccessibilityYearElement->SetBounds(__pEditDatePresenter->GetDateAreaBounds(DATETIME_ID_YEAR));
710         }
711         if (__pAccessibilityMonthElement)
712         {
713                 __pAccessibilityMonthElement->SetBounds(__pEditDatePresenter->GetDateAreaBounds(DATETIME_ID_MONTH));
714         }
715         if (__pAccessibilityDayElement)
716         {
717                 __pAccessibilityDayElement->SetBounds(__pEditDatePresenter->GetDateAreaBounds(DATETIME_ID_DAY));
718         }
719
720         return;
721 }
722
723 void
724 _EditDate::OnChangeLayout(_ControlOrientation orientation)
725 {
726         __pEditDatePresenter->OnChangeLayout(orientation);
727
728         if (GetDateTimeBar() != null)
729         {
730                 CalculateDateTimeBarPosition();
731                 GetDateTimeBar()->Close();
732         }
733
734         return;
735 }
736
737 bool
738 _EditDate::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
739 {
740         Rectangle absoluteBounds = GetAbsoluteBounds();
741
742         if (absoluteBounds.y != __absoluteBounds.y || absoluteBounds.height != __absoluteBounds.height)
743         {
744                 CalculateDateTimeBarPosition();
745         }
746
747         return __pEditDatePresenter->OnTouchPressed(source, touchinfo);
748 }
749
750 bool
751 _EditDate::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
752 {
753         return __pEditDatePresenter->OnTouchReleased(source, touchinfo);
754 }
755
756 bool
757 _EditDate::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
758 {
759         return __pEditDatePresenter->OnTouchCanceled(source, touchinfo);
760 }
761
762 bool
763 _EditDate::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
764 {
765         return __pEditDatePresenter->OnTouchMoved(source, touchinfo);
766 }
767
768 void
769 _EditDate::OnTouchMoveHandled(const _Control& control)
770 {
771         __pEditDatePresenter->OnTouchMoveHandled(control);
772         return;
773 }
774
775 result
776 _EditDate::FireDateChangeEvent(_DateTimeChangeStatus status)
777 {
778         SysTryReturn(NID_UI_CTRL, (__pDateChangeEvent != null), E_INVALID_STATE, E_INVALID_STATE,
779                         "[E_INVALID_STATE] The _DateChangeEvent instance is null.");
780
781         _DateTimeChangeEventArg* pDateTimeEventArg = new (std::nothrow) _DateTimeChangeEventArg(status);
782         SysTryReturn(NID_UI_CTRL, pDateTimeEventArg, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
783
784         pDateTimeEventArg->SetDate(GetYear(), GetMonth(), GetDay());
785
786         __pDateChangeEvent->Fire(*pDateTimeEventArg);
787
788         return E_SUCCESS;
789 }
790
791 void
792 _EditDate::OnDateTimeChanged(const _Control& source, int year, int month, int day, int hour, int minute)
793 {
794         __pEditDatePresenter->Animate();
795         Invalidate();
796         FireDateChangeEvent(DATE_INTERNAL_CHANGE_SAVED);
797         return;
798 }
799
800 void
801 _EditDate::OnDateTimeChangeCanceled(const _Control& source)
802 {
803         Invalidate();
804
805         FireDateChangeEvent(DATE_INTERNAL_CHANGE_CANCELED);
806         return;
807 }
808
809 void
810 _EditDate::OnActionPerformed(const Ui::_Control& source, int actionId)
811 {
812         _DateTimeId boxId = __pEditDatePresenter->GetLastSelectedId();
813
814         if (boxId == DATETIME_ID_YEAR)
815         {
816                 SetYear(actionId);
817                 AdjustDay(actionId, GetMonth());
818         }
819         else if (boxId == DATETIME_ID_MONTH)
820         {
821                 SetMonth(actionId);
822                 AdjustDay(GetYear(), actionId);
823         }
824         else if (boxId == DATETIME_ID_DAY)
825         {
826                 SetDay(actionId);
827         }
828
829         Invalidate();
830
831         return;
832 }
833
834 void
835 _EditDate::AdjustDay(int year, int month)
836 {
837         _DateTimeUtils dateTimeUtils;
838         int maxValue = dateTimeUtils.CalculateMaxDay(year, month);
839
840         if (GetDay() > maxValue)
841         {
842                 SetDay(maxValue);
843         }
844
845         return;
846 }
847
848 _DateTimeBar*
849 _EditDate::GetDateTimeBar(void) const
850 {
851         return __pDateTimeBar;
852 }
853
854 void
855 _EditDate::OnFontChanged(Font* pFont)
856 {
857     __pEditDatePresenter->OnFontChanged(pFont);
858
859     return;
860 }
861
862 void
863 _EditDate::OnFontInfoRequested(unsigned long& style, int& size)
864 {
865     __pEditDatePresenter->OnFontInfoRequested(style, size);
866
867     return;
868 }
869
870 Rectangle
871 _EditDate::GetParentWindowBounds(void) const
872 {
873         _Form* pForm = null;
874         _Window* pwindow = null;
875         _Control* pControlCore = GetParent();
876
877         Dimension dateTimeBarSize(0, 0);
878         GET_DIMENSION_CONFIG(DATETIMEBAR::DEFAULT_SIZE, GetOrientation(), dateTimeBarSize);
879         Rectangle parentWindowBounds(0, 0, dateTimeBarSize.width, dateTimeBarSize.height);
880
881         while (true)
882         {
883                 if (pControlCore == null)
884                 {
885                         SysLog(NID_UI_CTRL,"[E_SYSTEM] Parent window not found.");
886
887                         return parentWindowBounds;
888                 }
889
890                 // If the parent is a Frame, then return the Form's bounds.
891                 pForm = dynamic_cast<_Form*>(pControlCore);
892                 if (pForm != null)
893                 {
894                         parentWindowBounds = pForm->GetBounds();
895                         break;
896                 }
897
898                 pwindow = dynamic_cast<_Window*>(pControlCore);
899
900                 if (pwindow != null)
901                 {
902                         parentWindowBounds = pwindow->GetBounds();
903                         break;
904                 }
905
906                 pControlCore = pControlCore->GetParent();
907         }
908
909         return parentWindowBounds;
910 }
911
912 void
913 _EditDate::UpdateAccessibilityElement(void)
914 {
915         String string;
916         String yearString;
917         String dayString;
918         String space(L" ");
919
920         if (likely(!(_AccessibilityManager::IsActivated())))
921         {
922                 return;
923         }
924
925         if (__pAccessibilityTitleElement == null)
926         {
927                 return;
928         }
929
930         if (__title.IsEmpty() == false)
931         {
932                 string.Append(__title);
933                 string.Append(L", ");
934         }
935
936         yearString.Append(GetYear());
937         dayString.Append(GetDay());
938         String monthString = GetDateTimeBar()->GetMonthValue(GetMonth()).GetPointer();
939
940         switch (__pEditDatePresenter->GetLocaleDateFormat())
941         {
942         case SETTING_DATE_FORMAT_DD_MM_YYYY:
943                 string.Append(dayString.GetPointer());
944                 string.Append(space.GetPointer());
945                 string.Append(monthString.GetPointer());
946                 string.Append(space.GetPointer());
947                 string.Append(yearString.GetPointer());
948                 break;
949         case SETTING_DATE_FORMAT_MM_DD_YYYY:
950                 string.Append(monthString.GetPointer());
951                 string.Append(space.GetPointer());
952                 string.Append(dayString.GetPointer());
953                 string.Append(space.GetPointer());
954                 string.Append(yearString.GetPointer());
955                 break;
956         case SETTING_DATE_FORMAT_YYYY_MM_DD:
957                 string.Append(yearString.GetPointer());
958                 string.Append(space.GetPointer());
959                 string.Append(monthString.GetPointer());
960                 string.Append(space.GetPointer());
961                 string.Append(dayString.GetPointer());
962                 break;
963         case SETTING_DATE_FORMAT_YYYY_DD_MM:
964                 string.Append(yearString.GetPointer());
965                 string.Append(space.GetPointer());
966                 string.Append(dayString.GetPointer());
967                 string.Append(space.GetPointer());
968                 string.Append(monthString.GetPointer());
969                 break;
970         default:
971                 break;
972         }
973
974         __pAccessibilityTitleElement->SetLabel(string);
975         __pAccessibilityDayElement->SetLabel(dayString);
976         __pAccessibilityMonthElement->SetLabel(monthString);
977         __pAccessibilityYearElement->SetLabel(yearString);
978         return;
979 }
980
981 }}}  // Tizen::Ui::Controls