9671dec48dfcd0560c3b532822fd5ae8d90b9c67
[apps/core/preloaded/calendar.git] / src / view-main.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.0 (the "License");
6   *  you may not use this file except in compliance with the License.
7   *  You may obtain a copy of the License at
8   *
9   *       http://floralicense.org/license/
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17
18
19 #include <vconf.h>
20
21 #include "view.h"
22 #include "cld-images.h"
23 #include "edit-view.h"
24
25 #define MAX_TIME_LENGTH 128
26
27 typedef struct {
28         struct appdata *ad;
29         Evas_Object *ly; // self
30
31         Evas_Object *content;
32
33         Evas_Object *tabbar_button;
34
35         Evas_Object *title; /* title layout */
36         Evas_Object *title_landscape; /* title layout */
37
38         Ecore_Timer *down_timer;
39         double intval, intval_init;
40         int delta;
41         Ecore_Idler* idler;
42
43         cal_quick_add *quick_add;
44
45         Evas_Object *ctx_tabbar;
46
47         Evas_Object *select_date;
48
49         Evas_Object *popup;
50 }cal_main_data;
51
52 struct _tabbar_item {
53         enum cld_view view;
54         const char *msgid;
55         const char *title;
56         Evas_Object* (*create)(struct appdata *ad, Evas_Object *ly);
57         void (*update)(Evas_Object *ly);
58         Elm_Object_Item *item;
59 };
60
61 typedef struct {
62         Elm_Object_Item *it;  // Genlist Item pointer
63         cal_main_data *main_data;
64         _calendar_task_sort_type sort_type;
65 }cal_main_view_by_item_data;
66
67
68 static struct _tabbar_item tabbar_items[] = {
69         [CV_YEAR] = {
70                 CV_YEAR,
71                 NULL,
72                 CAL_UTIL_DATE_FORMAT_5,
73                 cal_year_create_view,
74                 cal_year_update_view,
75                 NULL,
76         },
77         [CV_MONTH] = {
78                 CV_MONTH,
79                 NULL,
80                 CAL_UTIL_DATE_FORMAT_6,
81                 cal_month_create_view,
82                 cal_month_update_view,
83                 NULL,
84         },
85         [CV_WEEK] = {
86                 CV_WEEK,
87                 N_("IDS_CLD_BODY_WEEK"),
88                 CAL_UTIL_DATE_FORMAT_6,
89                 cal_week_create_view,
90                 cal_week_update_view,
91                 NULL,
92                 },
93         [CV_DAY] = {
94                 CV_DAY,
95                 NULL,
96                 CAL_UTIL_DATE_FORMAT_7,
97                 cal_day_create_view,
98                 cal_day_update_view,
99                 NULL,
100         },
101         [CV_LIST] = {
102                 CV_LIST,
103                 NULL,
104                 NULL,
105                 cal_list_create_view,
106                 cal_list_update_view,
107                 NULL,
108         },
109         [CV_TODO] = {
110                 CV_TODO,
111                 NULL,
112                 NULL,
113                 cal_todo_create_view,
114                 cal_todo_update_view,
115                 NULL,
116         },
117 };
118 static char *__cal_main_get_view_by_label(void *data, Evas_Object *obj, const char *part);
119 static void __cal_main_get_view_by_item_delete(void *data, Evas_Object *obj);
120 static void __cal_main_set_title_text_naviframe( struct appdata *ad, enum cld_view v);
121
122 static Elm_Genlist_Item_Class itc_1text_item = {
123         .item_style = "1text",
124         .func.text_get = __cal_main_get_view_by_label,
125         .func.del = __cal_main_get_view_by_item_delete,
126 };
127 static void __cal_main_today_button_callback(void *data, Evas_Object* obj, void* event_info);
128
129 static Eina_Bool __cal_main_ug_callback(void *data)
130 {
131         c_retv_if(!data, EINA_FALSE);
132
133         cal_main_data *p = data;
134
135         elm_object_disabled_set(p->ad->new_event_button, EINA_FALSE);
136
137         p->ad->ug = NULL;
138
139         if (p->ad->current_tab == CV_DAY)
140                 cal_day_change_content_display_status(p->content);
141
142         return EINA_FALSE;
143 }
144
145 static void __cal_main_create_button_callback(void *data, Evas_Object *obj, void *event_info)
146 {
147         c_ret_if(!data);
148         c_ret_if(!obj);
149
150         Evas_Object *ly = data;
151
152         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ly);
153         c_ret_if(!main_data);
154
155         struct appdata *ad = main_data->ad;
156         c_ret_if(!ad);
157
158         ad->base_hour = -1;
159         ad->cid = 0;
160
161         calendar_record_h record = NULL;
162         calendar_error_e error = CALENDAR_ERROR_NONE;
163
164         if(ad->tapbar_focus_view == CV_TODO)
165         {
166                 error = calendar_record_create(_calendar_todo._uri, &record);
167                 ERR("TODO");
168         }
169         else    {
170                 int create_event_mode = 0;
171                 int ret = vconf_get_int(CAL_VCONFKEY_CREATE_EVENT_MODE, &create_event_mode);
172                 c_warn_if(ret, "vconf_get_int(CAL_VCONFKEY_CREATE_EVENT_MODE, &value) is failed");
173
174                 if (create_event_mode)
175                 {
176                         error = calendar_record_create(_calendar_event._uri, &record);
177                         ERR("EVENT");
178                 }
179                 else
180                 {
181                         error = calendar_record_create(_calendar_todo._uri, &record);
182                         ERR("TODO");
183
184                 }
185         }
186
187         c_retm_if(error != CALENDAR_ERROR_NONE, "calendar_record_create() is failed(%x)", error);
188
189         cal_edit_create_view(main_data->ad, record, __cal_main_ug_callback, main_data);
190
191         if (main_data->ad->current_tab == CV_DAY)
192                 cal_day_change_content_display_status(main_data->content);
193
194         elm_object_disabled_set(obj, EINA_TRUE);
195 }
196
197 static Eina_Bool __cal_main_popup_idler_callback(void *data)
198 {
199         c_retv_if(!data, ECORE_CALLBACK_CANCEL);
200
201         cal_main_data *p = data;
202
203         if (p->popup) {
204                 evas_object_del(p->popup);
205                 p->popup = NULL;
206         }
207
208         p->idler = NULL;
209
210         return ECORE_CALLBACK_CANCEL;
211 }
212
213 static void __cal_main_view_by_popup_list_sel(void *data, Evas_Object *obj, void *event_info)
214 {
215         c_retm_if(!data, "data is null");
216         c_retm_if(!obj, "obj is null");
217
218         cal_main_view_by_item_data *item_data = data;
219         cal_main_data *main_data  = item_data->main_data;
220         c_retm_if(!main_data, "main_data is null");
221
222         Elm_Object_Item *item = elm_genlist_selected_item_get(obj);
223         c_retm_if(!item, "elm_genlist_selected_item_get() returned null");
224
225         elm_genlist_item_selected_set(item, EINA_FALSE);
226         //main_data->ad->todo_sort_type = item_data->order_type;
227
228         if (main_data->idler) {
229                 ecore_idler_del(main_data->idler);
230                 main_data->idler = NULL;
231         }
232
233         main_data->idler = ecore_idler_add(__cal_main_popup_idler_callback, main_data);
234
235         cal_todo_update_view(main_data->content);
236 }
237
238 static void __cal_main_get_view_by_item_delete(void *data, Evas_Object *obj)
239 {
240         c_retm_if(!data, "data  is null");
241         cal_main_view_by_item_data *item_data = data;
242         free(item_data);
243         return;
244 }
245
246 static char *__cal_main_get_view_by_label(void *data, Evas_Object *obj, const char *part)
247 {
248         c_retvm_if(!data, NULL, "data  is null");
249
250         cal_main_view_by_item_data *item_data = data;
251         if (!CAL_STRCMP(part, "elm.text"))
252         {
253                 if (item_data->sort_type == _CALENDAR_TASK_SORT_TYPE_DUEDATE_ASC) {
254                         return strdup(C_("IDS_CLD_BODY_DUE_DATE"));
255                 } else if (item_data->sort_type == _CALENDAR_TASK_SORT_TYPE_PRIORITY_ASC) {
256                         return strdup(C_("IDS_CLD_BODY_PRIORITY"));
257                 } else if (item_data->sort_type == _CALENDAR_TASK_SORT_TYPE_STATUS_ASC) {
258                         return strdup(C_("IDS_CST_POP_STATUS"));
259                 }
260
261                 return NULL;
262         }
263         return NULL;
264 }
265
266 static void __cal_main_view_popup_append_genlist_item(Evas_Object *genlist, cal_main_data *main_data, _calendar_task_sort_type sort_type)
267 {
268         c_retm_if(!main_data, "main_data is null");
269         c_retm_if(!genlist, "genlist is null");
270
271         cal_main_view_by_item_data *item_data = calloc(1, sizeof(cal_main_view_by_item_data));
272         c_retm_if(!item_data, "item_data is null.");
273         item_data->main_data = main_data;
274         item_data->sort_type = sort_type;
275         item_data->it = elm_genlist_item_append(genlist, &itc_1text_item, item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_main_view_by_popup_list_sel, item_data);
276         c_retm_if(!item_data->it, "item_data->it is null");
277 }
278
279 static Evas_Object *__cal_main_view_by_popup(void *data)
280 {
281         c_retvm_if(!data, NULL, "data  is null");
282         cal_main_data *main_data = (cal_main_data *)data;
283
284         Evas_Object *popup = NULL;
285         Evas_Object *genlist = NULL;
286
287         popup = cal_util_add_popup(main_data->ad->win, "liststyle", C_("IDS_CLD_BODY_VIEW"), NULL,
288                 NULL, NULL, S_("IDS_COM_BODY_CLOSE"), NULL);
289         c_retvm_if(!popup, NULL, "popup is null");
290
291         genlist = elm_genlist_add(popup);
292         if (!genlist) {
293                 ERR("elm_genlist_add(popup) returned null");
294                 evas_object_del(popup);
295                 return NULL;
296         }
297
298         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
299         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
300
301         __cal_main_view_popup_append_genlist_item(genlist, main_data, _CALENDAR_TASK_SORT_TYPE_DUEDATE_ASC);
302
303         __cal_main_view_popup_append_genlist_item(genlist, main_data, _CALENDAR_TASK_SORT_TYPE_PRIORITY_ASC);
304
305         __cal_main_view_popup_append_genlist_item(genlist, main_data, _CALENDAR_TASK_SORT_TYPE_STATUS_ASC);
306
307         elm_object_content_set(popup, genlist);
308         evas_object_show(genlist);
309
310         return popup;
311 }
312
313 static void __cal_main_view_by_button_callback(void *data, Evas_Object *obj, void *event_info)
314 {
315         c_retm_if(!data, "data is null");
316         c_retm_if(!obj, "obj is null");
317
318         evas_object_del(obj);
319
320         cal_main_data *main_data = data;
321
322         Evas_Object *popup = __cal_main_view_by_popup(main_data);
323         c_retm_if(!popup, "__cal_main_view_by_popup  returns null");
324
325         main_data->popup = popup;
326
327         evas_object_show(popup);
328 }
329
330 static void __cal_main_delete_button_callback(void *data, Evas_Object *obj, void *event_info)
331 {
332         c_retm_if(!data, "data is null");
333         c_retm_if(!obj, "obj is null");
334
335         evas_object_del(obj);
336
337         cal_main_data *main_data = data;
338
339         Evas_Object *ly_delete = cal_list_delete_view_create(main_data->ly,main_data->ad);
340         c_retm_if(!ly_delete, "ly_delete is null");
341
342         cal_list_delete_update_view(ly_delete);
343 }
344
345 static void __cal_main_search_button_callback(void *data, Evas_Object *obj, void *event_info)
346 {
347         c_retm_if(!data, "data is null");
348         c_retm_if(!obj, "obj is null");
349
350         evas_object_del(obj);
351
352         cal_main_data *main_data = data;
353
354         Evas_Object *ly_search = cal_search_list_create_list(main_data->ad, main_data->ly);
355         c_retm_if(!ly_search, "ly_search is null");
356
357         cal_search_list_update_list(ly_search);
358 }
359
360 static void __cal_main_account_button_callback(void *data, Evas_Object *obj, void *ei)
361 {
362         c_retm_if(!data, "data is null");
363         c_retm_if(!obj, "obj is null");
364
365         evas_object_del(obj);
366
367         cal_main_data *main_data = data;
368
369         cal_account_create_view(main_data->ad, main_data->ly);
370 }
371
372 void cal_main_update_title_text(struct appdata *ad)
373 {
374         c_ret_if(!ad);
375         c_ret_if(!ad->main_navi_item);
376
377         if (ad->current_view == CV_UNKNOWN)
378                 ad->current_view = ad->current_tab;
379
380         Elm_Object_Item* title = ad->main_navi_item;
381         enum cld_view v = ad->current_view;
382
383         if (v == CV_LIST) {
384                 elm_object_item_part_text_set(title, "default", S_("IDS_COM_BODY_ALL"));
385         } else if (v == CV_TODO) {
386                 elm_object_item_part_text_set(title, "default", C_("IDS_CLD_BODY_TASK"));
387         } else if (v == CV_WEEK) {
388                 cal_util_set_item_time_week_text(title, "default", _(tabbar_items[v].title), NULL, &ad->base_tm, ad->wday_start);
389         } else if (v == CV_YEAR || v == CV_MONTH || v == CV_DAY){
390                 cal_util_set_item_time_text(title, "default", _(tabbar_items[v].title), NULL, &ad->base_tm);
391         }
392 }
393
394 static inline void __cal_main_update_title(Evas_Object *ly, enum cld_view v)
395 {
396         c_ret_if(!ly);
397
398         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ly);
399         c_ret_if(!main_data);
400
401         struct appdata *ad = main_data->ad;
402         c_ret_if(!ad);
403
404         if (!ad->is_landscape_mode && tabbar_items[v].title) {
405                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,title", "prog");
406         } else {
407                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "hide,title", "prog");
408         }
409
410 }
411
412 static void __cal_main_create_content(Evas_Object *ly, cal_main_data *main_data, enum cld_view v)
413 {
414         c_retm_if(!ly, "ly is null");
415         c_retm_if(!main_data, "main_data is null");
416
417
418         struct appdata *ad = main_data->ad;
419
420         if (main_data->content) {
421                 elm_object_part_content_unset(ly, "cont");
422                 cal_util_delete_evas_object(&main_data->content);
423         }
424
425         if (tabbar_items[v].create) {
426                 main_data->content = tabbar_items[v].create(ad, ly);
427                 c_ret_if(!main_data->content);
428         }
429
430         elm_object_part_content_set(ly, "cont", main_data->content);
431 }
432
433 static inline int __cal_main_update_tm(struct tm *t, enum cld_view v, int delta)
434 {
435         c_retvm_if(!t, -1, "t is null");
436
437         int r;
438
439         switch (v) {
440         case CV_YEAR:
441                 r = cal_util_update_tm_year(t, delta);
442                 break;
443         case CV_MONTH:
444                 r = cal_util_update_tm_month(t, delta);
445                 break;
446         case CV_WEEK:
447                 r = cal_util_update_tm_day(t, delta * 7);
448                 break;
449         case CV_DAY:
450                 r = cal_util_update_tm_day(t, delta);
451                 break;
452         case CV_LIST:
453         case CV_TODO:
454                 r = 0;
455                 break;
456         default:
457                 r = -1; // stop timer
458         }
459
460         return r;
461 }
462
463 static int __cal_main_update_content(cal_main_data *main_data)
464 {
465         c_retvm_if(!main_data, -1, "main_data is null");
466
467         struct appdata *ad = main_data->ad;
468         c_retv_if(!ad, -1);
469
470         enum cld_view v = main_data->ad->current_tab;
471
472         struct tm tmp = ad->base_tm;
473         int r = __cal_main_update_tm(&tmp, v, main_data->delta);
474         c_retv_if(r == -1, -1);
475
476         ad->base_tm = tmp;
477
478         __cal_main_set_title_text_naviframe(ad, v);
479
480         if (tabbar_items[v].update)
481                 tabbar_items[v].update(main_data->content);
482
483         ad->is_update_view = EINA_FALSE;
484
485         return 0;
486 }
487
488 static void __cal_main_toolbar_create_new_event_button(struct appdata *ad)
489 {
490         if (!ad->new_event_button) {
491                 //TODO:i18m
492                 ad->new_event_button = cal_util_add_toolbar_button(ad->naviframe, "toolbar_button1", S_("IDS_COM_BODY_CREATE"), __cal_main_create_button_callback, ad->main);
493         }
494 }
495
496 void cal_main_change_view(Evas_Object *ly, enum cld_view v)
497 {
498         CAL_FN_START;
499
500         c_ret_if(!ly);
501         c_ret_if(v < CV_YEAR || v > CV_TODO);
502
503         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ly);
504         c_ret_if(!main_data);
505
506         struct appdata *ad = main_data->ad;
507         c_ret_if(!ad);
508
509         ad->current_view = v;
510
511         main_data->ad->previous_tab = main_data->ad->current_tab;
512         main_data->ad->current_tab = v;
513
514         __cal_main_create_content(ly, main_data, v);
515
516         __cal_main_update_title(ly, v);
517
518         __cal_main_update_content(main_data);
519
520         CAL_FN_END;
521 }
522
523 static bool __cal_main_is_same_day(const struct tm* date1, const struct tm* date2)
524 {
525         return
526                 date1->tm_year == date2->tm_year &&
527                 date1->tm_mon == date2->tm_mon &&
528                 date1->tm_mday == date2->tm_mday;
529 }
530
531 static void __cal_main_set_base_tm(cal_main_data *main_data)
532 {
533         c_ret_if(!main_data);
534
535         struct appdata *ad = main_data->ad;
536         c_retm_if(!ad, "ad is null");
537
538         if (ad->current_view == CV_LIST) {
539
540                 ad->base_tm = ad->today_tm;
541                 if (ad->today_item != NULL)
542                         cal_list_scroll_today(ad);
543                 else
544                         __cal_main_update_content(main_data);
545
546         } else {
547
548                 if (!__cal_main_is_same_day(&ad->base_tm, &ad->today_tm)) {
549                         ad->base_tm = ad->today_tm;
550                         __cal_main_update_content(main_data);
551                 }
552
553         }
554 }
555
556 static void __cal_main_calendar_db_changed_callback(const char* view_uri, void* user_data)
557 {
558         cal_main_update_view(user_data);
559 }
560
561 void cal_main_add_db_changed_callback(struct appdata * ad)
562 {
563         CAL_FN_START;
564
565         c_ret_if(!ad);
566
567         calendar_error_e error = CALENDAR_ERROR_NONE;
568
569         error = calendar_db_add_changed_cb(_calendar_event._uri, __cal_main_calendar_db_changed_callback, ad);
570         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_add_changed_cb() is failed(%x)", error);
571
572         error = calendar_db_add_changed_cb(_calendar_todo._uri, __cal_main_calendar_db_changed_callback, ad);
573         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_add_changed_cb() is failed(%x)", error);
574
575         error = calendar_db_add_changed_cb(_calendar_book._uri, __cal_main_calendar_db_changed_callback, ad);
576         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_add_changed_cb() is failed(%x)", error);
577
578         CAL_FN_END;
579 }
580
581 void cal_main_remove_db_changed_callback(struct appdata * ad)
582 {
583         CAL_FN_START;
584
585         c_ret_if(!ad);
586
587         calendar_error_e error = CALENDAR_ERROR_NONE;
588
589         error = calendar_db_remove_changed_cb(_calendar_event._uri, __cal_main_calendar_db_changed_callback, ad);
590         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_remove_changed_cb() is failed(%x)", error);
591
592         error = calendar_db_remove_changed_cb(_calendar_todo._uri, __cal_main_calendar_db_changed_callback, ad);
593         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_remove_changed_cb() is failed(%x)", error);
594
595         error = calendar_db_remove_changed_cb(_calendar_book._uri, __cal_main_calendar_db_changed_callback, ad);
596         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_remove_changed_cb() is failed(%x)", error);
597
598         CAL_FN_END;
599 }
600
601 static void __cal_main_delete_quick_add(cal_quick_add *quick_add)
602 {
603         c_retm_if(!quick_add, "quick_add is null");
604
605         if (quick_add->popup)
606                 evas_object_del(quick_add->popup);
607
608         if (quick_add->hold_timer)
609                 ecore_timer_del(quick_add->hold_timer);
610
611         free(quick_add);
612 }
613
614 static void __cal_main_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
615 {
616         CAL_FN_START;
617
618         c_ret_if(!obj);
619
620         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(obj);
621         c_ret_if(!main_data);
622
623         cal_main_remove_db_changed_callback(main_data->ad);
624
625         if (main_data->down_timer)
626                 ecore_timer_del(main_data->down_timer);
627
628         __cal_main_delete_quick_add(main_data->quick_add);
629
630         if (main_data->popup) {
631                 evas_object_del(main_data->popup);
632                 main_data->popup = NULL;
633         }
634
635         if (main_data->select_date) {
636                 evas_object_del(main_data->select_date);
637                 main_data->select_date = NULL;
638         }
639
640         struct appdata *ad = main_data->ad;
641         c_ret_if(!ad);
642
643         ad->main = NULL;
644
645         free(main_data);
646
647         CAL_FN_END;
648 }
649
650 static Evas_Object *__cal_main_create_main_layout(struct appdata *ad)
651 {
652         CAL_FN_START;
653
654         c_retv_if(!ad, NULL);
655
656         int r = 0;
657         cal_main_data *main_data = calloc(1, sizeof(cal_main_data));
658         c_retv_if(!main_data, NULL);
659
660         Evas_Object *ly = cal_util_add_layout(ad->naviframe, "main");
661         if (!ly) {
662                 free(main_data);
663                 return NULL;
664         }
665
666         main_data->ad = ad;
667         main_data->ly = ly;
668         main_data->intval_init = 0.5;
669         main_data->ad->bt_delete = NULL;
670         evas_object_data_set(ly, "priv", main_data);
671
672         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_main_delete_layout, NULL);
673
674         c_retv_if(r != 0, NULL);
675
676         CAL_FN_END;
677
678         return ly;
679 }
680
681 static void __cal_main_today_button_callback(void *data, Evas_Object* obj, void* event_info)
682 {
683         c_retm_if(!data, "data is null");
684
685         __cal_main_set_base_tm(data);
686 }
687
688 static void __cal_main_back_button_clicked_callback(void *data, Evas_Object *obj, void *event_info)
689 {
690         CAL_FN_START;
691
692         c_retm_if(!data, "data is null");
693
694         struct appdata* ad = (struct appdata*)data;
695
696         elm_win_lower(ad->win);
697 }
698
699 static void __cal_main_ctx_popup_hide_callback(void *data, Evas_Object *obj, void *ei)
700 {
701         c_ret_if(!data);
702
703         cal_main_data* main_data = data;
704
705         main_data->ctx_tabbar= NULL;
706
707         evas_object_del(obj);
708 }
709
710 static void __cal_main_ctx_item_selected_callback(void *data, Evas_Object *obj, void *ei)
711 {
712         c_ret_if(!data);
713         c_ret_if(!obj);
714
715         cal_main_data* main_data = CAL_UTIL_GET_PRIV_DATA(obj);
716         c_ret_if(!main_data);
717
718         struct appdata *ad = main_data->ad;
719         c_ret_if(!ad);
720
721         enum cld_view view = (enum cld_view)data;
722
723         cal_main_change_view(main_data->ly, view);
724
725         evas_object_del(obj);
726         main_data->ctx_tabbar = NULL;
727 }
728
729 static void __cal_main_add_tabbar_ctx(cal_main_data *main_data)
730 {
731         c_ret_if(!main_data);
732         c_ret_if(!main_data->tabbar_button);
733
734         int x, y, w, h;
735
736         Evas_Object *ctx = main_data->ctx_tabbar;
737
738         if (ctx)
739                 evas_object_del(ctx);
740
741         main_data->ctx_tabbar = elm_ctxpopup_add(main_data->ad->naviframe);
742         c_ret_if(!main_data->ctx_tabbar);
743
744         ctx = main_data->ctx_tabbar;
745
746         evas_object_data_set(ctx, "priv", main_data);
747
748         evas_object_smart_callback_add(ctx, "dismissed", __cal_main_ctx_popup_hide_callback, main_data);
749         elm_ctxpopup_item_append(ctx, C_("IDS_CLD_BODY_YEAR"), NULL, __cal_main_ctx_item_selected_callback, (void *)CV_YEAR);
750         elm_ctxpopup_item_append(ctx, C_("IDS_CLD_BODY_VIEWBY_MONTH"), NULL, __cal_main_ctx_item_selected_callback, (void *)CV_MONTH);
751         elm_ctxpopup_item_append(ctx, C_("IDS_CLD_BODY_WEEK"), NULL, __cal_main_ctx_item_selected_callback, (void *)CV_WEEK);
752         elm_ctxpopup_item_append(ctx, C_("IDS_CLD_BODY_DAY"), NULL, __cal_main_ctx_item_selected_callback, (void *)CV_DAY);
753         elm_ctxpopup_item_append(ctx, C_("IDS_CLD_BODY_LIST"), NULL, __cal_main_ctx_item_selected_callback, (void *)CV_LIST);
754         elm_ctxpopup_item_append(ctx, C_("IDS_CLD_BODY_TASK"), NULL, __cal_main_ctx_item_selected_callback, (void *)CV_TODO);
755
756         evas_object_geometry_get(main_data->tabbar_button, &x, &y, &w, &h);
757
758         evas_object_move(ctx, x + w/2 , y+(4*h/5));
759
760         elm_ctxpopup_direction_priority_set(ctx, ELM_CTXPOPUP_DIRECTION_DOWN,
761                                                                                                                         ELM_CTXPOPUP_DIRECTION_RIGHT,
762                                                                                                                         ELM_CTXPOPUP_DIRECTION_LEFT,
763                                                                                                                         ELM_CTXPOPUP_DIRECTION_UP);
764         evas_object_show(ctx);
765 }
766
767 static void __cal_main_tabbar_button_callback(void *data, Evas_Object *obj, void *event_info)
768 {
769         c_ret_if(!data);
770         c_ret_if(!obj);
771
772         cal_main_data *main_data = data;
773
774         __cal_main_add_tabbar_ctx(main_data);
775 }
776
777 static void __cal_main_add_tabbar_button( struct appdata *ad)
778 {
779         c_ret_if(!ad);
780         c_ret_if(!ad->main);
781
782         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
783         c_ret_if(!main_data);
784
785         Evas_Object *tabbar_button = cal_util_add_toolbar_button2(ad->naviframe, "title_right_btn", CAL_IMAGES_CHANGE_VIEW, __cal_main_tabbar_button_callback, main_data);
786         c_ret_if(!tabbar_button);
787
788         main_data->tabbar_button = tabbar_button;
789 }
790
791 static void __cal_main_set_title_text_naviframe( struct appdata *ad, enum cld_view v)
792 {
793         CAL_FN_START;
794
795         c_ret_if(!ad);
796
797         cal_main_update_title_text(ad);
798
799         CAL_FN_END;
800 }
801
802 static void __cal_main_add_today_button( struct appdata *ad)
803 {
804         c_ret_if(!ad);
805         c_ret_if(!ad->main);
806
807         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
808         c_ret_if(!main_data);
809
810         Evas_Object *today_button = cal_util_add_toolbar_button2(ad->naviframe, "title_left_btn", CAL_IMAGES_TODAY, __cal_main_today_button_callback, main_data);
811
812         evas_object_data_set(today_button, "priv", main_data);
813 }
814
815 static void __cal_main_more_button_callback(void *data, Evas_Object *obj, void *event_info)
816 {
817         c_retm_if(!data, "data is null");
818         c_retm_if(!obj, "obj is null");
819
820         Evas_Object *main_layout = data;
821
822         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(main_layout);
823
824         struct appdata *ad = main_data->ad;
825         c_ret_if(!ad);
826
827         Evas_Object *ctx_popup = elm_ctxpopup_add(ad->naviframe);
828         c_ret_if(!ctx_popup);
829
830         elm_ctxpopup_direction_priority_set(ctx_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP);
831
832         ad->bt_delete = elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_DELETE"), NULL, __cal_main_delete_button_callback, main_data);
833         c_ret_if(!ad->bt_delete);
834
835         if (main_data->ad->current_tab == CV_TODO) {
836                 ad->bt_view = elm_ctxpopup_item_append(ctx_popup, C_("IDS_CLD_BODY_VIEW"), NULL, __cal_main_view_by_button_callback, main_data);
837                 c_ret_if(!ad->bt_view);
838
839                 ad->bt_search = NULL;
840         } else {
841                 ad->bt_search = elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_SEARCH"), NULL, __cal_main_search_button_callback, main_data);
842                 c_ret_if(!ad->bt_search);
843
844                 ad->bt_view = NULL;
845         }
846
847         Elm_Object_Item *item = elm_ctxpopup_item_append(ctx_popup, C_("IDS_CLD_BODY_CALENDARS"), NULL, __cal_main_account_button_callback, main_data);
848         c_ret_if(!item);
849
850         Evas_Coord_Rectangle r = {0};
851
852         cal_util_get_geometry(&r, obj);
853
854         evas_object_move(ctx_popup, r.x + r.w/2, r.y + r.h/2);
855
856         evas_object_show(ctx_popup);
857 }
858
859 static void __cal_main_set_naviframe( struct appdata *ad)
860 {
861         CAL_FN_START;
862
863         c_ret_if(!ad);
864
865         Evas_Object *back_button = elm_button_add(ad->naviframe);
866         c_ret_if(!back_button);
867
868         evas_object_smart_callback_add(back_button, "clicked", __cal_main_back_button_clicked_callback, ad);
869
870         elm_object_style_set(back_button, "naviframe/end_btn/default");
871
872         ad->main_navi_item = elm_naviframe_item_push(ad->naviframe, NULL, back_button, NULL, ad->main, NULL);
873
874         __cal_main_add_tabbar_button(ad);
875
876         __cal_main_add_today_button(ad);
877
878         Evas_Object *more_button = cal_util_add_toolbar_button(ad->naviframe, "toolbar_more_btn", NULL, __cal_main_more_button_callback, ad->main);
879         elm_object_style_set(more_button, "naviframe/more/default");
880
881         __cal_main_toolbar_create_new_event_button(ad);
882
883         CAL_FN_END;
884 }
885
886 void cal_main_create_view(struct appdata *ad)
887 {
888         CAL_FN_START;
889
890         c_retm_if(!ad, "data is null");
891
892         c_retm_if(ad->request_view < CV_YEAR && ad->request_view > CV_DETAIL, "request_view is invalid");
893
894         ad->main = __cal_main_create_main_layout(ad);
895         c_retm_if(!ad->main, "ad->main is null");
896
897         cal_main_add_db_changed_callback(ad);
898
899         cal_main_change_view(ad->main, ad->request_view);
900
901         __cal_main_set_naviframe(ad);
902
903         __cal_main_set_title_text_naviframe(ad, ad->request_view);
904
905         CAL_FN_END;
906 }
907
908 static void __cal_main_set_first_day(struct appdata *ad)
909 {
910         c_retm_if(!ad, "ad is null");
911
912         int r,val;
913         r = vconf_get_int(CAL_VCONFKEY_FIRST_DAY_OF_WEEK, &val);
914         if(0 > r)
915                 ad->wday_start = 0;
916         else
917                 ad->wday_start = val;
918 }
919
920 void cal_main_update_view(void *data)
921 {
922         CAL_FN_START;
923
924         c_ret_if(!data);
925
926         struct appdata* ad = data;
927
928         c_ret_if(!ad->main);
929
930         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
931         c_ret_if(!main_data);
932
933         if (ad->current_view == CV_UNKNOWN)
934                 ad->current_view = main_data->ad->current_tab;
935
936         __cal_main_set_first_day(ad);
937
938         __cal_main_create_content(main_data->ly, main_data, main_data->ad->current_tab);
939
940         __cal_main_update_content(main_data);
941
942         __cal_main_update_title(ad->main, main_data->ad->current_tab);
943
944         CAL_FN_END;
945 }
946
947 static void __cal_main_update_toolbar(cal_main_data *main_data)
948 {
949         c_ret_if(!main_data);
950         c_ret_if(!main_data->ad);
951
952         struct appdata* ad = main_data->ad;
953         c_ret_if(!ad->cbar);
954
955         if (ad->is_landscape_mode) {
956                 elm_object_style_set(ad->cbar, "item_horizontal");
957         } else {
958                 elm_object_style_set(ad->cbar, "default");
959         }
960 }
961
962 void cal_main_rotation(void *data)
963 {
964         CAL_FN_START;
965
966         c_ret_if(!data);
967
968         struct appdata* ad = data;
969
970         c_ret_if(!ad->main);
971
972         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
973         c_ret_if(!main_data);
974
975         if (main_data->ad->current_tab != CV_LIST && main_data->ad->current_tab != CV_TODO) {
976                 __cal_main_create_content(main_data->ly, main_data, main_data->ad->current_tab);
977
978                 __cal_main_update_content(main_data);
979         }
980
981         __cal_main_update_title(ad->main, main_data->ad->current_tab);
982
983         __cal_main_update_toolbar(main_data);
984 }
985
986 void cal_main_set_main_content(void *data, Evas_Object *content)
987 {
988         c_ret_if(!content);
989         c_ret_if(!data);
990
991         struct appdata* ad = data;
992
993         c_ret_if(!ad->main);
994
995         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
996         c_ret_if(!main_data);
997
998         main_data->content =  content;
999 }