3 Copyright (c) 2000-2012 Samsung Electronics Co., Ltd All Rights Reserved
5 This file is part of org.tizen.efl-calendar
6 Written by Taeho Kang <taeho84.kang@samsung.com>
8 PROPRIETARY/CONFIDENTIAL
10 This software is the confidential and proprietary information of
11 SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
12 disclose such Confidential Information and shall use it only in
13 accordance with the terms of the license agreement you entered
14 into with SAMSUNG ELECTRONICS.
16 SAMSUNG make no representations or warranties about the suitability
17 of the software, either express or implied, including but not limited
18 to the implied warranties of merchantability, fitness for a particular
19 purpose, or non-infringement. SAMSUNG shall not be liable for any
20 damages suffered by licensee as a result of using, modifying or
21 distributing this software or its derivatives.
30 static const char *_name = "main";
35 Evas_Object *ly; // self
36 enum cld_view cur_view;
39 Evas_Object *tab; /* tab layout */
40 Evas_Object *title; /* title layout */
42 Ecore_Timer *down_timer;
43 double intval, intval_init;
51 Evas_Object* (*create)(struct appdata *ad, Evas_Object *ly);
52 void (*update)(Evas_Object *ly);
53 Elm_Object_Item *item;
57 static struct _tabbar_item tabbar_items[] = {
61 N_(CAL_UTIL_DATE_FORMAT_5),
69 N_(CAL_UTIL_DATE_FORMAT_15),
70 cal_month_create_view,
71 cal_month_update_view,
77 N_(CAL_UTIL_DATE_FORMAT_7),
92 static void __cal_main_new_button_callback(void *data, Evas_Object *obj, void *event_info)
94 c_retm_if(!data, "data is null");
95 c_retm_if(!obj, "obj is null");
97 Evas_Object *ly = data;
98 cal_main_data *main_data;
100 main_data = CAL_UTIL_GET_PRIV_DATA(ly);
101 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
103 main_data->ad->base_hour = -1;
104 main_data->ad->cid = 0;
106 cal_edit_create_view(main_data->ad, main_data->ly);
109 static void __cal_main_delete_button_callback(void *data, Evas_Object *obj, void *event_info)
111 c_retm_if(!data, "data is null");
112 c_retm_if(!obj, "obj is null");
114 Evas_Object *ly = data;
115 Evas_Object *ly_delete = NULL;
116 cal_main_data *main_data;
118 main_data = CAL_UTIL_GET_PRIV_DATA(ly);
119 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
121 ly_delete = cal_list_delete_view_create(main_data->ly,main_data->ad);
122 c_retm_if(!ly_delete, "ly_delete is null");
123 cal_list_delete_update_view(ly_delete);
128 static void __cal_main_account_button_callback(void *data, Evas_Object *obj, void *ei)
130 c_retm_if(!data, "data is null");
131 c_retm_if(!obj, "obj is null");
133 Evas_Object *ly = data;
134 cal_main_data *main_data;
136 main_data= CAL_UTIL_GET_PRIV_DATA(ly);
137 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
139 cal_account_create_view(main_data->ad, ly);
142 void cal_main_update_title_text(Evas_Object *title, enum cld_view v, struct tm *t, int week_start)
144 c_retm_if(!title, "title is null");
145 c_retm_if(!t, "t is null");
147 if (tabbar_items[v].title)
148 cal_util_set_time_text(CAL_UTIL_GET_EDJ_DATA(title), "title/text", _(tabbar_items[v].title), NULL, t);
151 static inline void __cal_main_update_title(Evas_Object *ly, enum cld_view v)
153 c_retm_if(!ly, "ly is null");
155 cal_main_data *main_data;
157 main_data = CAL_UTIL_GET_PRIV_DATA(ly);
158 c_retm_if(!main_data|| strcmp(main_data->name, _name), "Invaild Object");
161 c_retm_if(!ad, "p->ad is null");
163 if (tabbar_items[v].title) {
164 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,title", "prog");
166 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "hide,title", "prog");
170 static void __cal_main_tabbar_changed_callback(void *data, Evas_Object *obj, void *event_info)
174 c_retm_if(!data, "data is null");
175 c_retm_if(!obj, "obj is null");
177 struct appdata *ad = data;
178 c_retm_if(!ad->main, "ad->main is null");
180 cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
181 c_retm_if(!main_data, "main_data is null");
183 Elm_Object_Item *selected_item = NULL;
186 selected_item = elm_segment_control_item_selected_get(obj);
187 c_retm_if(!selected_item, "elm_toolbar_selected_item_get returned null");
189 for (i = 0; i < sizeof(tabbar_items)/sizeof(tabbar_items[0]); i++) {
190 if (tabbar_items[i].item == selected_item) {
192 cal_main_change_view(ad->main, i);
198 static void __cal_main_init_navi_title()
200 tabbar_items[CV_YEAR].msgid = C_("IDS_CLD_BODY_YEAR");
201 tabbar_items[CV_MONTH].msgid = C_("IDS_CLD_BODY_VIEWBY_MONTH");
202 tabbar_items[CV_DAY].msgid = C_("IDS_CLD_BODY_DAY");
203 tabbar_items[CV_LIST].msgid = C_("IDS_CLD_BODY_LIST");
206 static void __cal_main_add_tabbar(struct appdata *ad)
208 c_retm_if(!ad, "ad is null");
209 c_retm_if(!ad->main, "ad->main is null");
211 Evas_Object *tabbar = elm_segment_control_add(ad->main);
212 c_retm_if(!tabbar, "tabbar is null");
214 elm_object_style_set(tabbar, "body_style");
218 tabbar_items[CV_MONTH].item = elm_segment_control_item_add(tabbar, NULL, tabbar_items[CV_MONTH].msgid);
219 c_retm_if(!tabbar_items[CV_MONTH].item, "elm_segment_control_item_add returned null");
221 tabbar_items[CV_YEAR].item = elm_segment_control_item_insert_at(tabbar, NULL, tabbar_items[CV_YEAR].msgid, 0);
222 c_retm_if(!tabbar_items[CV_YEAR].item, "elm_segment_control_item_add returned null");
224 tabbar_items[CV_DAY].item = elm_segment_control_item_add(tabbar, NULL, tabbar_items[CV_DAY].msgid);
225 c_retm_if(!tabbar_items[CV_DAY].item, "elm_segment_control_item_add returned null");
227 tabbar_items[CV_LIST].item = elm_segment_control_item_add(tabbar, NULL, tabbar_items[CV_LIST].msgid);
228 c_retm_if(!tabbar_items[CV_LIST].item, "elm_segment_control_item_add returned null");
230 elm_segment_control_item_selected_set( tabbar_items[CV_MONTH].item, EINA_TRUE);
232 evas_object_smart_callback_add(tabbar, "changed", __cal_main_tabbar_changed_callback, ad);
234 elm_object_item_part_content_set(ad->main_navi_item, "segment3", tabbar);
237 static void __cal_main_create_content(Evas_Object *ly, cal_main_data *main_data, enum cld_view v)
239 c_retm_if(!ly, "ly is null");
240 c_retm_if(!main_data, "main_data is null");
243 struct appdata *ad = main_data->ad;
245 cal_util_delete_evas_object(&main_data->content);
247 if (tabbar_items[v].create)
248 main_data->content = tabbar_items[v].create(ad, ly);
250 if (!main_data->content) {
251 ERR("load layout error");
255 elm_object_part_content_set(ly, "cont", main_data->content);
258 static inline int __cal_main_update_tm(struct tm *t, enum cld_view v, int delta)
260 c_retvm_if(!t, -1, "t is null");
266 r = cal_util_update_tm_year(t, delta);
269 r = cal_util_update_tm_month(t, delta);
272 r = cal_util_update_tm_day(t, delta);
278 r = -1; // stop timer
284 static int __cal_main_update_content(cal_main_data *main_data)
286 c_retvm_if(!main_data, -1, "main_data is null");
294 c_retvm_if(!ad, -1, "ad is null");
296 v = main_data->cur_view;
299 r = __cal_main_update_tm(&tmp, v, main_data->delta);
301 DBG("Time out of range");
306 cal_main_update_title_text(main_data->title, v, &ad->base_tm, ad->wday_start);
308 if (tabbar_items[v].update)
309 tabbar_items[v].update(main_data->content);
311 ad->is_update_view = EINA_FALSE;
316 static Eina_Bool __cal_main_update_content_by_timer(void *data)
318 c_retvm_if(!data, ECORE_CALLBACK_CANCEL, "data is null");
320 cal_main_data *main_data;
323 main_data = CAL_UTIL_GET_PRIV_DATA(data);
324 c_retvm_if(!main_data, ECORE_CALLBACK_CANCEL, "CAL_UTIL_GET_PRIV_DATA returned null");
326 r = __cal_main_update_content(main_data);
328 main_data->down_timer = NULL;
329 return ECORE_CALLBACK_CANCEL;
332 main_data->intval = main_data->intval / 1.05;
333 ecore_timer_interval_set(main_data->down_timer, main_data->intval);
335 return ECORE_CALLBACK_RENEW;
338 void cal_main_change_view(Evas_Object *ly, enum cld_view v)
342 c_retm_if(!ly, "Input parameter is null");
343 c_retm_if(v < CV_YEAR || v > CV_LIST, "Invaild view index");
346 cal_main_data *main_data;
347 Elm_Object_Item * it;
349 main_data = CAL_UTIL_GET_PRIV_DATA(ly);
350 c_retm_if(!main_data|| strcmp(main_data->name, _name), "Invaild Object");
352 if (main_data->cur_view == v)
356 c_retm_if(!ad, "p->ad is null");
357 __cal_main_create_content(ly, main_data, v);
358 __cal_main_update_title(ly, v);
361 if (ad->bt_delete == NULL) {
362 it = elm_toolbar_last_item_get(ad->cbar);
363 ad->bt_delete = elm_toolbar_item_insert_before(ad->cbar, it, NULL, S_("IDS_COM_BODY_DELETE"), __cal_main_delete_button_callback,ad->main);
366 if (ad->bt_delete != NULL) {
367 elm_object_item_del(ad->bt_delete);
368 ad->bt_delete = NULL;
372 main_data->cur_view = v;
374 __cal_main_update_content(main_data);
377 elm_segment_control_item_selected_set( tabbar_items[v].item, EINA_TRUE);
382 static void __cal_main_set_base_tm(Evas_Object *ly)
384 c_retm_if(!ly, "ly is null");
386 cal_main_data *main_data;
389 main_data = CAL_UTIL_GET_PRIV_DATA(ly);
390 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
393 c_retm_if(!ad, "ad is null");
395 if(main_data->cur_view == CV_LIST)
397 cal_list_scroll_today(ad);
401 if(ad->base_tm.tm_year == ad->today_tm.tm_year)
402 if(ad->base_tm.tm_mon == ad->today_tm.tm_mon)
403 if(ad->base_tm.tm_mday == ad->today_tm.tm_mday)
406 ad->base_tm = ad->today_tm;
408 __cal_main_update_content(main_data);
411 static void __cal_main_inc_start(void *data, Evas_Object *obj, const char *e, const char *src)
413 cal_main_data *main_data;
415 main_data = CAL_UTIL_GET_PRIV_DATA(data);
416 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
418 main_data->intval = main_data->intval_init;
419 main_data->delta = 1;
421 if (main_data->down_timer)
422 ecore_timer_del(main_data->down_timer);
424 main_data->down_timer = ecore_timer_add(main_data->intval, __cal_main_update_content_by_timer, data);
425 __cal_main_update_content(main_data);
428 static void __cal_main_dec_start(void *data, Evas_Object *obj, const char *e, const char *src)
430 cal_main_data *main_data;
432 main_data = CAL_UTIL_GET_PRIV_DATA(data);
433 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
435 main_data->intval = main_data->intval_init;
436 main_data->delta = -1;
438 if (main_data->down_timer)
439 ecore_timer_del(main_data->down_timer);
441 main_data->down_timer = ecore_timer_add(main_data->intval, __cal_main_update_content_by_timer, data);
442 __cal_main_update_content(main_data);
445 static void __cal_main_stop(void *data, Evas_Object *obj, const char *e, const char *src)
447 cal_main_data *main_data;
449 main_data = CAL_UTIL_GET_PRIV_DATA(data);
450 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
452 if (main_data->down_timer)
453 ecore_timer_del(main_data->down_timer);
455 main_data->down_timer = NULL;
456 main_data->delta = 0;
459 static int __cal_main_add_title(struct appdata *ad, Evas_Object *ly)
461 c_retvm_if(!ad, -1, "ad is null");
462 c_retvm_if(!ly, -1, "ly is null");
464 cal_main_data *main_data;
467 title = cal_util_add_layout(ad->nv, "main/title");
468 c_retvm_if(!title, -1, "cal_util_add_layout returned null");
470 elm_object_part_content_set(ly, "title", title);
472 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "start,inc", "title", __cal_main_inc_start, ly);
473 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "start,dec", "title", __cal_main_dec_start, ly);
474 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "stop,dec", "title", __cal_main_stop, ly);
475 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "stop,inc", "title", __cal_main_stop, ly);
477 main_data = CAL_UTIL_GET_PRIV_DATA(ly);
478 c_retvm_if(!main_data, -1, "CAL_UTIL_GET_PRIV_DATA returned null");
480 main_data->title = title;
486 static void __cal_main_update_all(void* data)
488 c_retm_if(!data, "data is null");
490 struct appdata* ad = data;
491 cal_main_update_view(ad);
494 void cal_main_add_changed_callback(struct appdata * ad)
498 c_retm_if(!ad, "ad is null");
500 CALENDAR_SVC_ADD_EVENT_CHANGED_CALLBACK(cal_main_update_view, ad);
502 CALENDAR_SVC_ADD_CALENDAR_CHANGED_CALLBACK(CAL_STRUCT_CALENDAR, __cal_main_update_all, ad);
507 void cal_main_del_changed_callback()
511 CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(cal_main_update_view);
513 CALENDAR_SVC_DEL_CALENDAR_CHANGED_CALLBACK(CAL_STRUCT_CALENDAR, __cal_main_update_all);
518 static void __cal_main_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
522 c_retm_if(!obj, "obj is null");
524 cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(obj);
525 c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
527 struct appdata *ad = main_data->ad;
528 c_retm_if(!ad, "ad is null");
530 cal_main_del_changed_callback();
532 if (main_data->down_timer)
533 ecore_timer_del(main_data->down_timer);
536 evas_object_del(ad->tabbar);
545 static Evas_Object *__cal_main_create_main_layout(struct appdata *ad)
547 c_retvm_if(!ad, NULL, "ad is null");
551 cal_main_data *main_data = calloc(1, sizeof(cal_main_data));
552 c_retvm_if(!main_data, NULL, "calloc(1, sizeof(cal_main_data)) returned null");
554 main_data->name = _name;
556 ly = cal_util_add_layout(ad->nv, main_data->name);
565 main_data->intval_init = 0.5;
566 main_data->ad->bt_delete = NULL;
567 evas_object_data_set(ly, "priv", main_data);
569 evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_main_delete_layout, NULL);
571 r = __cal_main_add_title(ad, ly);
572 c_retvm_if(r != 0, NULL, "__cal_main_add_title is failed");
577 static void __cal_main_center_button_callback(void *data, Evas_Object* obj, void* event_info)
579 c_retm_if(!data, "data is null");
581 __cal_main_set_base_tm(data);
584 static void __cal_main_back_button_clicked_callback(void *data, Evas_Object *obj, void *event_info)
586 c_retm_if(!data, "data is null");
588 struct appdata* ad = (struct appdata*)data;
590 elm_win_lower(ad->win);
593 static void __cal_main_set_naviframe( struct appdata *ad)
595 c_retm_if(!ad, "ad is null");
600 Evas_Object *back_button;
602 cbar = cal_util_add_controlbar(ad->nv);
603 c_retm_if(!cbar, "cal_util_add_controlbar returned null");
606 elm_toolbar_item_append(cbar, NULL, S_("IDS_COM_BODY_CALENDAR"), __cal_main_account_button_callback, ad->main);
607 elm_toolbar_item_append(cbar, NULL, S_("IDS_COM_BODY_TODAY"), __cal_main_center_button_callback, ad->main);
608 ad->bt_new = elm_toolbar_item_append(cbar, NULL, S_("IDS_COM_BODY_CREATE"), __cal_main_new_button_callback, ad->main);
610 back_button = elm_button_add(ad->nv);
611 c_retm_if(!back_button, "elm_button_add returned null");
612 evas_object_smart_callback_add(back_button, "clicked", __cal_main_back_button_clicked_callback, ad);
614 ad->main_navi_item = elm_naviframe_item_push(ad->nv, S_("IDS_COM_BODY_CALENDAR"), back_button, NULL, ad->main, "segment");
616 elm_object_item_part_content_set(ad->main_navi_item, "controlbar", cbar);
618 elm_object_style_set(back_button, "naviframe/back_btn/default");
620 __cal_main_init_navi_title();
622 __cal_main_add_tabbar(ad);
627 void cal_main_create_view(struct appdata *ad)
631 c_retm_if(!ad, "data is null");
633 c_retm_if(ad->request_view < CV_YEAR && ad->request_view > CV_DETAIL, "request_view is invalid");
636 ad->main = __cal_main_create_main_layout(ad);
637 c_retm_if(!ad->main, "ad->main is null");
639 __cal_main_set_naviframe(ad);
642 cal_main_change_view(ad->main, ad->request_view);
647 static void __cal_main_set_first_day(struct appdata *ad)
649 c_retm_if(!ad, "ad is null");
652 r = vconf_get_int(VCONFKEY_SETAPPL_WEEKOFDAY_FORMAT_INT,&val);
656 ad->wday_start = val;
659 void cal_main_update_view(void *data)
663 c_retm_if(!data, "data is null");
665 struct appdata* ad = data;
666 c_retm_if(!ad->main, "ad->main is null");
668 cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
669 c_retm_if(!main_data, "main_data is null");
671 __cal_main_set_first_day(ad);
673 if (CAL_STRCMP(main_data->name, _name))
675 ERR("Invalid object");
679 __cal_main_create_content(main_data->ly, main_data, main_data->cur_view);
680 __cal_main_update_content(main_data);