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.
18 #include "day-event-data.h"
20 #include "list-data.h"
23 cal_base_data_item base_item;
25 calendar_record_h record;
26 } cal_day_event_data_event;
33 } cal_day_event_data_event_slice;
39 } cal_day_event_data_event_slice_region;
42 cal_base_data_s base_data;
44 Eina_List *event_list;
45 cal_day_event_data_event_slice event_slice_array[EVENT_SLICE_COUNT];
46 Eina_List *event_slice_region_list;
47 } cal_day_event_data_s;
49 static cal_base_data_h __cal_day_event_data_new(void *data);
50 static void __cal_day_event_data_delete(cal_base_data_h base_data);
51 static void __cal_day_event_data_load(cal_base_data_h day_event_data);
52 static void __cal_day_event_data_create_data_list(cal_base_data_h day_event_data);
53 static void __cal_day_event_data_delete_data_list(cal_base_data_h base_data);
55 static cal_base_data_operations event_data_operations= {
56 __cal_day_event_data_new,
57 __cal_day_event_data_delete,
58 __cal_day_event_data_load,
59 __cal_day_event_data_create_data_list,
60 __cal_day_event_data_delete_data_list,
63 static cal_base_data_h __cal_day_event_data_new(void *data)
65 c_retv_if(!data, NULL);
67 cal_day_event_data_s* p = NULL;
69 CAL_CALLOC(p, 1, cal_day_event_data_s);
71 p->ad = (struct appdata *)data;
76 cal_day_event_data_h cal_day_event_data_create(struct appdata *ad)
78 return cal_base_data_create(&event_data_operations, ad);
82 static cal_day_event_data_event *__cal_day_event_data_create_more_event(cal_day_event_data_s* p, cal_day_event_data_event *last_event)
85 c_retv_if(!last_event, NULL);
87 cal_day_event_data_event *event = NULL;
88 CAL_CALLOC(event, 1, cal_day_event_data_event);
90 ((cal_base_data_item *)event)->text = strdup(">");
91 ((cal_base_data_item *)event)->color = ((cal_base_data_item *)last_event)->color;
92 ((cal_base_data_item *)event)->line_index = ((cal_base_data_item *)last_event)->line_index;
93 ((cal_base_data_item *)event)->height = 1;
94 ((cal_base_data_item *)event)->width_devider = EVEN_SLICE_MAX_EVENT_COUNT;
95 ((cal_base_data_item *)event)->column_index = EVEN_SLICE_MAX_EVENT_COUNT-1;
100 static void __cal_day_event_data_clear_event_slice_data(cal_day_event_data_s* p)
105 cal_day_event_data_event_slice *event_slice = NULL;
107 for(i=0; i<EVENT_SLICE_COUNT; i++) {
108 event_slice = &p->event_slice_array[i];
109 event_slice->start_index = 0;
110 event_slice->real_sz = 0;
114 static void __cal_day_event_data_init_event_slice_data(cal_day_event_data_s* p)
123 cal_day_event_data_event_slice *event_slice = NULL;
124 cal_day_event_data_event_slice *event_slice_tmp = NULL;
126 cal_day_event_data_event *event = NULL;
128 __cal_day_event_data_clear_event_slice_data(p);
130 for(i = 0; i<EVENT_SLICE_COUNT; i++) {
131 event_slice = &p->event_slice_array[i];
132 if(NULL != event_slice->list) {
134 EINA_LIST_FOREACH(event_slice->list, l, event)
138 e = ((cal_base_data_item *)event)->line_index + ((cal_base_data_item *)event)->height;
139 for(j = ((cal_base_data_item *)event)->line_index; (j<e && j<EVENT_SLICE_COUNT); j++)
141 event_slice_tmp = &p->event_slice_array[j];
142 if(j > ((cal_base_data_item *)event)->line_index)
145 event_slice_tmp->start_index = event_slice->start_index + 1;
147 event_slice_tmp->start_index = event_slice_tmp->start_index + 1;
150 sz = eina_list_count(event_slice_tmp->list);
151 event_slice_tmp->real_sz = event_slice_tmp->start_index + sz;
161 static void __cal_day_event_data_delete_event_slice_regions(cal_day_event_data_s* p)
165 cal_day_event_data_event_slice_region *even_slice_region = NULL;
168 EINA_LIST_FOREACH(p->event_slice_region_list, l, even_slice_region) {
169 if(even_slice_region)
170 free(even_slice_region);
173 p->event_slice_region_list = eina_list_free(p->event_slice_region_list);
176 static void __cal_day_event_data_delete_events(cal_day_event_data_s* p)
181 cal_day_event_data_event_slice *event_slice = NULL;
182 cal_day_event_data_event *event = NULL;
184 for (i = 0; i < EVENT_SLICE_COUNT; i++) {
186 event_slice = &p->event_slice_array[i];
189 if (event_slice->list) {
190 EINA_LIST_FOREACH(event_slice->list, l, event) {
192 if (((cal_base_data_item *)event)->text) {
193 CAL_FREE(((cal_base_data_item *)event)->text);
200 eina_list_free(event_slice->list);
201 event_slice->list = NULL;
206 static void __cal_day_event_data_delete_data_list(cal_base_data_h base_data)
208 c_ret_if(!base_data);
209 c_ret_if(!((cal_base_data_s *)base_data)->base_data_list);
211 cal_day_event_data_event *event = NULL;
214 EINA_LIST_FOREACH(((cal_base_data_s *)base_data)->base_data_list, l, event) {
216 if (!event->record) {
217 ((cal_base_data_s *)base_data)->base_data_list = eina_list_remove(((cal_base_data_s *)base_data)->base_data_list, event);
219 if (((cal_base_data_item *)event)->text) {
220 CAL_FREE(((cal_base_data_item *)event)->text);
228 eina_list_free(((cal_base_data_s *)base_data)->base_data_list);
230 ((cal_base_data_s *)base_data)->base_data_list = NULL;
233 static void __cal_day_event_data_create_event_dispaly_data_list(cal_day_event_data_s* p)
237 cal_day_event_data_event_slice_region *event_slice_region = NULL;
238 cal_day_event_data_event_slice *event_slice = NULL;
239 cal_day_event_data_event *event = NULL;
245 int width_radix = -1;
246 int column_index = -1;
248 cal_base_data_destroy_data_list(p);
250 EINA_LIST_FOREACH(p->event_slice_region_list, l, event_slice_region) {
251 if (event_slice_region) {
252 if (0 < event_slice_region->size) {
253 for ( i = event_slice_region->start_idx; i <= event_slice_region->end_idx; i++) {
255 event_slice = &p->event_slice_array[i];
256 if (EVEN_SLICE_MAX_EVENT_COUNT < event_slice_region->size) {
257 width_radix = EVEN_SLICE_MAX_EVENT_COUNT;
259 width_radix = event_slice_region->size;
262 column_index = event_slice->start_index;
264 EINA_LIST_FOREACH(event_slice->list, l2, event) {
266 if(column_index < EVEN_SLICE_MAX_EVENT_COUNT-1) {
267 ((cal_base_data_item *)event)->width_devider = width_radix;
268 ((cal_base_data_item *)event)->column_index = column_index;
270 ((cal_base_data_s *)p)->base_data_list = eina_list_append(((cal_base_data_s *)p)->base_data_list, event);
273 if (column_index == EVEN_SLICE_MAX_EVENT_COUNT-1) {
274 cal_day_event_data_event *event_more = __cal_day_event_data_create_more_event(p, event);
275 c_ret_if(!event_more);
277 ((cal_base_data_s *)p)->base_data_list = eina_list_append(((cal_base_data_s *)p)->base_data_list, event_more);
294 static void __cal_day_event_data_create_data_list(cal_base_data_h base_data)
296 c_ret_if(!base_data);
298 cal_day_event_data_s* p = (cal_day_event_data_s*)base_data;
303 cal_day_event_data_event_slice *event_slice = NULL;
304 cal_day_event_data_event_slice_region *event_slice_region = NULL;
306 __cal_day_event_data_init_event_slice_data(p);
308 __cal_day_event_data_delete_event_slice_regions(p);
310 while(i < EVENT_SLICE_COUNT) {
312 event_slice = &p->event_slice_array[i];
314 if(0 == event_slice->start_index) {
315 if(0 == event_slice->real_sz){
320 CAL_CALLOC(event_slice_region, 1, cal_day_event_data_event_slice_region);
322 event_slice_region->start_idx = i;
323 event_slice_region->end_idx = i;
324 event_slice_region->size = event_slice->real_sz;
326 if(EVENT_SLICE_COUNT == i+1) {
327 p->event_slice_region_list = eina_list_append(p->event_slice_region_list, event_slice_region);
330 for(j = i+1; j < EVENT_SLICE_COUNT; j++) {
331 event_slice = &p->event_slice_array[j];
333 if((j == EVENT_SLICE_COUNT - 1) && (0 != event_slice->start_index)) {
334 if(event_slice->real_sz > event_slice_region->size) {
335 event_slice_region->size = event_slice->real_sz;
337 event_slice_region->end_idx = j;
338 p->event_slice_region_list = eina_list_append(p->event_slice_region_list, event_slice_region);
339 } else if(0 == event_slice->start_index) {
340 event_slice_region->end_idx = j - 1;
341 p->event_slice_region_list = eina_list_append(p->event_slice_region_list, event_slice_region);
345 if(event_slice->real_sz > event_slice_region->size) {
346 event_slice_region->size = event_slice->real_sz;
351 if(EVENT_SLICE_COUNT <= j) {
357 __cal_day_event_data_create_event_dispaly_data_list(p);
360 static char* __cal_day_event_data_get_event_text(calendar_record_h record)
362 c_retv_if(!record, NULL);
365 char *title = _calendar_get_summary(record);
367 char *location = _calendar_get_location(record);
371 if (CAL_STRLEN(location)) {
372 text = g_strdup_printf("%s, %s", title, location);
382 static int __cal_day_event_data_sort_event(const void *d1, const void *d2)
384 const cal_base_data_item *t1 = d1;
385 const cal_base_data_item *t2 = d2;
392 return t1->height < t2->height ? 1 : -1;
395 static void __cal_day_event_data_insert_event_to_event_slice(cal_day_event_data_s* p, cal_day_event_data_event *event)
400 cal_day_event_data_event_slice *event_slice;
402 event_slice = &p->event_slice_array[((cal_base_data_item *)event)->line_index];
403 c_ret_if(!event_slice);
405 event_slice->list = eina_list_sorted_insert(event_slice->list, __cal_day_event_data_sort_event, event);
408 static cal_base_data_item_h __cal_day_event_data_create_item(cal_base_data_h base_data, void *data)
410 c_retv_if(!data, NULL);
411 c_retv_if(!base_data, NULL);
413 cal_day_event_data_s *p = (cal_day_event_data_s *)base_data;
415 c_retv_if(!p->ad, NULL);
417 calendar_record_h record = data;
419 cal_day_event_data_event *event;
420 calendar_time_s start_time = {0};
421 calendar_time_s end_time = {0};
424 cal_util_get_day_time_t(&p->ad->base_tm, &st, &et);
426 int cid = _calendar_get_record_index(record);
428 _calendar_get_start_time(record, &start_time);
429 _calendar_get_end_time(record, &end_time);
431 int hh = (start_time.time.utime - st)/CAL_SECONDS_FOR_THIRTY_MINUTES;
435 end_time.time.utime = ((end_time.time.utime - 1 - st)/CAL_SECONDS_FOR_THIRTY_MINUTES) + 1;
436 if (end_time.time.utime > CAL_HALF_HOURS_FOR_DAY)
437 end_time.time.utime = CAL_HALF_HOURS_FOR_DAY;
439 int sz = end_time.time.utime - hh;
443 CAL_CALLOC(event, 1, cal_day_event_data_event);
445 _calendar_get_calendar_color(record, &((cal_base_data_item *)event)->color);
446 ((cal_base_data_item *)event)->text = __cal_day_event_data_get_event_text(record);
447 ((cal_base_data_item *)event)->line_index = hh;
448 ((cal_base_data_item *)event)->height = sz;
449 ((cal_base_data_item *)event)->width_devider = -1;
450 ((cal_base_data_item *)event)->column_index = -1;
451 event->record = record;
457 static cal_day_event_data_event *__cal_day_event_data_find_event(cal_day_event_data_s* p, int cid)
462 cal_day_event_data_event_slice *even_slice;
463 cal_day_event_data_event *event;
467 for (i = 0; i < EVENT_SLICE_COUNT; i++) {
468 even_slice = &p->event_slice_array[i];
470 EINA_LIST_FOREACH(even_slice->list, l, event)
472 if (event && event->cid == cid)
480 static void __cal_day_event_data_add_event(cal_day_event_data_s* p, calendar_record_h record)
486 cal_day_event_data_event *event;
488 int cid = _calendar_get_record_index(record);
490 event = __cal_day_event_data_find_event(p, cid);
493 event->record = record;
497 event = __cal_day_event_data_create_item(p, record);
500 __cal_day_event_data_insert_event_to_event_slice(p, event);
503 static void __cal_day_event_data_add_events(cal_day_event_data_s* p)
506 c_ret_if(!p->event_list);
510 calendar_record_h record = NULL;
512 EINA_LIST_FOREACH(p->event_list, l, record) {
513 if (!_calendar_is_allday_record(record))
514 __cal_day_event_data_add_event(p, record);
518 static void __cal_day_event_data_load(cal_base_data_h day_event_data)
520 c_ret_if(!day_event_data);
521 cal_day_event_data_s* p = (cal_day_event_data_s*)day_event_data;
525 __cal_day_event_data_delete_event_slice_regions(p);
527 __cal_day_event_data_delete_events(p);
530 _calendar_free_record_list(&p->event_list);
532 struct tm tm_start = p->ad->base_tm;
533 tm_start.tm_hour = 0;
537 struct tm tm_end = tm_start;
542 p->event_list = _calendar_get_all_instance_list(&tm_start, &tm_end);
543 c_ret_if(!p->event_list);
545 __cal_day_event_data_add_events(p);
549 static void __cal_day_event_data_delete(cal_base_data_h base_data)
551 c_ret_if(!base_data);
553 cal_day_event_data_s* p = (cal_day_event_data_s*)base_data;
555 cal_base_data_destroy_data_list(p);
557 __cal_day_event_data_delete_event_slice_regions(p);
559 __cal_day_event_data_delete_events(p);
562 _calendar_free_record_list(&p->event_list);
567 calendar_record_h cal_day_event_data_get_event_record(cal_day_event_data_event_h event_data)
569 c_retv_if(!event_data, NULL);
571 cal_day_event_data_event* event_data_s = (cal_day_event_data_event*)event_data;
573 return event_data_s->record;
576 static void __cal_day_event_data_remove_event_form_event_slice(cal_day_event_data_s* p, cal_day_event_data_event* event)
581 cal_day_event_data_event_slice *event_slice;
583 event_slice = &p->event_slice_array[((cal_base_data_item *)event)->line_index];
585 event_slice->list = eina_list_remove(event_slice->list, event);
588 void cal_day_event_data_sort(cal_day_event_data_h day_event_data, cal_day_event_data_event_h event_data_h)
590 c_ret_if(!day_event_data);
591 c_ret_if(!event_data_h);
593 cal_day_event_data_s* p = (cal_day_event_data_s*)day_event_data;
594 cal_day_event_data_event* event_data = (cal_day_event_data_event*)event_data_h;
596 cal_day_event_data_event_slice *event_slice;
598 event_slice = &p->event_slice_array[((cal_base_data_item *)event_data)->line_index];
599 c_ret_if(!event_slice->list);
601 event_slice->list = eina_list_sort(event_slice->list, 0, __cal_day_event_data_sort_event);
604 void cal_day_event_data_update_event(cal_day_event_data_h day_event_data, cal_day_event_data_event_h event_data_h, int line_index, int height)
606 c_ret_if(!day_event_data);
607 c_ret_if(!event_data_h);
609 cal_day_event_data_s* p = (cal_day_event_data_s*)day_event_data;
611 cal_day_event_data_event *event_data = (cal_day_event_data_event*)event_data_h;
612 c_ret_if(!event_data->record);
614 time_t time_diff = (line_index - ((cal_base_data_item *)event_data)->line_index)*(30*60);
616 time_t time_diff_end = height*(30*60);
617 calendar_record_h record = NULL;
619 int cid = _calendar_get_record_index(event_data->record);
621 if (_calendar_get_record_type(event_data->record) == _CALENDAR_RECORD_TYPE_EVENT) {
622 record = event_data->record;
624 record = _calendar_get_record_with_index(cid);
627 calendar_time_s start_time = {0};
628 calendar_time_s end_time = {0};
630 _calendar_get_start_time(record, &start_time);
631 _calendar_get_end_time(record, &end_time);
633 start_time.time.utime += time_diff;
634 _calendar_set_start_time(record, &start_time);
636 start_time.time.utime += time_diff_end;
637 _calendar_set_end_time(record, &start_time);
639 cal_main_remove_db_changed_callback(p->ad);
641 calendar_error_e error = CALENDAR_ERROR_NONE;
643 error = calendar_db_update_record(record);
644 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_db_update_record() is faild(%x)", error);
646 if (event_data->record != record) {
647 error = calendar_record_destroy(record, true);
648 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_destroy() is faild(%x)", error);
651 cal_main_add_db_changed_callback(p->ad);
653 __cal_day_event_data_remove_event_form_event_slice(day_event_data, event_data_h);
654 cal_base_data_set_item_height(event_data_h, height);
655 cal_base_data_set_item_line_index(event_data_h, line_index);
656 __cal_day_event_data_insert_event_to_event_slice(p, event_data);