bb41d71f2eab6e9f47ae372b55701346f6cd141b
[apps/core/preloaded/calendar.git] / ug / edit / edit-alarm.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.0 (the "License");
6   *  you may not use this file except in compliance with the License.
7   *  You may obtain a copy of the License at
8   *
9   *       http://floralicense.org/license/
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17
18
19 #include "edit-alarm.h"
20 #include "radio-group.h"
21 #include "reminder.h"
22 #include "gi-radio-timepicker.h"
23 #include "save-cancel.h"
24
25 typedef struct {
26         Evas_Object *naviframe;
27         Evas_Object *ly; // self
28
29         cal_edit_alarm_changed_callback alarm_changed_callback;
30         void* alarm_changed_callback_data;
31
32         Evas_Object *sc; // scroller
33         Evas_Object *bx; // box
34
35         cal_radio_group_h radio_group;
36
37         Elm_Object_Item* on_a_day;
38
39         cal_save_cancel_h save_cancel;
40
41         Evas_Object *e_custom;
42         Evas_Object *b_custom;
43         int bt_idx;
44
45         Elm_Object_Item *pre_selected_it;
46
47         Cal_Reminder reminder;
48
49         Evas_Object *ctx;
50
51         cal_edit_alarm_type alarm_type;
52 } cal_edit_alarm_data;
53
54 struct __cal_edit_alarm_button {
55         const char *label;
56         const char *plural_label;
57         int unit;
58 };
59 static struct __cal_edit_alarm_button cal_edit_alarm_button[] = {
60         { NULL, NULL, 1, },
61         { NULL, NULL, _HOUR, },
62         { NULL, NULL, _DAY, },
63         { NULL, NULL, _WEEK, },
64 };
65
66 static Elm_Entry_Filter_Limit_Size _limit_2char = {
67         .max_char_count = 2,
68 };
69 static Elm_Entry_Filter_Accept_Set _digit_only = {
70         .accepted = "0123456789",
71 };
72
73 static Elm_Genlist_Item_Class itc_seperator, itc_1text_1icon, itc_custom;
74
75 typedef struct
76 {
77         cal_edit_alarm_data *p;
78         int type;
79         int data;
80 } cal_edit_alarm_item_data;
81
82 enum cal_edit_alarm_genlist_item_type{
83         _GTYPE_SPEA = -1,
84         _GTYPE_OFF,
85         _GTYPE_ON_TIME,
86         _GTYPE_5_MIN,
87         _GTYPE_15_MIN,
88         _GTYPE_1_HOUR,
89         _GTYPE_1_DAY,
90         _GTYPE_1_WEEK,
91         _GTYPE_CUSTOMIZE,
92         _GTYPE_ON_A_DAY,
93         _GTYPE_MAX
94 };
95
96 static void __cal_edit_alarm_custom_ctx_selected_callback(void *data, Evas_Object *obj, void *ei);
97
98 static void __cal_edit_alarm_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
99 {
100         CAL_FN_START;
101
102         cal_edit_alarm_data *p = data;
103
104         cal_radio_group_destroy(p->radio_group);
105         if (p->save_cancel)
106                 cal_save_cancel_destroy(p->save_cancel);
107
108         if (p->ctx) {
109                 evas_object_del(p->ctx);
110         }
111
112         free(p);
113 }
114
115 static void __cal_edit_alarm_clicked_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
116 {
117         cal_edit_alarm_data *p;
118         Evas_Event_Mouse_Up *ev = ei;
119         int val = (int)data;
120
121         if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
122                 return;
123
124         p = CAL_UTIL_GET_PRIV_DATA(obj);
125
126         cal_radio_group_select_radio(p->radio_group, val);
127 }
128
129 static void __cal_edit_alarm_set_custom(cal_edit_alarm_data *p)
130 {
131         elm_object_focus_set(p->e_custom, EINA_TRUE);
132         elm_entry_cursor_end_set(p->e_custom);
133 }
134
135 static inline void __cal_edit_alarm_set_button_label(cal_edit_alarm_data *p)
136 {
137         if (1 < p->reminder.alarm_value)
138                 elm_object_text_set(p->b_custom, _(cal_edit_alarm_button[p->bt_idx].plural_label));
139         else
140                 elm_object_text_set(p->b_custom, _(cal_edit_alarm_button[p->bt_idx].label));
141 }
142
143 static void __cal_edit_alarm_custom_popup_hide_callback(void *data, Evas_Object *obj, void *ei)
144 {
145         c_retm_if(!data, "data is null");
146         c_retm_if(!obj,  "obj is null");
147
148         cal_edit_alarm_data* p = data;
149         p->ctx = NULL;
150         evas_object_del(obj);
151 }
152
153 static void __cal_edit_create_ctx_popup(cal_edit_alarm_data* p)
154 {
155         c_retm_if(!p, "p is NULL.");
156
157         Evas_Object *ctx = p->ctx;
158
159         if (ctx)
160                 evas_object_del(ctx);
161
162         p->ctx = elm_ctxpopup_add(p->naviframe);
163         c_retm_if(!p->ctx, "elm_ctxpopup_add(p->ad->naviframe) returned null");
164         elm_object_focus_allow_set(p->ctx, EINA_FALSE);
165
166         ctx = p->ctx;
167         evas_object_data_set(ctx, "priv", p);
168
169         evas_object_smart_callback_add(ctx, "dismissed", __cal_edit_alarm_custom_popup_hide_callback, p);
170         elm_ctxpopup_item_append(ctx, S_("IDS_COM_BODY_MINUTE_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)0);
171         elm_ctxpopup_item_append(ctx, S_("IDS_COM_POP_HOUR_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)1);
172         elm_ctxpopup_item_append(ctx, C_("IDS_COM_POP_DAY_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)2);
173         elm_ctxpopup_item_append(ctx, C_("IDS_COM_POP_WEEK_LC"), NULL, __cal_edit_alarm_custom_ctx_selected_callback, (const void *)3);
174 }
175
176 static void __cal_edit_alarm_custom_button_callback(void *data, Evas_Object *obj, void *ei)
177 {
178         cal_edit_alarm_data* p = data;
179         c_retm_if(!p, "p is null");
180
181         __cal_edit_create_ctx_popup(p);
182         c_retm_if(!p->ctx, "p is NULL.");
183         Evas_Coord x, y, w, h;
184         evas_object_geometry_get(p->b_custom, &x, &y, &w, &h);
185         evas_object_move(p->ctx, x+w/2, y);
186         evas_object_show(p->ctx);
187 }
188
189 static void __cal_edit_alarm_custom_ctx_selected_callback(void *data, Evas_Object *obj, void *ei)
190 {
191         cal_edit_alarm_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
192         c_retm_if(!p, "p is NULL.");
193
194         int index = (int)data;
195         p->bt_idx = index;
196         __cal_edit_alarm_set_button_label(p);
197
198         __cal_edit_alarm_set_custom(p);
199         cal_radio_group_select_radio(p->radio_group, _GTYPE_CUSTOMIZE);
200         __cal_edit_alarm_custom_popup_hide_callback(p,p->ctx,ei);
201 }
202
203 static Evas_Object* __cal_edit_alarm_add_button(Evas_Object *parent, cal_edit_alarm_data *p)
204 {
205         Evas_Object *bt;
206
207         bt = elm_button_add(parent);
208         if (!bt)
209                 return NULL;
210
211         elm_object_focus_allow_set(bt, EINA_FALSE);
212         evas_object_propagate_events_set(bt, EINA_FALSE);
213         evas_object_smart_callback_add(bt, "clicked", __cal_edit_alarm_custom_button_callback, p);
214
215         return bt;
216 }
217
218 static char *__cal_edit_alarm_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
219 {
220         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data*)data;
221         int type = (int)item_data->type;
222         char buf[1024] = {0};
223
224         if (!CAL_STRCMP(part, "elm.text"))
225         {
226                 Cal_Reminder reminder;
227                 switch (type)
228                 {
229                 case _GTYPE_OFF:
230                         reminder.tick_unit = CALENDAR_ALARM_NONE;
231                         reminder.alarm_value = 0;
232                         cal_reminder_get_string(&reminder, buf, sizeof(buf));
233                         break;
234                 case _GTYPE_ON_TIME:
235                 case _GTYPE_5_MIN:
236                 case _GTYPE_15_MIN:
237                 case _GTYPE_1_HOUR:
238                 case _GTYPE_1_DAY:
239                 case _GTYPE_1_WEEK:
240                         reminder.tick_unit = CALENDAR_ALARM_TIME_UNIT_MINUTE;
241                         reminder.alarm_value = item_data->data;
242                         cal_reminder_get_string(&reminder, buf, sizeof(buf));
243                         break;
244                 case _GTYPE_CUSTOMIZE:
245                         break;
246                 case _GTYPE_ON_A_DAY:
247                 default:
248                         // error
249                         break;
250                 }
251         }
252
253         return strdup(buf);
254 }
255
256 static char *__cal_edit_alarm_get_genlist_item_custom_label(void *data, Evas_Object *obj, const char *part)
257 {
258         return strdup(C_("IDS_CLD_BODY_BEFORE_LC"));
259 }
260
261 static void __cal_edit_alarm_genlist_item_delete_callback(void *data, Evas_Object *obj)
262 {
263         CAL_ASSERT(data);
264         cal_edit_alarm_item_data*item_data = (cal_edit_alarm_item_data*)data;
265
266         CAL_ASSERT(item_data->p);
267
268         free(item_data);
269 }
270
271 static Eina_Bool __cal_edit_alarm_get_genlist_item_state(void *data, Evas_Object *obj, const char *part)
272 {
273         return EINA_FALSE;
274 }
275
276 static Evas_Object* __cal_edit_alarm_add_radio(Evas_Object *dg, int val, cal_edit_alarm_data *p, cal_edit_alarm_item_data *item_data)
277 {
278         Evas_Object *rd;
279
280         rd = elm_radio_add(dg);
281         c_retvm_if(!rd, NULL, "rd is NULL");
282
283         elm_object_part_content_set(rd, "content", rd);
284         cal_radio_group_set_radio_object(p->radio_group, val, rd);
285
286         evas_object_show(rd);
287         evas_object_data_set(rd, "priv", p);
288         evas_object_event_callback_add(rd, EVAS_CALLBACK_MOUSE_UP, __cal_edit_alarm_clicked_callback, (void *)val);
289
290         return rd;
291 }
292
293 static void __cal_edit_alarm_entry_unfocused(void *data, Evas_Object *obj, void *event_info)
294 {
295         cal_edit_alarm_data *p = (cal_edit_alarm_data *)data;
296
297         char min[8] = {0,};
298         snprintf(min, 7, "%d", p->reminder.alarm_value);
299         elm_entry_entry_set(p->e_custom, min);
300 }
301
302 static Evas_Object* __cal_edit_alarm_add_entry(Evas_Object *parent, cal_edit_alarm_data *p, cal_edit_alarm_item_data *item_data)
303 {
304         Evas_Object *e;
305         Ecore_IMF_Context *ic;
306
307         e = elm_entry_add(parent);
308         if (!e)
309                 return NULL;
310
311         elm_object_style_set(e, "font_color_black");
312         elm_entry_single_line_set(e, EINA_TRUE);
313         elm_entry_markup_filter_append(e, elm_entry_filter_limit_size, &_limit_2char);
314         elm_entry_markup_filter_append(e, elm_entry_filter_accept_set, &_digit_only);
315         elm_entry_input_panel_layout_set(e, ELM_INPUT_PANEL_LAYOUT_NUMBERONLY);
316         elm_entry_context_menu_disabled_set(e, EINA_TRUE);
317
318         ic = elm_entry_imf_context_get(e);
319         if (!ic)
320                 return NULL;
321
322         cal_save_cancel_set_input_panel_callback_for_ug(p->save_cancel, e);
323
324         evas_object_smart_callback_add(e, "unfocused", __cal_edit_alarm_entry_unfocused, p);
325
326         elm_entry_text_style_user_push(e, "DEFAULT='align=center'");
327
328         return e;
329 }
330
331 static void __cal_edit_alarm_entry_changed_callback(void *data, Evas_Object *obj, void *event_info)
332 {
333         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data *)data;
334         cal_edit_alarm_data *p = item_data->p;
335         const char *s = elm_entry_entry_get(p->e_custom);
336         p->reminder.alarm_value = atoi(s);
337
338         __cal_edit_alarm_set_button_label(p);
339 }
340
341 static void __cal_edit_alarm_customize_radio_changed_cb(unsigned int index, bool selected, void* data)
342 {
343         cal_edit_alarm_data *p = (cal_edit_alarm_data*)data;
344         if (selected) {
345                 elm_object_focus_set(p->e_custom, EINA_TRUE);
346                 elm_entry_cursor_end_set(p->e_custom);
347         } else {
348                 elm_object_focus_set(p->e_custom, EINA_FALSE);
349         }
350 }
351
352 static Evas_Object* __cal_edit_alarm_get_genlist_item_custom_icon(void *data, Evas_Object *obj, const char *part)
353 {
354         c_retvm_if(!data, NULL, "data is null");
355         c_retvm_if(!obj, NULL, "obj is null");
356
357         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data*)data;
358         cal_edit_alarm_data *p = item_data->p;
359
360         if (!CAL_STRCMP(part, "radio")) {
361                 Evas_Object *rd = elm_radio_add(obj);
362                 c_retv_if(!rd, NULL);
363                 cal_radio_group_set_radio_object(p->radio_group, item_data->type, rd);
364                 cal_radio_group_set_changed_callback(p->radio_group, item_data->type, __cal_edit_alarm_customize_radio_changed_cb, p);
365                 return rd;
366         } else if (!CAL_STRCMP(part, "button")) {
367                 Evas_Object *bt = __cal_edit_alarm_add_button(obj, p);
368                 c_retv_if(!bt, NULL);
369                 elm_object_style_set(bt, "sweep");
370                 elm_object_part_content_set(obj, "", bt);
371                 p->b_custom = bt;
372                 __cal_edit_alarm_set_button_label(p);
373                 return bt;
374         } else if (!CAL_STRCMP(part, "input_sw")) {
375                 Evas_Object *entry = __cal_edit_alarm_add_entry(obj, p, item_data);
376                 c_retv_if(!entry, NULL);
377                 evas_object_smart_callback_add(entry, "changed", __cal_edit_alarm_entry_changed_callback, item_data);
378                 char buf[16];
379                 if (cal_radio_group_get_selected_radio(p->radio_group) == _GTYPE_CUSTOMIZE)
380                         snprintf(buf, sizeof(buf), "%d", p->reminder.alarm_value);
381                 else
382                         snprintf(buf, sizeof(buf), "%d", 0);
383                 elm_entry_entry_set(entry, buf);
384                 p->e_custom = entry;
385                 return entry;
386         } else {
387                 c_retvm_if(1, NULL, "part %s unattended for", part);
388         }
389         return NULL;
390 }
391
392 static Evas_Object *__cal_edit_alarm_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
393 {
394         c_retvm_if(!data, NULL, "data is null");
395         c_retvm_if(!obj, NULL, "obj is null");
396
397         Evas_Object *e_obj = NULL;
398         cal_edit_alarm_item_data *item_data = (cal_edit_alarm_item_data*)data;
399         cal_edit_alarm_data *p = item_data->p;
400
401         if (!CAL_STRCMP(part, "elm.icon")) {
402                 e_obj = __cal_edit_alarm_add_radio(obj, item_data->type, p, item_data);
403         }
404
405         return e_obj;
406 }
407
408 static void __cal_edit_alarm_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)
409 {
410         CAL_FN_START;
411
412         cal_edit_alarm_item_data *item_data;
413         Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
414
415         if (it)
416                 elm_genlist_item_selected_set(it, EINA_FALSE);
417
418         item_data = (cal_edit_alarm_item_data *)elm_object_item_data_get(it);
419
420         int type = item_data->type;
421         cal_edit_alarm_data *p = item_data->p;
422
423         switch ( type )
424         {
425         case _GTYPE_OFF:
426         case _GTYPE_ON_TIME:
427         case _GTYPE_5_MIN:
428         case _GTYPE_15_MIN:
429         case _GTYPE_1_HOUR:
430         case _GTYPE_1_DAY:
431         case _GTYPE_1_WEEK:
432         case _GTYPE_CUSTOMIZE:
433                 cal_radio_group_select_radio(p->radio_group, type);
434                 break;
435         default:
436                 break;
437         }
438
439         return;
440 }
441
442 static void __cal_edit_alarm_append_genlist_item_event(
443                                 Evas_Object *genlist, cal_edit_alarm_data *p, int type, int data)
444 {
445         cal_edit_alarm_item_data *item_data;
446         CAL_CALLOC(item_data, 1, cal_edit_alarm_item_data);
447
448         item_data->p = p;
449         item_data->type = type;
450         item_data->data = data;
451
452         if(_GTYPE_SPEA == type) {
453                 Elm_Object_Item *it = elm_genlist_item_append(genlist, &itc_seperator, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
454                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
455         } else {
456                 if(_GTYPE_CUSTOMIZE == item_data->type)
457                         elm_genlist_item_append(genlist, &itc_custom, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
458                 else
459                         elm_genlist_item_append(genlist, &itc_1text_1icon, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
460         }
461 }
462
463 static void __cal_edit_alarm_append_genlist_item_todo(Evas_Object *genlist, cal_edit_alarm_data *p, int type, int data)
464 {
465         cal_edit_alarm_item_data *item_data;
466         CAL_CALLOC(item_data, 1, cal_edit_alarm_item_data);
467
468         item_data->p = p;
469         item_data->type = type;
470         item_data->data = data;
471
472         if(_GTYPE_SPEA == item_data->type) {
473                 Elm_Object_Item *it = elm_genlist_item_append(genlist, &itc_seperator, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
474                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
475         } else {
476                 if(p->alarm_type == ALARM_TYPE_TODO_CUSTOM_ONLY) {
477                         if(_GTYPE_OFF == item_data->type)
478                                 elm_genlist_item_append(genlist, &itc_1text_1icon, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
479                         else
480                                 free(item_data);
481                 }
482                 else {
483                         if(_GTYPE_CUSTOMIZE == item_data->type)
484                                 elm_genlist_item_append(genlist, &itc_custom, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
485                         else if(_GTYPE_5_MIN == item_data->type || _GTYPE_15_MIN == item_data->type || _GTYPE_1_HOUR == item_data->type)
486                                 free(item_data);
487                         else
488                                 elm_genlist_item_append(genlist, &itc_1text_1icon, (void*)item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_edit_alarm_genlist_item_select_callback, NULL);
489                 }
490         }
491 }
492
493 static void __cal_edit_alarm_genlist_realized_callback(void *data, Evas_Object *obj, void *ei)
494 {
495         cal_edit_alarm_item_data *item_data = elm_object_item_data_get((Elm_Object_Item *)ei);
496         c_ret_if(!item_data);
497
498         if (item_data->type == _GTYPE_OFF) {
499                 elm_object_item_signal_emit((Elm_Object_Item *)ei, "elm,state,top", "");
500                 return;
501         }
502
503         cal_edit_alarm_data *p = item_data->p;
504
505         if (p && p->alarm_type == ALARM_TYPE_EVENT) {
506                 if (item_data->type == _GTYPE_CUSTOMIZE)
507                         elm_object_item_signal_emit((Elm_Object_Item *)ei, "elm,state,bottom", "");
508                 else
509                         elm_object_item_signal_emit((Elm_Object_Item *)ei, "elm,state,center", "");
510         } else {
511                 if (item_data->type == _GTYPE_ON_A_DAY)
512                         elm_object_item_signal_emit((Elm_Object_Item *)ei, "elm,state,bottom", "");
513                 else
514                         elm_object_item_signal_emit((Elm_Object_Item *)ei, "elm,state,center", "");
515         }
516 }
517
518 static int __cal_edit_alarm_add_alarm_content(cal_edit_alarm_data *p)
519 {
520         CAL_ASSERT(p);
521
522         p->sc = elm_genlist_add(p->ly);
523         CAL_ASSERT(p->sc);
524
525         evas_object_smart_callback_add(p->sc, "realized", __cal_edit_alarm_genlist_realized_callback, NULL);
526
527         itc_seperator.item_style = "dialogue/separator/21/with_line";
528         itc_seperator.func.text_get = NULL;
529         itc_seperator.func.state_get = __cal_edit_alarm_get_genlist_item_state;
530         itc_seperator.func.del = __cal_edit_alarm_genlist_item_delete_callback;
531
532         itc_1text_1icon.item_style = "dialogue/1text.1icon.2";
533         itc_1text_1icon.func.del = __cal_edit_alarm_genlist_item_delete_callback;
534         itc_1text_1icon.func.content_get = __cal_edit_alarm_get_genlist_item_icon;
535         itc_1text_1icon.func.text_get = __cal_edit_alarm_get_genlist_item_label;
536
537         itc_custom.item_style = "dialogue/3icon.1text.custom";
538         itc_custom.func.del = __cal_edit_alarm_genlist_item_delete_callback;
539         itc_custom.func.content_get = __cal_edit_alarm_get_genlist_item_custom_icon;
540         itc_custom.func.text_get = __cal_edit_alarm_get_genlist_item_custom_label;
541
542         if(p->alarm_type == ALARM_TYPE_EVENT) {
543                 p->radio_group = cal_radio_group_create(_GTYPE_MAX - 1, p->sc);
544                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_SPEA, 0);
545                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_OFF, -1);
546                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_ON_TIME, 0);
547                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_5_MIN, 5);
548                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_15_MIN, 15);
549                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_1_HOUR, _HOUR);
550                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_1_DAY, _DAY);
551                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_1_WEEK, _WEEK);
552                 __cal_edit_alarm_append_genlist_item_event(p->sc, p, _GTYPE_CUSTOMIZE, 0);
553         } else {
554                 p->radio_group = cal_radio_group_create(_GTYPE_MAX, p->sc);
555                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_SPEA, 0);
556                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_OFF, -1);
557                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_ON_TIME, 0);
558                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_5_MIN, 5);
559                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_15_MIN, 15);
560                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_1_HOUR, _HOUR);
561                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_1_DAY, _DAY);
562                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_1_WEEK, _WEEK);
563                 __cal_edit_alarm_append_genlist_item_todo(p->sc, p, _GTYPE_CUSTOMIZE, 0);
564                 p->on_a_day = cal_genlist_item_radio_timepicker_add(p->sc, p->radio_group, _GTYPE_ON_A_DAY,
565                                                 p->reminder.tick_unit == CALENDAR_ALARM_TIME_UNIT_SPECIFIC, &p->reminder.datetime, p);
566         }
567
568         elm_object_part_content_set(p->ly, "sw", p->sc);
569
570         return 0;
571 }
572
573 static void __cal_edit_alarm_set_radio(cal_edit_alarm_data *p, const Cal_Reminder* reminder)
574 {
575         CAL_ASSERT(p);
576
577         p->reminder = *reminder;
578
579         switch(reminder->tick_unit)
580         {
581         case CALENDAR_ALARM_NONE:
582                 cal_radio_group_select_radio(p->radio_group, _GTYPE_OFF);
583                 return;
584         case CALENDAR_ALARM_TIME_UNIT_SPECIFIC:
585                 cal_radio_group_select_radio(p->radio_group, _GTYPE_ON_A_DAY);
586                 return;
587         case CALENDAR_ALARM_TIME_UNIT_MINUTE:
588                 break;
589         default:
590                 // error
591                 return;
592         }
593
594         switch(reminder->alarm_value)
595         {
596         case 0:
597                 cal_radio_group_select_radio(p->radio_group, _GTYPE_ON_TIME);
598                 return;
599         case 5:
600                 cal_radio_group_select_radio(p->radio_group, _GTYPE_5_MIN);
601                 return;
602         case 15:
603                 cal_radio_group_select_radio(p->radio_group, _GTYPE_15_MIN);
604                 return;
605         case _HOUR:
606                 cal_radio_group_select_radio(p->radio_group, _GTYPE_1_HOUR);
607                 return;
608         case _DAY:
609                 cal_radio_group_select_radio(p->radio_group, _GTYPE_1_DAY);
610                 return;
611         case _WEEK:
612                 cal_radio_group_select_radio(p->radio_group, _GTYPE_1_WEEK);
613                 return;
614         default:
615                 cal_radio_group_select_radio(p->radio_group, _GTYPE_CUSTOMIZE);
616                 break;
617         }
618
619         int min = reminder->alarm_value;
620
621         if ((min % _WEEK) == 0)
622         {
623                 p->bt_idx = 3;
624                 min = min / _WEEK;
625         }
626         else if ((min % _DAY) == 0)
627         {
628                 p->bt_idx = 2;
629                 min = min / _DAY;
630         }
631         else if ((min % _HOUR) == 0)
632         {
633                 p->bt_idx = 1;
634                 min = min / _HOUR;
635         }
636         else
637                 p->bt_idx = 0;
638
639         p->reminder.alarm_value = min;
640 }
641
642 static void __cal_edit_alarm_save_button_callback(void *data, Evas_Object *obj, void *event_info)
643 {
644         CAL_FN_START;
645
646         cal_edit_alarm_data *p = data;
647
648         if (p->alarm_changed_callback) {
649
650                 int selected = cal_radio_group_get_selected_radio(p->radio_group);
651
652                 p->reminder.tick_unit = CALENDAR_ALARM_TIME_UNIT_MINUTE;
653                 switch (selected) {
654                 case _GTYPE_OFF:
655                         p->reminder.tick_unit = CALENDAR_ALARM_NONE;
656                         break;
657                 case _GTYPE_ON_TIME:
658                         p->reminder.alarm_value = 0;
659                         break;
660                 case _GTYPE_5_MIN:
661                         p->reminder.alarm_value = 5;
662                         break;
663                 case _GTYPE_15_MIN:
664                         p->reminder.alarm_value = 15;
665                         break;
666                 case _GTYPE_1_HOUR:
667                         p->reminder.alarm_value = _HOUR;
668                         break;
669                 case _GTYPE_1_DAY:
670                         p->reminder.alarm_value = _DAY;
671                         break;
672                 case _GTYPE_1_WEEK:
673                         p->reminder.alarm_value = _WEEK;
674                         break;
675                 case _GTYPE_ON_A_DAY:
676                         p->reminder.tick_unit = CALENDAR_ALARM_TIME_UNIT_SPECIFIC;
677                         cal_genlist_item_radio_timepicker_get_time(p->on_a_day, &p->reminder.datetime);
678                         break;
679                 case _GTYPE_CUSTOMIZE:
680                         p->reminder.alarm_value *= cal_edit_alarm_button[p->bt_idx].unit;
681                         break;
682                 default:
683                         // error
684                         break;
685                 }
686
687                 p->alarm_changed_callback(&p->reminder, p->alarm_changed_callback_data);
688         }
689         elm_naviframe_item_pop(p->naviframe);
690 }
691
692 static void __cal_edit_alarm_cancel_button_callback(void *data, Evas_Object *obj, void *event_info)
693 {
694         CAL_FN_START;
695 }
696
697 Evas_Object *cal_edit_alarm_create_view(Evas_Object *naviframe, const Cal_Reminder* reminder, cal_edit_alarm_type alarm_type,
698                                                                                                                                                         cal_edit_alarm_changed_callback alarm_changed_callback, void* callback_data)
699 {
700         c_retvm_if(!naviframe, NULL, "naviframe is null");
701
702         cal_edit_alarm_data *p;
703         Evas_Object *ly;
704         int r;
705
706         p = calloc(1, sizeof(cal_edit_alarm_data));
707         c_retvm_if(!p, NULL, "p is null");
708
709         p->naviframe = naviframe;
710         p->alarm_changed_callback = alarm_changed_callback;
711         p->alarm_changed_callback_data = callback_data;
712         p->alarm_type = alarm_type;
713
714         ly = cal_util_add_layout(naviframe, "edit");
715         if (!ly) {
716                 free(p);
717                 return NULL;
718         }
719         p->ly = ly;
720
721         evas_object_data_set(ly, "priv", p);
722
723         Elm_Object_Item* navi_item = elm_naviframe_item_push(p->naviframe, C_("IDS_CLD_BODY_REMINDER"), NULL, NULL, ly, NULL);
724         c_retv_if(!navi_item, NULL);
725
726         p->save_cancel = cal_save_cancel_create(p->naviframe, NULL,
727                                         __cal_edit_alarm_save_button_callback,
728                                         __cal_edit_alarm_cancel_button_callback, p);
729
730         cal_edit_alarm_button[0].plural_label = C_("IDS_TMR_BODY_MINS_LC_ABB");
731         cal_edit_alarm_button[1].plural_label = C_("IDS_CHATON_BODY_HOURS_LC_ABB");
732         cal_edit_alarm_button[2].plural_label = C_("IDS_CHATON_BODY_DAYS_LC_ABB");
733         cal_edit_alarm_button[3].plural_label = C_("IDS_COM_POP_WEEKS_LC");
734
735         cal_edit_alarm_button[0].label = C_("IDS_TMR_OPT_MIN_LC_ABB");
736         cal_edit_alarm_button[1].label = C_("IDS_CLD_BODY_HOUR_LC_ABB");
737         cal_edit_alarm_button[2].label = C_("IDS_CLD_BODY_DAY_LC_ABB");
738         cal_edit_alarm_button[3].label = C_("IDS_CLD_BODY_WEEK_LC_ABB");
739
740         r = __cal_edit_alarm_add_alarm_content(p);
741         if (r) {
742                 evas_object_del(ly);
743                 free(p);
744                 return NULL;
745         }
746
747         __cal_edit_alarm_set_radio(p, reminder);
748
749         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_edit_alarm_delete_layout, p);
750
751         return ly;
752 }