3 Copyright (c) 2000-2012 Samsung Electronics Co., Ltd All Rights Reserved
5 This file is part of org.tizen.efl-calendar
6 Written by Taeho Kang <taeho84.kang@samsung.com>
8 PROPRIETARY/CONFIDENTIAL
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.
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.
62 int base_pos_for_weekly;
75 } cal_view_main_month_cal_data;
77 static const char *_name = NULL;
78 static Calendar_color calendar_color;
80 static Evas_Object *__cal_month_calendar_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part);
81 static char* __cal_month_calendar_get_genlist_item_label(void *data, Evas_Object *obj, const char *part);
82 static void __cal_month_calendar_signal_week(cal_view_main_month_cal_data *p,Evas_Object *eo);
83 static int __cal_month_calendar_get_weekly_events(cal_view_main_month_cal_data *p);
85 static Elm_Genlist_Item_Class itc = {
86 .item_style = "3text.5icon",
87 .func.content_get = __cal_month_calendar_get_genlist_item_icon,
88 .func.text_get = __cal_month_calendar_get_genlist_item_label,
91 static Evas_Object *__cal_month_calendar_get_genlist_item_icon(void *data, Evas_Object *obj, const char *part)
93 c_retvm_if(!data, NULL, "data is null");
94 c_retvm_if(!obj, NULL, "obj is null");
96 struct tmnode *tm = data;
97 c_retvm_if(!tm->cs, NULL, "tm->cs is null");
99 cal_view_main_month_cal_data* p = CAL_UTIL_GET_PRIV_DATA(obj);
100 c_retvm_if(!p, NULL, "p is null");
103 Evas_Object *icon = NULL;
104 cal_struct *calendar = NULL;
106 if (!CAL_STRCMP(part, "elm.swallow.colorbar"))
108 r = CALENDAR_SVC_GET(CAL_STRUCT_CALENDAR, CALENDAR_SVC_STRUCT_GET_INT(tm->cs,CAL_VALUE_INT_CALENDAR_ID), NULL, &calendar);
109 if (r != CAL_SUCCESS)
111 ERR("CALENDAR_SVC_GET fail. %d", r);
115 icon = evas_object_rectangle_add(evas_object_evas_get(obj));
116 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
118 CALENDAR_SVC_GET_CALENDAR_COLOR(calendar, &calendar_color);
120 evas_object_color_set(icon, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
122 CALENDAR_SVC_STRUCT_FREE(&calendar);
130 static void __cal_month_calendar_make_time_text(time_t t, struct tm *tm, char *buf, int sz)
136 localtime_r(&t, &ttm);
138 time = CAL_UTIL_TIME_FORMAT_6;
140 if (ttm.tm_year != tm->tm_year)
141 date = CAL_UTIL_DATE_FORMAT_11;
142 else if (ttm.tm_mon != tm->tm_mon)
143 date = CAL_UTIL_DATE_FORMAT_10;
144 else if (ttm.tm_mday != tm->tm_mday)
145 date = CAL_UTIL_DATE_FORMAT_9;
149 cal_util_get_time_text(buf, sz, NULL, time, &ttm);
153 static char* __cal_month_calendar_get_time_text(struct tmnode *tm, cal_view_main_month_cal_data *p)
158 __cal_month_calendar_make_time_text(tm->st, &p->ad->base_tm, stime, sizeof(stime));
160 snprintf(buf, sizeof(buf), "%s", stime);
165 static char* __cal_month_calendar_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
167 c_retvm_if(!data, NULL, "data is null");
171 struct tmnode *tm = data;
172 c_retvm_if(!tm->cs, NULL, "tm->cs is null");
174 if (!CAL_STRCMP(part, "elm.text.1"))
176 str = CALENDAR_SVC_STRUCT_GET_STR(tm->cs, CAL_VALUE_TXT_SUMMARY);
180 return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
182 else if (!CAL_STRCMP(part, "elm.text.2"))
184 str = CALENDAR_SVC_STRUCT_GET_STR(tm->cs, CAL_VALUE_TXT_LOCATION);
188 return strdup(C_("IDS_CLD_BODY_NO_LOCATION_SELECTED"));
190 else if (!CAL_STRCMP(part, "elm.text.3"))
192 int allday = CALENDAR_SVC_STRUCT_GET_INT(tm->cs, CAL_VALUE_INT_ALL_DAY_EVENT);
194 return strdup(C_("IDS_COM_BODY_ALL_DAY"));
196 cal_view_main_month_cal_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
197 c_retvm_if(!p, NULL, "p is null");
199 return __cal_month_calendar_get_time_text(tm, p);
205 static int __cal_month_calendar_get_first_wday(int mday, int wday)
207 return CAL_UTIL_GET_WDAY(wday - mday + 1);
210 static void __cal_month_calendar_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
214 c_retm_if(!data, "data is null");
215 cal_view_main_month_cal_data *p = data;
217 struct appdata *ad = p->ad;
218 c_retm_if(!ad, "ad is null");
220 if (ad->today_edj && ad->today_edj == CAL_UTIL_GET_EDJ_DATA(obj))
221 ad->today_edj = NULL;
224 evas_object_del(p->popup);
232 static inline void __cal_month_calendar_set_color(Evas_Object *ly, int pos, int wday)
237 case 0: p = "sunday"; break;
238 case 6: p = "satday"; break;
239 default: p = "weekday";
242 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "%s,%d", p, pos);
245 static inline void __cal_month_calendar_set_disabled(Evas_Object *ly, cal_view_main_month_cal_data *p, int pos)
247 struct _day *d = &p->day[pos];
249 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "disable,%d", pos);
254 static inline void __cal_month_calendar_set_enabled(Evas_Object *ly, cal_view_main_month_cal_data *p, int pos, int wday)
256 struct _day *d = &p->day[pos];
259 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "enable,%d", pos);
261 __cal_month_calendar_set_color(ly, pos, wday);
266 static inline void __cal_month_calendar_set_today(Evas_Object *eo, int pos)
271 cal_util_emit_signal(eo, "today,%d", pos);
274 static inline void __cal_month_calendar_unset_today(Evas_Object *eo, int *pos)
279 cal_util_emit_signal(eo, "notoday,%d", *pos);
283 static inline void __cal_month_calendar_set_focuse_week(cal_view_main_month_cal_data *p,Evas_Object *eo, int pos)
290 cal_util_emit_signal(eo, "today,%d", p->pos_today);
292 if(pos >= 0 && pos <= 6)//line 1
298 cal_util_emit_signal(eo, "week,%d", i);
299 cal_util_emit_signal(eo, "uncheck,%d", i);
300 cal_util_emit_signal(eo, "unselect,%d", i);
301 p->base_pos_for_weekly = 0;
305 cal_util_emit_signal(eo, "noweek,%d", i);
306 if( -1 == p->day[i].checked)
308 cal_util_emit_signal(eo, "check,%d", i);
313 else if(pos >= 7 && pos <= 13)//line 2
317 if(i >= 7 && i <= 13)
319 cal_util_emit_signal(eo, "week,%d", i);
320 cal_util_emit_signal(eo, "uncheck,%d", i);
321 cal_util_emit_signal(eo, "unselect,%d", i);
322 p->base_pos_for_weekly = 7;
326 cal_util_emit_signal(eo, "noweek,%d", i);
327 if( -1 == p->day[i].checked)
329 cal_util_emit_signal(eo, "check,%d", i);
334 else if(pos >= 14 && pos <= 20)//line 3
338 if(i >= 14 && i <= 20)
340 cal_util_emit_signal(eo, "week,%d", i);
341 cal_util_emit_signal(eo, "uncheck,%d", i);
342 cal_util_emit_signal(eo, "unselect,%d", i);
343 p->base_pos_for_weekly = 7*2;
347 cal_util_emit_signal(eo, "noweek,%d", i);
348 if( -1 == p->day[i].checked)
350 cal_util_emit_signal(eo, "check,%d", i);
355 else if(pos >= 21 && pos <= 27)//line 4
359 if(i >= 21 && i <= 27)
361 cal_util_emit_signal(eo, "week,%d", i);
362 cal_util_emit_signal(eo, "uncheck,%d", i);
363 cal_util_emit_signal(eo, "unselect,%d", i);
364 p->base_pos_for_weekly = 7*3;
369 cal_util_emit_signal(eo, "noweek,%d", i);
371 if( -1 == p->day[i].checked)
373 cal_util_emit_signal(eo, "check,%d", i);
378 else if(pos >= 28 && pos <= 34)//line 5
382 if(i >= 28 && i <= 34)
384 cal_util_emit_signal(eo, "week,%d", i);
385 cal_util_emit_signal(eo, "uncheck,%d", i);
386 cal_util_emit_signal(eo, "unselect,%d", i);
387 p->base_pos_for_weekly = 7*4;
391 cal_util_emit_signal(eo, "noweek,%d", i);
392 if( -1 == p->day[i].checked)
394 cal_util_emit_signal(eo, "check,%d", i);
399 else if(pos >= 35 && pos <= 41)//line 6
403 if(i >= 35 && i <= 41)
405 cal_util_emit_signal(eo, "week,%d", i);
406 cal_util_emit_signal(eo, "uncheck,%d", i);
407 cal_util_emit_signal(eo, "unselect,%d", i);
408 p->base_pos_for_weekly = 7*5;
412 cal_util_emit_signal(eo, "noweek,%d", i);
413 if( -1 == p->day[i].checked)
415 cal_util_emit_signal(eo, "check,%d", i);
423 static inline void __cal_month_calendar_set_selected(Evas_Object *eo, int pos)
425 if (pos < 0 || pos >= 42)
428 cal_util_emit_signal(eo, "select,%d", pos);
431 static inline void __cal_month_calendar_set_unselected(Evas_Object *eo, int *pos)
436 cal_util_emit_signal(eo, "unselect,%d", *pos);
440 static inline int __cal_month_calendar_get_start_day(int *st, struct tm *t, int start, int max)
445 prev_day = CAL_UTIL_GET_WDAY(__cal_month_calendar_get_first_wday(t->tm_mday, t->tm_wday) - start);
447 day = max - prev_day + 1;
457 static int __cal_month_calendar_update_today(Evas_Object *eo, cal_view_main_month_cal_data *p)
460 struct appdata *ad = p->ad;
461 struct tm *t = &p->cur_tm;
465 __cal_month_calendar_unset_today(eo, &p->pos_today);
466 ad->today_edj = NULL;
468 if (t->tm_year == ad->today_tm.tm_year && t->tm_mon == ad->today_tm.tm_mon)
470 p->pos_today = p->pos_start + ad->today_tm.tm_mday - 1;
471 __cal_month_calendar_set_today(eo, p->pos_today);
478 void cal_month_calendar_update_select(Evas_Object *ly)
481 Evas_Object* eo = CAL_UTIL_GET_EDJ_DATA(ly);
483 cal_view_main_month_cal_data* p = CAL_UTIL_GET_PRIV_DATA(ly);
487 cal_main_update_title_text(p->ad->title, CV_MONTH, &p->ad->base_tm, p->ad->wday_start);
489 __cal_month_calendar_set_unselected(eo, &p->pos_selected);
490 p->pos_selected = p->pos_start + p->ad->base_tm.tm_mday - 1;
491 __cal_month_calendar_set_selected(eo, p->pos_selected);
495 __cal_month_calendar_get_weekly_events(p);
496 __cal_month_calendar_set_focuse_week(p, eo, p->pos_selected);
497 __cal_month_calendar_signal_week(p,CAL_UTIL_GET_EDJ_DATA(p->ly));
501 static void __cal_month_calendar_get_simple_check(cal_view_main_month_cal_data *p, time_t st, time_t et, char *map, int map_sz)
505 month = CALENDAR_SVC_GET_SIMPLE_CS(p->ad->acct_id, st, et);
509 for (i = 0; i < cal_util_get_max_days(p->cur_tm.tm_year, p->cur_tm.tm_mon); i++)
518 static void __cal_month_calendar_update_check(Evas_Object *ly, cal_view_main_month_cal_data *p)
522 char m[42] = { 0 }; // change to bitmap??
527 r = cal_util_get_month_time_t(&p->cur_tm, &st, &et);
530 ERR("Invalid time conversion");
536 max = cal_util_get_max_days(p->cur_tm.tm_year, p->cur_tm.tm_mon);
538 __cal_month_calendar_get_simple_check(p, st, et, &m[p->pos_start], max);
540 for (i = 0; i < 42; i++)
544 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "check,%d", i);
545 p->day[i].checked = 1;
547 memset(part,0x00, sizeof part);
548 memset(text,0x00, sizeof text);
550 snprintf(part,sizeof part,"db/%d/text_on_check",i);
551 snprintf(text,sizeof text,"%d",m[i]>99?99:m[i]);
552 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly),part,text);
556 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "uncheck,%d", i);
557 p->day[i].checked = 0;
562 static int __cal_month_calendar_fill_calendar(Evas_Object *ly, struct tm *t, int start)
564 cal_view_main_month_cal_data *p;
565 int line = 6; // default
566 int prev_max, cur_max;
567 int day, i, st, wday;
569 p = CAL_UTIL_GET_PRIV_DATA(ly);
574 prev_max = cal_util_get_max_days(t->tm_year, t->tm_mon - 1);
575 cur_max = cal_util_get_max_days(t->tm_year, t->tm_mon);
577 day = __cal_month_calendar_get_start_day(&st, t, start, prev_max);
582 for (i = 0; i < 42; i++)
584 cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("db/%d/text", i), "%d", day);
589 __cal_month_calendar_set_disabled(ly, p, i);
594 p->pos_start = i + 1;
599 __cal_month_calendar_set_enabled(ly, p, i, wday);
604 line = (int)(i / 7) + 1;
610 __cal_month_calendar_set_disabled(ly, p, i);
615 wday = CAL_UTIL_GET_WDAY(wday + 1);
618 __cal_month_calendar_update_today(CAL_UTIL_GET_EDJ_DATA(ly), p);
623 static void __cal_month_calendar_click_event_callback(cal_view_main_month_cal_data *p, Evas_Object *obj, int pos)
627 struct appdata *ad = p->ad;
630 if (p->pos_selected == pos) {
631 DBG("cal_cb: double clicked %d", pos);
633 if (p->ad->is_weekly)
636 if (p->day[pos].checked) {
637 cal_main_change_view(p->parent, CV_DAY);
640 p->ad->base_hour = -1;
641 p->ad->cid = 0; // new
643 cal_edit_create_view(p->ad, p->parent);
649 p->cur_tm.tm_mday = pos - p->pos_start + 1;
650 ad->base_tm = p->cur_tm;
652 cal_month_calendar_update_select(p->month);
653 edje_object_signal_emit(obj, "changed", "prog");
656 static void __cal_month_calendar_cal_event_callback(void *data, Evas_Object *obj, const char *e, const char *src)
658 cal_view_main_month_cal_data *p = data;
659 c_retm_if(!p, "p is null");
661 struct appdata *ad = p->ad;
662 c_retm_if(!ad, "ad is null");
664 int pos = atoi(&e[3]);
666 if (!strncmp(e, "up,", 3))
668 if (p->pos_down == pos)
669 __cal_month_calendar_click_event_callback(p, obj, pos);
671 edje_object_signal_emit(obj, e, "prog");
676 if (!strncmp(e, "dn,", 3))
680 edje_object_signal_emit(obj, e, "prog");
686 static void __cal_month_calendar_prog_event_callback(void *data, Evas_Object *obj, const char *e, const char *src)
688 cal_view_main_month_cal_data *p = data;
690 if (!CAL_STRCMP(e, "update_today")) {
691 __cal_month_calendar_update_today(obj, p);
695 if (CAL_STRCMP(e, "moved")) {
699 if (p->pos_down == -1) {
703 cal_util_emit_signal(obj, "up,%d", p->pos_down);
707 static void __cal_month_calendar_set_wday_text(Evas_Object *ly, int start)
710 struct tm t = { 0, };
711 cal_view_main_month_cal_data* p = CAL_UTIL_GET_PRIV_DATA(ly);
720 cal_util_update_tm_day(&t, t.tm_wday*(-1)+start);
724 for (i = 0; i < 7; i++) {
725 cal_util_set_time_text(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("wday/%d/text", i), CAL_UTIL_DATE_FORMAT_2, NULL, &t);
727 if (t.tm_wday == 6) {
728 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "satday,%d", i);
729 cal_util_update_tm_day(&t, t.tm_wday*(-1));
734 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "sunday,%d", i);
736 cal_util_update_tm_day(&t, 1);
741 for (i = 0; i < 7; i++) {
742 cal_util_set_time_text(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("wday/%d/text", i), CAL_UTIL_DATE_FORMAT_2, NULL, &t);
746 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "satday,%d", i);
747 cal_util_update_tm_day(&t, t.tm_wday*(-1));
748 cal_util_set_time_text(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("wday/%d/text", ++i), CAL_UTIL_DATE_FORMAT_2, NULL, &t);
749 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "sunday,%d", i);
752 cal_util_update_tm_day(&t, 1);
757 static gint __cal_month_calendar_events_compare(gconstpointer a,gconstpointer b)
759 weekly_event *p1 = (weekly_event *)a;
760 weekly_event *p2 = (weekly_event *)b;
762 if (p2->start_time < p1->start_time)
764 else if(p1->start_time < p2->start_time)
770 static void __cal_month_calendar_signal_clean(cal_view_main_month_cal_data *p,Evas_Object *eo)
777 for(line=1; line<7; line++)
779 cal_util_emit_signal(eo,"%d,%d,%d",line,0,i);
780 cal_util_emit_signal(eo,"%d,%s,%d",line,"nocolor",i);
786 static int __cal_month_calendar_clean_list(cal_view_main_month_cal_data *p)
797 g_list_free(p->list[i]);
803 static int __cal_month_calendar_get_week_time(cal_view_main_month_cal_data *p, int *first_day, int *last_day)
809 if(-1 == p->pos_selected)
815 day = p->pos_selected;
818 today = day - p->pos_start + 1;
819 start_day = day - (day+1)%7 +1;
824 *last_day = 6 - p->pos_start + 1;
826 else if(0 == (day+1)%7)
828 *first_day = today - 6;
833 *first_day = today - day%7;
834 if(start_day+6 > p->pos_end)
836 *last_day = p->pos_end - p->pos_start + 1;
840 *last_day = *first_day + 6;
847 static bool __cal_month_calendar_is_last(GList** list)
854 for (i=0; i<7; i++) {
862 static void __cal_month_calendar_line_arrange(GList** list,int index,const int line)
864 weekly_event *temp = NULL;
865 GList *list_temp = list[index];
867 if (list_temp && list_temp->data) {
868 temp = list_temp->data;
872 if (0 == temp->width)
875 if (7 <= index + temp->width)
878 __cal_month_calendar_line_arrange(list, index + temp->width, line);
884 __cal_month_calendar_line_arrange(list, index + 1, line);
888 static void __cal_month_calendar_get_next(GList** list)
890 c_retm_if(!list, "list is null");
893 weekly_event *temp = NULL;
897 if (list[i] && list[i]->data) {
899 temp = (weekly_event*)list[i]->data;
902 list[i] = list[i]->next;
907 static int __cal_month_calendar_get_weekly_events(cal_view_main_month_cal_data *p)
909 c_retvm_if(!p, -1, "p is null");
917 cal_iter *iter = NULL;
918 cal_struct *record = NULL;
919 weekly_event *event = NULL;
920 struct tm end_time = {0};
921 struct tm start_time = {0};
928 __cal_month_calendar_signal_clean(p,CAL_UTIL_GET_EDJ_DATA(p->ly));
930 //free the list if not NULL
931 __cal_month_calendar_clean_list(p);
933 //calculate the time of this week
934 __cal_month_calendar_get_week_time(p,&start_day,&end_day);
936 day_num = end_day - start_day + 1;
939 start_i = 7 - day_num;
945 memcpy(&start_time, &p->cur_tm, sizeof(struct tm));
946 memcpy(&end_time, &p->cur_tm, sizeof(struct tm));
948 start_time.tm_mday = start_day;
949 start_time.tm_hour = 0;
950 start_time.tm_min = 0;
951 start_time.tm_sec = 0;
953 end_time.tm_mday = end_day;
954 end_time.tm_hour = 23;
955 end_time.tm_min = 59;
956 end_time.tm_sec = 59;
958 ls = mktime(&start_time);
962 le = mktime(&end_time);
964 if (CAL_SUCCESS != CALENDAR_SVC_GET_EVENT_LIST_BY_PERIOD(0,ls,le,&iter))
967 record = CALENDAR_SVC_STRUCT_NEW("schedule");
969 while (CAL_SUCCESS == CALENDAR_SVC_ITER_NEXT(iter)) {
971 CALENDAR_SVC_ITER_GET_INFO(iter,&record);
973 memset(&st,0x00,sizeof(struct tm));
974 memset(&et,0x00,sizeof(struct tm));
976 while (CAL_SUCCESS == CALENDAR_SVC_UTIL_NEXT_VAILD_EVENT_TM(record,&start_time,&end_time,&st,&et)) {
978 if (end_day < st.tm_mday)
981 if (et.tm_mday < start_day)
984 if (st.tm_mday < start_day)
985 st.tm_mday = start_day;
987 if (et.tm_mday > end_day)
988 et.tm_mday = end_day;
991 event = (weekly_event*)calloc(1, sizeof(weekly_event));
992 c_retvm_if(!event, -1, "event is null");
994 event->cid = CALENDAR_SVC_STRUCT_GET_INT(record,"index");
996 g_snprintf(event->title, sizeof(event->title), CALENDAR_SVC_STRUCT_GET_STR(record,"summary"));
998 event->is_repeat = 1;
999 event->start_time = mktime(&st);
1000 event->end_time = mktime(&et);
1001 event->width = et.tm_mday - st.tm_mday + 1;
1002 if (event->width < 1)
1005 index = st.tm_mday - start_day + start_i;
1012 p->list[index] = g_list_append(p->list[index],event);
1017 CALENDAR_SVC_STRUCT_FREE(&record);
1020 CALENDAR_SVC_ITER_REMOVE(&iter);
1022 for (i=start_i; i < day_num; i++) {
1024 p->list[i] = g_list_sort(p->list[i], __cal_month_calendar_events_compare);
1029 for (i=0; i < 7; i++)
1030 list_t[i] = p->list[i];
1032 //calculate the line of each event
1033 while (__cal_month_calendar_is_last(p->list)) {
1035 __cal_month_calendar_line_arrange(p->list, 0, line);
1042 __cal_month_calendar_get_next(p->list);
1045 for (i=0; i < 7; i++)
1046 p->list[i] = list_t[i];
1050 CALENDAR_SVC_STRUCT_FREE(&record);
1055 static void __cal_month_calendar_signal_week(cal_view_main_month_cal_data *p,Evas_Object *eo)
1057 c_retm_if(!p, "p is null");
1058 c_retm_if(!eo, "eo is null");
1061 weekly_event *temp = NULL;
1062 char text[20] = {0};
1063 char *color[4] = {"green","blue","red","purple"};
1064 int color_index = -1;
1067 for (i=0; i<7; i++) {
1072 list = g_list_first( p->list[i]);
1073 while (list && list->data) {
1077 cal_util_emit_signal(eo,"%d,%d,%d",temp->line,temp->width,i);
1078 if (0 == temp->is_repeat)
1079 cal_util_emit_signal(eo,"%d,%s,%d",temp->line,color[color_index%4],i);
1081 cal_util_emit_signal(eo,"%d,%s,%d",temp->line,color[(temp->cid)%4],i);
1082 color_index = (temp->cid)%4;
1085 memset(text,0x00,sizeof(text));
1086 g_snprintf(text,sizeof(text),"%d/text/%d",temp->line,i);
1087 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(p->ly), text, temp->title);
1094 static void __cal_month_calendar_mouse_down(void *data, Evas *e, Evas_Object *ly, void *ei)
1096 cal_view_main_month_cal_data *p = data;
1097 Evas_Event_Mouse_Down *ev = ei;
1101 Evas_Coord_Rectangle r;
1102 cal_util_get_geometry (&r, ly);
1103 offset = ev->canvas.x/(r.w/7);
1107 p->down_x = ev->canvas.x;
1108 p->down_y = ev->canvas.y;
1110 if ( -1 == p->day[p->base_pos_for_weekly + offset].enabled) {
1111 p->index_for_press = p->base_pos_for_weekly + offset;
1112 snprintf(eve, sizeof(eve) , "dn,%d", p->index_for_press);
1113 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), eve, "prog");
1117 static void __cal_month_calendar_mouse_move(void *data, Evas *e, Evas_Object *ly, void *ei)
1119 cal_view_main_month_cal_data *p = data;
1122 if( -1 != p->index_for_press)
1124 snprintf(eve, sizeof(eve) , "up,%d", p->index_for_press);
1125 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), eve, "prog");
1126 p->index_for_press = -1;
1130 static bool __cal_month_calendar_event_exists(GList** list,int index)
1133 GList *list_temp = NULL;
1134 weekly_event *event = NULL;
1136 for(i=0; i<=index; i++)
1143 list_temp = g_list_first(list[i]);
1144 while(NULL != list_temp)
1146 event = list_temp->data;
1149 list_temp = g_list_next(list_temp);
1152 if(event->width >= index - i + 1)
1156 list_temp = g_list_next(list_temp);
1163 static void __cal_month_calendar_genlist_item_select_callback(void *data, Evas_Object *obj, void *ei)
1165 struct tmnode* tm = data;
1166 cal_struct *cs = tm->cs;
1168 Elm_Object_Item *it;
1169 cal_view_main_month_cal_data *p;
1172 it = elm_genlist_selected_item_get(obj);
1174 elm_genlist_item_selected_set(it, EINA_FALSE);
1176 idx = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_INDEX);
1178 p = CAL_UTIL_GET_PRIV_DATA(obj);
1181 repeat = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_TERM);
1183 memcpy(p->ad->tm, tm, sizeof(struct tmnode));
1188 cal_detail_create_view(p->ad, p->parent);
1191 evas_object_hide(p->popup);
1195 static void __cal_month_calendar_get_events(cal_view_main_month_cal_data *p)
1199 cal_util_get_day_time_t(&p->ad->base_tm, &st, &et);
1201 p->csv = CALENDAR_SVC_GET_EVENT(p->ad->acct_id, st, et);
1204 static void __cal_month_calendar_update_genlist(cal_view_main_month_cal_data *p)
1208 c_retm_if(!p, "p is null");
1209 c_retm_if(!p->gl, "p->gl is null");
1213 Elm_Object_Item *it = NULL;
1214 elm_genlist_clear(p->gl);
1216 CALENDAR_SVC_FREE_CS(&p->csv);
1218 __cal_month_calendar_get_events(p);
1219 c_retm_if(!p->csv, "p->csv is null");
1221 EINA_LIST_FOREACH(p->csv->tmlist, l, tm) {
1223 it = elm_genlist_item_append(p->gl, &itc, tm, NULL, ELM_GENLIST_ITEM_NONE, __cal_month_calendar_genlist_item_select_callback, tm);
1224 c_retm_if(!it, "elm_genlist_item_append() returned null");
1231 static void __cal_month_calendar_popup_response_callback(void *data, Evas_Object *obj, void *ei)
1233 c_retm_if(!data, "data is null");
1235 Evas_Object *popup = data;
1237 evas_object_hide(popup);
1240 void __cal_month_calendar_events_of_one_weekday(void *data)
1242 c_retm_if(!data, "data is null");
1244 cal_view_main_month_cal_data *p = data;
1245 c_retm_if(!p->parent, "p->parent is null");
1247 struct appdata *ad = p->ad;
1250 char title[128] = {0};
1252 cal_util_get_time_text(title, sizeof(title), CAL_UTIL_DATE_FORMAT_13, NULL, &p->ad->base_tm);
1255 p->popup = cal_util_add_popup(ad->win, "menustyle", title, NULL,
1256 __cal_month_calendar_popup_response_callback, p,
1257 S_("IDS_COM_BODY_CLOSE"), NULL);
1259 c_retm_if(!p->popup, "cal_util_add_popup returned null");
1262 elm_object_part_text_set(p->popup, "title,text", title);
1263 evas_object_show(p->popup);
1267 p->gl = elm_genlist_add(p->popup);
1268 evas_object_data_set(p->gl, "priv", p);
1269 evas_object_show(p->gl);
1270 elm_object_content_set(p->popup, p->gl);
1273 __cal_month_calendar_update_genlist(p);
1276 static void __cal_month_calendar_mouse_up(void *data, Evas *e, Evas_Object *ly, void *ei)
1278 cal_view_main_month_cal_data *p = data;
1279 Evas_Event_Mouse_Down *ev = ei;
1282 int num_of_enable = 0;
1285 if (ev->canvas.x != p->down_x && ev->canvas.y != p->down_y)
1288 Evas_Coord_Rectangle r;
1289 cal_util_get_geometry (&r, ly);
1290 int day_width = r.w/7;
1292 __cal_month_calendar_get_week_time(p,&start_day,&end_day);
1294 if (7 != (num_of_enable = end_day - start_day + 1)) {
1298 if (ev->canvas.x < (7 - num_of_enable) * day_width)
1301 start_day -= (7 - num_of_enable);
1303 else if (start_day > 7) {
1305 if (ev->canvas.x > num_of_enable * day_width)
1310 if (ev->canvas.x > 0 && ev->canvas.x < 1*day_width) {
1312 p->ad->base_tm.tm_mday = start_day;
1314 if (!__cal_month_calendar_event_exists(p->list,0)) {
1315 p->ad->base_hour = -1;
1316 p->ad->cid = 0; // new
1317 cal_edit_create_view(p->ad, p->parent);
1320 __cal_month_calendar_events_of_one_weekday(p);
1322 else if (ev->canvas.x > 1*day_width && ev->canvas.x < 2*day_width) {
1324 p->ad->base_tm.tm_mday = start_day+1;
1326 if (!__cal_month_calendar_event_exists(p->list,1)) {
1328 p->ad->base_hour = -1;
1329 p->ad->cid = 0; // new
1330 cal_edit_create_view(p->ad, p->parent);
1333 __cal_month_calendar_events_of_one_weekday(p);
1335 else if (ev->canvas.x > 2*day_width && ev->canvas.x < 3*day_width) {
1337 p->ad->base_tm.tm_mday = start_day+2;
1338 if (!__cal_month_calendar_event_exists(p->list,2)) {
1340 p->ad->base_hour = -1;
1341 p->ad->cid = 0; // new
1342 cal_edit_create_view(p->ad, p->parent);
1345 __cal_month_calendar_events_of_one_weekday(p);
1347 else if (ev->canvas.x > 3*day_width && ev->canvas.x < 4*day_width) {
1349 p->ad->base_tm.tm_mday = start_day+3;
1350 if (!__cal_month_calendar_event_exists(p->list,3)) {
1352 p->ad->base_hour = -1;
1353 p->ad->cid = 0; // new
1354 cal_edit_create_view(p->ad, p->parent);
1357 __cal_month_calendar_events_of_one_weekday(p);
1359 else if (ev->canvas.x > 4*day_width && ev->canvas.x < 5*day_width) {
1361 p->ad->base_tm.tm_mday = start_day+4;
1363 if (!__cal_month_calendar_event_exists(p->list,4)) {
1365 p->ad->base_hour = -1;
1366 p->ad->cid = 0; // new
1367 cal_edit_create_view(p->ad, p->parent);
1370 __cal_month_calendar_events_of_one_weekday(p);
1372 else if (ev->canvas.x > 5*day_width && ev->canvas.x < 6*day_width) {
1374 p->ad->base_tm.tm_mday = start_day+5;
1376 if (!__cal_month_calendar_event_exists(p->list,5)) {
1377 p->ad->base_hour = -1;
1378 p->ad->cid = 0; // new
1379 cal_edit_create_view(p->ad, p->parent);
1382 __cal_month_calendar_events_of_one_weekday(p);
1386 p->ad->base_tm.tm_mday = start_day+6;
1388 if (!__cal_month_calendar_event_exists(p->list,6)) {
1389 p->ad->base_hour = -1;
1390 p->ad->cid = 0; // new
1391 cal_edit_create_view(p->ad, p->parent);
1394 __cal_month_calendar_events_of_one_weekday(p);
1397 if (-1 != p->index_for_press) {
1398 snprintf(eve, sizeof(eve) , "up,%d", p->index_for_press);
1399 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), eve, "prog");
1400 p->index_for_press = -1;
1405 Evas_Object* cal_month_calendar_create_content(struct tm *t, struct appdata *ad,
1406 Evas_Object *main, Eina_Bool tmp)
1410 cal_view_main_month_cal_data *p;
1420 CAL_CALLOC(p, 1, cal_view_main_month_cal_data);
1424 p->pos_down = p->pos_today = p->pos_selected = -1;
1425 p->pos_start = p->pos_end = -1;
1428 p->name = _name = "main/month/cal";
1429 else if(ad->is_weekly)
1430 p->name = _name = "main/month/cal/weekly";
1434 ly = cal_util_add_layout(ad->nv, p->name);
1442 evas_object_data_set(ly, "priv", p);
1443 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(ly), "*", "cal", __cal_month_calendar_cal_event_callback, p);
1444 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(ly), "*", "prog", __cal_month_calendar_prog_event_callback, p);
1446 __cal_month_calendar_set_wday_text(ly, ad->wday_start);
1448 if (tmp == EINA_TRUE)
1450 p->weekline = __cal_month_calendar_fill_calendar(ly, t, ad->wday_start);
1451 __cal_month_calendar_update_check(ly, p);
1454 if (p->ad->is_weekly)
1456 Evas_Object *events = cal_util_add_layout(ad->nv, "main/month/week/events");
1458 elm_object_part_content_set(ly, "list/sw", events);
1459 evas_object_event_callback_add(events, EVAS_CALLBACK_MOUSE_DOWN, __cal_month_calendar_mouse_down, p);
1460 evas_object_event_callback_add(events, EVAS_CALLBACK_MOUSE_UP, __cal_month_calendar_mouse_up, p);
1461 evas_object_event_callback_add(events, EVAS_CALLBACK_MOUSE_MOVE, __cal_month_calendar_mouse_move, p);
1465 __cal_month_calendar_get_weekly_events(p);
1467 if(-1 == p->pos_selected)
1469 __cal_month_calendar_set_focuse_week(p, CAL_UTIL_GET_EDJ_DATA(ly), p->pos_today);
1473 __cal_month_calendar_set_focuse_week(p, CAL_UTIL_GET_EDJ_DATA(ly), p->pos_selected);
1476 __cal_month_calendar_signal_week(p,CAL_UTIL_GET_EDJ_DATA(p->ly));
1479 evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_month_calendar_delete_layout, p);
1486 void cal_month_update_month_calendar(Evas_Object *ly, struct tm *t)
1493 cal_view_main_month_cal_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
1494 if (!p || CAL_STRCMP(p->name, _name)) {
1495 ERR("update month calendar: Invalid object");
1499 struct appdata *ad = p->ad;
1502 p->weekline = __cal_month_calendar_fill_calendar(ly, t, ad->wday_start);
1503 cal_month_calendar_update_select(ly);
1504 __cal_month_calendar_update_check(ly, p);
1506 if (p->ad->is_weekly) {
1508 __cal_month_calendar_get_weekly_events(p);
1510 if (-1 == p->pos_selected)
1511 __cal_month_calendar_set_focuse_week(p, CAL_UTIL_GET_EDJ_DATA(ly), p->pos_today);
1513 __cal_month_calendar_set_focuse_week(p, CAL_UTIL_GET_EDJ_DATA(ly), p->pos_selected);
1515 __cal_month_calendar_signal_week(p,CAL_UTIL_GET_EDJ_DATA(p->ly));
1521 int cal_month_get_weekline(Evas_Object *ly)
1523 cal_view_main_month_cal_data *p;
1527 p = CAL_UTIL_GET_PRIV_DATA(ly);
1528 if (!p || CAL_STRCMP(p->name, _name)) {
1529 ERR("get weekline: Invalid object");