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.
17 #include "day-event-block.h"
19 #define EVENT_BLOCK_EVENT_MIN_HEIGHT 79
20 #define EVENT_BLOCK_EVENT_MOVE_OFFSET 20
22 static const char *_name = "main/day/time/eventblock";
25 cal_base_block_item block_item;
27 Eina_Bool is_long_pressed;
29 Evas_Object *event_border_rect;
31 Eina_Bool is_magnify_bottom_down;
33 Eina_Bool is_magnify_top_down;
35 } cal_day_event_block_event;
39 cal_base_block_s base_block;
41 cal_day_event_block_event_h moveable_event_block;
42 } cal_day_event_block_s;
44 static cal_base_block_h __cal_day_event_block_new();
45 static cal_base_block_h __cal_day_event_block_item_new();
46 static void __cal_day_event_block_item_delete(cal_base_block_h base_block);
47 static Evas_Object* __cal_day_event_block_create_item_layout(cal_base_block_h base_block, cal_base_data_item_h data_item);
48 static void __cal_day_event_block_move_item_layout(cal_base_block_h base_block, cal_base_block_item_h block_item, Evas_Coord_Rectangle *base);
50 static cal_base_block_operations event_block_operations= {
51 __cal_day_event_block_new,
53 __cal_day_event_block_item_new,
54 __cal_day_event_block_item_delete,
55 __cal_day_event_block_create_item_layout,
56 __cal_day_event_block_move_item_layout,
60 static void __cal_day_event_block_move_item_layout(cal_base_block_h base_block, cal_base_block_item_h block_item, Evas_Coord_Rectangle *base)
62 c_ret_if(!base_block);
63 c_ret_if(!block_item);
66 cal_day_event_block_s *p = (cal_day_event_block_s *)base_block;
68 c_ret_if(p->moveable_event_block == block_item);
70 cal_day_event_block_event *event_s = (cal_day_event_block_event *)block_item;
71 c_ret_if(!((cal_base_block_item *)event_s)->item_data);
73 int width_devider = cal_base_data_get_item_width_devider(((cal_base_block_item *)event_s)->item_data);
74 int cloumn_index = cal_base_data_get_item_cloumn_index(((cal_base_block_item *)event_s)->item_data);
75 int height = cal_base_data_get_item_height(((cal_base_block_item *)event_s)->item_data);
77 evas_object_resize(((cal_base_block_item *)event_s)->ly, base->w/width_devider, base->h * height);
78 evas_object_move(((cal_base_block_item *)event_s)->ly, base->x + (cloumn_index* base->w/width_devider), base->y);
81 static Evas_Object* __cal_day_event_block_create_item_layout(cal_base_block_h base_block, cal_base_data_item_h data_item)
83 c_retv_if(!base_block, NULL);
85 cal_base_block_s *p = base_block;
86 cal_day_event_data_event_h event_data = data_item;
90 _calendar_book_color color = {0};
92 ly = cal_util_add_layout(p->parent, p->name);
95 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
97 evas_object_clip_set(ly, (Evas_Object*)p->clip);
99 text = cal_base_data_get_item_text(event_data);
102 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "text", text);
105 cal_base_data_get_item_color(event_data, &color);
106 evas_object_color_set(ly, color.red, color.green, color.blue, color.alpha);
111 static cal_base_block_h __cal_day_event_block_item_new()
113 cal_day_event_block_event *event_block = NULL;
114 CAL_CALLOC(event_block, 1, cal_day_event_block_event);
119 static void __cal_day_event_block_item_delete(cal_base_block_h base_block)
121 c_ret_if(!base_block);
123 cal_day_event_block_event *event = (cal_day_event_block_event *)base_block;
125 if (((cal_base_block_item *)event)->ly) {
126 evas_object_del(((cal_base_block_item *)event)->ly);
129 if (event->event_border_rect) {
130 evas_object_del(event->event_border_rect);
136 static void __cal_day_event_block_edje_callback(void *data, Evas_Object *obj, const char *e, const char *src)
140 cal_day_event_block_event *event_block = data;
142 if (!CAL_STRCMP(e, "mg,bottom,dn")) {
143 event_block->is_magnify_top_down = EINA_FALSE;
144 event_block->is_magnify_bottom_down = EINA_TRUE;
147 if (!CAL_STRCMP(e, "mg,bottom,up")) {
148 event_block->is_magnify_top_down = EINA_FALSE;
149 event_block->is_magnify_bottom_down = EINA_FALSE;
152 if (!CAL_STRCMP(e, "mg,top,dn")) {
153 event_block->is_magnify_bottom_down = EINA_FALSE;
154 event_block->is_magnify_top_down = EINA_TRUE;
157 if (!CAL_STRCMP(e, "mg,top,up")) {
158 event_block->is_magnify_top_down = EINA_FALSE;
159 event_block->is_magnify_bottom_down = EINA_FALSE;
164 static void __cal_day_event_block_add_event_border_rect(cal_base_block_h base_block, cal_day_event_block_event_h event_block_h)
166 c_ret_if(!base_block);
167 c_ret_if(!event_block_h);
170 Evas_Coord_Rectangle event_r;
172 cal_base_block_s *p = (cal_base_block_s *)base_block;
174 cal_day_event_block_event *event_block = (cal_day_event_block_event *)event_block_h;
175 c_ret_if(!((cal_base_block_item *)event_block)->ly);
177 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_block_item *)event_block)->ly), "longpress,on", "prog");
178 evas_object_raise(((cal_base_block_item *)event_block)->ly);
180 edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(((cal_base_block_item *)event_block)->ly), "*", "edj", __cal_day_event_block_edje_callback, event_block);
182 if (event_block->event_border_rect) {
183 evas_object_del(event_block->event_border_rect);
184 event_block->event_border_rect = NULL;
187 ly = cal_util_add_layout(p->parent, p->name);
190 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
192 evas_object_clip_set(ly, (Evas_Object*)p->clip);
194 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "longpress,border", "prog");
196 cal_util_get_geometry(&event_r, ((cal_base_block_item *)event_block)->ly);
198 evas_object_resize(ly, event_r.w, event_r.h);
199 evas_object_move(ly, event_r.x, event_r.y);
201 evas_object_stack_below(ly, ((cal_base_block_item *)event_block)->ly);
203 event_block->event_border_rect = ly;
207 static cal_day_event_block_h __cal_day_event_block_new()
209 cal_day_event_block_s *p = NULL;
211 CAL_CALLOC(p, 1, cal_day_event_block_s);
214 ((cal_base_block_s *)p)->name = _name;
219 cal_day_event_block_h cal_day_event_block_create()
221 return cal_base_block_create(&event_block_operations);
224 static Eina_Bool __cal_day_event_block_check_coord_point_in_event_layout(Evas_Object *event_ly, Evas_Coord_Point *mouse_down_coord)
226 c_retv_if(!event_ly, EINA_FALSE);
227 c_retv_if(!mouse_down_coord, EINA_FALSE);
229 Evas_Coord_Rectangle event_r;
231 cal_util_get_geometry(&event_r, event_ly);
233 if (event_r.x <= mouse_down_coord->x && mouse_down_coord->x <= event_r.x + event_r.w) {
234 if (event_r.y <= mouse_down_coord->y && mouse_down_coord->y <= event_r.y + event_r.h) {
242 Eina_Bool cal_day_event_block_hint_clicked(cal_day_event_block_h day_event_block, Evas_Coord_Point *mouse_down_coord, calendar_record_h *record)
244 c_retv_if(!day_event_block, EINA_FALSE);
245 c_retv_if(!mouse_down_coord, EINA_FALSE);
246 c_retv_if(!record, EINA_FALSE);
248 cal_base_block_s *p = (cal_base_block_s *)day_event_block;
249 c_retv_if(!p->base_block_list, EINA_FALSE);
253 cal_base_block_item *event;
255 EINA_LIST_FOREACH(p->base_block_list, l, event) {
258 Eina_Bool is_clicked = __cal_day_event_block_check_coord_point_in_event_layout(event->ly, mouse_down_coord);
261 (*record) = cal_day_event_data_get_event_record(event->item_data);
271 Eina_Bool cal_day_event_block_hint_longpress(cal_day_event_block_h day_event_block, Evas_Coord_Point *mouse_down_coord)
273 c_retv_if(!day_event_block, EINA_FALSE);
274 c_retv_if(!mouse_down_coord, EINA_FALSE);
276 cal_base_block_s *p = (cal_base_block_s *)day_event_block;
277 c_retv_if(!p->base_block_list, EINA_FALSE);
281 cal_base_block_item *event;
283 EINA_LIST_FOREACH(p->base_block_list, l, event) {
286 Eina_Bool is_longpressed = __cal_day_event_block_check_coord_point_in_event_layout(event->ly, mouse_down_coord);
288 if (is_longpressed) {
289 calendar_record_h record = cal_day_event_data_get_event_record(event->item_data);
291 ((cal_day_event_block_s *)p)->moveable_event_block = (cal_day_event_block_event_h)event;
302 Eina_Bool cal_day_event_block_hint_quit_event_moveable_state(cal_day_event_block_h day_event_block, Evas_Coord_Point *mouse_down_coord)
304 c_retv_if(!day_event_block, EINA_FALSE);
305 c_retv_if(!mouse_down_coord, EINA_FALSE);
307 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
308 c_retv_if(!p->moveable_event_block, EINA_FALSE);
310 cal_base_block_item *event = (cal_base_block_item *)p->moveable_event_block;
311 c_retv_if(!event->ly, EINA_FALSE);
313 Eina_Bool is_clicked = __cal_day_event_block_check_coord_point_in_event_layout(event->ly, mouse_down_coord);
318 void cal_day_event_block_longpress_callback(cal_day_event_block_h day_event_block)
320 c_ret_if(!day_event_block);
322 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
324 __cal_day_event_block_add_event_border_rect(p, p->moveable_event_block);
327 void cal_day_event_block_get_moveable_event_objects(cal_day_event_block_h day_event_block, Evas_Object **moveable_event, Evas_Object **moveable_event_border)
329 c_ret_if(!day_event_block);
330 c_ret_if(!moveable_event);
331 c_ret_if(!moveable_event_border);
333 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
335 c_ret_if(!p->moveable_event_block);
337 cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
339 (*moveable_event) = ((cal_base_block_item *)event)->ly;
340 (*moveable_event_border) = event->event_border_rect;
343 void cal_day_event_block_get_moveable_event_geometry(cal_day_event_block_h day_event_block, Evas_Coord_Rectangle *event_r, Evas_Coord_Rectangle *event_b_r)
345 c_ret_if(!day_event_block);
347 c_ret_if(!event_b_r);
349 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
351 c_ret_if(!p->moveable_event_block);
353 cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
355 if (((cal_base_block_item *)event)->ly) {
356 cal_util_get_geometry(event_r, ((cal_base_block_item *)event)->ly);
359 if (event->event_border_rect) {
360 cal_util_get_geometry(event_b_r, event->event_border_rect);
365 void cal_day_event_block_get_moveable_event_state(cal_day_event_block_h day_event_block, Eina_Bool *is_magnify_bottom_down, Eina_Bool *is_magnify_top_down)
367 c_ret_if(!day_event_block);
368 c_ret_if(!is_magnify_bottom_down);
369 c_ret_if(!is_magnify_top_down);
371 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
372 c_ret_if(!p->moveable_event_block);
374 cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
376 (*is_magnify_bottom_down) = event->is_magnify_bottom_down;
377 (*is_magnify_top_down) = event->is_magnify_top_down;
380 int cal_day_event_block_get_moveable_event_original_line_index(cal_day_event_block_h day_event_block)
382 c_retv_if(!day_event_block, -1);
384 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
386 c_retv_if(!p->moveable_event_block, -1);
388 return cal_base_data_get_item_line_index(p->moveable_event_block);
391 static void __cal_day_event_block_clear_moveable_event_state(cal_day_event_block_h day_event_block)
393 c_ret_if(!day_event_block);
395 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
397 c_ret_if(!p->moveable_event_block);
399 cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
401 edje_object_signal_callback_del(CAL_UTIL_GET_EDJ_DATA(((cal_base_block_item *)event)->ly), "*", "edj", __cal_day_event_block_edje_callback);
403 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_block_item *)event)->ly), "longpress,off", "prog");
405 if (event->event_border_rect) {
406 evas_object_del(event->event_border_rect);
407 event->event_border_rect = NULL;
410 p->moveable_event_block = NULL;
413 void cal_day_event_block_update_moveable_event(cal_day_event_block_h day_event_block, int line_index, int height)
415 c_ret_if(!day_event_block);
417 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
418 c_ret_if(!p->moveable_event_block);
420 cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
421 c_ret_if(!((cal_base_block_item *)event)->item_data);
423 cal_day_event_data_update_event(((cal_base_block_s *)p)->base_data, ((cal_base_block_item *)event)->item_data, line_index, height);
425 __cal_day_event_block_clear_moveable_event_state(day_event_block);
427 cal_base_block_destroy_block_list(p);
429 cal_base_data_create_data_list(((cal_base_block_s *)p)->base_data);
431 cal_base_block_create_block_list(p);
434 void cal_day_event_block_moving_moveable_event(cal_day_event_block_h day_event_block, Evas_Coord_Point *mouse_move_coord, Evas_Coord_Point *mouse_down_coord, cal_day_event_block_moving_event_cb callback, void *usr_data, Evas_Coord time_block_y, Evas_Coord time_block_h)
436 c_ret_if(!day_event_block);
437 c_ret_if(!mouse_move_coord);
438 c_ret_if(!mouse_down_coord);
441 cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
442 c_ret_if(!p->moveable_event_block);
443 c_ret_if(!((cal_base_block_s *)p)->parent);
445 cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
446 c_ret_if(!((cal_base_block_item *)event)->item_data);
447 c_ret_if(!((cal_base_block_item *)event)->ly);
448 c_ret_if(!event->event_border_rect);
450 Evas_Coord_Rectangle scroller_r, event_r, event_b_r;
452 cal_util_get_geometry(&event_r, ((cal_base_block_item *)event)->ly);
453 cal_util_get_geometry(&event_b_r, event->event_border_rect);
454 cal_util_get_geometry(&scroller_r, ((cal_base_block_s *)p)->parent);
456 Evas_Coord dy = mouse_move_coord->y - mouse_down_coord->y;
457 mouse_down_coord->y = mouse_move_coord->y;
459 int event_height = event_r.h;
460 int event_y = event_r.y;
461 int event_border_y = event_b_r.y;
462 int time_block_new_y = time_block_y;
464 if (event->is_magnify_top_down) {
465 if (event_r.y + event_r.h <= mouse_move_coord->y) {
466 event_height = EVENT_BLOCK_EVENT_MIN_HEIGHT;
468 event_height = event_r.h + event_r.y - mouse_move_coord->y;
471 if (event_height <= EVENT_BLOCK_EVENT_MIN_HEIGHT) {
472 event_height = EVENT_BLOCK_EVENT_MIN_HEIGHT;
475 if (mouse_move_coord->y <= scroller_r.y) {
476 if (event_r.y + event_r.h - event_height <= scroller_r.y) {
477 if (scroller_r.y <= time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET) {
478 time_block_new_y = scroller_r.y;
479 event_height = event_r.y + event_r.h - scroller_r.y;
480 event_y = scroller_r.y;
481 event_border_y = event_b_r.y + scroller_r.y - time_block_y;
483 time_block_new_y = time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
484 event_height = event_r.h + EVENT_BLOCK_EVENT_MOVE_OFFSET;
485 event_y = scroller_r.y;
486 event_border_y = event_b_r.y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
489 } else if (scroller_r.y + scroller_r.h <= mouse_move_coord->y) {
490 if (scroller_r.y + scroller_r.h < event_r.y + event_r.h) {
491 if (time_block_y + time_block_h - EVENT_BLOCK_EVENT_MOVE_OFFSET <= scroller_r.y + scroller_r.h) {
492 time_block_new_y = scroller_r.y + scroller_r.h - time_block_h;
493 event_height = scroller_r.y + scroller_r.h - event_r.y;
494 event_y = event_r.y- (time_block_y - scroller_r.y - scroller_r.h + time_block_h);
495 event_border_y = event_b_r.y - (time_block_y + time_block_h - scroller_r.y - scroller_r.h);
499 time_block_new_y = time_block_y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
501 if (event_r.h - EVENT_BLOCK_EVENT_MOVE_OFFSET < EVENT_BLOCK_EVENT_MIN_HEIGHT) {
502 tmp = EVENT_BLOCK_EVENT_MIN_HEIGHT;
504 tmp = event_r.h - EVENT_BLOCK_EVENT_MOVE_OFFSET;
509 if (tmp == EVENT_BLOCK_EVENT_MIN_HEIGHT) {
510 event_y = scroller_r.y + scroller_r.h - EVENT_BLOCK_EVENT_MIN_HEIGHT;
511 event_border_y = event_b_r.y - EVENT_BLOCK_EVENT_MIN_HEIGHT;
513 event_y = scroller_r.y + scroller_r.h - EVENT_BLOCK_EVENT_MOVE_OFFSET;
514 event_border_y = event_b_r.y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
519 event_y = event_r.y + event_r.h - event_height;
522 } else if (event->is_magnify_bottom_down) {
523 if (mouse_move_coord->y <= event_r.y) {
524 event_height = EVENT_BLOCK_EVENT_MIN_HEIGHT;
526 event_height = event_r.h - event_r.y - event_r.h + mouse_move_coord->y;
529 if (event_height <= EVENT_BLOCK_EVENT_MIN_HEIGHT) {
530 event_height = EVENT_BLOCK_EVENT_MIN_HEIGHT;
533 if (mouse_move_coord->y <= scroller_r.y) {
534 if (event_r.y <= scroller_r.y) {
535 if (scroller_r.y <= time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET) {
536 time_block_new_y = scroller_r.y;
537 event_height = event_height;
538 event_y = event_r.y + scroller_r.y - time_block_y;
539 event_border_y = event_b_r.y + scroller_r.y - time_block_y;
543 time_block_new_y = time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
545 if ((scroller_r.y - event_r.y) < EVENT_BLOCK_EVENT_MIN_HEIGHT) {
546 tmp = EVENT_BLOCK_EVENT_MIN_HEIGHT;
548 tmp = scroller_r.y - event_r.y;
552 event_y = event_r.y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
553 event_border_y = event_b_r.y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
557 } else if (scroller_r.y + scroller_r.h <= mouse_move_coord->y) {
558 if (scroller_r.y + scroller_r.h <= event_r.y + event_height) {
559 if (time_block_y + time_block_h - EVENT_BLOCK_EVENT_MOVE_OFFSET <= scroller_r.y + scroller_r.h) {
560 time_block_new_y = scroller_r.y + scroller_r.h -time_block_h;
561 event_height = scroller_r.y + scroller_r.h - event_r.y;
562 event_y = event_r.y- (time_block_y - scroller_r.y - scroller_r.h + time_block_h);
563 event_border_y = event_b_r.y - (time_block_y + time_block_h - scroller_r.y - scroller_r.h);
566 time_block_new_y = time_block_y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
567 event_y = event_r.y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
568 event_border_y = event_b_r.y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
573 if (mouse_move_coord->y <= scroller_r.y) {
574 if ( event_r.y <= scroller_r.y ) {
575 if (scroller_r.y <= time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET) {
576 time_block_new_y = scroller_r.y;
577 event_y = scroller_r.y;
578 event_border_y = event_b_r.y + scroller_r.y - time_block_y;
580 time_block_new_y = time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
581 event_border_y = event_b_r.y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
584 event_y = event_r.y + dy;
586 } else if (scroller_r.y + scroller_r.h <= mouse_move_coord->y) {
587 if ( scroller_r.y + scroller_r.h <= event_r.y + event_r.h ) {
588 if (time_block_y + time_block_h -EVENT_BLOCK_EVENT_MOVE_OFFSET <= scroller_r.y + scroller_r.h) {
589 time_block_new_y = scroller_r.y + scroller_r.h - time_block_h;
590 event_y = scroller_r.y + scroller_r.h - event_r.h;
591 event_border_y = event_b_r.y - (time_block_y + time_block_h - scroller_r.y - scroller_r.h);
593 time_block_new_y = time_block_y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
594 event_border_y = event_b_r.y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
597 event_y = event_r.y + dy;
600 event_y = event_r.y + dy;
603 if (event_y <= time_block_new_y) {
604 event_y = time_block_new_y;
607 if (time_block_new_y + time_block_h <= event_y + event_height) {
608 event_y = time_block_new_y + time_block_h - event_height;
612 (*callback)(usr_data, time_block_new_y);
614 evas_object_resize(((cal_base_block_item *)event)->ly, event_r.w, event_height);
616 evas_object_move(((cal_base_block_item *)event)->ly, event_r.x, event_y);
618 evas_object_move(event->event_border_rect, event_b_r.x, event_border_y);