74acf2c357ec0ca09130c9d7dd966d0878106d89
[apps/core/preloaded/calendar.git] / src / base-time.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 "base-time.h"
18 #include "day-time.h"
19
20 static void __cal_base_time_add_content_objects(cal_base_time_s *p);
21 static void __cal_base_time_delete(void *data, Evas *e, Evas_Object *obj, void *ei);
22 static void __cal_base_time_resize_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
23 static void __cal_base_time_base_layout_move_cb(void *data, Evas *e, Evas_Object *obj, void *ei);
24 static void __cal_base_time_mouse_down_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
25 static void __cal_base_time_mouse_up_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
26 static void __cal_base_time_mouse_move_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
27 static void __cal_base_time_mouse_out_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
28 static void __cal_base_time_multi_up_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
29 static void __cal_base_time_multi_move_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
30 static void __cal_base_time_multi_down_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei);
31 static void __cal_base_time_scroller_drag_start(void *data, Evas_Object *obj, void *event_info);
32
33 cal_base_time_h cal_base_time_new(cal_base_type type, Evas_Object *parent, int current_hour, Evas_Object **time_obj, void *data, int event_flag)
34 {
35         cal_base_time_h base_time = NULL;
36
37         switch (type) {
38                 case _CAL_BASE_TYPE_EVENT:
39                         base_time = cal_day_time_create(data);
40                         break;
41
42                 default:
43                         break;
44         }
45         c_retv_if(!base_time, NULL);
46
47         cal_base_time_s *p = (cal_base_time_s *)base_time;
48
49         p->base_type = type;
50         p->parent = parent;
51
52         Evas_Object *ly = cal_util_add_layout(parent, p->name);
53         if (ly == NULL) {
54                 ERR("cal_util_add_layout failed!");
55                 free(p);
56                 return NULL;
57         }
58
59         p->ly = ly;
60         evas_object_data_set(ly, "priv", p);
61
62         p->clip = (Evas_Object*)edje_object_part_object_get(CAL_UTIL_GET_EDJ_DATA(ly), "clip");
63         p->clip_block = (Evas_Object*)edje_object_part_object_get(CAL_UTIL_GET_EDJ_DATA(ly), "clip/block");
64
65         __cal_base_time_add_content_objects(p);
66
67         p->base_time_block = cal_base_time_block_new(type, p->scroller, p->clip, p->clip_block, current_hour, data);
68
69         if (!p->base_time_block) {
70                 ERR("cal_time_block_create_time_block failed!");
71                 free(p);
72                 return NULL;
73         }
74
75         (*time_obj) = p->ly;
76
77         evas_object_event_callback_add(ly, EVAS_CALLBACK_RESIZE, __cal_base_time_resize_callback, p);
78         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_base_time_delete, p);
79         evas_object_event_callback_add(p->base, EVAS_CALLBACK_MOVE, __cal_base_time_base_layout_move_cb, p);
80
81         if (ENABLE_MOUSE_DOWN_FLAG & event_flag) {
82                 evas_object_event_callback_add(p->event_rectangle, EVAS_CALLBACK_MOUSE_DOWN, __cal_base_time_mouse_down_event_callback, p);
83         }
84
85         if (ENABLE_MOUSE_UP_FLAG & event_flag) {
86                 evas_object_event_callback_add(p->event_rectangle, EVAS_CALLBACK_MOUSE_UP, __cal_base_time_mouse_up_event_callback, p);
87         }
88
89         if (ENABLE_MOUSE_MOVE_FLAG & event_flag) {
90                 evas_object_event_callback_add(p->event_rectangle, EVAS_CALLBACK_MOUSE_MOVE,__cal_base_time_mouse_move_event_callback, p);
91         }
92
93         if (ENABLE_MOUSE_OUT_FLAG & event_flag) {
94                 evas_object_event_callback_add(p->event_rectangle, EVAS_CALLBACK_MOUSE_OUT, __cal_base_time_mouse_out_event_callback, p);
95         }
96
97         if (ENABLE_GRAG_START_FLAG & event_flag) {
98                 evas_object_smart_callback_add(p->scroller, "scroll,drag,start", __cal_base_time_scroller_drag_start, p);
99         }
100
101         if (p->base_operations.init_func_ptr) {
102                 p->base_operations.init_func_ptr(base_time);
103         }
104
105         return base_time;
106 }
107
108 cal_base_time_h cal_base_time_create(cal_base_time_operations *base_operations, void *data)
109 {
110         c_retv_if(!base_operations, NULL);
111         c_retv_if(!base_operations->new_func_ptr, NULL);
112
113         cal_base_time_h base_time = base_operations->new_func_ptr(data);
114         c_retv_if(!base_time , NULL);
115
116         cal_base_time_s *p =  (cal_base_time_s *)base_time;
117
118         p->base_operations.new_func_ptr = base_operations->new_func_ptr;
119         p->base_operations.delete_func_ptr = base_operations->delete_func_ptr;
120         p->base_operations.init_func_ptr = base_operations->init_func_ptr;
121         p->base_operations.state_transition_func_ptr = base_operations->state_transition_func_ptr;
122         p->base_operations.state_actions_func_ptr = base_operations->state_actions_func_ptr;
123         p->base_operations.update_func_ptr = base_operations->update_func_ptr;
124
125         return base_time;
126 }
127
128 static void __cal_base_time_resize_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
129 {
130         c_ret_if(!data);
131
132         cal_base_time_s *p = data;
133         Evas_Coord_Rectangle r = {0};
134
135         cal_util_get_geometry(&r, p->scroller);
136         p->scroller_coord = r;
137         evas_object_resize(p->event_rectangle, r.w, r.h);
138         evas_object_move(p->event_rectangle, 0, r.y);
139
140         p->base_y = r.y;
141         cal_base_time_block_get_geometry(p->base_time_block, &r);
142
143         evas_object_size_hint_min_set(p->base, 0, r.h);
144 }
145
146 static void __cal_base_time_delete(void *data, Evas *e, Evas_Object *obj, void *ei)
147 {
148         c_ret_if(!data);
149
150         cal_base_time_s *p = data;
151
152         if (p->idler_for_scrolling)
153                 ecore_idler_del(p->idler_for_scrolling);
154
155         if (p->base)
156                 evas_object_del(p->base);
157
158         if (p->event_rectangle)
159                 evas_object_del(p->event_rectangle);
160
161         if (p->base_time_block)
162                 cal_base_time_block_delete(p->base_time_block);
163
164         if (p->left_base_time_block)
165                 cal_base_time_block_delete(p->left_base_time_block);
166
167         if (p->right_base_time_block)
168                 cal_base_time_block_delete(p->right_base_time_block);
169
170
171         if (p->base_operations.delete_func_ptr) {
172                 p->base_operations.delete_func_ptr(data);
173         }
174
175         CAL_FREE(p);
176 }
177
178 static void __cal_base_time_base_layout_move_cb(void *data, Evas *e, Evas_Object *obj, void *ei)
179 {
180         c_ret_if(!data);
181
182         cal_base_time_s *p = data;
183
184         Evas_Coord_Point base_coord;
185
186         evas_object_geometry_get(p->base, &base_coord.x, &base_coord.y, NULL, NULL);
187
188         cal_base_time_block_move(p->base_time_block, base_coord.x, base_coord.y);
189 }
190
191 void cal_base_time_state_transition(cal_base_time_h base_time, enum cal_base_time_input_signal_type input)
192 {
193         c_ret_if(!base_time);
194
195         cal_base_time_s *p =  (cal_base_time_s *)base_time;
196
197         if (p->base_operations.state_transition_func_ptr) {
198                 p->base_operations.state_transition_func_ptr(base_time, input);
199         }
200
201 }
202
203 void cal_base_time_state_actions(cal_base_time_h base_time)
204 {
205         c_ret_if(!base_time);
206
207         cal_base_time_s *p =  (cal_base_time_s *)base_time;
208
209         if (p->base_operations.state_actions_func_ptr) {
210                 p->base_operations.state_actions_func_ptr(base_time);
211         }
212 }
213
214 void cal_base_time_update(cal_base_time_h base_time)
215 {
216         c_ret_if(!base_time);
217
218         cal_base_time_s *p =  (cal_base_time_s *)base_time;
219
220         if (p->base_operations.update_func_ptr) {
221                 p->base_operations.update_func_ptr(base_time);
222         }
223 }
224
225 static Evas_Object* __cal_base_time_add_base_layout(cal_base_time_s *p)
226 {
227         c_retv_if(!p, NULL);
228         c_retv_if(!p->ly, NULL);
229
230         Evas_Object *base;
231
232         base = cal_util_add_rectangle(p->ly);
233         if (!base)
234                 return NULL;
235
236         evas_object_size_hint_align_set(base, EVAS_HINT_FILL, 0);
237         evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
238         evas_object_color_set(base, 0, 0, 0, 0);
239
240         return base;
241 }
242
243 static Evas_Object* __cal_base_time_add_mouse_event_region(cal_base_time_s *p)
244 {
245         c_retv_if(!p, NULL);
246         c_retv_if(!p->ly, NULL);
247
248         Evas_Object *mouse_event_region;
249
250         mouse_event_region = cal_util_add_rectangle(p->ly);
251         if (!mouse_event_region)
252                 return NULL;
253
254         evas_object_size_hint_align_set(mouse_event_region, EVAS_HINT_FILL, 0);
255         evas_object_size_hint_weight_set(mouse_event_region, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
256         evas_object_color_set(mouse_event_region, 0, 0, 0, 0);
257
258         evas_object_repeat_events_set(mouse_event_region, EINA_TRUE);
259
260         return mouse_event_region;
261 }
262
263 static void __cal_base_time_add_content_objects(cal_base_time_s *p)
264 {
265         c_ret_if(!p);
266         c_ret_if(!p->ly);
267         c_ret_if(!p->parent);
268
269         Evas_Object *scroller = cal_util_add_scroller(p->ly);
270         c_ret_if(!scroller);
271         p->scroller = scroller;
272         evas_object_data_set(p->ly, "scroller", p->scroller);
273         evas_object_data_set(p->scroller, "priv", p->parent);
274
275         Evas_Object *box = cal_util_add_box(p->ly);
276         c_ret_if(!box);
277
278         elm_object_content_set(scroller, box);
279
280         p->base = __cal_base_time_add_base_layout(p);
281         c_ret_if(!p->base);
282
283         elm_box_pack_end(box, p->base);
284
285         p->event_rectangle = __cal_base_time_add_mouse_event_region(p);
286         c_ret_if(!p->event_rectangle);
287
288         evas_object_clip_set(p->event_rectangle, p->clip);
289
290         elm_object_part_content_set(p->ly, "sw", p->scroller);
291 }
292
293 static Eina_Bool __cal_base_time_show_scroller(void *data)
294 {
295         c_retv_if(!data, ECORE_CALLBACK_CANCEL);
296
297         cal_base_time_s *p = data;
298
299         Evas_Coord sc_y;
300         Evas_Coord sc_h;
301         Evas_Coord_Rectangle r;
302
303         cal_base_time_block_get_geometry(p->base_time_block, &r);
304         evas_object_geometry_get(p->scroller, 0, &sc_y, 0, &sc_h);
305         elm_scroller_region_show(p->scroller, 0, sc_y - r.y, 0, sc_h);
306         p->is_attached = EINA_TRUE;
307         p->idler_for_scrolling = NULL;
308
309         return ECORE_CALLBACK_CANCEL;
310 }
311
312 void cal_base_time_attach_scroller(cal_base_time_h base_time)
313 {
314         c_ret_if(!base_time);
315
316         cal_base_time_s *p =  (cal_base_time_s *)base_time;
317
318         c_ret_if(!p->base_time_block);
319
320         Evas_Coord_Rectangle r;
321         Evas_Coord sc_y;
322         Evas_Coord sc_h;
323
324         cal_base_time_block_get_geometry(p->base_time_block, &r);
325         evas_object_size_hint_min_set(p->base, 0, r.h);
326         evas_object_geometry_get(p->scroller, 0, &sc_y, 0, &sc_h);
327         elm_scroller_region_show(p->scroller, 0, sc_y - r.y, 0, sc_h);
328
329         if (p->idler_for_scrolling)
330                 ecore_idler_del(p->idler_for_scrolling);
331
332         p->idler_for_scrolling = ecore_idler_add(__cal_base_time_show_scroller, p);
333 }
334
335 static void __cal_base_time_detach_scroller(cal_base_time_h base_time)
336 {
337         c_ret_if(!base_time);
338
339         cal_base_time_s *p =  (cal_base_time_s *)base_time;
340
341         if (p->idler_for_scrolling) {
342                 ecore_idler_del(p->idler_for_scrolling);
343                 p->idler_for_scrolling = NULL;
344         }
345
346         p->is_attached = EINA_FALSE;
347 }
348
349 void cal_base_time_freeze_scroller(cal_base_time_h base_time)
350 {
351         c_ret_if(!base_time);
352
353         cal_base_time_s *p =  (cal_base_time_s *)base_time;
354
355         if (!p->scrl_freezed) {
356                 elm_object_scroll_freeze_push(p->scroller);
357                 p->scrl_freezed = EINA_TRUE;
358         }
359
360         __cal_base_time_detach_scroller(p);
361 }
362
363 void cal_base_time_thaw_scroller(cal_base_time_h base_time)
364 {
365         c_ret_if(!base_time);
366
367         cal_base_time_s *p =  (cal_base_time_s *)base_time;
368
369         if (p->scrl_freezed) {
370                 elm_object_scroll_freeze_pop(p->scroller);
371                 p->scrl_freezed = EINA_FALSE;
372         }
373
374         cal_base_time_attach_scroller(p);
375 }
376
377 void    cal_base_time_show(cal_base_time_h base_time)
378 {
379         c_ret_if(!base_time);
380
381         cal_base_time_s *p = (cal_base_time_s *)base_time;
382
383         evas_object_show(p->event_rectangle);
384
385         if (p->base_time_block) {
386                 cal_base_time_block_show(p->base_time_block);
387         }
388
389         if (p->left_base_time_block) {
390                 cal_base_time_block_show(p->left_base_time_block);
391         }
392
393         if (p->right_base_time_block) {
394                 cal_base_time_block_show(p->right_base_time_block);
395         }
396 }
397
398 void    cal_base_time_hide(cal_base_time_h base_time)
399 {
400         c_ret_if(!base_time);
401
402         cal_base_time_s *p = (cal_base_time_s *)base_time;
403
404         evas_object_hide(p->event_rectangle);
405
406         if (p->base_time_block) {
407                 cal_base_time_block_hide(p->base_time_block);
408         }
409         if (p->left_base_time_block) {
410                 cal_base_time_block_hide(p->left_base_time_block);
411         }
412         if (p->right_base_time_block) {
413                 cal_base_time_block_hide(p->right_base_time_block);
414         }
415 }
416
417
418 static void __cal_base_time_mouse_down_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
419 {
420         c_ret_if(!data);
421
422         cal_base_time_s *p = (cal_base_time_s *)data;
423         Evas_Event_Mouse_Down *ev = ei;
424
425         p->single_mouse_down.x = ev->canvas.x;
426         p->single_mouse_down.y = ev->canvas.y;
427
428         cal_base_time_state_transition(p, SINGLE_MOUSE_DOWN);
429         cal_base_time_state_actions(p);
430 }
431
432 static void __cal_base_time_mouse_up_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
433 {
434         c_ret_if(!data);
435
436         cal_base_time_s *p = data;
437
438         cal_base_time_state_transition(p, SINGLE_MOUSE_UP);
439         cal_base_time_state_actions(p);
440 }
441
442 static void __cal_base_time_mouse_out_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
443 {
444         c_ret_if(!data);
445
446         cal_base_time_s *p = data;
447
448         cal_base_time_state_transition(p, SINGLE_MOUSE_UP);
449         cal_base_time_state_actions(p);
450 }
451
452 static void __cal_base_time_mouse_move_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
453 {
454         c_ret_if(!data);
455
456         cal_base_time_s *p = data;
457         Evas_Event_Mouse_Move *ev = ei;
458
459         if (p->single_mouse_down.x == -1 || p->single_mouse_down.y == -1) {
460                 return;
461         }
462
463         p->single_mouse_move.x = ev->cur.canvas.x;
464         p->single_mouse_move.y = ev->cur.canvas.y;
465
466         cal_base_time_state_transition(p, SINGLE_MOUSE_MOVE);
467         cal_base_time_state_actions(p);
468 }
469
470 static void __cal_base_time_multi_down_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
471 {
472         c_ret_if(!data);
473
474         cal_base_time_s *p = data;
475         Evas_Event_Multi_Down *ev = ei;
476
477         p->multi_mouse_down.x = ev->canvas.x;
478         p->multi_mouse_down.y = ev->canvas.y;
479
480         cal_base_time_state_transition(p, MULTI_MOUSE_DOWN);
481         cal_base_time_state_actions(p);
482 }
483
484 static void __cal_base_time_multi_up_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
485 {
486         c_ret_if(!data);
487
488         cal_base_time_s *p = data;
489
490         cal_base_time_state_transition(p, MULTI_MOUSE_UP);
491         cal_base_time_state_actions(p);
492
493         p->multi_mouse_down.x = -1;
494         p->multi_mouse_down.y = -1;
495
496         p->multi_mouse_move.x = -1;
497         p->multi_mouse_move.y = -1;
498 }
499
500 static void __cal_base_time_multi_move_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
501 {
502         c_ret_if(!data);
503
504         cal_base_time_s *p = data;
505         Evas_Event_Multi_Move *ev = ei;
506
507         p->multi_mouse_move.x = ev->cur.canvas.x;
508         p->multi_mouse_move.y = ev->cur.canvas.y;
509
510         cal_base_time_state_transition(p, MULTI_MOUSE_MOVE);
511         cal_base_time_state_actions(p);
512 }
513
514 static void __cal_base_time_scroller_drag_start(void *data, Evas_Object *obj, void *event_info)
515 {
516         c_ret_if(!data);
517
518         cal_base_time_s *p = data;
519
520         cal_base_time_state_transition(p, SCROLLER_DRAG_START);
521         cal_base_time_state_actions(p);
522 }