tizen 2.3.1 release
[apps/home/settings.git] / setting-phone / src / setting-phone-region-format.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21 #include <setting-phone-region-format.h>
22 #include <setting-common-draw-widget.h>
23
24 #define MAX_REGION_STRLEN 256
25
26
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);
30
31 setting_view setting_view_phone_region_format = {
32         .create = setting_phone_region_format_create,
33         .destroy = setting_phone_region_format_destroy,
34         .update = NULL,
35         .cleanup = setting_phone_region_format_cleanup,
36 };
37
38
39
40 /**
41  * @brief Function of add color to display string by html charactor
42  *
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
46  */
47 static char *__setting_phone_region_format_get_str_colr(void *data, char *old_str)
48 {
49         setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
50         SettingPhoneUG *ad = (SettingPhoneUG *) data;
51
52         int len_search;
53         /*int len_display; */
54         char *pos;
55         char display[1024] = {0, };
56
57         /*len_display = strlen(old_str); */
58         len_search = strlen(ad->search_text);
59         pos = strcasestr(old_str, ad->search_text);
60
61         if (0 < pos) {
62                 char first[1024] = {0};
63                 char middle[1024] = {0};
64
65                 snprintf(first, (int)(pos - old_str) + 1, "%s", old_str);
66                 snprintf(middle, len_search + 1, "%s", (char *)pos);
67
68                 snprintf(display, sizeof(display), "%s<match>%s</>%s", first, middle, (char *)(pos + len_search));
69                 return strdup(display);
70         }
71
72         return strdup(old_str);
73 }
74
75
76
77 /**
78  * @brief Function of remove html charactor in entry string
79  *
80  * @param src The source of the entry string
81  * @param dst The return string
82  */
83 int setting_entry_str_get_displaying_part(const char *src, char *dst)
84 {
85         retv_if(NULL == src || NULL == dst, -1);
86         int len = strlen(src);
87         int sub_num = 0;
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' };
92
93         snprintf(tmp_buf1, MAX_SEARCH_STR_LEN, "%s", src);
94
95         /* get the first position where '<' found */
96         pre_flag = strchr(tmp_buf1, '<');
97
98         while (pre_flag) {
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); */
103                 sub_num = 1;
104                 /* get the position of '>' which match previous '<' */
105                 end_flag = strchr(pre_flag, '>');
106                 if (end_flag) {
107                         snprintf(tmp_buf2 + begin_pos, MAX_SEARCH_STR_LEN, "%s", end_flag + 1);
108                         sub_num += end_flag - pre_flag;
109                 } else {
110                         break;
111                 }
112                 len -= sub_num;
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); */
116         }
117
118         snprintf(dst, MAX_SEARCH_STR_LEN, "%s", tmp_buf1);
119         return len;
120 }
121
122
123
124 /**
125  * @brief Callback of compare region in list
126  *
127  * @param d1 The first one of the region to be compare
128  * @param d2 The second one of the region to be compare
129  */
130 static int setting_phone_region_format_compare_cb(const void *d1, const void *d2)
131 {
132         UChar region1[128] = { 0, };
133         UChar region2[128] = { 0, };
134
135         Setting_Region_Table *r1 = (Setting_Region_Table *) d1;
136         Setting_Region_Table *r2 = (Setting_Region_Table *) d2;
137
138         u_uastrcpy(region1, r1->desc);
139         u_uastrcpy(region2, r2->desc);
140
141         UErrorCode status = U_ZERO_ERROR;
142         UCollator *coll = ucol_open(getenv("LANG"), &status);
143         UCollationResult ret = ucol_strcoll(coll, region1, -1, region2, -1);
144
145         ucol_close(coll);
146
147         switch (ret) {
148                 case UCOL_EQUAL:
149                         return 0;
150                 case UCOL_GREATER:
151                         return 1;
152                 case UCOL_LESS:
153                         return -1;
154                 default:
155                         return 0;
156         }
157 }
158
159
160
161 /**
162  * @brief Function of get region list
163  *
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
169  */
170 static int setting_phone_region_format_get_region_fmt(char *list[],
171                                                       int item_idx[],
172                                                       /*[OUT]*/ char *region_keyStr[],
173                                                       int *region_num)
174 {
175         const char *loc_list = NULL;
176         int loc_count = 0;
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;
186
187         int tmp_region_num = 0;
188         *region_num = 0;
189
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;
195
196         loc_count = uloc_countAvailable();
197
198         int i = 0;
199         localeID = uloc_getDefault();
200         SETTING_TRACE("localeID = %s", localeID);
201
202         for (; i < loc_count; i++) {
203                 if (tmp_region_num >= REGION_ITEM_MAX) {
204                         break;
205                 }
206
207                 loc_list = uloc_getAvailable(i);
208
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 */
214                 }
215
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 */
220                 }
221
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 */
226                 }
227
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 */
232                 }
233                 UErrorCode errcode;
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);
239
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") */
245
246                         if (item_data == NULL) {
247                                 SETTING_TRACE_ERROR("calloc failed");
248                                 FREE(str_lang);
249                                 FREE(str_country);
250                                 FREE(str_variant);
251                                 FREE(str_displayname);
252                                 return -1;
253                         }
254
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);
258                         tmp_region_num++;
259                 }
260
261                 FREE(str_lang);
262                 FREE(str_country);
263                 FREE(str_variant);
264                 FREE(str_displayname);
265         }
266
267         region_list = eina_list_sort(region_list, eina_list_count(region_list),
268                                      setting_phone_region_format_compare_cb);
269
270         Eina_List *iter = NULL;
271         Setting_Region_Table *item_data = NULL;
272         i = 0;
273         EINA_LIST_FOREACH(region_list, iter, item_data) {
274                 if (item_data) {
275                         list[i] = (char *)g_strdup(item_data->desc);
276                         item_idx[i] = i;
277                         region_keyStr[i] = (char *)g_strdup(item_data->key);
278                         free(item_data);
279                         item_data = NULL;
280                         i++;
281                 }
282         }
283
284         eina_list_free(region_list);
285         SETTING_TRACE("region_num = %d", tmp_region_num);
286         *region_num = tmp_region_num;
287         return 0;
288 }
289
290
291
292 /**
293  * @brief Function of set date_format vconf by param region
294  *
295  * @param region The input param to set date_format
296  * @param data The view data passed between all callbacks
297  */
298 EXPORT_PUBLIC int setting_phone_region_format_set_dateformat(const char *region,
299                                                              void *data)
300 {
301         SETTING_TRACE_BEGIN;
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");
304
305         SettingPhoneUG *ad = (SettingPhoneUG *) data;
306
307         char *ret_str = NULL;
308         UChar *uret = NULL;
309         UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
310         UErrorCode status = U_ZERO_ERROR;
311
312         UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
313         char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
314         char *skeleton = DATA_FORMAT_SKELETON;
315
316         uret = u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
317         setting_retvm_if(!uret, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
318
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;
324                 }
325                 ad->pattern_generator = udatpg_open(region, &status);
326         }
327
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);
333
334         ret_str = u_austrcpy(bestPatternString, bestPattern);
335         setting_retvm_if(!ret_str, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
336
337         int i = 0;
338         int j = 0;
339         int len = safeStrLen(bestPatternString);
340         char region_format[4] = {0, };
341         int ymd[3] = {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];
346                         ymd[0] = 1;
347                 } else if (bestPatternString[i] == 'M' && ymd[1] == 0) {
348                         region_format[j++] = bestPatternString[i];
349                         ymd[1] = 1;
350                 } else if (bestPatternString[i] == 'd' && ymd[2] == 0) {
351                         region_format[j++] = bestPatternString[i];
352                         ymd[2] = 1;
353                 }
354         }
355
356         region_format[3] = '\0';
357
358         char *date_format_str[DATA_FORMAT_CATEGORY_NUM] = {
359                 "dMy", "Mdy", "yMd", "ydM"
360         };
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;
365                 }
366         }
367
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;
371         }
372
373         SETTING_TRACE("bestPatternString : %s, format: %s, index: %d",
374                       bestPatternString, region_format,
375                       date_format_vconf_value);
376
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;
383 }
384
385
386
387 /**
388  * @brief Function of get current region_format
389  *
390  * @return current region_format string
391  */
392 static char *__region_format_vconf_str_get()
393 {
394         SETTING_TRACE_BEGIN;
395         char *tempstr = vconf_get_str(VCONFKEY_REGIONFORMAT);
396         setting_retvm_if(NULL == tempstr, NULL, "NULL == tempstr");
397
398         char *str_region = NULL;
399         char *p = strchr(tempstr, '.');
400
401         int len = safeStrLen(tempstr) - safeStrLen(".UTF-8");
402         if (p) {
403                 if (len > 0) {
404                         str_region = strndup(tempstr, len);     /*.UTF8 => 5 */
405                 } else {
406                         str_region = (char *)g_strdup(tempstr);
407                         SETTING_TRACE_ERROR("region format vconf stored error");
408                 }
409         } else  {
410                 str_region = (char *)g_strdup("en_US");
411         }
412
413         FREE(tempstr);
414         return str_region;
415 }
416
417
418
419
420 /**
421  * @brief Function of genlist update when entry change
422  *
423  * @param data The view data passed between all callbacks
424  */
425 static Eina_Bool __region_genlist_update(void *data)
426 {
427         SETTING_TRACE_BEGIN;
428         setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
429         SettingPhoneUG *ad = (SettingPhoneUG *) data;
430
431         SETTING_TRACE_DEBUG("ad->search_text: %s", ad->search_text);
432
433         elm_genlist_clear(ad->gl_region);
434         G_FREE(ad->region_vconf_str);
435         ad->region_vconf_str = __region_format_vconf_str_get();
436
437         Setting_GenGroupItem_Data *item_data = NULL;
438         ad->selected_region_idx = -1;
439
440         int search_count = 0;
441         if (isEmptyStr(ad->search_text) || is_substr_ncase(_("IDS_COM_BODY_AUTOMATIC"), ad->search_text)) {
442
443                 char *buf = __setting_phone_region_format_get_str_colr(ad, _("IDS_COM_BODY_AUTOMATIC"));
444                 /*SETTING_TRACE_DEBUG("buf: %s", buf); */
445
446                 item_data = setting_create_Gendial_field_def(ad->gl_region,
447                                                              &(ad->itc_1text_tb),
448                                                              setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
449                                                              ad->chk_region,
450                                                              SWALLOW_Type_INVALID, NULL, NULL,
451                                                              -1,
452                                                              buf, NULL, NULL);
453                 if (item_data) {
454                         item_data->userdata = ad;
455                         item_data->keyStr2 = _("IDS_COM_BODY_AUTOMATIC");
456                         item_data->group_style = SETTING_GROUP_STYLE_TOP;
457                 } else {
458                         SETTING_TRACE_ERROR("item_data is NULL");
459                 }
460
461                 search_count++;
462         }
463
464         int i = 0;
465         for (; i < ad->region_num; i++) {
466                 if (isEmptyStr(ad->search_text) ||
467                     is_substr_ncase(ad->region_desc[i], ad->search_text)) {
468
469                         char *buf = __setting_phone_region_format_get_str_colr(ad, ad->region_desc[i]);
470                         /*SETTING_TRACE_DEBUG("buf: %s", buf); */
471
472                         item_data =
473                             setting_create_Gendial_field_def(ad->gl_region,
474                                                              &(ad->itc_1text_tb),
475                                                              setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
476                                                              ad->chk_region,
477                                                              SWALLOW_Type_INVALID, NULL, NULL,
478                                                              ad->region_index[i],
479                                                              buf, NULL, NULL);
480                         if (item_data) {
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;
485                                 } else {
486                                         item_data->group_style = SETTING_GROUP_STYLE_CENTER;
487                                 }
488                         } else {
489                                 SETTING_TRACE_ERROR("item_data is NULL");
490                         }
491
492                         if (ad->region_vconf_str) {
493                                 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
494                                         ad->selected_region_idx = i;
495                                 }
496                         }
497                         search_count++;
498                         FREE(buf);
499                 }
500         }
501
502         if (search_count == 1) {
503                 if (item_data) {
504                         item_data->group_style = SETTING_GROUP_STYLE_NONE;
505                 }
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));
509                 if (last_item) {
510                         last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
511                 }
512         }
513
514         if (ad->selected_region_idx > -1) {
515                 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
516         }
517
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);
523         }
524
525         ad->search_idler = NULL;
526         ad->searchlist_update_timer = NULL;
527         return ECORE_CALLBACK_CANCEL;
528 }
529
530
531
532 /**
533  * @brief Callback of entry change
534  *
535  * @param data The view data passed between all callbacks
536  */
537 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
538 {
539         SETTING_TRACE_BEGIN;
540         setting_retm_if(data == NULL, "Data parameter is NULL");
541         SettingPhoneUG *ad = (SettingPhoneUG *)data;
542
543         Evas_Object *entry = elm_object_part_content_get(ad->search_bar, "elm.swallow.content");
544         if (!entry) {
545                 return;
546         }
547
548         const char *str = elm_entry_entry_get(entry);
549         /* empty string is useful */
550         if (!str) {
551                 return;
552         }
553
554         SETTING_TRACE_DEBUG("str: %s", str);
555
556         int len = setting_entry_str_get_displaying_part(str, ad->search_text);
557         if (len < 0) {
558                 return;
559         }
560
561         SETTING_TRACE_DEBUG("ad->search_text: %s", ad->search_text);
562
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;
567         }
568
569         ad->searchlist_update_timer = ecore_timer_add(0.01, __region_genlist_update, ad);
570 }
571
572
573
574 /**
575  * @brief Callback of entry prediction change
576  *
577  * @param data The view data passed between all callbacks
578  */
579 static void __searchbar_prediction_changed_cb(void *data, Evas_Object *obj, void *event_info)
580 {
581         SETTING_TRACE_BEGIN;
582         setting_retm_if(data == NULL, "Data parameter is NULL");
583         SettingPhoneUG *ad = (SettingPhoneUG *)data;
584
585         Evas_Object *entry = elm_object_part_content_get(ad->search_bar, "elm.swallow.content");
586         if (!entry) {
587                 return;
588         }
589
590         const char *str = elm_entry_entry_get(entry);
591         /* empty string is useful */
592         if (!str) {
593                 return;
594         }
595         SETTING_TRACE_DEBUG("str: %s", str);
596
597         int len = setting_entry_str_get_displaying_part(str, ad->search_text);
598         if (len < 0) {
599                 return;
600         }
601
602         SETTING_TRACE_DEBUG("ad->search_text: %s", ad->search_text);
603
604         if (ad->searchlist_update_timer) {
605                 ecore_timer_del(ad->searchlist_update_timer);
606                 ad->searchlist_update_timer = NULL;
607         }
608
609         ad->searchlist_update_timer = ecore_timer_add(0.01, __region_genlist_update, ad);
610 }
611
612
613
614 /**
615  * @brief Callback of genlist item click event
616  *
617  * @param data The view data passed between all callbacks
618  * @param event_info The select item
619  */
620 static void setting_phone_region_format_mouse_up_Gendial_list_radio_cb(void *data,
621                                                                        Evas_Object *obj,
622                                                                        void *event_info)
623 {
624         SETTING_TRACE_BEGIN;
625         setting_retm_if(data == NULL, "Data parameter is NULL");
626         setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
627
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;
633
634         int ret;
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);
639
640                 /*set region same to language */
641                 char *lang = NULL;
642                 lang = vconf_get_str(VCONFKEY_LANGSET);
643                 if (strlen(region) < 256 && strlen(lang) < 256) {
644                         strcpy(region, lang);
645                 } else {
646                         return;
647                 }
648                 FREE(lang);
649                 SETTING_TRACE_DEBUG("auto region: %s", region);
650         } else {
651                 vconf_set_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, FALSE);
652                 elm_radio_value_set(radio, list_item->chk_status);
653
654                 ad->prev_region = list_item->chk_status;
655                 SETTING_TRACE("cur_chk_region = %d", ad->prev_region);
656
657                 snprintf(region, MAX_REGION_STRLEN, "%s.UTF-8", ad->region_keyStr[ad->prev_region]);
658
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");
661         }
662         ret = vconf_set_str(VCONFKEY_REGIONFORMAT, region);
663         setting_retm_if(ret != 0, "[Error] set value of VCONFKEY_REGIONFORMAT fail");
664
665         if (!safeStrCmp(ad->region_search_id, "region")) {
666                 /* after changed, desroy ug */
667                 ug_destroy_me(ad->ug);
668         } else {
669                 /* after changed, go back to the previous page */
670                 setting_view_change(&setting_view_phone_region_format , &setting_view_phone_language_region, ad);
671         }
672 }
673
674
675
676 /**
677  * @brief Callback of add genlist item use animator
678  *
679  * @param data The view data passed between all callbacks
680  */
681 static Eina_Bool __region_animator_cb(void *data)
682 {
683         /*SETTING_TRACE_BEGIN; */
684         setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
685         SettingPhoneUG *ad = (SettingPhoneUG *) data;
686
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));
691                 if (last_item) {
692                         last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
693                 }
694
695                 if (ad->animator) {
696                         ecore_animator_del(ad->animator);
697                         ad->animator = NULL;
698                 }
699                 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
700                 ad->prev_region = ad->selected_region_idx;
701
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;
707         }
708
709         int i = ad->gl_region_cur_index++;
710         if (isEmptyStr(ad->search_text) || is_substr_ncase(ad->region_desc[i], ad->search_text)) {
711                 item_data =
712                     setting_create_Gendial_field_def(ad->gl_region,
713                                                      &(ad->itc_1text_tb),
714                                                      setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
715                                                      ad->chk_region,
716                                                      SWALLOW_Type_INVALID, NULL, NULL,
717                                                      ad->region_index[i],
718                                                      ad->region_desc[i]/* HERE */, NULL, NULL);
719
720                 if (item_data) {
721                         item_data->userdata = ad;
722                         item_data->group_style = SETTING_GROUP_STYLE_CENTER;
723                 } else {
724                         SETTING_TRACE_ERROR("item_data is NULL");
725                 }
726
727                 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
728                         ad->selected_region_idx = i;
729                         if (item_data) {
730                                 ad->selected_item = item_data->item;
731                         }
732                 }
733         }
734
735         return ECORE_CALLBACK_RENEW;
736
737 }
738
739
740
741 /**
742  * @brief Callback of popup_timer
743  *
744  * @param data The view data passed between all callbacks
745  * @return #1 means call it again, else means call it only once
746  */
747 static Eina_Bool __region_popup_timer_cb(void *data)
748 {
749         /*SETTING_TRACE_BEGIN; */
750         setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
751         SettingPhoneUG *ad = (SettingPhoneUG *) data;
752
753         if (ad->pop_progress) {
754                 evas_object_del(ad->pop_progress);
755                 ad->pop_progress = NULL;
756         }
757
758         /* recover it when popup disappear */
759         if (ad->ly_region) {
760                 elm_object_tree_focus_allow_set(ad->ly_region, EINA_TRUE);
761         }
762
763         ad->popup_timer = NULL;
764         return ECORE_CALLBACK_CANCEL;
765 }
766
767
768
769 /**
770  * @brief Function of create region genlist
771  *
772  * @param data The view data passed between all callbacks
773  */
774 static void __region_genlist_create(void *data)
775 {
776         SETTING_TRACE_BEGIN;
777         setting_retm_if(NULL == data, "data is NULL");
778         SettingPhoneUG *ad = (SettingPhoneUG *) data;
779
780         /* disable layout operation event */
781         elm_object_tree_focus_allow_set(ad->ly_region, EINA_FALSE);
782
783         if (ad->pop_progress) {
784                 evas_object_del(ad->pop_progress);
785                 ad->pop_progress = NULL;
786         }
787         ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
788                                                                  PROGRESSBAR_STYLE,
789                                                                  NULL, KeyStr_Loading, NULL, 0, TRUE, TRUE);
790
791         if (ad->popup_timer) {
792                 ecore_timer_del(ad->popup_timer);
793                 ad->popup_timer = NULL;
794         }
795
796         ad->popup_timer = ecore_timer_add(2.0, __region_popup_timer_cb, ad);
797
798         elm_genlist_clear(ad->gl_region);
799         G_FREE(ad->region_vconf_str);
800         ad->region_vconf_str = __region_format_vconf_str_get();
801
802         Setting_GenGroupItem_Data *item_data = NULL;
803         ad->gl_region_index = 0;
804         ad->selected_item = NULL;
805         ad->selected_region_idx = -1;
806
807         item_data =
808             setting_create_Gendial_field_def(ad->gl_region,
809                                              &(ad->itc_1text_tb),
810                                              setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
811                                              ad->chk_region,
812                                              SWALLOW_Type_INVALID, NULL, NULL,
813                                              -1,
814                                              _("IDS_COM_BODY_AUTOMATIC"), NULL, NULL);
815         if (item_data) {
816                 item_data->userdata = ad;
817                 item_data->keyStr2 = _("IDS_COM_BODY_AUTOMATIC");
818                 item_data->group_style = SETTING_GROUP_STYLE_TOP;
819         } else {
820                 SETTING_TRACE_ERROR("item_data is NULL");
821         }
822
823         int i = 0;
824         for (; i < ad->region_num; i++) {
825                 if (isEmptyStr(ad->search_text) ||
826                     is_substr_ncase(ad->region_desc[i], ad->search_text)) {
827                         item_data =
828                             setting_create_Gendial_field_def(ad->gl_region,
829                                                              &(ad->itc_1text_tb),
830                                                              setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
831                                                              ad->chk_region,
832                                                              SWALLOW_Type_INVALID, NULL, NULL,
833                                                              ad->region_index[i],
834                                                              ad->region_desc[i], NULL, NULL);
835                         if (item_data) {
836                                 item_data->userdata = ad;
837                                 item_data->keyStr2 = ad->region_desc[i];
838                                 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
839                         } else {
840                                 SETTING_TRACE_ERROR("item_data is NULL");
841                         }
842
843                         if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
844                                 ad->selected_region_idx = i;
845                                 if (item_data) {
846                                         ad->selected_item = item_data->item;
847                                 }
848                         }
849                         ad->gl_region_index++;
850                 }
851         }
852         ad->gl_region_cur_index = i;
853
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;
857         }
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");
862                 if (ad->animator) {
863                         ecore_animator_del(ad->animator);
864                         ad->animator = NULL;
865                 }
866
867                 ad->animator = ecore_animator_add(__region_animator_cb, ad);
868         } else { /*had finished adding items */
869                 SETTING_TRACE("had finished adding items");
870
871                 Setting_GenGroupItem_Data *last_item =
872                     (Setting_GenGroupItem_Data *)elm_object_item_data_get(elm_genlist_last_item_get(ad->gl_region));
873                 if (last_item) {
874                         last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
875                 }
876         }
877 }
878
879
880
881 /**
882  * @brief Callback of cancel button
883  *
884  * @param data The view data passed between all callbacks
885  */
886 static Eina_Bool setting_phone_region_format_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
887 {
888         SETTING_TRACE_BEGIN;
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);
892
893         return EINA_TRUE;
894 }
895
896
897
898 static Evas_Object *_item_content_get(void *data, Evas_Object *obj, const char *part)
899 {
900         SETTING_TRACE_BEGIN;
901         setting_retvm_if(!data || !obj, NULL, "!data || !obj");
902
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);
909
910                 return sub_layout;
911         }
912
913         return NULL;
914 }
915
916
917
918 /**
919  * @brief Callback of cancel button by caller
920  *
921  * @param data The view data passed between all callbacks
922  */
923 static Eina_Bool setting_phone_region_format_caller_exist_right_cb(void *data, Elm_Object_Item *it)
924 {
925         SETTING_TRACE_BEGIN;
926         setting_retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
927
928         SettingPhoneUG *ad = (SettingPhoneUG *) data;
929         /*  Create Bundle and send message */
930         app_control_h svc;
931         if (app_control_create(&svc)) {
932                 return EINA_FALSE;
933         }
934
935         app_control_add_extra_data(svc, "result", "rbutton_click");
936         ug_send_result(ad->ug, svc);
937
938         app_control_destroy(svc);
939
940         ug_destroy_me(ad->ug);
941         return EINA_FALSE;
942 }
943
944
945
946
947 /* ***************************************************
948  *
949  *basic func
950  *
951  ***************************************************/
952
953 /**
954  * @brief Callback of view creating
955  *
956  * @param cb The view data passed between all callbacks
957  * @return #1 on success, else on failed
958  */
959 static int setting_phone_region_format_create(void *cb)
960 {
961         SETTING_TRACE_BEGIN;
962         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
963         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
964
965         Evas_Object *sub_layout = NULL;
966         Elm_Naviframe_Item_Pop_Cb gl_sel_cb = NULL;
967
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;
975
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");
978
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);
983
984                 gl_sel_cb = setting_phone_region_format_caller_exist_right_cb;
985         } else {
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;
990
991                 gl_sel_cb = setting_phone_region_format_click_softkey_cancel_cb;
992         }
993
994         /* */
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;
997
998         Elm_Object_Item *navi_it = setting_push_layout_navi_bar(REGION_FORMAT_LOWER,
999                                                                 "IDS_COM_BODY_BACK",
1000                                                                 NULL,
1001                                                                 NULL,
1002                                                                 NULL,
1003                                                                 NULL,
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);
1008
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");
1012
1013         evas_object_smart_callback_add(ad->gl_region, "realized", __gl_realized_cb, NULL);
1014
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);
1018
1019         int ret = setting_phone_region_format_get_region_fmt(ad->region_desc,
1020                                                              ad->region_index,
1021                                                              ad->region_keyStr,
1022                                                              &ad->region_num);
1023         if (ret != 0) {
1024                 SETTING_TRACE_ERROR("get region format list failed");
1025         }
1026
1027         ad->prev_region = 0;
1028         memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
1029
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");
1034                 if (entry) {
1035                         evas_object_smart_callback_add(entry, "preedit,changed", __searchbar_prediction_changed_cb, ad);
1036                 }
1037         }
1038
1039         elm_object_part_content_set(sub_layout, "elm.swallow.content", ad->gl_region);
1040
1041         setting_view_phone_region_format.is_create = 1;
1042         return SETTING_RETURN_SUCCESS;
1043 }
1044
1045
1046
1047 /**
1048  * @brief Callback of view destroy
1049  *
1050  * @param cb The view data passed between all callbacks
1051  * @return #1 on success, else on failed
1052  */
1053 static int setting_phone_region_format_destroy(void *cb)
1054 {
1055         SETTING_TRACE_BEGIN;
1056         /* error check */
1057         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1058         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
1059
1060         evas_object_smart_callback_del(ad->gl_region, "realized", __gl_realized_cb);
1061
1062         /*Apply new SIP concept */
1063         evas_object_data_set(ad->navi_bar, "sip.naviframe.title_obj", NULL);
1064
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);
1069                 }
1070                 if (ad->search_idler) {
1071                         ecore_idler_del(ad->search_idler);
1072                         ad->search_idler = NULL;
1073                 }
1074                 if (ad->animator) {
1075                         ecore_animator_del(ad->animator);
1076                         ad->animator = NULL;
1077                 }
1078                 if (ad->popup) {
1079                         evas_object_del(ad->popup);
1080                         ad->popup = NULL;
1081                 }
1082                 if (ad->pop_progress) {
1083                         evas_object_del(ad->pop_progress);
1084                         ad->pop_progress = NULL;
1085                 }
1086
1087                 if (ad->popup_timer) {
1088                         ecore_timer_del(ad->popup_timer);
1089                         ad->popup_timer = NULL;
1090                 }
1091
1092                 if (ad->searchlist_update_timer) {
1093                         ecore_timer_del(ad->searchlist_update_timer);
1094                         ad->searchlist_update_timer = NULL;
1095                 }
1096
1097                 elm_naviframe_item_pop(ad->navi_bar);
1098                 setting_view_phone_region_format.is_create = 0;
1099         }
1100
1101         return SETTING_RETURN_SUCCESS;
1102 }
1103
1104
1105
1106 /**
1107  * @brief Callback of view cleanup
1108  *
1109  * @param cb The view data passed between all callbacks
1110  * @return #1 on success, else on failed
1111  */
1112 static int setting_phone_region_format_cleanup(void *cb)
1113 {
1114         SETTING_TRACE_BEGIN;
1115         /* error check */
1116         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1117         setting_phone_region_format_destroy(cb);
1118         return SETTING_RETURN_SUCCESS;
1119 }