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://floralicense.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.
21 #include "edit-view.h"
22 #include "detail-view.h"
23 #include "cld-images.h"
24 #include "list-base.h"
25 #include "month-data.h"
27 #define WEEKS_OF_MONTH_5 5
28 #define WEEKS_OF_MONTH_4 4
37 CAL_MONTH_CALENDAR_DAY_TYPE_SUNDAY = 0,
38 CAL_MONTH_CALENDAR_DAY_TYPE_SATDAY,
39 CAL_MONTH_CALENDAR_DAY_TYPE_WEEKDAY,
40 } cal_month_calendar_day_type_t;
45 cal_month_calendar_day_type_t d_type;
52 Evas_Object *weekly_events_ly[WEEKS_OF_MONTH];
54 Evas_Object *month_monthly;
55 Evas_Object *month_daily;
56 Evas_Object *month_landscape;
57 Eina_List *event_list;
63 int base_pos_for_weekly;
65 struct _day day[DAYS_OF_WEEKLY_MONTHS_VIEW];
71 cal_month_data_h month_data;
75 } cal_month_calendar_data;
77 static const char *_name = NULL;
79 static void __cal_month_calendar_signal_week(cal_month_calendar_data *p, Evas_Object *obj, int index);
81 static void __cal_month_calendar_events_of_one_weekday(void *data);
82 static void __cal_month_calendar_get_events(cal_month_calendar_data *p);
83 static void __cal_month_calendar_create_event_lists(Evas_Object *ly, cal_month_calendar_data *p);
84 static void __cal_month_calendar_signal_all_week(cal_month_calendar_data *p);
85 static void __cal_month_calendar_signal_all_clean(cal_month_calendar_data *p);
86 static void __cal_month_calendar_set_more_text(Evas_Object *ly, int count, int index);
87 static void __cal_month_calendar_set_check_text(Evas_Object *ly, cal_month_calendar_data *p, int count, int index);
88 static void __cal_month_calendar_set_event_rect_color(Evas_Object *obj, cal_month_calendar_data *p, int line, int pos, int calendar_id);
89 static void __cal_month_calendar_set_day_default_color(cal_month_calendar_data* p, Evas_Object *eo, int pos);
90 static void __cal_month_calendar_fill_week_number(Evas_Object *ly);
91 static void __cal_month_quick_add_input_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value);
94 static Elm_Genlist_Item_Class itc_1icon_title, itc_1icon_start, itc_1icon_end;
96 static int __cal_month_calendar_get_first_wday(int mday, int wday)
98 return CAL_UTIL_GET_WDAY(wday - mday + 1);
101 static void __cal_month_calendar_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
105 c_retm_if(!data, "data is null");
106 cal_month_calendar_data *p = data;
108 struct appdata *ad = p->ad;
109 c_retm_if(!ad, "ad is null");
111 if (ad->today_edj && ad->today_edj == CAL_UTIL_GET_EDJ_DATA(obj))
112 ad->today_edj = NULL;
115 ecore_idler_del(p->idler);
118 ad->need_to_show_popup = EINA_TRUE;
119 evas_object_del(p->popup);
122 cal_month_data_clear(p->month_data);
124 cal_month_data_destroy(p->month_data);
131 static inline void __cal_month_calendar_set_color(Evas_Object *ly, cal_month_calendar_data *p, int pos, int wday)
133 c_retm_if(!p, "p is null");
135 struct _day *d = &p->day[pos];
137 const char *day_color;
141 day_color = "sunday";
142 d->d_type = CAL_MONTH_CALENDAR_DAY_TYPE_SUNDAY;
145 day_color = "satday";
146 d->d_type = CAL_MONTH_CALENDAR_DAY_TYPE_SATDAY;
149 d->d_type = CAL_MONTH_CALENDAR_DAY_TYPE_WEEKDAY;
150 day_color = "weekday";
154 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "%s,%d", day_color, pos);
157 static inline void __cal_month_calendar_set_disabled(Evas_Object *ly, cal_month_calendar_data *p, int pos)
159 struct _day *d = &p->day[pos];
161 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "disable,%d", pos);
166 static inline void __cal_month_calendar_set_enabled(Evas_Object *ly, cal_month_calendar_data *p, int pos, int wday)
168 struct _day *d = &p->day[pos];
171 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "enable,%d", pos);
173 __cal_month_calendar_set_color(ly, p, pos, wday);
178 static inline void __cal_month_calendar_set_today(Evas_Object *eo, int pos)
183 cal_util_emit_signal(eo, "today,%d", pos);
186 static inline void __cal_month_calendar_unset_today(Evas_Object *eo, int *pos)
191 cal_util_emit_signal(eo, "notoday,%d", *pos);
195 static inline void __cal_month_calendar_set_selected(Evas_Object *eo, int pos)
197 if (pos < 0 || DAYS_OF_WEEKLY_MONTHS_VIEW <= pos)
200 cal_util_emit_signal(eo, "select,%d", pos);
203 static inline void __cal_month_calendar_set_unselected(cal_month_calendar_data* p, Evas_Object *eo, int *pos)
205 c_retm_if(!p, "p is NULL");
206 c_retm_if(-1 == *pos, "pos is invalid");
207 c_retm_if(!eo, "eo is invalid");
209 cal_util_emit_signal(eo, "unselect,%d", *pos);
211 __cal_month_calendar_set_day_default_color(p, eo, *pos);
216 static inline int __cal_month_calendar_get_start_day(int *st, struct tm *tm, int start, int max)
221 prev_day = CAL_UTIL_GET_WDAY(__cal_month_calendar_get_first_wday(tm->tm_mday, tm->tm_wday) - start);
223 day = max - prev_day + 1;
233 static int __cal_month_calendar_update_today(Evas_Object *eo, cal_month_calendar_data *p)
238 struct appdata *ad = p->ad;
241 struct tm *base_tm = &ad->base_tm;
242 c_retv_if(!base_tm, -1);
244 __cal_month_calendar_unset_today(eo, &p->pos_today);
246 ad->today_edj = NULL;
248 if (base_tm->tm_year == ad->today_tm.tm_year && base_tm->tm_mon == ad->today_tm.tm_mon) {
249 p->pos_today = p->pos_start + ad->today_tm.tm_mday - 1;
250 __cal_month_calendar_set_today(eo, p->pos_today);
257 static inline void __cal_month_calendar_set_selected_today(Evas_Object *eo, int pos)
259 if (pos < 0 || DAYS_OF_WEEKLY_MONTHS_VIEW <= pos)
262 cal_util_emit_signal(eo, "select,today,%d", pos);
265 void cal_month_calendar_update_select(Evas_Object *ly)
268 Evas_Object* eo = CAL_UTIL_GET_EDJ_DATA(ly);
270 cal_month_calendar_data* p = CAL_UTIL_GET_PRIV_DATA(ly);
274 struct appdata *ad = p->ad;
277 struct tm *base_tm = &ad->base_tm;
280 cal_main_update_title_text(p->ad);
282 __cal_month_calendar_set_unselected(p, eo, &p->pos_selected);
283 p->pos_selected = p->pos_start + p->ad->base_tm.tm_mday - 1;
285 if (base_tm->tm_year == ad->today_tm.tm_year && base_tm->tm_mon == ad->today_tm.tm_mon && base_tm->tm_mday == ad->today_tm.tm_mday) {
286 __cal_month_calendar_set_selected_today(eo, p->pos_selected);
288 __cal_month_calendar_set_selected(eo, p->pos_selected);
294 static void __cal_month_calendar_update_check(Evas_Object *ly, cal_month_calendar_data *p)
298 c_ret_if(p->pos_start < 0);
300 struct appdata *ad = p->ad;
304 for (week = 0; week < WEEKS_OF_MONTH; week++) {
306 for (wday = 0; wday < DAYS_OF_WEEK; wday++) {
307 int count = cal_month_data_get_event_count(p->month_data, week, wday);
308 __cal_month_calendar_set_check_text(ly, p, count, week * DAYS_OF_WEEK + wday);
313 static int __cal_month_calendar_get_week_last_line(cal_month_calendar_data *p, int wday)
317 struct appdata *ad = p->ad;
320 struct tm base_tm = ad->base_tm;
322 int prev_max = cal_util_get_max_days(base_tm.tm_year, base_tm.tm_mon - 1);
323 int cur_max = cal_util_get_max_days(base_tm.tm_year, base_tm.tm_mon);
326 int day = __cal_month_calendar_get_start_day(&st, &base_tm, wday, prev_max);
332 int line = WEEKS_OF_MONTH;
334 for (i = 0; i < DAYS_OF_WEEKLY_MONTHS_VIEW; i++) {
338 if (day == prev_max) {
341 p->pos_start = i + 1;
346 if (day == cur_max) {
349 line = (int)(i / DAYS_OF_WEEK) + 1;
359 wday = CAL_UTIL_GET_WDAY(wday + 1);
365 static int __cal_month_calendar_fill_calendar(Evas_Object *ly, int wday)
369 cal_month_calendar_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
372 struct appdata *ad = p->ad;
375 struct tm base_tm = ad->base_tm;
377 int prev_max = cal_util_get_max_days(base_tm.tm_year, base_tm.tm_mon - 1);
378 int cur_max = cal_util_get_max_days(base_tm.tm_year, base_tm.tm_mon);
381 int day = __cal_month_calendar_get_start_day(&st, &base_tm, wday, prev_max);
387 int line = WEEKS_OF_MONTH;
389 for (i = 0; i < DAYS_OF_WEEKLY_MONTHS_VIEW; i++) {
390 cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("db/%d/text", i), "%d", day);
395 __cal_month_calendar_set_disabled(ly, p, i);
396 if (day == prev_max) {
399 p->pos_start = i + 1;
404 __cal_month_calendar_set_enabled(ly, p, i, wday);
405 if (day == cur_max) {
408 line = (int)(i / DAYS_OF_WEEK) + 1;
414 __cal_month_calendar_set_disabled(ly, p, i);
419 wday = CAL_UTIL_GET_WDAY(wday + 1);
422 __cal_month_calendar_update_today(CAL_UTIL_GET_EDJ_DATA(ly), p);
424 __cal_month_calendar_fill_week_number(ly);
429 static void __cal_month_calendar_click_event_callback(cal_month_calendar_data *p, Evas_Object *obj, int pos)
433 struct appdata *ad = p->ad;
436 if (p->pos_selected == pos) {
437 DBG("cal_cb: double clicked %d", pos);
439 if (p->day[pos].checked) {
440 __cal_month_calendar_events_of_one_weekday(p);
445 calendar_record_h record = NULL;
446 calendar_error_e error = CALENDAR_ERROR_NONE;
448 error = calendar_record_create(_calendar_event._uri, &record);
449 c_retm_if(error != CALENDAR_ERROR_NONE, "calendar_record_create() is failed(%x)", error);
450 cal_edit_create_view(ad, record, NULL, NULL);
456 ad->base_tm.tm_mday = pos - p->pos_start + 1;
458 cal_month_calendar_update_select(p->month);
460 edje_object_signal_emit(obj, "changed", "prog");
463 static void __cal_month_calendar_cal_event_callback(void *data, Evas_Object *obj, const char *e, const char *src)
465 cal_month_calendar_data *p = data;
466 c_retm_if(!p, "p is null");
468 struct appdata *ad = p->ad;
469 c_retm_if(!ad, "ad is null");
471 int pos = atoi(&e[3]);
472 c_retm_if((p->pos_end < pos) || (pos < p->pos_start), "pos is diabled");
474 if (!strncmp(e, "up,", 3)) {
476 if (p->pos_down == pos) {
477 __cal_month_calendar_click_event_callback(p, obj, pos);
480 edje_object_signal_emit(obj, e, "prog");
482 }else if (!strncmp(e, "dn,", 3)) {
486 edje_object_signal_emit(obj, e, "prog");
490 static void __cal_month_calendar_prog_event_callback(void *data, Evas_Object *obj, const char *e, const char *src)
492 cal_month_calendar_data *p = data;
494 if (!CAL_STRCMP(e, "update_today")) {
495 __cal_month_calendar_update_today(obj, p);
499 if (CAL_STRCMP(e, "moved")) {
503 if (p->pos_down == -1) {
507 cal_util_emit_signal(obj, "up,%d", p->pos_down);
508 if (p->pos_selected!= p->pos_down) {
509 __cal_month_calendar_set_day_default_color(p, obj, p->pos_down);
510 cal_util_emit_signal(obj, "unselect,%d", p->pos_down);
515 void cal_month_calendar_set_wday_text(Evas_Object *ly, int start)
519 cal_month_calendar_data* p = CAL_UTIL_GET_PRIV_DATA(ly);
522 struct appdata *ad = p->ad;
525 struct tm base_tm = ad->base_tm;
527 cal_util_update_tm_day(&base_tm, base_tm.tm_wday*(-1)+start);
530 for (i = 0; i < DAYS_OF_WEEK; i++) {
531 cal_util_set_time_text_toupper(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("wday/%d/text", i), CAL_UTIL_DATE_FORMAT_2, NULL, &base_tm);
533 if (base_tm.tm_wday == 6)
534 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "satday,%d", i);
536 if (base_tm.tm_wday == 0)
537 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "sunday,%d", i);
539 cal_util_update_tm_day(&base_tm, 1);
542 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "wday/weeknumber/text", C_("IDS_CLD_POP_WEEK_INITIAL"));
545 static void __cal_month_calendar_signal_clean(cal_month_calendar_data *p,Evas_Object *eo)
547 c_retm_if(!p, "p is null");
548 c_retm_if(!eo, "eo is null");
553 for (i = 0; i < DAYS_OF_WEEK; i++) {
554 for (line = 1; line <= WEEKS_OF_MONTH; line++) {
555 cal_util_emit_signal(eo, "%d,%d,%d", line, 0, i);
556 cal_util_emit_signal(eo, "%d,%s,%d", line, "nocolor", i);
562 static int __cal_month_calendar_get_week_time(cal_month_calendar_data *p, int *first_day, int *last_day)
568 if(-1 == p->pos_selected)
571 day = p->pos_selected;
573 today = day - p->pos_start + 1;
574 start_day = day - ((day + 1) % DAYS_OF_WEEK) + 1;
576 if (day < DAYS_OF_WEEK) {
578 *last_day = DAYS_OF_WEEK - p->pos_start;
579 } else if (0 == ((day + 1) % DAYS_OF_WEEK)) {
580 *first_day = today - DAYS_OF_WEEK + 1;
583 *first_day = today - (day % DAYS_OF_WEEK);
584 if ((start_day + DAYS_OF_WEEK - 1) > p->pos_end) {
585 *last_day = p->pos_end - p->pos_start + 1;
587 *last_day = *first_day + DAYS_OF_WEEK - 1;
594 static void __cal_month_calendar_signal_week(cal_month_calendar_data *p, Evas_Object *obj, int week)
602 Evas_Object *eo = CAL_UTIL_GET_EDJ_DATA(obj);
605 for (wday = 0; wday < DAYS_OF_WEEK; wday++) {
607 if (cal_month_data_get_event_count(p->month_data, week, wday) == 0)
611 for (row = 1; row <= CAL_MONTH_MAX_ROWS_PER_CELL; row++) {
612 cal_month_calendar_event* event =
613 cal_month_data_get_event(p->month_data, week, wday, row - 1);
618 cal_util_emit_signal(eo, "%d,%d,%d", row, event->width, wday);
619 cal_util_emit_signal(eo, "%d,show,%d", row, wday);
621 __cal_month_calendar_set_event_rect_color(obj, p, row, wday, event->calendar_id);
623 memset(text,0x00,sizeof(text));
624 g_snprintf(text, sizeof(text), "%d/text/%d", row, wday);
625 edje_object_part_text_set(eo, text, event->title);
630 static void __cal_month_calendar_mouse_down(void *data, Evas *e, Evas_Object *ly, void *ei)
632 c_retm_if(!data, "p is null");
633 c_retm_if(!ly, "ly is null");
634 c_retm_if(!ei, "ei is null");
636 cal_month_calendar_data *p = data;
637 Evas_Event_Mouse_Down *ev = ei;
641 int list_index = (int)evas_object_data_get(ly, "list_index");
642 p->base_pos_for_weekly = list_index * DAYS_OF_WEEK;
644 Evas_Coord_Rectangle r;
645 cal_util_get_geometry(&r, ly);
646 offset = ev->canvas.x / (r.w / DAYS_OF_WEEK);
647 if (DAYS_OF_WEEK <= offset)
648 offset = DAYS_OF_WEEK - 1;
650 p->down_x = ev->canvas.x;
651 p->down_y = ev->canvas.y;
653 if (p->day[p->base_pos_for_weekly + offset].enabled) {
654 p->index_for_press = p->base_pos_for_weekly + offset;
655 snprintf(eve, sizeof(eve) , "dn,%d", p->index_for_press);
656 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), eve, "cal");
660 static void __cal_month_calendar_mouse_move(void *data, Evas *e, Evas_Object *ly, void *ei)
662 c_retm_if(!data, "data is null");
663 c_retm_if(!ly, "ly is null");
664 c_retm_if(!ei, "ei is null");
666 cal_month_calendar_data *p = data;
667 Evas_Event_Mouse_Move *ev = ei;
669 Evas_Coord th = elm_config_finger_size_get();
673 dx = ev->cur.canvas.x - p->down_x ;
674 dy = p->down_y - ev->cur.canvas.y;
675 if (dy > th || dy < (th * -1) || dx > th || dx < (th * -1)) {
677 if( -1 != p->index_for_press) {
678 snprintf(eve, sizeof(eve) , "up,%d", p->index_for_press);
679 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), eve, "prog");
680 if (p->pos_selected != p->index_for_press) {
681 __cal_month_calendar_set_day_default_color(p, CAL_UTIL_GET_EDJ_DATA(p->month), p->index_for_press);
682 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->month), "unselect,%d", p->index_for_press);
684 p->index_for_press = -1;
689 static void __cal_month_calendar_get_events(cal_month_calendar_data *p)
691 struct tm tm_start = p->ad->base_tm;
692 tm_start.tm_hour = 0;
696 struct tm tm_end = tm_start;
700 p->event_list = _calendar_get_all_instance_list(&tm_start, &tm_end);
702 Eina_List *todo_list = _calendar_get_due_date_task_list(&tm_start, &tm_end, p->ad->is_display_complete_todo, _CALENDAR_TASK_SORT_TYPE_DUEDATE_ASC);
703 p->event_list = eina_list_merge(p->event_list, todo_list);
706 static void __cal_month_calendar_update_genlist(cal_month_calendar_data *p)
710 c_retm_if(!p, "p is null");
711 c_retm_if(!p->list, "p->list is null");
714 calendar_record_h record = NULL;
716 cal_list_base_clear(p->list);
719 _calendar_free_record_list(&p->event_list);
721 __cal_month_calendar_get_events(p);
722 c_retm_if(!p->event_list, "p->event_list is null");
724 EINA_LIST_FOREACH(p->event_list, l, record) {
726 cal_list_base_add_item(p->list, record, false);
732 static void __cal_month_calendar_popup_response_callback(void *data, Evas_Object *obj, void *ei)
734 c_retm_if(!data, "data is null");
736 Evas_Object *popup = data;
738 cal_month_calendar_data *p = evas_object_data_get(popup, "data");
741 evas_object_del(popup);
744 c_ret_if(!cal_list_base_get_genlist_p(p->list));
745 cal_list_base_delete(p->list);
749 struct appdata *ad = p->ad;
752 ad->need_to_show_popup = EINA_FALSE;
755 static void __cal_month_calendar_popup_genlist_item_selected_callback(void *data)
757 c_retm_if(!data, "data is null");
759 cal_month_calendar_data *p = data;
760 c_retm_if(!p->popup, "p->popup is null");
762 evas_object_del(p->popup);
765 c_ret_if(!cal_list_base_get_genlist_p(p->list));
766 cal_list_base_delete(p->list);
770 struct appdata *ad = p->ad;
773 ad->need_to_show_popup = EINA_FALSE;
775 calendar_record_h record = _calendar_get_record_with_index(p->ad->cid);
776 c_retm_if(!record, "record is null");
778 cal_detail_create_view(p->ad, record, NULL, NULL);
779 calendar_record_destroy(record, true);
784 static void __cal_month_calendar_events_of_one_weekday(void *data)
786 c_retm_if(!data, "data is null");
788 cal_month_calendar_data *p = data;
789 c_retm_if(!p->parent, "p->parent is null");
791 struct appdata *ad = p->ad;
794 char title[128] = {0};
797 _calendar_free_record_list(&p->event_list);
799 __cal_month_calendar_get_events(p);
800 c_retm_if(!p->event_list, "p->event_list is null");
802 int count = eina_list_count(p->event_list);
804 cal_util_get_time_text(title, sizeof(title), CAL_UTIL_DATE_FORMAT_13, NULL, &p->ad->base_tm);
807 p->popup = cal_util_add_popup(ad->win, "menustyle", title, NULL,
808 __cal_month_calendar_popup_response_callback, p,
809 S_("IDS_COM_BODY_CLOSE"), NULL);
811 c_retm_if(!p->popup, "cal_util_add_popup returned null");
813 elm_object_part_text_set(p->popup, "title,text", title);
814 evas_object_show(p->popup);
818 p->list = cal_list_base_create(ad, p->popup, NULL, false, __cal_month_calendar_popup_genlist_item_selected_callback, p);
821 } else if (1 == count) {
822 calendar_record_h record = eina_list_data_get(p->event_list);
825 p->ad->cid = _calendar_get_record_index(record);
827 cal_detail_create_view(p->ad, record, NULL, NULL);
829 __cal_month_calendar_update_genlist(p);
832 static void __cal_month_calendar_mouse_up(void *data, Evas *e, Evas_Object *ly, void *ei)
834 c_retm_if(!data, "data is null");
835 c_retm_if(!ly, "ly is null");
837 cal_month_calendar_data *p = data;
838 Evas_Event_Mouse_Down *ev = ei;
841 int num_of_enable = 0;
846 list_index = (int)evas_object_data_get(ly, "list_index");
848 c_retm_if(-1 == p->index_for_press, "p->index_for_press is -1");
850 Evas_Coord_Rectangle r;
851 cal_util_get_geometry (&r, ly);
852 int day_width = r.w / DAYS_OF_WEEK;
854 snprintf(eve, sizeof(eve) , "up,%d", p->index_for_press);
855 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->month), eve, "cal");
857 if (p->pos_selected != p->index_for_press) {
858 p->index_for_press = -1;
862 p->index_for_press = -1;
864 __cal_month_calendar_get_week_time(p,&start_day,&end_day);
866 if (DAYS_OF_WEEK != (num_of_enable = end_day - start_day + 1)) {
868 if (end_day < DAYS_OF_WEEK) {
870 if (ev->canvas.x < (DAYS_OF_WEEK- num_of_enable) * day_width)
873 start_day -= (DAYS_OF_WEEK - num_of_enable);
874 } else if (DAYS_OF_WEEK < start_day) {
876 if (ev->canvas.x > num_of_enable * day_width)
883 Evas_Object* cal_month_calendar_create_view(struct appdata *ad,
884 Evas_Object *parent, Eina_Bool tmp)
886 c_retv_if(!ad, NULL);
887 c_retv_if(!parent, NULL);
889 cal_month_calendar_data *p = calloc(1, sizeof(cal_month_calendar_data));
892 if (ad->is_landscape_mode)
893 p->month_data = cal_month_data_create(ad, 1);
895 p->month_data = cal_month_data_create(ad, 3);
899 p->pos_down = p->pos_today = p->pos_selected = -1;
900 p->index_for_press = -1;
902 p->weekline = __cal_month_calendar_get_week_last_line(p, ad->wday_start);
904 if (ad->daily_events_mode || ad->is_landscape_mode) {
905 if (!ad->is_landscape_mode) {
906 if (WEEKS_OF_MONTH == p->weekline) {
907 p->name = _name = "main/month/cal/weekly/6";
908 } else if (WEEKS_OF_MONTH_5 == p->weekline) {
909 p->name = _name = "main/month/cal/weekly/5";
910 } else if (WEEKS_OF_MONTH_4 == p->weekline) {
911 p->name = _name = "main/month/cal/weekly/4";
914 if (WEEKS_OF_MONTH == p->weekline) {
915 p->name = _name = "main/month/cal/weekly/6/l";
916 } else if (WEEKS_OF_MONTH_5 == p->weekline) {
917 p->name = _name = "main/month/cal/weekly/5/l";
918 } else if (WEEKS_OF_MONTH_4 == p->weekline) {
919 p->name = _name = "main/month/cal/weekly/4/l";
923 p->name = _name = "main/month/cal";
927 Evas_Object *ly = cal_util_add_layout(ad->naviframe, p->name);
935 evas_object_data_set(ly, "priv", p);
936 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(ly), "*", "cal", __cal_month_calendar_cal_event_callback, p);
937 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(ly), "*", "prog", __cal_month_calendar_prog_event_callback, p);
939 cal_month_calendar_set_wday_text(ly, ad->wday_start);
941 cal_month_data_clear(p->month_data);
942 cal_month_data_load(p->month_data);
944 if (tmp == EINA_TRUE) {
945 p->weekline = __cal_month_calendar_fill_calendar(ly, ad->wday_start);
946 __cal_month_calendar_update_check(ly, p);
949 if (p->ad->daily_events_mode || p->ad->is_landscape_mode) {
950 __cal_month_calendar_create_event_lists(ly, p);
951 __cal_month_calendar_signal_all_clean(p);
952 __cal_month_calendar_signal_all_week(p);
955 if (ad->is_display_weeknumber)
956 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "display_week_number");
958 evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_month_calendar_delete_layout, p);
963 void cal_month_calendar_update_view(Evas_Object *ly)
969 cal_month_calendar_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
970 // if (!p || CAL_STRCMP(p->name, _name)) {
971 // ERR("update month calendar: Invalid object");
975 struct appdata *ad = p->ad;
978 p->weekline = __cal_month_calendar_fill_calendar(ly, ad->wday_start);
980 __cal_month_calendar_update_check(ly, p);
982 if (p->ad->daily_events_mode || p->ad->is_landscape_mode) {
983 __cal_month_calendar_signal_all_clean(p);
984 __cal_month_calendar_signal_all_week(p);
987 if (ad->need_to_show_popup) {
988 __cal_month_calendar_events_of_one_weekday(p);
989 ad->need_to_show_popup = EINA_FALSE;
992 cal_month_calendar_update_select(ly);
997 int cal_month_calendar_get_weekline(Evas_Object *ly)
1001 cal_month_calendar_data *p = NULL;
1003 p = CAL_UTIL_GET_PRIV_DATA(ly);
1009 static void __cal_month_calendar_set_more_text(Evas_Object *ly, int count, int index)
1011 c_retm_if(!ly, "ly is null");
1012 c_retm_if(index < 0 , "index is wrong");
1014 cal_month_calendar_data* p = CAL_UTIL_GET_PRIV_DATA(ly);
1015 c_retm_if(!p, "p is null");
1016 c_retm_if(!p->ad, "p->ad is null");
1018 char part[32] = {0};
1019 char text[32] = {0};
1021 if (count <= (p->ad->is_landscape_mode ? LINES_OF_WEEKLY_MONTHS_EVENT_LANDSCAPE : LINES_OF_WEEKLY_MONTHS_EVENT)) {
1022 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "hide_count,%d", index);
1024 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "show_count,%d", index);
1028 static void __cal_month_calendar_create_event_lists(Evas_Object *ly, cal_month_calendar_data *p)
1033 char part[32] = {0};
1036 for (week = 0; week < WEEKS_OF_MONTH; week++) {
1037 snprintf(part, sizeof part, "list/sw/%d", week * DAYS_OF_WEEK);
1038 Evas_Object *events = NULL;
1040 if (p->ad->is_landscape_mode) {
1041 events = cal_util_add_layout(p->ad->naviframe, "main/month/week/events/l");
1043 events = cal_util_add_layout(p->ad->naviframe, "main/month/week/events");
1046 c_retm_if(!events, "events is null");
1048 evas_object_data_set(events, "list_index", (void*)week);
1050 elm_object_part_content_set(ly, part, events);
1051 evas_object_event_callback_add(events, EVAS_CALLBACK_MOUSE_DOWN, __cal_month_calendar_mouse_down, p);
1052 evas_object_event_callback_add(events, EVAS_CALLBACK_MOUSE_UP, __cal_month_calendar_mouse_up, p);
1053 evas_object_event_callback_add(events, EVAS_CALLBACK_MOUSE_MOVE, __cal_month_calendar_mouse_move, p);
1055 p->weekly_events_ly[week] = events;
1059 static void __cal_month_calendar_signal_all_week(cal_month_calendar_data *p)
1061 c_retm_if(!p, "p is null");
1064 for (week = 0; week < WEEKS_OF_MONTH; week++)
1065 __cal_month_calendar_signal_week(p, p->weekly_events_ly[week], week);
1068 static void __cal_month_calendar_signal_all_clean(cal_month_calendar_data *p)
1070 c_retm_if(!p, "p is null");
1073 for (i = 0; i < WEEKS_OF_MONTH; i++)
1074 __cal_month_calendar_signal_clean(p,CAL_UTIL_GET_EDJ_DATA(p->weekly_events_ly[i]));
1077 static void __cal_month_calendar_set_check_text(Evas_Object *ly, cal_month_calendar_data *p, int count, int index)
1079 c_retm_if(!ly, "ly is null");
1080 c_retm_if(index < 0 , "index is wrong");
1082 char part[32] = {0};
1083 char text[32] = {0};
1086 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "hide_count,%d", index);
1087 p->day[index].checked = 0;
1089 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(ly), "show_count,%d", index);
1090 p->day[index].checked = 1;
1094 static void __cal_month_calendar_set_event_rect_color(Evas_Object *obj, cal_month_calendar_data *p, int line, int pos, int calendar_id)
1096 c_retm_if(!obj, "obj is null");
1097 c_retm_if(!p, "p is null");
1099 calendar_record_h calendar = NULL;
1100 _calendar_book_color calendar_color = {0};
1101 Evas_Object *event_content = NULL;
1102 char part[20] = {0};
1104 snprintf(part, sizeof part, "%d/bgcolor/%d", line, pos);
1106 calendar_error_e error = CALENDAR_ERROR_NONE;
1107 error = calendar_db_get_record(_calendar_book._uri, calendar_id, &calendar);
1108 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_get_record() is failed(%x)", error);
1110 _calendar_get_calendar_color(calendar, &calendar_color);
1112 error = calendar_record_destroy(calendar, true);
1113 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_destroy() is failed(%x)", error);
1115 event_content = cal_util_add_rectangle(obj);
1116 c_retm_if(!event_content, "event_content is null");
1118 evas_object_size_hint_align_set(event_content, EVAS_HINT_FILL, 0);
1119 evas_object_size_hint_weight_set(event_content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1120 evas_object_color_set(event_content, calendar_color.red, calendar_color.green, calendar_color.blue, calendar_color.alpha);
1122 elm_object_part_content_set(obj, part, event_content);
1126 static void __cal_month_calendar_set_day_default_color(cal_month_calendar_data* p, Evas_Object *eo, int pos)
1128 c_retm_if(!p, "p is null");
1129 c_retm_if(!eo, "eo is null");
1131 struct _day *d = &p->day[pos];
1132 c_retm_if(!d, "d is null");
1134 switch (d->d_type) {
1135 case CAL_MONTH_CALENDAR_DAY_TYPE_SUNDAY:
1136 cal_util_emit_signal(eo, "sunday,%d", pos);
1138 case CAL_MONTH_CALENDAR_DAY_TYPE_SATDAY:
1139 cal_util_emit_signal(eo, "satday,%d", pos);
1141 case CAL_MONTH_CALENDAR_DAY_TYPE_WEEKDAY:
1142 cal_util_emit_signal(eo, "weekday,%d", pos);
1145 cal_util_emit_signal(eo, "weekday,%d", pos);
1150 static void __cal_month_calendar_fill_week_number(Evas_Object *ly)
1152 c_retm_if(!ly, "ly is null");
1155 cal_month_calendar_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
1156 c_retm_if(!p, "p is null");
1158 for (k = 0; k < WEEKS_OF_MONTH; k++) {
1162 struct tm end_time = {0};
1163 struct tm start_time = {0};
1164 cal_month_data_get_day_time_by_pos(p->ad,
1165 p->pos_today, p->pos_selected, p->pos_start, p->pos_end,
1166 &start_day, &end_day, &start_time, &end_time, (k + 1) * DAYS_OF_WEEK - 1);
1167 cal_util_get_week_number_text(&start_time, week, sizeof(week) - 1);
1168 cal_util_set_text(CAL_UTIL_GET_EDJ_DATA(ly), cal_util_get_part_text("wn/%d/text", k), "%s", week);