Merge "FloatingPoint changes for GroupContainer" 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         Color textColor;
705
706         _DateTimeId boxId = DATETIME_ID_NONE;
707         boxId = GetBoxIdFromPosition(FloatPoint(bounds.x + 1.0f, bounds.y));
708
709         if (!__pEditTime->IsEnabled())
710         {
711                 if (boxId == DATETIME_ID_AMPM)
712                 {
713                         GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_DISABLED, textColor);
714                 }
715                 else
716                 {
717                         GET_COLOR_CONFIG(EDITTIME::TEXT_DISABLED, textColor);
718                 }
719         }
720         else
721         {
722                 GET_COLOR_CONFIG(EDITTIME::TEXT_NORMAL, textColor);
723
724                 if (boxId == DATETIME_ID_AMPM)
725                 {
726                         GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_NORMAL, textColor);
727                 }
728
729                 if (boxId > -1 && boxId == __selectedId)
730                 {
731                         if (boxId == DATETIME_ID_AMPM)
732                         {
733                                 GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_PRESSED, textColor);
734                         }
735                         else
736                         {
737                                 GET_COLOR_CONFIG(EDITTIME::TEXT_PRESSED, textColor);
738                         }
739                 }
740         }
741
742         FloatRectangle drawAreaBounds(0.0f, 0.0f, 0.0f, 0.0f);
743         drawAreaBounds = bounds;
744
745         TextSimple* pSimpleText = null;
746         pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(text.GetPointer())), text.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
747         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
748
749         __textObject.RemoveAll();
750
751         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
752
753         __textObject.AppendElement(*pSimpleText);
754
755         if (boxId == DATETIME_ID_AMPM)
756         {
757                 (_FontImpl::GetInstance(*__pFont))->SetSize(textSize);
758                 __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
759         }
760         else
761         {
762                 __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
763         }
764
765         __textObject.SetForegroundColor(textColor, 0, __textObject.GetTextLength());
766         __textObject.SetBounds(drawAreaBounds);
767         __textObject.Draw(*_CanvasImpl::GetInstance(canvas));
768
769         return r;
770 }
771
772 _DateTimeId
773 _EditTimePresenter::GetBoxIdFromPosition(const FloatPoint& point) const
774 {
775         _DateTimeId displayBoxId = DATETIME_ID_NONE;
776
777         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
778         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
779         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
780
781         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
782         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
783
784         if (__24hours == false)
785         {
786                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
787         }
788
789         if (point.y < hourBounds.y || point.y > hourBounds.y + hourBounds.height)
790         {
791                 return displayBoxId;
792         }
793
794         if (hourBounds.Contains(point) == true)
795         {
796                 displayBoxId = DATETIME_ID_HOUR;
797         }
798         else if (minuteBounds.Contains(point) == true)
799         {
800                 displayBoxId = DATETIME_ID_MINUTE;
801         }
802         else if (ampmBounds.Contains(point) == true)
803         {
804                 displayBoxId = DATETIME_ID_AMPM;
805         }
806
807         return displayBoxId;
808 }
809
810 void
811 _EditTimePresenter::SetLastSelectedId(_DateTimeId boxId)
812 {
813         __lastSelectedId = boxId;
814         return;
815 }
816
817 _DateTimeId
818 _EditTimePresenter::GetLastSelectedId(void) const
819 {
820         return __lastSelectedId;
821 }
822
823 bool
824 _EditTimePresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
825 {
826         SysTryReturn(NID_UI_CTRL, IsTimePickerEnabled() == true, true, E_SYSTEM, "[E_SYSTEM] A system error has occurred. EditTime instance is disabled.");
827
828         if (&source != __pEditTime)
829         {
830                 return false;
831         }
832
833         __touchMoveHandled = false;
834
835         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
836         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
837         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
838
839         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
840         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
841
842         if (__24hours == false)
843         {
844                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
845         }
846
847         FloatPoint point = touchinfo.GetCurrentPosition();
848
849         _DateTimeId boxId = GetBoxIdFromPosition(point);
850
851         int minValue = -1;
852         int maxValue = -1;
853         int displayValue = -1;
854
855         if (boxId == DATETIME_ID_HOUR)
856         {
857                 if (__pEditTime->GetDateTimeBar() != null)
858                 {
859                         if (__24hours == false)
860                         {
861                                 if (GetHour() == 0)
862                                 {
863                                         minValue = DATETIME_HOUR_MIN + 1;
864                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
865                                         displayValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
866                                 }
867                                 else if (GetHour() > DATETIME_HOUR_MAX_FOR_24NOTATION)
868                                 {
869                                         minValue = DATETIME_HOUR_MIN + 1;
870                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
871                                         displayValue = GetHour() - DATETIME_HOUR_MAX_FOR_24NOTATION;
872                                 }
873                                 else
874                                 {
875                                         minValue = DATETIME_HOUR_MIN + 1;
876                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
877                                         displayValue = GetHour();
878                                 }
879                         }
880                         else
881                         {
882                                 minValue = DATETIME_HOUR_MIN;
883                                 maxValue = DATETIME_HOUR_MAX;
884                                 displayValue = GetHour();
885                         }
886
887                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
888                         {
889                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
890                         }
891
892                         __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
893                 }
894
895                 __bounds = hourBounds;
896         }
897         else if (boxId == DATETIME_ID_MINUTE)
898         {
899                 if (__pEditTime->GetDateTimeBar() != null)
900                 {
901                         minValue = DATETIME_MINUTE_MIN;
902                         maxValue = DATETIME_MINUTE_MAX;
903                         displayValue = GetMinute();
904
905                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
906                         {
907                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
908                         }
909
910                         __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
911                 }
912
913                 __bounds = minuteBounds;
914         }
915         else if (boxId == DATETIME_ID_AMPM)
916         {
917                 __selectedId = boxId;
918                 __bounds = ampmBounds;
919                 Draw();
920         }
921         else
922         {
923                 __selectedId = DATETIME_ID_NONE;
924                 return false;
925         }
926
927         __selectedId = boxId;
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 != __selectedId || boxId == DATETIME_ID_NONE)
956         {
957                 if (__pEditTime->GetDateTimeBar() != null && __pEditTime->GetDateTimeBar()->IsActivated())
958                 {
959                         __pEditTime->GetDateTimeBar()->SetVisibleState(false);
960                         __pEditTime->GetDateTimeBar()->Close();
961                 }
962
963                 Draw();
964
965                 __selectedId = DATETIME_ID_NONE;
966                 SetLastSelectedId(__selectedId);
967
968                 return true;
969         }
970
971         SetLastSelectedId(__selectedId);
972
973         __lastSelectedValue = "";
974         _DateTimeUtils dateTimeUtils;
975
976         if (GetLastSelectedId() == DATETIME_ID_HOUR)
977         {
978                 int hours = GetHour();
979
980                 if (!Is24HourNotationEnabled())
981                 {
982                         hours = hours % 12;
983
984                         if (hours == DATETIME_HOUR_MIN)
985                         {
986                                 hours = hours + DATETIME_HOUR_MAX_FOR_24NOTATION;
987                         }
988                 }
989                 __lastSelectedValue.Format(10, L"%02d", hours);
990                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
991         }
992         else if (GetLastSelectedId() == DATETIME_ID_MINUTE)
993         {
994                 __lastSelectedValue.Format(10, L"%02d", GetMinute());
995                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
996         }
997         else if (GetLastSelectedId() == DATETIME_ID_AMPM)
998         {
999                 SetAmEnabled(!GetAmEnabled());
1000                 __pEditTime->FireTimeChangeEvent(TIME_INTERNAL_CHANGE_SAVED);
1001                 __pEditTime->UpdateAccessibilityElement();
1002                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
1003
1004                 __selectedId = DATETIME_ID_NONE;
1005
1006                 if (__pEditTime->GetDateTimeBar() != null && __pEditTime->GetDateTimeBar()->IsActivated())
1007                 {
1008                         __pEditTime->GetDateTimeBar()->SetVisibleState(false);
1009                         __pEditTime->GetDateTimeBar()->Close();
1010                 }
1011
1012                 Draw();
1013
1014                 return true;
1015         }
1016
1017         Draw();
1018
1019         if ((__pEditTime->GetDateTimeBar() != null) && (boxId != DATETIME_ID_AMPM) && (GetLastSelectedId() != DATETIME_ID_NONE))
1020         {
1021                 FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
1022                 bounds = GetDisplayAreaBoundsFromHoursStyle(GetLastSelectedId());
1023                 FloatRectangle absoluteBounds(0.0f, 0.0f, 0.0f, 0.0f);
1024                 absoluteBounds = __pEditTime->GetAbsoluteBoundsF();
1025                 bounds.x += absoluteBounds.x;
1026
1027                 __pEditTime->GetDateTimeBar()->CalculateArrowBounds(bounds);
1028
1029                 if (__pEditTime->GetDateTimeBar()->IsActivated())
1030                 {
1031                         __pEditTime->GetDateTimeBar()->RefreshItems();
1032                 }
1033                 else
1034                 {
1035                         __pEditTime->GetDateTimeBar()->SetVisibleState(true);
1036                         __pEditTime->GetDateTimeBar()->Open();
1037                 }
1038         }
1039
1040         __selectedId = DATETIME_ID_NONE;
1041         return true;
1042 }
1043
1044 bool
1045 _EditTimePresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1046 {
1047         if (&source != __pEditTime)
1048         {
1049                 return false;
1050         }
1051
1052         __selectedId = DATETIME_ID_NONE;
1053
1054         return true;
1055 }
1056
1057 bool
1058 _EditTimePresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1059 {
1060         if (&source != __pEditTime)
1061         {
1062                 return false;
1063         }
1064
1065         FloatPoint touchPoint = touchinfo.GetCurrentPosition();
1066
1067         if (GetBoxIdFromPosition(touchPoint) != __selectedId)
1068         {
1069                 __selectedId = DATETIME_ID_NONE;
1070         }
1071
1072         return false;
1073 }
1074
1075 void
1076 _EditTimePresenter::OnTouchMoveHandled(const _Control& control)
1077 {
1078         __touchMoveHandled = true;
1079         __selectedId = DATETIME_ID_NONE;
1080
1081         return;
1082 }
1083
1084 void
1085 _EditTimePresenter::OnFontChanged(Font* pFont)
1086 {
1087         __pFont = pFont;
1088
1089         if (__pEditTime->GetDateTimeBar() != null)
1090         {
1091                 __pEditTime->GetDateTimeBar()->SetFont(*pFont);
1092         }
1093
1094         return;
1095 }
1096
1097 void
1098 _EditTimePresenter::OnFontInfoRequested(unsigned long& style, float& size)
1099 {
1100         style = FONT_STYLE_PLAIN;
1101         size = __timeFontSize;
1102
1103         return;
1104 }
1105
1106 result
1107 _EditTimePresenter::Initialize(void)
1108 {
1109         result r = E_SUCCESS;
1110
1111         float titleTimeMargin = 0;
1112         float timeHeight = 0;
1113         float editTimeHeight = 0;
1114
1115         GET_SHAPE_CONFIG(EDITTIME::TEXT_FONT_SIZE, __pEditTime->GetOrientation(), __titleFontSize);
1116         GET_SHAPE_CONFIG(EDITTIME::TIME_FONT_SIZE, __pEditTime->GetOrientation(), __timeFontSize);
1117         GET_SHAPE_CONFIG(EDITTIME::TITLE_TIME_MARGIN, __pEditTime->GetOrientation(), titleTimeMargin);
1118         GET_SHAPE_CONFIG(EDITTIME::TIME_HEIGHT, __pEditTime->GetOrientation(), timeHeight);
1119         GET_SHAPE_CONFIG(EDITTIME::HEIGHT, __pEditTime->GetOrientation(), editTimeHeight);
1120
1121         if (__pEditTime->GetBoundsF().height > editTimeHeight)
1122         {
1123                 editTimeHeight = __pEditTime->GetBoundsF().height;
1124         }
1125
1126         if (__title.IsEmpty() == false)
1127         {
1128                 SetTitleBounds();
1129                 if (!__isEditTimeInitialized)
1130                 {
1131                         r = InitializeTitleObject();
1132                         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
1133                 }
1134
1135                 __titleBounds.y = (editTimeHeight - (__titleBounds.height + titleTimeMargin + timeHeight)) / 2.0f;
1136                 __titleObject.SetBounds(__titleBounds);
1137         }
1138
1139         __pFont = __pEditTime->GetFallbackFont();
1140         r = GetLastResult();
1141         SysTryReturn(NID_UI_CTRL, __pFont != null, r, r, "[%s] Propagating.", GetErrorMessage(r));
1142
1143         if (!__isEditTimeInitialized)
1144         {
1145                 r = LoadResource();
1146                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1147
1148                 r = InitializeTextObject();
1149                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
1150         }
1151
1152         __isEditTimeInitialized = true;
1153
1154         UpdateTimeFormat();
1155         return r;
1156 }
1157
1158 void
1159 _EditTimePresenter::UpdateTimeFormat(void)
1160 {
1161         if (!__is24hoursSet)
1162         {
1163                 String key(L"http://tizen.org/setting/locale.time.format.24hour");
1164                 SettingInfo::GetValue(key , __24hours);
1165         }
1166
1167         return;
1168 }
1169
1170 void
1171 _EditTimePresenter::Animate(void)
1172 {
1173         SysAssertf((__pFont != null), "Font instance must not be null.");
1174
1175         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
1176
1177         result r = E_SUCCESS;
1178         FloatRectangle rect;
1179         String hourString;
1180         String minuteString;
1181         String newValue;
1182
1183         _DateTimeUtils dateTimeUtils;
1184         int hours = GetHour();
1185         if (!Is24HourNotationEnabled())
1186         {
1187                 hours = hours % 12;
1188
1189                 if (hours == DATETIME_HOUR_MIN)
1190                 {
1191                         hours = hours + DATETIME_HOUR_MAX_FOR_24NOTATION;
1192                 }
1193         }
1194         hourString.Format(10, L"%02d", hours);
1195         minuteString.Format(10, L"%02d", GetMinute());
1196
1197         if (GetLastSelectedId() == DATETIME_ID_HOUR)
1198         {
1199                 SysTryReturnVoidResult(NID_UI_CTRL, (__lastSelectedValue.Equals(hourString) == false), E_SUCCESS, "[E_SUCCESS] Hour string matched.");
1200
1201                 newValue = hourString;
1202                 rect = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
1203         }
1204         else if (GetLastSelectedId() == DATETIME_ID_MINUTE)
1205         {
1206                 SysTryReturnVoidResult(NID_UI_CTRL, (__lastSelectedValue.Equals(minuteString) == false), E_SUCCESS, "[E_SUCCESS] Minute string matched.");
1207
1208                 newValue = minuteString;
1209                 rect = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
1210         }
1211
1212         FloatDimension newTextDim;
1213         FloatDimension oldTextDim;
1214         FloatPoint textPoint;
1215         VisualElement* pNewVisualElement = null;
1216         VisualElement* pOldVisualElement = null;
1217         VisualElement* pEditTimeElement = null;
1218         VisualElementPropertyAnimation* pNewBoundsAnimation = null;
1219         VisualElementPropertyAnimation* pOldBoundsAnimation = null;
1220         Canvas *pCanvas = null;
1221
1222         __pFont->GetTextExtent(newValue, newValue.GetLength(), newTextDim);
1223         __pFont->GetTextExtent(__lastSelectedValue, __lastSelectedValue.GetLength(), oldTextDim);
1224
1225         if (newTextDim.width > oldTextDim.width)
1226         {
1227                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1228         }
1229         else
1230         {
1231                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1232         }
1233
1234         SysTryReturnVoidResult(NID_UI_CTRL, (rect.x + textPoint.x < __pEditTime->GetBounds().width), E_SUCCESS, "Rolling animation cann't be played.");
1235
1236         __isAnimating = true;
1237
1238         __pContentProvider = new (std::nothrow) VisualElement();
1239         SysTryReturnVoidResult(NID_UI_CTRL, (__pContentProvider != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1240
1241         r = __pContentProvider->Construct();
1242         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1243
1244         __pContentProvider->SetShowState(true);
1245         __pContentProvider->SetClipChildrenEnabled(true);
1246         __pContentProvider->SetImplicitAnimationEnabled(false);
1247
1248         pEditTimeElement = __pEditTime->GetVisualElement();
1249         r = GetLastResult();
1250         SysTryCatch(NID_UI_CTRL, (pEditTimeElement != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1251
1252         pNewVisualElement = new (std::nothrow) VisualElement();
1253         SysTryCatch(NID_UI_CTRL, (pNewVisualElement != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1254
1255         r = pNewVisualElement->Construct();
1256         if (r != E_SUCCESS)
1257         {
1258                 pNewVisualElement->Destroy();
1259         }
1260         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1261
1262         pNewVisualElement->SetShowState(true);
1263
1264         pOldVisualElement = new (std::nothrow) VisualElement();
1265         if (pOldVisualElement == null)
1266         {
1267                 pNewVisualElement->Destroy();
1268         }
1269         SysTryCatch(NID_UI_CTRL, (pOldVisualElement != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1270
1271         r = pOldVisualElement->Construct();
1272         if (r != E_SUCCESS)
1273         {
1274                 pNewVisualElement->Destroy();
1275                 pOldVisualElement->Destroy();
1276         }
1277         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1278
1279         pOldVisualElement->SetShowState(true);
1280
1281         if (newTextDim.width > oldTextDim.width)
1282         {
1283                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1284                 textPoint.y = (rect.height - newTextDim.height) / 2.0f;
1285                 __pContentProvider->SetBounds(FloatRectangle((rect.x + textPoint.x) * 1.0f, (rect.y + textPoint.y) * 1.0f, newTextDim.width * 1.0f, newTextDim.height * 1.0f));
1286                 pNewVisualElement->SetBounds(FloatRectangle(0.0f, newTextDim.height * 1.0f, newTextDim.width * 1.0f, newTextDim.height * 1.0f));
1287
1288                 rect.x = __pContentProvider->GetBounds().x;
1289                 rect.y = __pContentProvider->GetBounds().y;
1290                 rect.width = __pContentProvider->GetBounds().width;
1291                 rect.height = __pContentProvider->GetBounds().height;
1292
1293                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1294                 textPoint.y = (rect.height - oldTextDim.height) / 2.0f;
1295
1296                 pOldVisualElement->SetBounds(FloatRectangle(textPoint.x * 1.0f, 0.0f, oldTextDim.width * 1.0f, oldTextDim.height * 1.0f));
1297         }
1298         else
1299         {
1300                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1301                 textPoint.y = (rect.height - oldTextDim.height) / 2.0f;
1302                 __pContentProvider->SetBounds(FloatRectangle((rect.x + textPoint.x) * 1.0f, (rect.y + textPoint.y) * 1.0f, oldTextDim.width * 1.0f, oldTextDim.height * 1.0f));
1303                 pOldVisualElement->SetBounds(FloatRectangle(0.0f, 0.0f, oldTextDim.width * 1.0f, oldTextDim.height * 1.0f));
1304
1305                 rect.x = __pContentProvider->GetBounds().x;
1306                 rect.y = __pContentProvider->GetBounds().y;
1307                 rect.width = __pContentProvider->GetBounds().width;
1308                 rect.height = __pContentProvider->GetBounds().height;
1309
1310                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1311                 textPoint.y = (rect.height - newTextDim.height) / 2.0f;
1312
1313                 pNewVisualElement->SetBounds(FloatRectangle(textPoint.x * 1.0f, newTextDim.height * 1.0f, newTextDim.width * 1.0f, newTextDim.height * 1.0f));
1314         }
1315
1316         pCanvas = pEditTimeElement->GetCanvasN(rect);
1317         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1318         pCanvas->Clear();
1319         delete pCanvas;
1320
1321         pEditTimeElement->AttachChild(*__pContentProvider);
1322
1323         __pContentProvider->AttachChild(*pOldVisualElement);
1324         __pContentProvider->AttachChild(*pNewVisualElement);
1325
1326         pNewBoundsAnimation = new (std::nothrow) VisualElementPropertyAnimation();
1327         SysTryCatch(NID_UI_CTRL, (pNewBoundsAnimation != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1328
1329         pNewBoundsAnimation->SetDuration(300);
1330         pNewBoundsAnimation->SetPropertyName("bounds.position");
1331         pNewBoundsAnimation->SetStartValue(Variant(FloatPoint(pNewVisualElement->GetBounds().x * 1.0f, newTextDim.height * 1.0f)));
1332         pNewBoundsAnimation->SetEndValue(Variant(FloatPoint(pNewVisualElement->GetBounds().x * 1.0f, 0.0f)));
1333         pNewBoundsAnimation->SetVisualElementAnimationStatusEventListener(this);
1334
1335         pOldBoundsAnimation = new (std::nothrow) VisualElementPropertyAnimation();
1336         SysTryCatch(NID_UI_CTRL, (pOldBoundsAnimation != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1337
1338         pOldBoundsAnimation->SetDuration(300);
1339         pOldBoundsAnimation->SetPropertyName("bounds.position");
1340         pOldBoundsAnimation->SetStartValue(Variant(FloatPoint(pOldVisualElement->GetBounds().x * 1.0f, 0.0f)));
1341         pOldBoundsAnimation->SetEndValue(Variant(FloatPoint(pOldVisualElement->GetBounds().x * 1.0f, oldTextDim.height * -1.0f)));
1342         pOldBoundsAnimation->SetVisualElementAnimationStatusEventListener(this);
1343
1344         pCanvas = pOldVisualElement->GetCanvasN();
1345         r = GetLastResult();
1346         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1347
1348         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1349         pCanvas->Clear();
1350         pCanvas->SetFont(*__pFont);
1351         pCanvas->DrawText(FloatPoint(0.0f, 0.0f), __lastSelectedValue);
1352
1353         delete pCanvas;
1354         pCanvas = null;
1355
1356         pCanvas = pNewVisualElement->GetCanvasN();
1357         r = GetLastResult();
1358         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1359
1360         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1361         pCanvas->Clear();
1362         pCanvas->SetFont(*__pFont);
1363         pCanvas->DrawText(FloatPoint(0.0f, 0.0f), newValue);
1364
1365         delete pCanvas;
1366         pCanvas = null;
1367
1368         pOldVisualElement->SetImplicitAnimationEnabled(false);
1369         pOldVisualElement->AddAnimation(*pOldBoundsAnimation);
1370
1371         pNewVisualElement->SetImplicitAnimationEnabled(false);
1372         pNewVisualElement->AddAnimation(*pNewBoundsAnimation);
1373
1374         delete pOldBoundsAnimation;
1375         delete pNewBoundsAnimation;
1376
1377         return;
1378
1379 CATCH:
1380         __isAnimating = false;
1381         __pContentProvider->Destroy();
1382
1383         delete pNewBoundsAnimation;
1384         pNewBoundsAnimation = null;
1385
1386         delete pOldBoundsAnimation;
1387         pOldBoundsAnimation = null;
1388
1389         delete pCanvas;
1390         pCanvas = null;
1391
1392         return;
1393 }
1394
1395 void
1396 _EditTimePresenter::OnVisualElementAnimationFinished (const VisualElementAnimation &animation, const String &keyName, VisualElement &target, bool completedNormally)
1397 {
1398         result r = E_SUCCESS;
1399         __isAnimating = false;
1400
1401         VisualElement* pEditTimeElement = __pEditTime->GetVisualElement();
1402         r = GetLastResult();
1403         SysTryReturnVoidResult(NID_UI_CTRL, (pEditTimeElement != null), r, "[%s] Propagating.", GetErrorMessage(r));
1404
1405         pEditTimeElement->DetachChild(*__pContentProvider);
1406         __pContentProvider->Destroy();
1407
1408         Draw();
1409         return;
1410 }
1411
1412 }}} // Tizen::Ui::Controls