be52be6e5867602248096c0b9a880f48b08a8f58
[apps/core/preloaded/calendar.git] / src / view-main-todo.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 \r
19 #include "view.h"\r
20 \r
21 #include <vconf.h>\r
22 #include <Elementary.h>\r
23 #include <time.h>\r
24 \r
25 #include "detail-view.h"\r
26 #include "noti-handler.h"\r
27 #include <time.h>\r
28 #include <calendar2.h>\r
29 #include <calendar_view.h>\r
30 #include "view.h"\r
31 #include "list-base.h"\r
32 #include "cal-svc.h"\r
33 \r
34 extern Elm_Genlist_Item_Class cal_list_itc_h;\r
35 \r
36 static Elm_Entry_Filter_Limit_Size _limit_20char = {\r
37         .max_char_count = 20,\r
38 };\r
39 \r
40 typedef struct {\r
41         struct appdata *ad;\r
42 \r
43         const char *searchtext;\r
44         Elm_Object_Item *sweep_it;\r
45 \r
46         Evas_Object* parent;\r
47         Evas_Object* layout;\r
48 \r
49         Evas_Object *box;\r
50         cal_list_base_h list_base;\r
51         Evas_Object *no_contents;\r
52 \r
53         Ecore_Event_Handler *event_handler;\r
54         Evas_Coord x;\r
55         Evas_Coord y;\r
56 \r
57         Elm_Object_Item* navi_item;\r
58         Elm_Object_Item *bt_new;\r
59         Elm_Object_Item *bt_delete;\r
60 \r
61         int more_idx;\r
62 \r
63         calendar_list_h list;\r
64 \r
65         struct tm tm_start;\r
66         struct tm tm_end;\r
67 \r
68         Elm_Object_Item *due_today_item;\r
69         Elm_Object_Item *no_due_date_item;\r
70         Elm_Object_Item *due_in_over_one_week_item;\r
71         Elm_Object_Item *due_within_a_week_item;\r
72         Elm_Object_Item *over_due_item;\r
73 \r
74         Evas_Object *today_button;\r
75 } cal_list_data;\r
76 \r
77 static void __cal_list_create_no_contents(cal_list_data *p)\r
78 {\r
79         CAL_FN_START;\r
80 \r
81         c_ret_if(!p);\r
82         c_ret_if(!p->layout);\r
83 \r
84         if (p->no_contents)\r
85                 return;\r
86 \r
87         char* title = NULL;\r
88 \r
89         title = C_("IDS_TASK_BODY_NO_TASKS");\r
90 \r
91         Evas_Object *no_contents = cal_util_add_search_nocontents(p->layout, title);\r
92         c_ret_if(!no_contents);\r
93 \r
94         elm_object_part_content_set(p->layout, "sw", no_contents);\r
95 \r
96         p->no_contents = no_contents;\r
97 }\r
98 \r
99 static void __cal_list_delete_no_contents(cal_list_data *p)\r
100 {\r
101         CAL_FN_START;\r
102 \r
103         c_ret_if(!p);\r
104 \r
105         if (!p->no_contents)\r
106                 return;\r
107 \r
108         elm_object_part_content_unset(p->layout, "sw");\r
109 \r
110         evas_object_del(p->no_contents);\r
111 \r
112         p->no_contents = NULL;\r
113 }\r
114 \r
115 \r
116 static void __cal_list_get_task_list(cal_list_data *p)  // mapitodo\r
117 {\r
118         CAL_FN_START;\r
119 \r
120         c_ret_if(!p);\r
121 \r
122         struct appdata *ad = p->ad;\r
123         c_ret_if(!ad);\r
124 \r
125         p->tm_start.tm_year = 70;\r
126         p->tm_end.tm_year = 137;\r
127 \r
128         p->list = _calendar_get_all_task_list(&p->tm_start, &p->tm_end, ad->is_display_complete_todo, _CALENDAR_TASK_SORT_TYPE_DUEDATE_ASC);\r
129 \r
130         CAL_FN_END;\r
131 }\r
132 \r
133 static void __cal_list_append_task_to_genlist(cal_list_data *p)\r
134 {\r
135         CAL_FN_START;\r
136 \r
137         c_ret_if(!p);\r
138 \r
139         struct appdata* ad = p->ad;\r
140         c_ret_if(!ad);\r
141 \r
142         calendar_record_h record = NULL;\r
143         calendar_error_e error = calendar_list_get_current_record_p(p->list, &record);\r
144 \r
145         while (error == CALENDAR_ERROR_NONE) {\r
146                 calendar_time_s due_time;\r
147                 calendar_record_get_caltime(record, _calendar_todo_calendar_book.due_time, &due_time);\r
148 \r
149                 if (due_time.time.utime == CALENDAR_TODO_NO_DUE_DATE) {\r
150                         if (!p->no_due_date_item) {\r
151                                 p->no_due_date_item = cal_list_base_append_genlist_group_item(\r
152                                                                                 cal_list_base_get_genlist_p(p->list_base), &cal_list_itc_h, NULL, CAL_TASK_NO_DUE_DATE);\r
153                         }\r
154                 } else {\r
155                         struct tm tm_today = ad->today_tm;\r
156                         tm_today.tm_hour = 0;\r
157                         tm_today.tm_min = 0;\r
158                         tm_today.tm_sec = 0;\r
159                         long long int today;\r
160                         cal_util_convert_tm_to_lli(NULL, &tm_today, &today);\r
161 \r
162                         struct tm tm_due_date = {0};\r
163                         cal_util_convert_lli_to_tm(NULL, due_time.time.utime, &tm_due_date);\r
164                         tm_due_date.tm_hour = 0;\r
165                         tm_due_date.tm_min= 0;\r
166                         tm_due_date.tm_sec = 0;\r
167                         long long int due_date;\r
168                         cal_util_convert_tm_to_lli(NULL, &tm_due_date, &due_date);\r
169 \r
170                         long long int diff = due_date - today;\r
171 \r
172                         if (diff < 0) {\r
173                                 if (!p->over_due_item) {\r
174                                         p->over_due_item = cal_list_base_append_genlist_group_item(\r
175                                                         cal_list_base_get_genlist_p(p->list_base), &cal_list_itc_h, NULL, CAL_TASK_OVER_DUE);\r
176                                 }\r
177                         } else if (diff == 0) { // due_date today\r
178                                 if (!p->due_today_item) {\r
179                                         p->due_today_item = cal_list_base_append_genlist_group_item(\r
180                                                         cal_list_base_get_genlist_p(p->list_base), &cal_list_itc_h, NULL, CAL_TASK_DUE_TODAY);\r
181                                 }\r
182                         } else if (diff < 7 * 24 * 60 * 60) {\r
183                                 if (!p->due_within_a_week_item) {\r
184                                         p->due_within_a_week_item = cal_list_base_append_genlist_group_item(\r
185                                                         cal_list_base_get_genlist_p(p->list_base), &cal_list_itc_h, NULL, CAL_TASK_DUE_WITHIN_A_WEEK);\r
186                                 }\r
187                         } else {\r
188                                 if (!p->due_in_over_one_week_item) {\r
189                                         p->due_in_over_one_week_item = cal_list_base_append_genlist_group_item(\r
190                                                         cal_list_base_get_genlist_p(p->list_base), &cal_list_itc_h, NULL, CAL_TASK_DUE_IN_OVER_ONE_WEEK);\r
191                                 }\r
192                         }\r
193                 }\r
194 \r
195                 cal_list_base_add_item(p->list_base, record, false);\r
196 \r
197                 error = calendar_list_next(p->list);\r
198                 c_ret_if(error != CALENDAR_ERROR_NONE);\r
199 \r
200                 error = calendar_list_get_current_record_p(p->list, &record);\r
201         }\r
202 \r
203         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_get_current_record_p() is failed(%x)", error);\r
204 \r
205         CAL_FN_END;\r
206 }\r
207 \r
208 static void __cal_list_update_genlist(cal_list_data *p)\r
209 {\r
210         CAL_FN_START;\r
211 \r
212         c_ret_if(!p);\r
213 \r
214         cal_list_base_clear(p->list_base);\r
215 \r
216         p->due_today_item = NULL;\r
217         p->no_due_date_item = NULL;\r
218         p->due_within_a_week_item = NULL;\r
219         p->due_in_over_one_week_item = NULL;\r
220         p->over_due_item = NULL;\r
221 \r
222         struct appdata* ad = p->ad;\r
223         c_ret_if(!ad);\r
224 \r
225         ad->today_item = NULL;\r
226 \r
227         int count = 0;\r
228         calendar_error_e error = calendar_list_get_count(p->list, &count);\r
229         c_ret_if(error != CALENDAR_ERROR_NONE);\r
230 \r
231         if (count > 0) {\r
232 \r
233                 __cal_list_delete_no_contents(p);\r
234 \r
235                 if (!p->list_base)\r
236                         p->list_base = cal_list_base_create(p->ad, p->layout, "sw", true, NULL, NULL);\r
237 \r
238                 __cal_list_append_task_to_genlist(p);\r
239 \r
240         } else {\r
241 \r
242                 cal_list_base_delete(p->list_base);\r
243                 p->list_base = NULL;\r
244 \r
245                 __cal_list_create_no_contents(p);\r
246         }\r
247 \r
248         CAL_FN_END;\r
249 }\r
250 \r
251 static void __cal_list_update_list(cal_list_data *p)\r
252 {\r
253         CAL_FN_START;\r
254 \r
255         c_ret_if(!p);\r
256 \r
257         calendar_list_destroy(p->list, true);\r
258 \r
259         struct appdata *ad = p->ad;\r
260         c_ret_if(!ad);\r
261 \r
262         p->tm_start = ad->base_tm;\r
263         p->tm_start.tm_hour = 0;\r
264         p->tm_start.tm_min = 0;\r
265         p->tm_start.tm_sec = 0;\r
266 \r
267         p->tm_end = p->tm_start;\r
268         p->tm_end.tm_hour = 23;\r
269         p->tm_end.tm_min = 59;\r
270         p->tm_end.tm_sec = 59;\r
271 \r
272         cal_util_update_tm_month(&p->tm_start, -3);\r
273         cal_util_update_tm_month(&p->tm_end, 3);\r
274 \r
275         __cal_list_get_task_list(p);\r
276 \r
277         __cal_list_update_genlist(p);\r
278 \r
279         CAL_FN_END;\r
280 }\r
281 \r
282 static void __cal_list_update_delete_button(cal_list_data *p);\r
283 \r
284 static void __cal_list_day_event_changed_callback(const char* view_uri, void *user_data)\r
285 {\r
286         c_retm_if(!user_data, "user_data is null");\r
287 \r
288         cal_list_data *p = user_data;\r
289 \r
290         __cal_list_update_list(p);\r
291         __cal_list_update_delete_button(p);\r
292 }\r
293 \r
294 static void __cal_todo_text_refresh_callback(void *data)\r
295 {\r
296         CAL_FN_START;\r
297 \r
298         c_retm_if(!data, "data is null");\r
299         cal_list_data *p = data;\r
300 \r
301         cal_main_update_title_text(p->ad);\r
302         elm_object_text_set(p->ad->new_event_button, S_("IDS_COM_BODY_CREATE"));\r
303 \r
304         if(p->no_contents)\r
305                 elm_object_part_text_set(p->no_contents, "elm.text", C_("IDS_TASK_BODY_NO_TASKS"));\r
306 \r
307         elm_genlist_realized_items_update(p->list);\r
308 }\r
309 \r
310 static void __cal_list_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)\r
311 {\r
312         CAL_FN_START;\r
313 \r
314         cal_list_data *p = data;\r
315         c_retm_if(!p, "priv is null.");\r
316 \r
317         calendar_db_remove_changed_cb(_calendar_event._uri, __cal_list_day_event_changed_callback, p);\r
318 \r
319         calendar_list_destroy(p->list, true);\r
320 \r
321         if (p->event_handler)\r
322                 ecore_event_handler_del(p->event_handler);\r
323 \r
324         if (p->today_button) {\r
325                 elm_object_item_part_content_set(p->ad->main_navi_item, "title_left_btn", p->today_button);\r
326                 evas_object_show(p->today_button);\r
327         }\r
328 \r
329         cal_lang_manager_remove_callback(__cal_todo_text_refresh_callback, p);\r
330 \r
331         free(p);\r
332 \r
333         CAL_FN_END;\r
334 }\r
335 \r
336 static Eina_Bool __cal_list_mouse_button_down_callback(void *data, int type, void *event)\r
337 {\r
338         c_retvm_if(!event, EINA_FALSE, "event is null");\r
339         c_retvm_if(!data, EINA_FALSE, "data is null");\r
340 \r
341         Ecore_Event_Mouse_Button *ev = event;\r
342         cal_list_data *p = data;\r
343 \r
344         p->x = ev->x;\r
345         p->y = ev->y;\r
346 \r
347         return ECORE_CALLBACK_RENEW;\r
348 }\r
349 \r
350 Evas_Object* cal_todo_create_list(struct appdata *ad, Evas_Object *parent)\r
351 {\r
352         CAL_FN_START;\r
353 \r
354         c_retv_if(!ad, NULL);\r
355         c_retv_if(!parent, NULL);\r
356 \r
357         cal_list_data *p = calloc(1, sizeof(cal_list_data));\r
358         c_retv_if(!p, NULL);\r
359 \r
360         p->ad = ad;\r
361         p->parent = parent;\r
362 \r
363         Evas_Object *layout = cal_util_add_layout(parent, "list/base/without_searchbar");\r
364 \r
365         if (!layout) {\r
366                 free(p);\r
367 \r
368                 ERR("layout is null.");\r
369 \r
370                 return NULL;\r
371         }\r
372 \r
373         evas_object_data_set(layout, "priv", p);\r
374 \r
375         p->layout = layout;\r
376         p->more_idx = -1;\r
377 \r
378         p->list = NULL;\r
379 \r
380         elm_object_disabled_set(p->ad->new_event_button, EINA_FALSE);\r
381 \r
382         Evas_Object *bg = cal_util_add_bg(layout, EINA_FALSE);\r
383         if (!bg) {\r
384 \r
385                 free(p);\r
386                 free(layout);\r
387 \r
388                 ERR("bg is null.");\r
389 \r
390                 return NULL;\r
391         }\r
392 \r
393         elm_object_part_content_set(layout, "base", bg);\r
394 \r
395         evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, __cal_list_delete_layout, p);\r
396 \r
397         p->event_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __cal_list_mouse_button_down_callback, p);\r
398 \r
399         CAL_FN_END;\r
400 \r
401         return layout;\r
402 }\r
403 \r
404 static void __cal_list_update_delete_button(cal_list_data *p)\r
405 {\r
406         c_ret_if(!p);\r
407 \r
408         Elm_Object_Item *delete_button = NULL;\r
409 \r
410         delete_button = p->ad->bt_delete;\r
411 \r
412         int count = 0;\r
413         calendar_error_e error = calendar_list_get_count(p->list, &count);\r
414         c_ret_if(error != CALENDAR_ERROR_NONE);\r
415 \r
416         if (count > 0)\r
417                 elm_object_item_disabled_set(delete_button, EINA_FALSE);\r
418         else\r
419                 elm_object_item_disabled_set(delete_button, EINA_TRUE);\r
420 }\r
421 \r
422 static void __cal_todo_search_button_callback(void *data, Evas_Object* obj, void* event_info)\r
423 {\r
424         c_retm_if(!data, "data is null");\r
425 \r
426         cal_list_data *p = data;\r
427 \r
428         Evas_Object *ly_search = cal_search_list_create_list(p->ad, p->parent);\r
429         c_retm_if(!ly_search, "ly_search is null");\r
430 \r
431         cal_search_list_update_list(ly_search);\r
432 }\r
433 \r
434 Evas_Object* cal_todo_create_view(struct appdata *ad, Evas_Object *main)\r
435 {\r
436         CAL_FN_START;\r
437 \r
438         c_retvm_if(!ad, NULL, "ad is NULL.");\r
439 \r
440         Evas_Object *ly = cal_todo_create_list(ad, main);\r
441         c_retvm_if(!ly, NULL, "ly is null.");\r
442 \r
443         ad->tapbar_focus_view = CV_TODO;\r
444 \r
445         int r;\r
446         cal_list_data *p = CAL_UTIL_GET_PRIV_DATA(ly);\r
447         c_retvm_if(!p, NULL, "p is null.");\r
448 \r
449         r = vconf_get_int(CAL_VCONFKEY_COMPLETE_TODO_ON_OFF, (int *)&ad->is_display_complete_todo);\r
450         c_retvm_if(r != 0, NULL, "vconf_get_int(CAL_VCONFKEY_COMPLETE_TODO_ON_OFF, (int *)&p->is_display_complete_todo) is failed");\r
451 \r
452         // Save today button it so that it can be restored when exiting Task view.\r
453         p->today_button = elm_object_item_part_content_get(ad->main_navi_item, "title_left_btn");\r
454         elm_object_item_part_content_unset(ad->main_navi_item, "title_left_btn");\r
455         evas_object_hide(p->today_button);\r
456 \r
457         Evas_Object *search_button = cal_util_add_toolbar_button2(ad->naviframe, "title_left_btn", "00_title_icon_search.png", __cal_todo_search_button_callback, p);\r
458 \r
459         cal_lang_manager_add_callback(__cal_todo_text_refresh_callback, p)\r
460 \r
461         CAL_FN_END;\r
462 \r
463         return ly;\r
464 }\r
465 \r
466 void cal_todo_update_view(Evas_Object *ly)\r
467 {\r
468         CAL_FN_START;\r
469 \r
470         c_retm_if(!ly, "ly is NULL.");\r
471 \r
472         cal_list_data *p = CAL_UTIL_GET_PRIV_DATA(ly);\r
473         c_ret_if(!p);\r
474 \r
475         struct appdata *ad = p->ad;\r
476         c_ret_if(!ad);\r
477 \r
478         __cal_list_update_list(p);\r
479 \r
480         __cal_list_update_delete_button(p);\r
481 \r
482         CAL_FN_END;\r
483 }\r