Tizen 2.1 base
[apps/core/preloaded/calendar.git] / src / day-expandable-list.c
1 /*\r
2   *\r
3   *  Copyright 2012  Samsung Electronics Co., Ltd\r
4   *\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
8   *\r
9   *       http://floralicense.org/license/\r
10   *\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
16   */\r
17 \r
18 #include "day-expandable-list.h"\r
19 #include "view.h"\r
20 #include "detail-view.h"\r
21 \r
22 typedef struct {\r
23         struct appdata *ad;\r
24         Evas_Object *exp_genlist;\r
25         Evas_Object *parent;\r
26 \r
27         Eina_List *event_list;\r
28         Eina_List *task_list;\r
29 \r
30 } cal_day_expandable_list_data;\r
31 \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
35
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
41 };\r
42 \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
48 };\r
49 \r
50 typedef struct {
51         Elm_Object_Item *it;
52         calendar_record_h record;
53 }cal_day_exp_list_genlist_item_data;\r
54 \r
55 static _calendar_book_color calendar_color = {0};\r
56 \r
57 static void __cal_day_delete_exp_list_genlist_item(void *data, Evas_Object *obj)\r
58 {
59         c_retm_if(!data, "data is null.");
60         cal_day_exp_list_genlist_item_data *item_data = data;\r
61
62         free(item_data);
63         item_data = NULL;
64 }
65 \r
66 static void __cal_day_genlist_item_check_changed_callback(void *data, Evas_Object *obj, void *event_info)\r
67 {
68         c_ret_if(!data);
69         c_ret_if(!obj);
70
71         cal_day_exp_list_genlist_item_data *item_data = data;\r
72
73         Evas_Object *genlist = evas_object_data_get(obj, "genlist");
74         c_ret_if(!genlist);
75
76         calendar_record_h record= item_data->record;
77         c_ret_if(!record);
78
79         Eina_Bool check_status = elm_check_state_get(obj);
80
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);
86
87         if (check_status) {
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);
90
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);
93
94         } else {
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);
97
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);
100         }
101
102         cal_day_expandable_list_data *p = evas_object_data_get(genlist, "priv");\r
103         c_ret_if(!p);
104         c_ret_if(!p->ad);
105
106         cal_main_remove_db_changed_callback(p->ad);
107
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);
110
111         cal_main_add_db_changed_callback(p->ad);
112
113         elm_genlist_item_update(item_data->it);
114
115 }
116 \r
117 static Evas_Object* __cal_day_exp_list_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)\r
118 {
119         c_retv_if(!data, NULL);
120
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);
124
125         Evas_Object *icon = NULL;\r
126 \r
127         if (!CAL_STRCMP(part, "elm.swallow.colorbar")) {\r
128 \r
129                 _calendar_get_calendar_color(record, &calendar_color);\r
130 \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
134 \r
135                 return icon;\r
136 \r
137         } else if (!CAL_STRCMP(part, "elm.icon")) {
138                 if (!_calendar_is_task_record(record))
139                         return NULL;
140
141                 Evas_Object *check = elm_check_add(obj);
142                 c_retvm_if(!check, NULL, "elm_check_add returned null");
143
144                 Eina_Bool check_status = EINA_FALSE;
145
146                 calendar_error_e error = CALENDAR_ERROR_NONE;
147
148                 calendar_todo_status_e todo_status = CALENDAR_TODO_STATUS_NONE;
149
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);
152
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;
157                 }
158
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);
163
164                 return check;
165         }
166
167         return NULL;
168 }\r
169 \r
170 static char* __cal_day_exp_list_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)\r
171 {
172         c_retv_if(!data, NULL);
173
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);
177
178         char *str = NULL;
179
180         if (!CAL_STRCMP(part, "elm.textblock")) {
181                 str = _calendar_get_summary(record);
182
183                 char *text = calloc(1, CAL_STRLEN(str) + 256);
184                 if(!text)       {\r
185                         free(str);\r
186                         c_retv_if(!text, NULL);\r
187                 }
188
189                 if (_calendar_is_task_record(record)) {
190                         calendar_error_e error = CALENDAR_ERROR_NONE;
191
192                         calendar_todo_status_e todo_status = CALENDAR_TODO_STATUS_NONE;
193
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);
196
197                         if (CALENDAR_TODO_STATUS_COMPLETED == todo_status) {
198                                 sprintf(text, "<strikethrough=on strikethrough_color=#2A89C2>%s</strikethrough>",str);
199                         } else {
200                                 sprintf(text, "%s",str);
201                         }
202                 } else {
203                         sprintf(text, "%s", str);
204                 }
205
206                 free(str);
207
208                 return text;
209         }
210
211         return NULL;
212 }
213 \r
214 \r
215 static void __cal_day_exp_list_delete_layout_callback(void *data, Evas *e, Evas_Object *obj, void *ei)\r
216 {
217         CAL_FN_START;
218
219         CAL_ASSERT(data);
220
221         cal_day_expandable_list_data *p = data;\r
222
223         _calendar_free_record_list(&p->event_list);
224         _calendar_free_record_list(&p->task_list);
225
226         free(p);
227 }
228 \r
229 Evas_Object* cal_day_exp_list_create(Evas_Object *parent, char *content_name, struct appdata *ad)\r
230 {\r
231         c_retv_if(!parent, NULL);\r
232         c_retv_if(!content_name, NULL);\r
233         c_retv_if(!ad, NULL);\r
234 \r
235         cal_day_expandable_list_data *p;\r
236 \r
237         CAL_CALLOC(p, 1, cal_day_expandable_list_data);\r
238 \r
239         Evas_Object *genlist = elm_genlist_add(parent);\r
240         if(!genlist){\r
241                 free(p);\r
242                 c_retv_if(!genlist, NULL);\r
243         }\r
244 \r
245         elm_object_part_content_set(parent, "list/sw", genlist);\r
246 \r
247         evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, __cal_day_exp_list_delete_layout_callback, p);\r
248 \r
249         p->exp_genlist = genlist;\r
250         p->ad = ad;\r
251         p->parent = parent;\r
252 \r
253         evas_object_data_set(genlist, "priv", p);\r
254 \r
255         return genlist;\r
256 }\r
257 \r
258 static Eina_Bool __cal_day_exp_list_ug_callback(void *data)\r
259 {
260         c_retv_if(!data, EINA_FALSE);
261
262         struct appdata *ad = data;\r
263         c_retv_if(!ad->main, EINA_FALSE);\r
264
265         ad->ug = NULL;
266
267         Evas_Object *content = elm_object_part_content_get(ad->main, "cont");\r
268         c_retv_if(!content, EINA_FALSE);\r
269 \r
270         cal_day_change_content_display_status(content);\r
271 \r
272         return EINA_TRUE;\r
273 }\r
274 \r
275 static void __cal_day_exp_list_genlist_item_select_callback(void *data, Evas_Object *obj, void *ei)\r
276 {
277         c_ret_if(!data);
278
279         calendar_record_h record = data;
280
281         Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
282         if (it)
283                 elm_genlist_item_selected_set(it, EINA_FALSE);
284
285         cal_day_expandable_list_data *p = CAL_UTIL_GET_PRIV_DATA(obj);\r
286         c_ret_if(!p);
287
288         p->ad->cid = _calendar_get_record_index(record);
289
290         cal_detail_create_view(p->ad, record, __cal_day_exp_list_ug_callback, p->ad);\r
291
292         cal_day_change_content_display_status(p->parent);\r
293 }\r
294 \r
295 static void __cal_day_exp_list_update_expandable_list_title(Evas_Object *ly)\r
296 {
297         c_ret_if(!ly);
298
299         char title[32] = {0};
300
301         snprintf(title, sizeof(title), "%s %s & %s", C_("IDS_COM_BODY_ALL_DAY"), "event", C_("IDS_CLD_BODY_TASKS"));
302
303         elm_object_part_text_set(ly, "list/title/text", title);
304 }
305 \r
306 static void __cal_day_exp_list_get_events(cal_day_expandable_list_data *p)\r
307 {
308         struct tm tm_start = p->ad->base_tm;
309         tm_start.tm_hour = 0;
310         tm_start.tm_min = 0;
311         tm_start.tm_sec = 0;
312
313         struct tm tm_end = tm_start;
314         tm_end.tm_hour = 23;
315         tm_end.tm_min = 59;
316         tm_end.tm_sec = 59;
317
318         p->event_list = _calendar_get_allday_instance_list(&tm_start, &tm_end);
319 }
320
321 static void __cal_day_exp_list_get_tasks(cal_day_expandable_list_data *p)\r
322 {
323         c_ret_if(!p);
324
325         struct tm tm_start = p->ad->base_tm;
326         tm_start.tm_hour = 0;
327         tm_start.tm_min = 0;
328         tm_start.tm_sec = 0;
329
330         struct tm tm_end = tm_start;
331         tm_end.tm_hour = 23;
332         tm_end.tm_min = 59;
333         tm_end.tm_sec = 59;
334
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);
336 }\r
337 \r
338 void cal_day_exp_list_update(Evas_Object *ly)\r
339 {
340         CAL_FN_START;
341
342         c_ret_if(!ly);
343
344         cal_day_expandable_list_data *p = CAL_UTIL_GET_PRIV_DATA (ly);\r
345         c_ret_if(!p);
346         c_ret_if(!p->exp_genlist);\r
347
348         Eina_List *l;
349
350         elm_genlist_clear(p->exp_genlist);\r
351         _calendar_free_record_list(&p->event_list);
352         _calendar_free_record_list(&p->task_list);
353
354         __cal_day_exp_list_get_events(p);\r
355
356         calendar_record_h record = NULL;
357         if (p->event_list) {
358                 EINA_LIST_FOREACH(p->event_list, l, record) {
359                         if (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);
362
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
366                         }
367                 }
368         }
369
370         __cal_day_exp_list_get_tasks(p);\r
371
372         if (p->task_list) {
373                 EINA_LIST_FOREACH(p->task_list, l, record) {
374                         if (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);
377
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
381                         }
382                 }
383         }
384
385         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->parent), "list,hide");\r
386
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
389 \r
390         __cal_day_exp_list_update_expandable_list_title(p->parent);\r
391 }
392 \r