4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
21 #include <setting-phone-region-format.h>
22 #include <setting-common-draw-widget.h>
24 #define MAX_REGION_STRLEN 256
27 static int setting_phone_region_format_create(void *cb);
28 static int setting_phone_region_format_destroy(void *cb);
29 static int setting_phone_region_format_cleanup(void *cb);
31 setting_view setting_view_phone_region_format = {
32 .create = setting_phone_region_format_create,
33 .destroy = setting_phone_region_format_destroy,
35 .cleanup = setting_phone_region_format_cleanup,
41 * @brief Function of add color to display string by html charactor
43 * @param data The view data passed between all callbacks
44 * @param old_str The source of the display string
45 * @return The string add color
47 static char *__setting_phone_region_format_get_str_colr(void *data, char *old_str)
49 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
50 SettingPhoneUG *ad = (SettingPhoneUG *) data;
55 char display[1024] = {0, };
57 /*len_display = strlen(old_str); */
58 len_search = strlen(ad->search_text);
59 pos = strcasestr(old_str, ad->search_text);
62 char first[1024] = {0};
63 char middle[1024] = {0};
65 snprintf(first, (int)(pos - old_str) + 1, "%s", old_str);
66 snprintf(middle, len_search + 1, "%s", (char *)pos);
68 snprintf(display, sizeof(display), "%s<match>%s</>%s", first, middle, (char *)(pos + len_search));
69 return strdup(display);
72 return strdup(old_str);
78 * @brief Function of remove html charactor in entry string
80 * @param src The source of the entry string
81 * @param dst The return string
83 int setting_entry_str_get_displaying_part(const char *src, char *dst)
85 retv_if(NULL == src || NULL == dst, -1);
86 int len = strlen(src);
88 char *pre_flag = NULL;
89 char *end_flag = NULL;
90 char tmp_buf1[MAX_SEARCH_STR_LEN + 1] = { '\0' };
91 char tmp_buf2[MAX_SEARCH_STR_LEN + 1] = { '\0' };
93 snprintf(tmp_buf1, MAX_SEARCH_STR_LEN, "%s", src);
95 /* get the first position where '<' found */
96 pre_flag = strchr(tmp_buf1, '<');
99 /* get the begin position of '<' found */
100 int begin_pos = pre_flag - tmp_buf1;
101 snprintf(tmp_buf2, begin_pos + 1, "%s", tmp_buf1);
102 /*CLK_ERR("tmp_buf2 : %s\n", tmp_buf2); */
104 /* get the position of '>' which match previous '<' */
105 end_flag = strchr(pre_flag, '>');
107 snprintf(tmp_buf2 + begin_pos, MAX_SEARCH_STR_LEN, "%s", end_flag + 1);
108 sub_num += end_flag - pre_flag;
113 snprintf(tmp_buf1, MAX_SEARCH_STR_LEN, "%s", tmp_buf2);
114 pre_flag = strchr(tmp_buf1, '<');
115 /*CLK_ERR("tmp_buf1 : %s\n", tmp_buf1); */
118 snprintf(dst, MAX_SEARCH_STR_LEN, "%s", tmp_buf1);
125 * @brief Callback of compare region in list
127 * @param d1 The first one of the region to be compare
128 * @param d2 The second one of the region to be compare
130 static int setting_phone_region_format_compare_cb(const void *d1, const void *d2)
132 UChar region1[128] = { 0, };
133 UChar region2[128] = { 0, };
135 Setting_Region_Table *r1 = (Setting_Region_Table *) d1;
136 Setting_Region_Table *r2 = (Setting_Region_Table *) d2;
138 u_uastrcpy(region1, r1->desc);
139 u_uastrcpy(region2, r2->desc);
141 UErrorCode status = U_ZERO_ERROR;
142 UCollator *coll = ucol_open(getenv("LANG"), &status);
143 UCollationResult ret = ucol_strcoll(coll, region1, -1, region2, -1);
162 * @brief Function of get region list
164 * @param list[] The display string of the region
165 * @param item_idx[] The index of the region in list
166 * @param region_keyStr[] The key of the region
167 * @param region_num The count of region list items
168 * @return #0 is correct
170 static int setting_phone_region_format_get_region_fmt(char *list[],
172 /*[OUT]*/ char *region_keyStr[],
175 const char *loc_list = NULL;
177 UChar lang[LANGUAGE_STR_LEN] = { 0, };
178 UChar country[COUNTRY_STR_LEN] = { 0, };
179 UChar variant[SETTING_STR_SLP_LEN] = { 0, };
180 UChar displayname[SETTING_STR_SLP_LEN] = { 0, };
181 const char *localeID = NULL;
182 UErrorCode language_status = U_ZERO_ERROR;
183 UErrorCode country_status = U_ZERO_ERROR;
184 UErrorCode variant_status = U_ZERO_ERROR;
185 UErrorCode displayname_status = U_ZERO_ERROR;
187 int tmp_region_num = 0;
190 char *str_lang = NULL;
191 char *str_country = NULL;
192 char *str_variant = NULL;
193 char *str_displayname = NULL;
194 Eina_List *region_list = NULL;
196 loc_count = uloc_countAvailable();
199 localeID = uloc_getDefault();
200 SETTING_TRACE("localeID = %s", localeID);
202 for (; i < loc_count; i++) {
203 if (tmp_region_num >= REGION_ITEM_MAX) {
207 loc_list = uloc_getAvailable(i);
209 /* SETTING_TRACE("loc_list = %s", loc_list); */
210 uloc_getDisplayLanguage(loc_list, localeID, lang, LANGUAGE_STR_LEN, &language_status);
211 if (U_FAILURE(language_status)) {
212 SETTING_TRACE_ERROR("language_status got an error %s:%d ", language_status, language_status);
213 language_status = U_ZERO_ERROR; /* set the value to the initial value */
216 uloc_getDisplayCountry(loc_list, localeID, country, COUNTRY_STR_LEN, &country_status);
217 if (U_FAILURE(country_status)) {
218 SETTING_TRACE_ERROR("country_status got an error %s:%d ", country, country_status);
219 country_status = U_ZERO_ERROR; /* set the value to the initial value */
222 uloc_getDisplayVariant(loc_list, localeID, variant, SETTING_STR_SLP_LEN, &variant_status);
223 if (U_FAILURE(variant_status)) {
224 SETTING_TRACE_ERROR("variant_status got an error %s:%d ", variant, variant_status);
225 variant_status = U_ZERO_ERROR; /* set the value to the initial value */
228 uloc_getDisplayName(loc_list, localeID, displayname, SETTING_STR_SLP_LEN, &displayname_status);
229 if (U_FAILURE(displayname_status)) {
230 SETTING_TRACE_ERROR("displayname_status got an error %s:%d ", displayname, displayname_status);
231 displayname_status = U_ZERO_ERROR; /* set the value to the initial value */
234 u_strToUpper(displayname, 1, displayname, 1, "", &errcode);
235 str_lang = setting_phone_lang_str_to_utf8(lang);
236 str_country = setting_phone_lang_str_to_utf8(country);
237 str_variant = setting_phone_lang_str_to_utf8(variant);
238 str_displayname = setting_phone_lang_str_to_utf8(displayname);
240 /* filter which has variant */
241 if (str_lang != NULL && str_country != NULL
242 && safeStrLen(str_country) > 1 && safeStrLen(str_variant) == 0) {
243 Setting_Region_Table *item_data = (Setting_Region_Table *) calloc(1, sizeof(Setting_Region_Table));
244 /*setting_retvm_if(item_data == NULL, -1, "calloc failed") */
246 if (item_data == NULL) {
247 SETTING_TRACE_ERROR("calloc failed");
251 FREE(str_displayname);
255 item_data->desc = (char *)g_strdup(str_displayname);
256 item_data->key = (char *)g_strdup(loc_list);
257 region_list = eina_list_append(region_list, item_data);
264 FREE(str_displayname);
267 region_list = eina_list_sort(region_list, eina_list_count(region_list),
268 setting_phone_region_format_compare_cb);
270 Eina_List *iter = NULL;
271 Setting_Region_Table *item_data = NULL;
273 EINA_LIST_FOREACH(region_list, iter, item_data) {
275 list[i] = (char *)g_strdup(item_data->desc);
277 region_keyStr[i] = (char *)g_strdup(item_data->key);
284 eina_list_free(region_list);
285 SETTING_TRACE("region_num = %d", tmp_region_num);
286 *region_num = tmp_region_num;
293 * @brief Function of set date_format vconf by param region
295 * @param region The input param to set date_format
296 * @param data The view data passed between all callbacks
298 EXPORT_PUBLIC int setting_phone_region_format_set_dateformat(const char *region,
302 setting_retvm_if(!region, SETTING_RETURN_FAIL, "region parameter is NULL");
303 setting_retvm_if(data == NULL, SETTING_RETURN_FAIL, "Data parameter is NULL");
305 SettingPhoneUG *ad = (SettingPhoneUG *) data;
307 char *ret_str = NULL;
309 UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
310 UErrorCode status = U_ZERO_ERROR;
312 UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
313 char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
314 char *skeleton = DATA_FORMAT_SKELETON;
316 uret = u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
317 setting_retvm_if(!uret, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
319 if (ad->pattern_generator == NULL
320 || safeStrCmp(region, ad->prev_locale) != 0) {
321 if (ad->pattern_generator != NULL) {
322 udatpg_close(ad->pattern_generator);
323 ad->pattern_generator = NULL;
325 ad->pattern_generator = udatpg_open(region, &status);
328 int32_t bestPatternCapacity =
329 (int32_t)(sizeof(bestPattern) / sizeof((bestPattern)[0]));
330 (void)udatpg_getBestPattern(ad->pattern_generator, customSkeleton,
331 u_strlen(customSkeleton), bestPattern,
332 bestPatternCapacity, &status);
334 ret_str = u_austrcpy(bestPatternString, bestPattern);
335 setting_retvm_if(!ret_str, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
339 int len = safeStrLen(bestPatternString);
340 char region_format[4] = {0, };
342 /* only save 'y', 'M', 'd' charactor */
343 for (; i < len; i++) {
344 if (bestPatternString[i] == 'y' && ymd[0] == 0) {
345 region_format[j++] = bestPatternString[i];
347 } else if (bestPatternString[i] == 'M' && ymd[1] == 0) {
348 region_format[j++] = bestPatternString[i];
350 } else if (bestPatternString[i] == 'd' && ymd[2] == 0) {
351 region_format[j++] = bestPatternString[i];
356 region_format[3] = '\0';
358 char *date_format_str[DATA_FORMAT_CATEGORY_NUM] = {
359 "dMy", "Mdy", "yMd", "ydM"
361 int date_format_vconf_value = DATA_FORMAT_DEFAULT; /* default is "Mdy" */
362 for (i = 0; i < DATA_FORMAT_CATEGORY_NUM; i++) {
363 if (!safeStrCmp(region_format, date_format_str[i])) {
364 date_format_vconf_value = i;
368 /* if region_format is null, should be set as default */
369 if (isEmptyStr(region_format) || isSpaceStr(region_format)) {
370 date_format_vconf_value = 1;
373 SETTING_TRACE("bestPatternString : %s, format: %s, index: %d",
374 bestPatternString, region_format,
375 date_format_vconf_value);
377 int err = SETTING_RETURN_SUCCESS;
378 setting_set_int_slp_key(INT_SLP_SETTING_DATE_FORMAT, date_format_vconf_value, &err);
379 setting_retvm_if(err == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "set vconf fail");
380 G_FREE(ad->prev_locale);
381 ad->prev_locale = (char *)g_strdup(region);
382 return SETTING_RETURN_SUCCESS;
388 * @brief Function of get current region_format
390 * @return current region_format string
392 static char *__region_format_vconf_str_get()
395 char *tempstr = vconf_get_str(VCONFKEY_REGIONFORMAT);
396 setting_retvm_if(NULL == tempstr, NULL, "NULL == tempstr");
398 char *str_region = NULL;
399 char *p = strchr(tempstr, '.');
401 int len = safeStrLen(tempstr) - safeStrLen(".UTF-8");
404 str_region = strndup(tempstr, len); /*.UTF8 => 5 */
406 str_region = (char *)g_strdup(tempstr);
407 SETTING_TRACE_ERROR("region format vconf stored error");
410 str_region = (char *)g_strdup("en_US");
421 * @brief Function of genlist update when entry change
423 * @param data The view data passed between all callbacks
425 static Eina_Bool __region_genlist_update(void *data)
428 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
429 SettingPhoneUG *ad = (SettingPhoneUG *) data;
431 SETTING_TRACE_DEBUG("ad->search_text: %s", ad->search_text);
433 elm_genlist_clear(ad->gl_region);
434 G_FREE(ad->region_vconf_str);
435 ad->region_vconf_str = __region_format_vconf_str_get();
437 Setting_GenGroupItem_Data *item_data = NULL;
438 ad->selected_region_idx = -1;
440 int search_count = 0;
441 if (isEmptyStr(ad->search_text) || is_substr_ncase(_("IDS_COM_BODY_AUTOMATIC"), ad->search_text)) {
443 char *buf = __setting_phone_region_format_get_str_colr(ad, _("IDS_COM_BODY_AUTOMATIC"));
444 /*SETTING_TRACE_DEBUG("buf: %s", buf); */
446 item_data = setting_create_Gendial_field_def(ad->gl_region,
448 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
450 SWALLOW_Type_INVALID, NULL, NULL,
454 item_data->userdata = ad;
455 item_data->keyStr2 = _("IDS_COM_BODY_AUTOMATIC");
456 item_data->group_style = SETTING_GROUP_STYLE_TOP;
458 SETTING_TRACE_ERROR("item_data is NULL");
465 for (; i < ad->region_num; i++) {
466 if (isEmptyStr(ad->search_text) ||
467 is_substr_ncase(ad->region_desc[i], ad->search_text)) {
469 char *buf = __setting_phone_region_format_get_str_colr(ad, ad->region_desc[i]);
470 /*SETTING_TRACE_DEBUG("buf: %s", buf); */
473 setting_create_Gendial_field_def(ad->gl_region,
475 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
477 SWALLOW_Type_INVALID, NULL, NULL,
481 item_data->userdata = ad;
482 item_data->keyStr2 = ad->region_desc[i];
483 if (search_count == 0) {
484 item_data->group_style = SETTING_GROUP_STYLE_TOP;
486 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
489 SETTING_TRACE_ERROR("item_data is NULL");
492 if (ad->region_vconf_str) {
493 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
494 ad->selected_region_idx = i;
502 if (search_count == 1) {
504 item_data->group_style = SETTING_GROUP_STYLE_NONE;
506 } else if (search_count > 1) {
507 Setting_GenGroupItem_Data *last_item =
508 (Setting_GenGroupItem_Data *)elm_object_item_data_get(elm_genlist_last_item_get(ad->gl_region));
510 last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
514 if (ad->selected_region_idx > -1) {
515 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
518 if (search_count == 0) {
519 setting_create_Gendial_field_def(ad->gl_region,
520 &(ad->itc_1icon_with_no_line), NULL, NULL,
521 SWALLOW_Type_INVALID, NULL, NULL, 0,
522 _("IDS_ST_BODY_NO_RESULTS_FOUND"), NULL, NULL);
525 ad->search_idler = NULL;
526 ad->searchlist_update_timer = NULL;
527 return ECORE_CALLBACK_CANCEL;
533 * @brief Callback of entry change
535 * @param data The view data passed between all callbacks
537 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
540 setting_retm_if(data == NULL, "Data parameter is NULL");
541 SettingPhoneUG *ad = (SettingPhoneUG *)data;
543 Evas_Object *entry = elm_object_part_content_get(ad->search_bar, "elm.swallow.content");
548 const char *str = elm_entry_entry_get(entry);
549 /* empty string is useful */
554 SETTING_TRACE_DEBUG("str: %s", str);
556 int len = setting_entry_str_get_displaying_part(str, ad->search_text);
561 SETTING_TRACE_DEBUG("ad->search_text: %s", ad->search_text);
563 /* we use idle to delay, this may cause some input search will be delay and then query together so we use timer to delay*/
564 if (ad->searchlist_update_timer) {
565 ecore_timer_del(ad->searchlist_update_timer);
566 ad->searchlist_update_timer = NULL;
569 ad->searchlist_update_timer = ecore_timer_add(0.01, __region_genlist_update, ad);
575 * @brief Callback of entry prediction change
577 * @param data The view data passed between all callbacks
579 static void __searchbar_prediction_changed_cb(void *data, Evas_Object *obj, void *event_info)
582 setting_retm_if(data == NULL, "Data parameter is NULL");
583 SettingPhoneUG *ad = (SettingPhoneUG *)data;
585 Evas_Object *entry = elm_object_part_content_get(ad->search_bar, "elm.swallow.content");
590 const char *str = elm_entry_entry_get(entry);
591 /* empty string is useful */
595 SETTING_TRACE_DEBUG("str: %s", str);
597 int len = setting_entry_str_get_displaying_part(str, ad->search_text);
602 SETTING_TRACE_DEBUG("ad->search_text: %s", ad->search_text);
604 if (ad->searchlist_update_timer) {
605 ecore_timer_del(ad->searchlist_update_timer);
606 ad->searchlist_update_timer = NULL;
609 ad->searchlist_update_timer = ecore_timer_add(0.01, __region_genlist_update, ad);
615 * @brief Callback of genlist item click event
617 * @param data The view data passed between all callbacks
618 * @param event_info The select item
620 static void setting_phone_region_format_mouse_up_Gendial_list_radio_cb(void *data,
625 setting_retm_if(data == NULL, "Data parameter is NULL");
626 setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
628 Evas_Object *radio = (Evas_Object *) data;
629 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
630 elm_genlist_item_selected_set(item, 0);
631 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
632 SettingPhoneUG *ad = (SettingPhoneUG *) list_item->userdata;
635 char region[MAX_REGION_STRLEN] = {0,};
636 SETTING_TRACE_DEBUG("item keystr: %s", list_item->keyStr2);
637 if (!safeStrCmp(_("IDS_COM_BODY_AUTOMATIC"), list_item->keyStr2)) {
638 vconf_set_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, TRUE);
640 /*set region same to language */
642 lang = vconf_get_str(VCONFKEY_LANGSET);
643 if (strlen(region) < 256 && strlen(lang) < 256) {
644 strcpy(region, lang);
649 SETTING_TRACE_DEBUG("auto region: %s", region);
651 vconf_set_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, FALSE);
652 elm_radio_value_set(radio, list_item->chk_status);
654 ad->prev_region = list_item->chk_status;
655 SETTING_TRACE("cur_chk_region = %d", ad->prev_region);
657 snprintf(region, MAX_REGION_STRLEN, "%s.UTF-8", ad->region_keyStr[ad->prev_region]);
659 ret = setting_phone_region_format_set_dateformat(ad->region_keyStr[ad->prev_region], ad);
660 setting_retm_if(ret == SETTING_RETURN_FAIL, "[Error] set date format fail");
662 ret = vconf_set_str(VCONFKEY_REGIONFORMAT, region);
663 setting_retm_if(ret != 0, "[Error] set value of VCONFKEY_REGIONFORMAT fail");
665 if (!safeStrCmp(ad->region_search_id, "region")) {
666 /* after changed, desroy ug */
667 ug_destroy_me(ad->ug);
669 /* after changed, go back to the previous page */
670 setting_view_change(&setting_view_phone_region_format , &setting_view_phone_language_region, ad);
677 * @brief Callback of add genlist item use animator
679 * @param data The view data passed between all callbacks
681 static Eina_Bool __region_animator_cb(void *data)
683 /*SETTING_TRACE_BEGIN; */
684 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
685 SettingPhoneUG *ad = (SettingPhoneUG *) data;
687 Setting_GenGroupItem_Data *item_data = NULL;
688 if (ad->gl_region_cur_index >= ad->region_num) {
689 Setting_GenGroupItem_Data *last_item =
690 (Setting_GenGroupItem_Data *)elm_object_item_data_get(elm_genlist_last_item_get(ad->gl_region));
692 last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
696 ecore_animator_del(ad->animator);
699 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
700 ad->prev_region = ad->selected_region_idx;
702 Elm_Object_Item *item = NULL;
703 item = elm_genlist_item_append(ad->gl_region, &itc_bottom_seperator, NULL, NULL,
704 ELM_GENLIST_ITEM_NONE, NULL, NULL);
705 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
706 return ECORE_CALLBACK_CANCEL;
709 int i = ad->gl_region_cur_index++;
710 if (isEmptyStr(ad->search_text) || is_substr_ncase(ad->region_desc[i], ad->search_text)) {
712 setting_create_Gendial_field_def(ad->gl_region,
714 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
716 SWALLOW_Type_INVALID, NULL, NULL,
718 ad->region_desc[i]/* HERE */, NULL, NULL);
721 item_data->userdata = ad;
722 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
724 SETTING_TRACE_ERROR("item_data is NULL");
727 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
728 ad->selected_region_idx = i;
730 ad->selected_item = item_data->item;
735 return ECORE_CALLBACK_RENEW;
742 * @brief Callback of popup_timer
744 * @param data The view data passed between all callbacks
745 * @return #1 means call it again, else means call it only once
747 static Eina_Bool __region_popup_timer_cb(void *data)
749 /*SETTING_TRACE_BEGIN; */
750 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
751 SettingPhoneUG *ad = (SettingPhoneUG *) data;
753 if (ad->pop_progress) {
754 evas_object_del(ad->pop_progress);
755 ad->pop_progress = NULL;
758 /* recover it when popup disappear */
760 elm_object_tree_focus_allow_set(ad->ly_region, EINA_TRUE);
763 ad->popup_timer = NULL;
764 return ECORE_CALLBACK_CANCEL;
770 * @brief Function of create region genlist
772 * @param data The view data passed between all callbacks
774 static void __region_genlist_create(void *data)
777 setting_retm_if(NULL == data, "data is NULL");
778 SettingPhoneUG *ad = (SettingPhoneUG *) data;
780 /* disable layout operation event */
781 elm_object_tree_focus_allow_set(ad->ly_region, EINA_FALSE);
783 if (ad->pop_progress) {
784 evas_object_del(ad->pop_progress);
785 ad->pop_progress = NULL;
787 ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
789 NULL, KeyStr_Loading, NULL, 0, TRUE, TRUE);
791 if (ad->popup_timer) {
792 ecore_timer_del(ad->popup_timer);
793 ad->popup_timer = NULL;
796 ad->popup_timer = ecore_timer_add(2.0, __region_popup_timer_cb, ad);
798 elm_genlist_clear(ad->gl_region);
799 G_FREE(ad->region_vconf_str);
800 ad->region_vconf_str = __region_format_vconf_str_get();
802 Setting_GenGroupItem_Data *item_data = NULL;
803 ad->gl_region_index = 0;
804 ad->selected_item = NULL;
805 ad->selected_region_idx = -1;
808 setting_create_Gendial_field_def(ad->gl_region,
810 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
812 SWALLOW_Type_INVALID, NULL, NULL,
814 _("IDS_COM_BODY_AUTOMATIC"), NULL, NULL);
816 item_data->userdata = ad;
817 item_data->keyStr2 = _("IDS_COM_BODY_AUTOMATIC");
818 item_data->group_style = SETTING_GROUP_STYLE_TOP;
820 SETTING_TRACE_ERROR("item_data is NULL");
824 for (; i < ad->region_num; i++) {
825 if (isEmptyStr(ad->search_text) ||
826 is_substr_ncase(ad->region_desc[i], ad->search_text)) {
828 setting_create_Gendial_field_def(ad->gl_region,
830 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
832 SWALLOW_Type_INVALID, NULL, NULL,
834 ad->region_desc[i], NULL, NULL);
836 item_data->userdata = ad;
837 item_data->keyStr2 = ad->region_desc[i];
838 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
840 SETTING_TRACE_ERROR("item_data is NULL");
843 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
844 ad->selected_region_idx = i;
846 ad->selected_item = item_data->item;
849 ad->gl_region_index++;
852 ad->gl_region_cur_index = i;
854 if (ad->selected_region_idx > -1) {
855 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
856 ad->prev_region = ad->selected_region_idx;
858 if (ad->gl_region_cur_index < ad->region_num &&
859 ad->gl_region_index > SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
860 /*to continue adding items using animator */
861 SETTING_TRACE("to continue adding items using animator");
863 ecore_animator_del(ad->animator);
867 ad->animator = ecore_animator_add(__region_animator_cb, ad);
868 } else { /*had finished adding items */
869 SETTING_TRACE("had finished adding items");
871 Setting_GenGroupItem_Data *last_item =
872 (Setting_GenGroupItem_Data *)elm_object_item_data_get(elm_genlist_last_item_get(ad->gl_region));
874 last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
882 * @brief Callback of cancel button
884 * @param data The view data passed between all callbacks
886 static Eina_Bool setting_phone_region_format_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
889 retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
890 SettingPhoneUG *ad = (SettingPhoneUG *) data;
891 setting_view_change(&setting_view_phone_region_format, &setting_view_phone_language_region, ad);
898 static Evas_Object *_item_content_get(void *data, Evas_Object *obj, const char *part)
901 setting_retvm_if(!data || !obj, NULL, "!data || !obj");
903 if (!safeStrCmp(part, "elm.icon")) {
904 Evas_Object *sub_layout = elm_layout_add(obj);
905 elm_layout_theme_set(sub_layout, "layout", "nocontents", "search");
906 evas_object_size_hint_weight_set(sub_layout, EVAS_HINT_EXPAND, 0);
907 elm_object_part_text_set(sub_layout, "elm.text", _("IDS_ST_BODY_NO_RESULTS_FOUND"));
908 evas_object_show(sub_layout);
919 * @brief Callback of cancel button by caller
921 * @param data The view data passed between all callbacks
923 static Eina_Bool setting_phone_region_format_caller_exist_right_cb(void *data, Elm_Object_Item *it)
926 setting_retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
928 SettingPhoneUG *ad = (SettingPhoneUG *) data;
929 /* Create Bundle and send message */
931 if (app_control_create(&svc)) {
935 app_control_add_extra_data(svc, "result", "rbutton_click");
936 ug_send_result(ad->ug, svc);
938 app_control_destroy(svc);
940 ug_destroy_me(ad->ug);
947 /* ***************************************************
951 ***************************************************/
954 * @brief Callback of view creating
956 * @param cb The view data passed between all callbacks
957 * @return #1 on success, else on failed
959 static int setting_phone_region_format_create(void *cb)
962 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
963 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
965 Evas_Object *sub_layout = NULL;
966 Elm_Naviframe_Item_Pop_Cb gl_sel_cb = NULL;
968 ad->region_search_id = NULL;
969 app_control_h service = ad->bundle_data;
970 app_control_get_extra_data(service, "viewtype", &ad->region_search_id);
971 if (!safeStrCmp(ad->region_search_id, "region")) {
972 Evas_Object *layout_main = setting_create_win_layout(ad->win_main_layout, ad->win_get);
973 retvm_if(layout_main == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER, "layout_main create fail");
974 ad->ly_region = layout_main;
976 ad->navi_bar = setting_create_navi_bar(layout_main);
977 retvm_if(ad->navi_bar == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER, "navi_bar create fail");
979 sub_layout = elm_layout_add(ad->navi_bar);
980 elm_layout_theme_set(sub_layout, "layout", "application", "searchbar_base");
981 elm_object_signal_emit(sub_layout, "elm,state,show,searchbar", "elm");
982 evas_object_show(sub_layout);
984 gl_sel_cb = setting_phone_region_format_caller_exist_right_cb;
986 sub_layout = elm_layout_add(ad->navi_bar);
987 elm_layout_theme_set(sub_layout, "layout", "application", "searchbar_base");
988 elm_object_signal_emit(sub_layout, "elm,state,show,searchbar", "elm");
989 ad->ly_region = sub_layout;
991 gl_sel_cb = setting_phone_region_format_click_softkey_cancel_cb;
995 setting_create_Gendial_itc("1icon/with_no_line", &(ad->itc_1icon_with_no_line));
996 ad->itc_1icon_with_no_line.func.content_get = _item_content_get;
998 Elm_Object_Item *navi_it = setting_push_layout_navi_bar(REGION_FORMAT_LOWER,
1004 NULL, ad, sub_layout, ad->navi_bar, NULL);
1005 elm_naviframe_item_pop_cb_set(navi_it, gl_sel_cb, ad);
1006 evas_object_data_set(ad->navi_bar, "sip.naviframe.title_obj", "SEARCH");
1007 ad->gl_region = elm_genlist_add(ad->navi_bar);
1009 retvm_if(ad->gl_region == NULL, SETTING_DRAW_ERR_FAIL_SCROLLER, "ad->gl_region is NULL");
1010 elm_genlist_realization_mode_set(ad->gl_region, EINA_TRUE);
1011 elm_object_style_set(ad->gl_region, "dialogue");
1013 evas_object_smart_callback_add(ad->gl_region, "realized", __gl_realized_cb, NULL);
1015 ad->chk_region = elm_radio_add(ad->gl_region);
1016 elm_radio_state_value_set(ad->chk_region, -1);
1017 elm_radio_value_set(ad->chk_region, -1);
1019 int ret = setting_phone_region_format_get_region_fmt(ad->region_desc,
1024 SETTING_TRACE_ERROR("get region format list failed");
1027 ad->prev_region = 0;
1028 memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
1030 __region_genlist_create(ad);
1031 ad->search_bar = setting_create_searchbar(ad, sub_layout, __searchbar_changed_cb, NULL);
1032 if (ad->search_bar) {
1033 Evas_Object *entry = evas_object_data_get(ad->search_bar, "entry");
1035 evas_object_smart_callback_add(entry, "preedit,changed", __searchbar_prediction_changed_cb, ad);
1039 elm_object_part_content_set(sub_layout, "elm.swallow.content", ad->gl_region);
1041 setting_view_phone_region_format.is_create = 1;
1042 return SETTING_RETURN_SUCCESS;
1048 * @brief Callback of view destroy
1050 * @param cb The view data passed between all callbacks
1051 * @return #1 on success, else on failed
1053 static int setting_phone_region_format_destroy(void *cb)
1055 SETTING_TRACE_BEGIN;
1057 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1058 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
1060 evas_object_smart_callback_del(ad->gl_region, "realized", __gl_realized_cb);
1062 /*Apply new SIP concept */
1063 evas_object_data_set(ad->navi_bar, "sip.naviframe.title_obj", NULL);
1065 /* FIXED : destroy only if it was created. */
1066 if (setting_view_phone_region_format.is_create) {
1067 if (ad->region_search_id) {
1068 FREE(ad->region_search_id);
1070 if (ad->search_idler) {
1071 ecore_idler_del(ad->search_idler);
1072 ad->search_idler = NULL;
1075 ecore_animator_del(ad->animator);
1076 ad->animator = NULL;
1079 evas_object_del(ad->popup);
1082 if (ad->pop_progress) {
1083 evas_object_del(ad->pop_progress);
1084 ad->pop_progress = NULL;
1087 if (ad->popup_timer) {
1088 ecore_timer_del(ad->popup_timer);
1089 ad->popup_timer = NULL;
1092 if (ad->searchlist_update_timer) {
1093 ecore_timer_del(ad->searchlist_update_timer);
1094 ad->searchlist_update_timer = NULL;
1097 elm_naviframe_item_pop(ad->navi_bar);
1098 setting_view_phone_region_format.is_create = 0;
1101 return SETTING_RETURN_SUCCESS;
1107 * @brief Callback of view cleanup
1109 * @param cb The view data passed between all callbacks
1110 * @return #1 on success, else on failed
1112 static int setting_phone_region_format_cleanup(void *cb)
1114 SETTING_TRACE_BEGIN;
1116 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1117 setting_phone_region_format_destroy(cb);
1118 return SETTING_RETURN_SUCCESS;