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-block.h"
18 #include "day-event-block.h"
20 static void __cal_base_block_delete(cal_base_block_h base_block);
22 cal_base_block_h cal_base_block_new(cal_base_type type, Evas_Object *parent, Evas_Object *clip, void *data)
24 c_retv_if(!parent, NULL);
25 c_retv_if(!clip, NULL);
27 cal_base_block_s *base_block = NULL;
30 case _CAL_BASE_TYPE_EVENT:
31 base_block = (cal_base_block_s *)cal_day_event_block_create();
36 c_retv_if(!base_block, NULL);
38 base_block->base_data = cal_base_data_new(type, data);
39 base_block->parent = parent;
40 base_block->clip = clip;
42 cal_base_data_load(base_block->base_data);
43 cal_base_data_create_data_list(base_block->base_data);
45 cal_base_block_create_block_list(base_block);
50 cal_base_block_h cal_base_block_create(cal_base_block_operations *base_operations)
52 c_retv_if(!base_operations, NULL);
53 c_retv_if(!base_operations->new_func_ptr, NULL);
55 cal_base_block_h base_block = base_operations->new_func_ptr();
56 c_retv_if(!base_block , NULL);
58 cal_base_block_s *p = (cal_base_block_s *)base_block;
60 p->base_operations.new_func_ptr = base_operations->new_func_ptr;
61 p->base_operations.delete_func_ptr = base_operations->delete_func_ptr;
62 p->base_operations.new_item_func_ptr = base_operations->new_item_func_ptr;
63 p->base_operations.delete_item_func_ptr = base_operations->delete_item_func_ptr;
64 p->base_operations.create_item_layout_func_ptr = base_operations->create_item_layout_func_ptr;
65 p->base_operations.move_item_layout_func_ptr = base_operations->move_item_layout_func_ptr;
66 p->base_operations.update_func_ptr = base_operations->update_func_ptr;
71 void cal_base_block_delete(cal_base_block_h base_block)
73 c_ret_if(!base_block);
75 cal_base_block_s *p = (cal_base_block_s *)base_block;
77 if (p->base_operations.delete_func_ptr) {
78 p->base_operations.delete_func_ptr(base_block);
80 cal_base_data_delete(p->base_data);
81 __cal_base_block_delete(base_block);
85 static Eina_Bool __cal_base_block_foreach_create_item_cb(cal_base_data_item_h item_data, void *user_data)
87 c_retv_if(!user_data, EINA_FALSE);
88 c_retv_if(!item_data, EINA_FALSE);
90 cal_base_block_s *p = user_data;
91 Evas_Object *ly = NULL;
93 cal_base_block_item *block_item = NULL;
95 if (p->base_operations.new_item_func_ptr) {
96 block_item = p->base_operations.new_item_func_ptr();
98 CAL_CALLOC(block_item, 1, cal_base_block_item);
100 c_retv_if(!block_item, EINA_FALSE);
102 block_item->item_data= item_data;
104 ly = p->base_operations.create_item_layout_func_ptr(p, item_data);
106 ERR("create_item_layout_func_ptr is failed!");
114 p->base_block_list = eina_list_append(p->base_block_list, block_item);
119 void cal_base_block_create_block_list(cal_base_block_h base_block)
121 c_ret_if(!base_block);
123 cal_base_block_s *p = (cal_base_block_s *)base_block;
124 c_ret_if(!p->base_data);
126 cal_base_data_foreach_items(__cal_base_block_foreach_create_item_cb, p->base_data, p);
129 void cal_base_block_destroy_block_list(cal_base_block_h base_block)
131 c_ret_if(!base_block);
133 cal_base_block_s *p = (cal_base_block_s *)base_block;
135 cal_base_block_item *block_item = NULL;
137 EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
139 if (p->base_operations.delete_item_func_ptr) {
140 p->base_operations.delete_item_func_ptr(block_item);
142 if (block_item->ly) {
143 evas_object_del(block_item->ly);
147 p->base_block_list = eina_list_remove(p->base_block_list, block_item);
152 eina_list_free(p->base_block_list);
154 p->base_block_list = NULL;
158 static void __cal_base_block_delete(cal_base_block_h base_block)
160 c_ret_if(!base_block);
162 cal_base_block_s *p = (cal_base_block_s *)base_block;
164 cal_base_block_destroy_block_list(base_block);
169 void cal_base_block_move_item(cal_base_block_h base_block, cal_base_block_item_h block_item, Evas_Coord_Rectangle *base)
171 c_ret_if(!base_block);
172 c_ret_if(!block_item);
175 cal_base_block_s *p = (cal_base_block_s *)base_block;
176 c_ret_if(!p->base_operations.move_item_layout_func_ptr);
178 p->base_operations.move_item_layout_func_ptr(base_block, block_item, base);
181 void cal_base_block_update(cal_base_block_h base_block)
183 c_ret_if(!base_block);
185 cal_base_block_s *p = (cal_base_block_s *)base_block;
187 if (p->base_operations.update_func_ptr) {
188 p->base_operations.update_func_ptr(base_block);
190 cal_base_block_destroy_block_list(base_block);
192 cal_base_data_destroy_data_list(p->base_data);
194 cal_base_data_load(p->base_data);
196 cal_base_data_create_data_list(p->base_data);
198 cal_base_block_create_block_list(base_block);
202 void cal_base_block_show(cal_base_block_h base_block)
204 c_ret_if(!base_block);
206 cal_base_block_s *p = (cal_base_block_s *)base_block;
208 cal_base_block_item *block_item = NULL;
211 EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
213 if (block_item->ly) {
214 evas_object_show(block_item->ly);
220 void cal_base_block_hide(cal_base_block_h base_block)
222 c_ret_if(!base_block);
224 cal_base_block_s *p = (cal_base_block_s *)base_block;
226 cal_base_block_item *block_item = NULL;
229 EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
231 if (block_item->ly) {
232 evas_object_hide(block_item->ly);
238 int cal_base_block_foreach_items(cal_base_block_query_item_cb callback, cal_base_block_h base_block, void *usr_data)
240 c_retv_if(!base_block, -1);
241 cal_base_block_s* p = (cal_base_block_s *)base_block;
244 c_retv_if(!p->base_block_list, -1);
246 cal_base_block_item *block_item = NULL;
249 EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
251 if (block_item->item_data) {
252 int line_index = cal_base_data_get_item_line_index(block_item->item_data);
253 int height = cal_base_data_get_item_height(block_item->item_data);
254 Eina_Bool is_continue = (*callback)((cal_base_block_item_h)block_item, line_index, height, usr_data);