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-time-block.h"
19 static const char *_name = "main/day/time/timeblock";
21 typedef struct cal_day_time_block{
22 cal_base_time_block_s base_time_block;
26 Evas_Coord contract_height;
27 Evas_Coord expand_height;
28 Evas_Coord h_contract;
30 void (*event_cb)(void *data, int event_type, void *event_info);
34 } cal_day_time_block_s;
36 static cal_base_time_block_h __cal_day_time_block_new(void *data);
38 cal_base_time_block_operations day_time_block_operations = {
39 __cal_day_time_block_new,
44 static cal_base_time_block_h __cal_day_time_block_new(void *data)
46 c_retv_if(!data, NULL);
48 cal_day_time_block_s *p;
50 CAL_CALLOC(p, 1, cal_day_time_block_s);
52 double scale = elm_config_scale_get();
56 p->ad = (struct appdata *)data;
57 ((cal_base_time_block_s *)p)->name = _name;
58 p->expand_height = TIME_BLOCK_EXPAND_HEIGHT * scale;
59 p->contract_height = TIME_BLOCK_CONTENT_HEIGHT * scale;
60 p->h_contract = TIME_BLOCK_CONTRACT_HEIGHT * scale;
62 ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
64 if (!p->ad->is_landscape_mode) {
65 ((cal_base_time_block_s *)p)->width = width;
66 ((cal_base_time_block_s *)p)->height = height;
68 ((cal_base_time_block_s *)p)->width = height;
69 ((cal_base_time_block_s *)p)->height = width;
75 cal_base_time_block_h cal_day_time_block_create(void *data)
77 return cal_base_time_block_create(&day_time_block_operations, data);
80 Eina_Bool cal_day_time_block_hint_clicked(cal_day_time_block_h day_time_block, Evas_Coord_Point *mouse_down_coord)
82 c_retv_if(!day_time_block, EINA_FALSE);
83 c_retv_if(!mouse_down_coord, EINA_FALSE);
85 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
87 Eina_Bool is_event_clicked = EINA_FALSE;
88 calendar_record_h record = NULL;
89 is_event_clicked = cal_day_event_block_hint_clicked(((cal_base_time_block_s *)p)->base_block, mouse_down_coord, &record);
91 if (!is_event_clicked) {
92 c_retv_if(p->ad->is_contracted, EINA_FALSE);
94 int time_slice_index = cal_base_time_block_get_time_block_slice_index_by_coord_point(p, mouse_down_coord);
95 c_retv_if(-1 == time_slice_index, EINA_FALSE);
98 p->event_cb(p->event_cb_data, TIME_BLOCK_SLICE_CLICEKD, (void *)time_slice_index);
102 p->event_cb(p->event_cb_data, EVEN_BLOCK_MORE_EVENT_CLICEKD, (void *)record);
104 p->event_cb(p->event_cb_data, EVEN_BLOCK_EVENT_CLICEKD, (void *)record);
109 return is_event_clicked;
112 void cal_day_time_block_set_callback(cal_day_time_block_h day_time_block,
113 void (*event_cb)(void *data, int event_type, void *event_info),
116 c_ret_if(!day_time_block);
118 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
120 p->event_cb = event_cb;
121 p->event_cb_data = data;
124 void cal_day_time_block_unset_callback(cal_day_time_block_h day_time_block)
126 c_ret_if(!day_time_block);
129 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
131 p->event_cb_data = NULL;
134 Eina_Bool cal_day_time_block_hint_longpress(cal_day_time_block_h day_time_block, Evas_Coord_Point *mouse_down_coord)
136 c_retv_if(!day_time_block, EINA_FALSE);
137 c_retv_if(!mouse_down_coord, EINA_FALSE);
139 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
140 c_retv_if(!p->ad, EINA_FALSE);
141 c_retv_if(p->ad->is_contracted, EINA_FALSE);
143 Eina_Bool is_event_longpressed = EINA_FALSE;
144 is_event_longpressed = cal_day_event_block_hint_longpress(((cal_base_time_block_s *)p)->base_block, mouse_down_coord);
145 if (!is_event_longpressed) {
146 int time_slice_index = cal_base_time_block_get_time_block_slice_index_by_coord_point(p, mouse_down_coord);
147 c_retv_if(-1 == time_slice_index, EINA_FALSE);
150 p->event_cb(p->event_cb_data, TIME_BLOCK_SLICE_LONGPRESS, (void *)time_slice_index);
153 cal_day_event_block_longpress_callback(((cal_base_time_block_s *)p)->base_block);
154 p->event_cb(p->event_cb_data, EVEN_BLOCK_EVENT_LONGPRESS, NULL);
158 return is_event_longpressed;
161 Eina_Bool cal_day_time_block_hint_quit_event_moveable_state(cal_day_time_block_h day_time_block, Evas_Coord_Point *mouse_down_coord)
163 c_retv_if(!day_time_block, EINA_FALSE);
164 c_retv_if(!mouse_down_coord, EINA_FALSE);
166 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
168 return cal_day_event_block_hint_quit_event_moveable_state(((cal_base_time_block_s *)p)->base_block, mouse_down_coord);
171 static void __cal_day_time_block_moving_time_block_callback(void *user_data, Evas_Coord time_block_y)
173 c_ret_if(!user_data);
175 cal_day_time_block_h day_time_block = user_data;
177 Evas_Coord_Rectangle timeblock_r;
179 cal_base_time_block_get_geometry(day_time_block, &timeblock_r);
181 cal_base_time_block_move(day_time_block, timeblock_r.x, time_block_y);
184 void cal_day_time_block_moving_moveable_event(cal_day_time_block_h day_time_block, Evas_Coord_Point *mouse_move_coord, Evas_Coord_Point *mouse_down_coord)
186 c_ret_if(!day_time_block);
187 c_ret_if(!mouse_move_coord);
188 c_ret_if(!mouse_down_coord);
190 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
192 Evas_Coord_Rectangle timeblock_r;
194 cal_base_time_block_get_geometry(day_time_block, &timeblock_r);
196 cal_day_event_block_moving_moveable_event(((cal_base_time_block_s *)p)->base_block, mouse_move_coord, mouse_down_coord, __cal_day_time_block_moving_time_block_callback, day_time_block, timeblock_r.y, timeblock_r.h);
199 static int __cal_day_time_block_figure_event_block_border_line_index(cal_day_time_block_s *p, Evas_Object *event_obj, Eina_Bool is_bottom_border)
201 c_retv_if(!event_obj, -1);
204 Evas_Object *obj_base = NULL;
206 Evas_Coord_Rectangle r;
207 Evas_Coord event_y, event_block_slice_y;
209 cal_util_get_geometry(&r, event_obj);
210 if (!is_bottom_border) {
216 for (line_index = 0; line_index < EVENT_SLICE_COUNT; line_index++) {
218 obj_base = ((cal_base_time_block_s *)p)->event_block_slice_object_array[line_index];
219 c_retv_if(!obj_base, -1);
221 cal_util_get_geometry(&r, obj_base);
223 if (event_y <= r.y) {
225 event_block_slice_y = r.y;
226 if (line_index != 0) {
227 obj_base = ((cal_base_time_block_s *)p)->event_block_slice_object_array[line_index-1];
228 c_retv_if(!obj_base, -1);
230 cal_util_get_geometry(&r, obj_base);
232 if (event_y - r.y < event_block_slice_y - event_y)
243 void cal_day_time_block_disable_moving_moveable_event(cal_day_time_block_h day_time_block, Evas_Coord_Point *mouse_move_coord, Evas_Coord_Point *mouse_down_coord)
245 c_ret_if(!day_time_block);
246 c_ret_if(!mouse_move_coord);
247 c_ret_if(!mouse_down_coord);
249 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
250 Evas_Coord_Rectangle scroller_r, timeblock_r;
252 Evas_Object *moveable_event = NULL;
253 Evas_Object *moveable_event_border = NULL;
256 cal_day_event_block_get_moveable_event_objects(((cal_base_time_block_s *)p)->base_block, &moveable_event, &moveable_event_border);
257 c_ret_if(!moveable_event);
258 c_ret_if(!moveable_event_border);
260 int new_ebs_idx = __cal_day_time_block_figure_event_block_border_line_index(p, moveable_event, EINA_FALSE);
261 int end_ebs_idx = __cal_day_time_block_figure_event_block_border_line_index(p, moveable_event, EINA_TRUE);
262 c_ret_if(new_ebs_idx < 0);
264 int ev_sz = (0 == end_ebs_idx - new_ebs_idx) ? 1: (end_ebs_idx - new_ebs_idx);
266 cal_day_event_block_update_moveable_event(((cal_base_time_block_s *)p)->base_block, new_ebs_idx, ev_sz);
268 cal_base_time_block_move_event_blocks(p);
270 cal_util_get_geometry(&scroller_r, ((cal_base_time_block_s *)p)->parent);
271 cal_base_time_block_get_geometry(day_time_block, &timeblock_r);
272 elm_scroller_region_show(((cal_base_time_block_s *)p)->parent, 0, scroller_r.y - timeblock_r.y, 0, scroller_r.h);
274 cal_base_time_block_figure_time_block_slice_block_count(p);
277 static int __cal_day_time_block_find_time_block_slice_index(cal_day_time_block_s *p, Evas_Coord y)
282 cal_base_time_block_slice *time_block_slice = NULL;
284 for (i = 1; i < TIME_BLOCK_SLICE_COUNT; i++) {
285 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[i];
287 if (y < time_block_slice->y)
294 static inline void __cal_day_time_block_set_contract_size(cal_day_time_block_s *p, Evas_Coord h)
299 cal_base_time_block_slice *time_block_slice = NULL;
305 int hour = p->current_hour;
307 for(k = 0; k < TIME_BLOCK_SLICE_COUNT; k++) {
308 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[k];
309 time_block_slice->is_contracted = EINA_FALSE;
312 while(i < TIME_BLOCK_SLICE_COUNT) {
313 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[i];
314 if (time_block_slice->slice_block_count== 0) {
317 time_block_slice->height = ((cal_base_time_block_s *)p)->normal_height;
320 time_block_slice->is_contracted = EINA_TRUE;
321 time_block_slice->height = p->h_contract;
324 for(j = i+1; j < TIME_BLOCK_SLICE_COUNT; j++) {
325 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[j];
326 if (time_block_slice->slice_block_count == 0) {
331 time_block_slice->height = h;
346 p->ad->h_cur = p->h_contract;
348 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_time_block_s *)p)->time_block_slice_array[0].ly), "hide,AM", "prog");
349 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_time_block_s *)p)->time_block_slice_array[12].ly), "hide,PM", "prog");
352 static inline void __cal_day_time_block_set_normal_size(cal_day_time_block_s *p, Evas_Coord h)
358 struct appdata *ad = p->ad;
360 cal_base_time_block_slice *time_block_slice = NULL;
362 if (ad->is_magnifying) {
363 if (p->expand_height < h)
364 h = p->expand_height;
366 if (h < ((cal_base_time_block_s *)p)->normal_height)
367 h = ((cal_base_time_block_s *)p)->normal_height;
370 if (!ad->is_contracted) {
371 if (p->expand_height <= h)
372 h = p->expand_height;
374 if (h < p->contract_height)
375 h = p->contract_height;
377 if (((cal_base_time_block_s *)p)->normal_height <= h)
378 h = ((cal_base_time_block_s *)p)->normal_height;
380 if (h < p->contract_height)
381 h = p->contract_height;
385 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
386 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[i];
387 time_block_slice->is_contracted = EINA_FALSE;
389 if (time_block_slice->slice_block_count == 0)
390 time_block_slice->height = h;
392 if (((cal_base_time_block_s *)p)->normal_height < h) {
393 time_block_slice->height = h;
395 time_block_slice->height = ((cal_base_time_block_s *)p)->normal_height;
402 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_time_block_s *)p)->time_block_slice_array[0].ly), "show,AM", "prog");
403 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(((cal_base_time_block_s *)p)->time_block_slice_array[12].ly), "show,PM", "prog");
406 static inline void __cal_day_time_block_set_time_block_slice_height(cal_day_time_block_s *p, Evas_Coord h, Eina_Bool is_set_contract)
410 if (is_set_contract) {
411 __cal_day_time_block_set_contract_size(p, h);
413 __cal_day_time_block_set_normal_size(p, h);;
417 static void __cal_day_time_block_rearrange_time_block_after(cal_day_time_block_s *p, int idx)
422 cal_base_time_block_slice *time_block_slice_prev;
423 cal_base_time_block_slice *time_block_slice;
425 for (i = idx + 1; i < TIME_BLOCK_SLICE_COUNT; i++) {
426 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[i];
427 time_block_slice_prev = &((cal_base_time_block_s *)p)->time_block_slice_array[i - 1];
429 time_block_slice->y = time_block_slice_prev->y + time_block_slice_prev->height;
430 evas_object_move(time_block_slice->ly, time_block_slice->x, time_block_slice->y);
434 static inline void __cal_day_time_block_rearrange_time_block_slice(cal_day_time_block_s *p, int idx)
438 cal_base_time_block_slice *time_block_slice;
439 cal_base_time_block_slice *time_block_slice_next;
442 __cal_day_time_block_rearrange_time_block_after(p, idx);
444 for (i = idx - 1; i >= 0; i--) {
445 time_block_slice = &((cal_base_time_block_s *)p)->time_block_slice_array[i];
446 time_block_slice_next = &((cal_base_time_block_s *)p)->time_block_slice_array[i + 1];
448 time_block_slice->y = time_block_slice_next->y - time_block_slice->height;
449 evas_object_move(time_block_slice->ly, time_block_slice->x, time_block_slice->y);
452 ((cal_base_time_block_s *)p)->y = ((cal_base_time_block_s *)p)->time_block_slice_array[0].y;
455 void cal_day_time_block_resize(cal_day_time_block_h day_time_block, Evas_Coord y, Evas_Coord h, Eina_Bool is_set_contract)
457 c_ret_if(!day_time_block);
459 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
461 int time_block_slice_index;
463 time_block_slice_index = __cal_day_time_block_find_time_block_slice_index(p, y);
465 __cal_day_time_block_set_time_block_slice_height(p, h, is_set_contract);
467 cal_base_time_block_resize_time_block_slices(p);
469 __cal_day_time_block_rearrange_time_block_slice(p, time_block_slice_index);
471 cal_base_time_block_move_event_blocks(p);
474 Evas_Coord cal_day_time_block_get_max(cal_day_time_block_h day_time_block)
476 c_retv_if(!day_time_block, 0);
478 cal_base_time_block_s *p = (cal_base_time_block_s *)day_time_block;
480 return p->normal_height;
483 Evas_Coord cal_day_time_block_get_min()
485 double scale = elm_config_scale_get();
486 return TIME_BLOCK_MIN_HEIGHT * scale;
490 Evas_Coord cal_day_time_block_get_expand_max(cal_day_time_block_h day_time_block)
492 c_retv_if(!day_time_block, 0);
494 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;
496 return p->expand_height;
499 Evas_Coord cal_day_time_block_get_current(cal_day_time_block_h day_time_block)
501 c_retv_if(!day_time_block, 0);
503 cal_day_time_block_s *p = (cal_day_time_block_s *)day_time_block;