Merge "Unchecked GetCharacter func when index is over string length" into tizen_2.2
[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 Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
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 <FGrpColor.h>
25 #include <FUiAnimAnimationTransaction.h>
26 #include <FUiAnimVisualElementPropertyAnimation.h>
27 #include <FGrp_BitmapImpl.h>
28 #include <FGrp_TextTextObject.h>
29 #include <FGrp_TextTextSimple.h>
30 #include <FGrp_FontImpl.h>
31 #include "FUi_CoordinateSystemUtils.h"
32 #include "FUi_ResourceManager.h"
33 #include "FUiAnim_VisualElement.h"
34 #include "FUiCtrl_EditTimePresenter.h"
35 #include "FUiCtrl_EditTime.h"
36 #include "FUiCtrl_DateTimeModel.h"
37 #include "FUiCtrl_DateTimeUtils.h"
38
39
40 using namespace Tizen::Graphics;
41 using namespace Tizen::Base;
42 using namespace Tizen::Graphics::_Text;
43 using namespace Tizen::Ui::Animations;
44 using namespace Tizen::System;
45
46 namespace Tizen { namespace Ui { namespace Controls
47 {
48 _EditTimePresenter::_EditTimePresenter(const String& title)
49         : __pEditDateTimeModel(null)
50         , __pEditTime(null)
51         , __bounds(FloatRectangle())
52         , __titleBounds(FloatRectangle())
53         , __ampmString(String())
54         , __hourString(String())
55         , __minuteString(String())
56         , __title(title)
57         , __24hours(false)
58         , __is24hoursSet(false)
59         , __amEnable(true)
60         , __timePickerEnabled(true)
61         , __selectedId(DATETIME_ID_NONE)
62         , __lastSelectedId(DATETIME_ID_NONE)
63         , __focusId(DATETIME_ID_NONE)
64         , __touchMoveHandled(false)
65         , __pAmPmBgNormalColorReplacementBitmap(null)
66         , __pAmPmBgDisabledColorReplacementBitmap(null)
67         , __pAmPmBgPressedColorReplacementBitmap(null)
68         , __pAmPmBgHighlightedColorReplacementBitmap(null)
69         , __pAmPmBgEffectNomralBitmap(null)
70         , __pAmPmBgEffectPressedBitmap(null)
71         , __pAmPmBgEffectDisabledBitmap(null)
72         , __pColonColorReplacementBitmap(null)
73         , __pColonDisabledColorReplacementBitmap(null)
74         , __pContentBgNormalColorReplacementBitmap(null)
75         , __pContentBgDisabledColorReplacementBitmap(null)
76         , __pContentBgPressedColorReplacementBitmap(null)
77         , __pContentBgHighlightedColorReplacementBitmap(null)
78         , __pContentBgEffectNormalBitmap(null)
79         , __pContentBgEffectPressedBitmap(null)
80         , __pContentBgEffectDisabledBitmap(null)
81         , __pContentProvider(null)
82         , __textObject()
83         , __pFont(null)
84         , __titleObject()
85         , __amPmTextSize(0.0f)
86         , __titleFontSize(0.0f)
87         , __timeFontSize(0.0f)
88         , __isAnimating(false)
89         , __isEditTimeInitialized(false)
90         , __isEnterKeyPressed(false)
91         , __isFocused(false)
92         , __transactionId(0)
93 {
94 }
95
96 _EditTimePresenter::~_EditTimePresenter(void)
97 {
98         __textObject.RemoveAll();
99         __titleObject.RemoveAll();
100
101         delete __pEditDateTimeModel;
102         __pEditDateTimeModel = null;
103
104         delete __pAmPmBgNormalColorReplacementBitmap;
105         __pAmPmBgNormalColorReplacementBitmap = null;
106
107         delete __pAmPmBgDisabledColorReplacementBitmap;
108         __pAmPmBgDisabledColorReplacementBitmap = null;
109
110         delete __pAmPmBgPressedColorReplacementBitmap;
111         __pAmPmBgPressedColorReplacementBitmap = null;
112
113         delete __pAmPmBgHighlightedColorReplacementBitmap;
114         __pAmPmBgHighlightedColorReplacementBitmap = null;
115
116         delete __pAmPmBgEffectNomralBitmap;
117         __pAmPmBgEffectNomralBitmap = null;
118
119         delete __pAmPmBgEffectPressedBitmap;
120         __pAmPmBgEffectPressedBitmap = null;
121
122         delete __pAmPmBgEffectDisabledBitmap;
123         __pAmPmBgEffectDisabledBitmap = null;
124
125         delete __pColonColorReplacementBitmap;
126         __pColonColorReplacementBitmap = null;
127
128         delete __pColonDisabledColorReplacementBitmap;
129         __pColonDisabledColorReplacementBitmap = null;
130
131         delete __pContentBgNormalColorReplacementBitmap;
132         __pContentBgNormalColorReplacementBitmap = null;
133
134         delete __pContentBgDisabledColorReplacementBitmap;
135         __pContentBgDisabledColorReplacementBitmap = null;
136
137         delete __pContentBgPressedColorReplacementBitmap;
138         __pContentBgPressedColorReplacementBitmap = null;
139
140         delete __pContentBgHighlightedColorReplacementBitmap;
141         __pContentBgHighlightedColorReplacementBitmap = null;
142
143         delete __pContentBgEffectNormalBitmap;
144         __pContentBgEffectNormalBitmap = null;
145
146         delete __pContentBgEffectPressedBitmap;
147         __pContentBgEffectPressedBitmap = null;
148
149         delete __pContentBgEffectDisabledBitmap;
150         __pContentBgEffectDisabledBitmap = null;
151
152         if (__transactionId != 0)
153         {
154                 AnimationTransaction::Stop(__transactionId);
155         }
156
157         if (__pContentProvider != null)
158         {
159                 __pEditTime->GetVisualElement()->DetachChild(__pContentProvider);
160                 __pContentProvider->Destroy();
161                 __pContentProvider = null;
162         }
163 }
164
165 _EditTimePresenter*
166 _EditTimePresenter::CreateInstanceN(const _EditTime& editTime, const String& title)
167 {
168         _EditTimePresenter* pEditTimePresenter = new (std::nothrow) _EditTimePresenter(title);
169         SysTryReturn(NID_UI_CTRL, pEditTimePresenter, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
170
171         pEditTimePresenter->__pEditTime = const_cast <_EditTime*>(&editTime);
172
173         pEditTimePresenter->__pEditDateTimeModel = new (std::nothrow) _DateTimeModel;
174         SysTryCatch(NID_UI_CTRL, pEditTimePresenter->__pEditDateTimeModel, , E_OUT_OF_MEMORY,
175                         "[E_OUT_OF_MEMORY] Memory allocation failed.");
176
177         return pEditTimePresenter;
178
179 CATCH:
180         delete pEditTimePresenter;
181         return null;
182 }
183
184 DateTime
185 _EditTimePresenter::GetTime(void) const
186 {
187         DateTime time;
188         time.SetValue(DATETIME_YEAR_MIN, DATETIME_MONTH_MIN, DATETIME_DAY_MIN, GetHour(), GetMinute(), 0);
189
190         return time;
191 }
192
193 int
194 _EditTimePresenter::GetHour(void) const
195 {
196         return __pEditDateTimeModel->GetHour();
197 }
198
199 int
200 _EditTimePresenter::GetMinute(void) const
201 {
202         return __pEditDateTimeModel->GetMinute();
203 }
204
205 void
206 _EditTimePresenter::SetTime(const DateTime& time)
207 {
208         __pEditDateTimeModel->SetDateTime(time);
209 }
210
211 void
212 _EditTimePresenter::SetCurrentTime(void)
213 {
214         __pEditDateTimeModel->SetCurrentDateTime();
215         return;
216 }
217
218 result
219 _EditTimePresenter::SetHour(int hour)
220 {
221         return __pEditDateTimeModel->SetHour(hour);
222 }
223
224 result
225 _EditTimePresenter::SetMinute(int minute)
226 {
227         return __pEditDateTimeModel->SetMinute(minute);
228 }
229
230 void
231 _EditTimePresenter::SetTimePickerEnabled(bool enable)
232 {
233         __timePickerEnabled = enable;
234         return;
235 }
236
237 bool
238 _EditTimePresenter::IsTimePickerEnabled(void) const
239 {
240         return __timePickerEnabled;
241 }
242
243 void
244 _EditTimePresenter::Set24HourNotationEnabled(bool enable)
245 {
246         __24hours = enable;
247         __is24hoursSet = true;
248         return;
249 }
250
251 bool
252 _EditTimePresenter::Is24HourNotationEnabled(void) const
253 {
254         return __24hours;
255 }
256
257 void
258 _EditTimePresenter::SetTimeConversion(void)
259 {
260         int hour = GetHour();
261         int minute = GetMinute();
262
263         if (!__24hours)
264         {
265                 int max = DATETIME_HOUR_MAX_FOR_24NOTATION;
266
267                 if (hour > max)
268                 {
269                         __hourString.Format(10, L"%02d", hour - max);
270                 }
271                 else if (hour == DATETIME_HOUR_MIN)
272                 {
273                         __hourString.Format(10, L"%02d", hour + DATETIME_HOUR_MAX_FOR_24NOTATION);
274                 }
275                 else
276                 {
277                         __hourString.Format(10, L"%02d", hour);
278                 }
279
280                 __minuteString.Format(10, L"%02d", minute);
281         }
282         else
283         {
284                 __hourString.Format(10, L"%02d", hour);
285                 __minuteString.Format(10, L"%02d", minute);
286         }
287
288         return;
289 }
290
291 void
292 _EditTimePresenter::SetAmEnabled(bool amEnable)
293 {
294         String textAm;
295         String textPm;
296
297         _DateTimeUtils dateTimeUtils;
298         dateTimeUtils.GetAmPm(textAm, AM_TYPE);
299         dateTimeUtils.GetAmPm(textPm, PM_TYPE);
300
301         __amEnable = amEnable;
302         int hour = GetHour();
303
304         if (__amEnable)
305         {
306                 __ampmString = textAm;
307                 if (hour >= DATETIME_HOUR_MAX_FOR_24NOTATION)
308                 {
309                         SetHour(hour - DATETIME_HOUR_MAX_FOR_24NOTATION);
310                 }
311         }
312         else
313         {
314                 __ampmString = textPm;
315                 if (hour < DATETIME_HOUR_MAX_FOR_24NOTATION)
316                 {
317                         SetHour(hour + DATETIME_HOUR_MAX_FOR_24NOTATION);
318                 }
319         }
320
321         return;
322 }
323
324 bool
325 _EditTimePresenter::GetAmEnabled(void) const
326 {
327         return __amEnable;
328 }
329
330 FloatRectangle
331 _EditTimePresenter::GetDisplayAreaBoundsFromHoursStyle(_DateTimeId displayBoxId) const
332 {
333         SysTryReturn(NID_UI_CTRL, displayBoxId >= DATETIME_ID_HOUR && displayBoxId <= DATETIME_ID_AMPM, FloatRectangle(),
334                         E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] displayBoxId is out of range.");
335
336         FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
337
338         float editTimeHeight = 0.0f;
339         float colonWidth = 0.0f;
340         float timeAmPmMargin = 0.0f;
341         float colonMargin = 0.0f;
342         float timeElementWidth = 0.0f;
343         float amPmHeight = 0.0f;
344         float timeHeight = 0.0f;
345         float titleTimeMargin = 0.0f;
346         float leftMargin = 0.0f;
347
348         GET_SHAPE_CONFIG(EDITTIME::HEIGHT, __pEditTime->GetOrientation(), editTimeHeight);
349         GET_SHAPE_CONFIG(EDITTIME::COLON_WIDTH, __pEditTime->GetOrientation(), colonWidth);
350         GET_SHAPE_CONFIG(EDITTIME::TIME_AMPM_MARGIN, __pEditTime->GetOrientation(), timeAmPmMargin);
351         GET_SHAPE_CONFIG(EDITTIME::COLON_MARGIN, __pEditTime->GetOrientation(), colonMargin);
352         GET_SHAPE_CONFIG(EDITTIME::AMPM_HEIGHT, __pEditTime->GetOrientation(), amPmHeight);
353         GET_SHAPE_CONFIG(EDITTIME::TITLE_TIME_MARGIN, __pEditTime->GetOrientation(), titleTimeMargin);
354         GET_SHAPE_CONFIG(EDITTIME::TIME_HEIGHT, __pEditTime->GetOrientation(), timeHeight);
355
356         GET_SHAPE_CONFIG(EDITTIME::TIME_TEXT_LEFT_MARGIN, __pEditTime->GetOrientation(), leftMargin);
357
358         if (__pEditTime->GetBoundsF().height > editTimeHeight)
359         {
360                 editTimeHeight = __pEditTime->GetBoundsF().height;
361         }
362
363         bounds.y = (editTimeHeight - timeHeight) / 2.0f;
364
365         if (!__title.IsEmpty())
366         {
367                 if (displayBoxId == DATETIME_ID_AMPM)
368                 {
369                         bounds.y = __titleBounds.y + __titleBounds.height;
370                 }
371                 else
372                 {
373                         bounds.y = __titleBounds.y + __titleBounds.height + titleTimeMargin;
374                 }
375         }
376
377         bounds.x = leftMargin;
378         bounds.height = timeHeight;
379
380         timeElementWidth = GetTimeElementWidth();
381
382         if (displayBoxId == DATETIME_ID_HOUR)
383         {
384                 bounds.width = timeElementWidth;
385         }
386         else if (displayBoxId == DATETIME_ID_MINUTE)
387         {
388                 bounds.x = bounds.x + timeElementWidth + colonWidth + (2.0f * colonMargin);
389                 bounds.width = timeElementWidth;
390         }
391         else if (displayBoxId == DATETIME_ID_AMPM)
392         {
393                 bounds.x = leftMargin + (2.0f * timeElementWidth) + colonWidth + (2.0f * colonMargin) + timeAmPmMargin;
394
395                 if (__title.IsEmpty())
396                 {
397                         bounds.y = (editTimeHeight - amPmHeight) / 2.0f;
398                 }
399
400                 GET_SHAPE_CONFIG(EDITTIME::AMPM_WIDTH, __pEditTime->GetOrientation(), bounds.width);
401                 bounds.height = amPmHeight;
402         }
403
404         return bounds;
405 }
406
407 float
408 _EditTimePresenter::GetTextWidth(_DateTimeId boxId) const
409 {
410         result r = E_SUCCESS;
411         FloatDimension dim;
412         TextObject dateObject;
413         String hourString;
414         String minuteString;
415
416         hourString.Format(10, L"%02d", GetHour());
417         minuteString.Format(10, L"%02d", GetMinute());
418
419         r = dateObject.Construct();
420         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
421
422         TextSimple* pSimpleText = null;
423
424         if (boxId == DATETIME_ID_HOUR)
425         {
426                 pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(hourString.GetPointer())), hourString.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
427         }
428         else if (boxId == DATETIME_ID_MINUTE)
429         {
430                 pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(minuteString.GetPointer())), minuteString.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
431         }
432
433         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), dim.width, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
434
435         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
436
437         pSimpleText->SetTextShadowEnabled(true);
438         pSimpleText->SetTextShadowOffset(FloatPoint(0.0f, -1.0f));
439
440         dateObject.AppendElement(*pSimpleText);
441         dateObject.SetFont(__pFont, 0, dateObject.GetTextLength());
442         dim = dateObject.GetTextExtentF(0, dateObject.GetTextLength());
443
444         dateObject.RemoveAll();
445         return dim.width;
446 }
447
448 void
449 _EditTimePresenter::SetTitleBounds(void)
450 {
451         GET_SHAPE_CONFIG(EDITTIME::TITLE_TEXT_LEFT_MARGIN, __pEditTime->GetOrientation(), __titleBounds.x);
452         GET_SHAPE_CONFIG(EDITTIME::TITLE_HEIGHT, __pEditTime->GetOrientation(), __titleBounds.height);
453
454         __titleBounds.width = __pEditTime->GetBoundsF().width - __titleBounds.x;
455         return;
456 }
457
458 FloatRectangle
459 _EditTimePresenter::GetTitleBounds(void) const
460 {
461         return __titleBounds;
462 }
463
464 result
465 _EditTimePresenter::LoadResource(void)
466 {
467         result r = E_SUCCESS;
468
469         Color buttonNormalBgColor;
470         Color buttonDisabledBgColor;
471         Color buttonPressedColor;
472         Color buttonHighlightedColor;
473         Color contentNormalBgColor;
474         Color contentDisabledBgColor;
475         Color contentPressedColor;
476         Color contentHighlightedColor;
477         Color colonTextColor;
478         Color colonTextDisabledColor;
479
480
481         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_NORMAL, buttonNormalBgColor);
482         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_PRESSED, buttonPressedColor);
483         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_DISABLED, buttonDisabledBgColor);
484         GET_COLOR_CONFIG(EDITTIME::BUTTON_BG_HIGHLIGHTED, buttonHighlightedColor);
485
486         GET_COLOR_CONFIG(EDITTIME::CONTENT_BG_NORMAL, contentNormalBgColor);
487         GET_COLOR_CONFIG(EDITTIME::CONTENT_BG_DISABLED, contentDisabledBgColor);
488         GET_COLOR_CONFIG(EDITTIME::CONTENT_BG_PRESSED, contentPressedColor);
489         GET_COLOR_CONFIG(EDITTIME::CONTENT_BG_HIGHLIGHTED, contentHighlightedColor);
490
491         GET_COLOR_CONFIG(EDITTIME::TEXT_NORMAL, colonTextColor);
492         GET_COLOR_CONFIG(EDITTIME::TEXT_DISABLED, colonTextDisabledColor);
493
494         GET_SHAPE_CONFIG(EDITTIME::AMPM_FONT_SIZE, __pEditTime->GetOrientation(), __amPmTextSize);
495
496         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::COLON_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, colonTextColor, __pColonColorReplacementBitmap);
497         SysTryReturnResult(NID_UI_CTRL, (r == E_SUCCESS), r, "[%s] Propagating.", GetErrorMessage(r));
498
499         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::COLON_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, colonTextDisabledColor, __pColonDisabledColorReplacementBitmap);
500         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
501
502
503         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, buttonNormalBgColor, __pAmPmBgNormalColorReplacementBitmap);
504         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
505
506         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_DISABLED, BITMAP_PIXEL_FORMAT_ARGB8888, buttonDisabledBgColor, __pAmPmBgDisabledColorReplacementBitmap);
507         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
508
509         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, buttonPressedColor, __pAmPmBgPressedColorReplacementBitmap);
510         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
511
512         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_HIGHLIGHTED, BITMAP_PIXEL_FORMAT_ARGB8888, buttonHighlightedColor, __pAmPmBgHighlightedColorReplacementBitmap);
513         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
514
515         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, contentNormalBgColor, __pContentBgNormalColorReplacementBitmap);
516         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
517
518         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, contentPressedColor, __pContentBgPressedColorReplacementBitmap);
519         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
520
521         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_DISABLED, BITMAP_PIXEL_FORMAT_ARGB8888, contentDisabledBgColor, __pContentBgDisabledColorReplacementBitmap);
522         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
523
524         r = GET_REPLACED_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_HIGHLIGHTED, BITMAP_PIXEL_FORMAT_ARGB8888, contentHighlightedColor, __pContentBgHighlightedColorReplacementBitmap);
525         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
526
527         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_EFFECT_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pAmPmBgEffectNomralBitmap);
528         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
529
530         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_EFFECT_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, __pAmPmBgEffectPressedBitmap);
531         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
532
533         r = GET_BITMAP_CONFIG_N(EDITTIME::BUTTON_BG_EFFECT_DISABLED, BITMAP_PIXEL_FORMAT_ARGB8888, __pAmPmBgEffectDisabledBitmap);
534         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
535
536         r = GET_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_EFFECT_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pContentBgEffectNormalBitmap);
537         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
538
539         r = GET_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_EFFECT_PRESSED, BITMAP_PIXEL_FORMAT_ARGB8888, __pContentBgEffectPressedBitmap);
540         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
541
542         r = GET_BITMAP_CONFIG_N(EDITTIME::CONTENT_BG_EFFECT_DISABLED, BITMAP_PIXEL_FORMAT_ARGB8888, __pContentBgEffectDisabledBitmap);
543         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
544
545         return r;
546
547 CATCH:
548
549         delete __pColonColorReplacementBitmap;
550         __pColonColorReplacementBitmap = null;
551
552         delete __pColonDisabledColorReplacementBitmap;
553         __pColonDisabledColorReplacementBitmap = null;
554
555         delete __pAmPmBgNormalColorReplacementBitmap;
556         __pAmPmBgNormalColorReplacementBitmap = null;
557
558         delete __pAmPmBgPressedColorReplacementBitmap;
559         __pAmPmBgPressedColorReplacementBitmap = null;
560
561         delete __pAmPmBgDisabledColorReplacementBitmap;
562         __pAmPmBgDisabledColorReplacementBitmap = null;
563
564         delete __pAmPmBgHighlightedColorReplacementBitmap;
565         __pAmPmBgHighlightedColorReplacementBitmap = null;
566
567         delete __pContentBgNormalColorReplacementBitmap;
568         __pContentBgNormalColorReplacementBitmap = null;
569
570         delete __pContentBgPressedColorReplacementBitmap;
571         __pContentBgPressedColorReplacementBitmap = null;
572
573         delete __pContentBgDisabledColorReplacementBitmap;
574         __pContentBgDisabledColorReplacementBitmap = null;
575
576         delete __pContentBgHighlightedColorReplacementBitmap;
577         __pContentBgHighlightedColorReplacementBitmap = null;
578
579         delete __pAmPmBgEffectNomralBitmap;
580         __pAmPmBgEffectNomralBitmap = null;
581
582         delete __pAmPmBgEffectPressedBitmap;
583         __pAmPmBgEffectPressedBitmap = null;
584
585         delete __pAmPmBgEffectDisabledBitmap;
586         __pAmPmBgEffectDisabledBitmap = null;
587
588         delete __pContentBgEffectNormalBitmap;
589         __pContentBgEffectNormalBitmap = null;
590
591         delete __pContentBgEffectPressedBitmap;
592         __pContentBgEffectPressedBitmap = null;
593
594         delete __pContentBgEffectDisabledBitmap;
595         __pContentBgEffectDisabledBitmap = null;
596
597         delete __pColonColorReplacementBitmap;
598         __pColonColorReplacementBitmap = null;
599
600         delete __pColonDisabledColorReplacementBitmap;
601         __pColonDisabledColorReplacementBitmap = null;
602
603         return r;
604 }
605
606 result
607 _EditTimePresenter::DrawResourceBitmap(Canvas& canvas, const FloatRectangle& bounds, Bitmap* pBitmap, bool isCustomBitmap)
608 {
609         result r = E_SUCCESS;
610
611         if (pBitmap == null)
612         {
613                 return r;
614         }
615
616         if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBitmap))
617         {
618                 r = canvas.DrawNinePatchedBitmap(bounds, *pBitmap);
619                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
620         }
621         else
622         {
623                 if (isCustomBitmap)
624                 {
625                         Canvas *pContentCanvas = __pEditTime->GetCanvasN(bounds);
626                         SysTryReturnResult(NID_UI_CTRL, (pContentCanvas != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
627
628                         FloatPoint position;
629
630                         position.x = (bounds.width - pBitmap->GetWidthF()) / 2;
631                         position.y = (bounds.height - pBitmap->GetHeightF()) / 2;
632                         r = pContentCanvas->DrawBitmap(position, *pBitmap);
633                         delete pContentCanvas;
634                 }
635                 else
636                 {
637                         r = canvas.DrawBitmap(FloatPoint(bounds.x, bounds.y), *pBitmap);
638                 }
639
640                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
641         }
642
643         return r;
644 }
645
646 float
647 _EditTimePresenter::GetTimeElementWidth(void) const
648 {
649         FloatRectangle bounds;
650         FloatDimension minSize;
651         bounds = __pEditTime->GetBoundsF();
652
653         float timeElementWidth = 0.0f;
654         float timeElementMinWidth = 0.0f;
655         float editTimeWidth = 0.0f;
656
657         GET_SHAPE_CONFIG(EDITTIME::HOUR_MINUTE_WIDTH, __pEditTime->GetOrientation(), timeElementWidth);
658         GET_SHAPE_CONFIG(EDITTIME::HOUR_MINUTE_MIN_WIDTH, __pEditTime->GetOrientation(), timeElementMinWidth);
659         GET_SHAPE_CONFIG(EDITTIME::WIDTH, __pEditTime->GetOrientation(), editTimeWidth);
660
661         GET_DIMENSION_CONFIG(EDITTIME::MIN_SIZE, __pEditTime->GetOrientation(), minSize);
662
663         if (bounds.width >= editTimeWidth)
664         {
665                 return timeElementWidth;
666         }
667
668         if (bounds.width <= minSize.width)
669         {
670                 timeElementWidth = timeElementMinWidth;
671         }
672         else if (bounds.width < editTimeWidth && bounds.width > minSize.width)
673         {
674                 timeElementWidth = timeElementWidth -
675                                 ((timeElementWidth - timeElementMinWidth) / (editTimeWidth - minSize.width)) * (editTimeWidth - bounds.width);
676         }
677
678         return timeElementWidth;
679 }
680
681 result
682 _EditTimePresenter::InitializeTitleObject(void)
683 {
684         result r = E_SUCCESS;
685
686         Color titleNormalColor;
687
688         GET_COLOR_CONFIG(EDITTIME::TITLE_TEXT_NORMAL, titleNormalColor);
689
690         r = __titleObject.Construct();
691         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
692
693         TextSimple* pSimpleText = null;
694
695         pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(__title.GetPointer())), __title.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
696         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
697
698         __titleObject.AppendElement(*pSimpleText);
699
700         __titleObject.SetForegroundColor(titleNormalColor, 0, __titleObject.GetTextLength());
701         __titleObject.SetFont(__pFont, 0, __titleObject.GetTextLength());
702         __titleObject.SetAlignment(TEXT_OBJECT_ALIGNMENT_LEFT | TEXT_OBJECT_ALIGNMENT_MIDDLE);
703         __titleObject.SetWrap(TEXT_OBJECT_WRAP_TYPE_NONE);
704         __titleObject.SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
705         __titleObject.SetTextObjectEllipsisType(TEXT_OBJECT_ELLIPSIS_TYPE_TAIL);
706
707         return r;
708 }
709
710 result
711 _EditTimePresenter::InitializeTextObject(void)
712 {
713         result r = E_SUCCESS;
714
715         r = __textObject.Construct();
716         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
717
718         TextSimple* pSimpleText = new (std::nothrow)TextSimple(null, 0, TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
719         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
720                         "[E_OUT_OF_MEMORY] Memory allocation failed.");
721
722         pSimpleText->SetTextShadowEnabled(true);
723         pSimpleText->SetTextShadowOffset(FloatPoint(0.0f, -1.0f));
724
725         __textObject.AppendElement(*pSimpleText);
726
727         __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
728         __textObject.SetAlignment(TEXT_OBJECT_ALIGNMENT_CENTER | TEXT_OBJECT_ALIGNMENT_MIDDLE);
729         __textObject.SetWrap(TEXT_OBJECT_WRAP_TYPE_NONE);
730         __textObject.SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
731
732         return r;
733 }
734
735 result
736 _EditTimePresenter::Draw(void)
737 {
738         result r = E_SUCCESS;
739
740         if (__isAnimating)
741         {
742                 return E_SUCCESS;
743         }
744
745         Canvas* pCanvas = __pEditTime->GetCanvasN();
746         r = GetLastResult();
747         SysTryReturnResult(NID_UI_CTRL, (pCanvas != null), r, "Failed to get canvas.");
748
749         FloatRectangle colonBounds(0.0f, 0.0f, 0.0f, 0.0f);
750
751         float colonMargin = 0.0f;
752
753         Dimension textArea;
754
755         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
756         pCanvas->Clear();
757
758         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
759         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
760         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
761         bool isCustomBitmap = false;
762         Bitmap* pReplacementBitmap = null;
763         Bitmap* pEffectBitmap = null;
764
765         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
766         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
767
768         if (!__24hours)
769         {
770                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
771
772                 if (!__pEditTime->IsEnabled())
773                 {
774                         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::BUTTON_BG_DISABLED);
775                         pReplacementBitmap = __pAmPmBgDisabledColorReplacementBitmap;
776                         pEffectBitmap = __pAmPmBgEffectDisabledBitmap;
777                 }
778                 else if (__selectedId != DATETIME_ID_AMPM)
779                 {
780                         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::BUTTON_BG_NORMAL);
781                         pReplacementBitmap = __pAmPmBgNormalColorReplacementBitmap;
782                         pEffectBitmap = __pAmPmBgEffectNomralBitmap;
783                 }
784                 else
785                 {
786                         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::BUTTON_BG_PRESSED);
787                         pReplacementBitmap = __pAmPmBgPressedColorReplacementBitmap;
788                         pEffectBitmap = __pAmPmBgEffectPressedBitmap;
789                 }
790         }
791
792         if (GetHour() >= DATETIME_HOUR_MAX_FOR_24NOTATION)
793         {
794                 SetAmEnabled(false);
795         }
796         else
797         {
798                 SetAmEnabled(true);
799         }
800
801         SetTimeConversion();
802
803         GET_SHAPE_CONFIG(EDITTIME::COLON_WIDTH, __pEditTime->GetOrientation(), colonBounds.width);
804         GET_SHAPE_CONFIG(EDITTIME::COLON_MARGIN, __pEditTime->GetOrientation(), colonMargin);
805         GET_SHAPE_CONFIG(EDITTIME::AMPM_HEIGHT, __pEditTime->GetOrientation(), colonBounds.height);
806
807         colonBounds.x = hourBounds.x + hourBounds.width + colonMargin;
808         colonBounds.y = hourBounds.y + (hourBounds.height - colonBounds.height) / 2.0f;
809
810         if (!__title.IsEmpty())
811         {
812                 r = DrawTitle(*pCanvas);
813                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
814         }
815
816         r = DrawText(*pCanvas, hourBounds, __hourString, DATETIME_ID_HOUR);
817         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
818
819         r = DrawText(*pCanvas, minuteBounds, __minuteString, DATETIME_ID_MINUTE);
820         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
821
822         r = DrawColon(*pCanvas, colonBounds);
823         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
824
825         if (!__24hours)
826         {
827                 r = DrawResourceBitmap(*pCanvas, ampmBounds, pReplacementBitmap, isCustomBitmap);
828                 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
829
830                 if (!isCustomBitmap)
831                 {
832                         r = DrawResourceBitmap(*pCanvas, ampmBounds, pEffectBitmap);
833                         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
834                 }
835
836                 r = DrawText(*pCanvas, ampmBounds, __ampmString, DATETIME_ID_AMPM, __amPmTextSize);
837                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
838         }
839
840 CATCH:
841         delete pCanvas;
842         return r;
843 }
844
845 result
846 _EditTimePresenter::DrawFocus(void)
847 {
848         FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
849
850         Canvas* pContentCanvas = null;
851         Canvas* pCanvas = __pEditTime->GetCanvasN();
852         SysTryReturnResult(NID_UI_CTRL, (pCanvas != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
853
854         if (__focusId == DATETIME_ID_HOUR)
855         {
856                 bounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
857         }
858         else if (__focusId == DATETIME_ID_MINUTE)
859         {
860                 bounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
861         }
862         else if (__focusId == DATETIME_ID_AMPM)
863         {
864                 bounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
865         }
866         result r = E_SUCCESS;
867
868         if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*__pContentBgHighlightedColorReplacementBitmap))
869         {
870                 r = pCanvas->DrawNinePatchedBitmap(bounds, *__pContentBgHighlightedColorReplacementBitmap);
871                 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
872         }
873         else
874         {
875                 pContentCanvas = __pEditTime->GetCanvasN(bounds);
876                 SysTryCatch(NID_UI_CTRL, (pContentCanvas != null), , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
877
878                 bounds.x = (bounds.width - __pContentBgHighlightedColorReplacementBitmap->GetWidthF()) / 2;
879                 bounds.y = (bounds.height - __pContentBgHighlightedColorReplacementBitmap->GetHeightF()) / 2;
880
881                 r = pContentCanvas->DrawBitmap(FloatPoint(bounds.x, bounds.y), *__pContentBgHighlightedColorReplacementBitmap);
882                 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
883                 delete pContentCanvas;
884         }
885
886         delete pCanvas;
887         return r;
888
889 CATCH:
890         delete pCanvas;
891         delete pContentCanvas;
892         return r;
893 }
894
895 result
896 _EditTimePresenter::DrawColon(Canvas& canvas, const FloatRectangle& bounds)
897 {
898         result r = E_SUCCESS;
899
900         if (!__pEditTime->IsEnabled())
901         {
902                 r = DrawResourceBitmap(canvas, bounds, __pColonDisabledColorReplacementBitmap);
903         }
904         else
905         {
906                 r = DrawResourceBitmap(canvas, bounds, __pColonColorReplacementBitmap);
907         }
908
909         return r;
910 }
911
912 result
913 _EditTimePresenter::DrawTitle(Canvas& canvas)
914 {
915         if (!__pEditTime->IsEnabled())
916         {
917                 Color titleDisabledColor;
918                 GET_COLOR_CONFIG(EDITTIME::TITLE_TEXT_DISABLED, titleDisabledColor);
919                 __titleObject.SetForegroundColor(titleDisabledColor, 0, __titleObject.GetTextLength());
920         }
921
922         (_FontImpl::GetInstance(*__pFont))->SetSize(__titleFontSize);
923         (_FontImpl::GetInstance(*__pFont))->SetStyle(FONT_STYLE_BOLD);
924         __titleObject.SetFont(__pFont, 0, __titleObject.GetTextLength());
925
926         __titleObject.Draw(*_CanvasImpl::GetInstance(canvas));
927
928         return E_SUCCESS;
929 }
930
931 result
932 _EditTimePresenter::DrawContentBitmap(Canvas& canvas, const FloatRectangle& bounds, _DateTimeId boxId)
933 {
934         result r = E_SUCCESS;
935
936         bool isCustomBitmap = false;
937         Bitmap* pReplacementBitmap = null;
938         Bitmap* pEffectBitmap = null;
939
940         if (!__pEditTime->IsEnabled())
941         {
942                 isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::CONTENT_BG_DISABLED);
943                 pReplacementBitmap = __pContentBgDisabledColorReplacementBitmap;
944                 pEffectBitmap = __pContentBgEffectDisabledBitmap;
945         }
946         else if (GetLastSelectedId() != boxId)
947         {
948                 isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::CONTENT_BG_NORMAL);
949                 pReplacementBitmap = __pContentBgNormalColorReplacementBitmap;
950                 pEffectBitmap = __pContentBgEffectNormalBitmap;
951         }
952         else
953         {
954                 isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::CONTENT_BG_PRESSED);
955                 pReplacementBitmap = __pContentBgPressedColorReplacementBitmap;
956                 pEffectBitmap = __pContentBgEffectPressedBitmap;
957         }
958
959         r = DrawResourceBitmap(canvas, bounds, pReplacementBitmap, isCustomBitmap);
960         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
961
962         if (!isCustomBitmap)
963         {
964                 r = DrawResourceBitmap(canvas, bounds, pEffectBitmap);
965                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
966         }
967
968         return r;
969 }
970
971 result
972 _EditTimePresenter::DrawText(Canvas& canvas, const FloatRectangle& bounds, const String& text, _DateTimeId boxId, float textSize)
973 {
974         result r = E_SUCCESS;
975
976         Color textColor;
977         (_FontImpl::GetInstance(*__pFont))->SetStyle(FONT_STYLE_PLAIN);
978
979         if (!__pEditTime->IsEnabled())
980         {
981                 if (boxId == DATETIME_ID_AMPM)
982                 {
983                         GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_DISABLED, textColor);
984                 }
985                 else
986                 {
987                         GET_COLOR_CONFIG(EDITTIME::TEXT_DISABLED, textColor);
988                 }
989         }
990         else
991         {
992                 GET_COLOR_CONFIG(EDITTIME::TEXT_NORMAL, textColor);
993
994                 if (boxId == DATETIME_ID_AMPM)
995                 {
996                         if (boxId == __selectedId)
997                         {
998                                 GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_PRESSED, textColor);
999                         }
1000                         else
1001                         {
1002                                 GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_NORMAL, textColor);
1003                         }
1004                 }
1005
1006                 else if (boxId > -1 && boxId == GetLastSelectedId())
1007                 {
1008                         GET_COLOR_CONFIG(EDITTIME::TEXT_PRESSED, textColor);
1009                         (_FontImpl::GetInstance(*__pFont))->SetStyle(FONT_STYLE_BOLD);
1010                 }
1011         }
1012
1013         if (boxId != DATETIME_ID_AMPM)
1014         {
1015                 DrawContentBitmap(canvas, bounds, boxId);
1016         }
1017
1018         FloatRectangle drawAreaBounds(0.0f, 0.0f, 0.0f, 0.0f);
1019         drawAreaBounds = bounds;
1020
1021         TextSimple* pSimpleText = null;
1022         pSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(text.GetPointer())), text.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
1023         SysTryReturn(NID_UI_CTRL, (pSimpleText != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1024
1025         __textObject.RemoveAll();
1026
1027         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
1028
1029         pSimpleText->SetTextShadowEnabled(true);
1030         pSimpleText->SetTextShadowOffset(FloatPoint(0.0f, -1.0f));
1031
1032         __textObject.AppendElement(*pSimpleText);
1033
1034         if (boxId == DATETIME_ID_AMPM)
1035         {
1036                 (_FontImpl::GetInstance(*__pFont))->SetSize(textSize);
1037         }
1038         if (__isFocused && __focusId == boxId)
1039         {
1040                 if (boxId == DATETIME_ID_AMPM)
1041                 {
1042                         GET_COLOR_CONFIG(EDITTIME::BUTTON_TEXT_HIGHLIGHTED, textColor);
1043                 }
1044                 else
1045                 {
1046                         GET_COLOR_CONFIG(EDITTIME::TEXT_HIGHLIGHTED, textColor);
1047                 }
1048
1049                 DrawFocus();
1050         }
1051
1052         __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
1053
1054         __textObject.SetForegroundColor(textColor, 0, __textObject.GetTextLength());
1055         __textObject.SetBounds(drawAreaBounds);
1056         __textObject.Draw(*_CanvasImpl::GetInstance(canvas));
1057
1058         return r;
1059 }
1060
1061 _DateTimeId
1062 _EditTimePresenter::GetBoxIdFromPosition(const FloatPoint& point) const
1063 {
1064         _DateTimeId displayBoxId = DATETIME_ID_NONE;
1065
1066         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
1067         FloatRectangle hoursBounds(0.0f, 0.0f, 0.0f, 0.0f);
1068         FloatRectangle minutesBounds(0.0f, 0.0f, 0.0f, 0.0f);
1069
1070         if (!__24hours)
1071         {
1072                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
1073         }
1074
1075         hoursBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
1076         minutesBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
1077
1078         if (point.y < hoursBounds.y || point.y > hoursBounds.y + hoursBounds.height)
1079         {
1080                 return displayBoxId;
1081         }
1082
1083         if (hoursBounds.Contains(point))
1084         {
1085                 displayBoxId = DATETIME_ID_HOUR;
1086         }
1087         else if (minutesBounds.Contains(point))
1088         {
1089                 displayBoxId = DATETIME_ID_MINUTE;
1090         }
1091         else if (ampmBounds.Contains(point))
1092         {
1093                 displayBoxId = DATETIME_ID_AMPM;
1094         }
1095
1096         return displayBoxId;
1097 }
1098
1099 void
1100 _EditTimePresenter::SetLastSelectedId(_DateTimeId boxId)
1101 {
1102         __lastSelectedId = boxId;
1103         return;
1104 }
1105
1106 _DateTimeId
1107 _EditTimePresenter::GetLastSelectedId(void) const
1108 {
1109         return __lastSelectedId;
1110 }
1111
1112 void
1113 _EditTimePresenter::SetFocusedElement()
1114 {
1115         if (__isEnterKeyPressed)
1116         {
1117                 __isEnterKeyPressed = false;
1118                 __isFocused = true;
1119         }
1120         if (__focusId == DATETIME_ID_NONE || __focusId == DATETIME_ID_AMPM)
1121         {
1122                 __focusId = DATETIME_ID_HOUR;
1123         }
1124
1125         return;
1126 }
1127
1128 void
1129 _EditTimePresenter::SetFocusState(bool isFocused)
1130 {
1131         __isFocused = isFocused;
1132         return;
1133 }
1134
1135 bool
1136 _EditTimePresenter::OnFocusLost(const _Control &source)
1137 {
1138         if (!__isEnterKeyPressed || __focusId == DATETIME_ID_AMPM)
1139         {
1140                 __focusId = DATETIME_ID_NONE;
1141         }
1142         __isFocused = false;
1143         __pEditTime->Invalidate();
1144         return true;
1145 }
1146
1147 void
1148 _EditTimePresenter::OnFocusModeStateChanged(void)
1149 {
1150         __isFocused = false;
1151         __focusId = DATETIME_ID_NONE;
1152         __isEnterKeyPressed = false;
1153         __selectedId = DATETIME_ID_NONE;
1154         __pEditTime->Invalidate();
1155         return;
1156 }
1157
1158 bool
1159 _EditTimePresenter::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
1160 {
1161         if (!__isFocused)
1162         {
1163                 return false;
1164         }
1165         _KeyCode keyCode = keyInfo.GetKeyCode();
1166
1167         switch (keyCode)
1168         {
1169                 case _KEY_RIGHT:
1170                 {
1171                         __isEnterKeyPressed = false;
1172                         if (__focusId == DATETIME_ID_HOUR)
1173                         {
1174                                 __focusId = DATETIME_ID_MINUTE;
1175                         }
1176                         else if (__focusId == DATETIME_ID_MINUTE)
1177                         {
1178                                 if (!Is24HourNotationEnabled())
1179                                 {
1180                                         __focusId = DATETIME_ID_AMPM;
1181                                 }
1182                         }
1183                         else if (__focusId == DATETIME_ID_AMPM)
1184                         {
1185                                 return false;
1186                         }
1187
1188                         __pEditTime->Invalidate();
1189                         break;
1190                 }
1191                 case _KEY_LEFT:
1192                 {
1193                         __isEnterKeyPressed = false;
1194                         if (__focusId == DATETIME_ID_MINUTE)
1195                         {
1196                                 __focusId = DATETIME_ID_HOUR;
1197                         }
1198                         else if (__focusId == DATETIME_ID_AMPM)
1199                         {
1200                                 __focusId = DATETIME_ID_MINUTE;
1201                         }
1202                         else if (__focusId == DATETIME_ID_HOUR)
1203                         {
1204                                 return false;
1205                         }
1206                         __pEditTime->Invalidate();
1207                         break;
1208                 }
1209                 case _KEY_ENTER:
1210                 {
1211                         if (__focusId == DATETIME_ID_AMPM)
1212                         {
1213                                 __selectedId = DATETIME_ID_AMPM;
1214                                 __pEditTime->Invalidate();
1215                         }
1216                         else
1217                         {
1218                                 return false;
1219                         }
1220                         break;
1221                 }
1222
1223                 default:
1224                 {
1225                         return false;
1226                 }
1227         }
1228         return true;
1229 }
1230
1231 bool
1232 _EditTimePresenter::OnKeyReleased(const _Control& source, const _KeyCode& keyCode)
1233 {
1234         if (!__isFocused)
1235         {
1236                 return false;
1237         }
1238
1239         if (__isAnimating)
1240         {
1241                 VisualElement* pEditTimeElement = __pEditTime->GetVisualElement();
1242                 result r = GetLastResult();
1243                 SysTryReturn(NID_UI_CTRL, (pEditTimeElement != null), false, r, "[%s] Propagating.", GetErrorMessage(r));
1244                 pEditTimeElement->RemoveAllAnimations();
1245         }
1246
1247         int minValue = -1;
1248         int maxValue = -1;
1249         int displayValue = -1;
1250
1251         _DateTimeId boxId = DATETIME_ID_HOUR;
1252
1253         switch (keyCode)
1254         {
1255                 case _KEY_ENTER:
1256                 {
1257                         __isEnterKeyPressed = true;
1258                         if (__focusId == DATETIME_ID_HOUR)
1259                         {
1260                                 boxId = DATETIME_ID_HOUR;
1261                                 if (__pEditTime->GetDateTimeBar() != null)
1262                                 {
1263                                         if (!Is24HourNotationEnabled())
1264                                         {
1265                                                 if (GetHour() == 0)
1266                                                 {
1267                                                         minValue = DATETIME_HOUR_MIN + 1;
1268                                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1269                                                         displayValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1270                                                 }
1271                                                 else if (GetHour() > DATETIME_HOUR_MAX_FOR_24NOTATION)
1272                                                 {
1273                                                         minValue = DATETIME_HOUR_MIN + 1;
1274                                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1275                                                         displayValue = __pEditTime->GetHour() - DATETIME_HOUR_MAX_FOR_24NOTATION;
1276                                                 }
1277                                                 else
1278                                                 {
1279                                                         minValue = DATETIME_HOUR_MIN + 1;
1280                                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1281                                                         displayValue = __pEditTime->GetHour();
1282                                                 }
1283                                         }
1284                                         else
1285                                         {
1286                                                 minValue = DATETIME_HOUR_MIN;
1287                                                 maxValue = DATETIME_HOUR_MAX;
1288                                                 displayValue = __pEditTime->GetHour();
1289                                         }
1290
1291                                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
1292                                         {
1293                                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
1294                                         }
1295                                 }
1296                         }
1297                         else if (__focusId == DATETIME_ID_MINUTE)
1298                         {
1299                                 if (__pEditTime->GetDateTimeBar() != null)
1300                                 {
1301                                         minValue = DATETIME_MINUTE_MIN;
1302                                         maxValue = DATETIME_MINUTE_MAX;
1303                                         displayValue = __pEditTime->GetMinute();
1304
1305                                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
1306                                         {
1307                                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
1308                                         }
1309                                 }
1310                                 boxId = DATETIME_ID_MINUTE;
1311                         }
1312                         else if (__focusId == DATETIME_ID_AMPM)
1313                         {
1314                                 SetAmEnabled(!GetAmEnabled());
1315                                 __pEditTime->FireTimeChangeEvent(TIME_INTERNAL_CHANGE_SAVED);
1316                                 boxId = DATETIME_ID_AMPM;
1317                                 __selectedId = DATETIME_ID_NONE;
1318
1319                                 __pEditTime->Invalidate();
1320                         }
1321
1322                         if ((__pEditTime->GetDateTimeBar() != null) && (boxId != DATETIME_ID_AMPM))
1323                         {
1324                                 FloatRectangle absoluteBounds = __pEditTime->GetAbsoluteBoundsF();
1325
1326                                 FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
1327                                 bounds = GetDisplayAreaBoundsFromHoursStyle(boxId);
1328                                 bounds.x += absoluteBounds.x;
1329
1330                                 __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
1331                                 __pEditTime->GetDateTimeBar()->CalculateArrowBounds(bounds);
1332                                 __pEditTime->GetDateTimeBar()->SetVisibleState(true);
1333                                 __pEditTime->GetDateTimeBar()->Open();
1334                                 UpdateLastSelectedValue(boxId, false);
1335                         }
1336                         break;
1337                 }
1338
1339                 default:
1340                 {
1341                         return false;
1342                 }
1343         }
1344         return true;
1345 }
1346
1347 bool
1348 _EditTimePresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1349 {
1350         SysTryReturn(NID_UI_CTRL, IsTimePickerEnabled() == true, true, E_SYSTEM, "[E_SYSTEM] A system error has occurred. EditTime instance is disabled.");
1351
1352         if (&source != __pEditTime)
1353         {
1354                 return false;
1355         }
1356
1357         __touchMoveHandled = false;
1358
1359         FloatRectangle hourBounds(0.0f, 0.0f, 0.0f, 0.0f);
1360         FloatRectangle minuteBounds(0.0f, 0.0f, 0.0f, 0.0f);
1361         FloatRectangle ampmBounds(0.0f, 0.0f, 0.0f, 0.0f);
1362
1363         hourBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
1364         minuteBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
1365
1366         if (!__24hours)
1367         {
1368                 ampmBounds = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_AMPM);
1369         }
1370
1371         FloatPoint point = touchinfo.GetCurrentPosition();
1372
1373         _DateTimeId boxId = GetBoxIdFromPosition(point);
1374
1375         int minValue = -1;
1376         int maxValue = -1;
1377         int displayValue = -1;
1378
1379         if (boxId == DATETIME_ID_HOUR)
1380         {
1381                 if (__pEditTime->GetDateTimeBar() != null)
1382                 {
1383                         if (!__24hours)
1384                         {
1385                                 if (GetHour() == 0)
1386                                 {
1387                                         minValue = DATETIME_HOUR_MIN + 1;
1388                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1389                                         displayValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1390                                 }
1391                                 else if (GetHour() > DATETIME_HOUR_MAX_FOR_24NOTATION)
1392                                 {
1393                                         minValue = DATETIME_HOUR_MIN + 1;
1394                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1395                                         displayValue = GetHour() - DATETIME_HOUR_MAX_FOR_24NOTATION;
1396                                 }
1397                                 else
1398                                 {
1399                                         minValue = DATETIME_HOUR_MIN + 1;
1400                                         maxValue = DATETIME_HOUR_MAX_FOR_24NOTATION;
1401                                         displayValue = GetHour();
1402                                 }
1403                         }
1404                         else
1405                         {
1406                                 minValue = DATETIME_HOUR_MIN;
1407                                 maxValue = DATETIME_HOUR_MAX;
1408                                 displayValue = GetHour();
1409                         }
1410
1411                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
1412                         {
1413                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
1414                         }
1415
1416                         __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
1417                 }
1418
1419                 __bounds = hourBounds;
1420         }
1421         else if (boxId == DATETIME_ID_MINUTE)
1422         {
1423                 if (__pEditTime->GetDateTimeBar() != null)
1424                 {
1425                         minValue = DATETIME_MINUTE_MIN;
1426                         maxValue = DATETIME_MINUTE_MAX;
1427                         displayValue = GetMinute();
1428
1429                         if (__pEditTime->GetDateTimeBar()->GetItemCount() > 0)
1430                         {
1431                                 __pEditTime->GetDateTimeBar()->RemoveAllItems();
1432                         }
1433
1434                         __pEditTime->GetDateTimeBar()->SetInitialValue(minValue, maxValue, displayValue, boxId);
1435                 }
1436
1437                 __bounds = minuteBounds;
1438         }
1439         else if (boxId == DATETIME_ID_AMPM)
1440         {
1441                 __selectedId = boxId;
1442                 __bounds = ampmBounds;
1443                 Draw();
1444         }
1445         else
1446         {
1447                 __selectedId = DATETIME_ID_NONE;
1448                 return false;
1449         }
1450
1451         __selectedId = boxId;
1452
1453         return true;
1454 }
1455
1456 bool
1457 _EditTimePresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1458 {
1459         SysTryReturn(NID_UI_CTRL, IsTimePickerEnabled() == true, true, E_SYSTEM, "[E_SYSTEM] A system error has occurred. EditTime instance is disabled.");
1460
1461         if (&source != __pEditTime)
1462         {
1463                 return false;
1464         }
1465
1466         FloatRectangle bounds = __pEditTime->GetBoundsF();
1467
1468         FloatPoint startPoint(0.0f, 0.0f);
1469
1470         float titleHeight = 0;
1471         GET_SHAPE_CONFIG(EDITTIME::TITLE_HEIGHT, __pEditTime->GetOrientation(), titleHeight);
1472
1473         __bounds = FloatRectangle(0.0f, titleHeight, bounds.width, bounds.height);
1474
1475         FloatPoint point = touchinfo.GetCurrentPosition();
1476
1477         _DateTimeId boxId = GetBoxIdFromPosition(point);
1478
1479         if ((boxId == GetLastSelectedId() && boxId != DATETIME_ID_AMPM) || boxId != __selectedId || boxId == DATETIME_ID_NONE)
1480         {
1481                 if (__pEditTime->GetDateTimeBar() != null && __pEditTime->GetDateTimeBar()->IsActivated())
1482                 {
1483                         __pEditTime->GetDateTimeBar()->CloseDateTimeBar();
1484                 }
1485
1486                 __selectedId = DATETIME_ID_NONE;
1487                 SetLastSelectedId(__selectedId);
1488
1489                 Draw();
1490
1491                 return true;
1492         }
1493         UpdateLastSelectedValue(__selectedId, true);
1494         if (GetLastSelectedId() == DATETIME_ID_AMPM)
1495         {
1496                 return true;
1497         }
1498
1499         Draw();
1500
1501         if ((__pEditTime->GetDateTimeBar() != null) && (boxId != DATETIME_ID_AMPM) && (GetLastSelectedId() != DATETIME_ID_NONE))
1502         {
1503                 __pEditTime->SetFocused(true);
1504
1505                 FloatRectangle bounds(0.0f, 0.0f, 0.0f, 0.0f);
1506                 bounds = GetDisplayAreaBoundsFromHoursStyle(GetLastSelectedId());
1507                 FloatRectangle absoluteBounds(0.0f, 0.0f, 0.0f, 0.0f);
1508                 absoluteBounds = __pEditTime->GetAbsoluteBoundsF();
1509                 bounds.x += absoluteBounds.x;
1510
1511                 __pEditTime->GetDateTimeBar()->CalculateArrowBounds(bounds);
1512
1513                 if (__pEditTime->GetDateTimeBar()->IsActivated())
1514                 {
1515                         __pEditTime->GetDateTimeBar()->RemoveAllAnimations();
1516                         __pEditTime->GetDateTimeBar()->Close();
1517                         __pEditTime->GetDateTimeBar()->SetVisibleState(true);
1518                         __pEditTime->GetDateTimeBar()->Open();
1519                 }
1520                 else
1521                 {
1522                         __pEditTime->GetDateTimeBar()->SetVisibleState(true);
1523                         __pEditTime->GetDateTimeBar()->Open();
1524                 }
1525         }
1526
1527         __selectedId = DATETIME_ID_NONE;
1528         return true;
1529 }
1530
1531 void
1532 _EditTimePresenter::UpdateLastSelectedValue(_DateTimeId boxId, bool isTouchPressed)
1533 {
1534         __selectedId = boxId;
1535         SetLastSelectedId(boxId);
1536
1537         __lastSelectedValue = "";
1538
1539         if (GetLastSelectedId() == DATETIME_ID_HOUR)
1540         {
1541                 int hours = GetHour();
1542
1543                 if (!Is24HourNotationEnabled())
1544                 {
1545                         hours = hours % 12;
1546
1547                         if (hours == DATETIME_HOUR_MIN)
1548                         {
1549                                 hours = hours + DATETIME_HOUR_MAX_FOR_24NOTATION;
1550                         }
1551                 }
1552                 __lastSelectedValue.Format(10, L"%02d", hours);
1553                 if (isTouchPressed)
1554                 {
1555                         PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP, __pEditTime);
1556                 }
1557         }
1558         else if (GetLastSelectedId() == DATETIME_ID_MINUTE)
1559         {
1560                 __lastSelectedValue.Format(10, L"%02d", GetMinute());
1561                 if (isTouchPressed)
1562                 {
1563                         PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP, __pEditTime);
1564                 }
1565         }
1566         else if (GetLastSelectedId() == DATETIME_ID_AMPM)
1567         {
1568                 SetAmEnabled(!GetAmEnabled());
1569                 __pEditTime->FireTimeChangeEvent(TIME_INTERNAL_CHANGE_SAVED);
1570                 if (isTouchPressed)
1571                 {
1572                         __pEditTime->UpdateAccessibilityElement();
1573                         PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP, __pEditTime);
1574                 }
1575                 __selectedId = DATETIME_ID_NONE;
1576
1577                 if (__pEditTime->GetDateTimeBar() != null && __pEditTime->GetDateTimeBar()->IsActivated())
1578                 {
1579                         __pEditTime->GetDateTimeBar()->SetVisibleState(false);
1580                         __pEditTime->GetDateTimeBar()->Close();
1581                 }
1582         }
1583
1584         __selectedId = DATETIME_ID_NONE;
1585         __pEditTime->Invalidate();
1586         return;
1587 }
1588
1589 bool
1590 _EditTimePresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1591 {
1592         if (&source != __pEditTime)
1593         {
1594                 return false;
1595         }
1596
1597         __selectedId = DATETIME_ID_NONE;
1598
1599         return true;
1600 }
1601
1602 bool
1603 _EditTimePresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1604 {
1605         if (&source != __pEditTime)
1606         {
1607                 return false;
1608         }
1609
1610         if (__pEditTime->GetDateTimeBar() != null && __pEditTime->GetDateTimeBar()->IsActivated())
1611         {
1612                 return true;
1613         }
1614
1615         return false;
1616 }
1617
1618 void
1619 _EditTimePresenter::OnTouchMoveHandled(const _Control& control)
1620 {
1621         __touchMoveHandled = true;
1622         __selectedId = DATETIME_ID_NONE;
1623
1624         return;
1625 }
1626
1627 void
1628 _EditTimePresenter::OnFontChanged(Font* pFont)
1629 {
1630         __pFont = pFont;
1631
1632         if (__pEditTime->GetDateTimeBar() != null)
1633         {
1634                 __pEditTime->GetDateTimeBar()->SetFont(*pFont);
1635         }
1636
1637         return;
1638 }
1639
1640 void
1641 _EditTimePresenter::OnFontInfoRequested(unsigned long& style, float& size)
1642 {
1643         style = FONT_STYLE_PLAIN;
1644         size = __timeFontSize;
1645
1646         return;
1647 }
1648
1649 result
1650 _EditTimePresenter::Initialize(void)
1651 {
1652         result r = E_SUCCESS;
1653
1654         float titleTimeMargin = 0;
1655         float timeHeight = 0;
1656         float editTimeHeight = 0;
1657
1658         GET_SHAPE_CONFIG(EDITTIME::TEXT_FONT_SIZE, __pEditTime->GetOrientation(), __titleFontSize);
1659         GET_SHAPE_CONFIG(EDITTIME::TIME_FONT_SIZE, __pEditTime->GetOrientation(), __timeFontSize);
1660         GET_SHAPE_CONFIG(EDITTIME::TITLE_TIME_MARGIN, __pEditTime->GetOrientation(), titleTimeMargin);
1661         GET_SHAPE_CONFIG(EDITTIME::TIME_HEIGHT, __pEditTime->GetOrientation(), timeHeight);
1662         GET_SHAPE_CONFIG(EDITTIME::HEIGHT, __pEditTime->GetOrientation(), editTimeHeight);
1663
1664         if (__pEditTime->GetBoundsF().height > editTimeHeight)
1665         {
1666                 editTimeHeight = __pEditTime->GetBoundsF().height;
1667         }
1668
1669         if (!__title.IsEmpty())
1670         {
1671                 SetTitleBounds();
1672                 if (!__isEditTimeInitialized)
1673                 {
1674                         r = InitializeTitleObject();
1675                         SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
1676                 }
1677
1678                 __titleBounds.y = (editTimeHeight - (__titleBounds.height + titleTimeMargin + timeHeight)) / 2.0f;
1679                 __titleObject.SetBounds(__titleBounds);
1680         }
1681
1682         __pFont = __pEditTime->GetFallbackFont();
1683         r = GetLastResult();
1684         SysTryReturn(NID_UI_CTRL, __pFont != null, r, r, "[%s] Propagating.", GetErrorMessage(r));
1685
1686         if (!__isEditTimeInitialized)
1687         {
1688                 r = LoadResource();
1689                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1690
1691                 r = InitializeTextObject();
1692                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
1693         }
1694
1695         __isEditTimeInitialized = true;
1696
1697         UpdateTimeFormat();
1698         return r;
1699 }
1700
1701 void
1702 _EditTimePresenter::UpdateTimeFormat(void)
1703 {
1704         if (!__is24hoursSet)
1705         {
1706                 String key(L"http://tizen.org/setting/locale.time.format.24hour");
1707                 SettingInfo::GetValue(key , __24hours);
1708         }
1709
1710         return;
1711 }
1712
1713 void
1714 _EditTimePresenter::Animate(void)
1715 {
1716         SysTryReturnVoidResult(NID_UI_CTRL, !__isAnimating, E_SUCCESS, "Rolling animation is in progress.");
1717         SysAssertf((__pFont != null), "Font instance must not be null.");
1718
1719         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
1720
1721         result r = E_SUCCESS;
1722         FloatRectangle rect;
1723         String hourString;
1724         String minuteString;
1725         String newValue;
1726         TextSimple* pOldSimpleText = null;
1727         TextSimple* pNewSimpleText = null;
1728         bool isCustomBitmap = false;
1729
1730         _DateTimeUtils dateTimeUtils;
1731         int hours = GetHour();
1732         if (!Is24HourNotationEnabled())
1733         {
1734                 hours = hours % 12;
1735
1736                 if (hours == DATETIME_HOUR_MIN)
1737                 {
1738                         hours = hours + DATETIME_HOUR_MAX_FOR_24NOTATION;
1739                 }
1740         }
1741         hourString.Format(10, L"%02d", hours);
1742         minuteString.Format(10, L"%02d", GetMinute());
1743
1744         if (GetLastSelectedId() == DATETIME_ID_HOUR)
1745         {
1746                 SysTryReturnVoidResult(NID_UI_CTRL, (__lastSelectedValue.Equals(hourString) == false), E_SUCCESS, "[E_SUCCESS] Hour string matched.");
1747
1748                 newValue = hourString;
1749                 rect = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_HOUR);
1750         }
1751         else if (GetLastSelectedId() == DATETIME_ID_MINUTE)
1752         {
1753                 SysTryReturnVoidResult(NID_UI_CTRL, (__lastSelectedValue.Equals(minuteString) == false), E_SUCCESS, "[E_SUCCESS] Minute string matched.");
1754
1755                 newValue = minuteString;
1756                 rect = GetDisplayAreaBoundsFromHoursStyle(DATETIME_ID_MINUTE);
1757         }
1758
1759         FloatDimension newTextDim;
1760         FloatDimension oldTextDim;
1761         FloatPoint textPoint;
1762         VisualElement* pNewVisualElement = null;
1763         VisualElement* pOldVisualElement = null;
1764         VisualElement* pEditTimeElement = null;
1765         VisualElementPropertyAnimation* pNewBoundsAnimation = null;
1766         VisualElementPropertyAnimation* pOldBoundsAnimation = null;
1767         Canvas* pCanvas = null;
1768         Canvas* pContentCanvas = null;
1769         Color contentBgColor;
1770         Color textNormalColor;
1771         Color textPressedColor;
1772         float contentTextMargin;
1773
1774         GET_COLOR_CONFIG(EDITTIME::CONTENT_BG_PRESSED, contentBgColor);
1775         GET_COLOR_CONFIG(EDITTIME::TEXT_PRESSED, textPressedColor);
1776         GET_SHAPE_CONFIG(EDITDATE::CONTENT_TEXT_MARGIN, __pEditTime->GetOrientation(), contentTextMargin);
1777
1778         __pFont->GetTextExtent(newValue, newValue.GetLength(), newTextDim);
1779         __pFont->GetTextExtent(__lastSelectedValue, __lastSelectedValue.GetLength(), oldTextDim);
1780
1781         if (newTextDim.width > oldTextDim.width)
1782         {
1783                 textPoint.x = (rect.width - newTextDim.width) / 2.0f;
1784         }
1785         else
1786         {
1787                 textPoint.x = (rect.width - oldTextDim.width) / 2.0f;
1788         }
1789
1790         SysTryReturnVoidResult(NID_UI_CTRL, (rect.x + textPoint.x < __pEditTime->GetBounds().width), E_SUCCESS, "Rolling animation cann't be played.");
1791
1792         __isAnimating = true;
1793
1794         __pContentProvider = new (std::nothrow) VisualElement();
1795         SysTryReturnVoidResult(NID_UI_CTRL, (__pContentProvider != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1796
1797         r = __pContentProvider->Construct();
1798         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1799
1800         __pContentProvider->SetShowState(true);
1801         __pContentProvider->SetClipChildrenEnabled(true);
1802         __pContentProvider->SetImplicitAnimationEnabled(false);
1803
1804         pEditTimeElement = __pEditTime->GetVisualElement();
1805         r = GetLastResult();
1806         SysTryCatch(NID_UI_CTRL, (pEditTimeElement != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1807
1808         pNewVisualElement = new (std::nothrow) VisualElement();
1809         SysTryCatch(NID_UI_CTRL, (pNewVisualElement != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1810
1811         r = pNewVisualElement->Construct();
1812         if (r != E_SUCCESS)
1813         {
1814                 pNewVisualElement->Destroy();
1815                 pNewVisualElement = null;
1816         }
1817         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1818
1819         pNewVisualElement->SetShowState(true);
1820
1821         pOldVisualElement = new (std::nothrow) VisualElement();
1822         if (pOldVisualElement == null)
1823         {
1824                 pNewVisualElement->Destroy();
1825                 pNewVisualElement = null;
1826         }
1827         SysTryCatch(NID_UI_CTRL, (pOldVisualElement != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1828
1829         r = pOldVisualElement->Construct();
1830         if (r != E_SUCCESS)
1831         {
1832                 pNewVisualElement->Destroy();
1833                 pOldVisualElement->Destroy();
1834                 pNewVisualElement = null;
1835                 pOldVisualElement = null;
1836         }
1837         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
1838
1839         pOldVisualElement->SetShowState(true);
1840
1841         __pContentProvider->SetBounds(FloatRectangle((rect.x + contentTextMargin), (rect.y + (contentTextMargin * 2.0f)), (rect.width - (contentTextMargin * 2.0f)), (rect.height - (contentTextMargin * 4.0f))));
1842
1843         pNewVisualElement->SetBounds(FloatRectangle(0, 0, __pContentProvider->GetBounds().width, __pContentProvider->GetBounds().height));
1844         pOldVisualElement->SetBounds(FloatRectangle(0, 0, __pContentProvider->GetBounds().width, __pContentProvider->GetBounds().height));
1845
1846         pContentCanvas = pEditTimeElement->GetCanvasN(__pContentProvider->GetBounds());
1847         r = GetLastResult();
1848         SysTryCatch(NID_UI_CTRL, (pContentCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1849         pContentCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1850         pContentCanvas->Clear();
1851
1852         pCanvas = pEditTimeElement->GetCanvasN(rect);
1853         r = GetLastResult();
1854         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1855         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1856         pCanvas->Clear();
1857         rect.x = 0.0f;
1858         rect.y = 0.0f;
1859         isCustomBitmap = IS_CUSTOM_BITMAP(EDITTIME::CONTENT_BG_PRESSED);
1860         r = DrawResourceBitmap(*pCanvas, rect, __pContentBgPressedColorReplacementBitmap, isCustomBitmap);
1861
1862         if (!isCustomBitmap)
1863         {
1864                 result res = DrawResourceBitmap(*pCanvas, rect, __pContentBgEffectPressedBitmap);
1865
1866                 if (res != E_SUCCESS)
1867                 {
1868                         SysLog(NID_UI_CTRL, "[%s] Propagating.", GetErrorMessage(res));
1869                 }
1870         }
1871
1872         delete pCanvas;
1873         pCanvas = null;
1874
1875         if (r != E_SUCCESS)
1876         {
1877                 pContentCanvas->SetBackgroundColor(contentBgColor);
1878                 pContentCanvas->Clear();
1879         }
1880
1881         delete pContentCanvas;
1882         pContentCanvas = null;
1883
1884         pEditTimeElement->AttachChild(*__pContentProvider);
1885
1886         __pContentProvider->AttachChild(*pOldVisualElement);
1887         __pContentProvider->AttachChild(*pNewVisualElement);
1888
1889         pNewBoundsAnimation = new (std::nothrow) VisualElementPropertyAnimation();
1890         SysTryCatch(NID_UI_CTRL, (pNewBoundsAnimation != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1891
1892         pNewBoundsAnimation->SetDuration(300);
1893         pNewBoundsAnimation->SetPropertyName("bounds.position");
1894         pNewBoundsAnimation->SetStartValue(Variant(FloatPoint(pNewVisualElement->GetBounds().x, oldTextDim.height)));
1895         pNewBoundsAnimation->SetEndValue(Variant(FloatPoint(pNewVisualElement->GetBounds().x, 0.0f)));
1896
1897         pOldBoundsAnimation = new (std::nothrow) VisualElementPropertyAnimation();
1898         SysTryCatch(NID_UI_CTRL, (pOldBoundsAnimation != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1899
1900         pOldBoundsAnimation->SetDuration(300);
1901         pOldBoundsAnimation->SetPropertyName("bounds.position");
1902         pOldBoundsAnimation->SetStartValue(Variant(FloatPoint(pOldVisualElement->GetBounds().x, 0.0f)));
1903         pOldBoundsAnimation->SetEndValue(Variant(FloatPoint(pOldVisualElement->GetBounds().x, oldTextDim.height * -1.0f)));
1904
1905         pOldSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(__lastSelectedValue.GetPointer())), __lastSelectedValue.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
1906         SysTryCatch(NID_UI_CTRL, (pOldSimpleText != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1907
1908         pOldSimpleText->SetTextShadowEnabled(true);
1909         pOldSimpleText->SetTextShadowOffset(FloatPoint(0.0f, -1.0f));
1910
1911         pCanvas = pOldVisualElement->GetCanvasN();
1912         r = GetLastResult();
1913         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1914
1915         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1916         pCanvas->Clear();
1917         pCanvas->SetForegroundColor(textPressedColor);
1918
1919         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
1920         (_FontImpl::GetInstance(*__pFont))->SetStyle(FONT_STYLE_PLAIN);
1921         __textObject.RemoveAll();
1922         __textObject.AppendElement(*pOldSimpleText);
1923
1924         __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
1925         __textObject.SetForegroundColor(textPressedColor, 0, __textObject.GetTextLength());
1926         __textObject.SetBounds(FloatRectangle(0, 0, pCanvas->GetBounds().width, pCanvas->GetBounds().height));
1927         __textObject.Draw(*_CanvasImpl::GetInstance(*pCanvas));
1928
1929         delete pCanvas;
1930         pCanvas = null;
1931
1932         pNewSimpleText = new (std::nothrow)TextSimple((const_cast <wchar_t*>(newValue.GetPointer())), newValue.GetLength(), TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
1933         SysTryCatch(NID_UI_CTRL, (pNewSimpleText != null), , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
1934
1935         pNewSimpleText->SetTextShadowEnabled(true);
1936         pNewSimpleText->SetTextShadowOffset(FloatPoint(0.0f, -1.0f));
1937
1938         pCanvas = pNewVisualElement->GetCanvasN();
1939         r = GetLastResult();
1940         SysTryCatch(NID_UI_CTRL, (pCanvas != null), , r, "[%s] Propagating.", GetErrorMessage(r));
1941
1942         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1943         pCanvas->Clear();
1944         pCanvas->SetForegroundColor(textPressedColor);
1945
1946         (_FontImpl::GetInstance(*__pFont))->SetSize(__timeFontSize);
1947         (_FontImpl::GetInstance(*__pFont))->SetStyle(FONT_STYLE_PLAIN);
1948         __textObject.RemoveAll();
1949         __textObject.AppendElement(*pNewSimpleText);
1950
1951         __textObject.SetFont(__pFont, 0, __textObject.GetTextLength());
1952         __textObject.SetForegroundColor(textPressedColor, 0, __textObject.GetTextLength());
1953         __textObject.SetBounds(FloatRectangle(0, 0, pCanvas->GetBounds().width, pCanvas->GetBounds().height));
1954         __textObject.Draw(*_CanvasImpl::GetInstance(*pCanvas));
1955
1956         delete pCanvas;
1957         pCanvas = null;
1958
1959         pOldVisualElement->SetImplicitAnimationEnabled(false);
1960         pNewVisualElement->SetImplicitAnimationEnabled(false);
1961
1962         AnimationTransaction::Begin(__transactionId);
1963         pOldVisualElement->AddAnimation(*pOldBoundsAnimation);
1964         pNewVisualElement->AddAnimation(*pNewBoundsAnimation);
1965         AnimationTransaction::SetCurrentTransactionEventListener(__pEditTime);
1966         AnimationTransaction::Commit();
1967
1968         delete pOldBoundsAnimation;
1969         delete pNewBoundsAnimation;
1970
1971         return;
1972
1973 CATCH:
1974         __isAnimating = false;
1975         __pContentProvider->Destroy();
1976         __pContentProvider = null;
1977
1978         delete pNewBoundsAnimation;
1979         pNewBoundsAnimation = null;
1980
1981         delete pOldBoundsAnimation;
1982         pOldBoundsAnimation = null;
1983
1984         delete pOldSimpleText;
1985         pOldSimpleText = null;
1986
1987         delete pNewSimpleText;
1988         pNewSimpleText = null;
1989
1990         delete pContentCanvas;
1991         pContentCanvas = null;
1992
1993         return;
1994 }
1995
1996 void
1997 _EditTimePresenter::EndTransaction(void)
1998 {
1999         result r = E_SUCCESS;
2000
2001         __isAnimating = false;
2002         VisualElement* pEditTimeElement = __pEditTime->GetVisualElement();
2003         r = GetLastResult();
2004         SysTryReturnVoidResult(NID_UI_CTRL, (pEditTimeElement != null), r, "[%s] Propagating.", GetErrorMessage(r));
2005
2006         if (__pContentProvider != null)
2007         {
2008                 pEditTimeElement->DetachChild(*__pContentProvider);
2009                 __pContentProvider->Destroy();
2010                 __pContentProvider = null;
2011
2012         }
2013
2014         Draw();
2015         __transactionId = 0;
2016         return;
2017 }
2018 }}} // Tizen::Ui::Controls