3 Copyright (c) 2000-2012 Samsung Electronics Co., Ltd All Rights Reserved
5 This file is part of org.tizen.efl-calendar
6 Written by Taeho Kang <taeho84.kang@samsung.com>
8 PROPRIETARY/CONFIDENTIAL
10 This software is the confidential and proprietary information of
11 SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
12 disclose such Confidential Information and shall use it only in
13 accordance with the terms of the license agreement you entered
14 into with SAMSUNG ELECTRONICS.
16 SAMSUNG make no representations or warranties about the suitability
17 of the software, either express or implied, including but not limited
18 to the implied warranties of merchantability, fitness for a particular
19 purpose, or non-infringement. SAMSUNG shall not be liable for any
20 damages suffered by licensee as a result of using, modifying or
21 distributing this software or its derivatives.
26 #include <Elementary.h>
27 #include <ui-gadget.h>
32 #define DEFAULT_LOCAL_CALENDAR_COLOR "95.190.0.255"
34 #define ACCOUNT_LABLE_STRING_LENGTH 128
37 static const char *_name = "acct";
44 Evas_Object *ly_phone;
50 Evas_Object* color_selector;
60 static char* __cal_account_get_genlist_item_label(void *, Evas_Object *, const char *);
61 static Evas_Object* __cal_account_get_genlist_item_icon(void *, Evas_Object *, const char *);
62 static void __cal_account_update_genlist(void* data);
63 static void __cal_account_popup_response_callback(void *data, Evas_Object *obj, void *event_info);
65 static Elm_Genlist_Item_Class itc = {
66 .item_style = "2text.3icon.3",
67 .func.text_get = __cal_account_get_genlist_item_label,
68 .func.content_get = __cal_account_get_genlist_item_icon,
69 .decorate_all_item_style = "edit_default",
72 static struct _acct def_at = { LOCAL_ACCOUNT_ID, "Local account", "/opt/apps/org.tizen.efl-calendar/res/icons/all_calendar.png", NULL, NULL, };
74 static Calendar_color calendar_color;
76 static void __cal_account_set_selected_count_label(void *data)
78 c_retm_if(!data, "data is null");
80 cal_account_data *account_data = data;
82 if (account_data->selected_count <= 0)
84 if (account_data->notify)
85 evas_object_hide(account_data->notify);
90 struct appdata *ad = account_data->ad;
91 c_retm_if(!ad, "appdata is null");
93 Evas_Object *nv = ad->nv;
94 c_retm_if(!nv, "nv is null");
96 Evas_Object *notify = NULL;
97 Evas_Object *selectioninfo_layout = NULL;
98 char lable_str[ACCOUNT_LABLE_STRING_LENGTH] = {'\0'};
100 if (!account_data->notify) {
101 notify = elm_notify_add(nv);
102 c_retm_if(!notify, "elm_notify_add returned null");
104 account_data->notify = notify;
105 elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
107 selectioninfo_layout = elm_layout_add(notify);
108 if (!selectioninfo_layout)
110 evas_object_del(notify);
111 account_data->notify = NULL;
115 elm_layout_theme_set(selectioninfo_layout, "standard", "selectioninfo", "vertical/bottom_64");
116 elm_object_content_set(notify, selectioninfo_layout);
118 snprintf(lable_str, sizeof(lable_str), "%s(%d)", S_("IDS_COM_POP_SELECTED"), account_data->selected_count);
119 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(selectioninfo_layout), "elm.text", lable_str);
121 if (0 < account_data->selected_count) {
122 evas_object_show(account_data->notify);
124 evas_object_hide(account_data->notify);
128 static void __cal_account_clear_list(cal_account_data *account_data)
130 c_retm_if(account_data == NULL, "account_data is null");
137 CALENDAR_SVC_FREE_CS_LIST((Eina_List **)&def_at.data);
141 if (account_data->acctlist)
143 EINA_LIST_FOREACH(account_data->acctlist, l, at)
145 if (NULL != at && at->data)
146 CALENDAR_SVC_FREE_CS_LIST((Eina_List **)&at->data);
148 cal_account_svc_free_account_list(&account_data->acctlist);
152 static char* __cal_account_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
154 c_retvm_if(!data, NULL, "data is null");
155 c_retvm_if(!obj, NULL, "obj is null");
157 struct _cs *cs = data;
158 const char* name = NULL;
159 struct _acct* at = NULL;
161 c_retvm_if(!cs->cs, NULL, "cs->cs is null");
163 if (!CAL_STRCMP(part, "elm.text.1"))
165 if (CALENDAR_SVC_STRUCT_GET_INT(cs->cs, CAL_TABLE_INT_INDEX) == DEFAULT_CALENDAR_ID)
166 return strdup(C_("IDS_CLD_OPT_PHONE_CALENDAR"));
168 name = CALENDAR_SVC_STRUCT_GET_STR(cs->cs, CAL_TABLE_TXT_NAME);
172 else if (!CAL_STRCMP(part, "elm.text.2"))
174 if (CALENDAR_SVC_STRUCT_GET_INT(cs->cs, CAL_TABLE_INT_INDEX) == DEFAULT_CALENDAR_ID)
175 return strdup(C_("IDS_EMAIL_BODY_DEFAULT_ACCOUNT"));
179 return strdup(at->name);
185 static void __cal_account_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
187 c_retm_if(data == NULL, "data is null");
188 c_retm_if(obj == NULL, "obj is null");
190 Eina_List * realized_list;
193 Evas_Object* check = obj;
194 Eina_Bool is_checked = EINA_FALSE;
196 cal_account_data* account_data = CAL_UTIL_GET_PRIV_DATA(obj);
197 c_retm_if(account_data == NULL, "account_data is null");
199 struct _cs *cs = data;
201 CALENDAR_SVC_SET_CALENDAR_VISIBILITY(cs->cs,elm_check_state_get(obj));
203 realized_list = elm_genlist_realized_items_get(account_data->gl);
204 EINA_LIST_FOREACH(realized_list, l, it) {
205 elm_genlist_item_update(it);
208 account_data->ad->is_update_view = EINA_TRUE;
210 is_checked = elm_check_state_get(check);
213 account_data->selected_count++;
216 if (0 < account_data->selected_count) {
217 account_data->selected_count--;
221 __cal_account_set_selected_count_label(account_data);
224 static void __cal_account_color_selector_changed_callback(void *data, Evas_Object *obj, void *event_info)
226 c_retm_if(data == NULL, "data is null");
227 c_retm_if(obj == NULL, "obj is null");
229 Evas_Object *rect = data;
230 elm_colorselector_color_get(obj, &calendar_color.red, &calendar_color.green, &calendar_color.blue, &calendar_color.alpha);
231 evas_object_color_set(rect, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
234 static Evas_Object* __cal_account_create_colorselector(Evas_Object* parent, cal_account_data* account_data)
236 c_retvm_if(!parent, NULL, "parent is null");
237 c_retvm_if(!account_data, NULL, "account_data is null");
239 Evas_Object *selector;
241 Evas_Object *selector_layout;
243 selector_layout = cal_util_add_layout(parent, "color_selector");
244 c_retvm_if(!selector_layout, NULL, "layout is null");
246 selector = elm_colorselector_add(parent);
249 ERR("elm_colorselector_add returned null");
250 evas_object_del(selector_layout);
254 elm_colorselector_mode_set(selector, ELM_COLORSELECTOR_COMPONENTS);
255 elm_object_part_content_set(selector_layout, "elm.swallow.selector", selector);
256 account_data->color = selector;
258 rect = evas_object_rectangle_add(evas_object_evas_get(parent));
261 ERR("evas_object_rectangle_add returned null");
262 evas_object_del(selector_layout);
266 elm_object_part_content_set(selector_layout, "elm.swallow.color", rect);
267 account_data->rect = rect;
269 evas_object_smart_callback_add(selector, "changed", __cal_account_color_selector_changed_callback, rect);
271 return selector_layout;
274 static void __cal_account_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
276 c_retm_if(!data, "data is null");
277 c_retm_if(!obj, "obj is null");
279 Evas_Object *popup = data;
280 Evas_Object *button = obj;
282 Eina_List * realized_list;
286 cal_account_data* account_data = evas_object_data_get(popup, "data");
287 c_retm_if(!account_data, "CAL_UTIL_GET_PRIV_DATA returned null");
289 struct _cs *cs = account_data->cs;
290 c_retm_if(!cs, "cs is null");
292 if (!strcmp(elm_object_text_get(button), S_("IDS_COM_OPT_SAVE")))
293 CALENDAR_SVC_SET_CALENDAR_COLOR(cs->cs, &calendar_color);
295 realized_list = elm_genlist_realized_items_get(account_data->gl);
296 c_retm_if(!realized_list, "elm_genlist_realized_items_get returned null");
298 EINA_LIST_FOREACH(realized_list, l, it) {
299 elm_genlist_item_update(it);
302 evas_object_del(popup);
305 static Evas_Object* __cal_account_color_create_popup(cal_account_data* account_data)
307 c_retvm_if(!account_data, NULL, "account_data is null");
309 Evas_Object *popup = NULL;
310 popup = cal_util_add_popup(account_data->ad->win, NULL, NULL, NULL,
311 __cal_account_popup_response_callback, account_data,
312 S_("IDS_COM_OPT_SAVE"), S_("IDS_IDLE_BUTTON_CANCEL"), NULL);
313 c_retvm_if(!popup, NULL, "cal_util_add_popup returned null");
315 evas_object_propagate_events_set(popup, EINA_FALSE);
317 account_data->color_selector = __cal_account_create_colorselector(popup, account_data);
319 if (!account_data->color_selector) {
320 ERR("__cal_account_create_colorselector returned null");
321 evas_object_del(popup);
325 elm_object_content_set(popup, account_data->color_selector);
330 static void __cal_account_color_clicked_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
332 c_retm_if(data == NULL, "data is null");
333 c_retm_if(obj == NULL, "obj is null");
334 cal_account_data* account_data = CAL_UTIL_GET_PRIV_DATA(obj);
335 c_retm_if(account_data == NULL, "CAL_UTIL_GET_PRIV_DATA returned null");
337 Evas_Object *popup = NULL;
339 struct _cs* cs = data;
341 account_data->cs = cs;
343 popup = __cal_account_color_create_popup(account_data);
344 c_retm_if(popup == NULL, "popup is null");
346 CALENDAR_SVC_GET_CALENDAR_COLOR(cs->cs, &calendar_color);
347 elm_colorselector_color_set(account_data->color, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
348 evas_object_color_set(account_data->rect,calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
351 static Evas_Object* __cal_account_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
353 c_retvm_if(data == NULL, NULL, "data is null");
354 c_retvm_if(obj == NULL, NULL, "obj is null");
356 struct _cs *cs = data;
358 cal_account_data* account_data = CAL_UTIL_GET_PRIV_DATA(obj);
359 c_retvm_if(account_data == NULL, NULL, "CAL_UTIL_GET_PRIV_DATA returned null");
361 Evas_Object* icon = NULL;
362 Evas_Object* check = NULL;
364 Calendar_color color = {0,};
365 char* icon_path = NULL;
367 if (elm_genlist_decorate_mode_get(obj) && !strcmp(part, "elm.edit.icon.1"))
369 check = elm_check_add(obj);
370 c_retvm_if(check == NULL, NULL, "elm_check_add returned null");
372 evas_object_data_set(check, "priv", account_data);
373 evas_object_propagate_events_set(check, EINA_FALSE);
375 checked = CALENDAR_SVC_STRUCT_GET_INT(cs->cs,CAL_TABLE_INT_VISIBILITY);
376 elm_check_state_set(check, checked);
378 evas_object_smart_callback_add(check, "changed", __cal_account_check_changed_callback, cs);
383 else if (!strcmp(part, "elm.icon.1"))
385 icon = elm_icon_add(obj);
386 c_retvm_if(icon == NULL, NULL, "elm_icon_add returned null");
388 if ( CALENDAR_SVC_STRUCT_GET_INT( cs->cs, CAL_TABLE_INT_INDEX) == DEFAULT_CALENDAR_ID)
389 elm_icon_file_set(icon, "/opt/apps/org.tizen.efl-calendar/res/icons/all_calendar.png", NULL);
392 icon_path = cal_account_svc_get_account_icon_path(CALENDAR_SVC_STRUCT_GET_INT( cs->cs, CAL_TABLE_INT_ACCOUNT_ID));
395 elm_icon_file_set(icon, icon_path, NULL);
400 ERR("cal_account_svc_get_account_icon_path returned null");
401 elm_icon_file_set(icon, "/opt/apps/org.tizen.efl-calendar/res/icons/all_calendar.png", NULL);
405 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
409 else if(!strcmp(part, "elm.icon.2"))
411 CALENDAR_SVC_GET_CALENDAR_COLOR(cs->cs, &color);
413 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
414 c_retvm_if(icon == NULL, NULL, "evas_object_rectangle_add returned null");
416 evas_object_data_set(icon, "priv", account_data);
417 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
418 evas_object_propagate_events_set(icon, EINA_FALSE);
419 evas_object_color_set(icon, color.red, color.green, color.blue, color.alpha);
421 evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_UP, __cal_account_color_clicked_callback, cs);
425 else if(!strcmp(part, "elm.swallow.colorbar"))
427 CALENDAR_SVC_GET_CALENDAR_COLOR(cs->cs, &color);
428 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
429 c_retvm_if(icon == NULL, NULL, "evas_object_rectangle_add returned null");
431 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
432 evas_object_color_set(icon, color.red, color.green, color.blue, color.alpha);
439 static void __cal_account_add_list(cal_account_data *account_data)
441 c_retm_if(account_data == NULL, "account_data is null");
445 gl = elm_genlist_add(account_data->ly);
446 c_retm_if(gl == NULL, "elm_genlist_add returned null");
448 elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE);
449 elm_genlist_decorate_mode_set(gl, EINA_TRUE);
451 evas_object_data_set(gl, "priv", account_data);
453 elm_object_part_content_set(account_data->ly, "sw", gl);
454 account_data->gl = gl;
457 static void __cal_account_get_calendars(cal_account_data *account_data, struct _acct *at)
459 c_retm_if(account_data == NULL, "account_data is null");
460 c_retm_if(at == NULL, "at is null");
461 c_retm_if(at->id < 1 , "at->id(%d) is less then 0", at->id);
463 Eina_List *csl = NULL;
465 csl = CALENDAR_SVC_GET_CALENDARS_WITH_ACCOUNT(at->id, at);
468 at->data = eina_list_merge(at->data, csl);
471 static void __cal_account_get_list(cal_account_data *account_data)
473 c_retm_if(account_data == NULL, "account_data is null");
478 l = cal_account_svc_get_account_list();
480 account_data->acctlist = eina_list_merge(account_data->acctlist, l);
482 EINA_LIST_FOREACH(account_data->acctlist, l, at)
483 __cal_account_get_calendars(account_data, at);
486 static inline void __cal_account_set_default_account(cal_account_data *account_data)
488 c_retm_if(account_data == NULL, "account_data is null");
490 Eina_List *csl = NULL;
492 csl = CALENDAR_SVC_GET_CALENDARS_WITH_ACCOUNT(LOCAL_ACCOUNT_ID, &def_at);
494 def_at.data = eina_list_merge(def_at.data, csl);
497 static void __cal_account_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)
499 c_retm_if(data == NULL, "data is null");
500 c_retm_if(obj == NULL, "obj is null");
503 cal_account_data *account_data = CAL_UTIL_GET_PRIV_DATA(obj);
504 c_retm_if(account_data == NULL, "CAL_UTIL_GET_PRIV_DATA returned null");
506 struct _cs *cs = data;
509 Eina_Bool is_checked = EINA_FALSE;
511 it = elm_genlist_selected_item_get(obj);
512 c_retm_if(it == NULL, "elm_genlist_selected_item_get returned null");
514 elm_genlist_item_selected_set(it, EINA_FALSE);
516 is_checked = elm_check_state_get(cs->check);
517 elm_check_state_set(cs->check, !is_checked);
520 account_data->selected_count++;
522 if (0 < account_data->selected_count)
523 account_data->selected_count--;
527 CALENDAR_SVC_SET_CALENDAR_VISIBILITY(cs->cs, !is_checked);
529 account_data->ad->is_update_view = EINA_TRUE;
531 __cal_account_set_selected_count_label(account_data);
534 static void __cal_account_update_genlist(void* data)
538 c_retm_if(data == NULL, "data is null");
543 cal_account_data* account_data = data;
544 Eina_Bool checked = EINA_FALSE;
546 __cal_account_clear_list(account_data);
547 elm_genlist_clear(account_data->gl);
549 __cal_account_get_list(account_data);
551 __cal_account_set_default_account(account_data);
552 EINA_LIST_FOREACH(def_at.data, l, cs)
555 checked = CALENDAR_SVC_STRUCT_GET_INT(cs->cs,CAL_TABLE_INT_VISIBILITY);
557 account_data->selected_count ++;
559 elm_genlist_item_append(account_data->gl, &itc, cs, NULL, ELM_GENLIST_ITEM_NONE, __cal_account_genlist_item_select_callback, cs);
563 EINA_LIST_FOREACH(account_data->acctlist, l, at)
567 EINA_LIST_FOREACH(at->data, ll, cs)
570 checked = CALENDAR_SVC_STRUCT_GET_INT(cs->cs,CAL_TABLE_INT_VISIBILITY);
572 account_data->selected_count ++;
574 elm_genlist_item_append(account_data->gl, &itc, cs, NULL, ELM_GENLIST_ITEM_NONE, __cal_account_genlist_item_select_callback, cs);
581 static void __cal_account_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
585 c_retm_if(data == NULL, "data is null");
587 cal_account_data *account_data = data;
589 __cal_account_clear_list(account_data);
591 if (account_data->notify)
592 evas_object_del(account_data->notify);
596 CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(__cal_account_update_genlist);
599 static void __cal_account_button_callback(void *data, Evas_Object *obj, void *event_info)
601 c_retm_if(data == NULL, "data is null");
603 cal_account_data *account_data = data;
604 Evas_Object *popup = cal_util_add_popup(account_data->ad->win, NULL, C_("IDS_COM_POP_ERRORMSG_SAVE_Q"), NULL,
605 __cal_account_popup_response_callback, account_data,
606 S_("IDS_COM_OPT_SAVE"), S_("IDS_IDLE_BUTTON_CANCEL"), NULL);
607 c_retm_if(!popup, "cal_util_add_popup returned null");
609 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
612 static Evas_Object* __cal_account_create_layout(struct appdata *ad, Evas_Object *parent)
616 c_retvm_if(!ad || !parent, NULL, "Input parameter is null");
620 Evas_Object *close_button;
621 cal_account_data *account_data;
623 account_data = calloc(1, sizeof(cal_account_data));
624 c_retvm_if(account_data == NULL, NULL, "calloc(1, sizeof(cal_account_data)) is failed");
626 account_data->name = _name;
627 account_data->parent = parent;
628 account_data->ad = ad;
629 account_data->selected_count = 0;
630 account_data->notify = NULL;
633 ly = cal_util_add_layout(ad->nv, account_data->name);
636 ERR("cal_util_add_layout returned null");
640 account_data->ly = ly;
641 evas_object_data_set(ly, "priv", account_data);
643 bg = cal_util_add_bg(ly, EINA_FALSE);
646 ERR("cal_util_add_bg returned null");
651 elm_object_part_content_set(ly, "base", bg);
653 __cal_account_add_list(account_data);
654 __cal_account_update_genlist(account_data);
656 close_button = elm_button_add(account_data->ly);
657 elm_object_part_content_set(account_data->ly, "selector_button", close_button);
658 elm_object_text_set(close_button,S_("IDS_COM_BODY_CLOSE"));
660 evas_object_smart_callback_add(close_button, "clicked", __cal_account_button_callback, account_data);
662 evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_account_delete_layout, account_data);
664 CALENDAR_SVC_ADD_EVENT_CHANGED_CALLBACK(__cal_account_update_genlist, account_data);
669 void cal_account_create_view(struct appdata *ad, Evas_Object *parent)
673 c_retm_if(ad == NULL, "ad is null");
674 c_retm_if(ad->nv == NULL, "ad->nv is null");
675 c_retm_if(parent == NULL, "parent is null");
680 Elm_Object_Item* navi_item;
682 ly = __cal_account_create_layout(ad, parent);
683 c_retm_if(ly == NULL, "__cal_account_create_layout returned null");
685 add = elm_button_add(ad->nv);
688 ERR("elm_button_add returned null");
693 navi_item = elm_naviframe_item_push(ad->nv, C_("IDS_CLD_BODY_CALENDARS"), NULL, NULL, ly, NULL);
696 ERR("elm_naviframe_item_push returned null");
697 evas_object_del(add);
702 back = elm_object_item_part_content_get(navi_item, "prev_btn");
705 ERR("elm_object_item_part_content_get returned null");
706 elm_naviframe_item_pop(ad->nv);
707 evas_object_del(add);
712 elm_object_style_set(back, "naviframe/back_btn/default");