[misc] Sycn with master branch.
[apps/core/preloaded/calendar.git] / common / grid.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.1 (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
18 #include "cld.h"
19 #include "grid.h"
20
21 typedef struct {
22         Evas_Object *gengrid;
23
24         unsigned int max_item_count;
25
26         cal_grid_item_changed_callback callback_func;
27         void *callback_data;
28 } cal_grid_s;
29
30 typedef struct {
31         Elm_Object_Item *item;
32         char *path;
33
34         cal_grid_s *data;
35 } cal_grid_item_s;
36
37 static Elm_Gengrid_Item_Class *gengrid_item_class = NULL;
38
39 static void __cal_grid_item_remove_button_callback(void *user_data, Evas_Object *obj, void *event_info)
40 {
41         CAL_FN_START;
42
43         c_ret_if(!user_data);
44         c_ret_if(!obj);
45
46         cal_grid_item_s *item = (cal_grid_item_s *)user_data;
47
48         cal_grid_s *data = item->data;
49         c_ret_if(!data);
50
51         cal_grid_item_changed_callback callback_func = data->callback_func;
52         void *callback_data = data->callback_data;
53
54         elm_object_item_del(item->item);
55
56         if (callback_func)
57                 callback_func(callback_data);
58 }
59
60 static Evas_Object * __cal_grid_content_get_callback(void *data, Evas_Object *obj, const char *part)
61 {
62         cal_grid_item_s *item = (cal_grid_item_s *)data;
63
64         if (!CAL_STRCMP(part, "elm.swallow.icon")) {
65
66                 Evas_Object *icon = elm_icon_add(obj);
67
68                 elm_icon_file_set(icon, item->path, NULL);
69                 elm_icon_aspect_fixed_set(icon, EINA_FALSE);
70                 evas_object_show(icon);
71
72                 return icon;
73
74         } else if (!CAL_STRCMP(part, "elm.swallow.end")) {
75
76                 Elm_Object_Select_Mode mode = elm_gengrid_select_mode_get(obj);
77
78                 if (mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
79                         return NULL;
80
81                 Evas_Object *remove_button = elm_button_add(obj);
82
83                 elm_object_style_set(remove_button, "minus");
84
85                 evas_object_propagate_events_set(remove_button, EINA_FALSE);
86                 evas_object_smart_callback_add(remove_button, "clicked", __cal_grid_item_remove_button_callback, data);
87                 evas_object_show(remove_button);
88
89                 return remove_button;
90         }
91
92         return NULL;
93 }
94
95 static void __cal_grid_item_delete_callback(void *data, Evas_Object *obj)
96 {
97         c_ret_if(!data);
98
99         cal_grid_item_s *item = data;
100
101         free(item->path);
102
103         free(item);
104 }
105
106 static void __cal_grid_delete_callback(void *user_data, Evas *e, Evas_Object *ly, void *ei)
107 {
108         c_ret_if(!user_data);
109
110         cal_grid_s *data = user_data;
111
112         free(data);
113 }
114
115 Evas_Object * cal_grid_create(Evas_Object *parent, cal_grid_item_changed_callback callback_func, void *callback_data)
116 {
117         CAL_FN_START;
118
119         c_retv_if(!parent, NULL);
120
121         Evas_Object *gengrid = elm_gengrid_add(parent);
122         c_retv_if(!gengrid, NULL);
123
124         cal_grid_s *data = calloc(1, sizeof(cal_grid_s));
125
126         evas_object_data_set(gengrid, "data", data);
127
128         data->gengrid = gengrid;
129         data->callback_func = callback_func;
130         data->callback_data = callback_data;
131
132         evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
133         evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL);
134
135         elm_gengrid_item_size_set(gengrid, 205, 205);
136         elm_gengrid_align_set(gengrid, 0.0, 0.0);
137         elm_gengrid_horizontal_set(gengrid, EINA_TRUE);
138         elm_gengrid_bounce_set(gengrid, EINA_FALSE, EINA_FALSE);
139         elm_gengrid_reorder_mode_set(gengrid, EINA_FALSE);
140         elm_gengrid_scroller_policy_set(gengrid, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
141         elm_gengrid_select_mode_set(gengrid, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
142
143         evas_object_event_callback_add(gengrid, EVAS_CALLBACK_DEL, __cal_grid_delete_callback, data);
144
145         if (!gengrid_item_class) {
146                 gengrid_item_class = elm_gengrid_item_class_new();
147
148                 gengrid_item_class->item_style = "grid";
149                 gengrid_item_class->func.text_get = NULL;
150                 gengrid_item_class->func.content_get = __cal_grid_content_get_callback;
151                 gengrid_item_class->func.state_get = NULL;
152                 gengrid_item_class->func.del = __cal_grid_item_delete_callback;
153         }
154
155         return gengrid;
156 }
157
158 void cal_grid_set_edit_mode(Evas_Object *grid, Eina_Bool is_edit_mode)
159 {
160         CAL_FN_START;
161
162         c_ret_if(!grid);
163
164         if (is_edit_mode == EINA_TRUE)
165                 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DEFAULT);
166         else
167                 elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
168 }
169
170 void cal_grid_set_max_item_count(Evas_Object *grid, unsigned int count)
171 {
172         CAL_FN_START;
173
174         c_ret_if(!grid);
175
176         cal_grid_s *data = evas_object_data_get(grid, "data");
177         c_ret_if(!data);
178
179         data->max_item_count = count;
180 }
181
182 unsigned int cal_grid_get_current_item_count(Evas_Object *grid)
183 {
184         CAL_FN_START;
185
186         c_retv_if(!grid, 0);
187
188         return elm_gengrid_items_count(grid);
189 }
190
191 static void __cal_grid_item_selected_callback(void *data, Evas_Object *obj, void *event_info)
192 {
193         CAL_FN_START;
194
195         c_ret_if(!data);
196         c_ret_if(!obj);
197
198         cal_grid_item_s *item = (cal_grid_item_s *)data;
199
200         if (!elm_gengrid_reorder_mode_get(obj))
201                 elm_gengrid_item_selected_set(item->item, EINA_FALSE);
202 }
203
204 Elm_Object_Item * cal_grid_append_item(Evas_Object *grid, const char *image_path)
205 {
206         c_retv_if(!grid, NULL);
207         c_retv_if(!CAL_STRLEN(image_path), NULL);
208
209         cal_grid_s *data = evas_object_data_get(grid, "data");
210         c_retv_if(!data, NULL);
211
212         if (elm_gengrid_items_count(grid) == data->max_item_count) {
213
214                 ERR("Max item count is reached.");
215
216                 return NULL;
217         }
218
219         cal_grid_item_s *item = NULL;
220
221         item = calloc(1, sizeof(cal_grid_item_s));
222
223         item->item = elm_gengrid_item_append(grid, gengrid_item_class, item, __cal_grid_item_selected_callback, item);
224         if (!item->item) {
225
226                 ERR("elm_gengrid_item_append() is failed");
227                 free(item);
228
229                 return NULL;
230         }
231
232         item->path = strdup(image_path);
233         item->data = data;
234
235         if (data->callback_func)
236                 data->callback_func(data->callback_data);
237
238         return item->item;
239 }
240
241 void cal_grid_delete_item(Evas_Object *grid, Elm_Object_Item *item)
242 {
243         c_ret_if(!grid);
244         c_ret_if(!item);
245
246         elm_object_item_del(item);
247 }
248
249 Eina_List * cal_grid_get_item_path_list(Evas_Object *grid)
250 {
251         CAL_FN_START;
252
253         Eina_List *item_path_list = NULL;
254
255         c_retv_if(!grid, NULL);
256
257         Elm_Object_Item *item = elm_gengrid_first_item_get(grid);
258
259         while (item) {
260
261                 cal_grid_item_s *item_data = elm_object_item_data_get(item);
262
263                 if (!CAL_STRLEN(item_data->path))
264                         ERR("item path is null");
265                 else
266                         item_path_list = eina_list_append(item_path_list, strdup(item_data->path));
267
268                 item = elm_gengrid_item_next_get(item);
269
270         }
271
272         return item_path_list;
273 }
274
275 void cal_grid_free_item_path_list(Eina_List *item_path_list)
276 {
277         CAL_FN_START;
278
279         c_ret_if(!item_path_list);
280
281         Eina_List *cursor = NULL;
282
283         char *item_path = NULL;
284
285         EINA_LIST_FOREACH(item_path_list, cursor, item_path)
286                 CAL_FREE(item_path);
287
288         eina_list_free(item_path_list);
289 }