2 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 * Created on: Oct 9, 2013
25 #include <vconf-keys.h>
26 #include <unicode/ustring.h>
27 #include <unicode/udat.h>
28 #include <unicode/udatpg.h>
30 #include "setting-language.h"
34 static struct _lang_menu_item lang_menu_its[LANGUAGE_ITEM_COUNT];
35 static Evas_Object * g_lang_radio = NULL;
37 void _initialize_language(void * data)
49 void _set_launguage_update_cb( void (*cb)(void*) )
51 DBG("_set_launguage_update_cb() is called!");
55 DBG("callback is NULL");
62 void _clear_g_lang_menu_items()
65 for(i = 0; i < LANGUAGE_ITEM_COUNT; i++ )
67 if( lang_menu_its[i].name )
68 free(lang_menu_its[i].name);
69 if( lang_menu_its[i].sub_name )
70 free(lang_menu_its[i].sub_name);
71 if( lang_menu_its[i].id )
72 free(lang_menu_its[i].id);
76 void _clear_lang_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
83 if( ad->language_rdg ) {
84 ad->language_rdg = NULL;
91 _clear_g_lang_menu_items();
93 ad->MENU_TYPE = SETTING_DISPLAY;
96 Ecore_Timer * lang_timer = NULL;
98 static Eina_Bool _update_language(void * data)
100 char *locale = vconf_get_str(VCONFKEY_LANGSET);
101 elm_language_set(locale);
102 //elm_config_all_flush();
106 lang_update_cb( tmp_ad );
111 return ECORE_CALLBACK_CANCEL;
114 static int _set_dateformat(const char *region)
116 char *ret_str = NULL;
118 UChar customSkeleton[256] = { 0, };
119 UErrorCode status = U_ZERO_ERROR;
120 UDateTimePatternGenerator *pattern_generator;
122 UChar bestPattern[256] = { 0, };
123 char bestPatternString[256] = { 0, };
124 char *skeleton = "yMd";
126 uret = u_uastrncpy(customSkeleton, skeleton, strlen(skeleton));
128 pattern_generator = udatpg_open(region, &status);
130 int32_t bestPatternCapacity =
131 (int32_t) (sizeof(bestPattern) / sizeof((bestPattern)[0]));
132 (void)udatpg_getBestPattern(pattern_generator, customSkeleton,
133 u_strlen(customSkeleton), bestPattern,
134 bestPatternCapacity, &status);
136 ret_str = u_austrcpy(bestPatternString, bestPattern);
140 int len = strlen(bestPatternString);
141 char region_format[4] = {0, };
143 /* only save 'y', 'M', 'd' charactor */
144 for (; i < len; i++) {
145 if (bestPatternString[i] == 'y' && ymd[0] == 0) {
146 region_format[j++] = bestPatternString[i];
148 } else if (bestPatternString[i] == 'M' && ymd[1] == 0) {
149 region_format[j++] = bestPatternString[i];
151 } else if (bestPatternString[i] == 'd' && ymd[2] == 0) {
152 region_format[j++] = bestPatternString[i];
157 region_format[3] = '\0';
159 char *date_format_str[4] = {
160 "dMy", "Mdy", "yMd", "ydM" };
161 int date_format_vconf_value = 1; /* default is "Mdy" */
162 for (i = 0; i < 4; i++) {
163 if (strlen(region_format) != 0 && !strcmp(region_format, date_format_str[i])) {
164 date_format_vconf_value = i;
168 DBG("bestPatternString : %s, format: %s, index: %d",
169 bestPatternString, region_format, date_format_vconf_value);
171 vconf_set_int(VCONFKEY_SETAPPL_DATE_FORMAT_INT, date_format_vconf_value);
176 void _gl_lang_sel_cb(void * data, Evas_Object * obj, void * event_info)
178 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
180 int lang_index = (int)data;
183 snprintf(buf, sizeof(buf)-1, "%s.UTF-8", lang_menu_its[lang_index].id);
185 vconf_set_str(VCONFKEY_LANGSET, buf);
186 vconf_set_str(VCONFKEY_REGIONFORMAT, buf);
188 _set_dateformat(lang_menu_its[lang_index].id);
190 const char * temp = vconf_get_str(VCONFKEY_LANGSET);
192 DBG("Setting - %s", temp);
196 elm_radio_value_set(g_lang_radio, lang_index);
200 elm_naviframe_item_pop(tmp_ad->nf);
204 ecore_timer_del(lang_timer);
207 lang_timer = ecore_timer_add(0.3, (Ecore_Task_Cb) _update_language, NULL);
210 void _lang_sel_changed_cb(void *data, Evas_Object *obj, void *event_info)
215 char * _gl_lang_title_get(void *data, Evas_Object *obj, const char *part)
218 Item_Data *id = data;
219 int index = id->index;
221 if( !strcmp(part, "elm.text.2") )
223 snprintf(buf, sizeof(buf)-1, "%s", lang_menu_its[index].sub_name);
225 else if( !strcmp(part, "elm.text") || !strcmp(part, "elm.text.1") )
227 snprintf(buf, sizeof(buf)-1, "%s", lang_menu_its[index].name);
232 Evas_Object * _gl_lang_ridio_get(void *data, Evas_Object *obj, const char *part)
234 Evas_Object *radio = NULL;
235 Evas_Object *radio_main = evas_object_data_get(obj, "radio_main");
238 Item_Data *id = data;
239 int index = id->index;
241 if( !strcmp(part, "elm.icon") )
243 radio = elm_radio_add(obj);
244 elm_object_style_set(radio, "list");
245 elm_radio_state_value_set(radio, index);
246 evas_object_smart_callback_add(radio, "changed", _lang_sel_changed_cb, (void *)index);
247 evas_object_size_hint_align_set(radio, EVAS_HINT_FILL, EVAS_HINT_FILL);
248 evas_object_size_hint_weight_set(radio, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
249 evas_object_propagate_events_set(radio, EINA_FALSE);
250 evas_object_repeat_events_set(radio, EINA_TRUE);
252 elm_radio_group_add(radio, radio_main);
254 const char * lang_set = vconf_get_str(VCONFKEY_LANGSET);
256 snprintf(buf, sizeof(buf)-1, "%s.UTF-8", lang_menu_its[index].id);
257 char * alt_lang_set = strdup(buf);
259 if( !strcasecmp(lang_set, buf) ) {
260 elm_radio_value_set(radio_main, index);
264 snprintf(buf, sizeof(buf)-1, "%s.UTF8", lang_menu_its[index].id);
265 char * alt_lang_set2 = strdup(buf);
266 if( !strcasecmp(lang_set, buf) ) {
267 elm_radio_value_set(radio_main, index);
271 DBG("Setting - current language is %s", lang_set);
279 static void _lang_gl_del(void *data, Evas_Object *obj)
281 // FIXME: Unrealized callback can be called after this.
282 // Accessing Item_Data can be dangerous on unrealized callback.
283 Item_Data *id = data;
288 Evas_Object* _create_lang_list(void* data)
293 DBG("%s", "_create_display_list - appdata is null");
296 Evas_Object *genlist = NULL;
297 Elm_Genlist_Item_Class *itc_temp = NULL;
298 struct _lang_menu_item *menu_its = NULL;
301 Evas_Object * layout = elm_layout_add(ad->nf);
302 elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
303 evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
304 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
306 Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
307 itc->item_style = "2text.1icon.1";
308 itc->func.text_get = _gl_lang_title_get;
309 itc->func.content_get = _gl_lang_ridio_get;
310 itc->func.del = _lang_gl_del;
312 Elm_Genlist_Item_Class *itc_1line = elm_genlist_item_class_new();
313 itc_1line->item_style = "1text.1icon.1";
314 itc_1line->func.text_get = _gl_lang_title_get;
315 itc_1line->func.content_get = _gl_lang_ridio_get;
316 itc_1line->func.del = _lang_gl_del;
318 genlist = elm_genlist_add(layout);
319 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
321 menu_its = lang_menu_its;
323 Eina_List * lang_list = _get_language_list();
324 struct _lang_menu_item * node = NULL;
327 int lang_count = eina_list_count(lang_list);
329 DBG("Setting - language count: %d", lang_count);
333 node = (struct _lang_menu_item * ) eina_list_data_get(lang_list);
336 lang_menu_its[index].name = strdup(node->name);
337 if( strlen(node->sub_name) > 0 )
338 lang_menu_its[index].sub_name = strdup(node->sub_name);
340 lang_menu_its[index].sub_name = NULL;
341 lang_menu_its[index].id = strdup(node->id);
345 lang_list = eina_list_next(lang_list);
348 for ( idx = 0; idx < lang_count; idx++ )
350 if( lang_menu_its[idx].sub_name != NULL )
356 itc_temp = itc_1line;
358 Item_Data *id = calloc(sizeof(Item_Data), 1);
360 id->item = elm_genlist_item_append(
361 genlist, // genlist object
362 itc_temp, // item class
365 ELM_GENLIST_ITEM_NONE,
366 _gl_lang_sel_cb, // call back
370 ad->language_rdg = elm_radio_add(genlist);
371 elm_radio_state_value_set(ad->language_rdg, lang_count);
372 elm_radio_value_set(ad->language_rdg, lang_count);
374 g_lang_radio = ad->language_rdg;
376 evas_object_data_set(genlist, "radio_main", ad->language_rdg);
378 elm_genlist_item_class_free(itc);
379 elm_genlist_item_class_free(itc_1line);
381 elm_object_part_content_set(layout, "elm.genlist", genlist);
386 void _langlist_load()
390 if(is_file_exist(LANGLIST_FILE_PATH_IN_RW))
392 _parseLangListXML(LANGLIST_FILE_PATH_IN_RW);
396 _parseLangListXML(LANGLIST_FILE_PATH_IN_RO);
401 Eina_List* _get_language_list()
403 if (NULL == s_langlist)
410 void _langlist_destroy()
412 Eina_List * list = s_langlist;
413 struct _lang_menu_item * node;
415 node = (struct _lang_menu_item * ) eina_list_data_get(list);
420 free(node->sub_name);
424 list = eina_list_next(list);
426 s_langlist = eina_list_free(s_langlist);
429 static void _parseLangListXML(char* docname)
434 doc = xmlParseFile(docname);
436 DBG("Setting - Documentation is not parsed successfully");
440 cur = xmlDocGetRootElement(doc);
442 DBG("Setting - Empty documentation");
447 if (xmlStrcmp(cur->name, (const xmlChar *) "langlist")) {
448 DBG("Setting - Documentation of the wrong type, root node != settings");
453 cur = cur->xmlChildrenNode;
454 _tree_walk_langlist(cur);
463 static void _tree_walk_langlist(xmlNodePtr cur)
465 xmlNode *cur_node = NULL;
466 char * id = NULL; // ex. ko_KR
468 char * temp_name = NULL;
469 char * sub_name = NULL;
470 const char * dim = "(";
472 for (cur_node = cur; cur_node;cur_node = cur_node->next)
474 if (cur_node->type == XML_ELEMENT_NODE)
476 id = (char *)g_strdup((char*)xmlGetProp(cur_node, (const xmlChar *)"id"));
477 name = (char *)g_strdup((char*)xmlGetProp(cur_node, (const xmlChar *)"string"));
478 //mcc = (char *)g_strdup((char*) xmlGetProp(cur_node, (const xmlChar *)"mcc"));
480 struct _lang_menu_item * pitem = (struct _lang_menu_item *)calloc(1, sizeof(struct _lang_menu_item));
483 temp_name = strdup(name);
484 pitem->name = (char *)g_strdup(strtok(temp_name, dim));
486 sub_name = strdup(name);
487 pitem->sub_name = (char *)g_strdup(replace(sub_name, pitem->name, ""));
493 s_langlist = eina_list_append(s_langlist, pitem);