Remove auto reject list
[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-reject-msg.h"
27 #include "cst-tapi-request.h"
28
29 static Elm_Genlist_Item_Class *itc_1text_2text1icon = NULL;
30 extern char *header;
31
32 typedef struct {
33         Evas_Object *box;
34         Evas_Object *main_layout;
35         Evas_Object *inter_layout;
36         Evas_Object *genlist;
37         Evas_Object *select_all_layout;
38         Evas_Object *select_all_checkbox;
39         Eina_Bool select_all_checked;
40
41         int total_count;
42         int checked_count;
43
44         void *ugd;
45 } Delete_List_View_Data;
46
47 static void __cst_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
48 static void __cst_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
49 static void __cst_update_check_state(Delete_List_View_Data *vd);
50
51 static int kind_of_delete_list;
52 static Elm_Object_Item *ec_item[3];
53
54 static void __cst_on_click_cancel_button(void *data, Evas_Object *obj, void *event_info)
55 {
56         ENTER(__cst_on_click_cancel_button);
57         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
58
59         ret_if(vd == NULL);
60         CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
61         ret_if(ugd == NULL);
62
63         _cst_del_selectinfo(ugd);
64         elm_naviframe_item_pop(ugd->nf);
65
66         evas_object_data_set(vd->genlist, "delete_view_data", NULL);
67         free(vd);
68         vd = NULL;
69 }
70
71 static void __cst_on_click_delete_button(void *data, Evas_Object *obj, void *event_info)
72 {
73         ENTER(__cst_on_click_delete_button);
74         ret_if(NULL == data);
75         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
76         CstUgData_t *ugd = vd->ugd;
77         Elm_Object_Item *prev_it = NULL;
78         Elm_Object_Item *del_list_it = NULL;
79         CstGlItemData_t *del_item_data, *prev_item_data;
80         int i = 0;
81
82         prev_it = elm_genlist_first_item_get(ugd->backup_genlist);
83         del_list_it = elm_genlist_first_item_get(vd->genlist);
84
85         switch (ugd->kind_of_delete_list) {
86         case CST_DL_REJECT_CALL_WITH_MSG:
87                 while (prev_it != NULL && del_list_it != NULL) {
88                         prev_item_data = (CstGlItemData_t *)elm_object_item_data_get(prev_it);
89                         if (prev_item_data->index != -1) {
90                                 del_item_data = (CstGlItemData_t *)elm_object_item_data_get(del_list_it);
91                                 if (del_item_data->check == EINA_FALSE) {
92                                         _cst_set_reject_message(i, prev_item_data->label);
93                                         i++;
94                                 }
95                                 del_list_it = elm_genlist_item_next_get(del_list_it);
96                         }
97                         prev_it = elm_genlist_item_next_get(prev_it);
98                 }
99                 _cst_set_num_of_reject_message(i);
100                 _cst_set_reject_msg_button_status(i);
101                 elm_genlist_clear(ugd->backup_genlist);
102                 _cst_genlist_append_reject_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[0], EINA_TRUE);
131         } else {
132                 elm_object_item_disabled_set(ec_item[0], 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                 retv_if(NULL == 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") || !strcmp(part, "elm.icon")) {
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
288         elm_genlist_homogeneous_set(genlist, EINA_TRUE);
289         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
290         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
291
292         if (!itc_1text_2text1icon)
293                 itc_1text_2text1icon = elm_genlist_item_class_new();
294
295         itc_1text_2text1icon->item_style = "1text";
296         itc_1text_2text1icon->func.text_get = __cst_gl_label_get_delete_list;
297         itc_1text_2text1icon->decorate_all_item_style = "edit_default";
298         elm_genlist_decorate_mode_set(genlist, EINA_TRUE);
299
300         itc_1text_2text1icon->func.content_get = __cst_gl_icon_get_delete_list;
301         itc_1text_2text1icon->func.del = __cst_gl_del_delete_list;
302
303         for (index = 0; index < vd->total_count; index++) {
304                 item_data = calloc(1, sizeof(CstGlItemData_t));
305                 retv_if(item_data == NULL, NULL);
306                 switch (ugd->kind_of_delete_list) {
307                 case CST_DL_REJECT_CALL_WITH_MSG:
308                         item_data->label = _cst_get_reject_message(index);
309                         break;
310                 default:
311                         DBG("wrong request");
312                         free(item_data);
313                         item_data = NULL;
314                         return NULL;
315                 }
316
317                 item_data->index = index;
318                 item_data->ugd = ugd;
319                 item_data->gl_item = elm_genlist_item_append(genlist,
320                                                                  itc_1text_2text1icon,
321                                                              item_data,
322                                                              NULL, ELM_GENLIST_ITEM_NONE,
323                                                              __cst_gl_sel_delete_list, item_data);
324         }
325         elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
326         return genlist;
327 }
328
329 static Evas_Object *__cst_create_delete_list_layout(Delete_List_View_Data *view_data)
330 {
331         ENTER(__cst_create_delete_list_layout);
332         retv_if(NULL == view_data, NULL);
333         CstUgData_t *ugd = (CstUgData_t *)view_data->ugd;
334         Evas_Object *genlist = view_data->genlist;
335
336         elm_win_conformant_set(ugd->base, EINA_TRUE);
337
338         Evas_Object *conform = elm_conformant_add(ugd->nf);
339         elm_object_style_set(conform, "internal_layout");
340         evas_object_size_hint_weight_set(conform,
341                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
342         evas_object_show(conform);
343
344         view_data->box = elm_box_add(ugd->nf);
345         evas_object_size_hint_weight_set(view_data->box,
346                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
347         evas_object_show(view_data->box);
348
349         /* Append 'Select All' layout */
350         view_data->select_all_layout = elm_layout_add(view_data->box);
351         elm_layout_theme_set(view_data->select_all_layout,
352                 "genlist", "item", "select_all/default");
353         evas_object_size_hint_weight_set(view_data->select_all_layout,
354                 EVAS_HINT_EXPAND, EVAS_HINT_FILL);
355         evas_object_size_hint_align_set(view_data->select_all_layout,
356                 EVAS_HINT_FILL, EVAS_HINT_FILL);
357         evas_object_event_callback_add(view_data->select_all_layout,
358                 EVAS_CALLBACK_MOUSE_DOWN, __cst_select_all_layout_mouse_down_cb, view_data);
359
360         view_data->select_all_checkbox = elm_check_add(view_data->select_all_layout);
361         elm_object_part_content_set(view_data->select_all_layout,
362                 "elm.icon", view_data->select_all_checkbox);
363         elm_check_state_pointer_set(view_data->select_all_checkbox,
364                 &view_data->select_all_checked);
365         evas_object_smart_callback_add(view_data->select_all_checkbox,
366                 "changed", __cst_select_all_check_changed_cb, view_data);
367         evas_object_propagate_events_set(view_data->select_all_checkbox, EINA_FALSE);
368
369         elm_object_part_text_set(view_data->select_all_layout,
370                 "elm.text", (char *)(T_(CST_STR_SELECT_ALL)));
371         elm_box_pack_start(view_data->box, view_data->select_all_layout);
372         evas_object_show(view_data->select_all_layout);
373
374         elm_box_pack_end(view_data->box, genlist);
375         evas_object_show(genlist);
376         elm_object_content_set(conform, view_data->box);
377
378         return conform;
379 }
380
381 void _cst_create_delete_list(void *data, Evas_Object *obj, void *event_info)
382 {
383         ENTER(_cst_create_delete_list);
384         ret_if(NULL == data);
385         CstUgData_t *ugd = (CstUgData_t *)data;
386         Delete_List_View_Data *delete_list_view = NULL;
387         Evas_Object *cbar;
388         Elm_Object_Item *navi_it = NULL;
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_REJECT_CALL_WITH_MSG:
399                 delete_list_view->total_count = _cst_get_num_of_reject_message();
400                 break;
401         default:
402                 DBG("wrong request");
403                 free(delete_list_view);
404                 delete_list_view = NULL;
405                 return;
406         }
407
408         delete_list_view->genlist = __cst_create_delete_list_genlist(delete_list_view);
409         evas_object_data_set(delete_list_view->genlist, "delete_view_data", delete_list_view);
410         delete_list_view->inter_layout = __cst_create_delete_list_layout(delete_list_view);
411
412         /*Create layout */
413         delete_list_view->main_layout = elm_layout_add(ugd->nf);
414         elm_layout_file_set(delete_list_view->main_layout, EDJ_NAME, "toolbar");
415         evas_object_size_hint_weight_set(delete_list_view->main_layout,
416                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
417         evas_object_size_hint_align_set(delete_list_view->main_layout,
418                 EVAS_HINT_FILL, EVAS_HINT_FILL);
419
420         elm_object_part_content_set(delete_list_view->main_layout,
421                 "elm.swallow.contents", delete_list_view->inter_layout);
422
423         if (kind_of_delete_list == CST_DL_REJECT_CALL_WITH_MSG) {
424                 navi_it = elm_naviframe_item_push(ugd->nf,
425                         header, NULL, NULL,
426                         delete_list_view->main_layout, "1line");
427         }
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_DELETE), CST_CTRL_ICON_DELETE,
435                         __cst_on_click_delete_button,
436                         (char *)T_(CST_STR_CANCEL), CST_CTRL_ICON_CLOSE,
437                         __cst_on_click_cancel_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[0], EINA_TRUE);
442         LEAVE();
443 }
444