a6c85fec9d97d26407a66772889b997d4c43dfa4
[apps/core/preloaded/calendar.git] / src / day-event-block.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
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
8   *
9   *       http://floralicense.org/license/
10   *
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.
16   */
17 #include "day-event-block.h"
18
19 #define EVENT_BLOCK_EVENT_MIN_HEIGHT 79
20 #define EVENT_BLOCK_EVENT_MOVE_OFFSET 20
21
22 static const char *_name = "main/day/time/eventblock";
23
24 typedef struct {
25         cal_base_block_item block_item;
26
27         Eina_Bool is_long_pressed;
28
29         Evas_Object *event_border_rect;
30
31         Eina_Bool is_magnify_bottom_down;
32
33         Eina_Bool is_magnify_top_down;
34
35 } cal_day_event_block_event;
36
37
38 typedef struct {
39         cal_base_block_s base_block;
40
41         cal_day_event_block_event_h moveable_event_block;
42 } cal_day_event_block_s;
43
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);
49
50 static cal_base_block_operations event_block_operations= {
51         __cal_day_event_block_new,
52         NULL,
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,
57         NULL,
58 };
59
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)
61 {
62         c_ret_if(!base_block);
63         c_ret_if(!block_item);
64         c_ret_if(!base);
65
66         cal_day_event_block_s *p = (cal_day_event_block_s *)base_block;
67         c_ret_if(!p);
68         c_ret_if(p->moveable_event_block == block_item);
69
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);
72
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);
76
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);
79 }
80
81 static Evas_Object* __cal_day_event_block_create_item_layout(cal_base_block_h base_block, cal_base_data_item_h data_item)
82 {
83         c_retv_if(!base_block, NULL);
84
85         cal_base_block_s *p = base_block;
86         cal_day_event_data_event_h event_data = data_item;
87
88         Evas_Object *ly;
89         char *text = NULL;
90         _calendar_book_color color = {0};
91
92         ly = cal_util_add_layout(p->parent, p->name);
93         c_retv_if(!ly, NULL);
94
95         evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
96
97         evas_object_clip_set(ly, (Evas_Object*)p->clip);
98
99         text = cal_base_data_get_item_text(event_data);
100
101         if (text)
102                 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "text", text);
103
104
105         cal_base_data_get_item_color(event_data, &color);
106         evas_object_color_set(ly, color.red, color.green, color.blue, color.alpha);
107
108         return ly;
109 }
110
111 static cal_base_block_h __cal_day_event_block_item_new()
112 {
113         cal_day_event_block_event *event_block = NULL;
114         CAL_CALLOC(event_block, 1, cal_day_event_block_event);
115
116         return event_block;
117 }
118
119 static void __cal_day_event_block_item_delete(cal_base_block_h base_block)
120 {
121         c_ret_if(!base_block);
122
123         cal_day_event_block_event *event = (cal_day_event_block_event *)base_block;
124
125         if (((cal_base_block_item *)event)->ly) {
126                 evas_object_del(((cal_base_block_item *)event)->ly);
127         }
128
129         if (event->event_border_rect) {
130                 evas_object_del(event->event_border_rect);
131         }
132
133         free(event);
134 }
135
136 static void __cal_day_event_block_edje_callback(void *data, Evas_Object *obj, const char *e, const char *src)
137 {
138         c_ret_if(!data);
139
140         cal_day_event_block_event *event_block = data;
141
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;
145         }
146
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;
150         }
151
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;
155         }
156
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;
160         }
161
162 }
163
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)
165 {
166         c_ret_if(!base_block);
167         c_ret_if(!event_block_h);
168
169         Evas_Object *ly;
170         Evas_Coord_Rectangle event_r;
171
172         cal_base_block_s *p = (cal_base_block_s *)base_block;
173
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);
176
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);
179
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);
181
182         if (event_block->event_border_rect) {
183                 evas_object_del(event_block->event_border_rect);
184                 event_block->event_border_rect = NULL;
185         }
186
187         ly = cal_util_add_layout(p->parent, p->name);
188         c_ret_if(!ly);
189
190         evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
191
192         evas_object_clip_set(ly, (Evas_Object*)p->clip);
193
194         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "longpress,border", "prog");
195
196         cal_util_get_geometry(&event_r, ((cal_base_block_item *)event_block)->ly);
197
198         evas_object_resize(ly, event_r.w, event_r.h);
199         evas_object_move(ly, event_r.x, event_r.y);
200
201         evas_object_stack_below(ly, ((cal_base_block_item *)event_block)->ly);
202
203         event_block->event_border_rect = ly;
204
205 }
206
207 static cal_day_event_block_h __cal_day_event_block_new()
208 {
209         cal_day_event_block_s *p = NULL;
210
211         CAL_CALLOC(p, 1, cal_day_event_block_s);
212
213
214         ((cal_base_block_s *)p)->name = _name;
215
216         return p;
217 }
218
219 cal_day_event_block_h cal_day_event_block_create()
220 {
221         return cal_base_block_create(&event_block_operations);
222 }
223
224 static Eina_Bool __cal_day_event_block_check_coord_point_in_event_layout(Evas_Object *event_ly, Evas_Coord_Point *mouse_down_coord)
225 {
226         c_retv_if(!event_ly, EINA_FALSE);
227         c_retv_if(!mouse_down_coord, EINA_FALSE);
228
229         Evas_Coord_Rectangle event_r;
230
231         cal_util_get_geometry(&event_r, event_ly);
232
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) {
235                         return EINA_TRUE;
236                 }
237         }
238
239         return EINA_FALSE;
240 }
241
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)
243 {
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);
247
248         cal_base_block_s *p = (cal_base_block_s *)day_event_block;
249         c_retv_if(!p->base_block_list, EINA_FALSE);
250
251         Eina_List *l;
252
253         cal_base_block_item *event;
254
255         EINA_LIST_FOREACH(p->base_block_list, l, event) {
256                 if (event) {
257                         if (event->ly) {
258                                 Eina_Bool is_clicked = __cal_day_event_block_check_coord_point_in_event_layout(event->ly, mouse_down_coord);
259
260                                 if (is_clicked) {
261                                         (*record) = cal_day_event_data_get_event_record(event->item_data);
262                                         return EINA_TRUE;
263                                 }
264                         }
265                 }
266         }
267
268         return EINA_FALSE;
269 }
270
271 Eina_Bool cal_day_event_block_hint_longpress(cal_day_event_block_h day_event_block, Evas_Coord_Point *mouse_down_coord)
272 {
273         c_retv_if(!day_event_block, EINA_FALSE);
274         c_retv_if(!mouse_down_coord, EINA_FALSE);
275
276         cal_base_block_s *p = (cal_base_block_s *)day_event_block;
277         c_retv_if(!p->base_block_list, EINA_FALSE);
278
279         Eina_List *l;
280
281         cal_base_block_item *event;
282
283         EINA_LIST_FOREACH(p->base_block_list, l, event) {
284                 if (event) {
285                         if (event->ly) {
286                                 Eina_Bool is_longpressed = __cal_day_event_block_check_coord_point_in_event_layout(event->ly, mouse_down_coord);
287
288                                 if (is_longpressed) {
289                                         calendar_record_h record = cal_day_event_data_get_event_record(event->item_data);
290                                         if (record) {
291                                                 ((cal_day_event_block_s *)p)->moveable_event_block = (cal_day_event_block_event_h)event;
292                                                 return EINA_TRUE;
293                                         }
294                                 }
295                         }
296                 }
297         }
298
299         return EINA_FALSE;
300 }
301
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)
303 {
304         c_retv_if(!day_event_block, EINA_FALSE);
305         c_retv_if(!mouse_down_coord, EINA_FALSE);
306
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);
309
310         cal_base_block_item *event = (cal_base_block_item *)p->moveable_event_block;
311         c_retv_if(!event->ly, EINA_FALSE);
312
313         Eina_Bool is_clicked = __cal_day_event_block_check_coord_point_in_event_layout(event->ly, mouse_down_coord);
314
315         return is_clicked;
316 }
317
318 void cal_day_event_block_longpress_callback(cal_day_event_block_h day_event_block)
319 {
320         c_ret_if(!day_event_block);
321
322         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
323
324         __cal_day_event_block_add_event_border_rect(p, p->moveable_event_block);
325 }
326
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)
328 {
329         c_ret_if(!day_event_block);
330         c_ret_if(!moveable_event);
331         c_ret_if(!moveable_event_border);
332
333         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
334
335         c_ret_if(!p->moveable_event_block);
336
337         cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
338
339         (*moveable_event) = ((cal_base_block_item *)event)->ly;
340         (*moveable_event_border) = event->event_border_rect;
341 }
342
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)
344 {
345         c_ret_if(!day_event_block);
346         c_ret_if(!event_r);
347         c_ret_if(!event_b_r);
348
349         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
350
351         c_ret_if(!p->moveable_event_block);
352
353         cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
354
355         if (((cal_base_block_item *)event)->ly) {
356                 cal_util_get_geometry(event_r, ((cal_base_block_item *)event)->ly);
357         }
358
359         if (event->event_border_rect) {
360                 cal_util_get_geometry(event_b_r, event->event_border_rect);
361         }
362 }
363
364
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)
366 {
367         c_ret_if(!day_event_block);
368         c_ret_if(!is_magnify_bottom_down);
369         c_ret_if(!is_magnify_top_down);
370
371         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
372         c_ret_if(!p->moveable_event_block);
373
374         cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
375
376         (*is_magnify_bottom_down) = event->is_magnify_bottom_down;
377         (*is_magnify_top_down) = event->is_magnify_top_down;
378 }
379
380 int cal_day_event_block_get_moveable_event_original_line_index(cal_day_event_block_h day_event_block)
381 {
382         c_retv_if(!day_event_block, -1);
383
384         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
385
386         c_retv_if(!p->moveable_event_block, -1);
387
388         return cal_base_data_get_item_line_index(p->moveable_event_block);
389 }
390
391 static void  __cal_day_event_block_clear_moveable_event_state(cal_day_event_block_h day_event_block)
392 {
393         c_ret_if(!day_event_block);
394
395         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
396
397         c_ret_if(!p->moveable_event_block);
398
399         cal_day_event_block_event *event = (cal_day_event_block_event *)p->moveable_event_block;
400
401         edje_object_signal_callback_del(CAL_UTIL_GET_EDJ_DATA(((cal_base_block_item *)event)->ly), "*", "edj", __cal_day_event_block_edje_callback);
402
403         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_block_item *)event)->ly), "longpress,off", "prog");
404
405         if (event->event_border_rect) {
406                 evas_object_del(event->event_border_rect);
407                 event->event_border_rect = NULL;
408         }
409
410         p->moveable_event_block = NULL;
411 }
412
413 void cal_day_event_block_update_moveable_event(cal_day_event_block_h day_event_block, int line_index, int height)
414 {
415         c_ret_if(!day_event_block);
416
417         cal_day_event_block_s *p = (cal_day_event_block_s *)day_event_block;
418         c_ret_if(!p->moveable_event_block);
419
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);
422
423         cal_day_event_data_update_event(((cal_base_block_s *)p)->base_data, ((cal_base_block_item *)event)->item_data, line_index, height);
424
425         __cal_day_event_block_clear_moveable_event_state(day_event_block);
426
427         cal_base_block_destroy_block_list(p);
428
429         cal_base_data_create_data_list(((cal_base_block_s *)p)->base_data);
430
431         cal_base_block_create_block_list(p);
432 }
433
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)
435 {
436         c_ret_if(!day_event_block);
437         c_ret_if(!mouse_move_coord);
438         c_ret_if(!mouse_down_coord);
439         c_ret_if(!callback);
440
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);
444
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);
449
450         Evas_Coord_Rectangle scroller_r, event_r, event_b_r;
451
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);
455
456         Evas_Coord dy = mouse_move_coord->y - mouse_down_coord->y;
457         mouse_down_coord->y = mouse_move_coord->y;
458
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;
463
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;
467                 } else {
468                         event_height = event_r.h + event_r.y - mouse_move_coord->y;
469                 }
470
471                 if (event_height <= EVENT_BLOCK_EVENT_MIN_HEIGHT) {
472                         event_height = EVENT_BLOCK_EVENT_MIN_HEIGHT;
473                 }
474
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;
482                                 } else {
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;
487                                 }
488                         }
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);
496                                 } else {
497                                         int tmp;
498
499                                         time_block_new_y = time_block_y - EVENT_BLOCK_EVENT_MOVE_OFFSET;
500
501                                         if (event_r.h -  EVENT_BLOCK_EVENT_MOVE_OFFSET < EVENT_BLOCK_EVENT_MIN_HEIGHT) {
502                                                 tmp = EVENT_BLOCK_EVENT_MIN_HEIGHT;
503                                         } else {
504                                                 tmp = event_r.h - EVENT_BLOCK_EVENT_MOVE_OFFSET;
505                                         }
506
507                                         event_height = tmp;
508
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;
512                                         } else {
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;
515                                         }
516                                 }
517                         }
518                 } else {
519                         event_y = event_r.y + event_r.h - event_height;
520                 }
521
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;
525                 } else {
526                         event_height = event_r.h - event_r.y - event_r.h + mouse_move_coord->y;
527                 }
528
529                 if (event_height <= EVENT_BLOCK_EVENT_MIN_HEIGHT) {
530                         event_height = EVENT_BLOCK_EVENT_MIN_HEIGHT;
531                 }
532
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;
540                                 } else {
541                                         int tmp;
542
543                                         time_block_new_y = time_block_y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
544
545                                         if ((scroller_r.y -  event_r.y) < EVENT_BLOCK_EVENT_MIN_HEIGHT) {
546                                                 tmp = EVENT_BLOCK_EVENT_MIN_HEIGHT;
547                                         } else {
548                                                 tmp = scroller_r.y -  event_r.y;
549                                         }
550
551                                         event_height = tmp;
552                                         event_y = event_r.y  + EVENT_BLOCK_EVENT_MOVE_OFFSET;
553                                         event_border_y = event_b_r.y + EVENT_BLOCK_EVENT_MOVE_OFFSET;
554                                 }
555
556                         }
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);
564
565                                 } else {
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;
569                                 }
570                         }
571                 }
572         } else {
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;
579                                 } else {
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;
582                                 }
583                         } else {
584                                 event_y = event_r.y + dy;
585                         }
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);
592                                 } else {
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;
595                                 }
596                         } else {
597                                 event_y = event_r.y + dy;
598                         }
599                 } else {
600                         event_y = event_r.y + dy;
601                 }
602
603                 if (event_y <= time_block_new_y) {
604                         event_y = time_block_new_y;
605                 }
606
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;
609                 }
610         }
611
612         (*callback)(usr_data, time_block_new_y);
613
614         evas_object_resize(((cal_base_block_item *)event)->ly, event_r.w, event_height);
615
616         evas_object_move(((cal_base_block_item *)event)->ly, event_r.x, event_y);
617
618         evas_object_move(event->event_border_rect, event_b_r.x, event_border_y);
619 }