Tizen 2.1 base
[apps/core/preloaded/calendar.git] / src / view-acct.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 <Elementary.h>
20 #include <ui-gadget.h>
21
22 #include "view.h"
23 #include "acct-svc.h"
24
25 #define DEFAULT_LOCAL_CALENDAR_COLOR "95.190.0.255"
26
27 #define ACCOUNT_LABLE_STRING_LENGTH 128
28
29 typedef struct {
30         const char *name;
31         struct appdata *ad;
32         Evas_Object *ly;
33
34         Evas_Object *genlist;
35
36         Eina_Bool is_all_calendars_visible;
37
38         Eina_List *phone_all_list; /*get by local account id */
39
40         Eina_List *phone_calendar_list; /*store type is CALENDAR_BOOK_TYPE_EVENT , default  cid is DEFAULT_EVENT_CALENDAR_BOOK_ID */
41
42         Eina_List *phone_task_list; /*store type is CALENDAR_BOOK_TYPE_TODO, default  cid is DEFAULT_TODO_CALENDAR_BOOK_ID*/
43
44         Eina_List *phone_birthday_list; /*store type is CALENDAR_BOOK_TYPE_EVENT , default cid is DEFAULT_BIRTHDAY_CALENDAR_BOOK_ID*/
45
46         Evas_Object* color;
47         Evas_Object* rect;
48         Evas_Object  *popup;
49
50         Elm_Object_Item *all_calendar_item;
51         Elm_Object_Item *calendar_item;
52         Elm_Object_Item *task_item;
53         Elm_Object_Item *web_account_item;
54 } cal_account_data;
55
56 typedef enum {
57         CAL_ACCOUNT_ITEM_TYPE_ALL_CALENDAR = 0,
58         CAL_ACCOUNT_ITEM_TYPE_MY_CALENDAR,
59         CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR,
60         CAL_ACCOUNT_ITEM_TYPE_SUB_MY_CALENDAR,
61         CAL_ACCOUNT_ITEM_TYPE_MY_TASK,
62         CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_TASK,
63         CAL_ACCOUNT_ITEM_TYPE_SUB_MY_TASK,
64         CAL_ACCOUNT_ITEM_TYPE_MAX,
65 }cal_account_item_type;
66
67 typedef enum{
68         _CAL_ACCOUNT_CREATE_CELENDAR = 0,
69         _CAL_ACCOUNT_CREATE_TASK,
70 }_CAL_ACCOUNT_CREAT_TYPE;
71
72 typedef struct {
73         Elm_Object_Item *item;
74         cal_account_item_type type;
75         Evas_Object *check;
76         _calendar_book_color color;
77         struct _acct *at;
78         calendar_record_h calendar_book;
79 }cal_account_item_data;
80
81 static char* __cal_account_get_genlist_item_label(void *, Evas_Object *, const char *);
82 static Evas_Object* __cal_account_get_genlist_item_icon(void *, Evas_Object *, const char *);
83 static void __cal_account_db_changed_callback(const char* view_uri, void* user_data);
84 static void __cal_account_popup_response_callback(void *data, Evas_Object *obj, void *event_info);
85 static char* __cal_account_popup_genlist_item_label(void *data, Evas_Object *obj, const char *part);
86 static void __cal_account_delete_genlist_item(void *data, Evas_Object *obj);
87 extern void cal_edit_calendar_create_view(struct appdata *ad);
88
89
90 static Elm_Genlist_Item_Class itc_1text_1icon = {
91         .item_style = "1text.1icon",
92         .func.del = __cal_account_delete_genlist_item,
93         .func.text_get = __cal_account_get_genlist_item_label,
94         .func.content_get = __cal_account_get_genlist_item_icon,
95 };
96
97 static Elm_Genlist_Item_Class itc_1text_expandable = {
98         .item_style = "dialogue/1text/expandable",
99         .func.del = __cal_account_delete_genlist_item,
100         .func.text_get = __cal_account_get_genlist_item_label,
101         .func.content_get = __cal_account_get_genlist_item_icon,
102 };
103
104 static Elm_Genlist_Item_Class itc_dialogue_1text_2icon = {
105         .item_style = "dialogue/1text.2icon",
106         .func.del = __cal_account_delete_genlist_item,
107         .func.text_get = __cal_account_get_genlist_item_label,
108         .func.content_get = __cal_account_get_genlist_item_icon,
109 };
110
111 static Elm_Genlist_Item_Class itc_seperator = {
112         .item_style = "dialogue/separator/21/with_line",
113 };
114
115 static Elm_Genlist_Item_Class itc_1text = {
116         .item_style = "1text",
117         .func.content_get = NULL,
118         .func.del = NULL,
119         .func.text_get = __cal_account_popup_genlist_item_label,
120 };
121
122 static _calendar_book_color calendar_color;
123
124 extern void  cal_calendar_create_layout(struct appdata *ad, int type);
125
126 static void __cal_account_delete_genlist_item(void *data, Evas_Object *obj)
127 {
128         c_retm_if(!data, "data is null.");
129         cal_account_item_data *item_data = data;
130         free(item_data);
131 }
132
133
134 static char* __cal_account_popup_genlist_item_label(void *data, Evas_Object *obj, const char *part)
135 {
136         c_retv_if(!data || !obj || !part, NULL);
137
138         if (!CAL_STRCMP(part, "elm.text")) {
139                 return strdup(data);
140         }
141
142         return NULL;
143 }
144
145 static void __cal_account_apply_calendar_changes(cal_account_data *p)
146 {
147         c_ret_if(!p);
148         c_ret_if(!p->phone_all_list);
149
150         Eina_List *list = NULL;
151         calendar_record_h calendar = NULL;
152
153         calendar_error_e error = CALENDAR_ERROR_NONE;
154
155         EINA_LIST_FOREACH(p->phone_all_list, list, calendar) {
156                 if (!calendar)
157                         continue;
158
159                 error = calendar_db_update_record(calendar);
160                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_update_record() is failed(%x)", error);
161         }
162
163 }
164
165 static void __cal_account_clear_list(cal_account_data *p)
166 {
167         c_ret_if(!p);
168         c_ret_if(!p->phone_all_list);
169
170         Eina_List *list = NULL;
171
172         _calendar_free_record_list(&p->phone_all_list);
173         p->phone_calendar_list = NULL;
174         p->phone_task_list = NULL;
175         p->phone_birthday_list = NULL;
176
177 }
178
179 static char* __cal_account_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
180 {
181         c_retv_if(!data, NULL);
182         c_retv_if(!obj, NULL);
183
184         cal_account_item_data *item_data = data;
185         char *name = NULL;
186         switch (item_data->type) {
187                 case CAL_ACCOUNT_ITEM_TYPE_ALL_CALENDAR:
188                         if (!strcmp(part, "elm.text"))
189                                 return strdup(C_("IDS_CLD_BODY_ALL_CALENDAR"));
190
191                         break;
192
193                 case CAL_ACCOUNT_ITEM_TYPE_MY_CALENDAR:
194                         if (!strcmp(part, "elm.text"))
195                                 return strdup(C_("IDS_CLD_BODY_MY_CALENDAR"));
196
197                         break;
198                 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR:
199                         if (!strcmp(part, "elm.text"))
200                                 return strdup(S_("IDS_COM_BODY_DEFAULT"));
201                         break;
202                 case CAL_ACCOUNT_ITEM_TYPE_SUB_MY_CALENDAR:
203                         if (!strcmp(part, "elm.text")) {
204                                 calendar_error_e error = CALENDAR_ERROR_NONE;
205                                 error = calendar_record_get_str(item_data->calendar_book, _calendar_book.name, &name);
206                                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_str_p() is failed(%x)", error);
207                                 return name;
208                         }
209                         break;
210
211                 case CAL_ACCOUNT_ITEM_TYPE_MY_TASK:
212                         if (!strcmp(part, "elm.text"))
213                                 return strdup(C_("IDS_TASK_BODY_MY_TASK"));
214
215                         break;
216                 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_TASK:
217                         if (!strcmp(part, "elm.text"))
218                                 return strdup(S_("IDS_COM_BODY_DEFAULT"));
219                         break;
220                 case CAL_ACCOUNT_ITEM_TYPE_SUB_MY_TASK:
221                         if (!strcmp(part, "elm.text")) {
222                                 calendar_error_e error = CALENDAR_ERROR_NONE;
223                                 error = calendar_record_get_str(item_data->calendar_book, _calendar_book.name, &name);
224                                 c_retvm_if(error != CALENDAR_ERROR_NONE, NULL, "calendar_record_get_str() is failed(%x)", error);
225                                 return name;
226                         }
227                         break;
228
229                 default:
230                         return NULL;
231         }
232
233         return NULL;
234 }
235
236 static void __cal_account_check_calendar_visible(cal_account_data *p)
237 {
238         c_ret_if(!p);
239
240         Eina_List *list = NULL;
241         calendar_record_h calendar = NULL;
242         calendar_error_e error = CALENDAR_ERROR_NONE;
243         Eina_Bool is_visible= EINA_FALSE;
244
245         EINA_LIST_FOREACH(p->phone_all_list, list, calendar) {
246                 if (!calendar)
247                         continue;
248
249                 error = calendar_record_get_int(calendar, _calendar_book.visibility, (int *)&is_visible);
250                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
251
252                 if (!is_visible) {
253                         if (p->is_all_calendars_visible) {
254                                 p->is_all_calendars_visible = EINA_FALSE;
255                                 elm_genlist_item_update(p->all_calendar_item);
256                         }
257                         return;
258                 }
259         }
260
261         if (!p->is_all_calendars_visible) {
262                 p->is_all_calendars_visible = EINA_TRUE;
263                 elm_genlist_item_update(p->all_calendar_item);
264         }
265 }
266
267 static void __cal_account_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
268 {
269         c_ret_if(!data);
270         c_ret_if(!obj);
271
272         Eina_Bool is_visible = elm_check_state_get(obj);
273
274         Evas_Object *parent = elm_object_parent_widget_get(obj);
275         c_ret_if(!parent);
276
277         cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(parent);
278         c_ret_if(!p);
279
280         cal_account_item_data *item_data = data;
281
282         calendar_error_e error = CALENDAR_ERROR_NONE;
283
284         error = calendar_record_set_int(item_data->calendar_book, _calendar_book.visibility, is_visible);
285         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
286
287         __cal_account_check_calendar_visible(p);
288
289 }
290
291 static void __cal_account_update_all_calendars_visible(cal_account_data *p, Eina_Bool is_visible)
292 {
293         c_ret_if(!p);
294
295         Eina_List *list = NULL;
296         calendar_record_h calendar = NULL;
297
298         calendar_error_e error = CALENDAR_ERROR_NONE;
299
300         EINA_LIST_FOREACH(p->phone_all_list, list, calendar) {
301                 if (!calendar)
302                         continue;
303
304                 error = calendar_record_set_int(calendar, _calendar_book.visibility, (int )is_visible);
305                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
306         }
307
308         elm_genlist_realized_items_update(p->genlist);
309
310 }
311
312 static void __cal_account_all_calendars_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
313 {
314         c_ret_if(!data);
315         c_ret_if(!obj);
316
317         Evas_Object *parent = elm_object_parent_widget_get(obj);
318         c_ret_if(!parent);
319
320         cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(parent);
321         c_ret_if(!p);
322
323         p->is_all_calendars_visible = !p->is_all_calendars_visible;
324
325         __cal_account_update_all_calendars_visible(p, p->is_all_calendars_visible);
326
327         p->ad->is_update_view = EINA_TRUE;
328 }
329
330 static void __cal_account_color_selector_changed_callback(void *data, Evas_Object *obj, void *event_info)
331 {
332         c_ret_if(!data);
333         c_ret_if(!obj);
334
335         Evas_Object *rect = data;
336         elm_colorselector_color_get(obj, &calendar_color.red, &calendar_color.green, &calendar_color.blue, &calendar_color.alpha);
337         evas_object_color_set(rect, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
338 }
339
340 static Evas_Object* __cal_account_create_colorselector(Evas_Object* parent, cal_account_data* account_data)
341 {
342         c_retvm_if(!parent, NULL, "parent is null");
343         c_retvm_if(!account_data, NULL, "account_data is null");
344
345         Evas_Object *selector;
346         Evas_Object *rect;
347         Evas_Object *selector_layout;
348
349         selector_layout = cal_util_add_layout(parent, "color_selector");
350         c_retvm_if(!selector_layout, NULL, "layout is null");
351
352         selector = elm_colorselector_add(parent);
353         if (!selector)
354         {
355                 ERR("elm_colorselector_add returned null");
356                 evas_object_del(selector_layout);
357                 return NULL;
358         }
359
360         elm_colorselector_mode_set(selector, ELM_COLORSELECTOR_COMPONENTS);
361         elm_object_part_content_set(selector_layout, "elm.swallow.selector", selector);
362         account_data->color = selector;
363
364         rect = evas_object_rectangle_add(evas_object_evas_get(parent));
365         if (!selector)
366         {
367                 ERR("evas_object_rectangle_add returned null");
368                 evas_object_del(selector_layout);
369                 return NULL;
370         }
371
372         elm_object_part_content_set(selector_layout, "elm.swallow.color", rect);
373         account_data->rect = rect;
374
375         evas_object_smart_callback_add(selector, "changed", __cal_account_color_selector_changed_callback, rect);
376
377         return selector_layout;
378 }
379
380 static void __cal_account_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
381 {
382         c_ret_if(!data);
383         c_ret_if(!obj);
384
385         Evas_Object *popup = data;
386         Evas_Object *button = obj;
387
388         cal_account_data* account_data = evas_object_data_get(popup, "data");
389         c_ret_if(!account_data);
390
391         cal_account_item_data *item_data = evas_object_data_get(popup, "item");
392         c_ret_if(!item_data);
393
394         calendar_record_h calendar = item_data->calendar_book;
395         c_ret_if(!calendar);
396
397         if (!CAL_STRCMP(elm_object_text_get(button), S_("IDS_COM_OPT_SAVE"))) {
398
399                 calendar_error_e error = CALENDAR_ERROR_NONE;
400
401                 char color[16] ={0};
402
403                 item_data->color = calendar_color;
404
405                 snprintf(color, sizeof(color), "%d.%d.%d.%d", calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
406
407                 error = calendar_record_set_str(item_data->calendar_book, _calendar_book.color, color);
408                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_str() is failed(%x)", error);
409
410                 error = calendar_db_remove_changed_cb(_calendar_book._uri, __cal_account_db_changed_callback, account_data);
411                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_add_changed_cb() is failed(%x)", error);
412
413                 cal_main_remove_db_changed_callback(account_data->ad);
414
415                 error = calendar_db_update_record(item_data->calendar_book);
416                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_update_record() is failed(%x)", error);
417
418                 error = calendar_db_add_changed_cb(_calendar_book._uri, __cal_account_db_changed_callback, account_data);
419                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_add_changed_cb() is failed(%x)", error);
420
421                 cal_main_add_db_changed_callback(account_data->ad);
422         }
423
424         elm_genlist_item_update(item_data->item);
425
426         evas_object_del(popup);
427 }
428
429 static Evas_Object* __cal_account_create_popup(cal_account_data* account_data)
430 {
431         c_retv_if(!account_data, NULL);
432
433         Evas_Object *popup = cal_util_add_popup(account_data->ad->win, NULL, NULL, NULL,
434                 __cal_account_popup_response_callback, account_data,
435                 S_("IDS_COM_OPT_SAVE"), S_("IDS_IDLE_BUTTON_CANCEL"), NULL);
436         c_retv_if(!popup, NULL);
437
438         evas_object_propagate_events_set(popup, EINA_FALSE);
439
440         Evas_Object *color_selector = __cal_account_create_colorselector(popup, account_data);
441
442         if (!color_selector) {
443                 ERR("__cal_account_create_colorselector returned null");
444                 evas_object_del(popup);
445                 return NULL;
446         }
447
448         elm_object_content_set(popup, color_selector);
449
450         return popup;
451 }
452
453 static void __cal_account_color_clicked_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
454 {
455         c_ret_if(!data);
456         c_ret_if(!obj);
457         cal_account_data* account_data = CAL_UTIL_GET_PRIV_DATA(obj);
458         c_ret_if(!account_data);
459
460         cal_account_item_data *item_data = data;
461
462         Evas_Object *popup = __cal_account_create_popup(account_data);
463         c_ret_if(!popup);
464
465         evas_object_data_set(popup, "item", item_data);
466         evas_object_data_set(popup, "data", account_data);
467
468         _calendar_get_calendar_color(item_data->calendar_book, &calendar_color);
469
470         elm_colorselector_color_set(account_data->color, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
471         evas_object_color_set(account_data->rect,calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
472 }
473
474 static Evas_Object* __cal_account_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
475 {
476         c_retv_if(!data, NULL);
477         c_retv_if(!obj, NULL);
478
479         cal_account_item_data *item_data = data;
480         switch (item_data->type) {
481                 case CAL_ACCOUNT_ITEM_TYPE_ALL_CALENDAR:
482                         if (!strcmp(part, "elm.icon")) {
483                                 Evas_Object *check = elm_check_add(obj);
484                                 c_retv_if(!check, NULL);
485
486                                 evas_object_propagate_events_set(check, EINA_FALSE);
487
488                                 elm_object_style_set(check, "on&off");
489
490                                 cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
491                                 c_retv_if(!p, NULL);
492
493                                 elm_check_state_set(check, p->is_all_calendars_visible);
494
495                                 evas_object_smart_callback_add(check, "changed", __cal_account_all_calendars_check_changed_callback, item_data);
496
497                                 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
498
499                                 item_data->check = check;
500
501                                 return check;
502
503                         }
504                         break;
505                 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR:
506                 case CAL_ACCOUNT_ITEM_TYPE_SUB_MY_CALENDAR:
507                 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_TASK:
508                 case CAL_ACCOUNT_ITEM_TYPE_SUB_MY_TASK:
509
510                         if (!strcmp(part, "elm.icon.1")) {
511                                 Evas_Object *color = evas_object_rectangle_add(evas_object_evas_get(obj));
512                                 c_retv_if(!color, NULL);
513
514                                 cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
515                                 c_retv_if(!p, NULL);
516
517                                 evas_object_data_set(color, "priv", p);
518
519                                 evas_object_propagate_events_set(color, EINA_FALSE);
520
521                                 evas_object_size_hint_align_set(color, EVAS_HINT_FILL, EVAS_HINT_FILL);
522                                 evas_object_color_set(color, item_data->color.red, item_data->color.green, item_data->color.blue, item_data->color.alpha);
523
524                                 evas_object_event_callback_add(color, EVAS_CALLBACK_MOUSE_UP, __cal_account_color_clicked_callback, item_data);
525
526                                 return color;
527                         }
528
529                         if (!strcmp(part, "elm.icon.2")) {
530                                 Evas_Object *check = elm_check_add(obj);
531                                 c_retv_if(!check, NULL);
532
533                                 evas_object_propagate_events_set(check, EINA_FALSE);
534
535                                 elm_object_style_set(check, "on&off");
536
537                                 Eina_Bool is_visible = EINA_FALSE;
538
539                                 calendar_error_e error = CALENDAR_ERROR_NONE;
540
541                                 error = calendar_record_get_int(item_data->calendar_book, _calendar_book.visibility, (int *)&is_visible);
542                                 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
543
544                                 elm_check_state_set(check, is_visible);
545
546                                 evas_object_smart_callback_add(check, "changed", __cal_account_check_changed_callback, item_data);
547
548                                 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
549
550                                 item_data->check = check;
551
552                                 return check;
553                         }
554
555                         break;
556
557                 default:
558                         return NULL;
559         }
560
561         return NULL;
562 }
563
564 static void __cal_account_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)
565 {
566         c_ret_if(!data);
567         c_ret_if(!obj);
568         c_ret_if(!event_info);
569
570         Elm_Object_Item *item = event_info;
571
572         cal_account_item_data *item_data = elm_object_item_data_get(item);
573         c_ret_if(!item_data);
574
575         cal_account_data *account_data = CAL_UTIL_GET_PRIV_DATA(obj);
576         c_ret_if(!account_data);
577
578         Eina_Bool is_visible = EINA_FALSE;
579
580         calendar_error_e error = CALENDAR_ERROR_NONE;
581
582         switch (item_data->type) {
583
584                 case CAL_ACCOUNT_ITEM_TYPE_ALL_CALENDAR:
585                         account_data->is_all_calendars_visible = !account_data->is_all_calendars_visible;
586                         __cal_account_update_all_calendars_visible(account_data, account_data->is_all_calendars_visible);
587
588                         break;
589                 case CAL_ACCOUNT_ITEM_TYPE_MY_CALENDAR:
590                 case CAL_ACCOUNT_ITEM_TYPE_MY_TASK:
591                         elm_genlist_item_selected_set(item_data->item,0);
592                         if(0 == elm_genlist_item_expanded_get(item_data->item)) {
593                                 elm_genlist_item_expanded_set(item_data->item, 1);
594                         } else {
595                                 elm_genlist_item_expanded_set(item_data->item, 0);
596                         }
597                         break;
598
599                 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR:
600                 case CAL_ACCOUNT_ITEM_TYPE_SUB_MY_CALENDAR:
601                 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_TASK:
602                 case CAL_ACCOUNT_ITEM_TYPE_SUB_MY_TASK:
603
604                         is_visible = !elm_check_state_get(item_data->check);
605                         elm_check_state_set(item_data->check, is_visible);
606
607                         error = calendar_record_set_int(item_data->calendar_book, _calendar_book.visibility, (int)is_visible);
608                         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", is_visible);
609
610                         __cal_account_check_calendar_visible(account_data);
611
612                         break;
613
614                 default:
615                         break;
616         }
617
618         elm_genlist_item_selected_set(item, EINA_FALSE);
619 }
620
621 static void __cal_account_add_local_calendar_to_genlist(cal_account_data *p, Elm_Object_Item *item)
622 {
623         c_ret_if(!p);
624         c_ret_if(!item);
625         c_ret_if(!p->phone_calendar_list);
626
627         calendar_record_h calendar_book = NULL;
628         Eina_List *l = NULL;
629         int cid;
630         calendar_error_e error = CALENDAR_ERROR_NONE;
631
632         EINA_LIST_FOREACH(p->phone_calendar_list, l, calendar_book) {
633                 if (calendar_book) {
634                         cal_account_item_data *item_data = calloc(1, sizeof(cal_account_item_data));
635                         c_ret_if(!item_data);
636
637                         error = calendar_record_get_int(calendar_book, _calendar_book.id, &cid);
638                         if(error != CALENDAR_ERROR_NONE){
639                                 ERR("calendar_record_get_int() is failed(%x)", error);
640                                 free(item_data);
641                                 return;
642                         }
643
644                         if (cid == DEFAULT_EVENT_CALENDAR_BOOK_ID) {
645                                 item_data->type = CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR;
646                         } else {
647                                 item_data->type = CAL_ACCOUNT_ITEM_TYPE_SUB_MY_CALENDAR;
648                         }
649
650                         item_data->calendar_book = calendar_book;
651                         _calendar_get_calendar_color(calendar_book, &item_data->color);
652
653                         item_data->item = elm_genlist_item_append(p->genlist, &itc_dialogue_1text_2icon, item_data, item, ELM_GENLIST_ITEM_NONE, __cal_account_genlist_item_select_callback, item_data);
654                 }
655         }
656 }
657
658 static void __cal_account_add_local_task_to_genlist(cal_account_data *p, Elm_Object_Item *item)
659 {
660         c_ret_if(!p);
661         c_ret_if(!item);
662         c_ret_if(!p->phone_task_list);
663
664         calendar_record_h calendar_book = NULL;
665         Eina_List *l = NULL;
666         int cid;
667         calendar_error_e error = CALENDAR_ERROR_NONE;
668
669         EINA_LIST_FOREACH(p->phone_task_list, l, calendar_book) {
670                 if (calendar_book) {
671                         cal_account_item_data *item_data = calloc(1, sizeof(cal_account_item_data));
672                         c_ret_if(!item_data);
673
674                         error = calendar_record_get_int(calendar_book, _calendar_book.id, &cid);
675                         if(error != CALENDAR_ERROR_NONE){
676                                 free(item_data);
677                                 c_retm_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
678                         }
679
680                         if (cid == DEFAULT_TODO_CALENDAR_BOOK_ID) {
681                                 item_data->type = CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_TASK;
682                         } else if (cid == DEFAULT_BIRTHDAY_CALENDAR_BOOK_ID) {
683                                 free(item_data);
684                                 continue;
685                         } else {
686                                 item_data->type = CAL_ACCOUNT_ITEM_TYPE_SUB_MY_TASK;
687                         }
688
689                         item_data->calendar_book = calendar_book;
690                         _calendar_get_calendar_color(calendar_book, &item_data->color);
691
692                         item_data->item = elm_genlist_item_append(p->genlist, &itc_dialogue_1text_2icon, item_data, item, ELM_GENLIST_ITEM_NONE, __cal_account_genlist_item_select_callback, item_data);
693                 }
694         }
695 }
696
697 static void __cal_account_genlist_item_expand_callback(void *data, Evas_Object *obj, void *event_info)
698 {
699         c_ret_if(!data);
700         c_ret_if(!event_info);
701
702         cal_account_data *p = data;
703         Elm_Object_Item *it = event_info;
704
705         if (it == p->calendar_item) {
706                 __cal_account_add_local_calendar_to_genlist(p, it);
707         } else if (it == p->task_item) {
708                 __cal_account_add_local_task_to_genlist(p, it);
709         }
710 }
711
712 static void __cal_account_genlist_item_contract_callback(void *data, Evas_Object *obj, void *event_info)
713 {
714         c_ret_if(!event_info);
715
716         Elm_Object_Item *item = event_info;
717
718         elm_genlist_item_subitems_clear(item);
719 }
720
721 static void __cal_account_add_genlist(cal_account_data *account_data)
722 {
723         c_ret_if(!account_data);
724
725         Evas_Object *genlist = elm_genlist_add(account_data->ly);
726         c_ret_if(!genlist);
727
728         evas_object_data_set(genlist, "priv", account_data);
729
730         elm_object_part_content_set(account_data->ly, "elm.swallow.content", genlist);
731         account_data->genlist = genlist;
732
733         evas_object_smart_callback_add(genlist, "expanded", __cal_account_genlist_item_expand_callback, account_data);
734         evas_object_smart_callback_add(genlist, "contracted", __cal_account_genlist_item_contract_callback, account_data);
735 }
736
737 static void __cal_account_get_phone_calendar_and_task_list(cal_account_data *account_data)
738 {
739         c_ret_if(!account_data);
740
741         account_data->phone_all_list = _calendar_get_calendar_book_list_with_account_id(_CALENDAR_LOCAL_ACCOUNT_ID);
742
743         calendar_record_h calendar_book = NULL;
744         Eina_List *l = NULL;
745         int cid;
746         calendar_error_e error = CALENDAR_ERROR_NONE;
747
748         EINA_LIST_FOREACH(account_data->phone_all_list, l, calendar_book) {
749
750                 int store_type = 0;
751                 error = calendar_record_get_int(calendar_book, _calendar_book.store_type, &store_type);
752                 if (error != CALENDAR_ERROR_NONE) {
753                         ERR("calendar_record_get_int() is failed(%x)", calendar_book);
754                         continue;
755                 }
756
757                 error = calendar_record_get_int(calendar_book, _calendar_book.id, &cid);
758                 c_retm_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
759
760                 if (store_type == CALENDAR_BOOK_TYPE_TODO) {
761                         account_data->phone_task_list = eina_list_append(account_data->phone_task_list, calendar_book);
762                 } else if (store_type == CALENDAR_BOOK_TYPE_EVENT) {
763                         if (cid == DEFAULT_BIRTHDAY_CALENDAR_BOOK_ID) {
764                                 account_data->phone_birthday_list = eina_list_append(account_data->phone_birthday_list, calendar_book);
765                         } else {
766                                 account_data->phone_calendar_list = eina_list_append(account_data->phone_calendar_list, calendar_book);
767                         }
768                 }
769
770         }
771 }
772
773 static void __cal_account_add_separator_to_genlist(cal_account_data *p)
774 {
775         c_ret_if(!p);
776
777         Elm_Object_Item *item = elm_genlist_item_append(p->genlist, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
778         c_ret_if(!item);
779
780         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
781 }
782
783 static void __cal_account_add_phone_calendar_to_genlist(cal_account_data* p)
784 {
785         c_ret_if(!p);
786
787         __cal_account_add_separator_to_genlist(p);
788
789         cal_account_item_data *item_tree = calloc(1, sizeof(cal_account_item_data));
790         c_ret_if(!item_tree);
791
792         item_tree->type = CAL_ACCOUNT_ITEM_TYPE_MY_CALENDAR;
793         p->calendar_item = item_tree->item = elm_genlist_item_append(p->genlist, &itc_1text_expandable, item_tree, NULL, ELM_GENLIST_ITEM_TREE, __cal_account_genlist_item_select_callback, item_tree);
794
795 }
796
797 static void __cal_account_add_phone_task_to_genlist(cal_account_data* p)
798 {
799         c_ret_if(!p);
800
801         __cal_account_add_separator_to_genlist(p);
802
803         cal_account_item_data *item_tree = calloc(1, sizeof(cal_account_item_data));
804         c_ret_if(!item_tree);
805
806         item_tree->type = CAL_ACCOUNT_ITEM_TYPE_MY_TASK;
807         p->task_item = item_tree->item = elm_genlist_item_append(p->genlist, &itc_1text_expandable, item_tree, NULL, ELM_GENLIST_ITEM_TREE, __cal_account_genlist_item_select_callback, item_tree);
808
809 }
810
811 static void __cal_account_add_all_calendar_to_genlist(cal_account_data *p)
812 {
813         c_ret_if(!p);
814
815         cal_account_item_data *item_data = calloc(1, sizeof(cal_account_item_data));
816         c_ret_if(!item_data);
817
818         item_data->type = CAL_ACCOUNT_ITEM_TYPE_ALL_CALENDAR;
819
820         p->all_calendar_item = item_data->item = elm_genlist_item_append(p->genlist, &itc_1text_1icon, item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_account_genlist_item_select_callback, item_data);
821         c_ret_if(!item_data->item);
822 }
823
824 static void __cal_account_update_genlist(void* data)
825 {
826         CAL_FN_START;
827
828         c_ret_if(!data);
829
830         cal_account_data* account_data = data;
831
832         __cal_account_clear_list(account_data);
833
834         elm_genlist_clear(account_data->genlist);
835
836         __cal_account_get_phone_calendar_and_task_list(account_data);
837
838         __cal_account_add_all_calendar_to_genlist(account_data);
839
840         __cal_account_add_phone_calendar_to_genlist(account_data);
841
842         __cal_account_add_phone_task_to_genlist(account_data);
843
844         __cal_account_check_calendar_visible(account_data);
845
846 }
847
848 static void __cal_account_db_changed_callback(const char* view_uri, void* user_data)
849 {
850         __cal_account_update_genlist(user_data);
851 }
852
853 static void __cal_account_text_refresh_callback(void *data)
854 {
855         CAL_FN_START;
856
857         c_retm_if(!data, "data is null");
858         cal_account_data *p = data;
859
860         Elm_Object_Item *navi_item = elm_naviframe_top_item_get(p->ad->naviframe);
861         c_retv_if(!navi_item, NULL);
862
863         elm_object_item_part_text_set(navi_item, "default", C_("IDS_CLD_HEADER_CALENDARS_TO_DISPLAY"));
864
865         elm_object_text_set(elm_object_item_part_content_get(navi_item, "toolbar_button1"), S_("IDS_COM_BODY_ACCOUNTS"));
866
867         elm_genlist_realized_items_update(p->genlist);
868 }
869
870 static void __cal_account_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
871 {
872         CAL_FN_START;
873
874         c_ret_if(!data);
875
876         cal_account_data *account_data = data;
877
878         account_data->ad->current_view = CV_UNKNOWN;
879
880         calendar_error_e error = CALENDAR_ERROR_NONE;
881
882         error = calendar_db_remove_changed_cb(_calendar_book._uri, __cal_account_db_changed_callback, account_data);
883         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_remove_db_changed_cb() is failed(%x)", error);
884
885         __cal_account_apply_calendar_changes(account_data);
886
887         __cal_account_clear_list(account_data);
888
889         cal_lang_manager_remove_callback(__cal_account_text_refresh_callback, account_data);
890
891         free(account_data);
892 }
893
894 static Evas_Object* __cal_account_create_layout(struct appdata *ad, Evas_Object *parent)
895 {
896         CAL_FN_START;
897
898         c_retv_if(!ad, NULL);
899         c_retv_if(!parent, NULL);
900
901         cal_account_data *account_data = calloc(1, sizeof(cal_account_data));
902         c_retv_if(!account_data, NULL);
903
904         account_data->ad = ad;
905         account_data->is_all_calendars_visible = EINA_TRUE;
906
907         Evas_Object *ly = cal_util_add_layout(parent, NULL);
908         if (!ly) {
909                 ERR("ly is NULL");
910                 free(account_data);
911                 return NULL;
912         }
913
914         account_data->ly = ly;
915         evas_object_data_set(ly, "priv", account_data);
916
917         Evas_Object *bg = cal_util_add_bg(ly, EINA_TRUE);
918         if (!bg) {
919                 ERR("bg is NULL");
920                 free(account_data);
921                 return NULL;
922         }
923
924         elm_object_part_content_set(ly, "elm.swallow.bg", bg);
925
926         __cal_account_add_genlist(account_data);
927
928         __cal_account_update_genlist(account_data);
929
930         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_account_delete_layout, account_data);
931
932         calendar_error_e error = CALENDAR_ERROR_NONE;
933
934         error = calendar_db_add_changed_cb(_calendar_book._uri, __cal_account_db_changed_callback, account_data);
935         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_add_changed_cb() is failed(%x)", error);
936
937         return ly;
938 }
939
940 static void __cal_account_calendar_popup_response_callback(void *data, Evas_Object *obj, void *ei)
941 {
942         c_retm_if(!data, "data is null");
943
944         Evas_Object *popup = data;
945
946         cal_account_data *account_data = evas_object_data_get(popup, "data");
947
948         evas_object_del(popup);
949         account_data->popup = NULL;
950 }
951
952 static void __cal_account_popup_genlist_calendar_selected(void *data, Evas_Object *obj, void *ei)
953 {
954         c_retm_if(!data, "data is null");
955         c_retm_if(!obj, "obj is null");
956
957         cal_account_data *account_data = data;
958
959         cal_calendar_create_layout(account_data->ad, _CAL_ACCOUNT_CREATE_CELENDAR);
960
961         if (account_data->popup) {
962                 evas_object_del(account_data->popup);
963                 account_data->popup = NULL;
964         }
965 }
966
967 static void __cal_account_popup_genlist_task_selected(void *data, Evas_Object *obj, void *ei)
968 {
969         c_retm_if(!data, "data is null");
970         c_retm_if(!obj, "obj is null");
971
972         cal_account_data *account_data = data;
973
974         cal_calendar_create_layout(account_data->ad, _CAL_ACCOUNT_CREATE_TASK);
975
976         if (account_data->popup) {
977                 evas_object_del(account_data->popup);
978                 account_data->popup = NULL;
979         }
980 }
981
982 static void __cal_account_create_button_callback(void *data, Evas_Object *obj, void *event_info)
983 {
984         c_retm_if(!data, "data is null");
985         c_retm_if(!obj, "obj is null");
986
987         evas_object_del(obj);
988
989         cal_account_data *account_data = data;
990
991         account_data->popup = cal_util_add_popup(account_data->ad->win, "menustyle", S_("IDS_COM_BODY_CREATE"), NULL,
992                                 __cal_account_calendar_popup_response_callback, account_data,
993                                 S_("IDS_COM_SK_CANCEL"),  NULL);
994
995         c_retm_if(!account_data->popup, "cal_util_add_popup returned null");
996         evas_object_data_set(account_data->popup, "data", account_data);
997
998         Evas_Object *genlist = elm_genlist_add(account_data->popup);
999         c_retm_if(!genlist, "elm_genlist_add returned null");
1000
1001         elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_CALENDAR"), NULL, ELM_GENLIST_ITEM_NONE, __cal_account_popup_genlist_calendar_selected, account_data);
1002         elm_genlist_item_append(genlist, &itc_1text, C_("IDS_CLD_BODY_TASK"), NULL, ELM_GENLIST_ITEM_NONE, __cal_account_popup_genlist_task_selected, account_data);
1003
1004
1005         elm_object_content_set(account_data->popup, genlist);
1006         evas_object_show(account_data->popup);
1007
1008 }
1009
1010
1011 static void __cal_account_edit_button_callback(void *data, Evas_Object *obj, void *event_info)
1012 {
1013         c_retm_if(!data, "data is null");
1014         c_retm_if(!obj, "obj is null");
1015
1016         evas_object_del(obj);
1017
1018         cal_account_data *account_data = data;
1019
1020         cal_edit_calendar_create_view(account_data->ad);
1021 }
1022
1023 static void __cal_account_more_button_callback(void *data, Evas_Object *obj, void *event_info)
1024 {
1025         c_retm_if(!data, "data is null");
1026         c_retm_if(!obj, "obj is null");
1027
1028         cal_account_data *account_data = evas_object_data_get(data, "priv");
1029         c_retm_if(!account_data, "account_data is null");
1030
1031         struct appdata *ad = account_data->ad;
1032         c_ret_if(!ad);
1033
1034         Evas_Object *ctx_popup = elm_ctxpopup_add(ad->naviframe);
1035         c_ret_if(!ctx_popup);
1036
1037         elm_ctxpopup_direction_priority_set(ctx_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP);
1038
1039         elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_CREATE"), NULL, __cal_account_create_button_callback, account_data);
1040
1041         elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_EDIT"), NULL, __cal_account_edit_button_callback, account_data);
1042
1043         Evas_Coord_Rectangle r = {0};
1044
1045         cal_util_get_geometry(&r, obj);
1046
1047         evas_object_move(ctx_popup, r.x + r.w/2, r.y + r.h/2);
1048
1049         evas_object_show(ctx_popup);
1050 }
1051
1052
1053 void cal_account_create_view(struct appdata *ad, Evas_Object *parent)
1054 {
1055         CAL_FN_START;
1056
1057         c_ret_if(!ad);
1058         c_ret_if(!parent);
1059
1060         if (ad->current_view == CV_ACCT)
1061                 return;
1062
1063         ad->current_view = CV_ACCT;
1064
1065         Evas_Object *ly = __cal_account_create_layout(ad, parent);
1066         c_ret_if(!ly);
1067
1068         Evas_Object *add = elm_button_add(ad->naviframe);
1069         if (!add) {
1070                 ERR("elm_button_add returned null");
1071                 evas_object_del(ly);
1072                 return;
1073         }
1074
1075         Elm_Object_Item* navi_item = elm_naviframe_item_push(ad->naviframe, C_("IDS_CLD_HEADER_CALENDARS_TO_DISPLAY"), NULL, NULL, ly, NULL);
1076         if (!navi_item) {
1077                 ERR("elm_naviframe_item_push returned null");
1078                 evas_object_del(add);
1079                 evas_object_del(ly);
1080                 return;
1081         }
1082
1083         cal_account_data *account_data = evas_object_data_get(ly, "priv");
1084         if (!account_data) {
1085                 ERR("elm_naviframe_item_push returned null");
1086                 evas_object_del(add);
1087                 evas_object_del(ly);
1088         }
1089
1090         cal_lang_manager_add_callback(__cal_account_text_refresh_callback, account_data);
1091
1092 }