3 * Copyright 2012 Samsung Electronics Co., Ltd
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
9 * http://www.tizenopensource.org/license
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.
23 #include "edit-repeat.h"
24 #include "external-ug.h"
26 static const char *_name = NULL;
28 #define MONTH_CAL_CBAR_H 41
30 #define MONTH_CAL_Y 200
32 #define ANIMATION_TIME 0.2
34 #define INITIAL_FETCH_SIZE 4
35 #define IDLER_FETCH_SIZE 4
41 }focus_in_month_view_type;
47 Evas_Object *ly; // self
50 Evas_Object *month_left;
51 Evas_Object *month_right;
52 Evas_Coord_Rectangle rect;
53 Evas_Coord_Rectangle oringinal_size;
55 focus_in_month_view_type calendar_focus_view;
58 Eina_List *event_list;
62 Evas_Coord_Point down1, down2;
66 Evas_Coord_Point move1, move2;
74 Evas_Coord_Rectangle pos_from;
75 Evas_Coord_Rectangle pos_to;
83 Elm_Object_Item *sweep_it;
86 extern void cal_month_calendar_update_view(Evas_Object *ly);
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);
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",
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,
108 static int is_hour24;
109 static Calendar_color calendar_color;
111 static inline void __cal_month_delete_popup(cal_month_data *p)
113 c_retm_if(!p || !p->popup, "param is null");
115 evas_object_del(p->popup);
119 static char* __cal_month_share_genlist_item_label(void *data, Evas_Object *obj, const char *part)
121 c_retvm_if(!data || !obj || !part, NULL, "data is null");
123 char *name = (char *)data;
125 if (!CAL_STRCMP(part, "elm.text")) {
132 static inline void __cal_month_stop_animation(cal_month_data *p)
135 ecore_animator_del(p->ani);
140 static void __cal_month_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
144 c_retm_if(!data, "data is null");
145 c_retm_if(!e, "e is null");
147 cal_month_data *p = data;
149 CALENDAR_SVC_FREE_CS_LIST(&p->event_list);
151 __cal_month_stop_animation(p);
154 ecore_idler_del(p->idler);
157 evas_object_del(p->popup);
162 static void __cal_month_resize_view(void *data, Evas *e, Evas_Object *ly, void *ei)
164 cal_month_data *p = data;
166 cal_util_get_geometry(&p->rect, p->month);
169 static void __cal_month_make_time_text(struct tm *tm, struct tm *base_tm, char *buf, int sz)
175 time = CAL_UTIL_TIME_FORMAT_6;
177 time = CAL_UTIL_TIME_FORMAT_1;
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;
188 cal_util_get_time_text(buf, sz, NULL, time, tm);
191 static char* __cal_month_get_time_text(cal_struct *cs, cal_month_data *p)
196 long long int lli_start = CALENDAR_SVC_STRUCT_GET_LLI(cs, CALS_VALUE_LLI_DTSTART_UTIME);
198 cal_util_convert_lli_to_tm(NULL, lli_start, &tm_start);
200 __cal_month_make_time_text(&tm_start, &p->ad->base_tm, stime, sizeof(stime));
202 snprintf(buf, sizeof(buf), "%s", stime);
206 static void __cal_month_set_genlist_item_sweep_off(Elm_Object_Item *it)
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);
213 static void __cal_month_init_sweep_data(cal_struct *cs, cal_month_data *p)
218 cal_main_set_cs(p->ad, cs);
221 static void __cal_month_edit_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
225 c_retm_if(!data, "data is null");
226 c_retm_if(!obj, "obj is null");
228 Evas_Object *popup = data;
229 Evas_Object *button = obj;
231 cal_month_data* p = evas_object_data_get(popup, "data");
232 c_retm_if(!p, "p is null");
234 struct appdata* ad = p->ad;
235 c_retm_if(!ad, "ad is null");
237 if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_BODY_ONLY_THIS_EVENT"))) {
238 ad->edit_special_one = EINA_TRUE;
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;
245 cal_edit_create_view(ad, p->ly);
246 __cal_month_set_genlist_item_sweep_off(p->sweep_it);
249 evas_object_del(popup);
253 static void __cal_month_delete_event(cal_month_data* p, Eina_Bool is_delete_all)
257 struct appdata* ad = p->ad;
260 if (!is_delete_all) {
261 long long int lli_time;
262 cal_util_convert_tm_to_lli(NULL, &ad->tm_start, &lli_time);
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);
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);
275 static void __cal_month_delete_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
279 c_retm_if(!data, "data is null");
280 c_retm_if(!obj, "obj is null");
282 Evas_Object *popup = data;
283 Evas_Object *button = obj;
285 cal_month_data* p = evas_object_data_get(popup, "data");
286 c_retm_if(!p, "p is null");
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);
293 evas_object_del(popup);
297 static void __cal_month_show_popup(cal_month_data *p, const char *tit, Eina_Bool is_edit)
299 c_retm_if(!p, "p is NULL.");
301 void (*callback_func)(void *data, Evas_Object *obj, void *ei) = NULL;
304 callback_func = __cal_month_edit_popup_response_event_callback;
306 callback_func = __cal_month_delete_popup_response_event_callback;
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");
314 evas_object_data_set(p->popup, "priv", p);
317 static void __cal_month_edit_norepeat_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
319 c_retm_if(!data, "data is null");
320 c_retm_if(!obj, "obj is null");
322 Evas_Object *popup = data;
323 Evas_Object *button = obj;
325 cal_month_data* p = evas_object_data_get(popup, "data");
326 c_retm_if(!p, "p is null");
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);
333 evas_object_del(popup);
337 static void __cal_month_edit_button_callback(void *data, Evas_Object *obj, void *ei)
339 cal_struct *cs = data;
340 c_retm_if(!cs, "cs is NULL.");
342 cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
343 c_retm_if(!p, "p is NULL.");
345 __cal_month_init_sweep_data(cs, p);
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);
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);
355 static void __cal_month_delete_norepeat_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
357 c_retm_if(!data, "data is null");
358 c_retm_if(!obj, "obj is null");
360 Evas_Object *popup = data;
361 Evas_Object *button = obj;
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");
367 if (!CAL_STRCMP(elm_object_text_get(button), S_("IDS_COM_SK_OK"))) {
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);
372 cal_struct *cs = evas_object_data_get(p->ly, "cs");
375 CALENDAR_SVC_STRUCT_FREE(&cs);
380 evas_object_del(p->popup);
384 static void __cal_month_delete_button_callback(void *data, Evas_Object *obj, void *ei)
386 cal_struct *cs = data;
387 c_retm_if(!cs, "cs is NULL.");
389 cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
390 c_retm_if(!p, "p is NULL.");
392 __cal_month_init_sweep_data(cs, p);
396 evas_object_data_set(p->ly, "cs", cs);
398 int r = CALENDAR_SVC_STRUCT_GET_INT(cs,CALS_VALUE_INT_RRULE_ID);
401 __cal_month_show_popup(p, C_("IDS_CLD_OPT_DELETE_EVENT"), EINA_FALSE);
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);
409 static void __cal_month_via_message_callback(void *data, Evas_Object *obj, void *ei)
411 c_retm_if(!data, "data is null");
412 c_retm_if(!obj, "obj is null");
414 cal_month_data *p = data;
415 c_retm_if(!p->ad, "p->ad is null");
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);
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);
431 CALENDAR_SVC_STRUCT_FREE(&cs);
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);
436 __cal_month_delete_popup(p);
439 static void __cal_month_via_email_callback(void *data, Evas_Object *obj, void *ei)
441 c_retm_if(!data, "data is null");
442 c_retm_if(!obj, "obj is null");
444 cal_month_data *p = data;
445 c_retm_if(!p->ad, "p->ad is null");
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);
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);
461 CALENDAR_SVC_STRUCT_FREE(&cs);
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);
466 __cal_month_delete_popup(p);
469 static void __cal_month_via_bluetooth_callback(void *data, Evas_Object *obj, void *ei)
471 c_retm_if(!data, "data is null");
472 c_retm_if(!obj, "obj is null");
474 cal_month_data *p = data;
475 c_retm_if(!p->ad, "p->ad is null");
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);
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);
491 CALENDAR_SVC_STRUCT_FREE(&cs);
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);
496 __cal_month_delete_popup(p);
499 static void __cal_month_share_popup_response_callback(void *data, Evas_Object *obj, void *ei)
501 c_retm_if(!data, "data is null");
502 c_retm_if(!obj, "obj is null");
504 Evas_Object *popup = data;
506 cal_month_data* p = evas_object_data_get(popup, "data");
507 c_retm_if(!p, "p is null");
509 evas_object_del(popup);
514 static void __cal_month_send_button_callback(void *data, Evas_Object *obj, void *ei)
516 cal_struct *cs = data;
517 c_retm_if(!cs, "cs is NULL.");
519 cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
520 c_retm_if(!p, "p is NULL.");
522 __cal_month_init_sweep_data(cs, p);
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);
528 c_retm_if(!p->popup, "cal_util_add_popup returned null");
529 evas_object_data_set(p->popup, "data", p);
531 Evas_Object *genlist = elm_genlist_add(p->popup);
532 c_retm_if(!genlist, "elm_genlist_add returned null");
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);
538 elm_object_content_set(p->popup, genlist);
539 evas_object_show(p->popup);
542 static Evas_Object *__cal_month_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
544 c_retv_if(!data, NULL);
546 Evas_Object *icon = NULL;
547 Evas_Object *button = NULL;
549 cal_struct *cs = data;
550 cal_struct *calendar = NULL;
551 cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
553 if (!CAL_STRCMP(part, "elm.swallow.colorbar"))
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);
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);
561 CALENDAR_SVC_GET_CALENDAR_COLOR(calendar, &calendar_color);
563 evas_object_color_set(icon, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
565 CALENDAR_SVC_STRUCT_FREE(&calendar);
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);
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);
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);
596 static char* __cal_month_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
598 c_retv_if(!data, NULL);
600 cal_month_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
601 cal_struct *cs = data;
604 if (!CAL_STRCMP(part, "elm.text.1")) {
606 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_SUMMARY);
610 return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
612 } else if (!CAL_STRCMP(part, "elm.text.2")) {
614 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_LOCATION);
618 return strdup(C_("IDS_CLD_BODY_NO_LOCATION_SELECTED"));
620 } else if (!CAL_STRCMP(part, "elm.text.3")) {
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"));
625 p = CAL_UTIL_GET_PRIV_DATA(obj);
626 return __cal_month_get_time_text(cs, p);
628 } else if (!CAL_STRCMP(part, "elm.slide.text.1")) {
630 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_SUMMARY);
634 return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
640 static void __cal_month_genlist_item_select_callback(void *data, Evas_Object *obj, void *ei)
644 cal_struct *cs = data;
646 Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
648 elm_genlist_item_selected_set(it, EINA_FALSE);
650 cal_month_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
653 cal_main_set_cs(p->ad, cs);
655 cal_detail_create_view(p->ad, p->parent);
658 static void __cal_month_get_events(cal_month_data *p)
660 struct tm tm_start = p->ad->base_tm;
661 tm_start.tm_hour = 0;
665 struct tm tm_end = tm_start;
670 p->event_list = CALENDAR_SVC_GET_EVENT_LIST(&tm_start, &tm_end);
673 static void __cal_month_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
675 c_retm_if(!event_info, "event_info is null");
676 c_retm_if(!obj, "obj is null");
678 Elm_Object_Item *it = event_info;
680 elm_genlist_item_decorate_mode_set(it, "slide", EINA_TRUE);
682 cal_month_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
683 c_retm_if(!p, "p is null");
685 if (p->sweep_it && it != p->sweep_it)
686 elm_genlist_item_decorate_mode_set(p->sweep_it, "slide", EINA_FALSE);
691 static void __cal_month_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
693 c_retm_if(!event_info, "event_info is null");
694 Elm_Object_Item *it = event_info;
696 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
699 static void __cal_month_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info)
701 c_retm_if(!obj, "obj is null");
703 Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
706 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
709 static void __cal_month_update_genlist(cal_month_data *p)
713 c_retm_if(!p, "p is null");
715 Evas_Object* genlist = p->genlist;
717 CALENDAR_SVC_FREE_CS_LIST(&p->event_list);
719 __cal_month_get_events(p);
721 if (!p->event_list) {
723 elm_genlist_clear(genlist);
731 genlist = elm_genlist_add(p->ly);
732 c_retm_if(!genlist, "gl is null");
734 p->genlist = genlist;
736 elm_object_part_content_set(p->ly, "list/sw", genlist);
737 evas_object_data_set(genlist, "priv", p);
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);
745 elm_genlist_clear(genlist);
750 cal_struct *cs = NULL;
752 EINA_LIST_FOREACH(p->event_list, l, cs) {
754 elm_genlist_item_append(genlist, &itc, cs, NULL, ELM_GENLIST_ITEM_NONE, __cal_month_genlist_item_select_callback, cs);
760 static Evas_Object* __cal_month_create_month_d(cal_month_data *p, int d)
764 struct appdata *ad = p->ad;
765 c_retv_if(!ad, NULL);
767 int r = cal_util_update_tm_month(&ad->base_tm, d);
768 c_retv_if(r < 0, NULL);
770 Evas_Object *calendar = cal_month_calendar_create_view(ad, p->parent, EINA_TRUE);
772 r = cal_util_update_tm_month(&ad->base_tm, -d);
773 c_retv_if(r < 0, NULL);
778 static void __cal_month_move_month_calendar_to_left(cal_month_data *p, Evas_Coord x)
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);
785 if(0 > p->oringinal_size.x)
787 evas_object_move(p->month_left, x, p->rect.y);
791 evas_object_move(p->month_left, x, p->oringinal_size.y);
795 static void __cal_month_move_month_calendar_to_right(cal_month_data *p, Evas_Coord x)
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);
802 if(0 > p->oringinal_size.x)
804 evas_object_move(p->month_right, x, p->rect.y);
808 evas_object_move(p->month_right, x, p->oringinal_size.y);
813 static void __cal_month_move_month_calendar(cal_month_data *p)
817 Evas_Coord dx = p->move1.x - p->down1.x;
818 if (!p->single_moved && dx < 15 && dx > -15)
821 if (!p->single_moved)
822 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), "moved", "prog");
826 struct appdata *ad = p->ad;
827 c_retm_if(!ad, "ad is null");
835 r = cal_util_update_tm_month(&t, -1);
842 r = cal_util_update_tm_month(&t, 1);
847 if (p->oringinal_size.x < 0) {
850 evas_object_move(p->month, x, p->rect.y);
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);
857 x = p->oringinal_size.x + dx;
859 evas_object_move(p->month, x, p->oringinal_size.y);
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);
866 static inline void __cal_month_move_objects(cal_month_data *p, Evas_Coord dx)
873 struct appdata *ad = p->ad;
874 c_retm_if(!ad, "ad is null");
882 r = cal_util_update_tm_month(&t, -1);
888 r = cal_util_update_tm_month(&t, 1);
892 Evas_Coord x = p->pos_from.x + dx;
894 evas_object_move(p->month, x, p->rect.y);
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);
901 static inline int __cal_month_update_month_view(cal_month_data *p, int d)
907 r = cal_util_update_tm_month(&p->ad->base_tm, d);
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);
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");
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);
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);
935 CAL_ASSERT(EINA_FALSE);
938 cal_month_calendar_update_select(p->month);
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));
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);
947 evas_object_show(p->ly);
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);
952 __cal_month_update_genlist(p);
958 static Eina_Bool __cal_month_animation(void *data)
960 cal_month_data *p = data;
964 elapsed_t = ecore_time_get() - p->ani_start;
965 if (elapsed_t > ANIMATION_TIME)
966 elapsed_t = ANIMATION_TIME;
968 dx = (p->pos_to.x - p->pos_from.x) * cal_util_nsin(elapsed_t / ANIMATION_TIME);
969 __cal_month_move_objects(p, dx);
971 if (elapsed_t == ANIMATION_TIME || dx == 0)
975 ecore_animator_del(p->ani);
981 __cal_month_update_month_view(p,p->d);
984 return ECORE_CALLBACK_CANCEL;
987 return ECORE_CALLBACK_RENEW;
990 static inline void __cal_month_start_animation(cal_month_data *p)
992 if (p->pos_from.x == p->pos_to.x)
996 p->ani = ecore_animator_add(__cal_month_animation, p);
997 p->ani_start = ecore_time_get();
1001 static void __cal_month_mouse_up_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei)
1004 cal_month_data *p = data;
1007 struct appdata* ad = p->ad;
1009 Evas_Event_Mouse_Up *ev = ei;
1011 p->down_is_called = 0;
1013 if (p->single_moved)
1015 int dx = p->down1.x - ev->canvas.x;
1018 p->single_moved = 0;
1025 cal_util_get_geometry(&p->pos_from,p->month);
1028 if (dx > (p->rect.w >> 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;
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;
1046 __cal_month_start_animation(p);
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);
1060 static void __cal_month_mouse_down_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei)
1062 cal_month_data *p = data;
1063 Evas_Event_Mouse_Down *ev = ei;
1065 p->down1.x = p->move1.x = ev->canvas.x;
1066 p->down1.y = p->move1.y = ev->canvas.y;
1068 p->down_is_called = 1;
1069 p->multi_touched = 0;
1071 cal_util_get_geometry(&p->oringinal_size,p->month);
1074 static void __cal_month_mouse_move_event_callback(void *data, Evas *e, Evas_Object *ly, void *ei)
1076 c_retm_if(!data, "data is null");
1077 c_retm_if(!ei, "ei is null");
1079 cal_month_data *p = data;
1080 Evas_Event_Mouse_Move *ev = ei;
1082 if (5 < abs(ev->cur.canvas.x - p->move1.x)) {
1084 struct appdata* ad = p->ad;
1089 if (0 == p->down_is_called)
1092 p->move1.x = ev->cur.canvas.x;
1093 p->move1.y = ev->cur.canvas.y;
1095 if (!p->multi_touched)
1096 __cal_month_move_month_calendar(p);
1099 static void __cal_month_changed_callback(void *data, Evas_Object *obj, const char *e, const char *src)
1101 __cal_month_update_genlist(data);
1104 static void __cal_month_list_icon_clicked_callback(void *data, Evas_Object *obj, const char *e, const char *src)
1106 c_retm_if(!e, "e is null");
1107 c_retm_if(!data, "data is null");
1109 cal_month_data *p = data;
1111 if (!CAL_STRCMP(e, "open")) {
1112 p->ad->is_weekly = EINA_TRUE;
1115 if (!CAL_STRCMP(e, "close")) {
1116 p->ad->is_weekly = EINA_FALSE;
1118 cal_main_update_view(p->ad);
1121 Evas_Object* cal_month_create_view(struct appdata *ad, Evas_Object *main)
1125 c_retvm_if(!ad, NULL, "ad is null");
1126 c_retvm_if(!main, NULL, "main is null");
1131 Evas_Object *list_bg;
1134 p = calloc(1, sizeof(cal_month_data));
1135 c_retvm_if(!p, NULL, "calloc(1, sizeof(cal_month_data)) is failed");
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");
1141 if (ad ->is_landscape_mode) {
1142 p->name = _name = "main/month/weekly/l";
1144 if (ad->is_weekly) {
1145 p->name = _name = "main/month/weekly";
1147 p->name = _name = "main/month";
1153 is_hour24 = ad->is_hour24;
1156 p->oringinal_size.x = -1;
1157 p->oringinal_size.y = -1;
1158 p->oringinal_size.w = -1;
1159 p->oringinal_size.h = -1;
1162 ly = cal_util_add_layout(ad->nv, p->name);
1167 evas_object_data_set(ly, "priv", p);
1169 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(ly), "*", "cal", __cal_month_list_icon_clicked_callback, p);
1171 month = cal_month_calendar_create_view(ad, main, EINA_FALSE);
1174 ERR("cal_month_calendar_create_view(&ad->base_tm, ad, ly, EINA_FALSE) is failed");
1175 evas_object_del(ly);
1180 elm_object_part_content_set(ly, "cal/sw", month);
1182 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(month), "changed", "prog", __cal_month_changed_callback, p);
1184 list_bg = cal_util_add_bg(ly, EINA_FALSE);
1187 ERR("cal_util_add_bg(ly, EINA_FALSE) is failed");
1188 evas_object_del(ly);
1193 elm_object_part_content_set(ly, "list/base", list_bg);
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);
1206 void cal_month_update_view(Evas_Object *ly)
1210 c_retm_if(!ly, "ly is null");
1215 p = CAL_UTIL_GET_PRIV_DATA(ly);
1216 if (!p || CAL_STRCMP(p->name, _name)) {
1217 ERR("update month view: Invalid object");
1222 c_retm_if(!ad, "ad is null");
1224 cal_month_calendar_update_view(p->month);
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));
1229 __cal_month_update_genlist(p);
1231 cal_util_delete_evas_object(&p->month_left);
1232 cal_util_delete_evas_object(&p->month_right);