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-block.h"
18 #include "day-time-block.h"
20 static void __cal_base_time_block_init(cal_base_time_block_h base_time_block);
22 cal_base_time_block_h cal_base_time_block_new(cal_base_type type, Evas_Object *parent, Evas_Object *clip, Evas_Object *clip_block, int current_hour, void *data)
24 cal_base_time_block_s *base_time_block = NULL;
27 case _CAL_BASE_TYPE_EVENT:
28 base_time_block = (cal_base_time_block_s *)cal_day_time_block_create(data);
34 double scale = elm_config_scale_get();
35 base_time_block->parent = parent;
36 base_time_block->clip = clip;
37 base_time_block->normal_height = TIME_BLOCK_NORMAL_HEIGHT * scale;
38 base_time_block->current_hour = current_hour;
40 __cal_base_time_block_init(base_time_block);
42 base_time_block->base_block = cal_base_block_new(type, parent, clip, data);
44 return base_time_block;
47 cal_base_time_block_h cal_base_time_block_create(cal_base_time_block_operations *base_operations, void *data)
49 c_retv_if(!base_operations, NULL);
50 c_retv_if(!base_operations->new_func_ptr, NULL);
52 cal_base_time_block_h base_time_block = base_operations->new_func_ptr(data);
53 c_retv_if(!base_time_block , NULL);
55 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
57 p->base_operations.new_func_ptr = base_operations->new_func_ptr;
58 p->base_operations.delete_func_ptr = base_operations->delete_func_ptr;
59 p->base_operations.update_func_ptr = base_operations->update_func_ptr;
61 return base_time_block;
64 static void __cal_base_time_block_delete(cal_base_time_block_h base_time_block)
66 c_ret_if(!base_time_block);
68 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
70 cal_base_time_block_slice *time_block_slice = NULL;
74 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
75 time_block_slice = &p->time_block_slice_array[i];
76 if (time_block_slice) {
77 if (time_block_slice->ly) {
78 evas_object_clip_unset(time_block_slice->ly);
79 evas_object_del(time_block_slice->ly);
87 static Eina_Bool __cal_base_time_block_foreach_figure_block_count_cb(cal_base_block_item_h block_item, int line_index, int height, void *user_data)
89 c_retv_if(!user_data, EINA_FALSE);
90 c_retv_if(!block_item, EINA_FALSE);
92 cal_base_time_block_s *p = user_data;
93 c_retv_if(!p->base_block, EINA_FALSE);
95 cal_base_time_block_slice *time_block_slice = NULL;
98 for (index = line_index; index < line_index+height; index++) {
99 if (0 == (line_index+2)%2) {
100 time_block_slice = &p->time_block_slice_array[line_index >> 1];
101 time_block_slice->slice_block_count++;
103 time_block_slice = &p->time_block_slice_array[(line_index-1) >> 1];
104 time_block_slice->slice_block_count++;
111 void cal_base_time_block_figure_time_block_slice_block_count(cal_base_time_block_h base_time_block)
113 c_ret_if(!base_time_block);
115 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
117 cal_base_block_foreach_items(__cal_base_time_block_foreach_figure_block_count_cb, p->base_block, p);
120 void cal_base_time_block_clear_time_block_slice_block_count(cal_base_time_block_h base_time_block)
122 c_ret_if(!base_time_block);
125 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
127 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
128 p->time_block_slice_array[i].slice_block_count= 0;
132 void cal_base_time_block_update(cal_base_time_block_h base_time_block)
134 c_ret_if(!base_time_block);
136 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
137 c_ret_if(!p->base_block);
139 if (p->base_operations.update_func_ptr) {
140 p->base_operations.update_func_ptr(base_time_block);
142 cal_base_time_block_clear_time_block_slice_block_count(base_time_block);
144 cal_base_block_update(p->base_block);
146 cal_base_time_block_figure_time_block_slice_block_count(base_time_block);
150 void cal_base_time_block_delete(cal_base_time_block_h base_time_block)
152 c_ret_if(!base_time_block);
154 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
156 if (p->base_operations.delete_func_ptr) {
157 p->base_operations.delete_func_ptr(base_time_block);
159 cal_base_block_delete(p->base_block);
160 __cal_base_time_block_delete(base_time_block);
164 static Evas_Object *__cal_base_time_block_add_time_block_slice_layout(cal_base_time_block_s *p, struct tm *hour_time, int hour_index)
167 c_retv_if(!p->parent, NULL);
168 c_retv_if(!hour_time, NULL);
170 Evas_Object *ly = NULL;
172 ly = cal_util_add_layout(p->parent, p->name);
173 c_retv_if(!ly, NULL);
176 cal_util_set_time_text(CAL_UTIL_GET_EDJ_DATA(ly), "text", NULL, CAL_UTIL_TIME_FORMAT_7, hour_time);
178 if (0 == hour_index) {
179 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "AM", "AM");
180 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,AM", "prog");
181 } else if (hour_index == TIME_BLOCK_DAY_HOURS) {
182 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "PM", "PM");
183 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "show,PM", "prog");
186 char hour_text[8] = {0};
187 sprintf(hour_text, "%02d", (hour_index > TIME_BLOCK_DAY_HOURS ? hour_index - TIME_BLOCK_DAY_HOURS : hour_index));
188 edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(ly), "text", hour_text);
191 if (TIME_BLOCK_DAY_HOURS <= hour_index) {
192 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "pm", "prog");
195 evas_object_clip_set(ly, (Evas_Object*)p->clip);
196 evas_object_show(ly);
201 static void __cal_base_time_block_add_time_block_slices(cal_base_time_block_s *p)
204 c_ret_if(!p->parent);
207 cal_base_time_block_slice *base_block_slice;
212 memset(&tm, 0, sizeof(struct tm));
213 cal_util_update_tm_hour(&tm, 0);
219 int event_slice_base_index = 0;
220 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
221 ly = __cal_base_time_block_add_time_block_slice_layout(p, &tm, i);
224 cal_util_update_tm_hour(&tm, 1);
226 base_block_slice = &p->time_block_slice_array[i];
227 base_block_slice->ly = ly;
228 base_block_slice->height = p->normal_height;
229 base_block_slice->line_index = i;
231 p->event_block_slice_object_array[event_slice_base_index++] = edje_object_part_object_get(CAL_UTIL_GET_EDJ_DATA(base_block_slice->ly), "evtbase/top");
232 p->event_block_slice_object_array[event_slice_base_index++] = edje_object_part_object_get(CAL_UTIL_GET_EDJ_DATA(base_block_slice->ly), "evtbase/bottom");
234 p->height += base_block_slice->height;
238 void cal_base_time_block_resize_time_block_slices(cal_base_time_block_h base_time_block)
240 c_ret_if(!base_time_block);
242 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
247 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
248 cal_base_time_block_slice *time_block_slice = &p->time_block_slice_array[i];
250 if (!time_block_slice->ly)
253 if ( TIME_BLOCK_TEXT_HEIGHT < time_block_slice->height) {
254 if (time_block_slice->hide_text) {
255 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(time_block_slice->ly), "show,text", "prog");
256 time_block_slice->hide_text = EINA_FALSE;
259 if (!time_block_slice->hide_text) {
260 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(time_block_slice->ly), "hide,text", "prog");
261 time_block_slice->hide_text = EINA_TRUE;
265 evas_object_resize(time_block_slice->ly, p->width, time_block_slice->height);
266 p->height += time_block_slice->height;
270 static void __cal_base_time_block_move_time_block_slices(cal_base_time_block_s *p)
273 cal_base_time_block_slice *time_block_slice_prev;
274 cal_base_time_block_slice *time_block_slice;
276 for (i = 1; i < TIME_BLOCK_SLICE_COUNT; i++) {
277 time_block_slice = &p->time_block_slice_array[i];
278 time_block_slice_prev = &p->time_block_slice_array[i - 1];
280 time_block_slice->y = time_block_slice_prev->y + time_block_slice_prev->height;
281 evas_object_move(time_block_slice->ly, time_block_slice->x, time_block_slice->y);
285 static void __cal_base_time_block_show_time_line(cal_base_time_block_s *p)
290 cal_base_time_block_slice *time_block_slice;
291 int hour = p->current_hour;
293 if(0 > hour || 23 < hour)
296 for(i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
297 time_block_slice = &p->time_block_slice_array[i];
298 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(time_block_slice->ly), "hide,line", "prog");
299 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(time_block_slice->ly), "hide,img", "prog");
302 if(NULL != p->time_block_slice_array[hour].ly) {
303 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->time_block_slice_array[hour].ly), "show,line", "prog");
304 edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(p->time_block_slice_array[hour].ly), "show,img", "prog");
308 static void __cal_base_time_block_init(cal_base_time_block_h base_time_block)
310 c_ret_if(!base_time_block);
312 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
314 __cal_base_time_block_add_time_block_slices(p);
316 cal_base_time_block_resize_time_block_slices(base_time_block);
317 __cal_base_time_block_move_time_block_slices(p);
318 __cal_base_time_block_show_time_line(p);
321 static Eina_Bool __cal_base_time_block_foreach_move_event_block_cb(cal_base_block_item_h block_item, int line_index, int height, void *user_data)
323 c_retv_if(!user_data, EINA_FALSE);
324 c_retv_if(!block_item, EINA_FALSE);
326 cal_base_time_block_s *p = user_data;
327 c_retv_if(!p->base_block, EINA_FALSE);
329 Evas_Object *obj_base = NULL;
331 obj_base = p->event_block_slice_object_array[line_index];
332 c_retv_if(!obj_base, EINA_FALSE);
334 Evas_Coord_Rectangle base = {0};
335 cal_util_get_geometry(&base, obj_base);
337 cal_base_block_move_item(p->base_block, block_item, &base);
342 void cal_base_time_block_move_event_blocks(cal_base_time_block_h base_time_block)
344 c_ret_if(!base_time_block);
345 cal_base_time_block_s *p = base_time_block;
347 cal_base_block_foreach_items(__cal_base_time_block_foreach_move_event_block_cb, p->base_block, p);
350 void cal_base_time_block_move(cal_base_time_block_h base_time_block, Evas_Coord x, Evas_Coord y)
352 c_ret_if(!base_time_block);
354 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
357 cal_base_time_block_slice *time_block_slice = NULL;
362 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
363 time_block_slice = &p->time_block_slice_array[i];
364 if (!time_block_slice->ly)
367 evas_object_move(time_block_slice->ly, x, y);
368 time_block_slice->x = x;
369 time_block_slice->y = y;
371 y += time_block_slice->height;
374 cal_base_time_block_move_event_blocks(p);
378 void cal_base_time_block_get_geometry(cal_base_time_block_h base_time_block, Evas_Coord_Rectangle *r)
380 c_ret_if(!base_time_block);
383 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
391 void cal_base_time_block_move_to_time_line(cal_base_time_block_h base_time_block)
393 c_ret_if(!base_time_block);
395 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
397 cal_base_time_block_slice *time_block_slice;
398 int hour = p->current_hour;
400 Evas_Coord_Rectangle time_block_r, scroller_r;
401 cal_base_time_block_get_geometry(base_time_block, &time_block_r);
403 cal_util_get_geometry(&scroller_r, p->parent);
405 if (time_block_r.h <= scroller_r.h) {
409 if (0 < hour && hour < TIME_BLOCK_SLICE_COUNT) {
410 time_block_slice = &p->time_block_slice_array[hour];
411 int dis_offset = time_block_slice->y - (scroller_r.y + scroller_r.h/2);
413 if (dis_offset < 0) {
414 if (scroller_r.y < time_block_r.y + abs(dis_offset)) {
415 elm_scroller_region_show(p->parent, 0, 0, 0, scroller_r.h);
417 elm_scroller_region_show(p->parent, 0, scroller_r.y - time_block_r.y - abs(dis_offset), 0, scroller_r.h);
419 } else if (0 < dis_offset) {
420 if (time_block_r.y - dis_offset + time_block_r.h < scroller_r.y + scroller_r.h) {
421 elm_scroller_region_show(p->parent, 0, time_block_r.h - scroller_r.h, 0, scroller_r.h);
423 elm_scroller_region_show(p->parent, 0, scroller_r.y - time_block_r.y + dis_offset, 0, scroller_r.h);
429 int cal_base_time_block_get_time_block_slice_index_by_coord_point(cal_base_time_block_h base_time_block, Evas_Coord_Point *mouse_down_coord)
431 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
435 cal_base_time_block_slice *time_block_slice = NULL;
437 for (i = 1; i < TIME_BLOCK_SLICE_COUNT; i++) {
438 time_block_slice = &p->time_block_slice_array[i];
440 if (mouse_down_coord->y < time_block_slice->y) {
448 void cal_base_time_block_show(cal_base_time_block_h base_time_block)
450 c_ret_if(!base_time_block);
453 cal_base_time_block_slice *time_block_slice = NULL;
454 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
456 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
457 time_block_slice = &p->time_block_slice_array[i];
458 c_ret_if(!time_block_slice);
459 c_ret_if(!time_block_slice->ly);
461 evas_object_show(time_block_slice->ly);
464 cal_base_block_show(p->base_block);
467 void cal_base_time_block_hide(cal_base_time_block_h base_time_block)
469 c_ret_if(!base_time_block);
472 cal_base_time_block_slice *time_block_slice = NULL;
473 cal_base_time_block_s *p = (cal_base_time_block_s *)base_time_block;
475 for (i = 0; i < TIME_BLOCK_SLICE_COUNT; i++) {
476 time_block_slice = &p->time_block_slice_array[i];
477 c_ret_if(!time_block_slice);
478 c_ret_if(!time_block_slice->ly);
480 evas_object_hide(time_block_slice->ly);
483 cal_base_block_hide(p->base_block);