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 "list-base.h"
20 #include "external-ug.h"
22 #include "detail-view.h"
23 #include "cld-images.h"
24 #include "edit-view.h"
30 calendar_record_h selected_record;
32 Ecore_Idler *popup_idler;
33 const char *searchtext;
34 Elm_Object_Item *sweep_it;
35 cal_list_callback select_item_callback;
36 void* select_item_callback_data;
40 _calendar_book_color calendar_color;
42 static Evas_Object *__cal_list_get_genlist_loadmore_item_icon(void *data, Evas_Object *obj, const char *part)
44 c_retv_if(!data, NULL);
46 cal_list_base_s *p = data;
48 Evas_Object *progressbar = elm_progressbar_add(p->parent);
49 c_retv_if(!progressbar, NULL);
51 elm_object_style_set(progressbar, "list_process");
52 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
53 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
54 evas_object_show(progressbar);
55 elm_progressbar_pulse(progressbar, EINA_TRUE);
59 static char* __cal_list_base_share_genlist_item_label(void *data, Evas_Object *obj, const char *part)
61 c_retvm_if(!data || !obj || !part, NULL, "data is null");
63 char *name = (char *)data;
65 if (!CAL_STRCMP(part, "elm.text")) {
72 static char* __cal_list_get_genlist_header_item_label(void *data, Evas_Object *obj, const char *part)
74 c_retvm_if(!data, NULL, "data is null.");
77 cal_list_genlist_item_data *item_data = data;
78 const struct tm *tm = item_data->tm;
80 if (!CAL_STRCMP(part, "elm.text")) {
82 if (item_data->todo_group_type == CAL_TASK_NO_DUE_DATE) {
83 return strdup(C_("IDS_CLD_BODY_NO_DUE_DATE_M_NOUN"));
84 } else if (item_data->todo_group_type == CAL_TASK_DUE_TODAY) {
85 return strdup(C_("IDS_CLD_HEADER_DUE_TODAY"));
86 } else if (item_data->todo_group_type == CAL_TASK_DUE_WITHIN_A_WEEK) {
87 return strdup("Due within a week");
88 } else if (item_data->todo_group_type == CAL_TASK_DUE_IN_OVER_ONE_WEEK) {
89 return strdup(C_("IDS_CLD_HEADER_DUE_IN_OVER_1_WEEK"));
90 } else if (item_data->todo_group_type == CAL_TASK_OVER_DUE) {
91 return strdup(C_("IDS_TASK_DROP_OVERDUE"));
95 return strdup(C_("IDS_CLD_BODY_REPEATING_EVENT"));
98 cal_util_get_time_text(buf, sizeof(buf), CAL_UTIL_DATE_FORMAT_1, NULL, tm);
107 static char* __cal_list_get_genlist_custom_group_header_item_label(void *data, Evas_Object *obj, const char *part)
109 c_retvm_if(!data, NULL, "data is null.");
112 cal_list_genlist_item_data *item_data = data;
113 const struct tm *tm = item_data->tm;
115 if (!CAL_STRCMP(part, "elm.text")) {
117 return strdup("ERROR!!!");
118 cal_util_get_time_text(buf, sizeof(buf), CAL_UTIL_DATE_FORMAT_1, NULL, tm);
121 return strdup("ERROR!!!");
124 static inline void __get_tm(const calendar_time_s* caltime, struct tm* tm_time)
126 switch (caltime->type) {
127 case CALENDAR_TIME_UTIME:
128 cal_util_convert_lli_to_tm(NULL, caltime->time.utime, tm_time);
130 case CALENDAR_TIME_LOCALTIME:
131 tm_time->tm_year = caltime->time.date.year - 1900;
132 tm_time->tm_mon = caltime->time.date.month - 1;
133 tm_time->tm_mday = caltime->time.date.mday;
141 static char* __cal_list_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
143 c_retv_if(!data, NULL);
144 c_retv_if(!obj, NULL);
145 c_retv_if(!part, NULL);
147 cal_list_genlist_item_data *item_data = data;
149 cal_list_base_s *p = CAL_UTIL_GET_PRIV_DATA(obj);
154 calendar_record_h record = item_data->record;
155 c_retv_if(!record, NULL);
157 if (!CAL_STRCMP(part, "elm.text.1")) {
158 str = _calendar_get_summary(record);
161 char *text = cal_util_get_search_color_text(p->searchtext, str);
162 if(CAL_STRLEN(text)) {
171 } else if (!CAL_STRCMP(part, "elm.text.2")) {
173 return _calendar_get_location(record);
175 } else if (!CAL_STRCMP(part, "elm.text.3")) {
177 return _calendar_get_time_str_for_genlist(record);
179 } else if (!CAL_STRCMP(part, "elm.slide.text.1")) {
181 return _calendar_get_summary(record);
187 static char* __cal_list_get_genlist_task_item_label(void *data, Evas_Object *obj, const char *part)
189 c_retv_if(!data, NULL);
190 c_retv_if(!obj, NULL);
191 c_retv_if(!part, NULL);
193 cal_list_genlist_item_data *item_data = data;
195 cal_list_base_s *p = CAL_UTIL_GET_PRIV_DATA(obj);
198 calendar_record_h record = item_data->record;
199 c_retv_if(!record, NULL);
202 calendar_record_get_int(record, _calendar_todo.todo_status, &todo_status);
203 bool is_done = (todo_status == CALENDAR_TODO_STATUS_COMPLETED);
205 if ((CAL_STRCMP(part, "elm.text.1") == 0 && !is_done) ||
206 (CAL_STRCMP(part, "elm.textblock.1") == 0 && is_done)) {
208 char* text = _calendar_get_summary(record);
209 c_retv_if(text == NULL, NULL);
212 char* text2 = cal_util_get_search_color_text(p->searchtext, text);
213 if(CAL_STRLEN(text2)) {
220 char* text3 = calloc(strlen(text) + 100, 1);
223 c_retv_if(text3 == NULL, NULL);
225 sprintf(text3, "<strikethrough=on strikethrough_color=#D1D1D1>%s</strikethrough>", text);
233 } else if (!CAL_STRCMP(part, "elm.textblock.2")) {
237 return _calendar_get_location(record);
238 } else if (!CAL_STRCMP(part, "elm.text.3")) {
242 calendar_time_s due_time;
243 calendar_record_get_caltime(record, _calendar_todo.due_time, &due_time);
245 // if (due_time == -1) {
246 // return strdup("No due date");
249 return _calendar_get_time_str_for_genlist(record);
250 } else if (!CAL_STRCMP(part, "elm.textblock.3")) {
254 calendar_time_s due_time;
255 calendar_record_get_caltime(record, _calendar_todo.due_time, &due_time);
257 // if (due_time == -1) {
258 // return strdup("No due date");
261 return _calendar_get_time_str_for_genlist(record);
267 static void __cal_list_base_set_genlist_item_sweep_off(Elm_Object_Item *it)
269 c_retm_if(!it, "it is null");
270 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
271 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_ALWAYS);
274 static Eina_Bool __cal_list_popup_idler_callback(void *data)
276 c_retv_if(!data, ECORE_CALLBACK_CANCEL);
278 cal_list_base_s *p = data;
281 evas_object_del(p->popup);
285 p->popup_idler = NULL;
287 return ECORE_CALLBACK_CANCEL;
290 static inline void __cal_list_base_delete_popup(cal_list_base_s *p)
292 c_retm_if(!p || !p->popup, "param is null");
294 if (p->popup_idler) {
295 ecore_idler_del(p->popup_idler);
296 p->popup_idler = NULL;
299 p->popup_idler = ecore_idler_add(__cal_list_popup_idler_callback, p);
300 c_ret_if(!p->popup_idler);
303 static void __cal_list_base_show_popup(cal_list_base_s *p, const char *tit, Eina_Bool is_edit);
305 void __cal_list_edit_button_callback(void *data, Evas_Object *obj, void *ei)
307 cal_list_genlist_item_data *item_data = data;
308 c_retm_if(!item_data, "item_data is NULL.");
310 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(obj);
311 c_retm_if(!p, "p is NULL.");
313 calendar_record_h record = item_data->record;
314 c_retm_if(!record, "record is NULL.");
316 p->ad->cid = _calendar_get_record_index(record);
317 p->selected_record = record;
319 if (_calendar_is_task_record(record)) {
321 calendar_record_h origin_record = NULL;
322 int index = _calendar_get_record_index(record);
323 origin_record = _calendar_get_record_with_index(index);
325 cal_edit_create_view(p->ad, origin_record, NULL, NULL);
326 calendar_record_destroy(origin_record, true);
328 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
332 if (_calendar_is_recurrent_record(record)) {
333 __cal_list_base_show_popup(p,C_("IDS_CLD_HEADER_EDIT_EVENT"), EINA_TRUE);
335 calendar_record_h origin_record = NULL;
336 int index = _calendar_get_record_index(record);
337 origin_record = _calendar_get_record_with_index(index);
339 cal_edit_create_view(p->ad, origin_record, NULL, NULL);
340 calendar_record_destroy(origin_record, true);
342 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
348 static void __cal_list_delete_norepeat_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
350 c_retm_if(!data, "data is null");
351 c_retm_if(!obj, "obj is null");
353 Evas_Object *popup = data;
354 Evas_Object *button = obj;
356 cal_list_base_s* p = evas_object_data_get(popup, "data");
358 c_retm_if(!p, "p is null");
359 c_retm_if(!p->ad, "p->ad is null");
360 c_retm_if(!p->popup, "p->popup is null");
362 if (NULL != strstr(elm_object_text_get(button), S_("IDS_COM_BODY_DELETE"))) {
363 _calendar_delete_record_with_index(p->ad->cid);
366 evas_object_del(p->popup);
370 static void __cal_list_edit_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
372 c_retm_if(!data, "data is null");
373 c_retm_if(!obj, "obj is null");
375 Evas_Object *popup = data;
376 Evas_Object *button = obj;
377 cal_list_base_s* p = evas_object_data_get(popup, "data");
378 c_retm_if(!p, "p is null");
380 struct appdata* ad = p->ad;
381 c_retm_if(!ad, "ad is null");
383 if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_BODY_ONLY_THIS_EVENT"))) {
384 cal_edit_create_view(p->ad, p->selected_record, NULL, NULL);
385 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
386 }else if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"))) {
387 calendar_record_h origin_record = NULL;
388 int index = _calendar_get_record_index(p->selected_record);
389 origin_record = _calendar_get_record_with_index(index);
391 cal_edit_create_view(p->ad, origin_record, NULL, NULL);
392 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
393 calendar_record_destroy(origin_record, true);
396 evas_object_del(popup);
400 static void __cal_list_delete_event(cal_list_base_s* p, Eina_Bool is_delete_all)
404 struct appdata* ad = p->ad;
408 _calendar_delete_recurrence_instance(p->selected_record);
410 _calendar_delete_record_with_index(ad->cid);
413 static void __cal_list_delete_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
415 c_retm_if(!data, "data is null");
416 c_retm_if(!obj, "obj is null");
418 Evas_Object *popup = data;
419 Evas_Object *button = obj;
421 cal_list_base_s* p = evas_object_data_get(popup, "data");
422 c_retm_if(!p, "p is null");
424 if (!strcmp(elm_object_text_get(button), S_("IDS_COM_BODY_DELETE"))) {
425 __cal_list_delete_event(p, EINA_FALSE);
426 } else if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_BODY_ONLY_THIS_EVENT"))) {
427 __cal_list_delete_event(p, EINA_FALSE);
428 } else if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"))) {
429 __cal_list_delete_event(p, EINA_TRUE);
432 evas_object_del(popup);
436 static void __cal_list_base_show_popup(cal_list_base_s *p, const char *tit, Eina_Bool is_edit)
438 c_retm_if(!p, "p is NULL.");
440 void (*callback_func)(void *data, Evas_Object *obj, void *ei) = NULL;
443 callback_func = __cal_list_edit_popup_response_event_callback;
446 callback_func = __cal_list_delete_popup_response_event_callback;
449 p->popup = cal_util_add_popup(p->ad->win, "verticalbuttonstyle", NULL, tit,
450 callback_func, p, C_("IDS_CLD_BODY_ONLY_THIS_EVENT"),
451 C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"), S_("IDS_COM_SK_CANCEL"), NULL);
453 c_retm_if(!p->popup, "cal_util_add_popup(p->ad->win) returned null");
455 evas_object_data_set(p->popup, "priv", p);
458 void __cal_list_delete_button_callback(void *data, Evas_Object *obj, void *ei)
460 cal_list_genlist_item_data *item_data = data;
461 c_retm_if(!item_data, "item_data is NULL.");
463 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(obj);
464 c_retm_if(!p, "p is NULL.");
466 calendar_record_h record = item_data->record;
467 c_retm_if(!record, "record is NULL.");
469 p->ad->cid = _calendar_get_record_index(record);
470 p->selected_record = record;
472 c_ret_if(p->ad->cid == 0);
474 if (_calendar_is_task_record(record)) {
475 p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, S_("IDS_COM_POP_DELETE_Q"), __cal_list_delete_norepeat_popup_response_event_callback, p,
476 S_("IDS_COM_BODY_DELETE"),S_("IDS_COM_SK_CANCEL"), NULL);
478 if (_calendar_is_recurrent_record(record)) {
479 __cal_list_base_show_popup(p, C_("IDS_CLD_OPT_DELETE_EVENT"), EINA_FALSE);
481 p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, S_("IDS_COM_POP_DELETE_Q"), __cal_list_delete_norepeat_popup_response_event_callback, p,
482 S_("IDS_COM_BODY_DELETE"),S_("IDS_COM_SK_CANCEL"), NULL);
487 static void __cal_list_base_share_popup_response_callback(void *data, Evas_Object *obj, void *ei)
489 c_retm_if(!data, "data is null");
490 c_retm_if(!obj, "obj is null");
492 Evas_Object *popup = data;
494 cal_list_base_s* p = evas_object_data_get(popup, "data");
495 c_retm_if(!p, "p is null");
497 evas_object_del(popup);
502 static void __cal_list_genlist_item_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
507 cal_list_genlist_item_data *item_data = data;
509 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(obj);
512 item_data->checked = elm_check_state_get(obj);
514 calendar_record_h record = item_data->record;
517 calendar_error_e error = CALENDAR_ERROR_NONE;
518 calendar_record_h todo_original_record = NULL;
519 int todo_id = _calendar_get_record_index(record);
520 error = calendar_db_get_record(_calendar_todo._uri, todo_id, &todo_original_record);
521 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_get_record(%d) is failed(%x)", todo_id, error);
523 if (item_data->checked) {
524 error = calendar_record_set_int(todo_original_record, _calendar_todo.todo_status, CALENDAR_TODO_STATUS_COMPLETED);
525 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
527 error = calendar_record_set_int(record, _calendar_todo_calendar_book.todo_status, CALENDAR_TODO_STATUS_COMPLETED);
528 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
531 error = calendar_record_set_int(todo_original_record, _calendar_todo.todo_status, CALENDAR_TODO_STATUS_IN_PROCESS);
532 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
534 error = calendar_record_set_int(record, _calendar_todo_calendar_book.todo_status, CALENDAR_TODO_STATUS_IN_PROCESS);
535 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
538 cal_main_remove_db_changed_callback(p->ad);
540 error = calendar_db_update_record(todo_original_record);
541 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_update_record() is failed(%x)", error);
543 cal_main_add_db_changed_callback(p->ad);
545 elm_genlist_item_update(item_data->it);
547 // TBD: UX not so good if task item is removed from list immediately.
548 if (!p->ad->is_display_complete_todo && item_data->checked)
549 elm_object_item_del(item_data->it);
552 void __cal_list_base_send_button_callback(void *data, Evas_Object *obj, void *ei);
554 static Evas_Object* __get_action_button(Evas_Object* obj, const char *part, cal_list_base_s *p, cal_list_genlist_item_data *item_data)
556 Evas_Object *button = elm_button_add(obj);
557 c_retvm_if(!button, NULL, "button is NULL");
559 evas_object_data_set(button, "priv", p);
560 Eina_Bool button_disabled_set = EINA_FALSE;
562 if (!CAL_STRCMP(part, "elm.slide.swallow.1")) {
564 elm_object_style_set(button, "text_only/sweep");
565 elm_object_text_set(button, S_("IDS_COM_SK_EDIT"));
566 evas_object_smart_callback_add(button, "clicked", __cal_list_edit_button_callback, item_data);
567 evas_object_propagate_events_set(button, EINA_FALSE);
568 if(button_disabled_set)
569 elm_object_disabled_set(button, EINA_TRUE);
571 } else if (!CAL_STRCMP(part, "elm.slide.swallow.2")) {
573 elm_object_style_set(button, "text_only/sweep");
574 elm_object_text_set(button, S_("IDS_COM_BUTTON_SHARE"));
575 evas_object_smart_callback_add(button, "clicked", __cal_list_base_send_button_callback, item_data);
576 evas_object_propagate_events_set(button, EINA_FALSE);
578 } else if (!CAL_STRCMP(part, "elm.slide.swallow.3")) {
580 elm_object_style_set(button, "sweep/delete");
581 elm_object_text_set(button, S_("IDS_COM_BODY_DELETE"));
582 evas_object_smart_callback_add(button, "clicked", __cal_list_delete_button_callback, item_data);
583 evas_object_propagate_events_set(button, EINA_FALSE);
584 if(button_disabled_set)
585 elm_object_disabled_set(button, EINA_TRUE);
592 static Evas_Object *__cal_list_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
594 c_retv_if(!data, NULL);
596 cal_list_base_s *p = CAL_UTIL_GET_PRIV_DATA(obj);
599 cal_list_genlist_item_data *item_data = data;
601 Evas_Object *icon = NULL;
603 calendar_record_h record = item_data->record;
605 if (!CAL_STRCMP(part, "elm.swallow.colorbar")) {
607 _calendar_get_calendar_color(record, &calendar_color);
609 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
610 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
611 evas_object_color_set(icon, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
615 } else if (CAL_STRCMP(part, "elm.slide.swallow.1") == 0 ||
616 CAL_STRCMP(part, "elm.slide.swallow.2") == 0 ||
617 CAL_STRCMP(part, "elm.slide.swallow.3") == 0) {
619 return __get_action_button(obj, part, p, item_data);
621 } else if (!CAL_STRCMP(part, "elm.edit.icon.1") ) {
622 icon = elm_check_add(obj);
623 c_retvm_if(!icon, NULL, "elm_check_add returned null");
626 calendar_record_get_int(record, _calendar_todo.todo_status, &todo_status);
628 if (CALENDAR_TODO_STATUS_COMPLETED == todo_status)
629 item_data->checked = EINA_TRUE;
630 else if (CALENDAR_TODO_STATUS_IN_PROCESS == todo_status)
631 item_data->checked = EINA_FALSE;
633 elm_check_state_pointer_set(icon, &item_data->checked);
634 evas_object_smart_callback_add(icon, "changed", __cal_list_genlist_item_check_changed_callback, item_data);
635 evas_object_propagate_events_set(icon, EINA_FALSE);
636 evas_object_data_set(icon, "priv", p);
639 } else if (!CAL_STRCMP(part, "elm.icon.1")) {
640 if (!_calendar_has_reminder(record))
643 icon = elm_icon_add(obj);
644 c_retv_if(!icon, NULL);
646 int r = elm_icon_file_set(icon, CAL_IMAGES_EDJ, CAL_IMAGES_ALARM);
650 } else if (!CAL_STRCMP(part, "elm.icon.2")) {
651 if (!_calendar_is_recurrent_record(record))
654 icon = elm_icon_add(obj);
655 c_retv_if(!icon, NULL);
657 int r = elm_icon_file_set(icon, CAL_IMAGES_EDJ, CAL_IMAGES_REPEAT);
661 } else if (!CAL_STRCMP(part, "elm.icon.3")) {
662 if (!_calendar_is_facebook_record(record))
665 icon = elm_icon_add(obj);
666 c_retv_if(!icon, NULL);
668 int r = elm_icon_file_set(icon, CAL_IMAGES_EDJ, CAL_IMAGES_FACEBOOK);
673 DBG("The part %s is unattended for!!!", part);
679 static Evas_Object *__cal_list_get_genlist_task_item_icon(void *data, Evas_Object *obj, const char *part)
681 c_retv_if(!data, NULL);
683 cal_list_base_s *p = CAL_UTIL_GET_PRIV_DATA(obj);
686 cal_list_genlist_item_data *item_data = data;
688 Evas_Object *icon = NULL;
690 calendar_record_h record = item_data->record;
691 c_retv_if(!_calendar_is_task_record(record), NULL);
693 if (!CAL_STRCMP(part, "elm.swallow.colorbar"))
695 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
696 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
698 _calendar_get_calendar_color(record, &calendar_color);
700 evas_object_color_set(icon, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
703 } else if (CAL_STRCMP(part, "elm.slide.swallow.1") == 0 ||
704 CAL_STRCMP(part, "elm.slide.swallow.2") == 0 ||
705 CAL_STRCMP(part, "elm.slide.swallow.3") == 0) {
707 return __get_action_button(obj, part, p, item_data);
709 } else if (!CAL_STRCMP(part, "elm.edit.icon")) {
710 Evas_Object *check = elm_check_add(obj);
711 c_retvm_if(!check, NULL, "elm_check_add returned null");
713 item_data->checked = EINA_FALSE;
715 calendar_error_e error = CALENDAR_ERROR_NONE;
717 calendar_todo_status_e todo_status = 0;
719 error = calendar_record_get_int(record, _calendar_todo.todo_status, (int *)&todo_status);
720 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
722 if (CALENDAR_TODO_STATUS_COMPLETED == todo_status) {
723 item_data->checked = EINA_TRUE;
724 } else if (CALENDAR_TODO_STATUS_IN_PROCESS == todo_status) {
725 item_data->checked = EINA_FALSE;
728 elm_check_state_pointer_set(check, &item_data->checked);
729 evas_object_smart_callback_add(check, "changed", __cal_list_genlist_item_check_changed_callback, item_data);
730 evas_object_propagate_events_set(check, EINA_FALSE);
731 evas_object_data_set(check, "priv", p);
733 } else if (!CAL_STRCMP(part, "elm.icon.2")) {
734 calendar_error_e error = CALENDAR_ERROR_NONE;
736 calendar_todo_priority_e priority = CALENDAR_TODO_PRIORITY_NONE;
738 error = calendar_record_get_int(record, _calendar_todo.priority, (int *)&priority);
739 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
741 if (priority == CALENDAR_TODO_PRIORITY_HIGH) {
742 icon = elm_icon_add(obj);
743 c_retvm_if(!icon, NULL, "elm_icon_add returned null");
744 int r = elm_icon_file_set(icon, CAL_IMAGES_EDJ, CAL_IMAGES_PRIORITY);
746 } else if (priority == CALENDAR_TODO_PRIORITY_LOW) {
747 icon = elm_icon_add(obj);
748 c_retvm_if(!icon, NULL, "elm_icon_add returned null");
749 int r = elm_icon_file_set(icon, CAL_IMAGES_EDJ, CAL_IMAGES_PRIORITY_LOW);
754 } else if (!CAL_STRCMP(part, "elm.icon.1")) {
755 if (!_calendar_has_reminder(record))
758 icon = elm_icon_add(obj);
759 c_retv_if(!icon, NULL);
761 int r = elm_icon_file_set(icon, CAL_IMAGES_EDJ, CAL_IMAGES_ALARM);
766 DBG("The part %s is unattended for!!!", part);
772 // TODO: Create new type for header item data
773 static void __cal_list_delete_genlist_header_item(void *data, Evas_Object *obj)
777 c_retm_if(!data, "data is null.");
779 cal_list_genlist_item_data *item_data = data;
785 static void __cal_list_delete_genlist_item(void *data, Evas_Object *obj)
787 c_retm_if(!data, "data is null.");
788 cal_list_genlist_item_data *item_data = data;
792 Elm_Genlist_Item_Class cal_list_itc_h = {
793 .item_style = "grouptitle",
794 .func.text_get = __cal_list_get_genlist_header_item_label,
795 .func.del = __cal_list_delete_genlist_header_item,
798 Elm_Genlist_Item_Class cal_list_today_group_itc_h = {
799 .item_style = "today_grouptitle",
800 .func.text_get = __cal_list_get_genlist_custom_group_header_item_label,
801 .func.del = __cal_list_delete_genlist_header_item,
804 Elm_Genlist_Item_Class cal_list_normal_itc = {
805 .item_style = "4text.1icon.3.calendar.search",
806 .func.text_get = __cal_list_get_genlist_item_label,
807 .func.del = __cal_list_delete_genlist_item,
808 .func.content_get = __cal_list_get_genlist_item_icon,
809 .decorate_item_style = "mode/slide3",
812 Elm_Genlist_Item_Class cal_task_itc = {
813 .item_style = "3text.4icon.calendar.check",
814 .func.text_get = __cal_list_get_genlist_task_item_label,
815 .func.del = __cal_list_delete_genlist_item,
816 .func.content_get = __cal_list_get_genlist_task_item_icon,
817 .decorate_item_style = "mode/slide3",
820 Elm_Genlist_Item_Class itc_1text = {
821 .item_style = "1text",
822 .func.content_get = NULL,
823 .func.text_get = __cal_list_base_share_genlist_item_label,
826 Elm_Genlist_Item_Class itc_1icon = {
827 .item_style = "1icon.custom",
828 .func.content_get = NULL,
829 .func.text_get = NULL,
830 .func.content_get = __cal_list_get_genlist_loadmore_item_icon,
833 static void __cal_list_via_message_callback(void *data, Evas_Object *obj, void *ei)
835 c_retm_if(!data, "data is null");
836 c_retm_if(!obj, "obj is null");
838 cal_list_base_s *p = data;
839 c_retm_if(!p->ad, "p->ad is null");
841 c_ret_if(!p->selected_record);
843 calendar_record_h record = _calendar_get_record_with_index(_calendar_get_record_index(p->selected_record));
846 _calendar_export_record_to_vcs(record, CAL_MESSAGE_VCS);
848 p->ad->ug = cal_launch_ug_with_var(NULL, CAL_MESSAGE_COMPOSER_UG, NULL, "ATTACHFILE", CAL_MESSAGE_VCS, NULL);
850 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
852 __cal_list_base_delete_popup(p);
855 static void __cal_list_via_email_callback(void *data, Evas_Object *obj, void *ei)
857 c_retm_if(!data, "data is null");
858 c_retm_if(!obj, "obj is null");
860 cal_list_base_s *p = data;
861 c_retm_if(!p->ad, "p->ad is null");
863 c_ret_if(!p->selected_record);
865 calendar_record_h record = _calendar_get_record_with_index(_calendar_get_record_index(p->selected_record));
868 _calendar_export_record_to_vcs(record, CAL_EMAIL_VCS);
870 p->ad->ug = cal_launch_ug_with_var(NULL, CAL_EMAIL_COMPOSER_UG, (struct ug_cbs *)p->ad, "RUN_TYPE", "5", "ATTACHFILE", CAL_EMAIL_VCS, NULL);
872 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
874 __cal_list_base_delete_popup(p);
877 static void __cal_list_via_bluetooth_callback(void *data, Evas_Object *obj, void *ei)
879 c_retm_if(!data, "data is null");
880 c_retm_if(!obj, "obj is null");
882 cal_list_base_s *p = data;
883 c_retm_if(!p->ad, "p->ad is null");
885 c_ret_if(!p->selected_record);
887 calendar_record_h record = _calendar_get_record_with_index(_calendar_get_record_index(p->selected_record));
890 _calendar_export_record_to_vcs(record, CAL_BLUETOOTH_VCS);
892 p->ad->ug = cal_launch_ug_with_var(NULL, CAL_BLUETOOTH_UG, NULL, "launch-type", "send", "filecount", "1", "files", CAL_BLUETOOTH_VCS, NULL);
894 __cal_list_base_set_genlist_item_sweep_off(p->sweep_it);
896 __cal_list_base_delete_popup(p);
899 void __cal_list_base_send_button_callback(void *data, Evas_Object *obj, void *ei)
901 cal_list_genlist_item_data *item_data = data;
902 c_retm_if(!item_data, "item_data is NULL.");
904 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(obj);
905 c_retm_if(!p, "p is NULL.");
907 calendar_record_h record = item_data->record;
908 c_retm_if(!record, "record is NULL.");
910 p->ad->cid = _calendar_get_record_index(record);
911 p->selected_record = record;
913 p->popup = cal_util_add_popup(p->ad->win, "menustyle", S_("IDS_COM_BUTTON_SHARE"), NULL,
914 __cal_list_base_share_popup_response_callback, p,
915 S_("IDS_COM_BODY_CLOSE"), NULL);
917 c_retm_if(!p->popup, "cal_util_add_popup returned null");
918 evas_object_data_set(p->popup, "data", p);
920 Evas_Object *genlist = elm_genlist_add(p->popup);
921 c_retm_if(!genlist, "elm_genlist_add returned null");
923 elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_EMAIL"), NULL, ELM_GENLIST_ITEM_NONE, __cal_list_via_email_callback, p);
924 elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_MESSAGE"), NULL, ELM_GENLIST_ITEM_NONE, __cal_list_via_message_callback, p);
925 elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_BLUETOOTH"), NULL, ELM_GENLIST_ITEM_NONE, __cal_list_via_bluetooth_callback, p);
927 elm_object_content_set(p->popup, genlist);
928 evas_object_show(p->popup);
931 Elm_Object_Item* cal_list_base_append_genlist_group_item(Evas_Object *genlist,
932 const Elm_Genlist_Item_Class *itc, const struct tm *tm, cal_task_group_item_type type)
936 c_retv_if(!genlist, NULL);
938 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(genlist);
939 c_retvm_if(!p, NULL, "p is null.");
944 t = calloc(1, sizeof(struct tm));
951 cal_list_genlist_item_data *item_data = calloc(1, sizeof(cal_list_genlist_item_data));
954 item_data->todo_group_type = type;
956 item_data->it = elm_genlist_item_append(genlist, itc, item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
957 if (item_data->it == NULL) {
958 ERR("elm_genlist_item_append failed!");
966 elm_genlist_item_select_mode_set(item_data->it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
968 return item_data->it;
971 Elm_Object_Item* cal_list_base_prepend_genlist_group_item(Evas_Object *genlist,
972 const Elm_Genlist_Item_Class *itc, const struct tm *tm)
976 c_retv_if(!genlist, NULL);
978 struct tm *t = calloc(1, sizeof(struct tm));
982 cal_list_genlist_item_data *item_data = calloc(1, sizeof(cal_list_genlist_item_data));
986 item_data->it = elm_genlist_item_prepend(genlist, itc, item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
987 if (item_data->it == NULL) {
988 ERR("elm_genlist_item_prepend failed!");
993 elm_genlist_item_select_mode_set(item_data->it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
995 return item_data->it;
998 static void __cal_list_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)
1005 calendar_record_h record = data;
1007 Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
1010 elm_genlist_item_selected_set(it, EINA_FALSE);
1012 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(obj);
1013 c_retm_if(!p, "priv is null.");
1015 p->ad->cid = _calendar_get_record_index(record);
1017 if (p->select_item_callback != NULL) {
1018 p->select_item_callback(p->select_item_callback_data);
1020 cal_detail_create_view(p->ad, record, NULL, NULL);
1024 static Elm_Object_Item* __cal_list_append_genlist_item(Evas_Object *genlist,
1025 const Elm_Genlist_Item_Class *itc, calendar_record_h record, Elm_Object_Item *parent)
1029 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(genlist);
1030 c_retv_if(!p, NULL);
1032 cal_list_genlist_item_data *item_data = calloc(1, sizeof(cal_list_genlist_item_data));
1034 item_data->record = record;
1036 item_data->it = elm_genlist_item_append(genlist, itc, item_data, parent, ELM_GENLIST_ITEM_NONE, __cal_list_genlist_item_select_callback, record);
1037 if (!item_data->it) {
1038 ERR("item_data->it is null");
1045 return item_data->it;
1048 static Elm_Object_Item* __cal_list_prepend_genlist_item(Evas_Object *genlist,
1049 const Elm_Genlist_Item_Class *itc, calendar_record_h record, Elm_Object_Item *parent)
1053 cal_list_genlist_item_data *item_data = calloc(1, sizeof(cal_list_genlist_item_data));
1055 item_data->record = record;
1057 item_data->it = elm_genlist_item_prepend(genlist, itc, item_data, parent, ELM_GENLIST_ITEM_NONE, __cal_list_genlist_item_select_callback, record);
1058 c_retv_if(!item_data->it, NULL);
1060 return item_data->it;
1063 static void __cal_list_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
1065 c_retm_if(!event_info, "event_info is null");
1066 c_retm_if(!obj, "obj is null");
1068 Elm_Object_Item *it = event_info;
1070 elm_genlist_item_decorate_mode_set(it, "slide", EINA_TRUE);
1072 cal_list_base_s* p = CAL_UTIL_GET_PRIV_DATA(obj);
1073 c_retm_if(!p, "p is null");
1075 if (p->sweep_it && it != p->sweep_it)
1076 elm_genlist_item_decorate_mode_set(p->sweep_it, "slide", EINA_FALSE);
1081 static void __cal_list_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
1083 c_retm_if(!event_info, "event_info is null");
1084 Elm_Object_Item *it = event_info;
1086 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1089 static void __cal_list_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info)
1091 c_retm_if(!obj, "obj is null");
1093 Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
1096 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1099 Evas_Object* cal_list_base_get_genlist_p(cal_list_base_h list)
1101 cal_list_base_s* p = (cal_list_base_s*)list;
1102 c_retv_if(!p, NULL);
1106 static void __cal_list_base_text_refresh_callback(void *data)
1110 c_retm_if(!data, "data is null");
1111 cal_list_base_s *p = data;
1113 cal_main_update_title_text(p->ad);
1114 elm_object_text_set(p->ad->new_event_button, S_("IDS_COM_BODY_CREATE"));
1116 elm_genlist_realized_items_update(p->genlist);
1120 void cal_list_base_clear(cal_list_base_h list)
1124 cal_list_base_s* p = (cal_list_base_s*)list;
1127 elm_genlist_clear(p->genlist);
1131 void cal_list_base_delete(cal_list_base_h list)
1135 cal_list_base_s* p = (cal_list_base_s*)list;
1141 elm_object_part_content_unset(p->parent, "sw");
1143 evas_object_del(p->genlist);
1145 if (p->popup_idler) {
1146 ecore_idler_del(p->popup_idler);
1147 p->popup_idler = NULL;
1151 evas_object_del(p->popup);
1157 cal_lang_manager_remove_callback(__cal_list_base_text_refresh_callback, p);
1160 cal_list_base_h cal_list_base_create(
1161 struct appdata *ad, Evas_Object* parent, const char* part_name, bool enable_sweep_menu,
1162 cal_list_callback select_item_callback, void* select_item_callback_data)
1166 c_retv_if(ad == NULL, NULL);
1167 c_retv_if(parent == NULL, NULL);
1169 cal_list_base_s* p = (cal_list_base_s*)calloc(1, sizeof(cal_list_base_s));
1170 c_retv_if(p == NULL, NULL);
1172 Evas_Object *genlist = elm_genlist_add(parent);
1173 if (genlist == NULL) {
1174 c_warn_if(1, "elm_genlist_add failed");
1181 p->select_item_callback = select_item_callback;
1182 p->select_item_callback_data = select_item_callback_data;
1184 evas_object_data_set(genlist, "priv", p);
1186 if (enable_sweep_menu) {
1187 evas_object_smart_callback_add(genlist, "drag,start,right", __cal_list_gl_mode_right, NULL);
1188 evas_object_smart_callback_add(genlist, "drag,start,left", __cal_list_gl_mode_left, NULL);
1189 evas_object_smart_callback_add(genlist, "drag,start,up", __cal_list_gl_mode_cancel, NULL);
1190 evas_object_smart_callback_add(genlist, "drag,start,down", __cal_list_gl_mode_cancel, NULL);
1193 elm_object_part_content_set(parent, part_name, genlist);
1195 p->genlist = genlist;
1197 cal_lang_manager_add_callback(__cal_list_base_text_refresh_callback, p);
1202 void cal_list_base_delete_popup(cal_list_base_h list)
1204 cal_list_base_s* p = (cal_list_base_s*)list;
1208 evas_object_del(p->popup);
1213 void cal_list_base_delete_popup_idler(cal_list_base_h list)
1215 cal_list_base_s* p = (cal_list_base_s*)list;
1218 if (p->popup_idler) {
1219 ecore_idler_del(p->popup_idler);
1220 p->popup_idler = NULL;
1224 void cal_list_base_add_item(cal_list_base_h list, calendar_record_h record, bool prepend)
1226 cal_list_base_s* p = (cal_list_base_s*)list;
1231 Elm_Object_Item* it = elm_genlist_first_item_get(p->genlist);
1232 if (_calendar_is_task_record(record))
1233 __cal_list_prepend_genlist_item(p->genlist, &cal_task_itc, record, NULL);
1235 __cal_list_prepend_genlist_item(p->genlist, &cal_list_normal_itc, record, NULL);
1237 if (_calendar_is_task_record(record))
1238 __cal_list_append_genlist_item(p->genlist, &cal_task_itc, record, NULL);
1240 __cal_list_append_genlist_item(p->genlist, &cal_list_normal_itc, record, NULL);
1246 void cal_list_base_add_item_after(cal_list_base_h list, calendar_record_h record, Elm_Object_Item* after)
1248 cal_list_base_s* p = (cal_list_base_s*)list;
1252 cal_list_genlist_item_data *item_data = calloc(1, sizeof(cal_list_genlist_item_data));
1253 item_data->record = record;
1255 if (_calendar_is_task_record(record))
1256 item_data->it = elm_genlist_item_insert_after(p->genlist, &cal_task_itc, item_data, NULL, after, ELM_GENLIST_ITEM_NONE, __cal_list_genlist_item_select_callback, record);
1258 item_data->it = elm_genlist_item_insert_after(p->genlist, &cal_list_normal_itc, item_data, NULL, after, ELM_GENLIST_ITEM_NONE, __cal_list_genlist_item_select_callback, record);
1260 if (!item_data->it) {
1261 ERR("item_data->it is null");
1266 int cal_list_base_get_item_count(cal_list_base_h list)
1268 const cal_list_base_s* p = (cal_list_base_s*)list;
1269 return p->item_count;
1272 void cal_list_base_set_search_text(cal_list_base_h list, const char *search_text)
1274 cal_list_base_s* p = (cal_list_base_s*)list;
1277 p->searchtext = search_text;