Merge "Memory Leak fixes and Font changes" into tizen_2.1
[platform/framework/native/uifw.git] / src / ui / controls / FUiCtrl_EditTimePresenter.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_EditTimePresenter.cpp
20  * @brief               This is the implementation file for the _EditTimePresenter class.
21  */
22
23 #include <FSysSettingInfo.h>
24 #include <FGrp_BitmapImpl.h>
25 #include <FGrp_TextTextObject.h>
26 #include <FGrp_TextTextSimple.h>
27 #include <FGrp_FontImpl.h>
28 #include "FUi_CoordinateSystemUtils.h"
29 #include "FUi_ResourceManager.h"
30 #include "FUiCtrl_EditTimePresenter.h"
31 #include "FUiCtrl_EditTime.h"
32 #include "FUiCtrl_DateTimeModel.h"
33 #include "FUiCtrl_DateTimeUtils.h"
34 #include "FUiAnim_VisualElement.h"
35 #include "FUiAnimVisualElementPropertyAnimation.h"
36 #include "FGrpColor.h"
37
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Base;
40 using namespace Tizen::Graphics::_Text;
41 using namespace Tizen::Ui::Animations;
42 using namespace Tizen::System;
43
44 namespace Tizen { namespace Ui { namespace Controls
45 {
46 _EditTimePresenter::_EditTimePresenter(const String& title)
47         : __pEditDateTimeModel(null)
48         , __pEditTime(null)
49         , __bounds(FloatRectangle())
50         , __titleBounds(FloatRectangle())
51         , __ampmString(String())
52         , __hourString(String())
53         , __minuteString(String())
54         , __title(title)
55         , __24hours(false)
56         , __is24hoursSet(false)
57         , __amEnable(true)
58         , __timePickerEnabled(true)
59         , __selectedId(DATETIME_ID_NONE)
60         , __lastSelectedId(DATETIME_ID_NONE)
61         , __touchMoveHandled(false)
62         , __pAmPmBgNormalColorReplacementBitmap(null)
63         , __pAmPmBgDisabledColorReplacementBitmap(null)
64         , __pAmPmBgPressedColorReplacementBitmap(null)
65         , __pAmPmBgEffectNomralBitmap(null)
66         , __pAmPmBgEffectPressedBitmap(null)
67         , __pAmPmBgEffectDisabledBitmap(null)
68         , __pColonColorReplacementBitmap(null)
69         , __pColonDisabledColorReplacementBitmap(null)
70         , __pContentProvider(null)
71         , __textObject()
72         , __pFont(null)
73         , __titleObject()
74         , __amPmTextSize(0.0f)
75         , __titleFontSize(0.0f)
76         , __timeFontSize(0.0f)
77         , __isAnimating(false)
78         , __isEditTimeInitialized(false)
79 {
80 }
81
82 _EditTimePresenter::~_EditTimePresenter(void)
83 {
84         __textObject.RemoveAll();
85         __titleObject.RemoveAll();
86
87         delete __pEditDateTimeModel;
88         __pEditDateTimeModel = null;
89
90         delete __pAmPmBgNormalColorReplacementBitmap;
91         __pAmPmBgNormalColorReplacementBitmap = null;
92
93         delete __pAmPmBgDisabledColorReplacementBitmap;
94         __pAmPmBgDisabledColorReplacementBitmap = null;
95
96         delete __pAmPmBgPressedColorReplacementBitmap;
97         __pAmPmBgPressedColorReplacementBitmap = null;
98
99         delete __pAmPmBgEffectNomralBitmap;
100         __pAmPmBgEffectNomralBitmap = null;
101
102         delete __pAmPmBgEffectPressedBitmap;
103         __pAmPmBgEffectPressedBitmap = null;
104
105         delete __pAmPmBgEffectDisabledBitmap;
106         __pAmPmBgEffectDisabledBitmap = null;
107
108         delete __pColonColorReplacementBitmap;
109         __pColonColorReplacementBitmap = null;
110
111         delete __pColonDisabledColorReplacementBitmap;
112         __pColonDisabledColorReplacementBitmap = null;
113 }
114
115 _EditTimePresenter*
116 _EditTimePresenter::CreateInstanceN(const _EditTime& editTime, const String& title)
117 {
118         _EditTimePresenter* pEditTimePresenter = new (std::nothrow) _EditTimePresenter(title);
119         SysTryReturn(NID_UI_CTRL, pEditTimePresenter, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
120
121         pEditTimePresenter->__pEditTime = const_cast <_EditTime*>(&editTime);
122
123         pEditTimePresenter->__pEditDateTimeModel = new (std::nothrow) _DateTimeModel;
124         SysTryCatch(NID_UI_CTRL, pEditTimePresenter->__pEditDateTimeModel, , E_OUT_OF_MEMORY,
125                         "[E_OUT_OF_MEMORY] Memory allocation failed.");
126
127         return pEditTimePresenter;
128
129 CATCH:
130         delete pEditTimePresenter;
131         return null;
132 }
133
134 DateTime
135 _EditTimePresenter::GetTime(void) const
136 {
137         DateTime time;
138         time.SetValue(DATETIME_YEAR_MIN, DATETIME_MONTH_MIN, DATETIME_DAY_MIN, GetHour(), GetMinute(), 0);
139
140         return time;
141 }
142
143 int
144 _EditTimePresenter::GetHour(void) const
145 {
146         return __pEditDateTimeModel->GetHour();
147 }
148
149 int
150 _EditTimePresenter::GetMinute(void) const
151 {
152         return __pEditDateTimeModel->GetMinute();
153 }
154
155 void
156 _EditTimePresenter::SetTime(const DateTime& time)
157 {
158         __pEditDateTimeModel->SetDateTime(time);
159 }
160
161 void
162 _EditTimePresenter::SetCurrentTime(void)
163 {
164         __pEditDateTimeModel->SetCurrentDateTime();
165         return;
166 }
167
168 result
169 _EditTimePresenter::SetHour(int hour)
170 {
171         return __pEditDateTimeModel->SetHour(hour);
172 }
173
174 result
175 _EditTimePresenter::SetMinute(int minute)
176 {
177         return __pEditDateTimeModel->SetMinute(minute);
178 }
179
180 void
181 _EditTimePresenter::SetTimePickerEnabled(bool enable)
182 {
183         __timePickerEnabled = enable;
184         return;
185 }
186
187 bool
188 _EditTimePresenter::IsTimePickerEnabled(void) const
189 {
190         return __timePickerEnabled;
191 }
192
193 void
194 _EditTimePresenter::Set24HourNotationEnabled(bool enable)
195 {
196         __24hours = enable;
197         __is24hoursSet = true;
198         return;
199 }
200
201 bool
202 _EditTimePresenter::Is24HourNotationEnabled(void) const
203 {
204         return __24hours;
205 }
206
207 void
208 _EditTimePresenter::SetTimeConversion(void)
209 {
210         int hour = GetHour();
211         int minute = GetMinute();
212
213         if (__24hours == false)
214         {
215                 int max = DATETIME_HOUR_MAX_FOR_24NOTATION;
216
217                 if (hour > max)
218                 {
219                         __hourString.Format(10, L"%02d", hour - max);
220                 }
221                 else if (hour == DATETIME_HOUR_MIN)
222                 {
223                         __hourString.Format(10, L"%02d", hour + DATETIME_HOUR_MAX_FOR_24NOTATION);
224                 }
225                 else
226                 {
227                         __hourString.Format(10, L"%02d", hour);
228                 }
229
230                 __minuteString.Format(10, L"%02d", minute);
231         }
232         else
233         {
234                 __hourString.Format(10, L"%02d", hour);
235                 __minuteString.Format(10, L"%02d", minute);
236         }
237
238         return;
239 }
240
241 void
242 _EditTimePresenter::SetAmEnabled(bool amEnable)
243 {
244         String textAm;
245         String textPm;
246
247         GET_STRING_CONFIG(IDS_COM_BODY_AM, textAm);
248         GET_STRING_CONFIG(IDS_COM_POP_PM, textPm);
249
250         __amEnable = amEnable;
251         int hour = GetHour();
252
253         if (__amEnable == true)
254         {
255                 __ampmString = textAm;
256                 if (hour >= DATETIME_HOUR_MAX_FOR_24NOTATION)
257                 {
258                         SetHour(hour - DATETIME_HOUR_MAX_FOR_24NOTATION);
259                 }
260         }
261         else
262         {
263                 __ampmString = textPm;
264                 if (hour < DATETIME_HOUR_MAX_FOR_24NOTATION)
265                 {
266                         SetHour(hour + DATETIME_HOUR_MAX_FOR_24NOTATION);
267                 }
268         }
269
270         return;
271 }
272
273 bool
274 _EditTimePresenter::GetAmEnabled(void) const
275 {
276         return __amEnable;
277 }
278
279 FloatRectangle
280 _EditTimePresenter::GetDisplayAreaBoundsFromHoursStyle(_DateTimeId displayBoxId) const
281 {
282         SysTryReturn(NID_UI_CTRL, displayBoxId >= DATETIME_ID_HOUR && displayBoxId <= DATETIME_ID_AMPM, FloatRectangle(),
283                         E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] displayBoxId is out of range.");
284
285         FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
286
287         float width = 0.0f;
288         float colonWidth = 0.0f;
289         float margin = 0.0f;
290         float colonMargin = 0.0f;
291         float timeElementWidth = 0.0f;
292         float amPmHeight = 0.0f;
293         float timeHeight = 0.0f;
294         float titleTimeMargin = 0.0f;
295         float leftMargin = 0.0f;
296
297         GET_SHAPE_CONFIG(EDITTIME::TIME_WIDTH, __pEditTime->GetOrientation(), width);
298         GET_SHAPE_CONFIG(EDITTIME::HEIGHT, __pEditTime->GetOrientation(), bounds.height);
299         GET_SHAPE_CONFIG(EDITTIME::COLON_WIDTH, __pEditTime->GetOrientation(), colonWidth);
300         GET_SHAPE_CONFIG(EDITTIME::TIME_AMPM_MARGIN, __pEditTime->GetOrientation(), margin);
301         GET_SHAPE_CONFIG(EDITTIME::TIME_TEXT_LEFT_MARGIN, __pEditTime->GetOrientation(), leftMargin);
302         GET_SHAPE_CONFIG(EDITTIME::COLON_MARGIN, __pEditTime->GetOrientation(), colonMargin);
303         GET_SHAPE_CONFIG(EDITTIME::HOUR_MINUTE_WIDTH, __pEditTime->GetOrientation(), timeElementWidth);
304         GET_SHAPE_CONFIG(EDITTIME::AMPM_HEIGHT, __pEditTime->GetOrientation(), amPmHeight);
305         GET_SHAPE_CONFIG(EDITTIME::TITLE_TIME_MARGIN, __pEditTime->GetOrientation(), titleTimeMargin);
306         GET_SHAPE_CONFIG(EDITTIME::TIME_HEIGHT, __pEditTime->GetOrientation(), timeHeight);
307
308         if (__pEditTime->GetBoundsF().height > bounds.height)
309         {
310                 bounds.height = __pEditTime->GetBoundsF().height;
311         }
312
313         if (!__title.IsEmpty())
314         {
315                 if (displayBoxId == DATETIME_ID_AMPM)
316                 {
317                         bounds.y = __titleBounds.y + __titleBounds.height;
318                 }
319                 else
320                 {
321                         bounds.y = __titleBounds.y + __titleBounds.height + titleTimeMargin;
322                         bounds.height = timeHeight;
323                 }
324         }
325
326         if (__pEditTime->GetOrientation() == _CONTROL_ORIENTATION_LANDSCAPE)
327         {
328                 leftMargin = 0.0f;
329         }
330
331         bounds.x = leftMargin + ((width - (2.0f * timeElementWidth + colonWidth + 2.0f * colonMargin)) / 2.0f);
332
333         if (displayBoxId == DATETIME_ID_HOUR)
334         {
335                 bounds.width = timeElementWidth;
336         }
337         else if (displayBoxId == DATETIME_ID_MINUTE)
338         {
339                 bounds.x = bounds.x + timeElementWidth + colonWidth + 2.0f * colonMargin;
340                 bounds.width = timeElementWidth;
341         }
342         else if (displayBoxId == DATETIME_ID_AMPM)
343         {
344                 bounds.x = leftMargin + width + margin;
345
346                 if (__title.IsEmpty())
347                 {
348                         bounds.y = bounds.y + (bounds.height - amPmHeight) / 2.0f;
349                 }
350
351                 GET_SHAPE_CONFIG(EDITTIME::AMPM_WIDTH, __pEditTime->GetOrientation(), bounds.width);
352                 bounds.height = amPmHeight;
353         }
354
355         return bounds;
356 }
357
358 void
359 _EditTimePresenter::SetTitleBounds(void)
360 {
361         GET_SHAPE_CONFIG(EDITTIME::TIME_TEXT_LEFT_MARGIN, __pEditTime->GetOrientation(), __titleBounds.x);
362         GET_SHAPE_CONFIG(EDITTIME::WIDTH, __pEditTime->GetOrientation(), __titleBounds.width);
363         GET_SHAPE_CONFIG(EDITTIME::TITLE_HEIGHT, __pEditTime->GetOrientation(), __titleBounds.height);
364
365         return;
366 }
367
368 FloatRectangle
369 _EditTimePresenter::GetTitleBounds(void) const
370 {
371         return __titleBounds;
372 }
373
374 result
375 _EditTimePresenter::LoadResource(void)
376 {
377         result r = E_SUCCESS;
378
379         Color buttonNormalBgColor;
380         Color buttonDisabledBgColor;
381         Color buttonNormalPressedColor;
382         Color colonTextColor;
383         Color colonTextDisabledColor;
384         Bitmap* pTempBitmap = null;
385
386         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_NORMAL, buttonNormalBgColor);
387         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_PRESSED, buttonNormalPressedColor);
388         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_DISABLED, buttonDisabledBgColor);
389         GET_COLOR_CONFIG(EDITTIME::TEXT_NORMAL, colonTextColor);
390         GET_COLOR_CONFIG(EDITTIME::TEXT_DISABLED, colonTextDisabledColor);
391
392         GET_SHAPE_CONFIG(EDITTIME::AMPM_FONT_SIZE, __pEditTime->GetOrientation(), __amPmTextSize);
393
394         r = GET_BITMAP_CONFIG_N(EDITTIME::COLON_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, pTempBitmap);
395         SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "[%s] Propagating.", GetErrorMessage(r));
396
397         __pColonColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pTempBitmap, Color::GetColor(COLOR_ID_WHITE),
398                                                                               colonTextColor);
399         SysTryCatch(NID_UI_CTRL, (__pColonColorReplacementBitmap != null), r = GetLastResult(), GetLastResult(),
400                         "[%s] Propagating.", GetErrorMessage(GetLastResult()));
401
402         __pColonDisabledColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pTempBitmap, Color::GetColor(COLOR_ID_WHITE),
403                         colonTextDisabledColor);
404         SysTryCatch(NID_UI_CTRL, (__pColonDisabledColorReplacementBitmap != null), r = GetLastResult(), GetLastResult(),
405                         "[%s] Propagating.", GetErrorMessage(GetLastResult()));
406
407         delete pTempBitmap;
408         pTempBitmap = null;
409
410         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, pTempBitmap);
411         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
412
413         __pAmPmBgNormalColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pTempBitmap, Color::GetColor(COLOR_ID_MAGENTA), buttonNormalBgColor);
414         SysTryCatch(NID_UI_CTRL, (__pAmPmBgNormalColorReplacementBitmap != null), r = GetLastResult(), GetLastResult(),
415                                 "[%s] Propagating.", GetErrorMessage(GetLastResult()));
416
417         delete pTempBitmap;
418         pTempBitmap = null;
419
420         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, pTempBitmap);
421         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
422
423         __pAmPmBgDisabledColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pTempBitmap, Color::GetColor(COLOR_ID_MAGENTA), buttonDisabledBgColor);
424         SysTryCatch(NID_UI_CTRL, (__pAmPmBgDisabledColorReplacementBitmap != null), r = GetLastResult(), GetLastResult(),
425                                         "[%s] Propagating.", GetErrorMessage(GetLastResult()));
426
427         delete pTempBitmap;
428         pTempBitmap = null;
429
430         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_DISABLED, BITMAP_PIXEL_FORMAT_ARGB8888, pTempBitmap);
431         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
432
433         __pAmPmBgPressedColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pTempBitmap, Color::GetColor(COLOR_ID_MAGENTA), buttonNormalPressedColor);
434         SysTryCatch(NID_UI_CTRL, (__pAmPmBgPressedColorReplacementBitmap != null), r = GetLastResult(), GetLastResult(),
435                                         "[%s] Propagating.", GetErrorMessage(GetLastResult()));
436
437         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_EFFECT_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pAmPmBgEffectNomralBitmap);
438         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
439
440         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_EFFECT_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, __pAmPmBgEffectPressedBitmap);
441         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
442
443         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_EFFECT_DISABLED, BITMAP_PIXEL_FORMAT_ARGB8888, __pAmPmBgEffectDisabledBitmap);
444         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
445
446
447         delete pTempBitmap;
448         pTempBitmap = null;
449
450         return r;
451
452 CATCH:
453         delete pTempBitmap;
454         pTempBitmap = null;
455
456         delete __pAmPmBgNormalColorReplacementBitmap;
457         __pAmPmBgNormalColorReplacementBitmap = null;
458
459         delete __pAmPmBgPressedColorReplacementBitmap;
460         __pAmPmBgPressedColorReplacementBitmap = null;
461
462         delete __pAmPmBgEffectNomralBitmap;
463         __pAmPmBgEffectNomralBitmap = null;
464
465         delete __pAmPmBgEffectPressedBitmap;
466         __pAmPmBgEffectPressedBitmap = null;
467
468         delete __pColonColorReplacementBitmap;
469         __pColonColorReplacementBitmap = null;
470
471         return r;
472 }
473
474 result
475 _EditTimePresenter::DrawResourceBitmap(Canvas& canvas, const FloatRectangle& bounds, Bitmap* pBitmap)
476 {
477         result r = E_SUCCESS;
478
479         if (pBitmap == null)
480         {
481                 return r;
482         }
483
484         if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBitmap))
485         {
486                 r = canvas.DrawNinePatchedBitmap(bounds, *pBitmap);
487                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
488         }
489         else
490         {
491                 r = canvas.DrawBitmap(bounds, *pBitmap);
492                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
493         }
494
495         return r;
496 }
497
498 result
499 _EditTimePresenter::InitializeTitleObject(void)
500 {
501         result r = E_SUCCESS;
502
503         Color titleNormalColor;
504
505         GET_COLOR_CONFIG(EDITTIME::TITLE_TEXT_NORMAL, titleNormalColor);
506
507         r = __titleObject.Construct();
508         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
509
510         TextSimple* pSimpleText = null;
511
512         pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(__title.GetPointer())), __title.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
513         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
514
515         __titleObject.AppendElement(*pSimpleText);
516
517         __titleObject.SetForegroundColor(titleNormalColor, 0, __titleObject.GetTextLength());
518         __titleObject.SetFont(__pFont, 0, __titleObject.GetTextLength());
519         __titleObject.SetAlignment(TEXT_OBJECT_ALIGNMENT_LEFT | TEXT_OBJECT_ALIGNMENT_MIDDLE);
520         __titleObject.SetWrap(TEXT_OBJECT_WRAP_TYPE_NONE);
521         __titleObject.SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
522
523         return r;
524 }
525
526 result
527 _EditTimePresenter::InitializeTextObject(void)
528 {
529         result r = E_SUCCESS;
530
531         r = __textObject.Construct();
532         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
533
534         TextSimple* pSimpleText = new (std::nothrow)TextSimple(null, 0, TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
535         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
536                         "[E_OUT_OF_MEMORY] Memory allocation failed.");
537
538         __textObject.AppendElement(*pSimpleText);
539
540         __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
541         __textObject.SetAlignment(TEXT_OBJECT_ALIGNMENT_CENTER | TEXT_OBJECT_ALIGNMENT_MIDDLE);
542         __textObject.SetWrap(TEXT_OBJECT_WRAP_TYPE_NONE);
543         __textObject.SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
544
545         return r;
546 }
547
548 result
549 _EditTimePresenter::Draw(void)
550 {
551         result r = E_SUCCESS;
552
553         if (__isAnimating)
554         {
555                 return E_SUCCESS;
556         }
557
558         Canvas* pCanvas = __pEditTime->GetCanvasN();
559         SysAssertf((pCanvas != null), "Failed to get canvas.");
560
561         FloatRectangle colonBounds(0.0f, 0.0f, 0.0f, 0.0f);
562
563         float colonMargin = 0.0f;
564
565         Dimension textArea;
566
567         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
568         pCanvas->Clear();
569
570         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
571         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
572         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
573         bool isCustomBitmap = false;
574         Bitmap* pReplacementBitmap = null;
575         Bitmap* pEffectBitmap = null;
576
577         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
578         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
579
580         if (__24hours == false)
581         {
582                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
583
584                 if (!__pEditTime->IsEnabled())
585                 {
586                         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::BUTTON_BG_DISABLED);
587                         pReplacementBitmap = __pAmPmBgDisabledColorReplacementBitmap;
588                         pEffectBitmap = __pAmPmBgEffectDisabledBitmap;
589                 }
590                 else if (__selectedId != DATETIME_ID_AMPM)
591                 {
592                         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::BUTTON_BG_NORMAL);
593                         pReplacementBitmap = __pAmPmBgNormalColorReplacementBitmap;
594                         pEffectBitmap = __pAmPmBgEffectNomralBitmap;
595                 }
596                 else
597                 {
598                         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::BUTTON_BG_PRESSED);
599                         pReplacementBitmap = __pAmPmBgPressedColorReplacementBitmap;
600                         pEffectBitmap = __pAmPmBgEffectPressedBitmap;
601                 }
602
603                 r = DrawResourceBitmap(*pCanvas, ampmBounds, pReplacementBitmap);
604                 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
605
606                 if (!isCustomBitmap)
607                 {
608                         r = DrawResourceBitmap(*pCanvas, ampmBounds, pEffectBitmap);
609                         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
610                 }
611         }
612
613         if (GetHour() >= DATETIME_HOUR_MAX_FOR_24NOTATION)
614         {
615                 SetAmEnabled(false);
616         }
617         else
618         {
619                 SetAmEnabled(true);
620         }
621
622         SetTimeConversion();
623
624         GET_SHAPE_CONFIG(EDITTIME::COLON_WIDTH, __pEditTime->GetOrientation(), colonBounds.width);
625         GET_SHAPE_CONFIG(EDITTIME::COLON_MARGIN, __pEditTime->GetOrientation(), colonMargin);
626         GET_SHAPE_CONFIG(EDITTIME::AMPM_HEIGHT, __pEditTime->GetOrientation(), colonBounds.height);
627
628         colonBounds.x = hourBounds.x + hourBounds.width + colonMargin;
629         colonBounds.y = hourBounds.y + (hourBounds.height - colonBounds.height) / 2.0f;
630
631         if (__title.IsEmpty() == false)
632         {
633                 r = DrawTitle(*pCanvas);
634                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
635         }
636
637         r = DrawText(*pCanvas, hourBounds, __hourString);
638         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
639
640         r = DrawText(*pCanvas, minuteBounds, __minuteString);
641         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
642
643         if (__24hours == false)
644         {
645                 r = DrawText(*pCanvas, ampmBounds, __ampmString, __amPmTextSize);
646                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
647         }
648
649         r = DrawColon(*pCanvas, colonBounds);
650         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
651
652 CATCH:
653         delete pCanvas;
654
655         return r;
656 }
657
658 result
659 _EditTimePresenter::DrawColon(Canvas& canvas, const FloatRectangle& bounds)
660 {
661         result r = E_SUCCESS;
662
663         if (!__pEditTime->IsEnabled())
664         {
665                 r = DrawResourceBitmap(canvas, bounds, __pColonDisabledColorReplacementBitmap);
666         }
667         else
668         {
669                 r = DrawResourceBitmap(canvas, bounds, __pColonColorReplacementBitmap);
670         }
671
672         if ( r != E_SUCCESS)
673         {
674                 r = DrawText(canvas, bounds, L":");
675                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
676         }
677
678         return r;
679 }
680
681 result
682 _EditTimePresenter::DrawTitle(Canvas& canvas)
683 {
684         if (!__pEditTime->IsEnabled())
685         {
686                 Color titleDisabledColor;
687                 GET_COLOR_CONFIG(EDITTIME::TITLE_TEXT_DISABLED, titleDisabledColor);
688                 __titleObject.SetForegroundColor(titleDisabledColor, 0, __titleObject.GetTextLength());
689         }
690
691         (_FontImpl::GetInstance(*__pFont))->SetSize(__titleFontSize);
692         __titleObject.SetFont(__pFont, 0, __titleObject.GetTextLength());
693
694         __titleObject.Draw(*_CanvasImpl::GetInstance(canvas));
695
696         return E_SUCCESS;
697 }
698
699 result
700 _EditTimePresenter::DrawText(Canvas& canvas, const FloatRectangle& bounds, const String& text, float textSize)
701 {
702         result r = E_SUCCESS;
703
704         Font font;
705         Color textColor;
706
707         _DateTimeId boxId = DATETIME_ID_NONE;
708         boxId = GetBoxIdFromPosition(FloatPoint(bounds.x + 1.0f, bounds.y));
709
710         if (!__pEditTime->IsEnabled())
711         {
712                 if (boxId == DATETIME_ID_AMPM)
713                 {
714                         GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_DISABLED, textColor);
715                 }
716                 else
717                 {
718                         GET_COLOR_CONFIG(EDITTIME::TEXT_DISABLED, textColor);
719                 }
720         }
721         else
722         {
723                 GET_COLOR_CONFIG(EDITTIME::TEXT_NORMAL, textColor);
724
725                 if (boxId == DATETIME_ID_AMPM)
726                 {
727                         GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_NORMAL, textColor);
728                 }
729
730                 if (boxId > -1 && boxId == __selectedId)
731                 {
732                         if (boxId == DATETIME_ID_AMPM)
733                         {
734                                 GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_PRESSED, textColor);
735                         }
736                         else
737                         {
738                                 GET_COLOR_CONFIG(EDITTIME::TEXT_PRESSED, textColor);
739                         }
740                 }
741         }
742
743         FloatRectangle drawAreaBounds(0.0f, 0.0f, 0.0f, 0.0f);
744         drawAreaBounds = bounds;
745
746         TextSimple* pSimpleText = null;
747         pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(text.GetPointer())), text.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
748         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
749
750         __textObject.RemoveAll();
751
752         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
753
754         __textObject.AppendElement(*pSimpleText);
755
756         if (boxId == DATETIME_ID_AMPM)
757         {
758                 (_FontImpl::GetInstance(*__pFont))->SetSize(textSize);
759                 __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
760         }
761         else
762         {
763                 __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
764         }
765
766         __textObject.SetForegroundColor(textColor, 0, __textObject.GetTextLength());
767         __textObject.SetBounds(drawAreaBounds);
768         __textObject.Draw(*_CanvasImpl::GetInstance(canvas));
769
770         return r;
771 }
772
773 _DateTimeId
774 _EditTimePresenter::GetBoxIdFromPosition(const FloatPoint& point) const
775 {
776         _DateTimeId displayBoxId = DATETIME_ID_NONE;
777
778         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
779         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
780         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
781
782         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
783         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
784
785         if (__24hours == false)
786         {
787                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
788         }
789
790         if (point.y < hourBounds.y || point.y > hourBounds.y + hourBounds.height)
791         {
792                 return displayBoxId;
793         }
794
795         if (hourBounds.Contains(point) == true)
796         {
797                 displayBoxId = DATETIME_ID_HOUR;
798         }
799         else if (minuteBounds.Contains(point) == true)
800         {
801                 displayBoxId = DATETIME_ID_MINUTE;
802         }
803         else if (ampmBounds.Contains(point) == true)
804         {
805                 displayBoxId = DATETIME_ID_AMPM;
806         }
807
808         return displayBoxId;
809 }
810
811 void
812 _EditTimePresenter::SetLastSelectedId(_DateTimeId boxId)
813 {
814         __lastSelectedId = boxId;
815         return;
816 }
817
818 _DateTimeId
819 _EditTimePresenter::GetLastSelectedId(void) const
820 {
821         return __lastSelectedId;
822 }
823
824 bool
825 _EditTimePresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
826 {
827         SysTryReturn(NID_UI_CTRL, IsTimePickerEnabled() == true, true, E_SYSTEM, "[E_SYSTEM] A system error has occurred. EditTime instance is disabled.");
828
829         if (&source != __pEditTime)
830         {
831                 return false;
832         }
833
834         __touchMoveHandled = false;
835
836         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
837         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
838         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
839
840         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
841         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
842
843         if (__24hours == false)
844         {
845                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
846         }
847
848         FloatPoint point = touchinfo.GetCurrentPosition();
849
850         _DateTimeId boxId = GetBoxIdFromPosition(point);
851
852         int minValue = -1;
853         int maxValue = -1;
854         int displayValue = -1;
855
856         if (boxId == DATETIME_ID_HOUR)
857         {
858                 if (__pEditTime->GetDateTimeBar() != null)
859                 {
860                         if (__24hours == false)
861                         {
862                                 if (GetHour() == 0)
863                                 {
864                                         minValue = DATETIME_HOUR_MIN + 1;
865                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
866                                         displayValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
867                                 }
868                                 else if (GetHour() > DATETIME_HOUR_MAX_FOR_24NOTATION)
869                                 {
870                                         minValue = DATETIME_HOUR_MIN + 1;
871                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
872                                         displayValue = GetHour() - DATETIME_HOUR_MAX_FOR_24NOTATION;
873                                 }
874                                 else
875                                 {
876                                         minValue = DATETIME_HOUR_MIN + 1;
877                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
878                                         displayValue = GetHour();
879                                 }
880                         }
881                         else
882                         {
883                                 minValue = DATETIME_HOUR_MIN;
884                                 maxValue = DATETIME_HOUR_MAX;
885                                 displayValue = GetHour();
886                         }
887
888                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
889                         {
890                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
891                         }
892
893                         __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
894                 }
895
896                 __bounds = hourBounds;
897         }
898         else if (boxId == DATETIME_ID_MINUTE)
899         {
900                 if (__pEditTime->GetDateTimeBar() != null)
901                 {
902                         minValue = DATETIME_MINUTE_MIN;
903                         maxValue = DATETIME_MINUTE_MAX;
904                         displayValue = GetMinute();
905
906                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
907                         {
908                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
909                         }
910
911                         __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
912                 }
913
914                 __bounds = minuteBounds;
915         }
916         else if (boxId == DATETIME_ID_AMPM)
917         {
918                 __bounds = ampmBounds;
919         }
920         else
921         {
922                 __selectedId = DATETIME_ID_NONE;
923                 return false;
924         }
925         __selectedId = boxId;
926
927         __pEditTime->Draw();
928
929         return true;
930 }
931
932 bool
933 _EditTimePresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
934 {
935         SysTryReturn(NID_UI_CTRL, IsTimePickerEnabled() == true, true, E_SYSTEM, "[E_SYSTEM] A system error has occurred. EditTime instance is disabled.");
936
937         if (&source != __pEditTime)
938         {
939                 return false;
940         }
941
942         FloatRectangle bounds = __pEditTime->GetBoundsF();
943
944         FloatPoint startPoint(0.0f, 0.0f);
945
946         float titleHeight = 0;
947         GET_SHAPE_CONFIG(EDITTIME::TITLE_HEIGHT, __pEditTime->GetOrientation(), titleHeight);
948
949         __bounds = FloatRectangle(0.0f, titleHeight, bounds.width, bounds.height);
950
951         FloatPoint point = touchinfo.GetCurrentPosition();
952
953         _DateTimeId boxId = GetBoxIdFromPosition(point);
954
955         if (boxId < 0)
956         {
957                 __selectedId = DATETIME_ID_NONE;
958         }
959
960         if (boxId != __selectedId)
961         {
962                 __selectedId = DATETIME_ID_NONE;
963         }
964
965         SetLastSelectedId(__selectedId);
966         __selectedId = DATETIME_ID_NONE;
967
968         __lastSelectedValue = "";
969         _DateTimeUtils dateTimeUtils;
970         if (GetLastSelectedId() == DATETIME_ID_HOUR)
971         {
972                 int hours = GetHour();
973
974                 if (!Is24HourNotationEnabled())
975                 {
976                         hours = hours % 12;
977
978                         if (hours == DATETIME_HOUR_MIN)
979                         {
980                                 hours = hours + DATETIME_HOUR_MAX_FOR_24NOTATION;
981                         }
982                 }
983                 __lastSelectedValue.Format(10, L"%02d", hours);
984                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
985         }
986         else if (GetLastSelectedId() == DATETIME_ID_MINUTE)
987         {
988                 __lastSelectedValue.Format(10, L"%02d", GetMinute());
989                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
990         }
991
992         if (GetLastSelectedId() == DATETIME_ID_AMPM)
993         {
994                 SetAmEnabled(!GetAmEnabled());
995                 __pEditTime->FireTimeChangeEvent(TIME_INTERNAL_CHANGE_SAVED);
996                 __pEditTime->UpdateAccessibilityElement();
997                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
998         }
999
1000         __pEditTime->Draw();
1001
1002         if (__pEditTime->GetDateTimeBar() != null && boxId != DATETIME_ID_AMPM && GetLastSelectedId() != DATETIME_ID_NONE)
1003         {
1004                 FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
1005                 bounds = GetDisplayAreaBoundsFromHoursStyle(GetLastSelectedId());
1006                 FloatRectangle absoluteBounds(0.0f, 0.0f, 0.0f, 0.0f);
1007                 absoluteBounds = __pEditTime->GetAbsoluteBoundsF();
1008                 bounds.x += absoluteBounds.x;
1009
1010                 __pEditTime->GetDateTimeBar()->CalculateArrowBounds(bounds);
1011                 __pEditTime->GetDateTimeBar()->SetVisibleState(true);
1012                 __pEditTime->GetDateTimeBar()->Close();
1013                 __pEditTime->GetDateTimeBar()->Open();
1014         }
1015
1016         return true;
1017 }
1018
1019 bool
1020 _EditTimePresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1021 {
1022         if (&source != __pEditTime)
1023         {
1024                 return false;
1025         }
1026
1027         __selectedId = DATETIME_ID_NONE;
1028
1029         __pEditTime->Draw();
1030
1031         return true;
1032 }
1033
1034 bool
1035 _EditTimePresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1036 {
1037         if (&source != __pEditTime)
1038         {
1039                 return false;
1040         }
1041
1042         FloatPoint touchPoint = touchinfo.GetCurrentPosition();
1043
1044         if (GetBoxIdFromPosition(touchPoint) != __selectedId)
1045         {
1046                 __selectedId = DATETIME_ID_NONE;
1047         }
1048
1049         __pEditTime->Invalidate();
1050         return false;
1051 }
1052
1053 void
1054 _EditTimePresenter::OnTouchMoveHandled(const _Control& control)
1055 {
1056         __touchMoveHandled = true;
1057         __selectedId = DATETIME_ID_NONE;
1058         __pEditTime->Invalidate();
1059         return;
1060 }
1061
1062 void
1063 _EditTimePresenter::OnFontChanged(Font* pFont)
1064 {
1065         __pFont = pFont;
1066
1067         if (__pEditTime->GetDateTimeBar() != null)
1068         {
1069                 __pEditTime->GetDateTimeBar()->SetFont(*pFont);
1070         }
1071
1072         return;
1073 }
1074
1075 void
1076 _EditTimePresenter::OnFontInfoRequested(unsigned long& style, float& size)
1077 {
1078         style = FONT_STYLE_PLAIN;
1079         size = __timeFontSize;
1080
1081         return;
1082 }
1083
1084 result
1085 _EditTimePresenter::Initialize(void)
1086 {
1087         result r = E_SUCCESS;
1088
1089         float titleTimeMargin = 0;
1090         float timeHeight = 0;
1091         float editTimeHeight = 0;
1092
1093         GET_SHAPE_CONFIG(EDITTIME::TEXT_FONT_SIZE, __pEditTime->GetOrientation(), __titleFontSize);
1094         GET_SHAPE_CONFIG(EDITTIME::TIME_FONT_SIZE, __pEditTime->GetOrientation(), __timeFontSize);
1095         GET_SHAPE_CONFIG(EDITTIME::TITLE_TIME_MARGIN, __pEditTime->GetOrientation(), titleTimeMargin);
1096         GET_SHAPE_CONFIG(EDITTIME::TIME_HEIGHT, __pEditTime->GetOrientation(), timeHeight);
1097         GET_SHAPE_CONFIG(EDITTIME::HEIGHT, __pEditTime->GetOrientation(), editTimeHeight);
1098
1099         if (__pEditTime->GetBoundsF().height > editTimeHeight)
1100         {
1101                 editTimeHeight = __pEditTime->GetBoundsF().height;
1102         }
1103
1104         if (__title.IsEmpty() == false)
1105         {
1106                 SetTitleBounds();
1107                 if (!__isEditTimeInitialized)
1108                 {
1109                         r = InitializeTitleObject();
1110                         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
1111                 }
1112
1113                 __titleBounds.y = (editTimeHeight - (__titleBounds.height + titleTimeMargin + timeHeight)) / 2.0f;
1114                 __titleObject.SetBounds(__titleBounds);
1115         }
1116
1117         __pFont = __pEditTime->GetFallbackFont();
1118         r = GetLastResult();
1119         SysTryReturn(NID_UI_CTRL, __pFont != null, r, r, "[%s] Propagating.", GetErrorMessage(r));
1120
1121         if (!__isEditTimeInitialized)
1122         {
1123                 r = LoadResource();
1124                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1125
1126                 r = InitializeTextObject();
1127                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
1128         }
1129
1130         __isEditTimeInitialized = true;
1131
1132         UpdateTimeFormat();
1133         return r;
1134 }
1135
1136 void
1137 _EditTimePresenter::UpdateTimeFormat(void)
1138 {
1139         if (!__is24hoursSet)
1140         {
1141                 String key(L"http://tizen.org/setting/locale.time.format.24hour");
1142                 SettingInfo::GetValue(key , __24hours);
1143         }
1144
1145         return;
1146 }
1147
1148 void
1149 _EditTimePresenter::Animate(void)
1150 {
1151         SysAssertf((__pFont != null), "Font instance must not be null.");
1152
1153         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
1154
1155         result r = E_SUCCESS;
1156         FloatRectangle rect;
1157         String hourString;
1158         String minuteString;
1159         String newValue;
1160
1161         _DateTimeUtils dateTimeUtils;
1162         int hours = GetHour();
1163         if (!Is24HourNotationEnabled())
1164         {
1165                 hours = hours % 12;
1166
1167                 if (hours == DATETIME_HOUR_MIN)
1168                 {
1169                         hours = hours + DATETIME_HOUR_MAX_FOR_24NOTATION;
1170                 }
1171         }
1172         hourString.Format(10, L"%02d", hours);
1173         minuteString.Format(10, L"%02d", GetMinute());
1174
1175         if (GetLastSelectedId() == DATETIME_ID_HOUR)
1176         {
1177                 SysTryReturnVoidResult(NID_UI_CTRL, (__lastSelectedValue.Equals(hourString) == false), E_SUCCESS, "[E_SUCCESS] Hour string matched.");
1178
1179                 newValue = hourString;
1180                 rect = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
1181         }
1182         else if (GetLastSelectedId() == DATETIME_ID_MINUTE)
1183         {
1184                 SysTryReturnVoidResult(NID_UI_CTRL, (__lastSelectedValue.Equals(minuteString) == false), E_SUCCESS, "[E_SUCCESS] Minute string matched.");
1185
1186                 newValue = minuteString;
1187                 rect = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
1188         }
1189
1190         FloatDimension newTextDim;
1191         FloatDimension oldTextDim;
1192         FloatPoint textPoint;
1193         VisualElement* pNewVisualElement = null;
1194         VisualElement* pOldVisualElement = null;
1195         VisualElement* pEditTimeElement = null;
1196         VisualElementPropertyAnimation* pNewBoundsAnimation = null;
1197         VisualElementPropertyAnimation* pOldBoundsAnimation = null;
1198         Canvas *pCanvas = null;
1199
1200         __pFont->GetTextExtent(newValue, newValue.GetLength(), newTextDim);
1201         __pFont->GetTextExtent(__lastSelectedValue, __lastSelectedValue.GetLength(), oldTextDim);
1202
1203         if (newTextDim.width > oldTextDim.width)
1204         {
1205                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1206         }
1207         else
1208         {
1209                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1210         }
1211
1212         SysTryReturnVoidResult(NID_UI_CTRL, (rect.x + textPoint.x < __pEditTime->GetBounds().width), E_SUCCESS, "Rolling animation cann't be played.");
1213
1214         __isAnimating = true;
1215
1216         __pContentProvider = new (std::nothrow) VisualElement();
1217         SysTryReturnVoidResult(NID_UI_CTRL, (__pContentProvider != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1218
1219         r = __pContentProvider->Construct();
1220         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1221
1222         __pContentProvider->SetShowState(true);
1223         __pContentProvider->SetClipChildrenEnabled(true);
1224         __pContentProvider->SetImplicitAnimationEnabled(false);
1225
1226         pEditTimeElement = __pEditTime->GetVisualElement();
1227         r = GetLastResult();
1228         SysTryCatch(NID_UI_CTRL, (pEditTimeElement != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1229
1230         pNewVisualElement = new (std::nothrow) VisualElement();
1231         SysTryCatch(NID_UI_CTRL, (pNewVisualElement != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1232
1233         r = pNewVisualElement->Construct();
1234         if (r != E_SUCCESS)
1235         {
1236                 pNewVisualElement->Destroy();
1237         }
1238         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1239
1240         pNewVisualElement->SetShowState(true);
1241
1242         pOldVisualElement = new (std::nothrow) VisualElement();
1243         if (pOldVisualElement == null)
1244         {
1245                 pNewVisualElement->Destroy();
1246         }
1247         SysTryCatch(NID_UI_CTRL, (pOldVisualElement != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1248
1249         r = pOldVisualElement->Construct();
1250         if (r != E_SUCCESS)
1251         {
1252                 pNewVisualElement->Destroy();
1253                 pOldVisualElement->Destroy();
1254         }
1255         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1256
1257         pOldVisualElement->SetShowState(true);
1258
1259         if (newTextDim.width > oldTextDim.width)
1260         {
1261                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1262                 textPoint.y = (rect.height - newTextDim.height) / 2.0f;
1263                 __pContentProvider->SetBounds(FloatRectangle((rect.x + textPoint.x) * 1.0f, (rect.y + textPoint.y) * 1.0f, newTextDim.width * 1.0f, newTextDim.height * 1.0f));
1264                 pNewVisualElement->SetBounds(FloatRectangle(0.0f, newTextDim.height * 1.0f, newTextDim.width * 1.0f, newTextDim.height * 1.0f));
1265
1266                 rect.x = __pContentProvider->GetBounds().x;
1267                 rect.y = __pContentProvider->GetBounds().y;
1268                 rect.width = __pContentProvider->GetBounds().width;
1269                 rect.height = __pContentProvider->GetBounds().height;
1270
1271                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1272                 textPoint.y = (rect.height - oldTextDim.height) / 2.0f;
1273
1274                 pOldVisualElement->SetBounds(FloatRectangle(textPoint.x * 1.0f, 0.0f, oldTextDim.width * 1.0f, oldTextDim.height * 1.0f));
1275         }
1276         else
1277         {
1278                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1279                 textPoint.y = (rect.height - oldTextDim.height) / 2.0f;
1280                 __pContentProvider->SetBounds(FloatRectangle((rect.x + textPoint.x) * 1.0f, (rect.y + textPoint.y) * 1.0f, oldTextDim.width * 1.0f, oldTextDim.height * 1.0f));
1281                 pOldVisualElement->SetBounds(FloatRectangle(0.0f, 0.0f, oldTextDim.width * 1.0f, oldTextDim.height * 1.0f));
1282
1283                 rect.x = __pContentProvider->GetBounds().x;
1284                 rect.y = __pContentProvider->GetBounds().y;
1285                 rect.width = __pContentProvider->GetBounds().width;
1286                 rect.height = __pContentProvider->GetBounds().height;
1287
1288                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1289                 textPoint.y = (rect.height - newTextDim.height) / 2.0f;
1290
1291                 pNewVisualElement->SetBounds(FloatRectangle(textPoint.x * 1.0f, newTextDim.height * 1.0f, newTextDim.width * 1.0f, newTextDim.height * 1.0f));
1292         }
1293
1294         pCanvas = pEditTimeElement->GetCanvasN(rect);
1295         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1296         pCanvas->Clear();
1297         delete pCanvas;
1298
1299         pEditTimeElement->AttachChild(*__pContentProvider);
1300
1301         __pContentProvider->AttachChild(*pOldVisualElement);
1302         __pContentProvider->AttachChild(*pNewVisualElement);
1303
1304         pNewBoundsAnimation = new (std::nothrow) VisualElementPropertyAnimation();
1305         SysTryCatch(NID_UI_CTRL, (pNewBoundsAnimation != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1306
1307         pNewBoundsAnimation->SetDuration(300);
1308         pNewBoundsAnimation->SetPropertyName("bounds.position");
1309         pNewBoundsAnimation->SetStartValue(Variant(FloatPoint(pNewVisualElement->GetBounds().x * 1.0f, newTextDim.height * 1.0f)));
1310         pNewBoundsAnimation->SetEndValue(Variant(FloatPoint(pNewVisualElement->GetBounds().x * 1.0f, 0.0f)));
1311         pNewBoundsAnimation->SetVisualElementAnimationStatusEventListener(this);
1312
1313         pOldBoundsAnimation = new (std::nothrow) VisualElementPropertyAnimation();
1314         SysTryCatch(NID_UI_CTRL, (pOldBoundsAnimation != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1315
1316         pOldBoundsAnimation->SetDuration(300);
1317         pOldBoundsAnimation->SetPropertyName("bounds.position");
1318         pOldBoundsAnimation->SetStartValue(Variant(FloatPoint(pOldVisualElement->GetBounds().x * 1.0f, 0.0f)));
1319         pOldBoundsAnimation->SetEndValue(Variant(FloatPoint(pOldVisualElement->GetBounds().x * 1.0f, oldTextDim.height * -1.0f)));
1320         pOldBoundsAnimation->SetVisualElementAnimationStatusEventListener(this);
1321
1322         pCanvas = pOldVisualElement->GetCanvasN();
1323         r = GetLastResult();
1324         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1325
1326         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1327         pCanvas->Clear();
1328         pCanvas->SetFont(*__pFont);
1329         pCanvas->DrawText(FloatPoint(0.0f, 0.0f), __lastSelectedValue);
1330
1331         delete pCanvas;
1332         pCanvas = null;
1333
1334         pCanvas = pNewVisualElement->GetCanvasN();
1335         r = GetLastResult();
1336         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1337
1338         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1339         pCanvas->Clear();
1340         pCanvas->SetFont(*__pFont);
1341         pCanvas->DrawText(FloatPoint(0.0f, 0.0f), newValue);
1342
1343         delete pCanvas;
1344         pCanvas = null;
1345
1346         pOldVisualElement->SetImplicitAnimationEnabled(false);
1347         pOldVisualElement->AddAnimation(*pOldBoundsAnimation);
1348
1349         pNewVisualElement->SetImplicitAnimationEnabled(false);
1350         pNewVisualElement->AddAnimation(*pNewBoundsAnimation);
1351
1352         delete pOldBoundsAnimation;
1353         delete pNewBoundsAnimation;
1354
1355         return;
1356
1357 CATCH:
1358         __isAnimating = false;
1359         __pContentProvider->Destroy();
1360
1361         delete pNewBoundsAnimation;
1362         pNewBoundsAnimation = null;
1363
1364         delete pOldBoundsAnimation;
1365         pOldBoundsAnimation = null;
1366
1367         delete pCanvas;
1368         pCanvas = null;
1369
1370         return;
1371 }
1372
1373 void
1374 _EditTimePresenter::OnVisualElementAnimationFinished (const VisualElementAnimation &animation, const String &keyName, VisualElement &target, bool completedNormally)
1375 {
1376         result r = E_SUCCESS;
1377         __isAnimating = false;
1378
1379         VisualElement* pEditTimeElement = __pEditTime->GetVisualElement();
1380         r = GetLastResult();
1381         SysTryReturnVoidResult(NID_UI_CTRL, (pEditTimeElement != null), r, "[%s] Propagating.", GetErrorMessage(r));
1382
1383         pEditTimeElement->DetachChild(*__pContentProvider);
1384         __pContentProvider->Destroy();
1385
1386         Draw();
1387         return;
1388 }
1389
1390 }}} // Tizen::Ui::Controls