test
[apps/core/preloaded/calendar.git] / src / view-main-month.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 #include "detail.h"
23 #include "edit-repeat.h"
24 #include "external-ug.h"
25
26 static const char *_name = NULL;
27
28 #define MONTH_CAL_CBAR_H 41
29 #define MONTH_CAL_X 0
30 #define MONTH_CAL_Y 200
31
32 #define ANIMATION_TIME 0.2
33
34 #define INITIAL_FETCH_SIZE 4
35 #define IDLER_FETCH_SIZE 4
36
37
38 typedef enum{
39         FOCUS_IN_DAILY = 0,
40         FOCUS_IN_WEEKLY
41 }focus_in_month_view_type;
42
43 typedef struct {
44         const char *name;
45         struct appdata *ad;
46         Evas_Object *parent;
47         Evas_Object *ly; // self
48
49         Evas_Object *month;
50         Evas_Object *month_left;
51         Evas_Object *month_right;
52         Evas_Coord_Rectangle rect;
53         Evas_Coord_Rectangle oringinal_size;
54
55         focus_in_month_view_type calendar_focus_view;
56
57         Evas_Object *genlist;
58         Eina_List *event_list;
59
60         int single_moved;
61         int multi_touched;
62         Evas_Coord_Point down1, down2;
63         int down_d;
64         int down_is_called;
65
66         Evas_Coord_Point move1, move2;
67
68         Ecore_Idler *idler;
69         int event_offset;
70
71         Ecore_Animator *ani;
72         double ani_start;
73
74         Evas_Coord_Rectangle pos_from;
75         Evas_Coord_Rectangle pos_to;
76
77         int d;
78
79         Evas_Object *popup;
80
81         Evas_Coord x;
82         Evas_Coord y;
83         Elm_Object_Item *sweep_it;
84 }cal_month_data;
85
86 extern void cal_month_calendar_update_view(Evas_Object *ly);
87
88 static Evas_Object *__cal_month_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part);
89 static char* __cal_month_get_genlist_item_label(void *data, Evas_Object *obj, const char *part);
90 static void __cal_month_mouse_move_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei);
91 static void __cal_month_update_genlist(cal_month_data *p);
92 static void __cal_month_changed_callback(void *data, Evas_Object *obj, const char *e, const char *src);
93 static char* __cal_month_share_genlist_item_label(void *data, Evas_Object *obj, const char *part);
94
95 static Elm_Genlist_Item_Class itc = {
96         .item_style = "3text.5icon",
97         .func.content_get = __cal_month_get_genlist_item_icon,
98         .func.text_get = __cal_month_get_genlist_item_label,
99         .decorate_item_style = "mode/slide3",
100 };
101
102 static Elm_Genlist_Item_Class itc_1text = {
103         .item_style = "1text",
104         .func.content_get = NULL,
105         .func.text_get = __cal_month_share_genlist_item_label,
106 };
107
108 static int is_hour24;
109 static Calendar_color calendar_color;
110
111 static inline void __cal_month_delete_popup(cal_month_data *p)
112 {
113         c_retm_if(!p || !p->popup, "param is null");
114
115         evas_object_del(p->popup);
116         p->popup = NULL;
117 }
118
119 static char* __cal_month_share_genlist_item_label(void *data, Evas_Object *obj, const char *part)
120 {
121         c_retvm_if(!data || !obj || !part, NULL, "data is null");
122
123         char *name = (char *)data;
124
125         if (!CAL_STRCMP(part, "elm.text")) {
126                 return strdup(name);
127         }
128
129         return NULL;
130 }
131
132 static inline void __cal_month_stop_animation(cal_month_data *p)
133 {
134         if (p->ani)
135                 ecore_animator_del(p->ani);
136
137         p->ani = NULL;
138 }
139
140 static void __cal_month_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
141 {
142         CAL_FN_START;
143
144         c_retm_if(!data, "data is null");
145         c_retm_if(!e, "e is null");
146
147         cal_month_data *p = data;
148
149         CALENDAR_SVC_FREE_CS_LIST(&p->event_list);
150
151         __cal_month_stop_animation(p);
152
153         if (p->idler)
154                 ecore_idler_del(p->idler);
155
156         if (p->popup)
157                 evas_object_del(p->popup);
158
159         free(p);
160 }
161
162 static void __cal_month_resize_view(void *data, Evas *e, Evas_Object *ly, void *ei)
163 {
164         cal_month_data *p = data;
165
166         cal_util_get_geometry(&p->rect, p->month);
167 }
168
169 static void __cal_month_make_time_text(struct tm *tm, struct tm *base_tm, char *buf, int sz)
170 {
171         const char* date;
172         const char* time;
173
174         if(is_hour24)
175                 time = CAL_UTIL_TIME_FORMAT_6;
176         else
177                 time = CAL_UTIL_TIME_FORMAT_1;
178
179         if (tm->tm_year != base_tm->tm_year)
180                 date = CAL_UTIL_DATE_FORMAT_11;
181         else if (tm->tm_mon != base_tm->tm_mon)
182                 date = CAL_UTIL_DATE_FORMAT_10;
183         else if (tm->tm_mday != base_tm->tm_mday)
184                 date = CAL_UTIL_DATE_FORMAT_9;
185         else
186                 date = NULL;
187
188         cal_util_get_time_text(buf, sz, NULL, time, tm);
189 }
190
191 static char* __cal_month_get_time_text(cal_struct *cs, cal_month_data *p)
192 {
193         char buf[512];
194         char stime[512];
195
196         long long int lli_start = CALENDAR_SVC_STRUCT_GET_LLI(cs, CALS_VALUE_LLI_DTSTART_UTIME);
197         struct tm tm_start;
198         cal_util_convert_lli_to_tm(NULL, lli_start, &tm_start);
199
200         __cal_month_make_time_text(&tm_start, &p->ad->base_tm, stime, sizeof(stime));
201
202         snprintf(buf, sizeof(buf), "%s", stime);
203         return strdup(buf);
204 }
205
206 static void __cal_month_set_genlist_item_sweep_off(Elm_Object_Item *it)
207 {
208         c_retm_if(!it, "it is null");
209         elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
210         elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_ALWAYS);
211 }
212
213 static void __cal_month_init_sweep_data(cal_struct *cs, cal_month_data *p)
214 {
215         c_ret_if(!p);
216         c_ret_if(!cs);
217
218         cal_main_set_cs(p->ad, cs);
219 }
220
221 static void __cal_month_edit_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
222 {
223         CAL_FN_START;
224
225         c_retm_if(!data, "data is null");
226         c_retm_if(!obj, "obj is null");
227
228         Evas_Object *popup = data;
229         Evas_Object *button = obj;
230
231         cal_month_data* p = evas_object_data_get(popup, "data");
232         c_retm_if(!p, "p is null");
233
234         struct appdata* ad = p->ad;
235         c_retm_if(!ad, "ad is null");
236
237         if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_BODY_ONLY_THIS_EVENT"))) {
238                 ad->edit_special_one = EINA_TRUE;
239
240                 cal_edit_create_view(ad, p->ly);
241                 __cal_month_set_genlist_item_sweep_off(p->sweep_it);
242         }else if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"))) {
243                 ad->edit_special_one = EINA_FALSE;
244
245                 cal_edit_create_view(ad, p->ly);
246                 __cal_month_set_genlist_item_sweep_off(p->sweep_it);
247         }
248
249         evas_object_del(popup);
250         p->popup = NULL;
251 }
252
253 static void __cal_month_delete_event(cal_month_data* p, Eina_Bool is_delete_all)
254 {
255         c_ret_if(!p);
256
257         struct appdata* ad = p->ad;
258         c_ret_if(!ad);
259
260         if (!is_delete_all) {
261                 long long int lli_time;
262                 cal_util_convert_tm_to_lli(NULL, &ad->tm_start, &lli_time);
263
264                 int r = calendar_svc_event_delete_normal_instance(ad->cid, lli_time);
265                 if (r != CAL_SUCCESS)
266                         ERR("calendar_svc_event_delete_normal_instance() is failed(%d)", r);
267         }
268         else    {
269                 int r = CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, ad->cid);
270                 if (r != CAL_SUCCESS)
271                         ERR("CALENDAR_SVC_DELETE is failed %d", r);
272         }
273 }
274
275 static void __cal_month_delete_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
276 {
277         CAL_FN_START;
278
279         c_retm_if(!data, "data is null");
280         c_retm_if(!obj, "obj is null");
281
282         Evas_Object *popup = data;
283         Evas_Object *button = obj;
284
285         cal_month_data* p = evas_object_data_get(popup, "data");
286         c_retm_if(!p, "p is null");
287
288         if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_BODY_ONLY_THIS_EVENT")))
289                 __cal_month_delete_event(p, EINA_FALSE);
290         else    if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS")))
291                 __cal_month_delete_event(p, EINA_TRUE);
292
293         evas_object_del(popup);
294         p->popup = NULL;
295 }
296
297 static void __cal_month_show_popup(cal_month_data *p, const char *tit, Eina_Bool is_edit)
298 {
299         c_retm_if(!p, "p is NULL.");
300
301         void (*callback_func)(void *data, Evas_Object *obj, void *ei) = NULL;
302
303         if (is_edit)
304                 callback_func = __cal_month_edit_popup_response_event_callback;
305         else
306                 callback_func = __cal_month_delete_popup_response_event_callback;
307
308         p->popup = cal_util_add_popup(p->ad->win, "verticalbuttonstyle", NULL, tit, callback_func,
309                 p, C_("IDS_CLD_BODY_ONLY_THIS_EVENT"),
310                 C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"),
311                 S_("IDS_COM_SK_CANCEL"), NULL);
312         c_retm_if(!p->popup, "cal_util_add_popup(p->ad->win) returned null");
313
314         evas_object_data_set(p->popup, "priv", p);
315 }
316
317 static void __cal_month_edit_norepeat_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
318 {
319         c_retm_if(!data, "data is null");
320         c_retm_if(!obj, "obj is null");
321
322         Evas_Object *popup = data;
323         Evas_Object *button = obj;
324
325         cal_month_data* p = evas_object_data_get(popup, "data");
326         c_retm_if(!p, "p is null");
327
328         if (!strcmp(elm_object_text_get(button), S_("IDS_COM_SK_OK"))) {
329                 cal_edit_create_view(p->ad, p->ly);
330                 __cal_month_set_genlist_item_sweep_off(p->sweep_it);
331         }
332
333         evas_object_del(popup);
334         p->popup = NULL;
335 }
336
337 static void __cal_month_edit_button_callback(void *data, Evas_Object *obj, void *ei)
338 {
339         cal_struct *cs = data;
340         c_retm_if(!cs, "cs is NULL.");
341
342         cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
343         c_retm_if(!p, "p is NULL.");
344
345         __cal_month_init_sweep_data(cs, p);
346
347         if (CALENDAR_SVC_STRUCT_GET_INT(cs, CALS_VALUE_INT_RRULE_ID))
348                 __cal_month_show_popup(p, C_("IDS_CLD_HEADER_EDIT_EVENT"), EINA_TRUE);
349         else {
350                 p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, C_("IDS_CLD_HEADER_EDIT_EVENT"), __cal_month_edit_norepeat_popup_response_event_callback, p,
351                         S_("IDS_COM_SK_OK"),S_("IDS_COM_SK_CANCEL"), NULL);
352         }
353 }
354
355 static void __cal_month_delete_norepeat_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
356 {
357         c_retm_if(!data, "data is null");
358         c_retm_if(!obj, "obj is null");
359
360         Evas_Object *popup = data;
361         Evas_Object *button = obj;
362
363         cal_month_data* p = evas_object_data_get(popup, "data");
364         c_retm_if(!p, "p is null");
365         c_retm_if(!p->ly, "p->ly is null");
366
367         if (!CAL_STRCMP(elm_object_text_get(button), S_("IDS_COM_SK_OK"))) {
368
369                 int r = CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, p->ad->cid);
370                 c_retm_if(r != CAL_SUCCESS, "CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, %d) is failed(%d)", p->ad->cid, r);
371
372                 cal_struct *cs = evas_object_data_get(p->ly, "cs");
373
374                 if (cs)
375                         CALENDAR_SVC_STRUCT_FREE(&cs);
376                 else
377                         ERR("cs is null");
378         }
379
380         evas_object_del(p->popup);
381         p->popup = NULL;
382 }
383
384 static void __cal_month_delete_button_callback(void *data, Evas_Object *obj, void *ei)
385 {
386         cal_struct *cs = data;
387         c_retm_if(!cs, "cs is NULL.");
388
389         cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
390         c_retm_if(!p, "p is NULL.");
391
392         __cal_month_init_sweep_data(cs, p);
393
394         if (p->ad->cid) {
395
396                 evas_object_data_set(p->ly, "cs", cs);
397
398                 int r = CALENDAR_SVC_STRUCT_GET_INT(cs,CALS_VALUE_INT_RRULE_ID);
399
400                 if (0 != r) {
401                         __cal_month_show_popup(p, C_("IDS_CLD_OPT_DELETE_EVENT"), EINA_FALSE);
402                 } else {
403                         p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, C_("IDS_CLD_OPT_DELETE_EVENT"), __cal_month_delete_norepeat_popup_response_event_callback, p,
404                                 S_("IDS_COM_SK_OK"),S_("IDS_COM_SK_CANCEL"), NULL);
405                 }
406         }
407 }
408
409 static void __cal_month_via_message_callback(void *data, Evas_Object *obj, void *ei)
410 {
411         c_retm_if(!data, "data is null");
412         c_retm_if(!obj, "obj is null");
413
414         cal_month_data *p = data;
415         c_retm_if(!p->ad, "p->ad is null");
416
417         cal_struct *cs = NULL;
418         int r = CALENDAR_SVC_GET(CAL_STRUCT_SCHEDULE, p->ad->cid, NULL, &cs);
419         if (CAL_SUCCESS != r || NULL == cs) {
420                 ERR("CALENDAR_SVC_GET failed: %d", r);
421                 return;
422         }
423
424         r = cal_util_create_vcs_file_from_cs(cs, MESSAGE_VCS);
425         if (CAL_SUCCESS != r) {
426                 CALENDAR_SVC_STRUCT_FREE(&cs);
427                 ERR("cal_util_create_vcs_file_from_cs: %d", r);
428                 return;
429         }
430
431         CALENDAR_SVC_STRUCT_FREE(&cs);
432
433         cal_launch_ug_with_var(MESSAGE_COMPOSER_UG, NULL, "ATTACHFILE", MESSAGE_VCS, NULL);
434         __cal_month_set_genlist_item_sweep_off(p->sweep_it);
435
436         __cal_month_delete_popup(p);
437 }
438
439 static void __cal_month_via_email_callback(void *data, Evas_Object *obj, void *ei)
440 {
441         c_retm_if(!data, "data is null");
442         c_retm_if(!obj, "obj is null");
443
444         cal_month_data *p = data;
445         c_retm_if(!p->ad, "p->ad is null");
446
447         cal_struct *cs = NULL;
448         int r = CALENDAR_SVC_GET(CAL_STRUCT_SCHEDULE, p->ad->cid, NULL, &cs);
449         if (CAL_SUCCESS != r || NULL == cs) {
450                 ERR("CALENDAR_SVC_GET failed: %d", r);
451                 return;
452         }
453
454         r = cal_util_create_vcs_file_from_cs(cs, EMAIL_VCS);
455         if (CAL_SUCCESS != r) {
456                 CALENDAR_SVC_STRUCT_FREE(&cs);
457                 ERR("cal_util_create_vcs_file_from_cs: %d", r);
458                 return;
459         }
460
461         CALENDAR_SVC_STRUCT_FREE(&cs);
462
463         cal_launch_ug_with_var(EMAIL_COMPOSER_UG, NULL, "RUN_TYPE", "5", "ATTACHMENT", EMAIL_VCS, NULL);
464         __cal_month_set_genlist_item_sweep_off(p->sweep_it);
465
466         __cal_month_delete_popup(p);
467 }
468
469 static void __cal_month_via_bluetooth_callback(void *data, Evas_Object *obj, void *ei)
470 {
471         c_retm_if(!data, "data is null");
472         c_retm_if(!obj, "obj is null");
473
474         cal_month_data *p = data;
475         c_retm_if(!p->ad, "p->ad is null");
476
477         cal_struct *cs = NULL;
478         int r = CALENDAR_SVC_GET(CAL_STRUCT_SCHEDULE, p->ad->cid, NULL, &cs);
479         if (CAL_SUCCESS != r || NULL == cs) {
480                 ERR("CALENDAR_SVC_GET failed: %d", r);
481                 return;
482         }
483
484         r = cal_util_create_vcs_file_from_cs(cs, BLUETOOTH_VCS);
485         if (CAL_SUCCESS != r) {
486                 CALENDAR_SVC_STRUCT_FREE(&cs);
487                 ERR("cal_util_create_vcs_file_from_cs: %d", r);
488                 return;
489         }
490
491         CALENDAR_SVC_STRUCT_FREE(&cs);
492
493         cal_launch_ug_with_var(BLUETOOTH_UG, NULL, "launch-type", "send", "filecount", "1", "files", BLUETOOTH_VCS, NULL);
494         __cal_month_set_genlist_item_sweep_off(p->sweep_it);
495
496         __cal_month_delete_popup(p);
497 }
498
499 static void __cal_month_share_popup_response_callback(void *data, Evas_Object *obj, void *ei)
500 {
501         c_retm_if(!data, "data is null");
502         c_retm_if(!obj, "obj is null");
503
504         Evas_Object *popup = data;
505
506         cal_month_data* p = evas_object_data_get(popup, "data");
507         c_retm_if(!p, "p is null");
508
509         evas_object_del(popup);
510         p->popup = NULL;
511
512 }
513
514 static void __cal_month_send_button_callback(void *data, Evas_Object *obj, void *ei)
515 {
516         cal_struct *cs = data;
517         c_retm_if(!cs, "cs is NULL.");
518
519         cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
520         c_retm_if(!p, "p is NULL.");
521
522         __cal_month_init_sweep_data(cs, p);
523
524         p->popup = cal_util_add_popup(p->ad->win, "menustyle", S_("IDS_COM_BUTTON_SHARE"), NULL,
525                                 __cal_month_share_popup_response_callback, p,
526                                 S_("IDS_COM_BODY_CLOSE"),  NULL);
527
528         c_retm_if(!p->popup, "cal_util_add_popup returned null");
529         evas_object_data_set(p->popup, "data", p);
530
531         Evas_Object *genlist = elm_genlist_add(p->popup);
532         c_retm_if(!genlist, "elm_genlist_add returned null");
533
534         elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_EMAIL"), NULL, ELM_GENLIST_ITEM_NONE, __cal_month_via_email_callback, p);
535         elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_MESSAGE"), NULL, ELM_GENLIST_ITEM_NONE, __cal_month_via_message_callback, p);
536         elm_genlist_item_append(genlist, &itc_1text, S_("IDS_COM_BODY_BLUETOOTH"), NULL, ELM_GENLIST_ITEM_NONE, __cal_month_via_bluetooth_callback, p);
537
538         elm_object_content_set(p->popup, genlist);
539         evas_object_show(p->popup);
540 }
541
542 static Evas_Object *__cal_month_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
543 {
544         c_retv_if(!data, NULL);
545
546         Evas_Object *icon = NULL;
547         Evas_Object *button = NULL;
548         int r;
549         cal_struct *cs = data;
550         cal_struct *calendar = NULL;
551         cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
552
553         if (!CAL_STRCMP(part, "elm.swallow.colorbar"))
554         {
555                 r = CALENDAR_SVC_GET(CAL_STRUCT_CALENDAR, CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_VALUE_INT_CALENDAR_ID), NULL, &calendar);
556                 c_retvm_if(r != CAL_SUCCESS, NULL, "CALENDAR_SVC_GET is failed(%d)", r);
557
558                 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
559                 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
560
561                 CALENDAR_SVC_GET_CALENDAR_COLOR(calendar, &calendar_color);
562
563                 evas_object_color_set(icon, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
564
565                 CALENDAR_SVC_STRUCT_FREE(&calendar);
566
567                 return icon;
568         } else if (!CAL_STRCMP(part, "elm.slide.swallow.1")) {
569                 button = elm_button_add(obj);
570                 c_retvm_if(!button, NULL, "button is NULL");
571                 elm_object_style_set(button, "text_only/sweep");
572                 elm_object_text_set(button, S_("IDS_COM_SK_EDIT"));
573                 evas_object_data_set(button, "priv", p);
574                 evas_object_smart_callback_add(button, "clicked", __cal_month_edit_button_callback, cs);
575                 return button;
576         } else if (!CAL_STRCMP(part, "elm.slide.swallow.2")) {
577                 button = elm_button_add(obj);
578                 c_retvm_if(!button, NULL, "button is NULL");
579                 elm_object_style_set(button, "text_only/sweep");
580                 elm_object_text_set(button, S_("IDS_COM_BODY_DELETE"));
581                 evas_object_data_set(button, "priv", p);
582                 evas_object_smart_callback_add(button, "clicked", __cal_month_delete_button_callback, cs);
583                 return button;
584         } else if (!CAL_STRCMP(part, "elm.slide.swallow.3")) {
585                 button = elm_button_add(obj);
586                 c_retvm_if(!button, NULL, "button is NULL");
587                 elm_object_style_set(button, "text_only/sweep");
588                 elm_object_text_set(button, S_("IDS_COM_BUTTON_SHARE"));
589                 evas_object_data_set(button, "priv", p);
590                 evas_object_smart_callback_add(button, "clicked", __cal_month_send_button_callback, cs);
591                 return button;
592         }
593         return NULL;
594 }
595
596 static char* __cal_month_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
597 {
598         c_retv_if(!data, NULL);
599
600         cal_month_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
601         cal_struct *cs = data;
602         const char *str;
603
604         if (!CAL_STRCMP(part, "elm.text.1")) {
605
606                 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_SUMMARY);
607                 if (str)
608                         return strdup(str);
609
610                 return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
611
612         } else if (!CAL_STRCMP(part, "elm.text.2")) {
613
614                 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_LOCATION);
615                 if (str)
616                         return strdup(str);
617
618                 return strdup(C_("IDS_CLD_BODY_NO_LOCATION_SELECTED"));
619
620         } else if (!CAL_STRCMP(part, "elm.text.3")) {
621
622                 if (CALENDAR_SVC_STRUCT_GET_INT(cs, CALS_VALUE_INT_DTSTART_TYPE) == CALS_TIME_LOCALTIME)
623                         return strdup(C_("IDS_COM_BODY_ALL_DAY"));
624
625                 p = CAL_UTIL_GET_PRIV_DATA(obj);
626                 return __cal_month_get_time_text(cs, p);
627
628         } else if (!CAL_STRCMP(part, "elm.slide.text.1")) {
629
630                 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_SUMMARY);
631                 if (str)
632                         return strdup(str);
633
634                 return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
635         }
636
637         return NULL;
638 }
639
640 static void __cal_month_genlist_item_select_callback(void *data, Evas_Object *obj, void *ei)
641 {
642         c_ret_if(!data);
643
644         cal_struct *cs = data;
645
646         Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
647         if (it)
648                 elm_genlist_item_selected_set(it, EINA_FALSE);
649
650         cal_month_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
651         c_ret_if(!p);
652
653         cal_main_set_cs(p->ad, cs);
654
655         cal_detail_create_view(p->ad, p->parent);
656 }
657
658 static void __cal_month_get_events(cal_month_data *p)
659 {
660         struct tm tm_start = p->ad->base_tm;
661         tm_start.tm_hour = 0;
662         tm_start.tm_min = 0;
663         tm_start.tm_sec = 0;
664
665         struct tm tm_end = tm_start;
666         tm_end.tm_hour = 23;
667         tm_end.tm_min = 59;
668         tm_end.tm_sec = 59;
669
670         p->event_list = CALENDAR_SVC_GET_EVENT_LIST(&tm_start, &tm_end);
671 }
672
673 static void __cal_month_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
674 {
675         c_retm_if(!event_info, "event_info is null");
676         c_retm_if(!obj, "obj is null");
677
678         Elm_Object_Item *it = event_info;
679
680         elm_genlist_item_decorate_mode_set(it, "slide", EINA_TRUE);
681
682         cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
683         c_retm_if(!p, "p is null");
684
685         if (p->sweep_it && it != p->sweep_it)
686                 elm_genlist_item_decorate_mode_set(p->sweep_it, "slide", EINA_FALSE);
687
688         p->sweep_it = it;
689 }
690
691 static void __cal_month_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
692 {
693         c_retm_if(!event_info, "event_info is null");
694         Elm_Object_Item *it = event_info;
695
696         elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
697 }
698
699 static void __cal_month_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info)
700 {
701         c_retm_if(!obj, "obj is null");
702
703         Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
704         c_ret_if(!it);
705
706         elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
707 }
708
709 static void __cal_month_update_genlist(cal_month_data *p)
710 {
711         CAL_FN_START;
712
713         c_retm_if(!p, "p is null");
714
715         Evas_Object* genlist = p->genlist;
716
717         CALENDAR_SVC_FREE_CS_LIST(&p->event_list);
718
719         __cal_month_get_events(p);
720
721         if (!p->event_list) {
722                 if (genlist)
723                         elm_genlist_clear(genlist);
724
725                 CAL_FN_END;
726
727                 return;
728         }
729
730         if (!genlist) {
731                 genlist = elm_genlist_add(p->ly);
732                 c_retm_if(!genlist, "gl is null");
733
734                 p->genlist = genlist;
735
736                 elm_object_part_content_set(p->ly, "list/sw", genlist);
737                 evas_object_data_set(genlist, "priv", p);
738
739                 evas_object_smart_callback_add(genlist, "drag,start,right", __cal_month_gl_mode_right, NULL);
740                 evas_object_smart_callback_add(genlist, "drag,start,left", __cal_month_gl_mode_left, NULL);
741                 evas_object_smart_callback_add(genlist, "drag,start,up", __cal_month_gl_mode_cancel, NULL);
742                 evas_object_smart_callback_add(genlist, "drag,start,down", __cal_month_gl_mode_cancel, NULL);
743         }
744         else
745                 elm_genlist_clear(genlist);
746
747         p->event_offset = 0;
748
749         Eina_List *l = NULL;
750         cal_struct *cs = NULL;
751
752         EINA_LIST_FOREACH(p->event_list, l, cs) {
753                 if (cs)
754                         elm_genlist_item_append(genlist, &itc, cs, NULL, ELM_GENLIST_ITEM_NONE, __cal_month_genlist_item_select_callback, cs);
755         }
756
757         CAL_FN_END;
758 }
759
760 static Evas_Object* __cal_month_create_month_d(cal_month_data *p, int d)
761 {
762         c_retv_if(!p, NULL);
763
764         struct appdata *ad = p->ad;
765         c_retv_if(!ad, NULL);
766
767         int r = cal_util_update_tm_month(&ad->base_tm, d);
768         c_retv_if(r < 0, NULL);
769
770         Evas_Object *calendar = cal_month_calendar_create_view(ad, p->parent, EINA_TRUE);
771
772         r = cal_util_update_tm_month(&ad->base_tm, -d);
773         c_retv_if(r < 0, NULL);
774
775         return calendar;
776 }
777
778 static void __cal_month_move_month_calendar_to_left(cal_month_data *p, Evas_Coord x)
779 {
780         if (p->month_left == NULL) {
781                 p->month_left = __cal_month_create_month_d(p, -1);
782                 elm_object_part_content_set(p->ly, "cal/sw/left", p->month_left);
783         }
784
785         if(0 > p->oringinal_size.x)
786         {
787                 evas_object_move(p->month_left, x, p->rect.y);
788         }
789         else
790         {
791                 evas_object_move(p->month_left, x, p->oringinal_size.y);
792         }
793 }
794
795 static void __cal_month_move_month_calendar_to_right(cal_month_data *p, Evas_Coord x)
796 {
797         if (p->month_right == NULL) {
798                 p->month_right = __cal_month_create_month_d(p, 1);
799                 elm_object_part_content_set(p->ly, "cal/sw/right", p->month_right);
800         }
801
802         if(0 > p->oringinal_size.x)
803         {
804                 evas_object_move(p->month_right, x, p->rect.y);
805         }
806         else
807         {
808                 evas_object_move(p->month_right, x, p->oringinal_size.y);
809         }
810
811 }
812
813 static void __cal_month_move_month_calendar(cal_month_data *p)
814 {
815         c_ret_if(!p);
816
817         Evas_Coord dx = p->move1.x - p->down1.x;
818         if (!p->single_moved && dx < 15 && dx > -15)
819                 return;
820
821         if (!p->single_moved)
822                 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), "moved", "prog");
823
824         p->single_moved = 1;
825
826         struct appdata *ad = p->ad;
827         c_retm_if(!ad, "ad is null");
828
829         struct tm t;
830         int r = 0;
831
832         if (0 <= dx) {
833
834                 t = ad->base_tm;
835                 r = cal_util_update_tm_month(&t, -1);
836                 c_ret_if(r < 0);
837
838         }
839         else {
840
841                 t = ad->base_tm;
842                 r = cal_util_update_tm_month(&t, 1);
843                 c_ret_if(r < 0);
844         }
845
846         Evas_Coord x;
847         if (p->oringinal_size.x < 0) {
848                 x = p->rect.x + dx;
849
850                 evas_object_move(p->month, x, p->rect.y);
851
852                 __cal_month_move_month_calendar_to_left(p, x - p->rect.w);
853                 __cal_month_move_month_calendar_to_right(p, x + p->rect.w);
854
855         } else {
856
857                 x = p->oringinal_size.x + dx;
858
859                 evas_object_move(p->month, x, p->oringinal_size.y);
860
861                 __cal_month_move_month_calendar_to_left(p, x - p->oringinal_size.w);
862                 __cal_month_move_month_calendar_to_right(p, x + p->oringinal_size.w);
863         }
864 }
865
866 static inline void __cal_month_move_objects(cal_month_data *p, Evas_Coord dx)
867 {
868         c_ret_if(!p);
869
870         if(!dx)
871                 return;
872
873         struct appdata *ad = p->ad;
874         c_retm_if(!ad, "ad is null");
875
876         struct tm t;
877         int r = 0;
878
879         if (0 <= dx) {
880
881                 t = ad->base_tm;
882                 r = cal_util_update_tm_month(&t, -1);
883                 c_ret_if(r < 0);
884
885         } else {
886
887                 t = ad->base_tm;
888                 r = cal_util_update_tm_month(&t, 1);
889                 c_ret_if(r < 0);
890         }
891
892         Evas_Coord x = p->pos_from.x + dx;
893
894         evas_object_move(p->month, x, p->rect.y);
895
896         __cal_month_move_month_calendar_to_left(p, x - p->rect.w);
897         __cal_month_move_month_calendar_to_right(p, x + p->rect.w);
898 }
899
900
901 static inline int __cal_month_update_month_view(cal_month_data *p, int d)
902 {
903         CAL_ASSERT(p);
904
905         int r;
906
907         r = cal_util_update_tm_month(&p->ad->base_tm, d);
908         if (r == -1)
909                 return -1;
910
911         edje_object_signal_callback_del(CAL_UTIL_GET_EDJ_DATA(p->month), "changed", "prog", __cal_month_changed_callback);
912         evas_object_event_callback_del(p->month, EVAS_CALLBACK_MOUSE_MOVE, __cal_month_mouse_move_event_callback);
913
914         elm_object_part_content_unset(p->ly, "cal/sw");
915         elm_object_part_content_unset(p->ly, "cal/sw/left");
916         elm_object_part_content_unset(p->ly, "cal/sw/right");
917
918         if(d > 0)
919         {
920                 evas_object_del(p->month_left);
921                 p->month_left = p->month;
922                 p->month = p->month_right;
923                 p->month_right = __cal_month_create_month_d(p, 1);
924         }
925         else if(d < 0)
926         {
927                 evas_object_del(p->month_right);
928                 p->month_right = p->month;
929                 p->month = p->month_left;
930                 p->month_left = __cal_month_create_month_d(p, -1);
931         }
932         else
933         {
934                 ERR("");
935                 CAL_ASSERT(EINA_FALSE);
936         }
937
938         cal_month_calendar_update_select(p->month);
939
940         if (!p->ad->is_weekly)
941                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,line%d", cal_month_calendar_get_weekline(p->month));
942
943         elm_object_part_content_set(p->ly, "cal/sw", p->month);
944         elm_object_part_content_set(p->ly, "cal/sw/left", p->month_left);
945         elm_object_part_content_set(p->ly, "cal/sw/right", p->month_right);
946
947         evas_object_show(p->ly);
948
949         evas_object_event_callback_add(p->month, EVAS_CALLBACK_MOUSE_MOVE, __cal_month_mouse_move_event_callback, p);
950         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(p->month), "changed", "prog", __cal_month_changed_callback, p);
951
952         __cal_month_update_genlist(p);
953
954         return 0;
955 }
956
957
958 static Eina_Bool __cal_month_animation(void *data)
959 {
960         cal_month_data *p = data;
961         double elapsed_t;
962         Evas_Coord dx;
963
964         elapsed_t = ecore_time_get() - p->ani_start;
965         if (elapsed_t > ANIMATION_TIME)
966                 elapsed_t = ANIMATION_TIME;
967
968         dx = (p->pos_to.x - p->pos_from.x) * cal_util_nsin(elapsed_t / ANIMATION_TIME);
969         __cal_month_move_objects(p, dx);
970
971         if (elapsed_t == ANIMATION_TIME || dx == 0)
972         {
973                 if (p->ani)
974                 {
975                         ecore_animator_del(p->ani);
976                         p->ani = NULL;
977                 }
978
979                 if(p->d)
980                 {
981                         __cal_month_update_month_view(p,p->d);
982                 }
983
984                 return ECORE_CALLBACK_CANCEL;
985         }
986
987         return ECORE_CALLBACK_RENEW;
988 }
989
990 static inline void __cal_month_start_animation(cal_month_data *p)
991 {
992         if (p->pos_from.x == p->pos_to.x)
993                 return;
994
995         if (!p->ani)
996                 p->ani = ecore_animator_add(__cal_month_animation, p);
997         p->ani_start = ecore_time_get();
998 }
999
1000
1001 static void __cal_month_mouse_up_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei)
1002 {
1003         CAL_ASSERT(data);
1004         cal_month_data *p = data;
1005
1006         CAL_ASSERT(p->ad);
1007         struct appdata* ad = p->ad;
1008
1009         Evas_Event_Mouse_Up *ev = ei;
1010
1011         p->down_is_called = 0;
1012
1013         if (p->single_moved)
1014         {
1015                 int dx = p->down1.x - ev->canvas.x;
1016                 int d = 1;
1017
1018                 p->single_moved = 0;
1019
1020                 if (dx < 0) {
1021                         d = -1;
1022                         dx = dx * -1;
1023                 }
1024
1025                 cal_util_get_geometry(&p->pos_from,p->month);
1026
1027
1028                 if (dx > (p->rect.w >> 1))
1029                 {
1030                         if (d < 0)
1031                         {
1032                                 p->d = -1;
1033                                 p->pos_to.x = p->ad->win_w;
1034                                 p->pos_to.y = p->pos_from.y;
1035                                 p->pos_to.w = p->pos_from.w;
1036                                 p->pos_to.h = p->pos_from.h;
1037                         }
1038                         else
1039                         {
1040                                 p->d = 1;
1041                                 p->pos_to.x = -(p->ad->win_w);
1042                                 p->pos_to.y = p->pos_from.y;
1043                                 p->pos_to.w = p->pos_from.w;
1044                                 p->pos_to.h = p->pos_from.h;
1045                         }
1046                         __cal_month_start_animation(p);
1047                 }
1048                 else
1049                 {
1050                         __cal_month_move_month_calendar_to_left(p, MONTH_CAL_X - ad->win_w);
1051                         __cal_month_move_month_calendar_to_right(p, MONTH_CAL_X + ad->win_w);
1052                         evas_object_move(p->month, MONTH_CAL_X, p->pos_from.y);
1053                 }
1054
1055                 return;
1056         }
1057
1058 }
1059
1060 static void __cal_month_mouse_down_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei)
1061 {
1062         cal_month_data *p = data;
1063         Evas_Event_Mouse_Down *ev = ei;
1064
1065         p->down1.x = p->move1.x = ev->canvas.x;
1066         p->down1.y = p->move1.y = ev->canvas.y;
1067
1068         p->down_is_called = 1;
1069         p->multi_touched = 0;
1070
1071         cal_util_get_geometry(&p->oringinal_size,p->month);
1072 }
1073
1074 static void __cal_month_mouse_move_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei)
1075 {
1076         c_retm_if(!data,  "data is null");
1077         c_retm_if(!ei,  "ei is null");
1078
1079         cal_month_data *p = data;
1080         Evas_Event_Mouse_Move *ev = ei;
1081
1082         if (5 < abs(ev->cur.canvas.x - p->move1.x)) {
1083
1084                 struct appdata* ad = p->ad;
1085                 c_ret_if(!ad);
1086
1087         }
1088
1089         if (0 == p->down_is_called)
1090                 return;
1091
1092         p->move1.x = ev->cur.canvas.x;
1093         p->move1.y = ev->cur.canvas.y;
1094
1095         if (!p->multi_touched)
1096                 __cal_month_move_month_calendar(p);
1097 }
1098
1099 static void __cal_month_changed_callback(void *data, Evas_Object *obj, const char *e, const char *src)
1100 {
1101         __cal_month_update_genlist(data);
1102 }
1103
1104 static void __cal_month_list_icon_clicked_callback(void *data, Evas_Object *obj, const char *e, const char *src)
1105 {
1106         c_retm_if(!e, "e is null");
1107         c_retm_if(!data, "data is null");
1108
1109         cal_month_data *p = data;
1110
1111         if (!CAL_STRCMP(e, "open")) {
1112                 p->ad->is_weekly = EINA_TRUE;
1113         }
1114
1115         if (!CAL_STRCMP(e, "close")) {
1116                 p->ad->is_weekly = EINA_FALSE;
1117         }
1118         cal_main_update_view(p->ad);
1119 }
1120
1121 Evas_Object* cal_month_create_view(struct appdata *ad, Evas_Object *main)
1122 {
1123         CAL_FN_START;
1124
1125         c_retvm_if(!ad, NULL, "ad is null");
1126         c_retvm_if(!main, NULL, "main is null");
1127
1128         cal_month_data *p;
1129         Evas_Object *ly;
1130         Evas_Object *month;
1131         Evas_Object *list_bg;
1132         int r;
1133
1134         p = calloc(1, sizeof(cal_month_data));
1135         c_retvm_if(!p, NULL, "calloc(1, sizeof(cal_month_data)) is failed");
1136
1137         r = vconf_get_int(CAL_VCONFKEY_WEEK_NMUBER_ON_OFF, (int *)&ad->is_display_weeknumber);
1138         c_retvm_if(r != 0, NULL, "vconf_get_int(CAL_VCONFKEY_WEEK_NMUBER_ON_OFF, (int *)&ad->is_display_weeknumber) is failed");
1139
1140
1141         if (ad ->is_landscape_mode) {
1142                 p->name = _name = "main/month/weekly/l";
1143         } else {
1144                 if (ad->is_weekly) {
1145                         p->name = _name = "main/month/weekly";
1146                 } else {
1147                         p->name = _name = "main/month";
1148                 }
1149         }
1150
1151         p->ad = ad;
1152
1153         is_hour24 = ad->is_hour24;
1154
1155         p->parent = main;
1156         p->oringinal_size.x = -1;
1157         p->oringinal_size.y = -1;
1158         p->oringinal_size.w = -1;
1159         p->oringinal_size.h = -1;
1160         p->popup = NULL;
1161         p->sweep_it = NULL;
1162         ly = cal_util_add_layout(ad->nv, p->name);
1163         if (!ly) {
1164                 free(p);
1165                 return NULL;
1166         }
1167         evas_object_data_set(ly, "priv", p);
1168         p->ly = ly;
1169         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(ly), "*", "cal", __cal_month_list_icon_clicked_callback, p);
1170
1171         month = cal_month_calendar_create_view(ad, main, EINA_FALSE);
1172         if (!month)
1173         {
1174                 ERR("cal_month_calendar_create_view(&ad->base_tm, ad, ly, EINA_FALSE) is failed");
1175                 evas_object_del(ly);
1176                 free(p);
1177                 return NULL;
1178         }
1179
1180         elm_object_part_content_set(ly, "cal/sw", month);
1181         p->month = month;
1182         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(month), "changed", "prog", __cal_month_changed_callback, p);
1183
1184         list_bg = cal_util_add_bg(ly, EINA_FALSE);
1185         if (!list_bg)
1186         {
1187                 ERR("cal_util_add_bg(ly, EINA_FALSE) is failed");
1188                 evas_object_del(ly);
1189                 free(p);
1190                 return NULL;
1191         }
1192
1193         elm_object_part_content_set(ly, "list/base", list_bg);
1194
1195         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_month_delete_layout, p);
1196         evas_object_event_callback_add(ly, EVAS_CALLBACK_MOUSE_DOWN, __cal_month_mouse_down_event_callback, p);
1197         evas_object_event_callback_add(ly, EVAS_CALLBACK_MOUSE_UP, __cal_month_mouse_up_event_callback, p);
1198         evas_object_event_callback_add(month, EVAS_CALLBACK_MOUSE_MOVE, __cal_month_mouse_move_event_callback, p);
1199         evas_object_event_callback_add(ly, EVAS_CALLBACK_RESIZE, __cal_month_resize_view, p);
1200
1201         CAL_FN_END;
1202
1203         return ly;
1204 }
1205
1206 void cal_month_update_view(Evas_Object *ly)
1207 {
1208         CAL_FN_START;
1209
1210         c_retm_if(!ly, "ly is null");
1211
1212         cal_month_data *p;
1213         struct appdata *ad;
1214
1215         p = CAL_UTIL_GET_PRIV_DATA(ly);
1216         if (!p || CAL_STRCMP(p->name, _name)) {
1217                 ERR("update month view: Invalid object");
1218                 return;
1219         }
1220
1221         ad = p->ad;
1222         c_retm_if(!ad, "ad is null");
1223
1224         cal_month_calendar_update_view(p->month);
1225
1226         if (!p->ad->is_weekly)
1227                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,line%d", cal_month_calendar_get_weekline(p->month));
1228
1229         __cal_month_update_genlist(p);
1230
1231         cal_util_delete_evas_object(&p->month_left);
1232         cal_util_delete_evas_object(&p->month_right);
1233
1234         CAL_FN_END;
1235 }
1236