3 * Copyright 2012 Samsung Electronics Co., Ltd
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
9 * http://floralicense.org/license/
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.
19 #include <Elementary.h>
20 #include <ui-gadget.h>
25 #define DEFAULT_LOCAL_CALENDAR_COLOR "95.190.0.255"
27 #define ACCOUNT_LABLE_STRING_LENGTH 128
36 Eina_Bool is_all_calendars_visible;
38 Eina_List *phone_all_list; /*get by local account id */
40 Eina_List *phone_calendar_list; /*store type is CALENDAR_BOOK_TYPE_EVENT , default cid is DEFAULT_EVENT_CALENDAR_BOOK_ID */
42 Eina_List *phone_task_list; /*store type is CALENDAR_BOOK_TYPE_TODO, default cid is DEFAULT_TODO_CALENDAR_BOOK_ID*/
44 Eina_List *phone_birthday_list; /*store type is CALENDAR_BOOK_TYPE_EVENT , default cid is DEFAULT_BIRTHDAY_CALENDAR_BOOK_ID*/
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;
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;
68 _CAL_ACCOUNT_CREATE_CELENDAR = 0,
69 _CAL_ACCOUNT_CREATE_TASK,
70 }_CAL_ACCOUNT_CREAT_TYPE;
73 Elm_Object_Item *item;
74 cal_account_item_type type;
76 _calendar_book_color color;
78 calendar_record_h calendar_book;
79 }cal_account_item_data;
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);
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,
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,
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,
111 static Elm_Genlist_Item_Class itc_seperator = {
112 .item_style = "dialogue/separator/21/with_line",
115 static Elm_Genlist_Item_Class itc_1text = {
116 .item_style = "1text",
117 .func.content_get = NULL,
119 .func.text_get = __cal_account_popup_genlist_item_label,
122 static _calendar_book_color calendar_color;
124 extern void cal_calendar_create_layout(struct appdata *ad, int type);
126 static void __cal_account_delete_genlist_item(void *data, Evas_Object *obj)
128 c_retm_if(!data, "data is null.");
129 cal_account_item_data *item_data = data;
134 static char* __cal_account_popup_genlist_item_label(void *data, Evas_Object *obj, const char *part)
136 c_retv_if(!data || !obj || !part, NULL);
138 if (!CAL_STRCMP(part, "elm.text")) {
145 static void __cal_account_apply_calendar_changes(cal_account_data *p)
148 c_ret_if(!p->phone_all_list);
150 Eina_List *list = NULL;
151 calendar_record_h calendar = NULL;
153 calendar_error_e error = CALENDAR_ERROR_NONE;
155 EINA_LIST_FOREACH(p->phone_all_list, list, calendar) {
159 error = calendar_db_update_record(calendar);
160 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_update_record() is failed(%x)", error);
165 static void __cal_account_clear_list(cal_account_data *p)
168 c_ret_if(!p->phone_all_list);
170 Eina_List *list = NULL;
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;
179 static char* __cal_account_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
181 c_retv_if(!data, NULL);
182 c_retv_if(!obj, NULL);
184 cal_account_item_data *item_data = data;
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"));
193 case CAL_ACCOUNT_ITEM_TYPE_MY_CALENDAR:
194 if (!strcmp(part, "elm.text"))
195 return strdup(C_("IDS_CLD_BODY_MY_CALENDAR"));
198 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR:
199 if (!strcmp(part, "elm.text"))
200 return strdup(S_("IDS_COM_BODY_DEFAULT"));
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);
211 case CAL_ACCOUNT_ITEM_TYPE_MY_TASK:
212 if (!strcmp(part, "elm.text"))
213 return strdup(C_("IDS_TASK_BODY_MY_TASK"));
216 case CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_TASK:
217 if (!strcmp(part, "elm.text"))
218 return strdup(S_("IDS_COM_BODY_DEFAULT"));
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);
236 static void __cal_account_check_calendar_visible(cal_account_data *p)
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;
245 EINA_LIST_FOREACH(p->phone_all_list, list, calendar) {
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);
253 if (p->is_all_calendars_visible) {
254 p->is_all_calendars_visible = EINA_FALSE;
255 elm_genlist_item_update(p->all_calendar_item);
261 if (!p->is_all_calendars_visible) {
262 p->is_all_calendars_visible = EINA_TRUE;
263 elm_genlist_item_update(p->all_calendar_item);
267 static void __cal_account_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
272 Eina_Bool is_visible = elm_check_state_get(obj);
274 Evas_Object *parent = elm_object_parent_widget_get(obj);
277 cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(parent);
280 cal_account_item_data *item_data = data;
282 calendar_error_e error = CALENDAR_ERROR_NONE;
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);
287 __cal_account_check_calendar_visible(p);
291 static void __cal_account_update_all_calendars_visible(cal_account_data *p, Eina_Bool is_visible)
295 Eina_List *list = NULL;
296 calendar_record_h calendar = NULL;
298 calendar_error_e error = CALENDAR_ERROR_NONE;
300 EINA_LIST_FOREACH(p->phone_all_list, list, calendar) {
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);
308 elm_genlist_realized_items_update(p->genlist);
312 static void __cal_account_all_calendars_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
317 Evas_Object *parent = elm_object_parent_widget_get(obj);
320 cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(parent);
323 p->is_all_calendars_visible = !p->is_all_calendars_visible;
325 __cal_account_update_all_calendars_visible(p, p->is_all_calendars_visible);
327 p->ad->is_update_view = EINA_TRUE;
330 static void __cal_account_color_selector_changed_callback(void *data, Evas_Object *obj, void *event_info)
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);
340 static Evas_Object* __cal_account_create_colorselector(Evas_Object* parent, cal_account_data* account_data)
342 c_retvm_if(!parent, NULL, "parent is null");
343 c_retvm_if(!account_data, NULL, "account_data is null");
345 Evas_Object *selector;
347 Evas_Object *selector_layout;
349 selector_layout = cal_util_add_layout(parent, "color_selector");
350 c_retvm_if(!selector_layout, NULL, "layout is null");
352 selector = elm_colorselector_add(parent);
355 ERR("elm_colorselector_add returned null");
356 evas_object_del(selector_layout);
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;
364 rect = evas_object_rectangle_add(evas_object_evas_get(parent));
367 ERR("evas_object_rectangle_add returned null");
368 evas_object_del(selector_layout);
372 elm_object_part_content_set(selector_layout, "elm.swallow.color", rect);
373 account_data->rect = rect;
375 evas_object_smart_callback_add(selector, "changed", __cal_account_color_selector_changed_callback, rect);
377 return selector_layout;
380 static void __cal_account_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
385 Evas_Object *popup = data;
386 Evas_Object *button = obj;
388 cal_account_data* account_data = evas_object_data_get(popup, "data");
389 c_ret_if(!account_data);
391 cal_account_item_data *item_data = evas_object_data_get(popup, "item");
392 c_ret_if(!item_data);
394 calendar_record_h calendar = item_data->calendar_book;
397 if (!CAL_STRCMP(elm_object_text_get(button), S_("IDS_COM_OPT_SAVE"))) {
399 calendar_error_e error = CALENDAR_ERROR_NONE;
403 item_data->color = calendar_color;
405 snprintf(color, sizeof(color), "%d.%d.%d.%d", calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
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);
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);
413 cal_main_remove_db_changed_callback(account_data->ad);
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);
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);
421 cal_main_add_db_changed_callback(account_data->ad);
424 elm_genlist_item_update(item_data->item);
426 evas_object_del(popup);
429 static Evas_Object* __cal_account_create_popup(cal_account_data* account_data)
431 c_retv_if(!account_data, NULL);
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);
438 evas_object_propagate_events_set(popup, EINA_FALSE);
440 Evas_Object *color_selector = __cal_account_create_colorselector(popup, account_data);
442 if (!color_selector) {
443 ERR("__cal_account_create_colorselector returned null");
444 evas_object_del(popup);
448 elm_object_content_set(popup, color_selector);
453 static void __cal_account_color_clicked_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
457 cal_account_data* account_data = CAL_UTIL_GET_PRIV_DATA(obj);
458 c_ret_if(!account_data);
460 cal_account_item_data *item_data = data;
462 Evas_Object *popup = __cal_account_create_popup(account_data);
465 evas_object_data_set(popup, "item", item_data);
466 evas_object_data_set(popup, "data", account_data);
468 _calendar_get_calendar_color(item_data->calendar_book, &calendar_color);
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);
474 static Evas_Object* __cal_account_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
476 c_retv_if(!data, NULL);
477 c_retv_if(!obj, NULL);
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);
486 evas_object_propagate_events_set(check, EINA_FALSE);
488 elm_object_style_set(check, "on&off");
490 cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
493 elm_check_state_set(check, p->is_all_calendars_visible);
495 evas_object_smart_callback_add(check, "changed", __cal_account_all_calendars_check_changed_callback, item_data);
497 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
499 item_data->check = check;
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:
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);
514 cal_account_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
517 evas_object_data_set(color, "priv", p);
519 evas_object_propagate_events_set(color, EINA_FALSE);
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);
524 evas_object_event_callback_add(color, EVAS_CALLBACK_MOUSE_UP, __cal_account_color_clicked_callback, item_data);
529 if (!strcmp(part, "elm.icon.2")) {
530 Evas_Object *check = elm_check_add(obj);
531 c_retv_if(!check, NULL);
533 evas_object_propagate_events_set(check, EINA_FALSE);
535 elm_object_style_set(check, "on&off");
537 Eina_Bool is_visible = EINA_FALSE;
539 calendar_error_e error = CALENDAR_ERROR_NONE;
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);
544 elm_check_state_set(check, is_visible);
546 evas_object_smart_callback_add(check, "changed", __cal_account_check_changed_callback, item_data);
548 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
550 item_data->check = check;
564 static void __cal_account_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)
568 c_ret_if(!event_info);
570 Elm_Object_Item *item = event_info;
572 cal_account_item_data *item_data = elm_object_item_data_get(item);
573 c_ret_if(!item_data);
575 cal_account_data *account_data = CAL_UTIL_GET_PRIV_DATA(obj);
576 c_ret_if(!account_data);
578 Eina_Bool is_visible = EINA_FALSE;
580 calendar_error_e error = CALENDAR_ERROR_NONE;
582 switch (item_data->type) {
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);
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);
595 elm_genlist_item_expanded_set(item_data->item, 0);
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:
604 is_visible = !elm_check_state_get(item_data->check);
605 elm_check_state_set(item_data->check, is_visible);
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);
610 __cal_account_check_calendar_visible(account_data);
618 elm_genlist_item_selected_set(item, EINA_FALSE);
621 static void __cal_account_add_local_calendar_to_genlist(cal_account_data *p, Elm_Object_Item *item)
625 c_ret_if(!p->phone_calendar_list);
627 calendar_record_h calendar_book = NULL;
630 calendar_error_e error = CALENDAR_ERROR_NONE;
632 EINA_LIST_FOREACH(p->phone_calendar_list, l, calendar_book) {
634 cal_account_item_data *item_data = calloc(1, sizeof(cal_account_item_data));
635 c_ret_if(!item_data);
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);
644 if (cid == DEFAULT_EVENT_CALENDAR_BOOK_ID) {
645 item_data->type = CAL_ACCOUNT_ITEM_TYPE_DEFAULT_MY_CALENDAR;
647 item_data->type = CAL_ACCOUNT_ITEM_TYPE_SUB_MY_CALENDAR;
650 item_data->calendar_book = calendar_book;
651 _calendar_get_calendar_color(calendar_book, &item_data->color);
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);
658 static void __cal_account_add_local_task_to_genlist(cal_account_data *p, Elm_Object_Item *item)
662 c_ret_if(!p->phone_task_list);
664 calendar_record_h calendar_book = NULL;
667 calendar_error_e error = CALENDAR_ERROR_NONE;
669 EINA_LIST_FOREACH(p->phone_task_list, l, calendar_book) {
671 cal_account_item_data *item_data = calloc(1, sizeof(cal_account_item_data));
672 c_ret_if(!item_data);
674 error = calendar_record_get_int(calendar_book, _calendar_book.id, &cid);
675 if(error != CALENDAR_ERROR_NONE){
677 c_retm_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
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) {
686 item_data->type = CAL_ACCOUNT_ITEM_TYPE_SUB_MY_TASK;
689 item_data->calendar_book = calendar_book;
690 _calendar_get_calendar_color(calendar_book, &item_data->color);
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);
697 static void __cal_account_genlist_item_expand_callback(void *data, Evas_Object *obj, void *event_info)
700 c_ret_if(!event_info);
702 cal_account_data *p = data;
703 Elm_Object_Item *it = event_info;
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);
712 static void __cal_account_genlist_item_contract_callback(void *data, Evas_Object *obj, void *event_info)
714 c_ret_if(!event_info);
716 Elm_Object_Item *item = event_info;
718 elm_genlist_item_subitems_clear(item);
721 static void __cal_account_add_genlist(cal_account_data *account_data)
723 c_ret_if(!account_data);
725 Evas_Object *genlist = elm_genlist_add(account_data->ly);
728 evas_object_data_set(genlist, "priv", account_data);
730 elm_object_part_content_set(account_data->ly, "elm.swallow.content", genlist);
731 account_data->genlist = genlist;
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);
737 static void __cal_account_get_phone_calendar_and_task_list(cal_account_data *account_data)
739 c_ret_if(!account_data);
741 account_data->phone_all_list = _calendar_get_calendar_book_list_with_account_id(_CALENDAR_LOCAL_ACCOUNT_ID);
743 calendar_record_h calendar_book = NULL;
746 calendar_error_e error = CALENDAR_ERROR_NONE;
748 EINA_LIST_FOREACH(account_data->phone_all_list, l, calendar_book) {
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);
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);
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);
766 account_data->phone_calendar_list = eina_list_append(account_data->phone_calendar_list, calendar_book);
773 static void __cal_account_add_separator_to_genlist(cal_account_data *p)
777 Elm_Object_Item *item = elm_genlist_item_append(p->genlist, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
780 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
783 static void __cal_account_add_phone_calendar_to_genlist(cal_account_data* p)
787 __cal_account_add_separator_to_genlist(p);
789 cal_account_item_data *item_tree = calloc(1, sizeof(cal_account_item_data));
790 c_ret_if(!item_tree);
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);
797 static void __cal_account_add_phone_task_to_genlist(cal_account_data* p)
801 __cal_account_add_separator_to_genlist(p);
803 cal_account_item_data *item_tree = calloc(1, sizeof(cal_account_item_data));
804 c_ret_if(!item_tree);
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);
811 static void __cal_account_add_all_calendar_to_genlist(cal_account_data *p)
815 cal_account_item_data *item_data = calloc(1, sizeof(cal_account_item_data));
816 c_ret_if(!item_data);
818 item_data->type = CAL_ACCOUNT_ITEM_TYPE_ALL_CALENDAR;
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);
824 static void __cal_account_update_genlist(void* data)
830 cal_account_data* account_data = data;
832 __cal_account_clear_list(account_data);
834 elm_genlist_clear(account_data->genlist);
836 __cal_account_get_phone_calendar_and_task_list(account_data);
838 __cal_account_add_all_calendar_to_genlist(account_data);
840 __cal_account_add_phone_calendar_to_genlist(account_data);
842 __cal_account_add_phone_task_to_genlist(account_data);
844 __cal_account_check_calendar_visible(account_data);
848 static void __cal_account_db_changed_callback(const char* view_uri, void* user_data)
850 __cal_account_update_genlist(user_data);
853 static void __cal_account_text_refresh_callback(void *data)
857 c_retm_if(!data, "data is null");
858 cal_account_data *p = data;
860 Elm_Object_Item *navi_item = elm_naviframe_top_item_get(p->ad->naviframe);
861 c_retv_if(!navi_item, NULL);
863 elm_object_item_part_text_set(navi_item, "default", C_("IDS_CLD_HEADER_CALENDARS_TO_DISPLAY"));
865 elm_object_text_set(elm_object_item_part_content_get(navi_item, "toolbar_button1"), S_("IDS_COM_BODY_ACCOUNTS"));
867 elm_genlist_realized_items_update(p->genlist);
870 static void __cal_account_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
876 cal_account_data *account_data = data;
878 account_data->ad->current_view = CV_UNKNOWN;
880 calendar_error_e error = CALENDAR_ERROR_NONE;
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);
885 __cal_account_apply_calendar_changes(account_data);
887 __cal_account_clear_list(account_data);
889 cal_lang_manager_remove_callback(__cal_account_text_refresh_callback, account_data);
894 static Evas_Object* __cal_account_create_layout(struct appdata *ad, Evas_Object *parent)
898 c_retv_if(!ad, NULL);
899 c_retv_if(!parent, NULL);
901 cal_account_data *account_data = calloc(1, sizeof(cal_account_data));
902 c_retv_if(!account_data, NULL);
904 account_data->ad = ad;
905 account_data->is_all_calendars_visible = EINA_TRUE;
907 Evas_Object *ly = cal_util_add_layout(parent, NULL);
914 account_data->ly = ly;
915 evas_object_data_set(ly, "priv", account_data);
917 Evas_Object *bg = cal_util_add_bg(ly, EINA_TRUE);
924 elm_object_part_content_set(ly, "elm.swallow.bg", bg);
926 __cal_account_add_genlist(account_data);
928 __cal_account_update_genlist(account_data);
930 evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_account_delete_layout, account_data);
932 calendar_error_e error = CALENDAR_ERROR_NONE;
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);
940 static void __cal_account_calendar_popup_response_callback(void *data, Evas_Object *obj, void *ei)
942 c_retm_if(!data, "data is null");
944 Evas_Object *popup = data;
946 cal_account_data *account_data = evas_object_data_get(popup, "data");
948 evas_object_del(popup);
949 account_data->popup = NULL;
952 static void __cal_account_popup_genlist_calendar_selected(void *data, Evas_Object *obj, void *ei)
954 c_retm_if(!data, "data is null");
955 c_retm_if(!obj, "obj is null");
957 cal_account_data *account_data = data;
959 cal_calendar_create_layout(account_data->ad, _CAL_ACCOUNT_CREATE_CELENDAR);
961 if (account_data->popup) {
962 evas_object_del(account_data->popup);
963 account_data->popup = NULL;
967 static void __cal_account_popup_genlist_task_selected(void *data, Evas_Object *obj, void *ei)
969 c_retm_if(!data, "data is null");
970 c_retm_if(!obj, "obj is null");
972 cal_account_data *account_data = data;
974 cal_calendar_create_layout(account_data->ad, _CAL_ACCOUNT_CREATE_TASK);
976 if (account_data->popup) {
977 evas_object_del(account_data->popup);
978 account_data->popup = NULL;
982 static void __cal_account_create_button_callback(void *data, Evas_Object *obj, void *event_info)
984 c_retm_if(!data, "data is null");
985 c_retm_if(!obj, "obj is null");
987 evas_object_del(obj);
989 cal_account_data *account_data = data;
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);
995 c_retm_if(!account_data->popup, "cal_util_add_popup returned null");
996 evas_object_data_set(account_data->popup, "data", account_data);
998 Evas_Object *genlist = elm_genlist_add(account_data->popup);
999 c_retm_if(!genlist, "elm_genlist_add returned null");
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);
1005 elm_object_content_set(account_data->popup, genlist);
1006 evas_object_show(account_data->popup);
1011 static void __cal_account_edit_button_callback(void *data, Evas_Object *obj, void *event_info)
1013 c_retm_if(!data, "data is null");
1014 c_retm_if(!obj, "obj is null");
1016 evas_object_del(obj);
1018 cal_account_data *account_data = data;
1020 cal_edit_calendar_create_view(account_data->ad);
1023 static void __cal_account_more_button_callback(void *data, Evas_Object *obj, void *event_info)
1025 c_retm_if(!data, "data is null");
1026 c_retm_if(!obj, "obj is null");
1028 cal_account_data *account_data = evas_object_data_get(data, "priv");
1029 c_retm_if(!account_data, "account_data is null");
1031 struct appdata *ad = account_data->ad;
1034 Evas_Object *ctx_popup = elm_ctxpopup_add(ad->naviframe);
1035 c_ret_if(!ctx_popup);
1037 elm_ctxpopup_direction_priority_set(ctx_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP);
1039 elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_CREATE"), NULL, __cal_account_create_button_callback, account_data);
1041 elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_EDIT"), NULL, __cal_account_edit_button_callback, account_data);
1043 Evas_Coord_Rectangle r = {0};
1045 cal_util_get_geometry(&r, obj);
1047 evas_object_move(ctx_popup, r.x + r.w/2, r.y + r.h/2);
1049 evas_object_show(ctx_popup);
1053 void cal_account_create_view(struct appdata *ad, Evas_Object *parent)
1060 if (ad->current_view == CV_ACCT)
1063 ad->current_view = CV_ACCT;
1065 Evas_Object *ly = __cal_account_create_layout(ad, parent);
1068 Evas_Object *add = elm_button_add(ad->naviframe);
1070 ERR("elm_button_add returned null");
1071 evas_object_del(ly);
1075 Elm_Object_Item* navi_item = elm_naviframe_item_push(ad->naviframe, C_("IDS_CLD_HEADER_CALENDARS_TO_DISPLAY"), NULL, NULL, ly, NULL);
1077 ERR("elm_naviframe_item_push returned null");
1078 evas_object_del(add);
1079 evas_object_del(ly);
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);
1090 cal_lang_manager_add_callback(__cal_account_text_refresh_callback, account_data);