2.0 alpha
[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://www.tizenopensource.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
23 typedef struct {
24         struct appdata *ad;
25         Evas_Object *ly; // self
26
27         Evas_Object *content;
28
29         Evas_Object *tabbar; /* tab layout */
30         Evas_Object *tabbar_button;
31         Eina_Bool is_tabbar_show;
32
33         enum cld_view previous_tab;
34         enum cld_view current_tab;
35
36         Evas_Object *title; /* title layout */
37         Evas_Object *title_landscape; /* title layout */
38
39         Ecore_Timer *down_timer;
40         double intval, intval_init;
41         int delta;
42         Ecore_Idler* idler;
43
44         cal_quick_add *quick_add;
45 }cal_main_data;
46
47 struct _tabbar_item {
48         enum cld_view view;
49         const char *msgid;
50         const char *title;
51         Evas_Object* (*create)(struct appdata *ad, Evas_Object *ly);
52         void (*update)(Evas_Object *ly);
53         Elm_Object_Item *item;
54 };
55
56 typedef struct {
57         Elm_Object_Item *it;  // Genlist Item pointer
58         cal_main_data *main_data;
59         cals_todo_list_order_t order_type;
60 }cal_main_view_by_item_data;
61
62
63 static struct _tabbar_item tabbar_items[] = {
64         [CV_YEAR] = {
65                 CV_YEAR,
66                 NULL,
67                 CAL_UTIL_DATE_FORMAT_5,
68                 cal_year_create_view,
69                 cal_year_update_view,
70                 NULL,
71         },
72         [CV_MONTH] = {
73                 CV_MONTH,
74                 NULL,
75                 CAL_UTIL_DATE_FORMAT_15,
76                 cal_month_create_view,
77                 cal_month_update_view,
78                 NULL,
79         },
80         [CV_WEEK] = {
81                 CV_WEEK,
82                 N_("IDS_CLD_BODY_WEEK"),
83                 CAL_UTIL_DATE_FORMAT_6,
84                 cal_week_create_view,
85                 cal_week_update_view,
86                 NULL,
87                 },
88         [CV_DAY] = {
89                 CV_DAY,
90                 NULL,
91                 CAL_UTIL_DATE_FORMAT_7,
92                 cal_day_create_view,
93                 cal_day_update_view,
94                 NULL,
95         },
96         [CV_LIST] = {
97                 CV_LIST,
98                 NULL,
99                 NULL,
100                 cal_list_create_view,
101                 cal_list_update_view,
102                 NULL,
103         },
104         [CV_TODO] = {
105                 CV_TODO,
106                 NULL,
107                 NULL,
108                 cal_todo_create_view,
109                 cal_todo_update_view,
110                 NULL,
111         },
112 };
113 static char *__cal_main_get_view_by_label(void *data, Evas_Object *obj, const char *part);
114 static void __cal_main_get_view_by_item_delete(void *data, Evas_Object *obj);
115 static void __cal_main_set_title_text_naviframe( struct appdata *ad);
116 static int __cal_main_add_title_landscape(struct appdata *ad, Evas_Object *ly);
117 static void __cal_main_update_naviframe(cal_main_data *main_data);
118
119 static Elm_Genlist_Item_Class itc_1text_item = {
120         .item_style = "1text",
121         .func.text_get = __cal_main_get_view_by_label,
122         .func.del = __cal_main_get_view_by_item_delete,
123 };
124 static void __cal_main_center_button_callback(void *data, Evas_Object* obj, void* event_info);
125
126 static void __cal_main_new_button_callback(void *data, Evas_Object *obj, void *event_info)
127 {
128         c_ret_if(!data);
129         c_ret_if(!obj);
130
131         Evas_Object *ly = data;
132
133         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ly);
134         c_ret_if(!main_data);
135
136         struct appdata *ad = main_data->ad;
137         c_ret_if(!ad);
138
139         ad->base_hour = -1;
140         ad->cid = 0;
141
142         if (CV_TODO != main_data->current_tab)
143                 cal_edit_create_view(main_data->ad, main_data->ly);
144         else
145                 cal_edit_create_view_todo(main_data->ad, main_data->ly);
146 }
147
148 static void __cal_main_view_by_popup_list_sel(void *data, Evas_Object *obj, void *event_info)
149 {
150         c_retm_if(!data, "data is null");
151         c_retm_if(!obj, "obj is null");
152
153         Evas_Object *popup = NULL;
154         cal_main_view_by_item_data *item_data = data;
155         cal_main_data *main_data  = item_data->main_data;
156         c_retm_if(!main_data, "main_data is null");
157
158         Elm_Object_Item *item = elm_genlist_selected_item_get(obj);
159         c_retm_if(!item, "elm_genlist_selected_item_get() returned null");
160
161         elm_genlist_item_selected_set(item, EINA_FALSE);
162         main_data->ad->todo_sort_type = item_data->order_type;
163         popup = evas_object_data_get(obj, "popup");
164         if (popup != NULL) {
165                 evas_object_del(popup);
166                 popup = NULL;
167         }
168
169         cal_todo_update_view(main_data->content);
170 }
171
172 static void __cal_main_get_view_by_item_delete(void *data, Evas_Object *obj)
173 {
174         c_retm_if(!data, "data  is null");
175         cal_main_view_by_item_data *item_data = data;
176         free(item_data);
177         return;
178 }
179
180 static char *__cal_main_get_view_by_label(void *data, Evas_Object *obj, const char *part)
181 {
182         c_retvm_if(!data, NULL, "data  is null");
183
184         cal_main_view_by_item_data *item_data = data;
185         if (!CAL_STRCMP(part, "elm.text"))
186         {
187                 if (item_data->order_type == CALS_TODO_LIST_ORDER_END_DATE) {
188                         return strdup(C_("IDS_CLD_BODY_DUE_DATE"));
189                 } else if (item_data->order_type == CALS_TODO_LIST_ORDER_PRIORITY) {
190                         return strdup(C_("IDS_CLD_BODY_PRIORITY"));
191                 } else if (item_data->order_type == -1) {
192                         return strdup(C_("IDS_CST_POP_STATUS"));
193                 }
194
195                 return NULL;
196         }
197         return NULL;
198 }
199
200 static void __cal_main_view_popup_append_genlist_item(Evas_Object *genlist, cal_main_data *main_data, cals_todo_list_order_t order_type)
201 {
202         c_retm_if(!main_data, "main_data is null");
203         c_retm_if(!genlist, "genlist is null");
204
205         cal_main_view_by_item_data *item_data = calloc(1, sizeof(cal_main_view_by_item_data));
206         c_retm_if(!item_data, "item_data is null.");
207         item_data->main_data = main_data;
208         item_data->order_type = order_type;
209         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);
210         c_retm_if(!item_data->it, "item_data->it is null");
211 }
212
213 static Evas_Object *__cal_main_view_by_popup(void *data)
214 {
215         c_retvm_if(!data, NULL, "data  is null");
216         cal_main_data *main_data = (cal_main_data *)data;
217
218         Evas_Object *popup = NULL;
219         Evas_Object *genlist = NULL;
220
221         popup = cal_util_add_popup(main_data->ad->win, "liststyle", C_("IDS_CLD_BODY_VIEW"), NULL,
222                 NULL, NULL, S_("IDS_COM_BODY_CLOSE"), NULL);
223         c_retvm_if(!popup, NULL, "popup is null");
224
225         genlist = elm_genlist_add(popup);
226         if (!genlist) {
227                 ERR("elm_genlist_add(popup) returned null");
228                 evas_object_del(popup);
229                 return NULL;
230         }
231
232         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
233         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
234
235         __cal_main_view_popup_append_genlist_item(genlist, main_data, CALS_TODO_LIST_ORDER_END_DATE);
236
237         // TODO: Update with calendar svc changes
238         __cal_main_view_popup_append_genlist_item(genlist, main_data, -1);
239
240         __cal_main_view_popup_append_genlist_item(genlist, main_data, CALS_TODO_LIST_ORDER_PRIORITY);
241
242         evas_object_data_set(genlist, "popup", popup);
243         elm_object_content_set(popup, genlist);
244         evas_object_show(genlist);
245
246         return popup;
247 }
248
249 static void __cal_main_view_by_button_callback(void *data, Evas_Object *obj, void *event_info)
250 {
251         c_retm_if(!data, "data is null");
252         c_retm_if(!obj, "obj is null");
253
254         Evas_Object *ly = data;
255         cal_main_data *main_data;
256
257         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
258         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
259
260         Evas_Object *popup = __cal_main_view_by_popup(main_data);
261         c_retm_if(!popup, "__cal_main_view_by_popup  returns null");
262         evas_object_show(popup);
263 }
264
265 static void __cal_main_delete_button_callback(void *data, Evas_Object *obj, void *event_info)
266 {
267         c_retm_if(!data, "data is null");
268         c_retm_if(!obj, "obj is null");
269
270         Evas_Object *ly = data;
271         Evas_Object *ly_delete = NULL;
272         cal_main_data *main_data;
273
274         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
275         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
276
277         ly_delete = cal_list_delete_view_create(main_data->ly,main_data->ad);
278         c_retm_if(!ly_delete, "ly_delete is null");
279         cal_list_delete_update_view(ly_delete);
280
281 }
282
283
284 static void __cal_main_account_button_callback(void *data, Evas_Object *obj, void *ei)
285 {
286         c_retm_if(!data, "data is null");
287         c_retm_if(!obj, "obj is null");
288
289         Evas_Object *ly = data;
290         cal_main_data *main_data;
291
292         main_data= CAL_UTIL_GET_PRIV_DATA(ly);
293         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
294
295         cal_account_create_view(main_data->ad, ly);
296 }
297
298 void cal_main_update_title_text(Evas_Object *title, enum cld_view v, struct tm *t, int week_start)
299 {
300         c_retm_if(!title, "title is null");
301         c_retm_if(!t, "t is null");
302
303         if (tabbar_items[v].title) {
304                 if (v == CV_WEEK) {
305                         cal_util_set_time_week_text(CAL_UTIL_GET_EDJ_DATA(title), "title/text", _(tabbar_items[v].title), NULL, t, week_start);
306                 } else {
307                         cal_util_set_time_text(CAL_UTIL_GET_EDJ_DATA(title), "title/text", _(tabbar_items[v].title), NULL, t);
308                 }
309         }
310 }
311
312 static inline void __cal_main_update_title(Evas_Object *ly, enum cld_view v)
313 {
314         c_ret_if(!ly);
315
316         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ly);
317         c_ret_if(!main_data);
318
319         struct appdata *ad = main_data->ad;
320         c_ret_if(!ad);
321
322         if (!ad->is_landscape_mode && tabbar_items[v].title) {
323                 if (main_data->is_tabbar_show)
324                         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,title,left", "prog");
325                 else
326                         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,title", "prog");
327         } else {
328                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "hide,title", "prog");
329         }
330
331 }
332
333 static void __cal_main_hide_tabbar(cal_main_data *main_data)
334 {
335         c_ret_if(!main_data);
336
337         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(main_data->ly), "right,default", "prog");
338
339         struct appdata *ad = main_data->ad;
340         c_ret_if(!ad);
341
342         if (!ad->is_landscape_mode && tabbar_items[ad->current_view].title) {
343                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(main_data->ly), "show,title", "prog");
344         } else {
345                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(main_data->ly), "hide,title", "prog");
346         }
347         main_data->is_tabbar_show = EINA_FALSE;
348
349         elm_object_style_set(main_data->tabbar_button, "calendar/naviframe/more_left/default");
350 }
351
352 static Eina_Bool __cal_main_tabbar_idler(void *data)
353 {
354         c_retv_if(!data, ECORE_CALLBACK_CANCEL);
355
356         cal_main_data *main_data = data;
357         struct appdata *ad = main_data->ad;
358         c_ret_if(!ad);
359
360         if (!ad->is_landscape_mode)
361                 __cal_main_hide_tabbar(main_data);
362
363         main_data->idler = NULL;
364
365         return ECORE_CALLBACK_CANCEL;
366 }
367
368
369 static void __cal_main_tabbar_changed_callback(void *data, Evas_Object *obj, void *event_info)
370 {
371         CAL_FN_START;
372
373         c_ret_if(!data);
374         c_ret_if(!event_info);
375
376         cal_main_data *main_data = data;
377
378         struct appdata *ad = main_data->ad;
379         c_ret_if(!ad);
380
381         enum cld_view view = (enum cld_view)event_info;
382
383         cal_main_change_view(main_data->ly, view);
384
385         if (main_data->idler) {
386                 ecore_idler_del(main_data->idler);
387                 main_data->idler = NULL;
388         }
389
390         main_data->idler = ecore_idler_add(__cal_main_tabbar_idler, main_data);
391 }
392
393 static void __cal_main_init_navi_title()
394 {
395         tabbar_items[CV_YEAR].msgid = C_("IDS_CLD_BODY_YEAR");
396         tabbar_items[CV_MONTH].msgid = C_("IDS_CLD_BODY_VIEWBY_MONTH");
397         tabbar_items[CV_WEEK].msgid = C_("IDS_CLD_BODY_WEEK");
398         tabbar_items[CV_DAY].msgid = C_("IDS_CLD_BODY_DAY");
399         tabbar_items[CV_LIST].msgid = C_("IDS_CLD_BODY_LIST");
400         tabbar_items[CV_TODO].msgid = C_("IDS_CLD_BODY_TASK");
401 }
402
403 static void __cal_main_update_tabbar(cal_main_data *main_data)
404 {
405         c_ret_if(!main_data);
406         c_ret_if(!main_data->ad);
407
408         Evas_Object *tabbar = main_data->tabbar;
409         c_ret_if(!tabbar);
410
411         switch (main_data->previous_tab) {
412         case CV_YEAR:
413                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "year_normal", "prog");
414                 break;
415         case CV_MONTH:
416                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "month_normal", "prog");
417                 break;
418         case CV_WEEK:
419                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "week_normal", "prog");
420                 break;
421         case CV_DAY:
422                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "day_normal", "prog");
423                 break;
424         case CV_LIST:
425                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "list_normal", "prog");
426                 break;
427         case CV_TODO:
428                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "task_normal", "prog");
429                 break;
430         default:
431                 break;
432         }
433
434         switch (main_data->current_tab) {
435         case CV_YEAR:
436                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "year_pressed", "prog");
437                 break;
438         case CV_MONTH:
439                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "month_pressed", "prog");
440                 break;
441         case CV_WEEK:
442                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "week_pressed", "prog");
443                 break;
444         case CV_DAY:
445                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "day_pressed", "prog");
446                 break;
447         case CV_LIST:
448                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "list_pressed", "prog");
449                 break;
450         case CV_TODO:
451                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(tabbar), "task_pressed", "prog");
452                 break;
453         default:
454                 break;
455         }
456
457         if (main_data->ad->is_landscape_mode) {
458                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(tabbar), "landscape");
459         } else {
460                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(tabbar), "portrait");
461         }
462 }
463
464 static void __cal_main_tabbar_content_mouse_cliked(void *data, Evas_Object *eo, const char *e, const char *s)
465 {
466         c_ret_if(!data);
467
468         cal_main_data *main_data = data;
469
470         Evas_Object *tabbar = main_data->tabbar;
471         c_ret_if(!tabbar);
472
473         struct appdata *ad = main_data->ad;
474         c_ret_if(!ad);
475
476         enum cld_view view = CV_UNKNOWN;
477
478         if (!strcmp(e, "year")) {
479
480                 view = CV_YEAR;
481
482         } else if (!strcmp(e, "month")) {
483
484                 view = CV_MONTH;
485
486         } else if (!strcmp(e, "week")) {
487
488                 view =  CV_WEEK;
489
490         } else if (!strcmp(e, "day")) {
491
492                 view = CV_DAY;
493
494         } else if (!strcmp(e, "list")) {
495
496                 view = CV_LIST;
497
498         } else if (!strcmp(e, "task")) {
499
500                 view = CV_TODO;
501         }
502
503         __cal_main_tabbar_changed_callback(main_data, NULL, (void *)view);
504 }
505
506 static void __cal_main_add_tabbar(cal_main_data *main_data)
507 {
508         c_ret_if(!main_data);
509
510         Evas_Object *tabbar = elm_layout_add(main_data->ly);
511         c_ret_if(!tabbar);
512
513         Eina_Bool r = elm_layout_file_set(tabbar, EDJ_FILE, "tabbar_list");
514         c_ret_if(r == EINA_FALSE);
515
516         main_data->tabbar = tabbar;
517
518         __cal_main_update_tabbar(main_data);
519
520         cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(tabbar), "year_text", tabbar_items[CV_YEAR].msgid);
521         cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(tabbar), "month_text", tabbar_items[CV_MONTH].msgid);
522         cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(tabbar), "week_text", tabbar_items[CV_WEEK].msgid);
523         cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(tabbar), "day_text", tabbar_items[CV_DAY].msgid);
524         cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(tabbar), "list_text", tabbar_items[CV_LIST].msgid);
525         cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(tabbar), "task_text", tabbar_items[CV_TODO].msgid);
526
527         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(tabbar), "*", "clicked", __cal_main_tabbar_content_mouse_cliked, main_data);
528
529         elm_object_part_content_set(main_data->ly, "elm.swallow.tabbar", tabbar);
530 }
531
532 static void __cal_main_show_tabbar(cal_main_data *main_data)
533 {
534         c_ret_if(!main_data);
535
536         if (!main_data->tabbar)
537                 __cal_main_add_tabbar(main_data);
538
539         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(main_data->ly), "left,offset", "prog");
540
541         struct appdata *ad = main_data->ad;
542         c_ret_if(!ad);
543
544         if (!ad->is_landscape_mode && tabbar_items[ad->current_view].title) {
545                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(main_data->ly), "show,title,left", "prog");
546         }
547
548         main_data->is_tabbar_show = EINA_TRUE;
549
550         elm_object_style_set(main_data->tabbar_button, "calendar/naviframe/more_right/default");
551 }
552
553 static void __cal_main_content_mouse_down(void *data, Evas *e, Evas_Object *ly, void *ei)
554 {
555         c_ret_if(!data);
556
557         cal_main_data *main_data = data;
558
559         struct appdata *ad = main_data->ad;
560         c_ret_if(!ad);
561
562         if (main_data->is_tabbar_show && !ad->is_landscape_mode)
563                 __cal_main_hide_tabbar(main_data);
564 }
565
566 static void __cal_main_create_content(Evas_Object *ly, cal_main_data *main_data, enum cld_view v)
567 {
568         c_retm_if(!ly, "ly is null");
569         c_retm_if(!main_data, "main_data is null");
570
571
572         struct appdata *ad = main_data->ad;
573
574         if (main_data->content) {
575                 evas_object_event_callback_del(main_data->content, EVAS_CALLBACK_MOUSE_DOWN, __cal_main_content_mouse_down);
576                 elm_object_part_content_unset(ly, "cont");
577                 cal_util_delete_evas_object(&main_data->content);
578         }
579
580         if (tabbar_items[v].create) {
581                 main_data->content = tabbar_items[v].create(ad, ly);
582                 c_ret_if(!main_data->content);
583         }
584
585         evas_object_event_callback_add(main_data->content, EVAS_CALLBACK_MOUSE_DOWN, __cal_main_content_mouse_down, main_data);
586         elm_object_part_content_set(ly, "cont", main_data->content);
587 }
588
589 static inline int __cal_main_update_tm(struct tm *t, enum cld_view v, int delta)
590 {
591         c_retvm_if(!t, -1, "t is null");
592
593         int r;
594
595         switch (v) {
596         case CV_YEAR:
597                 r = cal_util_update_tm_year(t, delta);
598                 break;
599         case CV_MONTH:
600                 r = cal_util_update_tm_month(t, delta);
601                 break;
602         case CV_WEEK:
603                 r = cal_util_update_tm_day(t, delta * 7);
604                 break;
605         case CV_DAY:
606                 r = cal_util_update_tm_day(t, delta);
607                 break;
608         case CV_LIST:
609         case CV_TODO:
610                 r = 0;
611                 break;
612         default:
613                 r = -1; // stop timer
614         }
615
616         return r;
617 }
618
619 static int __cal_main_update_content(cal_main_data *main_data)
620 {
621         c_retvm_if(!main_data, -1, "main_data is null");
622
623         struct appdata *ad = main_data->ad;
624         c_retv_if(!ad, -1);
625
626         enum cld_view v = main_data->current_tab;
627
628         struct tm tmp = ad->base_tm;
629         int r = __cal_main_update_tm(&tmp, v, main_data->delta);
630         c_retv_if(r == -1, -1);
631
632         ad->base_tm = tmp;
633
634         cal_main_update_title_text(ad->title, v, &ad->base_tm, ad->wday_start);
635
636         __cal_main_set_title_text_naviframe(ad);
637
638         if (tabbar_items[v].update)
639                 tabbar_items[v].update(main_data->content);
640
641         ad->is_update_view = EINA_FALSE;
642
643         return 0;
644 }
645
646 static Eina_Bool __cal_main_update_content_by_timer(void *data)
647 {
648         c_retvm_if(!data, ECORE_CALLBACK_CANCEL, "data is null");
649
650         cal_main_data *main_data;
651         int r;
652
653         main_data = CAL_UTIL_GET_PRIV_DATA(data);
654         c_retvm_if(!main_data, ECORE_CALLBACK_CANCEL, "CAL_UTIL_GET_PRIV_DATA returned null");
655
656         r = __cal_main_update_content(main_data);
657         if (r == -1) {
658                 main_data->down_timer = NULL;
659                 return ECORE_CALLBACK_CANCEL;
660         }
661
662         main_data->intval = main_data->intval / 1.05;
663         ecore_timer_interval_set(main_data->down_timer, main_data->intval);
664
665         return ECORE_CALLBACK_RENEW;
666 }
667
668 void cal_main_change_view(Evas_Object *ly, enum cld_view v)
669 {
670         CAL_FN_START;
671
672         c_ret_if(!ly);
673         c_ret_if(v < CV_YEAR || v > CV_TODO);
674
675         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ly);
676         c_ret_if(!main_data);
677
678         struct appdata *ad = main_data->ad;
679         c_ret_if(!ad);
680
681         if (main_data->current_tab == v)
682                 return;
683
684         main_data->is_tabbar_show = EINA_FALSE;
685
686         ad->current_view = v;
687
688         main_data->previous_tab = main_data->current_tab;
689         main_data->current_tab = v;
690
691         __cal_main_update_tabbar(main_data);
692
693         if (v == CV_DAY)
694                 cal_day_time_set_time_block_default_parameters(ad);
695
696         __cal_main_create_content(ly, main_data, v);
697         __cal_main_update_title(ly, v);
698
699         Elm_Object_Item *it = NULL;
700
701         if (v == CV_LIST) {
702                 if (!ad->bt_delete) {
703                         it = elm_toolbar_first_item_get(ad->cbar);
704                         ad->bt_delete = elm_toolbar_item_insert_after(ad->cbar, it, CAL_CBAR_ICON_DELETE, NULL, __cal_main_delete_button_callback,ad->main);
705                 }
706
707                 if (ad->bt_view) {
708                         elm_object_item_del(ad->bt_view);
709                         ad->bt_view = NULL;
710                 }
711
712                 if (!ad->bt_today) {
713                         it = elm_toolbar_first_item_get(ad->cbar);
714                         ad->bt_today  = elm_toolbar_item_insert_after(ad->cbar, it, CAL_CBAR_ICON_TODAY, NULL, __cal_main_center_button_callback, ad->main);
715                 }
716         } else if (v == CV_TODO) {
717                 if (!ad->bt_view) {
718                         if (ad->bt_delete) {
719                                 elm_object_item_del(ad->bt_delete);
720                                 ad->bt_delete = NULL;
721                         }
722                         it = elm_toolbar_last_item_get(ad->cbar);
723                         ad->bt_view = elm_toolbar_item_insert_before(ad->cbar, it, CAL_CBAR_ICON_VIEW, NULL, __cal_main_view_by_button_callback, ad->main);
724                         ad->bt_delete = elm_toolbar_item_insert_before(ad->cbar, ad->bt_view, CAL_CBAR_ICON_DELETE, NULL, __cal_main_delete_button_callback,ad->main);
725                         elm_object_item_del(ad->bt_today);
726                         ad->bt_today = NULL;
727                 }
728         }
729         else {
730                 if (ad->bt_delete) {
731                         elm_object_item_del(ad->bt_delete);
732                         ad->bt_delete = NULL;
733                 }
734
735                 if (ad->bt_view) {
736                         elm_object_item_del(ad->bt_view);
737                         ad->bt_view = NULL;
738                 }
739
740                 if (!ad->bt_today) {
741                         it = elm_toolbar_first_item_get(ad->cbar);
742                         ad->bt_today  = elm_toolbar_item_insert_after(ad->cbar, it, CAL_CBAR_ICON_TODAY, NULL, __cal_main_center_button_callback, ad->main);
743                 }
744         }
745
746         __cal_main_update_content(main_data);
747
748         CAL_FN_END;
749 }
750
751 static void __cal_main_set_base_tm(Evas_Object *ly)
752 {
753         c_retm_if(!ly, "ly is null");
754
755         cal_main_data *main_data;
756         struct appdata *ad;
757
758         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
759         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
760
761         ad = main_data->ad;
762         c_retm_if(!ad, "ad is null");
763
764         if (ad->current_view == CV_LIST)
765         {
766                 cal_list_scroll_today(ad);
767                 return;
768         }
769
770         if(ad->base_tm.tm_year == ad->today_tm.tm_year)
771                 if(ad->base_tm.tm_mon == ad->today_tm.tm_mon)
772                         if(ad->base_tm.tm_mday == ad->today_tm.tm_mday)
773                                 return;
774
775         ad->base_tm = ad->today_tm;
776
777         __cal_main_update_content(main_data);
778 }
779
780 static void __cal_main_inc_start(void *data, Evas_Object *obj, const char *e, const char *src)
781 {
782         cal_main_data *main_data;
783
784         main_data = CAL_UTIL_GET_PRIV_DATA(data);
785         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
786
787         main_data->intval = main_data->intval_init;
788         main_data->delta = 1;
789
790         if (main_data->down_timer)
791                 ecore_timer_del(main_data->down_timer);
792
793         main_data->down_timer = ecore_timer_add(main_data->intval, __cal_main_update_content_by_timer, data);
794         __cal_main_update_content(main_data);
795 }
796
797 static void __cal_main_dec_start(void *data, Evas_Object *obj, const char *e, const char *src)
798 {
799         cal_main_data *main_data;
800
801         main_data = CAL_UTIL_GET_PRIV_DATA(data);
802         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
803
804         main_data->intval = main_data->intval_init;
805         main_data->delta = -1;
806
807         if (main_data->down_timer)
808                 ecore_timer_del(main_data->down_timer);
809
810         main_data->down_timer = ecore_timer_add(main_data->intval, __cal_main_update_content_by_timer, data);
811         __cal_main_update_content(main_data);
812 }
813
814 static void __cal_main_stop(void *data, Evas_Object *obj, const char *e, const char *src)
815 {
816         cal_main_data *main_data;
817
818         main_data = CAL_UTIL_GET_PRIV_DATA(data);
819         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
820
821         if (main_data->down_timer)
822                 ecore_timer_del(main_data->down_timer);
823
824         main_data->down_timer = NULL;
825         main_data->delta = 0;
826 }
827
828 static int __cal_main_add_title(struct appdata *ad, Evas_Object *ly)
829 {
830         c_retvm_if(!ad, -1, "ad is null");
831         c_retvm_if(!ly, -1, "ly is null");
832
833         cal_main_data *main_data;
834         Evas_Object *title;
835
836         title = cal_util_add_layout(ad->nv, "main/title");
837         c_retvm_if(!title, -1, "cal_util_add_layout returned null");
838
839         elm_object_part_content_set(ly, "title", title);
840
841         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "start,inc", "title", __cal_main_inc_start, ly);
842         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "start,dec", "title", __cal_main_dec_start, ly);
843         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "stop,dec", "title", __cal_main_stop, ly);
844         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "stop,inc", "title", __cal_main_stop, ly);
845
846         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
847         c_retvm_if(!main_data, -1, "CAL_UTIL_GET_PRIV_DATA returned null");
848
849         main_data->title = title;
850         ad->title = main_data->title;
851
852         return 0;
853 }
854
855 static void __cal_main_update_all(void* data)
856 {
857         c_ret_if(!data);
858
859         struct appdata* ad = data;
860
861         ad->calendar_facebook_id = cal_account_svc_get_facebook_calendar_id();
862
863         cal_main_update_view(ad);
864 }
865
866 static void __cal_main_add_changed_callback(struct appdata * ad)
867 {
868         CAL_FN_START;
869
870         c_ret_if(!ad);
871
872         CALENDAR_SVC_ADD_EVENT_CHANGED_CALLBACK(cal_main_update_view, ad);
873
874         CALENDAR_SVC_ADD_CALENDAR_CHANGED_CALLBACK(CAL_STRUCT_CALENDAR, __cal_main_update_all, ad);
875
876         CAL_FN_END;
877 }
878
879 static void __cal_main_del_changed_callback()
880 {
881         CAL_FN_START;
882
883         CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(cal_main_update_view);
884
885         CALENDAR_SVC_DEL_CALENDAR_CHANGED_CALLBACK(CAL_STRUCT_CALENDAR, __cal_main_update_all);
886
887         CAL_FN_END;
888 }
889
890 static void __cal_main_delete_quick_add(cal_quick_add *quick_add)
891 {
892         c_retm_if(!quick_add, "quick_add is null");
893
894         if (quick_add->popup)
895                 evas_object_del(quick_add->popup);
896
897         if (quick_add->hold_timer)
898                 ecore_timer_del(quick_add->hold_timer);
899
900         free(quick_add);
901 }
902
903 static void __cal_main_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
904 {
905         CAL_FN_START;
906
907         c_ret_if(!obj);
908
909         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(obj);
910         c_ret_if(!main_data);
911
912         __cal_main_del_changed_callback();
913
914         if (main_data->down_timer)
915                 ecore_timer_del(main_data->down_timer);
916
917         if (main_data->tabbar) {
918                  edje_object_signal_callback_del(main_data->tabbar, "*", "clicked", __cal_main_tabbar_content_mouse_cliked);
919                 evas_object_del(main_data->tabbar);
920                 main_data->tabbar = NULL;
921         }
922         __cal_main_delete_quick_add(main_data->quick_add);
923
924         struct appdata *ad = main_data->ad;
925         c_ret_if(!ad);
926
927         ad->main = NULL;
928
929         free(main_data);
930
931         CAL_FN_END;
932 }
933
934 static Evas_Object *__cal_main_create_main_layout(struct appdata *ad)
935 {
936         c_retv_if(!ad, NULL);
937
938         int r;
939         cal_main_data *main_data = calloc(1, sizeof(cal_main_data));
940         c_retv_if(!main_data, NULL);
941
942         Evas_Object *ly = cal_util_add_layout(ad->nv, "main");
943         if (!ly) {
944                 free(main_data);
945                 return NULL;
946         }
947
948         main_data->ad = ad;
949         main_data->ly = ly;
950         main_data->intval_init = 0.5;
951         main_data->ad->bt_delete = NULL;
952         evas_object_data_set(ly, "priv", main_data);
953
954         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_main_delete_layout, NULL);
955
956         r = __cal_main_add_title(ad, ly);
957         c_retv_if(r != 0, NULL);
958
959         r = __cal_main_add_title_landscape(ad, ly);
960         c_retv_if(r != 0, NULL);
961
962         return ly;
963 }
964
965 static void __cal_main_center_button_callback(void *data, Evas_Object* obj, void* event_info)
966 {
967         c_retm_if(!data, "data is null");
968
969         __cal_main_set_base_tm(data);
970 }
971
972 static void __cal_main_back_button_clicked_callback(void *data, Evas_Object *obj, void *event_info)
973 {
974         c_retm_if(!data, "data is null");
975
976         struct appdata* ad = (struct appdata*)data;
977
978         elm_win_lower(ad->win);
979 }
980
981 static void __cal_main_tabbar_button_callback(void *data, Evas_Object *obj, void *event_info)
982 {
983         c_ret_if(!data);
984         c_ret_if(!obj);
985
986         cal_main_data *main_data = data;
987
988         if (main_data->is_tabbar_show)
989                 __cal_main_hide_tabbar(main_data);
990         else
991                 __cal_main_show_tabbar(main_data);
992 }
993
994 static void __cal_main_add_tabbar_button( struct appdata *ad)
995 {
996         c_ret_if(!ad);
997         c_ret_if(!ad->main);
998
999         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
1000         c_ret_if(!main_data);
1001
1002         Evas_Object *tabbar_button = elm_button_add(ad->nv);
1003         c_ret_if(!tabbar_button);
1004
1005         cal_util_set_controlbar_button(tabbar_button, NULL, "calendar/naviframe/more_left/default", __cal_main_tabbar_button_callback, main_data);
1006
1007         elm_object_item_part_content_set(ad->main_navi_item, "title_right_btn", tabbar_button);
1008
1009         main_data->tabbar_button = tabbar_button;
1010 }
1011
1012 static void __cal_main_set_title_text_naviframe( struct appdata *ad)
1013 {
1014         c_retm_if(!ad, "ad is null");
1015
1016         cal_struct *cs;
1017         Eina_List *l;
1018         Eina_Bool  visibility  = EINA_FALSE;
1019         int count = 0;
1020         const char *name = NULL;
1021         Eina_List *list = CALENDAR_SVC_GET_ALL(ALL_ACCOUNT_ID, ALL_CALENDAR_ID, CAL_STRUCT_CALENDAR);
1022
1023         EINA_LIST_FOREACH(list, l, cs) {
1024                 if (cs) {
1025                         visibility = CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_TABLE_INT_VISIBILITY);
1026                         if (visibility) {
1027                                 name = CALENDAR_SVC_STRUCT_GET_STR(cs,CAL_TABLE_TXT_NAME);
1028                                 count++;
1029                         }
1030                 }
1031         }
1032
1033         if (!count)
1034                 elm_object_item_text_set(ad->main_navi_item, C_("IDS_CLD_HEADER_NO_CALENDARS"));
1035         else {
1036                 if ((eina_list_count(list) == count)) {
1037                         elm_object_item_text_set(ad->main_navi_item, C_("IDS_CLD_BODY_ALL_CALENDAR"));
1038                 } else if (1 < count) {
1039                         char buff[64] = {0};
1040                         sprintf(buff, "%d %s", count, C_("IDS_CLD_BODY_CALENDARS"));
1041                         elm_object_item_text_set(ad->main_navi_item, buff);
1042                 } else if (1 == count) {
1043                         if (name) {
1044                                 if (!strcmp(name, "default calendar"))
1045                                         elm_object_item_text_set(ad->main_navi_item, C_("IDS_CLD_OPT_PHONE_CALENDAR"));
1046                                 else
1047                                         elm_object_item_text_set(ad->main_navi_item, name);
1048                         }
1049                 }
1050         }
1051 }
1052
1053 static void __cal_main_set_naviframe( struct appdata *ad)
1054 {
1055         c_ret_if(!ad);
1056
1057         CAL_FN_START;
1058
1059         Evas_Object *cbar = cal_util_add_controlbar(ad->nv);
1060         c_ret_if(!cbar);
1061         ad->cbar = cbar;
1062
1063         ad->bt_new = elm_toolbar_item_append(cbar, CAL_CBAR_ICON_CREAT, NULL, __cal_main_new_button_callback, ad->main);
1064         ad->bt_today = elm_toolbar_item_append(cbar, CAL_CBAR_ICON_TODAY, NULL, __cal_main_center_button_callback, ad->main);
1065         elm_toolbar_item_append(cbar, CAL_CBAR_ICON_CALENDARS, NULL, __cal_main_account_button_callback, ad->main);
1066         Evas_Object *back_button = elm_button_add(ad->nv);
1067         c_ret_if(!back_button);
1068         evas_object_smart_callback_add(back_button, "clicked", __cal_main_back_button_clicked_callback, ad);
1069
1070         ad->main_navi_item = elm_naviframe_item_push(ad->nv, NULL, back_button, NULL, ad->main, NULL);
1071
1072         elm_object_item_part_content_set(ad->main_navi_item, "controlbar", cbar);
1073
1074         elm_object_style_set(back_button, "naviframe/back_btn/default");
1075
1076         __cal_main_add_tabbar_button(ad);
1077
1078         __cal_main_init_navi_title();
1079         __cal_main_set_title_text_naviframe(ad);
1080
1081         CAL_FN_END;
1082 }
1083
1084 void cal_main_create_view(struct appdata *ad)
1085 {
1086         CAL_FN_START;
1087
1088         c_retm_if(!ad, "data is null");
1089
1090         c_retm_if(ad->request_view < CV_YEAR && ad->request_view > CV_DETAIL, "request_view is invalid");
1091
1092         if (!ad->main) {
1093                 ad->main = __cal_main_create_main_layout(ad);
1094                 c_retm_if(!ad->main, "ad->main is null");
1095
1096                 __cal_main_set_naviframe(ad);
1097         }
1098
1099         __cal_main_add_changed_callback(ad);
1100
1101         cal_main_change_view(ad->main, ad->request_view);
1102
1103         CAL_FN_END;
1104 }
1105
1106 static void __cal_main_set_first_day(struct appdata *ad)
1107 {
1108         c_retm_if(!ad, "ad is null");
1109
1110         int r,val;
1111         r = vconf_get_int(CAL_VCONFKEY_FIRST_DAY_OF_WEEK, &val);
1112         if(0 > r)
1113                 ad->wday_start = 0;
1114         else
1115                 ad->wday_start = val;
1116 }
1117
1118 void cal_main_update_view(void *data)
1119 {
1120         CAL_FN_START;
1121
1122         c_ret_if(!data);
1123
1124         struct appdata* ad = data;
1125
1126         c_ret_if(!ad->main);
1127
1128         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
1129         c_ret_if(!main_data);
1130
1131         if (ad->current_view == CV_UNKNOWN)
1132                 ad->current_view = main_data->current_tab;
1133
1134         __cal_main_update_naviframe(main_data);
1135
1136         __cal_main_set_first_day(ad);
1137
1138         __cal_main_create_content(main_data->ly, main_data, main_data->current_tab);
1139
1140         __cal_main_update_content(main_data);
1141
1142         __cal_main_update_tabbar(main_data);
1143
1144         __cal_main_update_title(ad->main, main_data->current_tab);
1145
1146         CAL_FN_END;
1147 }
1148
1149 static int __cal_main_add_title_landscape(struct appdata *ad, Evas_Object *ly)
1150 {
1151         c_retv_if(!ad, -1);
1152         c_retv_if(!ly, -1);
1153
1154         cal_main_data *main_data;
1155         Evas_Object *title;
1156
1157         title = cal_util_add_layout(ad->nv, "main/title/l");
1158         c_retvm_if(!title, -1, "cal_util_add_layout returned null");
1159
1160         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "start,inc", "title", __cal_main_inc_start, ly);
1161         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "start,dec", "title", __cal_main_dec_start, ly);
1162         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "stop,dec", "title", __cal_main_stop, ly);
1163         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(title), "stop,inc", "title", __cal_main_stop, ly);
1164
1165         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
1166         c_retv_if(!main_data, -1);
1167
1168         main_data->title_landscape = title;
1169
1170         return 0;
1171 }
1172
1173 static void __cal_main_update_naviframe(cal_main_data *main_data)
1174 {
1175         c_ret_if(!main_data);
1176         c_ret_if(!main_data->ad);
1177
1178         struct appdata *ad = main_data->ad;
1179
1180         if (ad->is_landscape_mode) {
1181                 elm_object_item_part_content_unset(ad->main_navi_item, "title_right_btn");
1182                 evas_object_hide(main_data->tabbar_button);
1183
1184                 ad->title = main_data->title_landscape;
1185                 elm_naviframe_item_style_set(ad->main_navi_item, "basic/calendar");
1186                 evas_object_show(ad->title);
1187                 elm_object_item_part_content_set(ad->main_navi_item, "title_left_icon", ad->title);
1188
1189                 if (!main_data->tabbar)
1190                         __cal_main_add_tabbar(main_data);
1191
1192                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ad->main ), "landscape,show,tabbar");
1193
1194         } else {
1195                 elm_object_item_part_content_unset(ad->main_navi_item, "title_left_icon");
1196                 evas_object_hide(ad->title);
1197
1198                 ad->title = main_data->title;
1199                 elm_naviframe_item_style_set(ad->main_navi_item, "basic");
1200
1201                 evas_object_show(main_data->tabbar_button);
1202                 elm_object_item_part_content_set(ad->main_navi_item, "title_right_btn", main_data->tabbar_button);
1203
1204                 if (main_data->is_tabbar_show) {
1205                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ad->main ), "portrait,show,tabbar");
1206                 } else {
1207                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ad->main ), "portrait,hide,tabbar");
1208                 }
1209         }
1210 }