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 "base-time.h"
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);
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)
35 cal_base_time_h base_time = NULL;
38 case _CAL_BASE_TYPE_EVENT:
39 base_time = cal_day_time_create(data);
45 c_retv_if(!base_time, NULL);
47 cal_base_time_s *p = (cal_base_time_s *)base_time;
52 Evas_Object *ly = cal_util_add_layout(parent, p->name);
54 ERR("cal_util_add_layout failed!");
60 evas_object_data_set(ly, "priv", p);
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");
65 __cal_base_time_add_content_objects(p);
67 p->base_time_block = cal_base_time_block_new(type, p->scroller, p->clip, p->clip_block, current_hour, data);
69 if (!p->base_time_block) {
70 ERR("cal_time_block_create_time_block failed!");
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);
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);
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);
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);
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);
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);
101 if (p->base_operations.init_func_ptr) {
102 p->base_operations.init_func_ptr(base_time);
108 cal_base_time_h cal_base_time_create(cal_base_time_operations *base_operations, void *data)
110 c_retv_if(!base_operations, NULL);
111 c_retv_if(!base_operations->new_func_ptr, NULL);
113 cal_base_time_h base_time = base_operations->new_func_ptr(data);
114 c_retv_if(!base_time , NULL);
116 cal_base_time_s *p = (cal_base_time_s *)base_time;
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;
128 static void __cal_base_time_resize_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
132 cal_base_time_s *p = data;
133 Evas_Coord_Rectangle r = {0};
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);
141 cal_base_time_block_get_geometry(p->base_time_block, &r);
143 evas_object_size_hint_min_set(p->base, 0, r.h);
146 static void __cal_base_time_delete(void *data, Evas *e, Evas_Object *obj, void *ei)
150 cal_base_time_s *p = data;
152 if (p->idler_for_scrolling)
153 ecore_idler_del(p->idler_for_scrolling);
156 evas_object_del(p->base);
158 if (p->event_rectangle)
159 evas_object_del(p->event_rectangle);
161 if (p->base_time_block)
162 cal_base_time_block_delete(p->base_time_block);
164 if (p->left_base_time_block)
165 cal_base_time_block_delete(p->left_base_time_block);
167 if (p->right_base_time_block)
168 cal_base_time_block_delete(p->right_base_time_block);
171 if (p->base_operations.delete_func_ptr) {
172 p->base_operations.delete_func_ptr(data);
178 static void __cal_base_time_base_layout_move_cb(void *data, Evas *e, Evas_Object *obj, void *ei)
182 cal_base_time_s *p = data;
184 Evas_Coord_Point base_coord;
186 evas_object_geometry_get(p->base, &base_coord.x, &base_coord.y, NULL, NULL);
188 cal_base_time_block_move(p->base_time_block, base_coord.x, base_coord.y);
191 void cal_base_time_state_transition(cal_base_time_h base_time, enum cal_base_time_input_signal_type input)
193 c_ret_if(!base_time);
195 cal_base_time_s *p = (cal_base_time_s *)base_time;
197 if (p->base_operations.state_transition_func_ptr) {
198 p->base_operations.state_transition_func_ptr(base_time, input);
203 void cal_base_time_state_actions(cal_base_time_h base_time)
205 c_ret_if(!base_time);
207 cal_base_time_s *p = (cal_base_time_s *)base_time;
209 if (p->base_operations.state_actions_func_ptr) {
210 p->base_operations.state_actions_func_ptr(base_time);
214 void cal_base_time_update(cal_base_time_h base_time)
216 c_ret_if(!base_time);
218 cal_base_time_s *p = (cal_base_time_s *)base_time;
220 if (p->base_operations.update_func_ptr) {
221 p->base_operations.update_func_ptr(base_time);
225 static Evas_Object* __cal_base_time_add_base_layout(cal_base_time_s *p)
228 c_retv_if(!p->ly, NULL);
232 base = cal_util_add_rectangle(p->ly);
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);
243 static Evas_Object* __cal_base_time_add_mouse_event_region(cal_base_time_s *p)
246 c_retv_if(!p->ly, NULL);
248 Evas_Object *mouse_event_region;
250 mouse_event_region = cal_util_add_rectangle(p->ly);
251 if (!mouse_event_region)
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);
258 evas_object_repeat_events_set(mouse_event_region, EINA_TRUE);
260 return mouse_event_region;
263 static void __cal_base_time_add_content_objects(cal_base_time_s *p)
267 c_ret_if(!p->parent);
269 Evas_Object *scroller = cal_util_add_scroller(p->ly);
271 p->scroller = scroller;
272 evas_object_data_set(p->ly, "scroller", p->scroller);
273 evas_object_data_set(p->scroller, "priv", p->parent);
275 Evas_Object *box = cal_util_add_box(p->ly);
278 elm_object_content_set(scroller, box);
280 p->base = __cal_base_time_add_base_layout(p);
283 elm_box_pack_end(box, p->base);
285 p->event_rectangle = __cal_base_time_add_mouse_event_region(p);
286 c_ret_if(!p->event_rectangle);
288 evas_object_clip_set(p->event_rectangle, p->clip);
290 elm_object_part_content_set(p->ly, "sw", p->scroller);
293 static Eina_Bool __cal_base_time_show_scroller(void *data)
295 c_retv_if(!data, ECORE_CALLBACK_CANCEL);
297 cal_base_time_s *p = data;
301 Evas_Coord_Rectangle r;
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;
309 return ECORE_CALLBACK_CANCEL;
312 void cal_base_time_attach_scroller(cal_base_time_h base_time)
314 c_ret_if(!base_time);
316 cal_base_time_s *p = (cal_base_time_s *)base_time;
318 c_ret_if(!p->base_time_block);
320 Evas_Coord_Rectangle r;
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);
329 if (p->idler_for_scrolling)
330 ecore_idler_del(p->idler_for_scrolling);
332 p->idler_for_scrolling = ecore_idler_add(__cal_base_time_show_scroller, p);
335 static void __cal_base_time_detach_scroller(cal_base_time_h base_time)
337 c_ret_if(!base_time);
339 cal_base_time_s *p = (cal_base_time_s *)base_time;
341 if (p->idler_for_scrolling) {
342 ecore_idler_del(p->idler_for_scrolling);
343 p->idler_for_scrolling = NULL;
346 p->is_attached = EINA_FALSE;
349 void cal_base_time_freeze_scroller(cal_base_time_h base_time)
351 c_ret_if(!base_time);
353 cal_base_time_s *p = (cal_base_time_s *)base_time;
355 if (!p->scrl_freezed) {
356 elm_object_scroll_freeze_push(p->scroller);
357 p->scrl_freezed = EINA_TRUE;
360 __cal_base_time_detach_scroller(p);
363 void cal_base_time_thaw_scroller(cal_base_time_h base_time)
365 c_ret_if(!base_time);
367 cal_base_time_s *p = (cal_base_time_s *)base_time;
369 if (p->scrl_freezed) {
370 elm_object_scroll_freeze_pop(p->scroller);
371 p->scrl_freezed = EINA_FALSE;
374 cal_base_time_attach_scroller(p);
377 void cal_base_time_show(cal_base_time_h base_time)
379 c_ret_if(!base_time);
381 cal_base_time_s *p = (cal_base_time_s *)base_time;
383 evas_object_show(p->event_rectangle);
385 if (p->base_time_block) {
386 cal_base_time_block_show(p->base_time_block);
389 if (p->left_base_time_block) {
390 cal_base_time_block_show(p->left_base_time_block);
393 if (p->right_base_time_block) {
394 cal_base_time_block_show(p->right_base_time_block);
398 void cal_base_time_hide(cal_base_time_h base_time)
400 c_ret_if(!base_time);
402 cal_base_time_s *p = (cal_base_time_s *)base_time;
404 evas_object_hide(p->event_rectangle);
406 if (p->base_time_block) {
407 cal_base_time_block_hide(p->base_time_block);
409 if (p->left_base_time_block) {
410 cal_base_time_block_hide(p->left_base_time_block);
412 if (p->right_base_time_block) {
413 cal_base_time_block_hide(p->right_base_time_block);
418 static void __cal_base_time_mouse_down_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
422 cal_base_time_s *p = (cal_base_time_s *)data;
423 Evas_Event_Mouse_Down *ev = ei;
425 p->single_mouse_down.x = ev->canvas.x;
426 p->single_mouse_down.y = ev->canvas.y;
428 cal_base_time_state_transition(p, SINGLE_MOUSE_DOWN);
429 cal_base_time_state_actions(p);
432 static void __cal_base_time_mouse_up_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
436 cal_base_time_s *p = data;
438 cal_base_time_state_transition(p, SINGLE_MOUSE_UP);
439 cal_base_time_state_actions(p);
442 static void __cal_base_time_mouse_out_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
446 cal_base_time_s *p = data;
448 cal_base_time_state_transition(p, SINGLE_MOUSE_UP);
449 cal_base_time_state_actions(p);
452 static void __cal_base_time_mouse_move_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
456 cal_base_time_s *p = data;
457 Evas_Event_Mouse_Move *ev = ei;
459 if (p->single_mouse_down.x == -1 || p->single_mouse_down.y == -1) {
463 p->single_mouse_move.x = ev->cur.canvas.x;
464 p->single_mouse_move.y = ev->cur.canvas.y;
466 cal_base_time_state_transition(p, SINGLE_MOUSE_MOVE);
467 cal_base_time_state_actions(p);
470 static void __cal_base_time_multi_down_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
474 cal_base_time_s *p = data;
475 Evas_Event_Multi_Down *ev = ei;
477 p->multi_mouse_down.x = ev->canvas.x;
478 p->multi_mouse_down.y = ev->canvas.y;
480 cal_base_time_state_transition(p, MULTI_MOUSE_DOWN);
481 cal_base_time_state_actions(p);
484 static void __cal_base_time_multi_up_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
488 cal_base_time_s *p = data;
490 cal_base_time_state_transition(p, MULTI_MOUSE_UP);
491 cal_base_time_state_actions(p);
493 p->multi_mouse_down.x = -1;
494 p->multi_mouse_down.y = -1;
496 p->multi_mouse_move.x = -1;
497 p->multi_mouse_move.y = -1;
500 static void __cal_base_time_multi_move_event_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
504 cal_base_time_s *p = data;
505 Evas_Event_Multi_Move *ev = ei;
507 p->multi_mouse_move.x = ev->cur.canvas.x;
508 p->multi_mouse_move.y = ev->cur.canvas.y;
510 cal_base_time_state_transition(p, MULTI_MOUSE_MOVE);
511 cal_base_time_state_actions(p);
514 static void __cal_base_time_scroller_drag_start(void *data, Evas_Object *obj, void *event_info)
518 cal_base_time_s *p = data;
520 cal_base_time_state_transition(p, SCROLLER_DRAG_START);
521 cal_base_time_state_actions(p);