3f6093794cc3ad81c01a49162e67b7c66a1ca1d0
[apps/home/call-setting.git] / src / cst-delete-list.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   * http://www.tizenopensource.org/license
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16
17 #include <Elementary.h>
18
19 #include "cst-call-setting.h"
20
21 #include "cst-delete-list.h"
22 #include "cst-widget.h"
23 #include "cst-common.h"
24 #include "cst-common-string.h"
25
26 #include "cst-prefix-dial.h"
27
28 static Elm_Genlist_Item_Class *itc_1text = NULL;
29
30 typedef struct {
31         Evas_Object *box;
32         Evas_Object *main_layout;
33         Evas_Object *inter_layout;
34         Evas_Object *genlist;
35         Evas_Object *select_all_layout;
36         Evas_Object *select_all_checkbox;
37         Eina_Bool select_all_checked;
38
39         int total_count;
40         int checked_count;
41
42         void *ugd;
43 } Delete_List_View_Data;
44
45 static void __cst_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
46 static void __cst_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
47 static void __cst_update_check_state(Delete_List_View_Data *vd);
48
49 static int kind_of_delete_list;
50 static Elm_Object_Item *ec_item[3];
51
52 static void __cst_on_click_cancel_button(void *data, Evas_Object *obj, void *event_info)
53 {
54         ENTER(__cst_on_click_cancel_button);
55         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
56
57         ret_if(vd == NULL);
58         CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
59         ret_if(ugd == NULL);
60
61         _cst_del_selectinfo(ugd);
62         elm_naviframe_item_pop(ugd->nf);
63
64         evas_object_data_set(vd->genlist, "delete_view_data", NULL);
65         free(vd);
66         vd = NULL;
67 }
68
69 static void __cst_on_click_delete_button(void *data, Evas_Object *obj, void *event_info)
70 {
71         ENTER(__cst_on_click_delete_button);
72         ret_if(NULL == data);
73         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
74         CstUgData_t *ugd = vd->ugd;
75         Elm_Object_Item *prev_it = NULL;
76         Elm_Object_Item *del_list_it = NULL;
77         CstGlItemData_t *del_item_data, *prev_item_data;
78         int i = 0;
79
80         prev_it = elm_genlist_first_item_get(ugd->backup_genlist);
81         del_list_it = elm_genlist_first_item_get(vd->genlist);
82
83         switch (ugd->kind_of_delete_list) {
84         case CST_DL_PREFIX_DIALING:
85                 while (prev_it != NULL && del_list_it != NULL) {
86                         prev_item_data = (CstGlItemData_t *)elm_object_item_data_get(prev_it);
87                         if (prev_item_data->index != -1) {
88                                 del_item_data = (CstGlItemData_t *)elm_object_item_data_get(del_list_it);
89                                 if (del_item_data->check == EINA_FALSE) {
90                                         _cst_set_prefix_dialling_list(i, prev_item_data->label);
91                                         i++;
92                                 }
93                                 del_list_it = elm_genlist_item_next_get(del_list_it);
94                         }
95                         prev_it = elm_genlist_item_next_get(prev_it);
96                 }
97                 _cst_set_active_prefix_vconf(i - 1);
98                 if(ugd->prefix_gl_list_item != NULL)
99                         elm_genlist_item_update(ugd->prefix_gl_list_item);
100                 _cst_set_num_of_prefix_dialling_list(i);
101                 elm_genlist_clear(ugd->backup_genlist);
102                 _cst_genlist_append_dialling_list_item(ugd, ugd->backup_genlist);
103                 break;
104         default:
105                 DBG("wrong request");
106                 return;
107                 break;
108         }
109
110         __cst_on_click_cancel_button(vd, NULL, NULL);
111         _cst_create_selectinfo(ugd, ugd->backup_layout, T_(CST_STR_DELETED));
112 }
113
114 static void __cst_update_check_state(Delete_List_View_Data *vd)
115 {
116         ret_if(vd == NULL);
117         ENTER(__cst_update_check_state);
118         CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
119         ret_if(ugd == NULL);
120         char *label = NULL;
121         if (vd->checked_count != 0) {
122                 label = calloc(CST_MAX_ITEM_TEXT_BUFFER_LEN, sizeof(char));
123                 ret_if(label == NULL);
124                 snprintf(label, CST_MAX_ITEM_TEXT_BUFFER_LEN,
125                         (char *)T_(CST_STR_PD_SELECTED), vd->checked_count);
126         }
127         _cst_create_selectinfo(ugd, vd->main_layout, label);
128
129         if (vd->checked_count == 0) {
130                 elm_object_item_disabled_set(ec_item[1], EINA_TRUE);
131         } else {
132                 elm_object_item_disabled_set(ec_item[1], EINA_FALSE);
133         }
134         free(label);
135 }
136
137 static void __cst_check_select_all(Delete_List_View_Data *vd)
138 {
139         CstGlItemData_t *it_data;
140         Elm_Object_Item *it;
141         ret_if(NULL == vd);
142         if (vd->select_all_checked)
143                 vd->checked_count = vd->total_count;
144         else
145                 vd->checked_count = 0;
146
147         it = elm_genlist_first_item_get(vd->genlist);
148         while (it) {
149                 it_data = elm_object_item_data_get(it);
150                 if (it_data)
151                         it_data->check = vd->select_all_checked;
152                 it = elm_genlist_item_next_get(it);
153         }
154         // Update all realized items
155         elm_genlist_realized_items_update(vd->genlist);
156         __cst_update_check_state(vd);
157 }
158
159 static void __cst_select_all_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
160 {
161         ret_if(NULL == data);
162         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
163
164         vd->select_all_checked = !vd->select_all_checked;
165         elm_check_state_pointer_set(vd->select_all_checkbox, &vd->select_all_checked);
166
167         __cst_check_select_all(vd);
168 }
169
170 static void __cst_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
171 {
172         __cst_check_select_all(data);
173 }
174
175 static void __cst_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
176 {
177         ret_if(data == NULL);
178         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
179
180         Delete_List_View_Data *vd =
181                 (Delete_List_View_Data *)evas_object_data_get(
182                         elm_object_item_widget_get(item_data->gl_item), "delete_view_data");
183
184         if (item_data->check)
185                 vd->checked_count++;
186         else
187                 vd->checked_count--;
188
189         // update select all check button
190         if (vd->select_all_layout) {
191                 if (vd->total_count == vd->checked_count)
192                         vd->select_all_checked = EINA_TRUE;
193                 else
194                         vd->select_all_checked = EINA_FALSE;
195
196                 elm_check_state_pointer_set(vd->select_all_checkbox,
197                         &vd->select_all_checked);
198         }
199         __cst_update_check_state(vd);
200 }
201
202 static char *__cst_gl_label_get_delete_list(void *data, Evas_Object *obj, const char *part)
203 {
204         retv_if(NULL == data, NULL);
205         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
206
207         if (!strcmp(part, "elm.text")) {
208                 char *entry_label = elm_entry_markup_to_utf8(item_data->label);
209                 ret_if(entry_label == NULL);
210                 DBG("Label : %s", entry_label);
211                 char *buf = strdup(entry_label);
212                 free(entry_label);
213                 entry_label = NULL;
214                 return buf;
215         }
216         return NULL;
217 }
218
219 static Evas_Object *__cst_gl_icon_get_delete_list(void *data, Evas_Object *obj, const char *part)
220 {
221         Evas_Object *check;
222         retv_if(NULL == data, NULL);
223         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
224         if (!strcmp(part, "elm.edit.icon.1")) {
225                 check = elm_check_add(obj);
226                 elm_check_state_pointer_set(check, &item_data->check);
227                 evas_object_smart_callback_add(check, "changed",
228                         __cst_check_changed_cb, item_data);
229                 return check;
230         }
231
232         return NULL;
233 }
234
235 static void __cst_gl_del_delete_list(void *data, Evas_Object *obj)
236 {
237         ret_if(NULL == data);
238         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
239         if (item_data) {
240                 if (item_data->label)
241                         free(item_data->label);
242                 free(item_data);
243         }
244
245         return;
246 }
247
248 static void __cst_gl_sel_delete_list(void *data, Evas_Object *obj, void *event_info)
249 {
250         ret_if(NULL == data);
251         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
252         Delete_List_View_Data *vd =
253                 (Delete_List_View_Data *)evas_object_data_get(obj, "delete_view_data");
254         elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
255
256         item_data->check = !item_data->check;
257         if (item_data->check)
258                 vd->checked_count++;
259         else
260                 vd->checked_count--;
261
262         if (vd->select_all_layout) {
263                 if (vd->total_count == vd->checked_count)
264                         vd->select_all_checked = EINA_TRUE;
265                 else
266                         vd->select_all_checked = EINA_FALSE;
267
268                 elm_check_state_pointer_set(vd->select_all_checkbox,
269                         &vd->select_all_checked);
270         }
271
272         elm_genlist_item_update(item_data->gl_item);
273         __cst_update_check_state(vd);
274 }
275
276 static Evas_Object *__cst_create_delete_list_genlist(Delete_List_View_Data *vd)
277 {
278         ENTER(__cst_create_delete_list_genlist);
279         retv_if(NULL == vd, NULL);
280         int index = 0;
281         CstGlItemData_t *item_data;
282         CstUgData_t *ugd = vd->ugd;
283         retv_if(ugd == NULL, NULL);
284         Evas_Object *genlist;
285
286         genlist = elm_genlist_add(ugd->nf);
287         elm_genlist_homogeneous_set(genlist, EINA_TRUE);
288         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
289         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
290
291         if (!itc_1text)
292                 itc_1text = elm_genlist_item_class_new();
293
294         itc_1text->item_style = "1text";
295         itc_1text->func.text_get = __cst_gl_label_get_delete_list;
296         itc_1text->func.content_get = __cst_gl_icon_get_delete_list;
297         itc_1text->func.state_get = NULL;
298         itc_1text->func.del = __cst_gl_del_delete_list;
299         itc_1text->decorate_all_item_style = "edit_default";
300
301         for (index = 0; index < vd->total_count; index++) {
302                 item_data = calloc(1, sizeof(CstGlItemData_t));
303                 retv_if(item_data == NULL, NULL);
304                 switch (ugd->kind_of_delete_list) {
305                 case CST_DL_PREFIX_DIALING:
306                         item_data->label = _cst_get_prefix_dialling_list(index);
307                         break;
308                 default:
309                         DBG("wrong request");
310                         free(item_data);
311                         item_data = NULL;
312                         return;
313                         break;
314                 }
315
316                 item_data->index = index;
317                 item_data->gl_item = elm_genlist_item_append(genlist,
318                                                              itc_1text,
319                                                              item_data,
320                                                              NULL, ELM_GENLIST_ITEM_NONE,
321                                                              __cst_gl_sel_delete_list, item_data);
322         }
323         elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
324         elm_genlist_decorate_mode_set(genlist, EINA_TRUE);
325         return genlist;
326 }
327
328 static Evas_Object *__cst_create_delete_list_layout(Delete_List_View_Data *view_data)
329 {
330         ENTER(__cst_create_delete_list_layout);
331         retv_if(NULL == view_data, NULL);
332         CstUgData_t *ugd = (CstUgData_t *)view_data->ugd;
333         Evas_Object *genlist = view_data->genlist;
334
335         elm_win_conformant_set(ugd->win_main, EINA_TRUE);
336
337         Evas_Object *conform = elm_conformant_add(ugd->nf);
338         elm_object_style_set(conform, "internal_layout");
339         evas_object_size_hint_weight_set(conform,
340                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
341         evas_object_show(conform);
342
343         view_data->box = elm_box_add(ugd->nf);
344         evas_object_size_hint_weight_set(view_data->box,
345                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
346         evas_object_show(view_data->box);
347
348         // Append 'Select All' layout
349         view_data->select_all_layout = elm_layout_add(view_data->box);
350         elm_layout_theme_set(view_data->select_all_layout,
351                 "genlist", "item", "select_all/default");
352         evas_object_size_hint_weight_set(view_data->select_all_layout,
353                 EVAS_HINT_EXPAND, EVAS_HINT_FILL);
354         evas_object_size_hint_align_set(view_data->select_all_layout,
355                 EVAS_HINT_FILL, EVAS_HINT_FILL);
356         evas_object_event_callback_add(view_data->select_all_layout,
357                 EVAS_CALLBACK_MOUSE_DOWN, __cst_select_all_layout_mouse_down_cb, view_data);
358
359         view_data->select_all_checkbox = elm_check_add(view_data->select_all_layout);
360         elm_object_part_content_set(view_data->select_all_layout,
361                 "elm.icon", view_data->select_all_checkbox);
362         elm_check_state_pointer_set(view_data->select_all_checkbox,
363                 &view_data->select_all_checked);
364         evas_object_smart_callback_add(view_data->select_all_checkbox,
365                 "changed", __cst_select_all_check_changed_cb, view_data);
366         evas_object_propagate_events_set(view_data->select_all_checkbox, EINA_FALSE);
367
368         elm_object_part_text_set(view_data->select_all_layout,
369                 "elm.text", (char *)(T_(CST_STR_SELECT_ALL)));
370         elm_box_pack_start(view_data->box, view_data->select_all_layout);
371         evas_object_show(view_data->select_all_layout);
372
373         elm_box_pack_end(view_data->box, genlist);
374         evas_object_show(genlist);
375         elm_object_content_set(conform, view_data->box);
376
377         return conform;
378 }
379
380 void _cst_create_delete_list(void *data, Evas_Object *obj, void *event_info)
381 {
382         ENTER(_cst_create_delete_list);
383         ret_if(NULL == data);
384         CstUgData_t *ugd = (CstUgData_t *)data;
385         Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
386         Delete_List_View_Data *delete_list_view = NULL;
387         Evas_Object *cbar;
388         Elm_Object_Item *navi_it;
389
390         kind_of_delete_list = ugd->kind_of_delete_list;
391         delete_list_view = (Delete_List_View_Data *)calloc(1, sizeof(Delete_List_View_Data));
392         ret_if(delete_list_view == NULL);
393         delete_list_view->ugd = ugd;
394         ugd->selectinfo = NULL;
395
396         DBG("Request list : %d", kind_of_delete_list);
397         switch (kind_of_delete_list) {
398         case CST_DL_PREFIX_DIALING:
399                 delete_list_view->total_count = _cst_get_num_of_prefix_dialling_list();
400                 break;
401         default:
402                 DBG("wrong request");
403                 free(delete_list_view);
404                 delete_list_view = NULL;
405                 return;
406                 break;
407         }
408
409         delete_list_view->genlist = __cst_create_delete_list_genlist(delete_list_view);
410
411         evas_object_data_set(delete_list_view->genlist, "delete_view_data", delete_list_view);
412         delete_list_view->inter_layout = __cst_create_delete_list_layout(delete_list_view);
413
414         /*Create layout */
415         delete_list_view->main_layout = elm_layout_add(ugd->nf);
416         elm_layout_file_set(delete_list_view->main_layout, EDJ_NAME, "toolbar");
417         evas_object_size_hint_weight_set(delete_list_view->main_layout,
418                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
419         evas_object_size_hint_align_set(delete_list_view->main_layout,
420                 EVAS_HINT_FILL, EVAS_HINT_FILL);
421
422         elm_object_part_content_set(delete_list_view->main_layout,
423                 "elm.swallow.contents", delete_list_view->inter_layout);
424
425         navi_it = elm_naviframe_item_push(ugd->nf,
426                 T_(CST_STR_SELECT_NUMBER), NULL, NULL,
427                 delete_list_view->main_layout, "1line");
428
429         Evas_Object *back_btn = elm_object_item_part_content_get(navi_it,
430                 "prev_btn");
431         evas_object_del(back_btn);
432
433         cbar = _cst_create_navi_control_bar(ugd->nf,
434                         (char *)T_(CST_STR_CANCEL), CST_CTRL_ICON_CLOSE,
435                         __cst_on_click_cancel_button,
436                         (char *)T_(CST_STR_DELETE), CST_CTRL_ICON_DELETE,
437                         __cst_on_click_delete_button,
438                         (void *)delete_list_view, navi_it,
439                         ec_item);
440         ret_if((NULL == cbar) || (NULL == ec_item[1]));
441         elm_object_item_disabled_set(ec_item[1], EINA_TRUE);
442         LEAVE();
443 }