b495d1b7c4db4d49a852f9886978e7c781b6ab9d
[apps/core/preloaded/calendar.git] / common / util-efl.c
1 /*
2
3 Copyright (c) 2000-2012 Samsung Electronics Co., Ltd All Rights Reserved
4
5 This file is part of org.tizen.efl-calendar
6 Written by Taeho Kang <taeho84.kang@samsung.com>
7
8 PROPRIETARY/CONFIDENTIAL
9
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.
15
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.
22
23 */
24
25
26 #include <Ecore_X.h>
27 #include <unicode/uloc.h>
28 #include <unicode/udat.h>
29 #include <unicode/udatpg.h>
30
31 #include "cld.h"
32
33 extern int u_strlen(UChar*);
34 extern void u_austrncpy(char*, UChar*, int);
35 extern void u_uastrncpy(UChar*, char*, int);
36
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;
41
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",
47 };
48 static char _partbuf[1024];
49 static char _textbuf[1024];
50 static char _titlebuf[1024];
51 static char _sigbuf[1024];
52
53 Eina_Bool cal_util_black_theme_check()
54 {
55         const char *curr_theme = elm_theme_get(NULL);
56
57         if (curr_theme)
58         {
59                 return (strstr(curr_theme,"black")?EINA_TRUE:EINA_FALSE);
60         }
61
62         return EINA_FALSE;
63 }
64
65 Evas_Object* cal_util_add_bg(Evas_Object *obj, Eina_Bool is_window)
66 {
67         CAL_FN_START;
68
69         Evas_Object *bg;
70         CAL_ASSERT(obj);
71         bg = elm_bg_add(obj);
72         if (!bg)
73                 return NULL;
74
75         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
76
77         if (is_window)
78                 elm_win_resize_object_add(obj, bg);
79         else
80                 elm_object_style_set(bg, "group_list");
81
82         evas_object_show(bg);
83
84         CAL_FN_END;
85
86         return bg;
87 }
88
89 Evas_Object* cal_util_add_layout(Evas_Object *win, const char *g)
90 {
91         CAL_FN_START;
92
93         c_retvm_if(!win, NULL, "win is null");
94
95         Eina_Bool r;
96         Evas_Object *eo = elm_layout_add(win);
97         c_retvm_if(!eo, NULL, "elm_layout_add returned null");
98
99         if (g) {
100                 r = elm_layout_file_set(eo, EDJ_FILE, g);
101                 c_warn_if(r == EINA_FALSE, "elm_layout_file_set is failed");
102         }
103         else {
104                 r = elm_layout_theme_set(eo, "layout", "application", "default");
105                 c_warn_if(r == EINA_FALSE, "elm_layout_theme_set is failed");
106         }
107
108         if (r == EINA_FALSE) {
109                 evas_object_del(eo);
110                 return NULL;
111         }
112
113         evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
114         evas_object_show(eo);
115
116         CAL_FN_END;
117
118         return eo;
119 }
120
121 Evas_Object* cal_util_add_rectangle(Evas_Object *p)
122 {
123         Evas_Object *r;
124
125         r = evas_object_rectangle_add(evas_object_evas_get(p));
126         CAL_ASSERT(r);
127
128         evas_object_show(r);
129         return r;
130 }
131
132 static void cal_util_delete_window(void *data, Evas_Object *obj, void *event)
133 {
134         elm_exit();
135 }
136
137 Evas_Object* cal_util_add_window(const char *name, Evas_Coord* w, Evas_Coord* h)
138 {
139         CAL_FN_START;
140
141         Evas_Object *eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
142         c_retvm_if(!eo, NULL, "elm_win_add returned null");
143
144         Evas_Coord width, height;
145
146         elm_win_title_set(eo, name);
147         elm_win_borderless_set(eo, EINA_TRUE);
148
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);
152
153         ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
154         evas_object_resize(eo, width, height);
155
156         elm_win_conformant_set(eo, EINA_TRUE);
157         elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW);
158
159         if (w && h) {
160                 *w = width;
161                 *h = height;
162         }
163
164         CAL_FN_END;
165
166         return eo;
167 }
168
169 Evas_Object* cal_util_add_icon(Evas_Object *p, enum cld_icon i)
170 {
171         Eina_Bool r;
172         Evas_Object *ic;
173
174         CAL_ASSERT(p);
175
176         if (i < 0 || i >= CI_MAX)
177                 return NULL;
178
179         ic = elm_icon_add(p);
180         if (!ic)
181                 return NULL;
182
183         r = elm_icon_file_set(ic, EDJ_FILE, _icons[i]);
184         if (!r) {
185                 evas_object_del(ic);
186                 return NULL;
187         }
188
189         evas_object_size_hint_align_set(ic, 0.5, 0.5);
190
191         return ic;
192 }
193
194 Evas_Object* cal_util_add_icon_button(Evas_Object *p, enum cld_icon i)
195 {
196         Evas_Object *ic;
197         Evas_Object *bt;
198
199         CAL_ASSERT(p);
200
201         ic = cal_util_add_icon(p, i);
202         if (!ic)
203                 return NULL;
204
205         evas_object_size_hint_min_set(ic, 34, 34);
206
207         bt = elm_button_add(p);
208         if (!bt) {
209                 evas_object_del(ic);
210                 return NULL;
211         }
212
213         evas_object_size_hint_min_set(bt, 50, 50);
214
215         elm_object_content_set(bt, ic);
216
217         return bt;
218 }
219
220 char* cal_util_get_part_text(const char *fmt, int pos)
221 {
222         snprintf(_partbuf, sizeof(_partbuf), fmt, pos);
223         return _partbuf;
224 }
225
226
227 void cal_util_set_text(Evas_Object *obj, const char *part, const char *fmt, ...)
228 {
229         va_list ap;
230
231         va_start(ap, fmt);
232         vsnprintf(_textbuf, sizeof(_textbuf), fmt, ap);
233         va_end(ap);
234
235         edje_object_part_text_set(obj, part, _textbuf);
236 }
237
238 int cal_util_connect_pattern_generator()
239 {
240         pthread_mutex_lock(&mutex_lock);
241         if(pattern_generator_reference_counter == 0)
242         {
243                 uloc_setDefault(getenv("LC_TIME"), &status);
244                 if(!pattern_generator)
245                         pattern_generator = udatpg_open(uloc_getDefault(), &status);
246                 if(!pattern_generator)
247                 {
248                         ERR("udatpg_open fail : %s", u_errorName(status));
249                         pthread_mutex_unlock(&mutex_lock);
250                         return -1;
251                 }
252         }
253
254         pattern_generator_reference_counter++;
255         pthread_mutex_unlock(&mutex_lock);
256
257         return 0;
258 }
259
260 int cal_util_disconnect_pattern_generator()
261 {
262         pthread_mutex_lock(&mutex_lock);
263
264         if(pattern_generator_reference_counter == 1)
265         {
266                 if(pattern_generator)
267                         udatpg_close(pattern_generator);
268                 pattern_generator = NULL;
269         }
270
271         pattern_generator_reference_counter--;
272
273         pthread_mutex_unlock(&mutex_lock);
274
275         return 0;
276 }
277
278
279 UDate cal_util_get_u_date_from_time_t(time_t time)
280 {
281         UDate date;
282         date = (UDate ) time*1000;  /* Equivalent to Date = ucal_getNow() in Milliseconds */
283         return date;
284 }
285
286 UDate cal_util_get_u_date_from_tm(const struct tm* tm)
287 {
288         UDate date;
289         time_t time;
290
291         time = timelocal((struct tm*)tm);
292
293         date = (UDate ) time*1000;  /* Equivalent to Date = ucal_getNow() in Milliseconds */
294         return date;
295 }
296
297 static void __cal_util_generate_best_pattern(UChar *customSkeleton, const struct tm* tm)
298 {
299         UErrorCode status = U_ZERO_ERROR;
300         UDateFormat *formatter;
301         UDate date;
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();
310
311         bestPatternCapacity = (int32_t)(sizeof(bestPattern)/sizeof((bestPattern)[0]));
312         bestPatternLength = udatpg_getBestPattern(pattern_generator, customSkeleton, u_strlen(customSkeleton), bestPattern,   bestPatternCapacity, &status);
313
314         u_austrncpy(bestPatternString, bestPattern, 128);
315
316         date = cal_util_get_u_date_from_tm(tm);
317         formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, bestPattern, -1, &status);
318
319         formattedCapacity = (int32_t)(sizeof(formatted)/sizeof((formatted)[0]));
320         formattedLength = udat_format(formatter, date, formatted, formattedCapacity, NULL, &status);
321
322         u_austrncpy(formattedString, formatted, 128);
323
324         udat_close(formatter);
325
326         snprintf(_textbuf,1023,"%s",formattedString);
327 }
328
329 void cal_util_get_time_format_from_skeleton(const char* dateSkeleton, const char* timeSkeleton, const struct tm* tm)
330 {
331         char skeleton[128]={'\0'};
332         UChar customSkeleton[64]={'\0'};
333         int dateSkeletonLength=0,timeSkeletonLength=0,skeletonLength=0;
334
335         if(dateSkeleton)
336         {
337                 dateSkeletonLength = CAL_STRLEN(dateSkeleton);
338                 CAL_STRNCPY(skeleton,dateSkeleton,dateSkeletonLength);
339         }
340
341         if(timeSkeleton)
342         {
343                 timeSkeletonLength = CAL_STRLEN(timeSkeleton);
344                 CAL_STRNCAT(skeleton,timeSkeleton,timeSkeletonLength);
345         }
346
347         skeletonLength = CAL_STRLEN(skeleton);
348
349         u_uastrncpy(customSkeleton, skeleton,skeletonLength);
350
351         __cal_util_generate_best_pattern(customSkeleton, tm);
352 }
353
354 void cal_util_set_time_text(Evas_Object *obj, const char *part, const char *date, const char* time,
355                 const struct tm *tm)
356 {
357         cal_util_get_time_format_from_skeleton(date, time, tm);
358
359         if (!CAL_STRCMP(part,"title/text"))
360         {
361                 snprintf(_titlebuf, 1023,"%s",_textbuf);
362                 edje_object_part_text_set(obj, part, _titlebuf);
363         }
364         else
365                 edje_object_part_text_set(obj, part, _textbuf);
366 }
367
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)
370 {
371         c_retm_if(!obj, "obj is null.");
372         c_retm_if(!part, "part is null.");
373         c_retm_if(!t, "t is null.");
374
375         struct tm tm = *t;
376         char week_start[1024] = {0};
377         if (!CAL_STRCMP(part,"title/text")) {
378
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);
382
383                 tm.tm_mday += 7;
384                 cal_util_get_time_format_from_skeleton(date, time, &tm);
385                 snprintf(_titlebuf, 1023,"%s ~ %s", week_start, _textbuf);
386
387                 edje_object_part_text_set(obj, part, _titlebuf);
388         }
389         else
390                 edje_object_part_text_set(obj, part, _textbuf);
391 }
392
393 int cal_util_get_time_text(char* buf, int buf_size, const char *date, const char* time, const struct tm *tm)
394 {
395         cal_util_get_time_format_from_skeleton(date, time, tm);
396         snprintf(buf, buf_size, "%s", _textbuf);
397         return CAL_STRLEN(_textbuf);
398 }
399
400 void cal_util_emit_signal(Evas_Object *obj, const char *fmt, ...)
401 {
402         va_list ap;
403
404         va_start(ap, fmt);
405         vsnprintf(_sigbuf, sizeof(_sigbuf), fmt, ap);
406         va_end(ap);
407
408         edje_object_signal_emit(obj, _sigbuf, "prog");
409 }
410
411 Evas_Object* cal_util_add_separator(Evas_Object *box, const char *style)
412 {
413         Evas_Object *sp;
414
415         if (!box || CAL_STRCMP(elm_object_widget_type_get(box), "box"))
416                 return NULL;
417
418         sp = elm_separator_add(box);
419         if (sp) {
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);
424         }
425
426         return sp;
427 }
428
429 Evas_Object* cal_util_add_scroller(Evas_Object *p)
430 {
431         Evas_Object *sc;
432
433         sc = elm_scroller_add(p);
434         if (!sc)
435                 return NULL;
436
437         elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
438         elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
439
440         evas_object_show(sc);
441         return sc;
442 }
443
444 Evas_Object* cal_util_add_box(Evas_Object *p)
445 {
446         Evas_Object *bx;
447
448         bx = elm_box_add(p);
449         if (!bx)
450                 return NULL;
451
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);
455
456         return bx;
457 }
458
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)
460 {
461         CAL_ASSERT(btn);
462
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);
469 }
470
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.
472 {
473         c_retm_if(!data, "data is null");
474         c_retm_if(!obj, "obj is null");
475
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");
479                 else
480                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
481         }
482
483         if (!elm_entry_is_empty(obj))
484                 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
485 }
486
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.
488 {
489         c_retm_if(!data, "data is null");
490         c_retm_if(!obj, "obj is null");
491
492         if (!elm_entry_is_empty(obj))
493                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
494
495         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
496 }
497
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.
499 {
500         c_retm_if(!data, "data is null");
501         c_retm_if(!obj, "obj is null");
502
503         if (elm_entry_is_empty(obj))
504                 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
505
506         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
507 }
508
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.
510 {
511         c_retm_if(!data, "data is null");
512
513         elm_entry_entry_set(data, "");
514 }
515
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)
517 {
518         c_retvm_if(!parent, NULL, "parent is null");
519
520         Evas_Object *layout = elm_layout_add(parent);
521         c_retvm_if(!layout, NULL, "layout is null");
522
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);
526         }
527         else
528                 elm_layout_theme_set(layout, "layout", "editfield", "default");
529
530         Evas_Object *entry = elm_entry_add(parent);
531         c_retvm_if(!entry, layout, "entry is null");
532
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);
535
536         if (guide && guide[0] != '\0')
537                 elm_object_part_text_set(layout, "elm.guidetext", guide);
538
539         elm_entry_single_line_set(entry, single_line);
540         elm_entry_scrollable_set(entry, single_line);
541
542         if (is_editable)
543                 elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", __cal_util_edit_field_eraser_clicked_callback, entry);
544         else {
545                 elm_entry_editable_set(entry, is_editable);
546                 elm_object_signal_emit(layout, "elm,state,eraser,hide", "elm");
547         }
548
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);
552
553         evas_object_show(layout);
554
555         return layout;
556 }
557
558 static void __cal_util_searchbar_changed_callback(void *data, Evas_Object *obj, void *event_info)
559 {
560         c_retm_if(!data, "data is null");
561         c_retm_if(!obj, "obj is null");
562
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");
566                 else
567                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
568         }
569
570         if (!elm_entry_is_empty(obj))
571                 elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
572 }
573
574 static void __cal_util_searchbar_with_cancel_btn_focused_callback(void *data, Evas_Object *obj, void *event_info)
575 {
576         c_retm_if(!data, "data is null");
577         c_retm_if(!obj, "obj is null");
578
579         if (!elm_entry_is_empty(obj))
580                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
581
582         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
583
584         elm_object_signal_emit(data, "cancel,in", "");
585 }
586
587 static void __cal_util_searchbar_focused_callback(void *data, Evas_Object *obj, void *event_info)
588 {
589         c_retm_if(!data, "data is null");
590         c_retm_if(!obj, "obj is null");
591
592         if (!elm_entry_is_empty(obj))
593                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
594
595         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
596 }
597
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.
599 {
600         c_retm_if(!data, "data is null");
601
602         elm_entry_entry_set(data, "");
603 }
604
605 static void __cal_util_searchbar_cancel_btn_clicked_callback(void *data, Evas_Object *obj, void *event_info)
606 {
607         c_retm_if(!data, "data is null");
608         c_retm_if(!obj, "obj is null");
609
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");
613
614         evas_object_hide(obj);
615
616         elm_entry_input_panel_hide(entry);
617
618         elm_entry_entry_set(entry, NULL);
619
620         elm_object_focus_set(entry, EINA_FALSE);
621 }
622
623 static void __cal_util_searchbar_unfocused_callback(void *data, Evas_Object *obj, void *event_info)
624 {
625         c_retm_if(!data, "data is null");
626         c_retm_if(!obj, "obj is null");
627
628         if (elm_entry_is_empty(obj))
629                 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
630
631         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
632
633         elm_object_signal_emit(data, "cancel,out", "");
634 }
635
636 static void __cal_util_searchbar_symbol_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source)
637 {
638         c_retm_if(!data, "data is null");
639
640         elm_object_focus_set(data, EINA_TRUE);
641 }
642
643 static void __cal_util_searchbar_bg_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source)
644 {
645         c_retm_if(!data, "data is null");
646
647         elm_object_focus_set(data, EINA_TRUE);
648 }
649
650 Evas_Object * cal_util_add_searchbar(Evas_Object *parent, const char *text,  const char *guide, Eina_Bool cancel_button)
651 {
652         c_retvm_if(!parent, NULL, "parent is null");
653
654         Evas_Object *searchbar_layout = elm_layout_add(parent);
655         c_retvm_if(!searchbar_layout, NULL, "searchbar_layout is null");
656
657         if (cancel_button)
658                 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "cancel_button");
659         else
660                 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "default");
661
662         Evas_Object *entry = elm_entry_add(searchbar_layout);
663         c_retvm_if(!entry, searchbar_layout, "entry is null");
664
665         evas_object_show(entry);
666
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);
670
671         if (guide && strlen(guide))
672                 elm_object_part_text_set(searchbar_layout, "elm.guidetext", guide);
673         else
674                 elm_object_part_text_set(searchbar_layout, "elm.guidetext", S_("IDS_COM_BODY_SEARCH"));
675
676         if (text && strlen(text))
677                 elm_object_text_set(entry, text);
678
679         if (cancel_button) {
680                 Evas_Object *cancel_btn = elm_button_add(searchbar_layout);
681                 c_retvm_if(!cancel_btn, searchbar_layout, "cancel_btn is null");
682
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"));
686
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);
689
690         }
691         else {
692                 evas_object_smart_callback_add(entry, "focused", __cal_util_searchbar_focused_callback, searchbar_layout);
693         }
694
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);
700
701         return searchbar_layout;
702 }
703
704 Evas_Object * cal_util_add_nocontents(Evas_Object *parent, const char *label)
705 {
706         c_retvm_if(!parent, NULL, "parent is null");
707
708         Evas_Object *layout = elm_layout_add(parent);
709         c_retvm_if(!layout, NULL, "layout is null");
710
711         elm_layout_theme_set(layout, "layout", "nocontents", "full");
712
713         if (label && strlen(label))
714                 elm_object_part_text_set(layout, "elm.text", label);
715
716         return layout;
717 }
718
719 Evas_Object * cal_util_add_controlbar(Evas_Object * parent)
720 {
721         c_retvm_if(!parent, NULL, "parent is null");
722
723         Evas_Object *toolbar = elm_toolbar_add(parent);
724         c_retvm_if(!toolbar, NULL, "toolbar is null");
725
726         elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
727
728         return toolbar;
729 }
730
731 static void __cal_util_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
732 {
733         evas_object_del(data);
734 }
735
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, ...)
738 {
739         c_retvm_if(!parent, NULL, "parent is null");
740
741         Evas_Object *popup = elm_popup_add(parent);
742         c_retvm_if(!popup, NULL, "popup is null");
743
744         if (data)
745                 evas_object_data_set(popup, "data", data);
746
747         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
748
749         if (title && strlen(title))
750                 elm_object_part_text_set(popup, "title,text", title);
751
752         if (desc && strlen(desc))
753                 elm_object_text_set(popup, desc);
754
755         va_list arg;
756         int i = 0;
757         Evas_Object *btn = NULL;
758         const char *label = NULL;
759         char part[16] = {0};
760
761         if (!callback_func)
762                 callback_func = __cal_util_popup_response_callback;
763
764         va_start(arg, data);
765
766         while ((label = va_arg(arg, char*))) {
767                 btn = elm_button_add(popup);
768                 if (!btn) {
769                         ERR("btn is null");
770                         continue;
771                 }
772
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);
777         }
778
779         va_end(arg);
780
781         if (!i)
782                 elm_popup_timeout_set(popup, 3.0);
783
784         evas_object_show(popup);
785
786         return popup;
787 }
788
789 Evas_Object * cal_util_add_datetime(Evas_Object *parent, const char *title, struct tm *tm)
790 {
791         c_retvm_if(!parent, NULL, "parent is null");
792
793         Evas_Object *layout = elm_layout_add(parent);
794         c_retvm_if(!layout, NULL, "layout is null");
795
796         Eina_Bool r = elm_layout_file_set(layout, EDJ_FILE, "dialoguegroup/datetime");
797         c_retvm_if(!r, NULL, "r is null");
798
799         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
800
801         Evas_Object *datetime = elm_datetime_add(layout);
802         c_retvm_if(!datetime, NULL, "datetime is null");
803
804         if (CAL_STRLEN(title))
805                 elm_object_part_text_set(layout, "elm.text", title);
806
807         if (tm)
808                 elm_datetime_value_set(datetime, (const struct tm *)tm);
809
810         elm_object_part_content_set(layout, "elm.icon", datetime);
811
812         return layout;
813 }