c7108e9c6321dad13b946033ad46a0e879204f44
[apps/core/preloaded/calendar.git] / src / base-block.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-block.h"
18 #include "day-event-block.h"
19
20 static void  __cal_base_block_delete(cal_base_block_h base_block);
21
22 cal_base_block_h cal_base_block_new(cal_base_type type, Evas_Object *parent, Evas_Object *clip, void *data)
23 {
24         c_retv_if(!parent, NULL);
25         c_retv_if(!clip, NULL);
26
27         cal_base_block_s *base_block = NULL;
28
29         switch (type) {
30                 case _CAL_BASE_TYPE_EVENT:
31                         base_block = (cal_base_block_s *)cal_day_event_block_create();
32                         break;
33                 default:
34                         break;
35         }
36         c_retv_if(!base_block, NULL);
37
38         base_block->base_data = cal_base_data_new(type, data);
39         base_block->parent = parent;
40         base_block->clip = clip;
41
42         cal_base_data_load(base_block->base_data);
43         cal_base_data_create_data_list(base_block->base_data);
44
45         cal_base_block_create_block_list(base_block);
46
47         return base_block;
48 }
49
50 cal_base_block_h cal_base_block_create(cal_base_block_operations *base_operations)
51 {
52         c_retv_if(!base_operations, NULL);
53         c_retv_if(!base_operations->new_func_ptr, NULL);
54
55         cal_base_block_h base_block = base_operations->new_func_ptr();
56         c_retv_if(!base_block , NULL);
57
58         cal_base_block_s *p =  (cal_base_block_s *)base_block;
59
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;
67
68         return base_block;
69 }
70
71 void cal_base_block_delete(cal_base_block_h base_block)
72 {
73         c_ret_if(!base_block);
74
75         cal_base_block_s *p =  (cal_base_block_s *)base_block;
76
77         if (p->base_operations.delete_func_ptr) {
78                 p->base_operations.delete_func_ptr(base_block);
79         } else {
80                 cal_base_data_delete(p->base_data);
81                 __cal_base_block_delete(base_block);
82         }
83 }
84
85 static Eina_Bool __cal_base_block_foreach_create_item_cb(cal_base_data_item_h item_data, void *user_data)
86 {
87         c_retv_if(!user_data, EINA_FALSE);
88         c_retv_if(!item_data, EINA_FALSE);
89
90         cal_base_block_s *p = user_data;
91         Evas_Object *ly = NULL;
92
93         cal_base_block_item *block_item = NULL;
94
95         if (p->base_operations.new_item_func_ptr) {
96                 block_item = p->base_operations.new_item_func_ptr();
97         } else {
98                 CAL_CALLOC(block_item, 1, cal_base_block_item);
99         }
100         c_retv_if(!block_item, EINA_FALSE);
101
102         block_item->item_data= item_data;
103
104         ly = p->base_operations.create_item_layout_func_ptr(p, item_data);
105         if(!ly) {
106                 ERR("create_item_layout_func_ptr is failed!");
107                 free(block_item);
108                 return EINA_FALSE;
109         }
110
111
112         block_item->ly = ly;
113
114         p->base_block_list = eina_list_append(p->base_block_list, block_item);
115
116         return EINA_TRUE;
117 }
118
119 void  cal_base_block_create_block_list(cal_base_block_h base_block)
120 {
121         c_ret_if(!base_block);
122
123         cal_base_block_s *p = (cal_base_block_s *)base_block;
124         c_ret_if(!p->base_data);
125
126         cal_base_data_foreach_items(__cal_base_block_foreach_create_item_cb, p->base_data, p);
127 }
128
129 void  cal_base_block_destroy_block_list(cal_base_block_h base_block)
130 {
131         c_ret_if(!base_block);
132
133         cal_base_block_s *p = (cal_base_block_s *)base_block;
134         Eina_List *l;
135         cal_base_block_item *block_item = NULL;
136
137         EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
138                 if (block_item) {
139                         if (p->base_operations.delete_item_func_ptr) {
140                                 p->base_operations.delete_item_func_ptr(block_item);
141                         } else {
142                                 if (block_item->ly) {
143                                         evas_object_del(block_item->ly);
144                                 }
145                                 free(block_item);
146                         }
147                         p->base_block_list = eina_list_remove(p->base_block_list, block_item);
148
149                 }
150         }
151
152         eina_list_free(p->base_block_list);
153
154         p->base_block_list = NULL;
155
156 }
157
158 static void  __cal_base_block_delete(cal_base_block_h base_block)
159 {
160         c_ret_if(!base_block);
161
162         cal_base_block_s *p = (cal_base_block_s *)base_block;
163
164         cal_base_block_destroy_block_list(base_block);
165
166         CAL_FREE(p);
167 }
168
169 void cal_base_block_move_item(cal_base_block_h base_block, cal_base_block_item_h block_item, Evas_Coord_Rectangle *base)
170 {
171         c_ret_if(!base_block);
172         c_ret_if(!block_item);
173         c_ret_if(!base);
174
175         cal_base_block_s *p =  (cal_base_block_s *)base_block;
176         c_ret_if(!p->base_operations.move_item_layout_func_ptr);
177
178         p->base_operations.move_item_layout_func_ptr(base_block, block_item, base);
179 }
180
181 void cal_base_block_update(cal_base_block_h base_block)
182 {
183         c_ret_if(!base_block);
184
185         cal_base_block_s *p =  (cal_base_block_s *)base_block;
186
187         if (p->base_operations.update_func_ptr) {
188                 p->base_operations.update_func_ptr(base_block);
189         } else {
190                 cal_base_block_destroy_block_list(base_block);
191
192                 cal_base_data_destroy_data_list(p->base_data);
193
194                 cal_base_data_load(p->base_data);
195
196                 cal_base_data_create_data_list(p->base_data);
197
198                 cal_base_block_create_block_list(base_block);
199         }
200 }
201
202 void    cal_base_block_show(cal_base_block_h base_block)
203 {
204         c_ret_if(!base_block);
205
206         cal_base_block_s *p = (cal_base_block_s *)base_block;
207
208         cal_base_block_item *block_item = NULL;
209         Eina_List *l;
210
211         EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
212                 if (block_item) {
213                         if (block_item->ly) {
214                                 evas_object_show(block_item->ly);
215                         }
216                 }
217         }
218 }
219
220 void    cal_base_block_hide(cal_base_block_h base_block)
221 {
222         c_ret_if(!base_block);
223
224         cal_base_block_s *p = (cal_base_block_s *)base_block;
225
226         cal_base_block_item *block_item = NULL;
227         Eina_List *l;
228
229         EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
230                 if (block_item) {
231                         if (block_item->ly) {
232                                 evas_object_hide(block_item->ly);
233                         }
234                 }
235         }
236 }
237
238 int  cal_base_block_foreach_items(cal_base_block_query_item_cb callback, cal_base_block_h base_block, void *usr_data)
239 {
240         c_retv_if(!base_block, -1);
241         cal_base_block_s* p = (cal_base_block_s *)base_block;
242
243         c_retv_if(!p, -1);
244         c_retv_if(!p->base_block_list, -1);
245
246         cal_base_block_item *block_item = NULL;
247         Eina_List *l;
248
249         EINA_LIST_FOREACH(p->base_block_list, l, block_item) {
250                 if (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);
255                                 if (!is_continue)
256                                         break;
257                         }
258                 }
259         }
260
261         return 0;
262 }