97e612b8a515b68aeeb2eeed0fd6baacdbebf551
[apps/core/preloaded/calendar.git] / src / edit-alarm.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 <calendar-svc-provider.h>
27
28 #include "edit-alarm.h"
29
30 #define _HOUR (60)
31 #define _DAY (60 * 24)
32 #define _WEEK (60 * 24 * 7)
33
34 #define _OFF -1
35 #define _CUSTOM -2
36
37 static const char *_name = "calendar/edit/alarm";
38
39 struct _priv {
40         const char *name;
41         struct appdata* ad;
42         Evas_Object *parent;
43         Evas_Object *ly; // self
44
45         Evas_Object *sc; // scroller
46         Evas_Object *bx; // box
47
48         Evas_Object *r_grp; // radio
49         Evas_Object *r_grp_member[8];
50
51         Evas_Object *e_custom;
52         Evas_Object *b_custom;
53         int bt_idx;
54
55         Evas_Object *rect; // for scrolling
56
57         int selected;
58
59         Elm_Object_Item *pre_selected_it;
60
61         int min;
62
63         Elm_Theme *theme;
64
65         Evas_Object *ctx;
66
67         Evas_Coord_Rectangle ctx_r;
68
69         Eina_Bool is_imf_show;
70 };
71
72 struct __cal_edit_alarm_button {
73         const char *label;
74         int unit;
75 };
76 static struct __cal_edit_alarm_button cal_edit_alarm_button[] = {
77         { NULL, 1, },
78         { NULL, _HOUR, },
79         { NULL, _DAY, },
80         { NULL, _WEEK, },
81 };
82
83 static Elm_Entry_Filter_Limit_Size _limit_2char = {
84         .max_char_count = 2,
85 };
86 static Elm_Entry_Filter_Accept_Set _digit_only = {
87         .accepted = "0123456789",
88 };
89
90 static Elm_Genlist_Item_Class itc_seperator, itc_1text_1icon, itc_1icon, itc_2text_3icon;
91
92 typedef struct __cal_edit_alarm_item_data cal_edit_alarm_item_data;
93 struct __cal_edit_alarm_item_data
94 {
95         struct _priv *p;
96         int type;
97         int data;
98         Elm_Object_Item *it;
99         Evas_Object *item_radio;
100 };
101
102 enum cal_edit_alarm_genlist_item_type{
103         _GTYPE_SPEA = -1,
104         _GTYPE_OFF,
105         _GTYPE_ON_TIME,
106         _GTYPE_5_MIN,
107         _GTYPE_15_MIN,
108         _GTYPE_1_HOUR,
109         _GTYPE_1_DAY,
110         _GTYPE_1_WEEK,
111         _GTYPE_CUSTOMIZE,
112         _GTYPE_MAX
113 };
114
115
116 static cal_edit_alarm_item_data cal_edit_alarm_item_datas[] =
117 {
118         {NULL,_GTYPE_SPEA, 0, NULL, NULL},
119         {NULL,_GTYPE_OFF, _OFF, NULL, NULL},
120         {NULL,_GTYPE_ON_TIME, 0, NULL, NULL},
121         {NULL,_GTYPE_5_MIN, 5, NULL, NULL},
122         {NULL,_GTYPE_15_MIN, 15, NULL, NULL},
123         {NULL,_GTYPE_1_HOUR, _HOUR, NULL, NULL},
124         {NULL,_GTYPE_1_DAY, _DAY, NULL, NULL},
125         {NULL,_GTYPE_1_WEEK, _WEEK, NULL, NULL},
126         {NULL,_GTYPE_CUSTOMIZE, _CUSTOM, NULL, NULL},
127 };
128
129
130 static void __cal_edit_alarm_custom_ctx_selected_callback(void *data, Evas_Object *obj, void *ei);
131
132 static void __cal_edit_alarm_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
133 {
134         CAL_FN_START;
135
136         struct _priv *p = data;
137
138         if (!p)
139                 return;
140
141         if (p->rect)
142                 evas_object_del(p->rect);
143
144         if (p->ctx) {
145                 evas_object_del(p->ctx);
146         }
147
148         free(p);
149 }
150
151 static void __cal_edit_alarm_clicked_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
152 {
153         struct _priv *p;
154         Evas_Event_Mouse_Up *ev = ei;
155         int val = (int)data;
156
157         if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
158                 return;
159
160         p = CAL_UTIL_GET_PRIV_DATA(obj);
161
162
163         elm_radio_value_set(p->r_grp, val);
164         evas_object_size_hint_min_set(p->rect, 0, 0);
165         p->selected = val;
166 }
167
168 static void __cal_edit_alarm_set_custom(struct _priv *p)
169 {
170         elm_radio_value_set(p->r_grp, _GTYPE_CUSTOMIZE);
171
172         elm_object_focus_set(p->e_custom, EINA_TRUE);
173         elm_entry_cursor_end_set(p->e_custom);
174 }
175
176 static void __cal_edit_alarm_custom_clicked_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
177 {
178         struct _priv *p = data;
179         Evas_Event_Mouse_Up *ev = ei;
180
181         if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
182                 return;
183
184         __cal_edit_alarm_set_custom(p);
185 }
186
187 static inline void __cal_edit_alarm_set_button_label(struct _priv *p)
188 {
189         elm_object_text_set(p->b_custom, _(cal_edit_alarm_button[p->bt_idx].label));
190 }
191
192 static void __cal_edit_alarm_custom_popup_hide_callback(void *data, Evas_Object *obj, void *ei)
193 {
194         c_retm_if(!data, "data is null");
195         c_retm_if(!obj,  "obj is null");
196
197         struct _priv* p = data;
198         p->ctx = NULL;
199         evas_object_del(obj);
200 }
201
202 static void __cal_edit_create_ctx_popup(struct _priv* p)
203 {
204         c_retm_if(!p, "p is NULL.");
205
206         Evas_Object *ctx = p->ctx;
207
208         if (ctx)
209                 evas_object_del(ctx);
210
211         p->ctx = elm_ctxpopup_add(p->ad->nv);
212         c_retm_if(!p->ctx, "elm_ctxpopup_add(p->ad->nv) returned null");
213
214         ctx = p->ctx;
215         evas_object_data_set(ctx, "priv", p);
216
217         evas_object_smart_callback_add(ctx, "dismissed", __cal_edit_alarm_custom_popup_hide_callback, p);
218         elm_ctxpopup_item_append(ctx, S_("IDS_COM_BODY_MINUTE_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)0);
219         elm_ctxpopup_item_append(ctx, S_("IDS_COM_POP_HOUR_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)1);
220         elm_ctxpopup_item_append(ctx, C_("IDS_COM_POP_DAY_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)2);
221         elm_ctxpopup_item_append(ctx, C_("IDS_COM_POP_WEEK_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)3);
222 }
223
224 static void __cal_edit_alarm_custom_button_callback(void *data, Evas_Object *obj, void *ei)
225 {
226         struct _priv* p = data;
227         c_retm_if(!p, "p is null");
228
229         __cal_edit_create_ctx_popup(p);
230         c_retm_if(!p->ctx, "p is NULL.");
231         if (!p->is_imf_show) {
232                 Evas_Coord x , y, w, h;
233                 evas_object_geometry_get(p->b_custom, &x, &y, &w, &h);
234                 evas_object_move(p->ctx, x+w, y);
235         } else {
236                 evas_object_move(p->ctx, p->ctx_r.x+p->ctx_r.w, p->ctx_r.y);
237         }
238         evas_object_show(p->ctx);
239 }
240
241 static void __cal_edit_alarm_custom_ctx_selected_callback(void *data, Evas_Object *obj, void *ei)
242 {
243         struct _priv* p = CAL_UTIL_GET_PRIV_DATA(obj);
244         c_retm_if(!p, "p is NULL.");
245
246         int index = (int)data;
247         p->bt_idx = index;
248         __cal_edit_alarm_set_button_label(p);
249
250         __cal_edit_alarm_set_custom(p);
251         p->selected = _GTYPE_CUSTOMIZE;
252         __cal_edit_alarm_custom_popup_hide_callback(p,p->ctx,ei);
253 }
254
255 static Evas_Object* __cal_edit_alarm_add_button(Evas_Object *parent, struct _priv *p)
256 {
257         Evas_Object *bt;
258
259         bt = elm_button_add(parent);
260         if (!bt)
261                 return NULL;
262
263         elm_object_focus_allow_set(bt, EINA_FALSE);
264         evas_object_propagate_events_set(bt, EINA_FALSE);
265         evas_object_smart_callback_add(bt, "clicked", __cal_edit_alarm_custom_button_callback, p);
266
267         return bt;
268 }
269
270 static inline void __cal_edit_alarm_get_week_str(int week, char *buf, int sz)
271 {
272         snprintf(buf, sz, "%d %s %s", week,C_("IDS_COM_POP_WEEK_LC"), C_("IDS_CLD_BODY_BEFORE_LC"));
273 }
274
275 static inline void __cal_edit_alarm_get_day_str(int day, char *buf, int sz)
276 {
277         snprintf(buf, sz, "%d %s %s", day, C_("IDS_COM_POP_DAY_LC"), C_("IDS_CLD_BODY_BEFORE_LC"));
278 }
279
280 static inline void __cal_edit_alarm_get_hour_str(int hour, char *buf, int sz)
281 {
282         snprintf(buf, sz, "%d %s %s", hour, S_("IDS_COM_POP_HOUR_LC"), C_("IDS_CLD_BODY_BEFORE_LC"));
283 }
284
285 static inline void __cal_edit_alarm_get_min_str(int min, char *buf, int sz)
286 {
287         snprintf(buf, sz, "%d %s %s", min, S_("IDS_COM_BODY_MINUTE_LC"), C_("IDS_CLD_BODY_BEFORE_LC"));
288 }
289
290 static inline void __cal_edit_alarm_get_str(int min, char *buf, int sz)
291 {
292         if ((min % _WEEK) == 0) {
293                 __cal_edit_alarm_get_week_str(min / _WEEK, buf, sz);
294                 return;
295         }
296
297         if ((min % _DAY) == 0) {
298                 __cal_edit_alarm_get_day_str(min / _DAY, buf, sz);
299                 return;
300         }
301
302         if ((min % _HOUR) == 0) {
303                 __cal_edit_alarm_get_hour_str(min / _HOUR, buf, sz);
304                 return;
305         }
306
307         __cal_edit_alarm_get_min_str(min, buf, sz);
308 }
309
310 void cal_edit_alarm_get_alarm_str(int min, char *buf, int sz)
311 {
312         if (!buf || sz < 0)
313                 return;
314
315         if (min < 0) {
316                 g_snprintf(buf,sz,"%s",S_("IDS_COM_BODY_OFF"));
317                 return;
318         }
319
320         if (min == 0) {
321                 g_snprintf(buf,sz,"%s", C_("IDS_CLD_BODY_ON_TIME"));
322                 return;
323         }
324
325         __cal_edit_alarm_get_str(min, buf, sz);
326 }
327
328 int cal_edit_alarm_get_min(int tick, cal_sch_remind_tick_unit_t unit)
329 {
330         int min;
331
332         min = tick;
333
334         switch (unit) {
335         case CAL_SCH_TIME_UNIT_MONTH:
336                 min = min * _DAY * 30; // TODO: BUG!! not used!!
337                 break;
338         case CAL_SCH_TIME_UNIT_WEEK:
339                 min = min * _WEEK;
340                 break;
341         case CAL_SCH_TIME_UNIT_DAY:
342                 min = min * _DAY;
343                 break;
344         case CAL_SCH_TIME_UNIT_HOUR:
345                 min = min * _HOUR;
346                 break;
347         default:  // CAL_SCH_TIME_UNIT_MIN
348                 break;
349         }
350
351         return min;
352 }
353
354 void cal_edit_alarm_get_tick(int min, int *tick, cal_sch_remind_tick_unit_t *unit)
355 {
356         if (!tick || !unit)
357                 return;
358
359         if (min == -1) {
360                 *tick = -1;
361                 *unit = CAL_SCH_TIME_UNIT_MIN;
362                 return;
363         }
364
365         if ((min % _WEEK) == 0) {
366                 *tick = min / _WEEK;
367                 *unit = CAL_SCH_TIME_UNIT_WEEK;
368                 return;
369         }
370
371         if ((min % _DAY) == 0) {
372                 *tick = min / _DAY;
373                 *unit = CAL_SCH_TIME_UNIT_DAY;
374                 return;
375         }
376
377         if ((min % _HOUR) == 0) {
378                 *tick = min / _HOUR;
379                 *unit = CAL_SCH_TIME_UNIT_HOUR;
380                 return;
381         }
382
383         *tick = min;
384         *unit = CAL_SCH_TIME_UNIT_MIN;
385 }
386
387 static char *__cal_edit_alarm_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
388 {
389         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data*)data;
390         int type = (int)item_data->type;
391         char buf[1024] = {0};
392
393         if (!CAL_STRCMP(part, "elm.text"))
394         {
395                 switch ( type)
396                 {
397                 case _GTYPE_OFF:
398                 case _GTYPE_ON_TIME:
399                 case _GTYPE_5_MIN:
400                 case _GTYPE_15_MIN:
401                 case _GTYPE_1_HOUR:
402                 case _GTYPE_1_DAY:
403                 case _GTYPE_1_WEEK:
404                         cal_edit_alarm_get_alarm_str(item_data->data, buf, sizeof(buf));
405                         break;
406                 case _GTYPE_CUSTOMIZE:
407                         //return strdup(C_("IDS_CLD_BODY_CUSTOMIZE_ATNT"));
408                         break;
409                 default:
410                         break;
411                 }
412         }
413
414         if (!CAL_STRCMP(part, "elm.text.2"))
415         {
416                 if(type == _GTYPE_CUSTOMIZE)
417                 {
418                         return strdup(C_("IDS_CLD_BODY_BEFORE_LC"));
419                 }
420         }
421
422         return strdup(buf);
423 }
424
425 static void __cal_edit_alarm_genlist_item_delete_callback(void *data, Evas_Object *obj)
426 {
427         CAL_ASSERT(data);
428         cal_edit_alarm_item_data*item_data = (cal_edit_alarm_item_data*)data;
429
430         CAL_ASSERT(item_data->p);
431         struct _priv* p = item_data->p;
432
433         CAL_ASSERT(p->r_grp_member);
434         p->r_grp_member[item_data->type] = NULL;
435
436         free(item_data);
437 }
438
439 static Eina_Bool __cal_edit_alarm_get_genlist_item_state(void *data, Evas_Object *obj, const char *part)
440 {
441         return EINA_FALSE;
442 }
443
444 static void  __cal_edit_alarm_set_radio_group(struct _priv *p, Evas_Object *rd, int val)
445 {
446         if(!val)
447         {
448                 p->r_grp = rd;
449                 elm_radio_group_add(p->r_grp_member[1], p->r_grp);
450                 elm_radio_group_add(p->r_grp_member[2], p->r_grp);
451                 elm_radio_group_add(p->r_grp_member[3], p->r_grp);
452                 elm_radio_group_add(p->r_grp_member[4], p->r_grp);
453                 elm_radio_group_add(p->r_grp_member[5], p->r_grp);
454                 elm_radio_group_add(p->r_grp_member[6], p->r_grp);
455                 elm_radio_group_add(p->r_grp_member[7], p->r_grp);
456         }
457
458         elm_radio_group_add(rd, p->r_grp);
459
460 }
461
462 static Evas_Object* __cal_edit_alarm_add_radio(Evas_Object *dg, int val, struct _priv *p, cal_edit_alarm_item_data *item_data)
463 {
464         Evas_Object *ly;
465         Evas_Object *rd;
466
467         ly = cal_util_add_layout(dg, "dialoguegroup/radio");
468         if (!ly)
469                 return NULL;
470
471         char buf[1024] = {0};
472
473         cal_edit_alarm_get_alarm_str(item_data->data, buf, sizeof(buf));
474
475         edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "text", buf);
476         evas_object_show(ly);
477         evas_object_data_set(ly, "priv", p);
478         evas_object_event_callback_add(ly, EVAS_CALLBACK_MOUSE_UP, __cal_edit_alarm_clicked_callback, (void *)val);
479
480         rd = elm_radio_add(dg);
481         if (!rd) {
482                 evas_object_del(ly);
483                 return NULL;
484         }
485
486         elm_radio_state_value_set(rd, val);
487         elm_object_part_content_set(ly, "content", rd);
488         item_data->item_radio = rd;
489         *(p->r_grp_member + val) = rd;
490
491         __cal_edit_alarm_set_radio_group(p, rd, val);
492
493         return ly;
494 }
495
496 static void __cal_edit_alarm_entry_unfocused(void *data, Evas_Object *obj, void *event_info)
497 {
498         struct _priv *p = (struct _priv *)data;
499
500         char min[8] = {0,};
501         snprintf(min, 7, "%d", p->min);
502         elm_entry_entry_set(p->e_custom, min);
503 }
504
505 static void __cal_edit_alarm_title_object_visible_changed(void *data, Evas_Object *obj, void *event_info)
506 {
507         struct _priv *p = (struct _priv *)data;
508         elm_object_focus_set(p->e_custom, EINA_FALSE);
509 }
510
511 static void __cal_edit_input_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value)
512 {
513         c_retm_if(!data, "data is null");
514         struct _priv *p = data;
515
516         switch (value) {
517         case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
518                 c_retm_if(!p->b_custom, "p->b_custom is null");
519                 cal_util_get_geometry(&p->ctx_r, p->b_custom);
520                 p->is_imf_show = EINA_TRUE;
521                 break;
522         case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
523                 p->is_imf_show = EINA_FALSE;
524                 break;
525         }
526 }
527
528 static Evas_Object* __cal_edit_alarm_add_entry(Evas_Object *parent, struct _priv *p, cal_edit_alarm_item_data *item_data)
529 {
530         Evas_Object *e;
531         Ecore_IMF_Context *ic;
532
533         e = elm_entry_add(parent);
534         if (!e)
535                 return NULL;
536
537         elm_object_style_set(e, "font_color_black");
538         elm_entry_single_line_set(e, EINA_TRUE);
539         elm_entry_markup_filter_append(e, elm_entry_filter_limit_size, &_limit_2char);
540         elm_entry_markup_filter_append(e, elm_entry_filter_accept_set, &_digit_only);
541         elm_entry_input_panel_layout_set(e, ELM_INPUT_PANEL_LAYOUT_NUMBERONLY);
542         elm_entry_context_menu_disabled_set(e, EINA_TRUE);
543
544         ic = elm_entry_imf_context_get(e);
545         if (!ic)
546                 return NULL;
547
548         ecore_imf_context_input_panel_event_callback_add(ic, ECORE_IMF_INPUT_PANEL_STATE_EVENT, __cal_edit_input_panel_event_callback, p);
549
550         evas_object_smart_callback_add(e, "unfocused", __cal_edit_alarm_entry_unfocused, p);
551         evas_object_smart_callback_add(p->parent,  "titleobj,visible,changed", __cal_edit_alarm_title_object_visible_changed, p);
552         return e;
553 }
554
555 static void __cal_edit_alarm_entry_changed_callback(void *data, Evas_Object *obj, void *event_info)
556 {
557         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data *)data;
558         struct _priv *p = item_data->p;
559         const char *s = elm_entry_entry_get(p->e_custom);
560         p->min = atoi(s);
561 }
562
563 static Evas_Object* __cal_edit_alarm_add_custom_text_object(struct _priv *p, Evas_Object *dg, const char *text)
564 {
565         Evas_Object *entry = NULL;
566
567         if (!text || text[0] == '\0')
568                 return entry;
569
570         entry = elm_entry_add(dg);
571         CAL_ASSERT(entry);
572
573         elm_entry_single_line_set(entry, EINA_TRUE);
574         elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
575         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
576         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_EXPAND);
577         elm_entry_editable_set(entry, EINA_FALSE);
578         elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
579         elm_entry_autocapital_type_set(entry, EINA_TRUE);
580
581         elm_entry_entry_set(entry, text);
582
583         return entry;
584 }
585
586 static Evas_Object* __cal_edit_alarm_add_custom_layout(Evas_Object *dg, const char *text, int val, struct _priv *p, cal_edit_alarm_item_data *item_data)
587 {
588         Evas_Object *ly;
589         Evas_Object *rd;
590         Evas_Object *entry;
591         Evas_Object *bt;
592         Evas_Object *entry_custom;
593         Evas_Object *entry_before;
594
595         ly = cal_util_add_layout(dg, "dialoguegroup/alarm/custom2");
596         if (!ly)
597                 return NULL;
598
599         entry_custom = __cal_edit_alarm_add_custom_text_object(p, dg, text);
600         if (!entry_custom)
601         {
602                 evas_object_del(ly);
603                 return NULL;
604         }
605         elm_object_part_content_set(ly, "text", entry_custom);
606
607         entry_before = __cal_edit_alarm_add_custom_text_object(p, dg, C_("IDS_CLD_BODY_BEFORE_LC"));
608         if (!entry_before)
609         {
610                 evas_object_del(ly);
611                 return NULL;
612         }
613         elm_object_part_content_set(ly, "text2", entry_before);
614
615         evas_object_show(ly);
616         evas_object_data_set(ly, "priv", p);
617         evas_object_event_callback_add(ly, EVAS_CALLBACK_MOUSE_UP, __cal_edit_alarm_custom_clicked_callback, p);
618
619         rd = elm_radio_add(dg);
620         if (!rd)
621         {
622                 evas_object_del(ly);
623                 return NULL;
624         }
625
626         elm_radio_state_value_set(rd, val);
627         elm_object_part_content_set(ly, "content", rd);
628         item_data->item_radio = rd;
629         *(p->r_grp_member + val) = rd;
630
631         __cal_edit_alarm_set_radio_group(p, rd, val);
632
633         bt = __cal_edit_alarm_add_button(ly, p);
634         if (!bt)
635         {
636                 evas_object_del(ly);
637                 return NULL;
638         }
639
640         elm_object_style_set(bt, "sweep");
641         elm_object_part_content_set(ly, "button", bt);
642         p->b_custom = bt;
643         __cal_edit_alarm_set_button_label(p);
644
645         entry = __cal_edit_alarm_add_entry(ly, p, item_data);
646         if (!entry)
647         {
648                 evas_object_del(ly);
649                 return NULL;
650         }
651         elm_object_part_content_set(ly, "input_sw", entry);
652         evas_object_smart_callback_add(entry, "changed", __cal_edit_alarm_entry_changed_callback, item_data);
653         p->e_custom = entry;
654
655         return ly;
656 }
657
658
659 static void __cal_edit_alarm_set_selected_state(cal_edit_alarm_item_data *item_data)
660 {
661         struct _priv *p = item_data->p;
662         elm_radio_value_set(p->r_grp, p->selected);
663 }
664
665 static Evas_Object *__cal_edit_alarm_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
666 {
667         Evas_Object *e_obj = NULL;
668         char buf[16];
669         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data*)data;
670         struct _priv *p = item_data->p;
671
672         if (!CAL_STRCMP(part, "elm.icon"))
673         {
674                 switch ( item_data->type )
675                 {
676                 case _GTYPE_OFF:
677                 case _GTYPE_ON_TIME:
678                 case _GTYPE_5_MIN:
679                 case _GTYPE_15_MIN:
680                 case _GTYPE_1_HOUR:
681                 case _GTYPE_1_DAY:
682                 case _GTYPE_1_WEEK:
683                         e_obj = __cal_edit_alarm_add_radio(obj, item_data->type, p, item_data);
684                         __cal_edit_alarm_set_selected_state(item_data);
685                         break;
686                 case _GTYPE_CUSTOMIZE:
687                         e_obj =__cal_edit_alarm_add_custom_layout(obj, C_("IDS_COM_BODY_CUSTOMISE"), item_data->type, p, item_data);
688                         __cal_edit_alarm_set_selected_state(item_data);
689                         __cal_edit_alarm_set_button_label(p);
690                         snprintf(buf, sizeof(buf), "%d", p->min);
691                         elm_entry_entry_set(p->e_custom, buf);
692                         break;
693                 default:
694                         break;
695                 }
696         }
697         return e_obj;
698 }
699
700 static void __cal_edit_alarm_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)
701 {
702         cal_edit_alarm_item_data *item_data;
703         Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
704
705         if (it)
706                 elm_genlist_item_selected_set(it, EINA_FALSE);
707
708         item_data = (cal_edit_alarm_item_data *)elm_object_item_data_get(it);
709
710         int type = item_data->type;
711         struct _priv *p = item_data->p;
712
713         switch ( type )
714         {
715         case _GTYPE_OFF:
716         case _GTYPE_ON_TIME:
717         case _GTYPE_5_MIN:
718         case _GTYPE_15_MIN:
719         case _GTYPE_1_HOUR:
720         case _GTYPE_1_DAY:
721         case _GTYPE_1_WEEK:
722         case _GTYPE_CUSTOMIZE:
723                 if(_GTYPE_CUSTOMIZE != type)
724                         elm_object_focus_set(p->e_custom, EINA_FALSE);
725                 elm_radio_value_set(p->r_grp, type);
726                 p->selected = type;
727                 break;
728         default:
729                 break;
730         }
731
732         return;
733 }
734
735 static void __cal_edit_alarm_append_genlist_item(Evas_Object *genlist, struct _priv *p)
736 {
737         int i;
738         cal_edit_alarm_item_data *item_data;
739         for(i = 0; i < sizeof(cal_edit_alarm_item_datas)/sizeof(cal_edit_alarm_item_datas[0]); i++)
740         {
741                 CAL_CALLOC(item_data, 1, cal_edit_alarm_item_data);
742
743                 item_data->p = p;
744                 item_data->type = cal_edit_alarm_item_datas[i].type;
745                 item_data->data = cal_edit_alarm_item_datas[i].data;
746
747                 if(_GTYPE_SPEA == item_data->type)
748                 {
749                         item_data->it = elm_genlist_item_append(genlist, &itc_seperator, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
750                         elm_genlist_item_select_mode_set(item_data->it, ELM_OBJECT_SELECT_MODE_NONE);
751                 }
752                 else
753                 {
754                         if(_GTYPE_CUSTOMIZE == item_data->type)
755                         {
756                                 item_data->it = elm_genlist_item_append(genlist, &itc_1icon, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
757                         }
758                         else
759                         {
760                                 item_data->it = elm_genlist_item_append(genlist, &itc_1text_1icon, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
761                         }
762                 }
763         }
764 }
765
766 static int __cal_edit_alarm_add_alarm_content(struct _priv *p)
767 {
768         CAL_ASSERT(p);
769
770         p->sc = elm_genlist_add(p->ly);
771         CAL_ASSERT(p->sc);
772
773         Evas_Object* cf;
774
775         if(NULL != p->theme)
776                 elm_object_theme_set(p->sc, p->theme);
777
778         itc_seperator.item_style = "dialogue/seperator";
779         itc_seperator.func.text_get = NULL;
780         itc_seperator.func.state_get = __cal_edit_alarm_get_genlist_item_state;
781         itc_seperator.func.del = __cal_edit_alarm_genlist_item_delete_callback;
782
783         itc_1text_1icon.item_style = "dialogue/1text.1icon.2";
784         itc_1text_1icon.func.del = __cal_edit_alarm_genlist_item_delete_callback;
785         itc_1text_1icon.func.content_get = __cal_edit_alarm_get_genlist_item_icon;
786         itc_1text_1icon.func.text_get = __cal_edit_alarm_get_genlist_item_label;
787
788         itc_1icon.item_style = "dialogue/1icon";
789         itc_1icon.func.del = __cal_edit_alarm_genlist_item_delete_callback;
790         itc_1icon.func.content_get = __cal_edit_alarm_get_genlist_item_icon;
791         itc_1icon.func.text_get = __cal_edit_alarm_get_genlist_item_label;
792
793         itc_2text_3icon.item_style = "dialogue.2text.3icon.2";
794         itc_2text_3icon.func.text_get = __cal_edit_alarm_get_genlist_item_label;
795         itc_2text_3icon.func.del = __cal_edit_alarm_genlist_item_delete_callback;
796         itc_2text_3icon.func.content_get = __cal_edit_alarm_get_genlist_item_icon;
797
798         __cal_edit_alarm_append_genlist_item(p->sc, p);
799
800         cf = elm_conformant_add(p->ad->win);
801         CAL_ASSERT(cf);
802
803         evas_object_size_hint_weight_set(cf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
804         evas_object_show(cf);
805         elm_object_content_set(cf, p->sc);
806         elm_object_style_set(cf, "internal_layout");
807         elm_object_part_content_set(p->ly, "sw", cf);
808
809         return 0;
810 }
811
812 static void __cal_edit_alarm_set_radio(struct _priv *p, int min)
813 {
814         CAL_ASSERT(p);
815
816         switch(min)
817         {
818         case _OFF:
819                 p->selected = cal_edit_alarm_item_datas[1].type;
820                 return;
821         case 0:
822                 p->selected = cal_edit_alarm_item_datas[2].type;
823                 return;
824         case 5:
825                 p->selected = cal_edit_alarm_item_datas[3].type;
826                 return;
827         case 15:
828                 p->selected = cal_edit_alarm_item_datas[4].type;
829                 return;
830         case _HOUR:
831                 p->selected = cal_edit_alarm_item_datas[5].type;
832                 return;
833         case _DAY:
834                 p->selected = cal_edit_alarm_item_datas[6].type;
835                 return;
836         case _WEEK:
837                 p->selected = cal_edit_alarm_item_datas[7].type;
838                 return;
839         default:
840                 p->selected = cal_edit_alarm_item_datas[8].type;
841                 break;
842         }
843
844         if ((min % _WEEK) == 0)
845         {
846                 p->bt_idx = 3;
847                 min = min / _WEEK;
848         }
849         else if ((min % _DAY) == 0)
850         {
851                 p->bt_idx = 2;
852                 min = min / _DAY;
853         }
854         else if ((min % _HOUR) == 0)
855         {
856                 p->bt_idx = 1;
857                 min = min / _HOUR;
858         }
859         else
860                 p->bt_idx = 0;
861
862         p->min = min;
863 }
864
865 int cal_edit_alarm_get_alarm(Evas_Object *ly)
866 {
867         struct _priv *p;
868         int r;
869
870         CAL_ASSERT(ly);
871
872         p = CAL_UTIL_GET_PRIV_DATA(ly);
873         if (!p || CAL_STRCMP(p->name, _name))
874         {
875                 ERR("Invalid object");
876                 return -1;
877         }
878
879         if (p->selected == _GTYPE_CUSTOMIZE )
880         {
881                 const char *s = elm_entry_entry_get(p->e_custom);
882                 r = atoi(s);
883                 r = r * cal_edit_alarm_button[p->bt_idx].unit;
884         }
885         else
886                 r = cal_edit_alarm_item_datas[p->selected+1].data;
887
888         return r;
889 }
890
891 Evas_Object *cal_edit_alarm_create_view(Evas_Object *parent, int min, struct appdata* ad)
892 {
893         struct _priv *p;
894         Evas_Object *ly;
895         int r;
896
897         CAL_ASSERT(parent);
898
899         CAL_CALLOC(p, 1, struct _priv);
900
901         p->name = _name;
902         p->parent = parent;
903         p->ad = ad;
904         p->r_grp = NULL;
905         p->theme = ad->theme;
906
907         ly = cal_util_add_layout(parent, "edit");
908         if (!ly)
909         {
910                 free(p);
911                 return NULL;
912         }
913         p->ly = ly;
914
915         evas_object_data_set(ly, "priv", p);
916
917         cal_edit_alarm_button[0].label = S_("IDS_COM_BODY_MINUTE_LC");
918         cal_edit_alarm_button[1].label = S_("IDS_COM_POP_HOUR_LC");
919         cal_edit_alarm_button[2].label = C_("IDS_COM_POP_DAY_LC");
920         cal_edit_alarm_button[3].label = C_("IDS_COM_POP_WEEK_LC");
921
922         __cal_edit_alarm_set_radio(p, min);
923
924         r = __cal_edit_alarm_add_alarm_content(p);
925         if (r)
926         {
927                 evas_object_del(ly);
928                 free(p);
929                 return NULL;
930         }
931
932         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_edit_alarm_delete_layout, p);
933         return ly;
934 }