Tizen souce update
[apps/core/preloaded/calendar.git] / src / view-main.c
1 /*
2
3 Copyright (c) 2000-2012 Samsung Electronics Co., Ltd All Rights Reserved
4
5 This file is part of org.tizen.efl-calendar
6 Written by Taeho Kang <taeho84.kang@samsung.com>
7
8 PROPRIETARY/CONFIDENTIAL
9
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.
15
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.
22
23 */
24
25
26 #include <vconf.h>
27
28 #include "view.h"
29
30 static const char *_name = "main";
31
32 typedef struct {
33         const char *name;
34         struct appdata *ad;
35         Evas_Object *ly; // self
36         enum cld_view cur_view;
37
38         Evas_Object *content;
39         Evas_Object *tab; /* tab layout */
40         Evas_Object *title; /* title layout */
41
42         Ecore_Timer *down_timer;
43         double intval, intval_init;
44         int delta;
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
57 static struct _tabbar_item tabbar_items[] = {
58         [CV_YEAR] = {
59                 CV_YEAR,
60                 NULL,
61                 N_(CAL_UTIL_DATE_FORMAT_5),
62                 cal_year_create_view,
63                 cal_year_update_view,
64                 NULL,
65         },
66         [CV_MONTH] = {
67                 CV_MONTH,
68                 NULL,
69                 N_(CAL_UTIL_DATE_FORMAT_15),
70                 cal_month_create_view,
71                 cal_month_update_view,
72                 NULL,
73         },
74         [CV_DAY] = {
75                 CV_DAY,
76                 NULL,
77                 N_(CAL_UTIL_DATE_FORMAT_7),
78                 cal_day_create_view,
79                 cal_day_update_view,
80                 NULL,
81         },
82         [CV_LIST] = {
83                 CV_LIST,
84                 NULL,
85                 NULL,
86                 cal_list_create_view,
87                 cal_list_update_view,
88                 NULL,
89         },
90 };
91
92 static void __cal_main_new_button_callback(void *data, Evas_Object *obj, void *event_info)
93 {
94         c_retm_if(!data, "data is null");
95         c_retm_if(!obj, "obj is null");
96
97         Evas_Object *ly = data;
98         cal_main_data *main_data;
99
100         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
101         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
102
103         main_data->ad->base_hour = -1;
104         main_data->ad->cid = 0;
105
106         cal_edit_create_view(main_data->ad, main_data->ly);
107 }
108
109 static void __cal_main_delete_button_callback(void *data, Evas_Object *obj, void *event_info)
110 {
111         c_retm_if(!data, "data is null");
112         c_retm_if(!obj, "obj is null");
113
114         Evas_Object *ly = data;
115         Evas_Object *ly_delete = NULL;
116         cal_main_data *main_data;
117
118         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
119         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
120
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);
124
125 }
126
127
128 static void __cal_main_account_button_callback(void *data, Evas_Object *obj, void *ei)
129 {
130         c_retm_if(!data, "data is null");
131         c_retm_if(!obj, "obj is null");
132
133         Evas_Object *ly = data;
134         cal_main_data *main_data;
135
136         main_data= CAL_UTIL_GET_PRIV_DATA(ly);
137         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
138
139         cal_account_create_view(main_data->ad, ly);
140 }
141
142 void cal_main_update_title_text(Evas_Object *title, enum cld_view v, struct tm *t, int week_start)
143 {
144         c_retm_if(!title, "title is null");
145         c_retm_if(!t, "t is null");
146
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);
149 }
150
151 static inline void __cal_main_update_title(Evas_Object *ly, enum cld_view v)
152 {
153         c_retm_if(!ly, "ly is null");
154         struct appdata *ad;
155         cal_main_data *main_data;
156
157         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
158         c_retm_if(!main_data|| strcmp(main_data->name, _name), "Invaild Object");
159
160         ad = main_data->ad;
161         c_retm_if(!ad, "p->ad is null");
162
163         if (tabbar_items[v].title) {
164                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,title", "prog");
165         } else {
166                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "hide,title", "prog");
167         }
168 }
169
170 static void __cal_main_tabbar_changed_callback(void *data, Evas_Object *obj, void *event_info)
171 {
172         CAL_FN_START;
173
174         c_retm_if(!data, "data is null");
175         c_retm_if(!obj, "obj is null");
176
177         struct appdata *ad = data;
178         c_retm_if(!ad->main, "ad->main is null");
179
180         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
181         c_retm_if(!main_data, "main_data is null");
182
183         Elm_Object_Item *selected_item = NULL;
184         int i = 0;
185
186         selected_item = elm_segment_control_item_selected_get(obj);
187         c_retm_if(!selected_item, "elm_toolbar_selected_item_get returned null");
188
189         for (i = 0; i < sizeof(tabbar_items)/sizeof(tabbar_items[0]); i++) {
190                 if (tabbar_items[i].item == selected_item) {
191
192                         cal_main_change_view(ad->main, i);
193                         return;
194                 }
195         }
196 }
197
198 static void __cal_main_init_navi_title()
199 {
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");
204 }
205
206 static void __cal_main_add_tabbar(struct appdata *ad)
207 {
208         c_retm_if(!ad, "ad is null");
209         c_retm_if(!ad->main, "ad->main is null");
210
211         Evas_Object *tabbar = elm_segment_control_add(ad->main);
212         c_retm_if(!tabbar, "tabbar is null");
213
214         elm_object_style_set(tabbar, "body_style");
215
216         ad->tabbar = tabbar;
217
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");
220
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");
223
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");
226
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");
229
230         elm_segment_control_item_selected_set( tabbar_items[CV_MONTH].item, EINA_TRUE);
231
232         evas_object_smart_callback_add(tabbar, "changed", __cal_main_tabbar_changed_callback, ad);
233
234         elm_object_item_part_content_set(ad->main_navi_item, "segment3", tabbar);
235 }
236
237 static void __cal_main_create_content(Evas_Object *ly, cal_main_data *main_data, enum cld_view v)
238 {
239         c_retm_if(!ly, "ly is null");
240         c_retm_if(!main_data, "main_data is null");
241
242
243         struct appdata *ad = main_data->ad;
244
245         cal_util_delete_evas_object(&main_data->content);
246
247         if (tabbar_items[v].create)
248                 main_data->content = tabbar_items[v].create(ad, ly);
249
250         if (!main_data->content) {
251                 ERR("load layout error");
252                 return;
253         }
254
255         elm_object_part_content_set(ly, "cont", main_data->content);
256 }
257
258 static inline int __cal_main_update_tm(struct tm *t, enum cld_view v, int delta)
259 {
260         c_retvm_if(!t, -1, "t is null");
261
262         int r;
263
264         switch (v) {
265         case CV_YEAR:
266                 r = cal_util_update_tm_year(t, delta);
267                 break;
268         case CV_MONTH:
269                 r = cal_util_update_tm_month(t, delta);
270                 break;
271         case CV_DAY:
272                 r = cal_util_update_tm_day(t, delta);
273                 break;
274         case CV_LIST:
275                 r = 0;
276                 break;
277         default:
278                 r = -1; // stop timer
279         }
280
281         return r;
282 }
283
284 static int __cal_main_update_content(cal_main_data *main_data)
285 {
286         c_retvm_if(!main_data, -1, "main_data is null");
287
288         struct appdata *ad;
289         enum cld_view v;
290         struct tm tmp;
291         int r;
292
293         ad = main_data->ad;
294         c_retvm_if(!ad, -1, "ad is null");
295
296         v = main_data->cur_view;
297
298         tmp = ad->base_tm;
299         r = __cal_main_update_tm(&tmp, v, main_data->delta);
300         if (r == -1) {
301                 DBG("Time out of range");
302                 return -1;
303         }
304         ad->base_tm = tmp;
305
306         cal_main_update_title_text(main_data->title, v, &ad->base_tm, ad->wday_start);
307
308         if (tabbar_items[v].update)
309                 tabbar_items[v].update(main_data->content);
310
311         ad->is_update_view = EINA_FALSE;
312
313         return 0;
314 }
315
316 static Eina_Bool __cal_main_update_content_by_timer(void *data)
317 {
318         c_retvm_if(!data, ECORE_CALLBACK_CANCEL, "data is null");
319
320         cal_main_data *main_data;
321         int r;
322
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");
325
326         r = __cal_main_update_content(main_data);
327         if (r == -1) {
328                 main_data->down_timer = NULL;
329                 return ECORE_CALLBACK_CANCEL;
330         }
331
332         main_data->intval = main_data->intval / 1.05;
333         ecore_timer_interval_set(main_data->down_timer, main_data->intval);
334
335         return ECORE_CALLBACK_RENEW;
336 }
337
338 void cal_main_change_view(Evas_Object *ly, enum cld_view v)
339 {
340         CAL_FN_START;
341
342         c_retm_if(!ly, "Input parameter is null");
343         c_retm_if(v < CV_YEAR || v > CV_LIST, "Invaild view index");
344
345         struct appdata *ad;
346         cal_main_data *main_data;
347         Elm_Object_Item * it;
348
349         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
350         c_retm_if(!main_data|| strcmp(main_data->name, _name), "Invaild Object");
351
352         if (main_data->cur_view == v)
353                 return;
354
355         ad = main_data->ad;
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);
359
360         if (v == CV_LIST) {
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);
364                 }
365         } else {
366                 if (ad->bt_delete != NULL) {
367                         elm_object_item_del(ad->bt_delete);
368                         ad->bt_delete = NULL;
369                 }
370         }
371
372         main_data->cur_view = v;
373
374         __cal_main_update_content(main_data);
375
376         if (ad->tabbar)
377                 elm_segment_control_item_selected_set( tabbar_items[v].item, EINA_TRUE);
378
379         CAL_FN_END;
380 }
381
382 static void __cal_main_set_base_tm(Evas_Object *ly)
383 {
384         c_retm_if(!ly, "ly is null");
385
386         cal_main_data *main_data;
387         struct appdata *ad;
388
389         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
390         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
391
392         ad = main_data->ad;
393         c_retm_if(!ad, "ad is null");
394
395         if(main_data->cur_view == CV_LIST)
396         {
397                 cal_list_scroll_today(ad);
398                 return;
399         }
400
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)
404                                 return;
405
406         ad->base_tm = ad->today_tm;
407
408         __cal_main_update_content(main_data);
409 }
410
411 static void __cal_main_inc_start(void *data, Evas_Object *obj, const char *e, const char *src)
412 {
413         cal_main_data *main_data;
414
415         main_data = CAL_UTIL_GET_PRIV_DATA(data);
416         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
417
418         main_data->intval = main_data->intval_init;
419         main_data->delta = 1;
420
421         if (main_data->down_timer)
422                 ecore_timer_del(main_data->down_timer);
423
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);
426 }
427
428 static void __cal_main_dec_start(void *data, Evas_Object *obj, const char *e, const char *src)
429 {
430         cal_main_data *main_data;
431
432         main_data = CAL_UTIL_GET_PRIV_DATA(data);
433         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
434
435         main_data->intval = main_data->intval_init;
436         main_data->delta = -1;
437
438         if (main_data->down_timer)
439                 ecore_timer_del(main_data->down_timer);
440
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);
443 }
444
445 static void __cal_main_stop(void *data, Evas_Object *obj, const char *e, const char *src)
446 {
447         cal_main_data *main_data;
448
449         main_data = CAL_UTIL_GET_PRIV_DATA(data);
450         c_retm_if(!main_data, "CAL_UTIL_GET_PRIV_DATA returned null");
451
452         if (main_data->down_timer)
453                 ecore_timer_del(main_data->down_timer);
454
455         main_data->down_timer = NULL;
456         main_data->delta = 0;
457 }
458
459 static int __cal_main_add_title(struct appdata *ad, Evas_Object *ly)
460 {
461         c_retvm_if(!ad, -1, "ad is null");
462         c_retvm_if(!ly, -1, "ly is null");
463
464         cal_main_data *main_data;
465         Evas_Object *title;
466
467         title = cal_util_add_layout(ad->nv, "main/title");
468         c_retvm_if(!title, -1, "cal_util_add_layout returned null");
469
470         elm_object_part_content_set(ly, "title", title);
471
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);
476
477         main_data = CAL_UTIL_GET_PRIV_DATA(ly);
478         c_retvm_if(!main_data, -1, "CAL_UTIL_GET_PRIV_DATA returned null");
479
480         main_data->title = title;
481         ad->title = title;
482
483         return 0;
484 }
485
486 static void __cal_main_update_all(void* data)
487 {
488         c_retm_if(!data, "data is null");
489
490         struct appdata* ad = data;
491         cal_main_update_view(ad);
492 }
493
494 void cal_main_add_changed_callback(struct appdata * ad)
495 {
496         CAL_FN_START;
497
498         c_retm_if(!ad, "ad is null");
499
500         CALENDAR_SVC_ADD_EVENT_CHANGED_CALLBACK(cal_main_update_view, ad);
501
502         CALENDAR_SVC_ADD_CALENDAR_CHANGED_CALLBACK(CAL_STRUCT_CALENDAR, __cal_main_update_all, ad);
503
504         CAL_FN_END;
505 }
506
507 void cal_main_del_changed_callback()
508 {
509         CAL_FN_START;
510
511         CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(cal_main_update_view);
512
513         CALENDAR_SVC_DEL_CALENDAR_CHANGED_CALLBACK(CAL_STRUCT_CALENDAR, __cal_main_update_all);
514
515         CAL_FN_END;
516 }
517
518 static void __cal_main_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
519 {
520         CAL_FN_START;
521
522         c_retm_if(!obj, "obj is null");
523
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");
526
527         struct appdata *ad = main_data->ad;
528         c_retm_if(!ad, "ad is null");
529
530         cal_main_del_changed_callback();
531
532         if (main_data->down_timer)
533                 ecore_timer_del(main_data->down_timer);
534
535         if (ad->tabbar)
536                 evas_object_del(ad->tabbar);
537
538         ad->main = NULL;
539
540         free(main_data);
541
542         CAL_FN_END;
543 }
544
545 static Evas_Object *__cal_main_create_main_layout(struct appdata *ad)
546 {
547         c_retvm_if(!ad, NULL, "ad is null");
548
549         int r;
550         Evas_Object *ly;
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");
553
554         main_data->name = _name;
555
556         ly = cal_util_add_layout(ad->nv, main_data->name);
557         if (!ly)
558         {
559                 free(main_data);
560                 return NULL;
561         }
562
563         main_data->ad = ad;
564         main_data->ly = ly;
565         main_data->intval_init = 0.5;
566         main_data->ad->bt_delete = NULL;
567         evas_object_data_set(ly, "priv", main_data);
568
569         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_main_delete_layout, NULL);
570
571         r = __cal_main_add_title(ad, ly);
572         c_retvm_if(r != 0, NULL, "__cal_main_add_title is failed");
573
574         return ly;
575 }
576
577 static void __cal_main_center_button_callback(void *data, Evas_Object* obj, void* event_info)
578 {
579         c_retm_if(!data, "data is null");
580
581         __cal_main_set_base_tm(data);
582 }
583
584 static void __cal_main_back_button_clicked_callback(void *data, Evas_Object *obj, void *event_info)
585 {
586         c_retm_if(!data, "data is null");
587
588         struct appdata* ad = (struct appdata*)data;
589
590         elm_win_lower(ad->win);
591 }
592
593 static void __cal_main_set_naviframe( struct appdata *ad)
594 {
595         c_retm_if(!ad, "ad is null");
596
597         CAL_FN_START;
598
599         Evas_Object *cbar;
600         Evas_Object *back_button;
601
602         cbar = cal_util_add_controlbar(ad->nv);
603         c_retm_if(!cbar, "cal_util_add_controlbar returned null");
604         ad->cbar = cbar;
605
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);
609
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);
613
614         ad->main_navi_item = elm_naviframe_item_push(ad->nv, S_("IDS_COM_BODY_CALENDAR"), back_button, NULL, ad->main, "segment");
615
616         elm_object_item_part_content_set(ad->main_navi_item, "controlbar", cbar);
617
618         elm_object_style_set(back_button, "naviframe/back_btn/default");
619
620         __cal_main_init_navi_title();
621
622         __cal_main_add_tabbar(ad);
623
624         CAL_FN_END;
625 }
626
627 void cal_main_create_view(struct appdata *ad)
628 {
629         CAL_FN_START;
630
631         c_retm_if(!ad, "data is null");
632
633         c_retm_if(ad->request_view < CV_YEAR && ad->request_view > CV_DETAIL, "request_view is invalid");
634
635         if (!ad->main) {
636                 ad->main = __cal_main_create_main_layout(ad);
637                 c_retm_if(!ad->main, "ad->main is null");
638
639                 __cal_main_set_naviframe(ad);
640         }
641
642         cal_main_change_view(ad->main, ad->request_view);
643
644         CAL_FN_END;
645 }
646
647 static void __cal_main_set_first_day(struct appdata *ad)
648 {
649         c_retm_if(!ad, "ad is null");
650
651         int r,val;
652         r = vconf_get_int(VCONFKEY_SETAPPL_WEEKOFDAY_FORMAT_INT,&val);
653         if(0 > r)
654                 ad->wday_start = 0;
655         else
656                 ad->wday_start = val;
657 }
658
659 void cal_main_update_view(void *data)
660 {
661         CAL_FN_START;
662
663         c_retm_if(!data, "data is null");
664
665         struct appdata* ad = data;
666         c_retm_if(!ad->main, "ad->main is null");
667
668         cal_main_data *main_data = CAL_UTIL_GET_PRIV_DATA(ad->main);
669         c_retm_if(!main_data, "main_data is null");
670
671         __cal_main_set_first_day(ad);
672
673         if (CAL_STRCMP(main_data->name, _name))
674         {
675                 ERR("Invalid object");
676                 return;
677         }
678
679         __cal_main_create_content(main_data->ly, main_data, main_data->cur_view);
680         __cal_main_update_content(main_data);
681
682         CAL_FN_END;
683 }