3 Copyright (c) 2000-2012 Samsung Electronics Co., Ltd All Rights Reserved
5 This file is part of org.tizen.efl-calendar
6 Written by Taeho Kang <taeho84.kang@samsung.com>
8 PROPRIETARY/CONFIDENTIAL
10 This software is the confidential and proprietary information of
11 SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
12 disclose such Confidential Information and shall use it only in
13 accordance with the terms of the license agreement you entered
14 into with SAMSUNG ELECTRONICS.
16 SAMSUNG make no representations or warranties about the suitability
17 of the software, either express or implied, including but not limited
18 to the implied warranties of merchantability, fitness for a particular
19 purpose, or non-infringement. SAMSUNG shall not be liable for any
20 damages suffered by licensee as a result of using, modifying or
21 distributing this software or its derivatives.
27 #include <unicode/uloc.h>
28 #include <unicode/udat.h>
29 #include <unicode/udatpg.h>
33 extern int u_strlen(UChar*);
34 extern void u_austrncpy(char*, UChar*, int);
35 extern void u_uastrncpy(UChar*, char*, int);
37 static UDateTimePatternGenerator *pattern_generator = NULL;
38 static pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
39 static UErrorCode status = U_ZERO_ERROR;
40 static int pattern_generator_reference_counter = 0;
42 static const char *_icons[] = {
43 [CI_EDIT] = "01_navi_icon_edit.png",
44 [CI_NEW] = "01_navi_icon_new.png",
45 [CI_DEL] = "01_navi_icon_delete.png",
46 [CI_PHOTO] = "00_list_photo_default.png",
48 static char _partbuf[1024];
49 static char _textbuf[1024];
50 static char _titlebuf[1024];
51 static char _sigbuf[1024];
53 Eina_Bool cal_util_black_theme_check()
55 const char *curr_theme = elm_theme_get(NULL);
59 return (strstr(curr_theme,"black")?EINA_TRUE:EINA_FALSE);
65 Evas_Object* cal_util_add_bg(Evas_Object *obj, Eina_Bool is_window)
75 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
78 elm_win_resize_object_add(obj, bg);
80 elm_object_style_set(bg, "group_list");
89 Evas_Object* cal_util_add_layout(Evas_Object *win, const char *g)
93 c_retvm_if(!win, NULL, "win is null");
96 Evas_Object *eo = elm_layout_add(win);
97 c_retvm_if(!eo, NULL, "elm_layout_add returned null");
100 r = elm_layout_file_set(eo, EDJ_FILE, g);
101 c_warn_if(r == EINA_FALSE, "elm_layout_file_set is failed");
104 r = elm_layout_theme_set(eo, "layout", "application", "default");
105 c_warn_if(r == EINA_FALSE, "elm_layout_theme_set is failed");
108 if (r == EINA_FALSE) {
113 evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
114 evas_object_show(eo);
121 Evas_Object* cal_util_add_rectangle(Evas_Object *p)
125 r = evas_object_rectangle_add(evas_object_evas_get(p));
132 static void cal_util_delete_window(void *data, Evas_Object *obj, void *event)
137 Evas_Object* cal_util_add_window(const char *name, Evas_Coord* w, Evas_Coord* h)
141 Evas_Object *eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
142 c_retvm_if(!eo, NULL, "elm_win_add returned null");
144 Evas_Coord width, height;
146 elm_win_title_set(eo, name);
147 elm_win_borderless_set(eo, EINA_TRUE);
149 /*For calendar ring, window delete callback is not needed.*/
150 if (strcmp(name, CALENDAR_RING))
151 evas_object_smart_callback_add(eo, "delete,request", cal_util_delete_window, NULL);
153 ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
154 evas_object_resize(eo, width, height);
156 elm_win_conformant_set(eo, EINA_TRUE);
157 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW);
169 Evas_Object* cal_util_add_icon(Evas_Object *p, enum cld_icon i)
176 if (i < 0 || i >= CI_MAX)
179 ic = elm_icon_add(p);
183 r = elm_icon_file_set(ic, EDJ_FILE, _icons[i]);
189 evas_object_size_hint_align_set(ic, 0.5, 0.5);
194 Evas_Object* cal_util_add_icon_button(Evas_Object *p, enum cld_icon i)
201 ic = cal_util_add_icon(p, i);
205 evas_object_size_hint_min_set(ic, 34, 34);
207 bt = elm_button_add(p);
213 evas_object_size_hint_min_set(bt, 50, 50);
215 elm_object_content_set(bt, ic);
220 char* cal_util_get_part_text(const char *fmt, int pos)
222 snprintf(_partbuf, sizeof(_partbuf), fmt, pos);
227 void cal_util_set_text(Evas_Object *obj, const char *part, const char *fmt, ...)
232 vsnprintf(_textbuf, sizeof(_textbuf), fmt, ap);
235 edje_object_part_text_set(obj, part, _textbuf);
238 int cal_util_connect_pattern_generator()
240 pthread_mutex_lock(&mutex_lock);
241 if(pattern_generator_reference_counter == 0)
243 uloc_setDefault(getenv("LC_TIME"), &status);
244 if(!pattern_generator)
245 pattern_generator = udatpg_open(uloc_getDefault(), &status);
246 if(!pattern_generator)
248 ERR("udatpg_open fail : %s", u_errorName(status));
249 pthread_mutex_unlock(&mutex_lock);
254 pattern_generator_reference_counter++;
255 pthread_mutex_unlock(&mutex_lock);
260 int cal_util_disconnect_pattern_generator()
262 pthread_mutex_lock(&mutex_lock);
264 if(pattern_generator_reference_counter == 1)
266 if(pattern_generator)
267 udatpg_close(pattern_generator);
268 pattern_generator = NULL;
271 pattern_generator_reference_counter--;
273 pthread_mutex_unlock(&mutex_lock);
279 UDate cal_util_get_u_date_from_time_t(time_t time)
282 date = (UDate ) time*1000; /* Equivalent to Date = ucal_getNow() in Milliseconds */
286 UDate cal_util_get_u_date_from_tm(const struct tm* tm)
291 time = timelocal((struct tm*)tm);
293 date = (UDate ) time*1000; /* Equivalent to Date = ucal_getNow() in Milliseconds */
297 static void __cal_util_generate_best_pattern(UChar *customSkeleton, const struct tm* tm)
299 UErrorCode status = U_ZERO_ERROR;
300 UDateFormat *formatter;
302 UChar bestPattern[64] = {0,};
303 UChar formatted[64] = {0,};
304 char bestPatternString[128]={0,};
305 char formattedString[128] = {0,};
306 int32_t bestPatternCapacity, formattedCapacity;
307 int32_t bestPatternLength, formattedLength;
308 uloc_setDefault(getenv("LC_TIME"), &status);
309 const char* locale = uloc_getDefault();
311 bestPatternCapacity = (int32_t)(sizeof(bestPattern)/sizeof((bestPattern)[0]));
312 bestPatternLength = udatpg_getBestPattern(pattern_generator, customSkeleton, u_strlen(customSkeleton), bestPattern, bestPatternCapacity, &status);
314 u_austrncpy(bestPatternString, bestPattern, 128);
316 date = cal_util_get_u_date_from_tm(tm);
317 formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, bestPattern, -1, &status);
319 formattedCapacity = (int32_t)(sizeof(formatted)/sizeof((formatted)[0]));
320 formattedLength = udat_format(formatter, date, formatted, formattedCapacity, NULL, &status);
322 u_austrncpy(formattedString, formatted, 128);
324 udat_close(formatter);
326 snprintf(_textbuf,1023,"%s",formattedString);
329 void cal_util_get_time_format_from_skeleton(const char* dateSkeleton, const char* timeSkeleton, const struct tm* tm)
331 char skeleton[128]={'\0'};
332 UChar customSkeleton[64]={'\0'};
333 int dateSkeletonLength=0,timeSkeletonLength=0,skeletonLength=0;
337 dateSkeletonLength = CAL_STRLEN(dateSkeleton);
338 CAL_STRNCPY(skeleton,dateSkeleton,dateSkeletonLength);
343 timeSkeletonLength = CAL_STRLEN(timeSkeleton);
344 CAL_STRNCAT(skeleton,timeSkeleton,timeSkeletonLength);
347 skeletonLength = CAL_STRLEN(skeleton);
349 u_uastrncpy(customSkeleton, skeleton,skeletonLength);
351 __cal_util_generate_best_pattern(customSkeleton, tm);
354 void cal_util_set_time_text(Evas_Object *obj, const char *part, const char *date, const char* time,
357 cal_util_get_time_format_from_skeleton(date, time, tm);
359 if (!CAL_STRCMP(part,"title/text"))
361 snprintf(_titlebuf, 1023,"%s",_textbuf);
362 edje_object_part_text_set(obj, part, _titlebuf);
365 edje_object_part_text_set(obj, part, _textbuf);
368 void cal_util_set_time_week_text(Evas_Object *obj, const char *part, const char *date, const char* time,
369 const struct tm *t, int start)
371 c_retm_if(!obj, "obj is null.");
372 c_retm_if(!part, "part is null.");
373 c_retm_if(!t, "t is null.");
376 char week_start[1024] = {0};
377 if (!CAL_STRCMP(part,"title/text")) {
379 tm.tm_mday -= CAL_UTIL_GET_WDAY(tm.tm_wday - start);
380 cal_util_get_time_format_from_skeleton(date, time, &tm);
381 snprintf(week_start, 1023, "%s", _textbuf);
384 cal_util_get_time_format_from_skeleton(date, time, &tm);
385 snprintf(_titlebuf, 1023,"%s ~ %s", week_start, _textbuf);
387 edje_object_part_text_set(obj, part, _titlebuf);
390 edje_object_part_text_set(obj, part, _textbuf);
393 int cal_util_get_time_text(char* buf, int buf_size, const char *date, const char* time, const struct tm *tm)
395 cal_util_get_time_format_from_skeleton(date, time, tm);
396 snprintf(buf, buf_size, "%s", _textbuf);
397 return CAL_STRLEN(_textbuf);
400 void cal_util_emit_signal(Evas_Object *obj, const char *fmt, ...)
405 vsnprintf(_sigbuf, sizeof(_sigbuf), fmt, ap);
408 edje_object_signal_emit(obj, _sigbuf, "prog");
411 Evas_Object* cal_util_add_separator(Evas_Object *box, const char *style)
415 if (!box || CAL_STRCMP(elm_object_widget_type_get(box), "box"))
418 sp = elm_separator_add(box);
420 elm_separator_horizontal_set(sp, EINA_TRUE);
421 elm_object_style_set(sp, style);
422 evas_object_show(sp);
423 elm_box_pack_end(box, sp);
429 Evas_Object* cal_util_add_scroller(Evas_Object *p)
433 sc = elm_scroller_add(p);
437 elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
438 elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
440 evas_object_show(sc);
444 Evas_Object* cal_util_add_box(Evas_Object *p)
452 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
453 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0);
454 evas_object_show(bx);
459 void cal_util_set_controlbar_button(Evas_Object *btn, char *label, char *style, void (*func) (void *data, Evas_Object *obj, void *event_info), void* data)
463 elm_object_style_set(btn, style);
464 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
465 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.5);
466 elm_object_text_set(btn, label);
467 evas_object_smart_callback_add(btn, "clicked", func, data);
468 evas_object_show(btn);
471 static void __cal_util_edit_field_changed_callback(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
473 c_retm_if(!data, "data is null");
474 c_retm_if(!obj, "obj is null");
476 if (elm_object_focus_get(data)) {
477 if (elm_entry_is_empty(obj))
478 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
480 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
483 if (!elm_entry_is_empty(obj))
484 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
487 static void __cal_util_edit_field_focused_callback(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
489 c_retm_if(!data, "data is null");
490 c_retm_if(!obj, "obj is null");
492 if (!elm_entry_is_empty(obj))
493 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
495 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
498 static void __cal_util_edit_field_unfocused_callback(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
500 c_retm_if(!data, "data is null");
501 c_retm_if(!obj, "obj is null");
503 if (elm_entry_is_empty(obj))
504 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
506 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
509 static void __cal_util_edit_field_eraser_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source) // When X marked button is clicked, empty entry's contents.
511 c_retm_if(!data, "data is null");
513 elm_entry_entry_set(data, "");
516 Evas_Object * cal_util_add_edit_field(Evas_Object *parent, const char *title, const char *guide, Eina_Bool single_line, Eina_Bool is_editable)
518 c_retvm_if(!parent, NULL, "parent is null");
520 Evas_Object *layout = elm_layout_add(parent);
521 c_retvm_if(!layout, NULL, "layout is null");
523 if (title && title[0] != '\0') {
524 elm_layout_theme_set(layout, "layout", "editfield", "title");
525 elm_object_part_text_set(layout, "elm.text", title);
528 elm_layout_theme_set(layout, "layout", "editfield", "default");
530 Evas_Object *entry = elm_entry_add(parent);
531 c_retvm_if(!entry, layout, "entry is null");
533 elm_object_part_content_set(layout, "elm.swallow.content", entry);
534 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
536 if (guide && guide[0] != '\0')
537 elm_object_part_text_set(layout, "elm.guidetext", guide);
539 elm_entry_single_line_set(entry, single_line);
540 elm_entry_scrollable_set(entry, single_line);
543 elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", __cal_util_edit_field_eraser_clicked_callback, entry);
545 elm_entry_editable_set(entry, is_editable);
546 elm_object_signal_emit(layout, "elm,state,eraser,hide", "elm");
549 evas_object_smart_callback_add(entry, "changed", __cal_util_edit_field_changed_callback, layout);
550 evas_object_smart_callback_add(entry, "focused", __cal_util_edit_field_focused_callback, layout);
551 evas_object_smart_callback_add(entry, "unfocused", __cal_util_edit_field_unfocused_callback, layout);
553 evas_object_show(layout);
558 static void __cal_util_searchbar_changed_callback(void *data, Evas_Object *obj, void *event_info)
560 c_retm_if(!data, "data is null");
561 c_retm_if(!obj, "obj is null");
563 if (elm_object_focus_get(data)) {
564 if (elm_entry_is_empty(obj))
565 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
567 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
570 if (!elm_entry_is_empty(obj))
571 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
574 static void __cal_util_searchbar_with_cancel_btn_focused_callback(void *data, Evas_Object *obj, void *event_info)
576 c_retm_if(!data, "data is null");
577 c_retm_if(!obj, "obj is null");
579 if (!elm_entry_is_empty(obj))
580 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
582 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
584 elm_object_signal_emit(data, "cancel,in", "");
587 static void __cal_util_searchbar_focused_callback(void *data, Evas_Object *obj, void *event_info)
589 c_retm_if(!data, "data is null");
590 c_retm_if(!obj, "obj is null");
592 if (!elm_entry_is_empty(obj))
593 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
595 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
598 static void __cal_util_searchbar_eraser_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source) // When X marked button is clicked, empty entry's contents.
600 c_retm_if(!data, "data is null");
602 elm_entry_entry_set(data, "");
605 static void __cal_util_searchbar_cancel_btn_clicked_callback(void *data, Evas_Object *obj, void *event_info)
607 c_retm_if(!data, "data is null");
608 c_retm_if(!obj, "obj is null");
610 Evas_Object *searchbar_layout = data;
611 Evas_Object *entry = elm_object_part_content_get(searchbar_layout, "elm.swallow.content");
612 c_retm_if(!entry, "entry is null");
614 evas_object_hide(obj);
616 elm_entry_input_panel_hide(entry);
618 elm_entry_entry_set(entry, NULL);
620 elm_object_focus_set(entry, EINA_FALSE);
623 static void __cal_util_searchbar_unfocused_callback(void *data, Evas_Object *obj, void *event_info)
625 c_retm_if(!data, "data is null");
626 c_retm_if(!obj, "obj is null");
628 if (elm_entry_is_empty(obj))
629 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
631 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
633 elm_object_signal_emit(data, "cancel,out", "");
636 static void __cal_util_searchbar_symbol_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source)
638 c_retm_if(!data, "data is null");
640 elm_object_focus_set(data, EINA_TRUE);
643 static void __cal_util_searchbar_bg_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source)
645 c_retm_if(!data, "data is null");
647 elm_object_focus_set(data, EINA_TRUE);
650 Evas_Object * cal_util_add_searchbar(Evas_Object *parent, const char *text, const char *guide, Eina_Bool cancel_button)
652 c_retvm_if(!parent, NULL, "parent is null");
654 Evas_Object *searchbar_layout = elm_layout_add(parent);
655 c_retvm_if(!searchbar_layout, NULL, "searchbar_layout is null");
658 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "cancel_button");
660 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "default");
662 Evas_Object *entry = elm_entry_add(searchbar_layout);
663 c_retvm_if(!entry, searchbar_layout, "entry is null");
665 evas_object_show(entry);
667 elm_entry_scrollable_set(entry, EINA_TRUE);
668 elm_entry_single_line_set(entry, EINA_TRUE);
669 elm_object_part_content_set(searchbar_layout, "elm.swallow.content", entry);
671 if (guide && strlen(guide))
672 elm_object_part_text_set(searchbar_layout, "elm.guidetext", guide);
674 elm_object_part_text_set(searchbar_layout, "elm.guidetext", S_("IDS_COM_BODY_SEARCH"));
676 if (text && strlen(text))
677 elm_object_text_set(entry, text);
680 Evas_Object *cancel_btn = elm_button_add(searchbar_layout);
681 c_retvm_if(!cancel_btn, searchbar_layout, "cancel_btn is null");
683 elm_object_part_content_set(searchbar_layout, "button_cancel", cancel_btn);
684 elm_object_style_set(cancel_btn, "searchbar/default");
685 elm_object_text_set(cancel_btn, S_("IDS_COM_SK_CANCEL"));
687 evas_object_smart_callback_add(entry, "focused", __cal_util_searchbar_with_cancel_btn_focused_callback, searchbar_layout);
688 evas_object_smart_callback_add(cancel_btn, "clicked", __cal_util_searchbar_cancel_btn_clicked_callback, searchbar_layout);
692 evas_object_smart_callback_add(entry, "focused", __cal_util_searchbar_focused_callback, searchbar_layout);
695 evas_object_smart_callback_add(entry, "changed", __cal_util_searchbar_changed_callback, searchbar_layout);
696 evas_object_smart_callback_add(entry, "unfocused", __cal_util_searchbar_unfocused_callback, searchbar_layout);
697 elm_object_signal_callback_add(searchbar_layout, "elm,eraser,clicked", "elm", __cal_util_searchbar_eraser_clicked_callback, entry);
698 elm_object_signal_callback_add(searchbar_layout, "elm,bg,clicked", "elm", __cal_util_searchbar_bg_clicked_callback, entry);
699 elm_object_signal_callback_add(searchbar_layout, "elm,action,click", "", __cal_util_searchbar_symbol_clicked_callback, entry);
701 return searchbar_layout;
704 Evas_Object * cal_util_add_nocontents(Evas_Object *parent, const char *label)
706 c_retvm_if(!parent, NULL, "parent is null");
708 Evas_Object *layout = elm_layout_add(parent);
709 c_retvm_if(!layout, NULL, "layout is null");
711 elm_layout_theme_set(layout, "layout", "nocontents", "full");
713 if (label && strlen(label))
714 elm_object_part_text_set(layout, "elm.text", label);
719 Evas_Object * cal_util_add_controlbar(Evas_Object * parent)
721 c_retvm_if(!parent, NULL, "parent is null");
723 Evas_Object *toolbar = elm_toolbar_add(parent);
724 c_retvm_if(!toolbar, NULL, "toolbar is null");
726 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
731 static void __cal_util_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
733 evas_object_del(data);
736 Evas_Object * cal_util_add_popup(Evas_Object *parent, const char *title, const char *desc,
737 void (*callback_func)(void *data, Evas_Object *obj, void *ei), void *data, ...)
739 c_retvm_if(!parent, NULL, "parent is null");
741 Evas_Object *popup = elm_popup_add(parent);
742 c_retvm_if(!popup, NULL, "popup is null");
745 evas_object_data_set(popup, "data", data);
747 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
749 if (title && strlen(title))
750 elm_object_part_text_set(popup, "title,text", title);
752 if (desc && strlen(desc))
753 elm_object_text_set(popup, desc);
757 Evas_Object *btn = NULL;
758 const char *label = NULL;
762 callback_func = __cal_util_popup_response_callback;
766 while ((label = va_arg(arg, char*))) {
767 btn = elm_button_add(popup);
773 elm_object_text_set(btn, label);
774 snprintf(part, sizeof(part), "button%d", ++i);
775 elm_object_part_content_set(popup, part, btn);
776 evas_object_smart_callback_add(btn, "clicked", callback_func, popup);
782 elm_popup_timeout_set(popup, 3.0);
784 evas_object_show(popup);
789 Evas_Object * cal_util_add_datetime(Evas_Object *parent, const char *title, struct tm *tm)
791 c_retvm_if(!parent, NULL, "parent is null");
793 Evas_Object *layout = elm_layout_add(parent);
794 c_retvm_if(!layout, NULL, "layout is null");
796 Eina_Bool r = elm_layout_file_set(layout, EDJ_FILE, "dialoguegroup/datetime");
797 c_retvm_if(!r, NULL, "r is null");
799 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
801 Evas_Object *datetime = elm_datetime_add(layout);
802 c_retvm_if(!datetime, NULL, "datetime is null");
804 if (CAL_STRLEN(title))
805 elm_object_part_text_set(layout, "elm.text", title);
808 elm_datetime_value_set(datetime, (const struct tm *)tm);
810 elm_object_part_content_set(layout, "elm.icon", datetime);