Tizen 2.1 base
[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://floralicense.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 #include "cst-util.h"
26
27 #include "cst-reject-msg.h"
28 #include "cst-tapi-request.h"
29
30 static Elm_Genlist_Item_Class *itc_1text_2text1icon = NULL;
31 extern char *header;
32
33 typedef struct {
34         Evas_Object *box;
35         Evas_Object *main_layout;
36         Evas_Object *inter_layout;
37         Evas_Object *genlist;
38         Evas_Object *select_all_layout;
39         Evas_Object *select_all_checkbox;
40         Eina_Bool select_all_checked;
41
42         int total_count;
43         int checked_count;
44
45         void *ugd;
46 } Delete_List_View_Data;
47
48 static void __cst_destroy_genlist_item_styles(void);
49 static void __cst_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
50 static void __cst_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
51 static void __cst_update_check_state(Delete_List_View_Data *vd);
52
53 static int kind_of_delete_list;
54 static Evas_Object *ec_item[3];
55
56 static void __cst_destroy_genlist_item_styles(void)
57 {
58         ENTER(__cst_destroy_genlist_item_styles);
59
60         if (itc_1text_2text1icon) {
61                 elm_genlist_item_class_free(itc_1text_2text1icon);
62                 itc_1text_2text1icon = NULL;
63         }
64 }
65
66 static void __cst_on_click_cancel_button(void *data, Evas_Object *obj, void *event_info)
67 {
68         ENTER(__cst_on_click_cancel_button);
69         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
70
71         ret_if(vd == NULL);
72         CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
73         ret_if(ugd == NULL);
74
75         _cst_del_selectinfo(ugd);
76         elm_naviframe_item_pop(ugd->nf);
77
78         evas_object_data_set(vd->genlist, "delete_view_data", NULL);
79         free(vd);
80         vd = NULL;
81
82         _cst_destroy_delete_list();
83 }
84
85 static void __cst_on_click_delete_button(void *data, Evas_Object *obj, void *event_info)
86 {
87         ENTER(__cst_on_click_delete_button);
88         ret_if(NULL == data);
89         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
90         CstUgData_t *ugd = vd->ugd;
91         Elm_Object_Item *prev_it = NULL;
92         Elm_Object_Item *del_list_it = NULL;
93         CstGlItemData_t *del_item_data, *prev_item_data;
94         int i = 0;
95
96         /* Fetch the first item which is a seperator and ignore it */
97         prev_it = elm_genlist_first_item_get(ugd->backup_genlist);
98         if (prev_it == NULL) {
99                 DBG("prev_it = NULL, returning");
100                 return;
101         }
102 #ifdef _CALL_SET_OLD_SEPERATOR
103         /* Traverse to the next item which is the Actual Delete List item */
104         prev_it = elm_genlist_item_next_get(prev_it);
105         if (prev_it == NULL) {
106                 DBG("prev_it = NULL, returning");
107                 return;
108         }
109 #endif
110         del_list_it = elm_genlist_first_item_get(vd->genlist);
111         if (del_list_it == NULL) {
112                 DBG("del_list_it = NULL, returning");
113                 return;
114         }
115
116         switch (ugd->kind_of_delete_list) {
117         case CST_DL_REJECT_CALL_WITH_MSG:
118                 while (prev_it != NULL && del_list_it != NULL) {
119                         prev_item_data = (CstGlItemData_t *)elm_object_item_data_get(prev_it);
120                         if (prev_item_data == NULL) {
121                                 DBG("prev_item_data = NULL, returning");
122                                 return;
123                         }
124
125                         if (prev_item_data->index != -1) {
126                                 del_item_data = (CstGlItemData_t *)elm_object_item_data_get(del_list_it);
127                                 if (del_item_data == NULL) {
128                                         DBG("del_item_data = NULL, returning");
129                                         return;
130                                 }
131
132                                 if (del_item_data->check == EINA_FALSE) {
133                                         _cst_set_reject_message(i, prev_item_data->label);
134                                         i++;
135                                 }
136                                 del_list_it = elm_genlist_item_next_get(del_list_it);
137                         }
138                         prev_it = elm_genlist_item_next_get(prev_it);
139                 }
140                 _cst_set_num_of_reject_message(i);
141                 _cst_set_reject_msg_button_status(i);
142                 elm_genlist_clear(ugd->backup_genlist);
143                 _cst_genlist_append_reject_list_item(ugd, ugd->backup_genlist);
144                 break;
145         default:
146                 DBG("wrong request");
147                 return;
148                 break;
149         }
150
151         __cst_on_click_cancel_button(vd, NULL, NULL);
152         _cst_create_selectinfo(ugd, ugd->backup_layout, T_(CST_STR_DELETED));
153         ugd->ticker_noti_timer = ecore_timer_add(CST_TICKERNOTI_TIMER, _cst_hide_selectinfo_cb, ugd);
154 }
155
156 static void __cst_update_check_state(Delete_List_View_Data *vd)
157 {
158         ret_if(vd == NULL);
159         ENTER(__cst_update_check_state);
160         CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
161         ret_if(ugd == NULL);
162         char *label = NULL;
163
164         label = calloc(CST_MAX_ITEM_TEXT_BUFFER_LEN, sizeof(char));
165         ret_if(label == NULL);
166
167         if (ugd->ticker_noti_timer) {
168                 _cst_hide_selectinfo_cb(ugd);
169                 ecore_timer_del(ugd->ticker_noti_timer);
170                 ugd->ticker_noti_timer = NULL;
171         }
172
173         if (vd->checked_count > 0) {
174                 snprintf(label, CST_MAX_ITEM_TEXT_BUFFER_LEN, "%s (%d)",
175                                  (char *)T_(CST_STR_SELECTED), vd->checked_count);
176
177                 _cst_create_selectinfo(ugd, vd->main_layout, label);
178                 elm_object_disabled_set(ec_item[0], EINA_FALSE);
179         } else {
180                 _cst_hide_selectinfo_cb(ugd);
181                 elm_object_disabled_set(ec_item[0], EINA_TRUE);
182         }
183         free(label);
184 }
185
186 static void __cst_check_select_all(Delete_List_View_Data *vd)
187 {
188         CstGlItemData_t *it_data;
189         Elm_Object_Item *it;
190         ret_if(NULL == vd);
191         if (vd->select_all_checked) {
192                 vd->checked_count = vd->total_count;
193         } else {
194                 vd->checked_count = 0;
195         }
196
197         it = elm_genlist_first_item_get(vd->genlist);
198         while (it) {
199                 it_data = elm_object_item_data_get(it);
200                 if (it_data) {
201                         it_data->check = vd->select_all_checked;
202                 }
203                 it = elm_genlist_item_next_get(it);
204         }
205         /* Update all realized items */
206         elm_genlist_realized_items_update(vd->genlist);
207         __cst_update_check_state(vd);
208 }
209
210 static void __cst_select_all_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
211 {
212         ret_if(NULL == data);
213         Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
214
215         vd->select_all_checked = !vd->select_all_checked;
216         elm_check_state_pointer_set(vd->select_all_checkbox, &vd->select_all_checked);
217
218         __cst_check_select_all(vd);
219 }
220
221 static void __cst_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
222 {
223         __cst_check_select_all(data);
224 }
225
226 static void __cst_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
227 {
228         ret_if(data == NULL);
229         ENTER(__cst_check_changed_cb);
230
231         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
232
233         Delete_List_View_Data *vd =
234                 (Delete_List_View_Data *)evas_object_data_get(
235                         elm_object_item_widget_get(item_data->gl_item), "delete_view_data");
236
237         if (item_data->check) {
238                 vd->checked_count++;
239         } else {
240                 vd->checked_count--;
241         }
242
243         /* update select all check button */
244         if (vd->select_all_layout) {
245                 if (vd->total_count == vd->checked_count) {
246                         vd->select_all_checked = EINA_TRUE;
247                 } else {
248                         vd->select_all_checked = EINA_FALSE;
249                 }
250
251                 elm_check_state_pointer_set(vd->select_all_checkbox,
252                                                                         &vd->select_all_checked);
253         }
254         __cst_update_check_state(vd);
255 }
256
257 static char *__cst_gl_label_get_delete_list(void *data, Evas_Object *obj, const char *part)
258 {
259         retv_if(NULL == data, NULL);
260         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
261
262         if (!strcmp(part, "elm.text")) {
263                 char *entry_label = elm_entry_markup_to_utf8(item_data->label);
264                 retv_if(NULL == entry_label, NULL);
265                 DBG("Label : %s", entry_label);
266                 char *buf = strdup(entry_label);
267                 free(entry_label);
268                 entry_label = NULL;
269                 return buf;
270         }
271         return NULL;
272 }
273
274 static Evas_Object *__cst_gl_icon_get_delete_list(void *data, Evas_Object *obj, const char *part)
275 {
276         retv_if(NULL == data, NULL);
277         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
278         if (!strcmp(part, "elm.edit.icon.1") || !strcmp(part, "elm.icon")) {
279                 item_data->eo_check = elm_check_add(obj);
280                 elm_check_state_pointer_set(item_data->eo_check, &item_data->check);
281                 evas_object_smart_callback_add(item_data->eo_check, "changed",
282                                                                            __cst_check_changed_cb, item_data);
283                 evas_object_propagate_events_set(item_data->eo_check, EINA_FALSE);
284                 return item_data->eo_check;
285         }
286
287         return NULL;
288 }
289
290 static void __cst_gl_del_delete_list(void *data, Evas_Object *obj)
291 {
292         ret_if(NULL == data);
293         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
294         if (item_data) {
295                 if (item_data->label) {
296                         free(item_data->label);
297                 }
298                 free(item_data);
299         }
300
301         return;
302 }
303
304 static void __cst_gl_sel_delete_list(void *data, Evas_Object *obj, void *event_info)
305 {
306         ENTER(__cst_gl_sel_delete_list);
307         ret_if(NULL == data);
308         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
309         Delete_List_View_Data *vd =
310                 (Delete_List_View_Data *)evas_object_data_get(obj, "delete_view_data");
311         elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
312
313         item_data->check = !item_data->check;
314         if (item_data->check) {
315                 vd->checked_count++;
316         } else {
317                 vd->checked_count--;
318         }
319         elm_check_state_pointer_set(item_data->eo_check, &item_data->check);
320
321         if (vd->select_all_layout) {
322                 if (vd->total_count == vd->checked_count) {
323                         vd->select_all_checked = EINA_TRUE;
324                 } else {
325                         vd->select_all_checked = EINA_FALSE;
326                 }
327
328                 elm_check_state_pointer_set(vd->select_all_checkbox,
329                                                                         &vd->select_all_checked);
330         }
331
332         __cst_update_check_state(vd);
333 }
334
335 static Evas_Object *__cst_create_delete_list_genlist(Delete_List_View_Data *vd)
336 {
337         ENTER(__cst_create_delete_list_genlist);
338         retv_if(NULL == vd, NULL);
339         int index = 0;
340         CstGlItemData_t *item_data;
341         CstUgData_t *ugd = vd->ugd;
342         retv_if(ugd == NULL, NULL);
343         Evas_Object *genlist;
344
345         genlist = elm_genlist_add(ugd->nf);
346         retv_if(NULL == genlist, NULL);
347
348         elm_genlist_homogeneous_set(genlist, EINA_TRUE);
349         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
350         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
351
352         if (!itc_1text_2text1icon) {
353                 itc_1text_2text1icon = elm_genlist_item_class_new();
354         }
355
356         itc_1text_2text1icon->item_style = "1text";
357         itc_1text_2text1icon->func.text_get = __cst_gl_label_get_delete_list;
358         itc_1text_2text1icon->decorate_all_item_style = "edit_default";
359         elm_genlist_decorate_mode_set(genlist, EINA_TRUE);
360
361         itc_1text_2text1icon->func.content_get = __cst_gl_icon_get_delete_list;
362         itc_1text_2text1icon->func.del = __cst_gl_del_delete_list;
363
364         for (index = 0; index < vd->total_count; index++) {
365                 item_data = calloc(1, sizeof(CstGlItemData_t));
366                 retv_if(item_data == NULL, NULL);
367                 switch (ugd->kind_of_delete_list) {
368                 case CST_DL_REJECT_CALL_WITH_MSG:
369                         item_data->label = _cst_get_reject_message(index);
370                         break;
371                 default:
372                         DBG("wrong request");
373                         free(item_data);
374                         item_data = NULL;
375                         return NULL;
376                 }
377
378                 item_data->index = index;
379                 item_data->ugd = ugd;
380                 item_data->gl_item = elm_genlist_item_append(genlist,
381                                                          itc_1text_2text1icon,
382                                                          item_data,
383                                                          NULL, ELM_GENLIST_ITEM_NONE,
384                                                          __cst_gl_sel_delete_list, item_data);
385         }
386         elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
387         return genlist;
388 }
389
390 static Evas_Object *__cst_create_delete_list_layout(Delete_List_View_Data *view_data)
391 {
392         ENTER(__cst_create_delete_list_layout);
393         retv_if(NULL == view_data, NULL);
394         CstUgData_t *ugd = (CstUgData_t *)view_data->ugd;
395         Evas_Object *genlist = view_data->genlist;
396
397         view_data->box = elm_box_add(ugd->nf);
398         evas_object_size_hint_weight_set(view_data->box,
399                                                                          EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
400         evas_object_show(view_data->box);
401
402         /* Append 'Select All' layout */
403         view_data->select_all_layout = elm_layout_add(view_data->box);
404         elm_layout_theme_set(view_data->select_all_layout,
405                                                  "genlist", "item", "select_all/default");
406         evas_object_size_hint_weight_set(view_data->select_all_layout,
407                                                                          EVAS_HINT_EXPAND, EVAS_HINT_FILL);
408         evas_object_size_hint_align_set(view_data->select_all_layout,
409                                                                         EVAS_HINT_FILL, EVAS_HINT_FILL);
410         evas_object_event_callback_add(view_data->select_all_layout,
411                                                                    EVAS_CALLBACK_MOUSE_DOWN, __cst_select_all_layout_mouse_down_cb, view_data);
412
413         view_data->select_all_checkbox = elm_check_add(view_data->select_all_layout);
414         elm_object_part_content_set(view_data->select_all_layout,
415                                                                 "elm.icon", view_data->select_all_checkbox);
416         elm_check_state_pointer_set(view_data->select_all_checkbox,
417                                                                 &view_data->select_all_checked);
418         evas_object_smart_callback_add(view_data->select_all_checkbox,
419                                                                    "changed", __cst_select_all_check_changed_cb, view_data);
420         evas_object_propagate_events_set(view_data->select_all_checkbox, EINA_FALSE);
421
422         elm_object_part_text_set(view_data->select_all_layout,
423                                                          "elm.text", (char *)(T_(CST_STR_SELECT_ALL)));
424         elm_box_pack_start(view_data->box, view_data->select_all_layout);
425         evas_object_show(view_data->select_all_layout);
426
427         elm_box_pack_end(view_data->box, genlist);
428         evas_object_show(genlist);
429
430         return view_data->box;
431 }
432
433 void _cst_create_delete_list(void *data, Evas_Object *obj, void *event_info)
434 {
435         ENTER(_cst_create_delete_list);
436         ret_if(NULL == data);
437         CstUgData_t *ugd = (CstUgData_t *)data;
438         Delete_List_View_Data *delete_list_view = NULL;
439         Elm_Object_Item *navi_it = NULL;
440
441         kind_of_delete_list = ugd->kind_of_delete_list;
442         delete_list_view = (Delete_List_View_Data *)calloc(1, sizeof(Delete_List_View_Data));
443         ret_if(delete_list_view == NULL);
444         delete_list_view->ugd = ugd;
445         ugd->selectinfo = NULL;
446         ugd->ticker_noti_timer = NULL;
447
448         DBG("Request list : %d", kind_of_delete_list);
449         switch (kind_of_delete_list) {
450         case CST_DL_REJECT_CALL_WITH_MSG:
451                 delete_list_view->total_count = _cst_get_num_of_reject_message();
452                 break;
453         default:
454                 DBG("wrong request");
455                 free(delete_list_view);
456                 delete_list_view = NULL;
457                 return;
458         }
459
460         delete_list_view->genlist = __cst_create_delete_list_genlist(delete_list_view);
461         evas_object_data_set(delete_list_view->genlist, "delete_view_data", delete_list_view);
462         delete_list_view->inter_layout = __cst_create_delete_list_layout(delete_list_view);
463
464         /*Create layout */
465         delete_list_view->main_layout = elm_layout_add(ugd->nf);
466         elm_layout_file_set(delete_list_view->main_layout, EDJ_NAME, "toolbar");
467         evas_object_size_hint_weight_set(delete_list_view->main_layout,
468                                                                          EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
469         evas_object_size_hint_align_set(delete_list_view->main_layout,
470                                                                         EVAS_HINT_FILL, EVAS_HINT_FILL);
471
472         elm_object_part_content_set(delete_list_view->main_layout,
473                                                                 "elm.swallow.contents", delete_list_view->inter_layout);
474
475         if (kind_of_delete_list == CST_DL_REJECT_CALL_WITH_MSG) {
476                 navi_it = elm_naviframe_item_push(ugd->nf,
477                         header, NULL, NULL,
478                         delete_list_view->main_layout, NULL);
479         }
480
481         Evas_Object *back_btn = elm_object_item_part_content_get(navi_it,
482                                                         "prev_btn");
483         if (back_btn) {
484                 evas_object_del(back_btn);
485         }
486
487         __cst_update_check_state(delete_list_view);
488
489         _cst_create_navi_control_bar(ugd->nf,
490                                                                                 (char *)T_(CST_STR_DELETE), CST_CTRL_ICON_DELETE,
491                                                                                 __cst_on_click_delete_button,
492                                                                                 (char *)T_(CST_STR_CANCEL), CST_CTRL_ICON_CLOSE,
493                                                                                 __cst_on_click_cancel_button,
494                                                                                 (void *)delete_list_view, navi_it,
495                                                                                 ec_item);
496         ret_if(NULL == ec_item[1]);
497         elm_object_disabled_set(ec_item[0], EINA_TRUE);
498         LEAVE();
499 }
500
501 void _cst_destroy_delete_list(void)
502 {
503         ENTER(_cst_create_delete_list);
504
505         __cst_destroy_genlist_item_styles();
506 }
507