3 * Copyright 2012 Samsung Electronics Co., Ltd
\r
5 * Licensed under the Flora License, Version 1.0 (the "License");
\r
6 * you may not use this file except in compliance with the License.
\r
7 * You may obtain a copy of the License at
\r
9 * http://floralicense.org/license/
\r
11 * Unless required by applicable law or agreed to in writing, software
\r
12 * distributed under the License is distributed on an "AS IS" BASIS,
\r
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
14 * See the License for the specific language governing permissions and
\r
15 * limitations under the License.
\r
18 #include "day-expandable-list.h"
\r
20 #include "detail-view.h"
\r
24 Evas_Object *exp_genlist;
\r
25 Evas_Object *parent;
\r
27 Eina_List *event_list;
\r
28 Eina_List *task_list;
\r
30 } cal_day_expandable_list_data;
\r
32 static char* __cal_day_exp_list_get_genlist_item_label(void *data, Evas_Object *obj, const char *part);
\r
33 static Evas_Object* __cal_day_exp_list_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part);
\r
34 static void __cal_day_delete_exp_list_genlist_item(void *data, Evas_Object *obj);
\r
36 static Elm_Genlist_Item_Class itc_1text_1icon_allday = {
\r
37 .item_style = "1text.1icon.9.allday",
\r
38 .func.text_get = __cal_day_exp_list_get_genlist_item_label,
\r
39 .func.content_get = __cal_day_exp_list_get_genlist_item_icon,
\r
40 .func.del = __cal_day_delete_exp_list_genlist_item,
\r
43 static Elm_Genlist_Item_Class itc_1text_1icon_task = {
44 .item_style = "1text.1icon.9.task",
45 .func.text_get = __cal_day_exp_list_get_genlist_item_label,
\r
46 .func.content_get = __cal_day_exp_list_get_genlist_item_icon,
\r
47 .func.del = __cal_day_delete_exp_list_genlist_item,
\r
52 calendar_record_h record;
53 }cal_day_exp_list_genlist_item_data;
\r
55 static _calendar_book_color calendar_color = {0};
\r
57 static void __cal_day_delete_exp_list_genlist_item(void *data, Evas_Object *obj)
\r
59 c_retm_if(!data, "data is null.");
60 cal_day_exp_list_genlist_item_data *item_data = data;
\r
66 static void __cal_day_genlist_item_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
\r
71 cal_day_exp_list_genlist_item_data *item_data = data;
\r
73 Evas_Object *genlist = evas_object_data_get(obj, "genlist");
76 calendar_record_h record= item_data->record;
79 Eina_Bool check_status = elm_check_state_get(obj);
81 calendar_error_e error = CALENDAR_ERROR_NONE;
82 calendar_record_h todo_original_record = NULL;
83 int todo_id = _calendar_get_record_index(record);
84 error = calendar_db_get_record(_calendar_todo._uri, todo_id, &todo_original_record);
85 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_get_record(%d) is failed(%x)", todo_id, error);
88 error = calendar_record_set_int(todo_original_record, _calendar_todo.todo_status, CALENDAR_TODO_STATUS_COMPLETED);
89 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
91 error = calendar_record_set_int(record, _calendar_todo_calendar_book.todo_status, CALENDAR_TODO_STATUS_COMPLETED);
92 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
95 error = calendar_record_set_int(todo_original_record, _calendar_todo.todo_status, CALENDAR_TODO_STATUS_IN_PROCESS);
96 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
98 error = calendar_record_set_int(record, _calendar_todo_calendar_book.todo_status, CALENDAR_TODO_STATUS_IN_PROCESS);
99 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_set_int() is failed(%x)", error);
102 cal_day_expandable_list_data *p = evas_object_data_get(genlist, "priv");
\r
106 cal_main_remove_db_changed_callback(p->ad);
108 error = calendar_db_update_record(todo_original_record);
109 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_update_record() is failed(%x)", error);
111 cal_main_add_db_changed_callback(p->ad);
113 elm_genlist_item_update(item_data->it);
117 static Evas_Object* __cal_day_exp_list_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
\r
119 c_retv_if(!data, NULL);
121 cal_day_exp_list_genlist_item_data *item_data = data;
\r
122 calendar_record_h record = item_data->record;
123 c_retv_if(!record, NULL);
125 Evas_Object *icon = NULL;
\r
127 if (!CAL_STRCMP(part, "elm.swallow.colorbar")) {
\r
129 _calendar_get_calendar_color(record, &calendar_color);
\r
131 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
\r
132 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
\r
133 evas_object_color_set(icon, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
\r
137 } else if (!CAL_STRCMP(part, "elm.icon")) {
138 if (!_calendar_is_task_record(record))
141 Evas_Object *check = elm_check_add(obj);
142 c_retvm_if(!check, NULL, "elm_check_add returned null");
144 Eina_Bool check_status = EINA_FALSE;
146 calendar_error_e error = CALENDAR_ERROR_NONE;
148 calendar_todo_status_e todo_status = CALENDAR_TODO_STATUS_NONE;
150 error = calendar_record_get_int(record, _calendar_todo_calendar_book.todo_status, (int *)&todo_status);
151 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
153 if (CALENDAR_TODO_STATUS_COMPLETED == todo_status) {
154 check_status = EINA_TRUE;
155 } else if (CALENDAR_TODO_STATUS_IN_PROCESS == todo_status) {
156 check_status = EINA_FALSE;
159 elm_check_state_pointer_set(check, &check_status);
160 evas_object_data_set(check, "genlist", obj);
161 evas_object_smart_callback_add(check, "changed", __cal_day_genlist_item_check_changed_callback, item_data);
162 evas_object_propagate_events_set(check, EINA_FALSE);
170 static char* __cal_day_exp_list_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
\r
172 c_retv_if(!data, NULL);
174 cal_day_exp_list_genlist_item_data *item_data = data;
\r
175 calendar_record_h record = item_data->record;
176 c_retv_if(!record, NULL);
180 if (!CAL_STRCMP(part, "elm.textblock")) {
181 str = _calendar_get_summary(record);
183 char *text = calloc(1, CAL_STRLEN(str) + 256);
186 c_retv_if(!text, NULL);
\r
189 if (_calendar_is_task_record(record)) {
190 calendar_error_e error = CALENDAR_ERROR_NONE;
192 calendar_todo_status_e todo_status = CALENDAR_TODO_STATUS_NONE;
194 error = calendar_record_get_int(record, _calendar_todo_calendar_book.todo_status, (int *)&todo_status);
195 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
197 if (CALENDAR_TODO_STATUS_COMPLETED == todo_status) {
198 sprintf(text, "<strikethrough=on strikethrough_color=#2A89C2>%s</strikethrough>",str);
200 sprintf(text, "%s",str);
203 sprintf(text, "%s", str);
215 static void __cal_day_exp_list_delete_layout_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
\r
221 cal_day_expandable_list_data *p = data;
\r
223 _calendar_free_record_list(&p->event_list);
224 _calendar_free_record_list(&p->task_list);
229 Evas_Object* cal_day_exp_list_create(Evas_Object *parent, char *content_name, struct appdata *ad)
\r
231 c_retv_if(!parent, NULL);
\r
232 c_retv_if(!content_name, NULL);
\r
233 c_retv_if(!ad, NULL);
\r
235 cal_day_expandable_list_data *p;
\r
237 CAL_CALLOC(p, 1, cal_day_expandable_list_data);
\r
239 Evas_Object *genlist = elm_genlist_add(parent);
\r
242 c_retv_if(!genlist, NULL);
\r
245 elm_object_part_content_set(parent, "list/sw", genlist);
\r
247 evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, __cal_day_exp_list_delete_layout_callback, p);
\r
249 p->exp_genlist = genlist;
\r
251 p->parent = parent;
\r
253 evas_object_data_set(genlist, "priv", p);
\r
258 static Eina_Bool __cal_day_exp_list_ug_callback(void *data)
\r
260 c_retv_if(!data, EINA_FALSE);
262 struct appdata *ad = data;
\r
263 c_retv_if(!ad->main, EINA_FALSE);
\r
267 Evas_Object *content = elm_object_part_content_get(ad->main, "cont");
\r
268 c_retv_if(!content, EINA_FALSE);
\r
270 cal_day_change_content_display_status(content);
\r
275 static void __cal_day_exp_list_genlist_item_select_callback(void *data, Evas_Object *obj, void *ei)
\r
279 calendar_record_h record = data;
281 Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
283 elm_genlist_item_selected_set(it, EINA_FALSE);
285 cal_day_expandable_list_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
\r
288 p->ad->cid = _calendar_get_record_index(record);
290 cal_detail_create_view(p->ad, record, __cal_day_exp_list_ug_callback, p->ad);
\r
292 cal_day_change_content_display_status(p->parent);
\r
295 static void __cal_day_exp_list_update_expandable_list_title(Evas_Object *ly)
\r
299 char title[32] = {0};
301 snprintf(title, sizeof(title), "%s %s & %s", C_("IDS_COM_BODY_ALL_DAY"), "event", C_("IDS_CLD_BODY_TASKS"));
303 elm_object_part_text_set(ly, "list/title/text", title);
306 static void __cal_day_exp_list_get_events(cal_day_expandable_list_data *p)
\r
308 struct tm tm_start = p->ad->base_tm;
309 tm_start.tm_hour = 0;
313 struct tm tm_end = tm_start;
318 p->event_list = _calendar_get_allday_instance_list(&tm_start, &tm_end);
321 static void __cal_day_exp_list_get_tasks(cal_day_expandable_list_data *p)
\r
325 struct tm tm_start = p->ad->base_tm;
326 tm_start.tm_hour = 0;
330 struct tm tm_end = tm_start;
335 p->task_list = _calendar_get_due_date_task_list(&tm_start, &tm_end, p->ad->is_display_complete_todo, _CALENDAR_TASK_SORT_TYPE_DUEDATE_ASC);
338 void cal_day_exp_list_update(Evas_Object *ly)
\r
344 cal_day_expandable_list_data *p = CAL_UTIL_GET_PRIV_DATA (ly);
\r
346 c_ret_if(!p->exp_genlist);
\r
350 elm_genlist_clear(p->exp_genlist);
\r
351 _calendar_free_record_list(&p->event_list);
352 _calendar_free_record_list(&p->task_list);
354 __cal_day_exp_list_get_events(p);
\r
356 calendar_record_h record = NULL;
358 EINA_LIST_FOREACH(p->event_list, l, record) {
360 cal_day_exp_list_genlist_item_data *item_data = calloc(1, sizeof(cal_day_exp_list_genlist_item_data));
\r
361 c_ret_if(!item_data);
363 item_data->record = record;
364 item_data->it = elm_genlist_item_append(p->exp_genlist, &itc_1text_1icon_allday, item_data, NULL,
\r
365 ELM_GENLIST_ITEM_NONE, __cal_day_exp_list_genlist_item_select_callback, record);
\r
370 __cal_day_exp_list_get_tasks(p);
\r
373 EINA_LIST_FOREACH(p->task_list, l, record) {
375 cal_day_exp_list_genlist_item_data *item_data = calloc(1, sizeof(cal_day_exp_list_genlist_item_data));
\r
376 c_ret_if(!item_data);
378 item_data->record = record;
379 item_data->it = elm_genlist_item_append(p->exp_genlist, &itc_1text_1icon_task, item_data, NULL,
\r
380 ELM_GENLIST_ITEM_NONE, __cal_day_exp_list_genlist_item_select_callback, record);
\r
385 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->parent), "list,hide");
\r
387 if (elm_genlist_items_count(p->exp_genlist))
\r
388 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->parent), "list,unexpanded");
\r
390 __cal_day_exp_list_update_expandable_list_title(p->parent);
\r