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
22 #include <Elementary.h>
\r
25 #include "detail-view.h"
\r
26 #include "noti-handler.h"
\r
28 #include <calendar2.h>
\r
29 #include <calendar_view.h>
\r
31 #include "list-base.h"
\r
32 #include "cal-svc.h"
\r
34 extern Elm_Genlist_Item_Class cal_list_itc_h;
\r
36 static Elm_Entry_Filter_Limit_Size _limit_20char = {
\r
37 .max_char_count = 20,
\r
43 const char *searchtext;
\r
44 Elm_Object_Item *sweep_it;
\r
46 Evas_Object* parent;
\r
47 Evas_Object* layout;
\r
50 cal_list_base_h list_base;
\r
51 Evas_Object *no_contents;
\r
53 Ecore_Event_Handler *event_handler;
\r
57 Elm_Object_Item* navi_item;
\r
58 Elm_Object_Item *bt_new;
\r
59 Elm_Object_Item *bt_delete;
\r
63 calendar_list_h list;
\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
74 Evas_Object *today_button;
\r
77 static void __cal_list_create_no_contents(cal_list_data *p)
\r
82 c_ret_if(!p->layout);
\r
89 title = C_("IDS_TASK_BODY_NO_TASKS");
\r
91 Evas_Object *no_contents = cal_util_add_search_nocontents(p->layout, title);
\r
92 c_ret_if(!no_contents);
\r
94 elm_object_part_content_set(p->layout, "sw", no_contents);
\r
96 p->no_contents = no_contents;
\r
99 static void __cal_list_delete_no_contents(cal_list_data *p)
\r
105 if (!p->no_contents)
\r
108 elm_object_part_content_unset(p->layout, "sw");
\r
110 evas_object_del(p->no_contents);
\r
112 p->no_contents = NULL;
\r
116 static void __cal_list_get_task_list(cal_list_data *p) // mapitodo
\r
122 struct appdata *ad = p->ad;
\r
125 p->tm_start.tm_year = 70;
\r
126 p->tm_end.tm_year = 137;
\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
133 static void __cal_list_append_task_to_genlist(cal_list_data *p)
\r
139 struct appdata* ad = p->ad;
\r
142 calendar_record_h record = NULL;
\r
143 calendar_error_e error = calendar_list_get_current_record_p(p->list, &record);
\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
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
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
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
170 long long int diff = due_date - today;
\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
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
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
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
195 cal_list_base_add_item(p->list_base, record, false);
\r
197 error = calendar_list_next(p->list);
\r
198 c_ret_if(error != CALENDAR_ERROR_NONE);
\r
200 error = calendar_list_get_current_record_p(p->list, &record);
\r
203 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_get_current_record_p() is failed(%x)", error);
\r
208 static void __cal_list_update_genlist(cal_list_data *p)
\r
214 cal_list_base_clear(p->list_base);
\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
222 struct appdata* ad = p->ad;
\r
225 ad->today_item = NULL;
\r
228 calendar_error_e error = calendar_list_get_count(p->list, &count);
\r
229 c_ret_if(error != CALENDAR_ERROR_NONE);
\r
233 __cal_list_delete_no_contents(p);
\r
236 p->list_base = cal_list_base_create(p->ad, p->layout, "sw", true, NULL, NULL);
\r
238 __cal_list_append_task_to_genlist(p);
\r
242 cal_list_base_delete(p->list_base);
\r
243 p->list_base = NULL;
\r
245 __cal_list_create_no_contents(p);
\r
251 static void __cal_list_update_list(cal_list_data *p)
\r
257 calendar_list_destroy(p->list, true);
\r
259 struct appdata *ad = p->ad;
\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
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
272 cal_util_update_tm_month(&p->tm_start, -3);
\r
273 cal_util_update_tm_month(&p->tm_end, 3);
\r
275 __cal_list_get_task_list(p);
\r
277 __cal_list_update_genlist(p);
\r
282 static void __cal_list_update_delete_button(cal_list_data *p);
\r
284 static void __cal_list_day_event_changed_callback(const char* view_uri, void *user_data)
\r
286 c_retm_if(!user_data, "user_data is null");
\r
288 cal_list_data *p = user_data;
\r
290 __cal_list_update_list(p);
\r
291 __cal_list_update_delete_button(p);
\r
294 static void __cal_todo_text_refresh_callback(void *data)
\r
298 c_retm_if(!data, "data is null");
\r
299 cal_list_data *p = data;
\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
305 elm_object_part_text_set(p->no_contents, "elm.text", C_("IDS_TASK_BODY_NO_TASKS"));
\r
307 elm_genlist_realized_items_update(p->list);
\r
310 static void __cal_list_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
\r
314 cal_list_data *p = data;
\r
315 c_retm_if(!p, "priv is null.");
\r
317 calendar_db_remove_changed_cb(_calendar_event._uri, __cal_list_day_event_changed_callback, p);
\r
319 calendar_list_destroy(p->list, true);
\r
321 if (p->event_handler)
\r
322 ecore_event_handler_del(p->event_handler);
\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
329 cal_lang_manager_remove_callback(__cal_todo_text_refresh_callback, p);
\r
336 static Eina_Bool __cal_list_mouse_button_down_callback(void *data, int type, void *event)
\r
338 c_retvm_if(!event, EINA_FALSE, "event is null");
\r
339 c_retvm_if(!data, EINA_FALSE, "data is null");
\r
341 Ecore_Event_Mouse_Button *ev = event;
\r
342 cal_list_data *p = data;
\r
347 return ECORE_CALLBACK_RENEW;
\r
350 Evas_Object* cal_todo_create_list(struct appdata *ad, Evas_Object *parent)
\r
354 c_retv_if(!ad, NULL);
\r
355 c_retv_if(!parent, NULL);
\r
357 cal_list_data *p = calloc(1, sizeof(cal_list_data));
\r
358 c_retv_if(!p, NULL);
\r
361 p->parent = parent;
\r
363 Evas_Object *layout = cal_util_add_layout(parent, "list/base/without_searchbar");
\r
368 ERR("layout is null.");
\r
373 evas_object_data_set(layout, "priv", p);
\r
375 p->layout = layout;
\r
380 elm_object_disabled_set(p->ad->new_event_button, EINA_FALSE);
\r
382 Evas_Object *bg = cal_util_add_bg(layout, EINA_FALSE);
\r
388 ERR("bg is null.");
\r
393 elm_object_part_content_set(layout, "base", bg);
\r
395 evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, __cal_list_delete_layout, p);
\r
397 p->event_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __cal_list_mouse_button_down_callback, p);
\r
404 static void __cal_list_update_delete_button(cal_list_data *p)
\r
408 Elm_Object_Item *delete_button = NULL;
\r
410 delete_button = p->ad->bt_delete;
\r
413 calendar_error_e error = calendar_list_get_count(p->list, &count);
\r
414 c_ret_if(error != CALENDAR_ERROR_NONE);
\r
417 elm_object_item_disabled_set(delete_button, EINA_FALSE);
\r
419 elm_object_item_disabled_set(delete_button, EINA_TRUE);
\r
422 static void __cal_todo_search_button_callback(void *data, Evas_Object* obj, void* event_info)
\r
424 c_retm_if(!data, "data is null");
\r
426 cal_list_data *p = data;
\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
431 cal_search_list_update_list(ly_search);
\r
434 Evas_Object* cal_todo_create_view(struct appdata *ad, Evas_Object *main)
\r
438 c_retvm_if(!ad, NULL, "ad is NULL.");
\r
440 Evas_Object *ly = cal_todo_create_list(ad, main);
\r
441 c_retvm_if(!ly, NULL, "ly is null.");
\r
443 ad->tapbar_focus_view = CV_TODO;
\r
446 cal_list_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
\r
447 c_retvm_if(!p, NULL, "p is null.");
\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
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
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
459 cal_lang_manager_add_callback(__cal_todo_text_refresh_callback, p)
\r
466 void cal_todo_update_view(Evas_Object *ly)
\r
470 c_retm_if(!ly, "ly is NULL.");
\r
472 cal_list_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
\r
475 struct appdata *ad = p->ad;
\r
478 __cal_list_update_list(p);
\r
480 __cal_list_update_delete_button(p);
\r