diff options
Diffstat (limited to 'lib/common/ct-list-view-common.c')
-rwxr-xr-x | lib/common/ct-list-view-common.c | 1459 |
1 files changed, 1459 insertions, 0 deletions
diff --git a/lib/common/ct-list-view-common.c b/lib/common/ct-list-view-common.c new file mode 100755 index 0000000..8531e3e --- /dev/null +++ b/lib/common/ct-list-view-common.c @@ -0,0 +1,1459 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <aul.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "phone-common.h" +#include "ct-list.h" + +#include <unicode/ulocdata.h> +#include <unicode/uset.h> +#include <unicode/ustring.h> +#include <vconf.h> +#include <vconf-keys.h> + +static char pre_search_str[CT_LIST_MAX_SEARCH_STR]; + +// for removing build warning /////////////////////////////////////// +int contacts_svc_normalized_strstr(const char *str, const char *search_str, int *len); +int contacts_svc_normalize_str(const char *src, char *dest, const int dest_len); +/////////////////////////////////////////////////////////////////// + +void ctui_list_free_contacts(Eina_List* list) +{ + ct_contact_list *data; + Eina_List* l; + + EINA_LIST_FOREACH(list, l, data) { + if (data) { + free(data->img_path); + free(data->display); + free(data->normalize); + free(data->number); + free(data); + } + } + eina_list_free(list); +} + +void ctui_list_free_index(Eina_List* list) +{ + ct_list_index_data *data; + Eina_List* l; + + EINA_LIST_FOREACH(list, l, data) { + if (data) { + free(data); + } + } + eina_list_free(list); +} + + +char* ct_list_get_display_name(CTSvalue *list_info) +{ + const char *first, *last; + const char *display; + char name[PH_TEXT_MAX_LEN]; + + display = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_DISPLAY_STR); + if (display) return strdup(display); + + first = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_FIRST_STR); + last = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_LAST_STR); + + if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(first), STR_BLANK(first, last)); + else + snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(last), STR_BLANK(last, first)); + + return strdup(name); +} + +static inline int list_get_grp_contact_id(Eina_List *list) +{ + ct_contact_list *info; + if (NULL == list) return 0; + info = list->data; + return info->id; +} + +int ct_list_get_contacts(ct_list_data *clist_d, Eina_List **list) +{ + PH_FN_CALL; + int ct_id; + int ret = CTS_SUCCESS; + CTSiter *iter; + CTSfilter *filter = NULL; + Eina_List *result = NULL; + + switch (clist_d->list_op) { + case CT_GET_LIST_ALL_CONTACTS: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT, &iter); + break; + case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_HAD_NUMBER, &iter); + break; + case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_HAD_EMAIL, &iter); + break; + default: + ERR("Invalid op"); + return -1; + } + p_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_get_list...() Failed(%d)", ret); + PH_DBG("end cotnacts_svc_get_list, start iter"); + + if (filter) { + contacts_svc_get_list_with_filter(filter, &iter); + contacts_svc_list_filter_free(filter); + } + + clist_d->cnt_list = 0; + + while (CTS_SUCCESS == (ret = contacts_svc_iter_next(iter))) { + ct_contact_list *info; + CTSvalue *value; + + value = contacts_svc_iter_get_info(iter); + ct_id = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ID_INT); + + if (ct_id == clist_d->ct_id_caller) { + contacts_svc_value_free(value); + continue; + } + + info = calloc(1, sizeof(ct_contact_list)); + if (NULL == info) { + ERR("calloc() return NULL"); + contacts_svc_value_free(value); + break; + } + info->id = ct_id; + info->display = ct_list_get_display_name(value); + info->normalize = contacts_svc_value_steal_str(value, CTS_LIST_CONTACT_NORMALIZED_STR); + info->id_ab = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ADDRESSBOOK_ID_INT); + info->id_person = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_PERSON_ID_INT); + result = eina_list_append(result, info); + clist_d->cnt_list++; + contacts_svc_value_free(value); + } + contacts_svc_iter_remove(iter); + *list = result; + + if (CTS_ERR_FINISH_ITER != ret) { + ERR("contacts_svc_iter_next() Failed(%d)", ret); + return ret; + } + return 0; +} + +static inline int list_check_utf8(char c) +{ + if (c < 128) + return 1; + else if ((c & 0xe0) == 0xc0) + return 2; + else if ((c & 0xf0) == 0xe0) + return 3; + else if ((c & 0xf8) == 0xf0) + return 4; + else if ((c & 0xfc) == 0xf8) + return 5; + else if ((c & 0xfe) == 0xfc) + return 6; + else + return CTS_ERR_FAIL; +} + +static inline void list_clean_ecore_task(ct_list_data *clist_d) +{ + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } +} + +static void list_searchbar_entry_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL"); + + if (clist_d->last_sweep_item) { + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; + } +} + + +static void list_searchbar_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + ct_list_data *clist_d; + elm_object_focus_set(data, EINA_TRUE); + + clist_d = evas_object_data_get(data, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + list_searchbar_entry_clicked_cb(clist_d, NULL, NULL); +} + +static char *list_group_label_get(void *data, Evas_Object *obj, const char *part) +{ + char *group_index = data; + if (0 == strcmp(part, "elm.text") && group_index && *group_index) + return strdup(group_index); + else + return NULL; +} + +static Elm_Genlist_Item_Class group_index = +{ + .item_style = "grouptitle", + .func.text_get = list_group_label_get, +}; + +static void __list_get_group_letter(char* src, char* dest, int dest_size) +{ + + char normalized_str[PH_TEXT_MAX_LEN] = {0}; + char firtst_str[10] = {0}; + int length = 0; + + dest[0] = '\0'; + firtst_str[0] = '\0'; + length = list_check_utf8(src[0]); + p_retm_if(length < 0, "__list_get_group_letter() - (%s) is not UTF-8 type", src); + + snprintf(firtst_str, length+1, "%s", &(src[0])); + + contacts_svc_normalize_str(firtst_str, normalized_str, PH_TEXT_MAX_LEN); + length = list_check_utf8(normalized_str[0]); + + if ('a' <= normalized_str[0] && normalized_str[0] <= 'z' ) + snprintf(dest, length+1, "%c", toupper((int)normalized_str[0])); + else + snprintf(dest, length+1, "%s", &(normalized_str[0])); + + //PH_DBG("src(%s), dest(%s), length(%d)", src, dest, length); +} + +static void __list_set_index_letter(ct_list_data *clist_d) +{ + ULocaleData* uld; + USet *indexChars; + UErrorCode error = U_ZERO_ERROR; + int32_t itemCount; + int32_t j; + const char *language; + bool is_alphabet = true; + + ctui_list_free_index(clist_d->list_index); + + language = vconf_get_str(VCONFKEY_LANGSET); + PH_DBG("__list_set_index_letter - language is %s", language); + uld = ulocdata_open(language, &error); + indexChars = uset_openEmpty(); + + ulocdata_getExemplarSet(uld, indexChars, 0, ULOCDATA_ES_INDEX, &error); + ulocdata_close(uld); + + if (U_FAILURE(error)) + return; + + if (error == U_USING_DEFAULT_WARNING) + uset_clear(indexChars); + + itemCount = uset_size(indexChars); + + //temporarily set number charactors + clist_d->list_index = NULL; + ct_list_index_data *index_0 = calloc(1, sizeof(ct_list_index_data)); + snprintf(index_0->index, sizeof(index_0->index), "0"); + index_0->item = elm_index_item_append(clist_d->fast_index, index_0->index, NULL, NULL); + clist_d->list_index = eina_list_append(clist_d->list_index, index_0); + //PH_DBG("list count %d, letter 0", eina_list_count(clist_d->list_index)); + + //set primary language charactors + for (j = 0; j < itemCount; j++) + { + UChar ch[2] = {0}; + int size; + ct_list_index_data *index_list = calloc(1, sizeof(ct_list_index_data)); + ch[0] = uset_charAt(indexChars, j); + u_strToUTF8(index_list->index, sizeof(index_list->index)-1, &size, ch, -1, &error); + + Elm_Object_Item *item = elm_index_item_append(clist_d->fast_index, index_list->index, NULL, NULL); + + index_list->item = item; + clist_d->list_index = eina_list_append(clist_d->list_index, index_list); + + //PH_DBG("%d th letter is %s", j, index_list->index); + + if(j == 0) + { + if(strcmp(index_list->index, "A") != 0) + is_alphabet = false; + } + + } + + //set spcial charactor + ct_list_index_data *index_S = calloc(1, sizeof(ct_list_index_data)); + snprintf(index_S->index, sizeof(index_S->index), "#"); + index_S->item = elm_index_item_append(clist_d->fast_index, index_S->index, NULL, NULL); + clist_d->list_index = eina_list_append(clist_d->list_index, index_S); + //PH_DBG("list count %d, letter #", eina_list_count(clist_d->list_index)); + + return; +} + +static bool __is_in_primary_letter(char* letter, ct_list_data *clist_d) +{ + unsigned int count = eina_list_count(clist_d->list_index); + ct_list_index_data *first_data; + ct_list_index_data *last_data; + first_data = (ct_list_index_data*)eina_list_nth(clist_d->list_index, 1);// first letter + last_data = (ct_list_index_data*)eina_list_nth(clist_d->list_index, count-2);// last letter + //PH_DBG("list count %d, first %d, letter %d, last %d", count, *first_data->index, *letter, *last_data->index); + if(*letter >= *first_data->index && *letter <= *last_data->index) + { + return true; + } + + return false; +} + +static inline void list_append_item(ct_list_data *clist_d, ct_contact_list *item_data) +{ + Elm_Object_Item *item; + // append group title if condition is accepted + if(CT_GET_LIST_VCARD != clist_d->list_op) + { + //ct_list_index_data *skipped_index = clist_d->list_skipped_index; + char cur_index[10] = {0,}; + __list_get_group_letter(item_data->display, cur_index, sizeof(cur_index)); + + if(isdigit(cur_index[0])) + { + cur_index[0] = '0'; + cur_index[1] = '\0'; + } + else if(__is_in_primary_letter(cur_index, clist_d) == false) + { + cur_index[0] = '#'; + cur_index[1] = '\0'; + } + + if (strcmp(clist_d->group_index, cur_index)) + { + item = elm_genlist_item_append(clist_d->genlist, &group_index, strdup(cur_index), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + snprintf(clist_d->group_index, sizeof(clist_d->group_index), "%s", cur_index); + clist_d->group_item = item; + + //PH_DBG("list_append_item - group letter is %s", cur_index); + //link to fastscroll + Eina_List* l; + ct_list_index_data *data; + bool matched = false; + EINA_LIST_FOREACH(clist_d->list_index, l, data) + { + if(strcmp(cur_index, data->index) == 0) + { + //PH_DBG("list_append_item - matched letter is %s", cur_index); + matched = true; + } + + if(matched == true) + { + //PH_DBG("list_append_item - %s mapping to %s", data->index, cur_index); + elm_object_item_data_set(data->item, item); + } + } + } + } + + if (clist_d->search_str && *clist_d->search_str) + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[2], item_data, clist_d->group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + else + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[0], item_data, clist_d->group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + + item_data->item = item; + + clist_d->cnt_total++; + if (item_data->checked) clist_d->cnt_checked++; + +} + +#define N_S 10 + +static Eina_Bool list_searched_list_append_part(void *user_data) +{ + int ret, i=0; + int readed = 0; + Eina_List *cursor; + ct_contact_list *item_data; + ct_list_data *clist_d = user_data; + int len; + + cursor = eina_list_nth_list(clist_d->list, clist_d->readed_n); + EINA_LIST_FOREACH(cursor, cursor, item_data) { + if (NULL == item_data) continue; + ret = contacts_svc_normalized_strstr(item_data->normalize, clist_d->search_normalize, &len); + if (0 <= ret) { + if (i++ == N_S) break; + list_append_item(clist_d, item_data); + } + readed++; + } + if (N_S < i) { + clist_d->readed_n += readed; + return ECORE_CALLBACK_RENEW; + } + else { + clist_d->list_idler = NULL; + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + return ECORE_CALLBACK_CANCEL; + } +} + +void ctui_list_handle_search(ct_list_data *clist_d) +{ + int ret, i=0; + int readed = 0; + int len; + Eina_List *cursor; + ct_contact_list *item_data; + char normalized_str[PH_TEXT_MAX_LEN] = {0}; + + ret = contacts_svc_normalize_str(clist_d->search_str, normalized_str, PH_TEXT_MAX_LEN); + p_retm_if(ret < CTS_SUCCESS, "contacts_svc_normalize_str() Failed(%d)", ret); + free(clist_d->search_normalize); + clist_d->search_normalize = strdup(normalized_str); + + elm_genlist_clear(clist_d->genlist); + elm_index_item_clear(clist_d->fast_index); + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + clist_d->cnt_total = 0; + clist_d->cnt_checked = 0; + + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } + + EINA_LIST_FOREACH(clist_d->list, cursor, item_data) { + if (NULL == item_data) continue; + ret = contacts_svc_normalized_strstr(item_data->normalize, normalized_str, &len); + if (0 <= ret) { + if (i++ == N_S) break; + list_append_item(clist_d, item_data); + } + readed++; + } + if (N_S < i) { + clist_d->readed_n = readed; + clist_d->list_idler = ecore_idler_add(list_searched_list_append_part, clist_d); + } + else { + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + } +} +#undef N_S + +#define N 20 +static Eina_Bool list_append_part(void *user_data) +{ + + int i = 0; + Eina_List *cursor; + ct_contact_list *item_data; + ct_list_data *clist_d = user_data; + + cursor = eina_list_nth_list(clist_d->list, clist_d->readed_n); + EINA_LIST_FOREACH(cursor, cursor, item_data) { + if (i++ == N) break; + list_append_item(clist_d, item_data); + } + if (N < i) { + clist_d->readed_n += N; + return ECORE_CALLBACK_RENEW; + } + else { + clist_d->list_idler = NULL; + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + return ECORE_CALLBACK_CANCEL; + } +} + +static void list_append_all(ct_list_data *clist_d) +{ + int i = 0; + Eina_List *cursor; + ct_contact_list *item_data; + + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } + + __list_set_index_letter(clist_d); + + EINA_LIST_FOREACH(clist_d->list, cursor, item_data) { + if (i++ == N) break; + list_append_item(clist_d, item_data); + } + if (N < i) { + clist_d->readed_n = N; + clist_d->list_idler = ecore_idler_add(list_append_part, clist_d); + } + else { + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + } +} +#undef N + +void ctui_list_refresh_genlist(ct_list_data *clist_d) +{ + PH_FN_CALL; + elm_genlist_clear(clist_d->genlist); + elm_index_item_clear(clist_d->fast_index); + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + clist_d->cnt_total = 0; + clist_d->cnt_checked = 0; + list_append_all(clist_d); +} + +static void list_searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + Evas_Object *en; + Evas_Object *sb = data; + ct_list_data *clist_d; + char *search_str; + + clist_d = evas_object_data_get(sb, "clist_d"); + p_retm_if(NULL == sb, "evas_object_data_get() return NULL"); + + en = elm_object_part_content_get(sb, "elm.swallow.content"); + p_retm_if(NULL == en, "elm_object_part_content_get() return NULL"); + + if (!elm_entry_is_empty(en)) + elm_object_signal_emit(sb, "elm,state,guidetext,hide", "elm"); + + if (elm_object_focus_get(sb)) { + if (elm_entry_is_empty(en)) + elm_object_signal_emit(sb, "elm,state,eraser,hide", "elm"); + else + elm_object_signal_emit(sb, "elm,state,eraser,show", "elm"); + } + + search_str = ctui_entry_markup_to_utf8(elm_entry_entry_get(en)); + p_retm_if(NULL == search_str, "ctui_entry_markup_to_utf8() return NULL"); + p_ret_if('\0' == search_str[0] && NULL == clist_d->search_str); + + if (search_str && clist_d->search_str) + p_ret_if(0 == strcmp(search_str, clist_d->search_str)); + + PH_DBG("search string is %s", search_str); + if(NULL != search_str){ + if(strlen(search_str)>0) { + if(NULL !=clist_d->select_all_layout){ + elm_box_unpack(clist_d->box, clist_d->select_all_layout); + evas_object_del(clist_d->select_all_layout); + clist_d->select_all_layout = NULL; + } + } + else { + ctui_list_set_selectall(clist_d); + } + } + + free(clist_d->search_str); + clist_d->search_str = search_str; + + if (search_str && strcmp(pre_search_str, search_str)) { + if (*search_str) { + elm_genlist_mode_set(clist_d->genlist, ELM_LIST_COMPRESS); + ctui_list_handle_search(clist_d); + } + else { + elm_genlist_homogeneous_set(clist_d->genlist, EINA_TRUE); + elm_genlist_mode_set(clist_d->genlist, ELM_LIST_SCROLL); + ctui_list_refresh_genlist(clist_d); + } + } + snprintf(pre_search_str, sizeof(pre_search_str), "%s", search_str); + + if (elm_genlist_decorate_mode_get(clist_d->genlist) && clist_d->edit_sel_update) + clist_d->edit_sel_update(clist_d); +} + +static void list_searchbar_focused_cb(void *data, Evas_Object *obj, void *event_info) +{ + elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm"); + elm_object_signal_emit(data, "cancel,in", ""); + + if (!elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); +} + +static void list_searchbar_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *cancel_btn; + + elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); + + if (elm_entry_is_empty(obj)) { + elm_object_signal_emit(data, "elm,state,guidetext,show", "elm"); + + cancel_btn = elm_object_part_content_get(data, "button_cancel"); + evas_object_hide(cancel_btn); + elm_object_signal_emit(data, "cancel,out", ""); + } +} + +static void list_searchbar_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *sb = data; + Evas_Object *en; + ct_list_data *clist_d; + const char *text; + + p_retm_if(NULL == sb, "parameter(sb) is NULL"); + + clist_d = evas_object_data_get(sb, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + en = elm_object_part_content_get(sb, "elm.swallow.content"); + p_retm_if(NULL == en, "elm_object_part_content_get() return NULL"); + + free(clist_d->search_str); + clist_d->search_str = NULL; + + free(clist_d->search_normalize); + clist_d->search_normalize = NULL; + + text = elm_entry_entry_get(en); + if (text && *text) + elm_entry_entry_set(en, NULL); + elm_object_focus_set(en, EINA_FALSE); + + ctui_list_refresh_genlist(clist_d); + + // problem of set focus automatically on searchbar when resumed app + elm_object_focus_set(clist_d->genlist, EINA_TRUE); +} + +static void list_searchbar_eraser_cb(void *data, Evas_Object *obj, const char *emission, + const char *source) +{ + elm_entry_entry_set(data, ""); +} + +static Evas_Object* list_create_searchbar(Evas_Object* parent, ct_list_data *clist_d) +{ + Evas_Object *sb; + Evas_Object *en; + Evas_Object *cancel_btn; + + sb = elm_layout_add(parent); + p_retvm_if(NULL == sb, NULL, "elm_layout_add() return NULL"); + evas_object_data_set(sb, "clist_d", clist_d); + + elm_layout_theme_set(sb, "layout", "searchbar", "cancel_button"); + + en = elm_entry_add(sb); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_object_part_content_set(sb, "elm.swallow.content", en); + elm_object_part_text_set(sb, "elm.guidetext", S_(CT_SYS_BODY_SEARCH)); + + ctui_entry_limit_size_set(en); + elm_entry_input_panel_layout_set(en, ELM_INPUT_PANEL_LAYOUT_NORMAL); + + cancel_btn = elm_button_add(sb); + elm_object_part_content_set(sb, "button_cancel", cancel_btn); + elm_object_style_set(cancel_btn, "searchbar/default"); + elm_object_text_set(cancel_btn, "Cancel"); + + evas_object_smart_callback_add(en, "focused", list_searchbar_focused_cb, sb); + evas_object_smart_callback_add(en, "unfocused", list_searchbar_unfocused_cb, sb); + evas_object_smart_callback_add(en, "changed", list_searchbar_changed_cb, sb); + evas_object_smart_callback_add(en, "preedit,changed", list_searchbar_changed_cb, sb); + evas_object_smart_callback_add(en, "clicked", list_searchbar_entry_clicked_cb, clist_d); + elm_object_signal_callback_add(sb, "elm,bg,clicked", "elm", list_searchbar_clicked_cb, en); + elm_object_signal_callback_add(sb, "elm,eraser,clicked", "elm", list_searchbar_eraser_cb, en); + evas_object_smart_callback_add(cancel_btn, "clicked", list_searchbar_cancel_cb, sb); + + return sb; +} + +static Evas_Object* list_create_navi_content_genlist(Evas_Object* parent) +{ + Evas_Object *genlist = elm_genlist_add(parent); + + elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_genlist_block_count_set(genlist, 20); + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + + return genlist; +} + +static void list_fast_delayed_changed(void *data, Evas_Object *obj, + void *event_info) +{ + // called on a change but delayed in case multiple changes happen in a + // short timespan + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void list_fast_selected(void *data, Evas_Object *obj, void *event_info) +{ + // called on final select + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void list_start_sweep_effect(void *data) +{ + elm_genlist_item_decorate_mode_set(data, "slide", EINA_TRUE); + elm_genlist_item_select_mode_set(data, ELM_OBJECT_SELECT_MODE_NONE); +} + +char* ct_list_get_number(int id) +{ + int ret; + char *number; + CTSvalue *value; + + ret = contacts_svc_get_contact_value(CTS_GET_DEFAULT_NUMBER_VALUE, id, &value); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_contact_value() Failed(%d)", ret); + + number = contacts_svc_value_steal_str(value, CTS_NUM_VAL_NUMBER_STR); + contacts_svc_value_free(value); + + return number; +} + +static void list_gl_sweep(void *data, Evas_Object *obj, void *event_info) +{ + ct_contact_list *item_info; + ct_list_data *clist_d = data; + Elm_Object_Item *item = event_info; + Elm_Genlist_Item_Class *itc; + Elm_Genlist_Item_Type type; + + p_ret_if(!item); + p_ret_if(CT_GET_LIST_VCARD == clist_d->list_op); + p_ret_if(CT_LIST_MODE_EDIT == clist_d->list_mode); + + type = elm_genlist_item_type_get(item); + p_ret_if(ELM_GENLIST_ITEM_GROUP == type); + p_ret_if(&clist_d->itcs[4] == elm_genlist_item_item_class_get(item)); + + item_info = elm_object_item_data_get(item); + p_retm_if(NULL == item_info, "ct_contact_list is null"); + if (!item_info->number_loaded) { + item_info->number = ct_list_get_number(item_info->id_person); + item_info->number_loaded = true; + } + + itc = (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(item); + p_retm_if(NULL == itc, "item class is null"); + if ((NULL == item_info->number || '\0' == *item_info->number) + && strcmp(itc->decorate_item_style, clist_d->itcs[1].decorate_item_style)){ + if (clist_d->search_str && *clist_d->search_str) + elm_genlist_item_item_class_update(item, &clist_d->itcs[3]); + else + elm_genlist_item_item_class_update(item, &clist_d->itcs[1]); + ecore_job_add(list_start_sweep_effect, item); + clist_d->last_sweep_item = item; + return; + } + else if ((item_info->number && *item_info->number) + && strcmp(itc->decorate_item_style, clist_d->itcs[0].decorate_item_style)) { + if (clist_d->search_str && *clist_d->search_str) + elm_genlist_item_item_class_update(item, &clist_d->itcs[2]); + else + elm_genlist_item_item_class_update(item, &clist_d->itcs[0]); + ecore_job_add(list_start_sweep_effect, item); + clist_d->last_sweep_item = item; + return; + } + + clist_d->last_sweep_item = item; + elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE); +} + +static void list_gl_unsweep(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + if (NULL == clist_d->last_sweep_item) return; + + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; +} + +static void list_gl_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + elm_object_focus_set(obj, EINA_TRUE); +} + +static Evas_Object* list_create_contact_list(Evas_Object *parent, ct_list_data *clist_d) +{ + Evas_Object *layout, *fast_index, *searchbar, *genlist, *conform; + + elm_win_conformant_set(clist_d->win, EINA_TRUE); + + conform = elm_conformant_add(parent); + p_retvm_if(NULL == conform, NULL, "elm_conformant_add() return NULL"); + + elm_object_style_set(conform, "internal_layout"); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(conform); + + layout = elm_layout_add(conform); + elm_layout_file_set(layout, CONTACTS_EDJ, "genlist"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + clist_d->layout = layout; + + searchbar = list_create_searchbar(layout, clist_d); + elm_object_part_content_set(layout, "searchbar", searchbar); + evas_object_show(searchbar); + clist_d->searchbar = searchbar; + + clist_d->box = elm_box_add(layout); + evas_object_size_hint_weight_set(clist_d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(clist_d->box); + elm_object_part_content_set(layout, "content", clist_d->box); + + // Create genlist + genlist = list_create_navi_content_genlist(clist_d->box); + evas_object_show(genlist); + elm_object_theme_set(genlist, clist_d->th); + + evas_object_smart_callback_add(genlist, "drag,start,right", list_gl_sweep, clist_d); + evas_object_smart_callback_add(genlist, "drag,start,left", list_gl_unsweep, clist_d); + evas_object_smart_callback_add(genlist, "drag,start,up", list_gl_unsweep, clist_d); + evas_object_smart_callback_add(genlist, "drag,start,down", list_gl_unsweep, clist_d); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, list_gl_mouse_down_cb, clist_d); + + clist_d->genlist = genlist; + + elm_box_pack_end(clist_d->box, genlist); + evas_object_data_set(genlist, "clist_d", clist_d); + + if (CT_GET_LIST_VCARD != clist_d->list_op) { + // Create fast scroll + fast_index = elm_index_add(layout); + elm_object_part_content_set(layout, "fastscroll", fast_index); + evas_object_show(fast_index); + clist_d->fast_index = fast_index; + evas_object_smart_callback_add(fast_index, "delay,changed", list_fast_delayed_changed, + fast_index); + evas_object_smart_callback_add(fast_index, "selected", list_fast_selected, NULL); + elm_index_level_go(fast_index, 0); + } + + // Genlist item append + pre_search_str[0] = '\0'; + + evas_object_show(layout); + + elm_object_content_set(conform, layout); + + return conform; +} + +static void list_fill_contact_view(Evas_Object *parent, ct_list_data *clist_d) +{ + Evas_Object *content = NULL; + + if (clist_d->list) { + if (NULL == clist_d->genlist) { + content = list_create_contact_list(parent, clist_d); + list_append_all(clist_d); + + if (CT_LIST_MODE_EDIT == clist_d->list_mode) + ctui_list_edit_mode_start(clist_d); + elm_object_part_content_set(parent, "elm.swallow.content", content); + } + else { + if (clist_d->search_str && *clist_d->search_str) + ctui_list_handle_search(clist_d); + else + ctui_list_refresh_genlist(clist_d); + } + } + else { + list_clean_ecore_task(clist_d); + + content = phone_create_nocontents(parent, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS)); + p_retm_if(NULL == content, "phone_create_nocontents() return NULL"); + + elm_object_part_content_set(parent, "elm.swallow.content", content); + + clist_d->genlist = NULL; + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + + free(clist_d->search_str); + clist_d->search_str = NULL; + clist_d->searchbar = NULL; + clist_d->cnt_total = 0; + } +} + +API Eina_Bool ctui_list_genlist_update(void *data) +{ + PH_FN_CALL; + char buf[PH_TEXT_SHORT_LEN]; + Evas_Object *content; + ct_list_data *clist_d = data; + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + } + + p_retvm_if(NULL == clist_d->navi_item, ECORE_CALLBACK_CANCEL, "navi_item is NULL"); + + ctui_list_free_contacts(clist_d->list); + ct_list_get_contacts(clist_d, &clist_d->list); + clist_d->cnt_total = 0; + + if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) { + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + elm_object_item_text_set(clist_d->navi_item, buf); + } + + content = clist_d->content; + list_fill_contact_view(content, clist_d); + if (clist_d->list_cbar_update_fn) + clist_d->list_cbar_update_fn(clist_d); + + return ECORE_CALLBACK_CANCEL; +} + +void ct_list_clear_pdata(ct_list_data *clist_d) +{ + int ret; + p_ret_if(NULL == clist_d); + p_ret_if(NULL == clist_d->p_info); + + clist_d->p_info->alive = false; + pthread_join(clist_d->p_info->thread, NULL); + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + ecore_timer_del(clist_d->p_info->timer); + + if (clist_d->popup) { + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + } + + free(clist_d->p_info); + clist_d->p_info = NULL; +} + +static void list_set_group_index_item(Eina_List *list_index, const char *cur_index, Elm_Object_Item *cur_item) +{ + Eina_List* l; + ct_list_index_data *data; + + EINA_LIST_FOREACH(list_index, l, data) { + if (0 == strcmp(cur_index, data->index)) { + //PH_DBG("list_append_item - %s mapping to %s", data->index, cur_index); + elm_object_item_data_set(data->item, cur_item); + break; + } + } +} + +static Elm_Object_Item* list_genlist_update_group_item_get(Evas_Object *genlist, Eina_List *list_index, + Elm_Object_Item *gal_item, Elm_Object_Item *item, const char *cur_index) +{ + int cmp; + char *item_index; + Elm_Object_Item *next_item; + Elm_Object_Item *item_ret; + + if (NULL == item) { + item_ret = elm_genlist_item_append(genlist, &group_index, strdup(cur_index), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + list_set_group_index_item(list_index, cur_index, item_ret); + return item_ret; + } + else if (gal_item == item) { + item_ret = elm_genlist_item_insert_before(genlist, &group_index, strdup(cur_index), NULL, item, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + list_set_group_index_item(list_index, cur_index, item_ret); + return item_ret; + } + if (ELM_GENLIST_ITEM_GROUP != elm_genlist_item_type_get(item)) { + next_item = elm_genlist_item_next_get(item); + item_ret = list_genlist_update_group_item_get(genlist, list_index, gal_item, next_item, cur_index); + elm_object_item_del(item); + return item_ret; + } + + item_index = elm_object_item_data_get(item); + cmp = strcmp(item_index, cur_index); + + if (0 == cmp) { + return item; + } + else if (0 < cmp) { + item_ret = elm_genlist_item_insert_before(genlist, &group_index, strdup(cur_index), NULL, item, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + list_set_group_index_item(list_index, cur_index, item_ret); + return item_ret; + } + else { + next_item = elm_genlist_item_next_get(item); + item_ret = list_genlist_update_group_item_get(genlist, list_index, gal_item, next_item, cur_index); + elm_object_item_del(item); + return item_ret; + } +} + +static Eina_Bool list_genlist_update(void *data) +{ + int len; + int ret; + char buf[PH_TEXT_MAX_LEN]; + char cur_index[10]; + char group_index[10]; + Eina_List *list_new; + Eina_List *l; + Elm_Object_Item *gal_item = NULL; + Elm_Object_Item *item = NULL; + Elm_Object_Item *item_cur; + Elm_Object_Item *next_item; + Elm_Object_Item *group_item = NULL; + + ct_contact_list *item_data; + ct_list_data *clist_d = data; + ct_list_index_data *skipped_index = clist_d->list_skipped_index; + + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + } + + p_retvm_if(NULL == clist_d->navi_item, ECORE_CALLBACK_CANCEL, "navi_item is NULL"); + + list_new = NULL; + ret = ct_list_get_contacts(clist_d, &list_new); + if (0 != ret) { + ERR("ct_list_get_contacts() Failed(%d)", ret); + ctui_list_free_contacts(list_new); + clist_d->need_update = true; + return ECORE_CALLBACK_CANCEL; + } + + clist_d->cnt_total = 0; + + if (!list_new) { + Evas_Object *content; + list_clean_ecore_task(clist_d); + + content = phone_create_nocontents(clist_d->content, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS)); + p_retvm_if(NULL == content, ECORE_CALLBACK_CANCEL, "phone_create_nocontents() return NULL"); + + elm_object_part_content_set(clist_d->content, "elm.swallow.content", content); + + clist_d->genlist = NULL; + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + + free(clist_d->search_str); + clist_d->search_str = NULL; + clist_d->searchbar = NULL; + clist_d->cnt_total = 0; + } + else { + if (NULL == clist_d->genlist) { + Evas_Object *content = NULL; + content = list_create_contact_list(clist_d->content, clist_d); + + if (CT_LIST_MODE_EDIT == clist_d->list_mode) + ctui_list_edit_mode_start(clist_d); + + elm_object_part_content_set(clist_d->content, "elm.swallow.content", content); + __list_set_index_letter(clist_d); + } + else { + if (clist_d->last_sweep_item) { + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; + } + + if (clist_d->count_item) + elm_object_item_del(clist_d->count_item); + } + + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + clist_d->cnt_total = 0; + if (NULL == skipped_index) { + skipped_index = calloc(1, sizeof(ct_list_index_data)); + clist_d->list_skipped_index = skipped_index; + } + else + memset(skipped_index, 0x0, sizeof(ct_list_index_data)); + + item_cur = elm_genlist_first_item_get(clist_d->genlist); + group_index[0] = '\0'; + + EINA_LIST_FOREACH(list_new, l, item_data) { + if (NULL == item_data) + continue; + + if (clist_d->search_str && *clist_d->search_str) { + ret = contacts_svc_normalized_strstr(item_data->normalize, clist_d->search_normalize, &len); + if (ret < 0) + continue; + } + + cur_index[0] = '\0'; + __list_get_group_letter(item_data->display, cur_index, sizeof(cur_index)); + if(isdigit(cur_index[0])) + snprintf(cur_index, sizeof(cur_index), "0"); + else if(__is_in_primary_letter(cur_index, clist_d) == false) + snprintf(cur_index, sizeof(cur_index), "#"); + + if ('\0' == group_index[0] || 0 != strcmp(cur_index, group_index)) { + group_item = list_genlist_update_group_item_get(clist_d->genlist, clist_d->list_index, gal_item, item_cur, cur_index); + if (NULL == group_item) { + ERR("list_genlist_update_group_item_get() return NULL"); + break; + } + snprintf(group_index, sizeof(group_index), "%s", cur_index); + item_cur = elm_genlist_item_next_get(group_item); + } + + if (NULL == item_cur) { + if (clist_d->search_str && *clist_d->search_str) + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[2], item_data, group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + else + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[0], item_data, group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + } + else if (ELM_GENLIST_ITEM_NONE == elm_genlist_item_type_get(item_cur)) { + elm_object_item_data_set(item_cur, item_data); + item = item_cur; + item_cur = elm_genlist_item_next_get(item_cur); + } + else { + if (clist_d->search_str && *clist_d->search_str) + item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[2], item_data, group_item, item_cur, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + else + item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[0], item_data, group_item, item_cur, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + } + + clist_d->cnt_total++; + } + + if (item_cur) { + while (gal_item != (next_item = elm_genlist_item_next_get(item_cur))) { + elm_object_item_del(next_item); + } + elm_object_item_del(item_cur); + } + + if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) { + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + elm_object_item_text_set(clist_d->navi_item, buf); + } + } + + ctui_list_free_contacts(clist_d->list); + clist_d->list = list_new; + + if (clist_d->genlist) { + elm_genlist_realized_items_update(clist_d->genlist); + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + if (gal_item) + clist_d->count_item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, gal_item, ELM_GENLIST_ITEM_NONE, NULL, NULL); + else + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + } + + if (clist_d->list_cbar_update_fn) + clist_d->list_cbar_update_fn(clist_d); + + PH_FN_END; + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool list_genlist_update_queue_timer_cb(void *data) +{ + ct_list_data *clist_d = data; + p_retvm_if(NULL == clist_d, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL"); + + if (clist_d->need_update) { + clist_d->need_update = false; + list_genlist_update(clist_d); + return ECORE_CALLBACK_RENEW; + } + clist_d->update_queue_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void list_lazy_update(void *data) +{ + int ui_updated; + ct_list_data *clist_d = data; + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + } + + PH_DBG("is_background = %d", clist_d->is_background); + + if (clist_d->is_background) { + clist_d->need_update = false; + clist_d->update_timer = ecore_timer_add(3.0, list_genlist_update, clist_d); + return; + } + + ui_updated = (int)evas_object_data_del(clist_d->navi, "ct_list_update_ui"); + if (0 == ui_updated && clist_d->update_queue_timer) { + clist_d->need_update = true; + } + else { + list_genlist_update(clist_d); + clist_d->update_queue_timer = ecore_timer_add(1.0, list_genlist_update_queue_timer_cb, clist_d); + p_warn_if(NULL == clist_d->update_queue_timer, "ecore_timer_add() return NULL"); + } +} + +static void list_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int ret; + ct_list_data *clist_d = data; + + ct_list_clear_pdata(clist_d); + list_clean_ecore_task(clist_d); + + if (CT_GET_LIST_VCARD != clist_d->list_op) { + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_LINK_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + } + + ctui_list_free_contacts(clist_d->list); + + ctui_list_free_index(clist_d->list_index); + + if (clist_d->update_timer) + ecore_timer_del(clist_d->update_timer); + + if (clist_d->update_queue_timer) + ecore_timer_del(clist_d->update_queue_timer); + + if (clist_d->popup) { + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + } + + if (clist_d->th) { + elm_theme_extension_del(clist_d->th, CONTACTS_EDJ); + elm_theme_free(clist_d->th); + } + + if (clist_d->child_ug) + ug_destroy(clist_d->child_ug); + + evas_object_data_del(clist_d->navi, "gadd_list_d"); + evas_object_data_del(clist_d->navi, "favor_list_d"); + eina_list_free(clist_d->list_ab); + free(clist_d->search_str); + free(clist_d->search_normalize); + free(clist_d->sub_title); + free(clist_d->title); + free(clist_d); +} + +static char* list_get_highlight_text(ct_list_data *clist_d, const char *src, const char *normalize) +{ + int len; + int ret; + char display[PH_TEXT_MAX_LEN]; + + if (NULL == clist_d->search_str || '\0' == clist_d->search_str[0]) + return strdup(src); + + ret = contacts_svc_normalized_strstr(normalize, clist_d->search_normalize, &len); + if (0 <= ret) { + char middle[PH_TEXT_MAX_LEN] = {0}; + char first[PH_TEXT_MAX_LEN] = {0}; + snprintf(first, sizeof(first), "%s", src); + snprintf(middle, len+1, "%s", src + ret); + first[ret] = '\0'; + //PH_DBG("%s -> %s, %s, %s", src, first, middle, src + ret + len); + + snprintf(display, sizeof(display), "%s<match>%s</>%s", first, middle, src + ret + len); + return strdup(display); + } + return strdup(src); +} + +static int list_handle_noname(int op, int sub_op, ct_contact_list *item) +{ + int ret; + CTSvalue *value = NULL; + char normalized_str[PH_TEXT_MAX_LEN]; + + ret = contacts_svc_get_contact_value(op, item->id, &value); + if (CTS_SUCCESS == ret) { + free(item->display); + free(item->normalize); + item->display = SAFE_STRDUP(contacts_svc_value_get_str(value, sub_op)); + + ret = contacts_svc_normalize_str(item->display, normalized_str, + sizeof(normalized_str)); + if (CTS_SUCCESS <= ret) + item->normalize = strdup(normalized_str); + else + item->normalize = NULL; + + contacts_svc_value_free(value); + return TRUE; + } + else { + PH_DBG("op(%d) is NO DATA", op); + return FALSE; + } +} + +char* ct_list_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_contact_list *item = data; + p_retvm_if(NULL == item, NULL, "The parameter(data) is NULL"); + + p_retvm_if(0 != strcmp(part, "elm.text") && 0 != strcmp(part, "elm.slide.text.1"), + NULL, "unknown part(%s)", part); + + if (NULL == item->display || '\0' == item->display[0]) { + int ret; + ret = list_handle_noname(CTS_GET_COMPANY_VALUE, CTS_COMPANY_VAL_NAME_STR, item); + if (TRUE != ret) { + ret = list_handle_noname(CTS_GET_DEFAULT_NUMBER_VALUE, CTS_NUM_VAL_NUMBER_STR, item); + if (TRUE != ret) + list_handle_noname(CTS_GET_DEFAULT_EMAIL_VALUE, CTS_EMAIL_VAL_ADDR_STR, item); + } + } + + if (item->display && *item->display) { + ct_list_data *clist_d = evas_object_data_get(obj, "clist_d"); + p_retvm_if(NULL == clist_d, strdup(item->display), + "evas_object_data_get() return NULL"); + + if (0 == strcmp(part, "elm.slide.text.1")) + return strdup(item->display); + else + return list_get_highlight_text(clist_d, item->display, item->normalize); + } + else + return strdup(T_(CT_GET_TEXT_ERR, CTTEXT_NONAME)); +} + +char* ct_list_count_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + char buf[PH_TEXT_SHORT_LEN]; + int count = (int)data; + snprintf(buf, sizeof(buf), T_(CT_GET_TEXT_BASIC, CTTEXT_COUNT_CONTACTS), count); + return strdup(buf); +} + +Evas_Object* ct_list_create_contact_layout(ct_list_data *clist_d) +{ + PH_FN_CALL; + int ret; + Elm_Theme *th; + Evas_Object *layout; + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, LIST_THEME_EDJ); + clist_d->th = th; + + layout = phone_create_base_layout(clist_d->navi, false); + list_fill_contact_view(layout, clist_d); + + if (CT_GET_LIST_VCARD != clist_d->list_op) { + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_LINK_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + } + + evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, list_view_delete_cb, clist_d); + return layout; +} + |