2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://floralicense.org/license/
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.
17 #include <Elementary.h>
19 #include "cst-call-setting.h"
21 #include "cst-delete-list.h"
22 #include "cst-widget.h"
23 #include "cst-common.h"
24 #include "cst-common-string.h"
27 #include "cst-reject-msg.h"
28 #include "cst-tapi-request.h"
30 static Elm_Genlist_Item_Class *itc_1text_2text1icon = NULL;
35 Evas_Object *main_layout;
36 Evas_Object *inter_layout;
38 Evas_Object *select_all_layout;
39 Evas_Object *select_all_checkbox;
40 Eina_Bool select_all_checked;
46 } Delete_List_View_Data;
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);
53 static int kind_of_delete_list;
54 static Evas_Object *ec_item[3];
56 static void __cst_destroy_genlist_item_styles(void)
58 ENTER(__cst_destroy_genlist_item_styles);
60 if (itc_1text_2text1icon) {
61 elm_genlist_item_class_free(itc_1text_2text1icon);
62 itc_1text_2text1icon = NULL;
66 static void __cst_on_click_cancel_button(void *data, Evas_Object *obj, void *event_info)
68 ENTER(__cst_on_click_cancel_button);
69 Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
72 CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
75 _cst_del_selectinfo(ugd);
76 elm_naviframe_item_pop(ugd->nf);
78 evas_object_data_set(vd->genlist, "delete_view_data", NULL);
82 _cst_destroy_delete_list();
85 static void __cst_on_click_delete_button(void *data, Evas_Object *obj, void *event_info)
87 ENTER(__cst_on_click_delete_button);
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;
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");
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");
110 del_list_it = elm_genlist_first_item_get(vd->genlist);
111 if (del_list_it == NULL) {
112 DBG("del_list_it = NULL, returning");
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");
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");
132 if (del_item_data->check == EINA_FALSE) {
133 _cst_set_reject_message(i, prev_item_data->label);
136 del_list_it = elm_genlist_item_next_get(del_list_it);
138 prev_it = elm_genlist_item_next_get(prev_it);
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);
146 DBG("wrong request");
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);
156 static void __cst_update_check_state(Delete_List_View_Data *vd)
159 ENTER(__cst_update_check_state);
160 CstUgData_t *ugd = (CstUgData_t *)vd->ugd;
164 label = calloc(CST_MAX_ITEM_TEXT_BUFFER_LEN, sizeof(char));
165 ret_if(label == NULL);
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;
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);
177 _cst_create_selectinfo(ugd, vd->main_layout, label);
178 elm_object_disabled_set(ec_item[0], EINA_FALSE);
180 _cst_hide_selectinfo_cb(ugd);
181 elm_object_disabled_set(ec_item[0], EINA_TRUE);
186 static void __cst_check_select_all(Delete_List_View_Data *vd)
188 CstGlItemData_t *it_data;
191 if (vd->select_all_checked) {
192 vd->checked_count = vd->total_count;
194 vd->checked_count = 0;
197 it = elm_genlist_first_item_get(vd->genlist);
199 it_data = elm_object_item_data_get(it);
201 it_data->check = vd->select_all_checked;
203 it = elm_genlist_item_next_get(it);
205 /* Update all realized items */
206 elm_genlist_realized_items_update(vd->genlist);
207 __cst_update_check_state(vd);
210 static void __cst_select_all_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
212 ret_if(NULL == data);
213 Delete_List_View_Data *vd = (Delete_List_View_Data *)data;
215 vd->select_all_checked = !vd->select_all_checked;
216 elm_check_state_pointer_set(vd->select_all_checkbox, &vd->select_all_checked);
218 __cst_check_select_all(vd);
221 static void __cst_select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
223 __cst_check_select_all(data);
226 static void __cst_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
228 ret_if(data == NULL);
229 ENTER(__cst_check_changed_cb);
231 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
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");
237 if (item_data->check) {
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;
248 vd->select_all_checked = EINA_FALSE;
251 elm_check_state_pointer_set(vd->select_all_checkbox,
252 &vd->select_all_checked);
254 __cst_update_check_state(vd);
257 static char *__cst_gl_label_get_delete_list(void *data, Evas_Object *obj, const char *part)
259 retv_if(NULL == data, NULL);
260 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
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);
274 static Evas_Object *__cst_gl_icon_get_delete_list(void *data, Evas_Object *obj, const char *part)
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;
290 static void __cst_gl_del_delete_list(void *data, Evas_Object *obj)
292 ret_if(NULL == data);
293 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
295 if (item_data->label) {
296 free(item_data->label);
304 static void __cst_gl_sel_delete_list(void *data, Evas_Object *obj, void *event_info)
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);
313 item_data->check = !item_data->check;
314 if (item_data->check) {
319 elm_check_state_pointer_set(item_data->eo_check, &item_data->check);
321 if (vd->select_all_layout) {
322 if (vd->total_count == vd->checked_count) {
323 vd->select_all_checked = EINA_TRUE;
325 vd->select_all_checked = EINA_FALSE;
328 elm_check_state_pointer_set(vd->select_all_checkbox,
329 &vd->select_all_checked);
332 __cst_update_check_state(vd);
335 static Evas_Object *__cst_create_delete_list_genlist(Delete_List_View_Data *vd)
337 ENTER(__cst_create_delete_list_genlist);
338 retv_if(NULL == vd, NULL);
340 CstGlItemData_t *item_data;
341 CstUgData_t *ugd = vd->ugd;
342 retv_if(ugd == NULL, NULL);
343 Evas_Object *genlist;
345 genlist = elm_genlist_add(ugd->nf);
346 retv_if(NULL == genlist, NULL);
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);
352 if (!itc_1text_2text1icon) {
353 itc_1text_2text1icon = elm_genlist_item_class_new();
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);
361 itc_1text_2text1icon->func.content_get = __cst_gl_icon_get_delete_list;
362 itc_1text_2text1icon->func.del = __cst_gl_del_delete_list;
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);
372 DBG("wrong request");
378 item_data->index = index;
379 item_data->ugd = ugd;
380 item_data->gl_item = elm_genlist_item_append(genlist,
381 itc_1text_2text1icon,
383 NULL, ELM_GENLIST_ITEM_NONE,
384 __cst_gl_sel_delete_list, item_data);
386 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
390 static Evas_Object *__cst_create_delete_list_layout(Delete_List_View_Data *view_data)
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;
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);
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);
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);
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);
427 elm_box_pack_end(view_data->box, genlist);
428 evas_object_show(genlist);
430 return view_data->box;
433 void _cst_create_delete_list(void *data, Evas_Object *obj, void *event_info)
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;
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;
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();
454 DBG("wrong request");
455 free(delete_list_view);
456 delete_list_view = NULL;
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);
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);
472 elm_object_part_content_set(delete_list_view->main_layout,
473 "elm.swallow.contents", delete_list_view->inter_layout);
475 if (kind_of_delete_list == CST_DL_REJECT_CALL_WITH_MSG) {
476 navi_it = elm_naviframe_item_push(ugd->nf,
478 delete_list_view->main_layout, NULL);
481 Evas_Object *back_btn = elm_object_item_part_content_get(navi_it,
484 evas_object_del(back_btn);
487 __cst_update_check_state(delete_list_view);
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,
496 ret_if(NULL == ec_item[1]);
497 elm_object_disabled_set(ec_item[0], EINA_TRUE);
501 void _cst_destroy_delete_list(void)
503 ENTER(_cst_create_delete_list);
505 __cst_destroy_genlist_item_styles();