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-font-main.h>
22 #include <dd-deviced.h>
23 #include <fontconfig/fontconfig.h>
24 #include <unicode/uloc.h>
25 #include <libxml/xmlmemory.h>
26 #include <libxml/parser.h>
28 #include <setting-font-font-size.h>
31 #define SETTING_FONT_MAX_LEN 10
32 #define FONT_BUF_SIZE 256
34 static int setting_font_main_create(void *cb);
35 static int setting_font_main_destroy(void *cb);
36 static int setting_font_main_update(void *cb);
37 static int setting_font_main_cleanup(void *cb);
39 static Eina_Bool __setting_font_main_click_softkey_back_cb(void *data, Elm_Object_Item *it);
41 setting_view setting_view_font_main = {
42 .create = setting_font_main_create,
43 .destroy = setting_font_main_destroy,
44 .update = setting_font_main_update,
45 .cleanup = setting_font_main_cleanup,
47 static int format_font_name_by_id(char *font_data, char *font_name_id, char *temp, int bufsize)
49 retvm_if(font_data == NULL, 0, "Invalid argument: event info is NULL");
51 char *pos = font_data;
52 char new_name[bufsize];
55 while (*pos != '\0') {
56 /*SETTING_TRACE(">>> %c", *pos); */
58 SETTING_TRACE(">>> empty ' ' ");
59 new_name[count] = '\\';
61 new_name[count] = ' ';
63 new_name[count] = font_data[i];
70 new_name[count] = '\0';
71 char trans_font_type_name[FONT_BUF_SIZE] = {0,};
72 if (safeStrCmp(font_name_id, "IDS_ST_BODY_CHOCO_COOKY") == 0) {
73 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
74 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_COOL_JAZZ") == 0) {
75 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
76 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_FONTSTYLE_ROSEMARY") == 0) {
77 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_FONTSTYLE_ROSEMARY"));
78 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME") == 0) {
79 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
80 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_MARUBERI_JPN_DCM") == 0) {
81 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_MARUBERI_JPN_DCM"));
82 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_POP_JPN_DCM") == 0) {
83 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_POP_JPN_DCM"));
84 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_UDMINCHO_JPN") == 0) {
85 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDMINCHO_JPN"));
86 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_UDRGOTHICM_JPN") == 0) {
87 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDRGOTHICM_JPN"));
88 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_UDGOTHIC_M_FONT") == 0) {
89 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDGOTHIC_M_FONT"));
90 } else if (safeStrCmp(font_name_id, "IDS_ST_BODY_DEFAULT_FONT") == 0) {
91 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_DEFAULT_FONT"));
93 snprintf(trans_font_type_name, bufsize, "%s", font_name_id);
95 snprintf(temp, bufsize, "<font=%s>%s</font>", new_name, trans_font_type_name);
99 char *_item_text_keystr2_get(void *data, Evas_Object *obj, const char *part)
101 setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
102 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) data;
103 char *ret_str = NULL;
104 if (!strcmp(part, "elm.text.main.left")) {
105 if (item_data->keyStr2) {
106 char temp[FONT_BUF_SIZE] = {0,};
108 int ret = format_font_name_by_id(item_data->sub_desc, item_data->keyStr2, temp, FONT_BUF_SIZE);
110 if (ret == 0) { /* error condition */
111 SETTING_TRACE_ERROR("Error condition font");
114 SETTING_TRACE_DEBUG("temp : %s", (char *)temp);
115 ret_str = (char *)g_strdup(temp);
118 /*SETTING_TRACE_END; */
126 * [API] get a font list from current system
127 * REFACTORING: move this feature to system-settings
129 static Eina_List *__setting_font_main_available_list_get()
132 FcObjectSet *os = NULL;
133 FcFontSet *fs = NULL;
134 FcPattern *pat = NULL;
135 Eina_List *list = NULL;
136 FcConfig *font_config = NULL;
138 font_config = FcInitLoadConfigAndFonts();
140 setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts");
143 char *locale = setlocale(0, NULL);
145 pat = FcPatternCreate();
147 os = FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
150 fs = FcFontList(font_config, pat, os);
151 FcObjectSetDestroy(os);
156 FcPatternDestroy(pat);
162 SETTING_TRACE_DEBUG("fs->nfont = %d", fs->nfont);
164 for (j = 0; j < fs->nfont; j++) {
166 FcChar8 *family = NULL;
167 FcChar8 *file = NULL;
168 if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
169 /*SETTING_TRACE_DEBUG("FC_FILE : %s\n", file); */
170 int preload_path_len = safeStrLen(SETTING_FONT_PRELOAD_FONT_PATH);
171 int download_path_len = safeStrLen(SETTING_FONT_DOWNLOADED_FONT_PATH);
172 if (!safeStrNCmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len) ||
173 !safeStrNCmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len)) {
174 char *family_result = NULL;
175 FcChar8 *lang = NULL;
177 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
180 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
183 family_result = (char *)family;
185 /* Find proper family name for current locale. */
186 while (locale && family && lang) {
187 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
188 family_result = (char *)family;
192 /* I will set english as default family language. */
193 /* If there is no proper family language for current locale, */
194 /* we have to show the english family name. */
195 if (!strcmp(lang, "en")) {
196 family_result = (char *)family;
199 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
202 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
206 if (family_result && eina_list_data_find(list, family_result) == NULL) {
207 list = eina_list_append(list, family_result);
208 SETTING_TRACE_DEBUG("-------- ADDED FONT - family = %s", family_result);
209 /* list = eina_list_append(list, family_result); */
210 /* for TEST because there's 1 font on target. */
215 FcFontSetDestroy(fs);
219 FcConfigDestroy(font_config);
224 static void __setting_font_main_genlist_sel_cb(void *data, Evas_Object *obj, void *event_info)
227 setting_retm_if(data == NULL, "Data parameter is NULL");
229 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
230 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
231 elm_genlist_item_selected_set(item, 0);
232 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
234 SettingFontUG *ad = (SettingFontUG *)data;
236 if (ad->font_size == list_item) {
237 setting_view_change(&setting_view_font_main, &setting_view_font_font_size, ad);
241 int get_font_name_id(char *font_data, char *temp, int bufsize)
243 /*SETTING_TRACE("font data : %s", (char*)font_data); */
244 /*char trans_font_type_name[FONT_BUF_SIZE] = {0,}; */
245 /*SETTING_TRACE(">>> new_name length : %d : string : %s", count, (char*)new_name); */
246 if (safeStrCmp(font_data, "Choco cooky") == 0) {
247 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_CHOCO_COOKY");
248 } else if (safeStrCmp(font_data, "Cool jazz") == 0) {
249 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_COOL_JAZZ");
250 } else if (safeStrCmp(font_data, "Rosemary") == 0) {
251 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_FONTSTYLE_ROSEMARY");
252 } else if (safeStrCmp(font_data, "HelveticaNeue") == 0) {
253 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME");
254 } else if (safeStrCmp(font_data, "Maruberi") == 0) {
255 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_MARUBERI_JPN_DCM");
256 } else if (safeStrCmp(font_data, "POP") == 0) {
257 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_POP_JPN_DCM");
258 } else if (safeStrCmp(font_data, "UDMincho") == 0) {
259 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_UDMINCHO_JPN");
260 } else if (safeStrCmp(font_data, "UDRGothic") == 0) {
261 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_UDRGOTHICM_JPN");
262 } else if (safeStrCmp(font_data, "UDGothic") == 0) {
263 snprintf(temp, bufsize, "%s", "IDS_ST_BODY_UDGOTHIC_M_FONT");
265 snprintf(temp, bufsize, "%s", font_data);
271 int get_font_name_str(char *font_type_name, char *trans_font_type_name, int bufsize)
273 /*SETTING_TRACE_BEGIN; */
274 if (safeStrCmp(font_type_name, "Choco cooky") == 0) {
275 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
276 /*SETTING_TRACE("%s", trans_font_type_name); */
277 } else if (safeStrCmp(font_type_name, "Cool jazz") == 0) {
278 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
279 /*SETTING_TRACE("%s", trans_font_type_name); */
280 } else if (safeStrCmp(font_type_name, "Rosemary") == 0) {
281 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_FONTSTYLE_ROSEMARY"));
282 /*SETTING_TRACE("%s", trans_font_type_name); */
283 } else if (safeStrCmp(font_type_name, "HelveticaNeue") == 0) {
284 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
285 /*SETTING_TRACE("%s", trans_font_type_name); */
286 } else if (safeStrCmp(font_type_name, "Maruberi") == 0) {
287 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_MARUBERI_JPN_DCM"));
288 /*SETTING_TRACE("%s", trans_font_type_name); */
289 } else if (safeStrCmp(font_type_name, "POP") == 0) {
290 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_POP_JPN_DCM"));
291 /*SETTING_TRACE("%s", trans_font_type_name); */
292 } else if (safeStrCmp(font_type_name, "UDMincho") == 0) {
293 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDMINCHO_JPN"));
294 /*SETTING_TRACE("%s", trans_font_type_name); */
295 } else if (safeStrCmp(font_type_name, "UDRGothic") == 0) {
296 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDRGOTHICM_JPN"));
297 /*SETTING_TRACE("%s", trans_font_type_name); */
299 snprintf(trans_font_type_name, bufsize, "%s", font_type_name);
300 /*SETTING_TRACE("%s", trans_font_type_name); */
304 void format_default_font(char *font_data, char *temp, int bufsize, char *real_value)
306 /*SETTING_TRACE("real_value : %s", (char*)real_value); */
308 char *pos = real_value;
309 char new_name[bufsize];
312 while (*pos != '\0') {
313 /*SETTING_TRACE(">>> %c", *pos); */
315 /*SETTING_TRACE(">>> empty ' ' "); */
316 new_name[count] = '\\';
318 new_name[count] = ' ';
320 new_name[count] = real_value[i];
327 new_name[count] = '\0';
328 snprintf(temp, bufsize, "<font=%s>%s</font>", new_name, font_data);
331 int get_font_name_tag(char *font_data, char *temp, int bufsize)
333 /*SETTING_TRACE("font data : %s", (char*)font_data); */
335 char *pos = font_data;
336 char new_name[bufsize];
339 while (*pos != '\0') {
340 /*SETTING_TRACE(">>> %c", *pos); */
342 SETTING_TRACE(">>> empty ' ' ");
343 new_name[count] = '\\';
345 new_name[count] = ' ';
347 new_name[count] = font_data[i];
354 new_name[count] = '\0';
356 char trans_font_type_name[FONT_BUF_SIZE] = {0,};
357 /*SETTING_TRACE(">>> new_name length : %d : string : %s", count, (char*)new_name); */
358 if (safeStrCmp(font_data, "Choco cooky") == 0) {
359 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
360 } else if (safeStrCmp(font_data, "Cool jazz") == 0) {
361 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
362 } else if (safeStrCmp(font_data, "Rosemary") == 0) {
363 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_FONTSTYLE_ROSEMARY"));
364 } else if (safeStrCmp(font_data, "HelveticaNeue") == 0) {
365 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
366 } else if (safeStrCmp(font_data, "Maruberi") == 0) {
367 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_MARUBERI_JPN_DCM"));
368 } else if (safeStrCmp(font_data, "POP") == 0) {
369 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_POP_JPN_DCM"));
370 } else if (safeStrCmp(font_data, "UDMincho") == 0) {
371 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDMINCHO_JPN"));
372 } else if (safeStrCmp(font_data, "UDRGothic") == 0) {
373 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDRGOTHICM_JPN"));
374 } else if (safeStrCmp(font_data, "UDGothic") == 0) {
375 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_UDGOTHIC_M_FONT"));
377 snprintf(trans_font_type_name, bufsize, "%s", font_data);
381 snprintf(temp, bufsize, "<font=%s>%s</font>", new_name, trans_font_type_name);
385 static void __setting_font_main_genlist_item_create(void *data)
388 setting_retm_if(NULL == data, "data is NULL");
390 SettingFontUG *ad = (SettingFontUG *)data;
391 Elm_Object_Item *item = NULL;
392 setting_create_Gendial_itc("1line", &(ad->itc_1text_1icon_2_font_size));
393 ad->itc_1text_1icon_2_font_size.func.text_get = _item_text_font_size_keystr2_get;
394 if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SEL_VIEW_APPCONTROL) { /* font type only */
396 item = elm_genlist_item_append(ad->genlist, &itc_seperator, NULL, NULL,
397 ELM_GENLIST_ITEM_NONE, NULL, NULL);
398 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
400 char *font_type_name = NULL;
401 int ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, &font_type_name);
403 SETTING_TRACE_ERROR("system-setting call failed with error code %d", ret);
405 SETTING_TRACE("---------------- system-setting call : (%s) ", font_type_name);
408 char trans_font_type_name[256] = {0,};
409 if (safeStrCmp(font_type_name, "Choco cooky") == 0)
410 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
411 else if (safeStrCmp(font_type_name, "Cool jazz") == 0)
412 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
413 else if (safeStrCmp(font_type_name, "HelveticaNeue") == 0)
414 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
416 snprintf(trans_font_type_name, 256, "%s", font_type_name);
418 char *default_font_name = NULL;
419 default_font_name = _get_default_font();
420 char trans_font_type_name[FONT_BUF_SIZE] = {0,};
421 if (!safeStrCmp(default_font_name, font_type_name)) {
422 snprintf(trans_font_type_name, FONT_BUF_SIZE, "%s", SETTING_DEFAULT_FONT_TYPE);
424 ret = get_font_name_id(font_type_name, trans_font_type_name, FONT_BUF_SIZE);
427 SETTING_TRACE_DEBUG("current font : %s, trans font name: %s", font_type_name, trans_font_type_name);
429 ad->font_type = setting_create_Gendial_exp_parent_field(ad->genlist,
430 &(ad->itc_2text_3_parent),
432 SWALLOW_Type_INVALID,
433 SETTING_FONT_TYPE_STR,
434 trans_font_type_name,
435 SETTING_GROUP_STYLE_TOP, SETTING_GROUP_STYLE_TOP);
437 ad->font_type->userdata = ad;
439 SETTING_TRACE_ERROR("ad->font_type is NULL");
441 G_FREE(ad->font_name);
442 ad->font_name = g_strdup(font_type_name);
443 G_FREE(font_type_name);
446 if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SIZE_VIEW_APPCONTROL) { /* font size only */
449 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &ad->ret_font_size, &err);
451 SETTING_TRACE_ERROR("get vconf failed");
454 ad->font_size = setting_create_Gendial_exp_parent_field(ad->genlist, &(ad->itc_2text_3_parent),
456 NULL, SWALLOW_Type_INVALID,
457 SETTING_FONT_SIZE_STR,
458 __get_font_size_str(ad->ret_font_size),
459 SETTING_GROUP_STYLE_CENTER, SETTING_GROUP_STYLE_BOTTOM);
461 ad->font_size->userdata = ad;
462 ad->font_size->group_style = SETTING_GROUP_STYLE_BOTTOM;
464 SETTING_TRACE_ERROR("ad->font_size is NULL");
468 ADD_GL_HELP(ad->genlist, SETTING_FONT_SIZE_DESC);
472 if (ad->font_expand_state == FONT_EXPAND_STATE_FONT_TYPE) {
473 if (ad->font_type && ad->font_type->item) {
474 elm_genlist_item_expanded_set(ad->font_type->item, TRUE);
476 } else if (ad->font_expand_state == FONT_EXPAND_STATE_FONT_SIZE) {
477 if (ad->font_size && ad->font_size->item) {
478 elm_genlist_item_expanded_set(ad->font_size->item, TRUE);
483 static void __setting_progress_popup_cb(void *data, Evas_Object *obj, void *event_info)
485 SettingFontUG *ad = (SettingFontUG *) data;
486 SETTING_TRACE("send ug_destroy_me by callback");
487 if (ad->main_popup) {
488 evas_object_del(ad->main_popup);
489 ad->main_popup = NULL;
491 ad->font_change_status = SELECTED_FONT_CHANGE_DONE;
492 /*fix PLM issue P130606-3323, per tester's request, need to keep in current font veiw after change the font type*/
493 /*ug_destroy_me(ad->ug); */
494 if (ad->font_type && ad->font_type->item) {
495 elm_genlist_item_expanded_set(ad->font_type->item, FALSE);
499 static Eina_Bool __font_type_change_call(void *data)
502 SettingFontUG *ad = (SettingFontUG *) data;
505 system_settings_set_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, ad->font_name);
508 ad->font_type_timer = NULL;
509 return ECORE_CALLBACK_CANCEL;
513 static void __setting_font_main_popup_cb(void *data, Evas_Object *obj, void *event_info)
516 setting_retm_if(data == NULL, "Data parameter is NULL");
517 SettingFontUG *ad = (SettingFontUG *) data;
519 switch (btn_type(obj)) {
520 case POPUP_RESPONSE_OK: {
521 /* extract font name from tag mixed string */
522 SETTING_TRACE("??? --> popup - get FONT : %s ", ad->subitem->keyStr);
523 SETTING_TRACE("sub_desc --> popup - get FONT : %s ", ad->subitem->sub_desc);
525 /* set font name to font main and font config */
526 /*for mincho font type, need to display "Mincho",but need to update the real font with "UDMincho"*/
527 /*keyStr is used to store the string "Mincho", and sub_desc is used to store "UDMDu4"*/
528 ad->font_type->sub_desc = (char *)g_strdup(ad->subitem->keyStr);
529 elm_object_item_data_set(ad->font_type->item, ad->font_type);
530 elm_genlist_item_update(ad->font_type->item);
532 char *font_name = g_strdup(ad->subitem->sub_desc);
534 ad->prev_font = ad->subitem->chk_status;
535 G_FREE(ad->font_name);
536 ad->font_name = (char *)g_strdup(_(font_name));
537 SETTING_TRACE("ad->subitem->keyStr2 = %s", font_name);
538 elm_radio_value_set(ad->subitem->rgd, ad->subitem->chk_status);
539 /*when the expandlist item is NOT expanded, the subitem object is not existed,so need to clear the list*/
540 if (ad->font_type_list != NULL) {
541 Setting_GenGroupItem_Data *font_type_subitem = NULL;
542 EINA_LIST_FREE(ad->font_type_list, font_type_subitem);
543 ad->font_type_list = NULL;
546 /*vconf_set_str(VCONFKEY_SETAPPL_SETTING_FONT_NAME, font_name); */
547 system_settings_set_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, font_name);
552 /*Due to long time taken by font Setting, add the block code when font is Setting. */
553 if (ad->main_popup) {
554 evas_object_del(ad->main_popup);
555 ad->main_popup = NULL;
558 /* font type popup */
559 ad->main_popup = setting_create_popup_with_progressbar(ad, ad->win_get,
561 NULL, KeyStr_Loading, __setting_progress_popup_cb, 3/*0*/, TRUE, TRUE); /* 3 seconds to wait in maximum */
563 /* ecore timer for change actual font */
564 ad->font_type_timer = ecore_timer_add(1, (Ecore_Task_Cb)__font_type_change_call, ad);
567 case POPUP_RESPONSE_CANCEL: {
568 elm_radio_value_set(ad->subitem->rgd, ad->prev_font);
569 if (ad->main_popup) {
570 evas_object_del(ad->main_popup);
571 ad->main_popup = NULL;
573 ad->font_change_status = SELECTED_FONT_CHANGE_DONE;
582 static void __setting_font_main_popup(void *data)
585 setting_retm_if(data == NULL, "Data parameter is NULL");
586 SettingFontUG *ad = (SettingFontUG *) data;
588 char temp[FONT_BUF_SIZE] = {0,};
589 format_font_name_by_id(ad->subitem->sub_desc, ad->subitem->keyStr2, temp, FONT_BUF_SIZE);
590 char popup_desc[SETTING_STR_SLP_LEN + 1] = {0,};
591 snprintf(popup_desc, SETTING_STR_SLP_LEN, _(SETTING_FONT_POPUP_DESC), temp);
592 if (!ad->main_popup) {
593 ad->main_popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
595 __setting_font_main_popup_cb, 0,
596 2, _("IDS_COM_SK_YES"), _("IDS_COM_SK_NO"));
602 * [UI][expandable list][event handler:selection][font change]
604 void __setting_font_main_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
608 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
609 Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
610 elm_genlist_item_selected_set(subitem, 0);
611 Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
612 ret_if(NULL == data_subItem);
614 SettingFontUG *ad = (SettingFontUG *) data;
617 /* if not change, return */
618 if (ad->prev_font == data_subItem->chk_status) {
619 SETTING_TRACE("NOT CHANGED ");
622 if (ad->font_change_status == SELECTED_FONT_CHANGE_IN_PROCESS) {
625 ad->font_change_status = SELECTED_FONT_CHANGE_IN_PROCESS;
626 ad->subitem = data_subItem;
627 /* Fix PLM P131016-04680
628 when user check the option, make sure the radio button is checked for prev_font font item
629 the radio of new font item will be checked when user seleck "ok" on popup*/
630 elm_radio_value_set(ad->subitem->rgd, data_subItem->chk_status);
632 /* extract font name from tag mixed string */
633 SETTING_TRACE("??? --> popup - get FONT : %s ", ad->subitem->keyStr);
634 SETTING_TRACE("sub_desc --> popup - get FONT : %s ", ad->subitem->sub_desc);
636 /* set font name to font main and font config */
637 /*for mincho font type, need to display "Mincho",but need to update the real font with "UDMincho"*/
638 /*keyStr is used to store the string "Mincho", and sub_desc is used to store "UDMDu4"*/
639 ad->font_type->sub_desc = (char *)g_strdup(ad->subitem->keyStr);
640 elm_object_item_data_set(ad->font_type->item, ad->font_type);
641 elm_genlist_item_update(ad->font_type->item);
643 char *font_name = g_strdup(ad->subitem->sub_desc);
645 ad->prev_font = ad->subitem->chk_status;
646 G_FREE(ad->font_name);
647 ad->font_name = (char *)g_strdup(_(font_name));
648 SETTING_TRACE("ad->subitem->keyStr2 = %s", font_name);
650 /*when the expandlist item is NOT expanded, the subitem object is not existed,so need to clear the list*/
651 if (ad->font_type_list != NULL) {
652 eina_list_free(ad->font_type_list);
653 ad->font_type_list = NULL;
657 /*Due to long time taken by font Setting, add the block code when font is Setting. */
658 if (ad->main_popup) {
659 evas_object_del(ad->main_popup);
660 ad->main_popup = NULL;
661 } /* font type popup */
662 ad->main_popup = setting_create_popup_with_progressbar(ad, ad->win_get,
664 NULL, KeyStr_Loading, __setting_progress_popup_cb, 3/*0*/, TRUE, TRUE); /* 3 seconds to wait in maximum */
666 /* ecore timer for change actual font */
667 ad->font_type_timer = ecore_timer_add(1, (Ecore_Task_Cb)__font_type_change_call, ad);
671 * @brief expandable list handler for font-type
677 static void __setting_font_main_exp_cb(void *data, Evas_Object *obj, void *event_info)
679 ret_if(NULL == data || NULL == event_info);
681 SettingFontUG *ad = (SettingFontUG *) data;
682 Elm_Object_Item *parentItem = event_info; /* parent item */
683 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
684 Evas_Object *scroller = elm_object_item_widget_get(parentItem);
686 Evas_Object *rgd = NULL;
688 int matched_font = -1;
689 G_FREE(ad->font_name);
691 ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, &(ad->font_name));
692 if (ret != SYSTEM_SETTINGS_ERROR_NONE) {
693 SETTING_TRACE_ERROR("Failed to call system_settings_get_value_string with error cdoe %d", ret);
694 ad->font_name = _get_default_font();
696 if (data_parentItem == ad->font_type) {
697 rgd = elm_radio_add(scroller);
698 elm_radio_value_set(rgd, -1);
700 char *default_font_name = NULL;
701 default_font_name = _get_default_font();
702 if (NULL != default_font_name) {
703 /*char font_name_dispaly[FONT_BUF_SIZE] = {0,}; */
704 SETTING_TRACE_DEBUG("default_font_name:%s", default_font_name);
705 /*format_default_font(SETTING_DEFAULT_FONT_TYPE, font_name_dispaly,FONT_BUF_SIZE, default_font_name); */
706 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) calloc(1, sizeof(Setting_GenGroupItem_Data));
707 setting_retm_if(!item_data, "calloc failed");
708 item_data->keyStr2 = (char *)g_strdup(SETTING_DEFAULT_FONT_TYPE);/*for display */
709 item_data->keyStr = (char *)g_strdup(_(SETTING_DEFAULT_FONT_TYPE));/*for tts reading */
710 item_data->swallow_type = SWALLOW_Type_1RADIO;
711 item_data->chk_status = i;
712 item_data->rgd = rgd;
713 item_data->chk_change_cb = NULL;
714 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
715 item_data->sub_desc = strdup(default_font_name); /*the real font type value */
716 item_data->item = elm_genlist_item_append(scroller, &(ad->itc_1text_1icon_2), item_data, parentItem, ELM_GENLIST_ITEM_NONE, __setting_font_main_sub_list_sel_cb, ad);
719 setting_genlist_item_groupstyle_set(item_data, SETTING_GROUP_STYLE_CENTER);
720 item_data->userdata = ad;
721 if (!safeStrCmp(ad->font_name, (const char *)item_data->sub_desc)) {
726 ad->font_type_list = eina_list_append(ad->font_type_list, item_data);
729 Eina_List *font_list = NULL;
731 FcChar8 *font_data = NULL;
732 font_list = __setting_font_main_available_list_get();
733 EINA_LIST_FOREACH(font_list, l, font_data) {
734 if (safeStrCmp(default_font_name, (char *)font_data) != 0) {
735 char keyStr[FONT_BUF_SIZE] = {0,};
736 get_font_name_str((char *)font_data, keyStr, FONT_BUF_SIZE);
737 char temp[FONT_BUF_SIZE] = {0,};
738 /*int ret = get_font_name_tag(font_data, temp, FONT_BUF_SIZE); */
739 get_font_name_id((char *)font_data, temp, FONT_BUF_SIZE);
740 SETTING_TRACE_DEBUG("font data : %s", (char *)font_data);
741 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) calloc(1, sizeof(Setting_GenGroupItem_Data));
742 setting_retm_if(!item_data, "calloc failed");
743 item_data->keyStr2 = (char *)g_strdup(temp);/*for display */
744 item_data->keyStr = (char *)g_strdup(keyStr);/*for tts reading */
745 item_data->swallow_type = SWALLOW_Type_1RADIO;
746 item_data->chk_status = i;
747 item_data->rgd = rgd;
748 item_data->chk_change_cb = NULL;
749 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
750 item_data->sub_desc = strdup((char *)font_data);
751 item_data->item = elm_genlist_item_append(scroller, &(ad->itc_1text_1icon_2), item_data, parentItem, ELM_GENLIST_ITEM_NONE, __setting_font_main_sub_list_sel_cb, ad);
754 item_data->userdata = ad;
755 /*if (!safeStrCmp(ad->font_name, (const char*)font_data)) { */
756 if (!safeStrCmp(ad->font_name, (const char *)item_data->sub_desc)) {
761 ad->font_type_list = eina_list_append(ad->font_type_list, item_data);
765 /* update check status */
766 if (matched_font != -1) {
767 elm_radio_value_set(rgd, matched_font);
770 ad->prev_font = matched_font;
771 G_FREE(default_font_name);
772 } else if (data_parentItem == ad->font_size) {
773 /* [UI] create the font list */
774 ad->size_rdg = elm_radio_add(scroller);
775 elm_radio_state_value_set(ad->size_rdg, -1);
779 while (font_size_table[idx].key_font_name) {
780 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) calloc(1, sizeof(Setting_GenGroupItem_Data));
781 setting_retm_if(!item_data, "calloc failed");
782 item_data->keyStr2 = (char *)g_strdup(font_size_table[idx].key_font_name);/*setting_customize_text(_(font_size_table[idx].key_font_name), convert_font_size(font_size_table[idx].font_size),NULL,NULL);//for display */
783 item_data->keyStr = (char *)g_strdup(_(font_size_table[idx].key_font_name));/*for tts feature; */
784 item_data->swallow_type = SWALLOW_Type_1RADIO_1LABLE;
785 item_data->chk_status = font_size_table[idx].font_size;
786 item_data->chk_change_cb = NULL;
787 item_data->rgd = ad->size_rdg;
788 item_data->userdata = ad;
789 if (idx == sizeof(font_size_table) / sizeof(font_size_table[0]) - 2) {
790 item_data->group_style = SETTING_GROUP_STYLE_BOTTOM;
792 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
795 item_data->item = elm_genlist_item_append(scroller, &(ad->itc_1text_1icon_2_font_size), item_data, parentItem,
796 ELM_GENLIST_ITEM_NONE, setting_font_font_size_list_mouse_up_cb, ad->size_rdg);
800 setting_update_chk_status(ad->size_rdg, INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE);
803 static void __setting_font_main_vconf_change_cb(keynode_t *key, void *data)
806 setting_retm_if(NULL == key, "key is NULL");
807 setting_retm_if(NULL == data, "data is NULL");
808 SettingFontUG *ad = (SettingFontUG *)data;
810 char *vconf_name = vconf_keynode_get_name(key);
812 if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME)) {
815 char *font_type_name = NULL;
816 int ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, &font_type_name);
818 SETTING_TRACE("system-setting call failed with error code %d", ret);
820 SETTING_TRACE("---------------- system-setting call : (%s) ", font_type_name);
821 char *default_font_name = NULL;
822 default_font_name = _get_default_font();
823 char trans_font_type_name[FONT_BUF_SIZE] = {0,};
824 if (!safeStrCmp(default_font_name, font_type_name)) {
825 snprintf(trans_font_type_name, FONT_BUF_SIZE, "%s", SETTING_DEFAULT_FONT_TYPE);
827 ret = get_font_name_id(font_type_name, trans_font_type_name, FONT_BUF_SIZE);
831 G_FREE(ad->font_type->sub_desc);
832 ad->font_type->sub_desc = (char *)g_strdup(trans_font_type_name);
833 elm_object_item_data_set(ad->font_type->item, ad->font_type);
834 elm_genlist_item_update(ad->font_type->item);
835 SETTING_TRACE("ad->font_type->sub_desc:%s", trans_font_type_name);
837 if (elm_genlist_item_expanded_get(ad->font_type->item)) {
839 Setting_GenGroupItem_Data *font_type_subitem;
840 EINA_LIST_FOREACH(ad->font_type_list, l, font_type_subitem) {
841 if (font_type_subitem && !safeStrCmp(font_type_subitem->sub_desc, font_type_name)) {
843 if (font_type_subitem && font_type_subitem->rgd) {
844 elm_radio_value_set(font_type_subitem->rgd, font_type_subitem->chk_status);
845 if (ad->font_change_status != SELECTED_FONT_CHANGE_IN_PROCESS) {
846 ad->subitem = font_type_subitem;
855 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE)) {
858 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &ad->ret_font_size, &err);
860 SETTING_TRACE_ERROR("get vconf failed");
863 G_FREE(ad->font_size->sub_desc);
864 ad->font_size->sub_desc = (char *)g_strdup(__get_font_size_str(ad->ret_font_size));
865 elm_object_item_data_set(ad->font_size->item, ad->font_size);
866 elm_genlist_item_update(ad->font_size->item);
868 if (elm_genlist_item_expanded_get(ad->font_size->item)) {
870 setting_update_chk_status(ad->size_rdg, INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE);
876 SETTING_TRACE_ERROR("vconf_name is error");
882 /* ***************************************************
886 ***************************************************/
887 static int setting_font_main_create(void *cb)
891 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
893 SettingFontUG *ad = (SettingFontUG *) cb;
894 setting_create_Gendial_itc("1line", &(ad->itc_1text_1icon_2));
895 ad->itc_1text_1icon_2.func.text_get = _item_text_keystr2_get;
897 retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
898 "win_main_layout is NULL");
899 ad->font_change_status = SELECTED_FONT_CHANGE_NONE;
901 setting_create_layout_navi_bar_genlist(ad->win_main_layout,
904 _("IDS_COM_BODY_BACK"),
906 (setting_call_back_func)__setting_font_main_click_softkey_back_cb,
908 ad, &ad->genlist, &ad->navibar);
909 ad->navi_it_font = elm_naviframe_top_item_get(ad->navibar);
910 elm_genlist_mode_set(ad->genlist, ELM_LIST_COMPRESS);
911 evas_object_smart_callback_add(ad->genlist, "realized", __gl_realized_cb, ad);
913 setting_enable_expandable_genlist(ad->genlist, ad, __setting_font_main_exp_cb, NULL);
914 int ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME,
915 __setting_font_main_vconf_change_cb, ad);
917 SETTING_TRACE_ERROR("call vconf_notify_key_changed failed");
919 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE,
920 __setting_font_main_vconf_change_cb, ad);
922 SETTING_TRACE_ERROR("call vconf_notify_key_changed failed");
924 __setting_font_main_genlist_item_create(ad);
928 setting_view_font_main.is_create = 1;
929 return SETTING_RETURN_SUCCESS;
932 static int setting_font_main_destroy(void *cb)
936 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
938 SettingFontUG *ad = (SettingFontUG *) cb;
939 int ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME,
940 __setting_font_main_vconf_change_cb);
942 SETTING_TRACE_ERROR("call vconf_ignore_key_changed failed");
944 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE,
945 __setting_font_main_vconf_change_cb);
947 SETTING_TRACE_ERROR("call vconf_ignore_key_changed failed");
950 G_FREE(ad->font_name);
951 ad->font_name = NULL;
954 if (ad->main_popup) {
955 evas_object_del(ad->main_popup);
956 ad->main_popup = NULL;
959 if (ad->ly_main != NULL) {
960 evas_object_del(ad->ly_main);
963 if (ad->navi_it_font != NULL) {
964 ad->navi_it_font = NULL;
966 if (ad->font_type_list != NULL) {
967 eina_list_free(ad->font_type_list);
968 ad->font_type_list = NULL;
971 setting_view_font_main.is_create = 0;
973 return SETTING_RETURN_SUCCESS;
976 static int setting_font_main_update(void *cb)
980 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
982 SettingFontUG *ad = (SettingFontUG *) cb;
984 if (ad->ly_main != NULL) {
985 evas_object_show(ad->ly_main);
989 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &value, &err);
991 SETTING_TRACE_ERROR("get vconf failed");
995 G_FREE(ad->font_size->sub_desc);
996 ad->font_size->sub_desc = (char *)g_strdup(__get_font_size_str(value));
997 elm_object_item_data_set(ad->font_size->item, ad->font_size);
998 elm_genlist_item_update(ad->font_size->item);
1000 /* setting_font_update_vconf_key(ad, SETTING_VCONF_INT_TYPE, INT_SLP_SETTING_LCD_TIMEOUT_NORMAL); */
1002 if (ad->font_type) {
1003 elm_genlist_item_update(ad->font_type->item);
1005 return SETTING_RETURN_SUCCESS;
1008 static int setting_font_main_cleanup(void *cb)
1011 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1013 SettingFontUG *ad = (SettingFontUG *) cb;
1015 if (ad->ly_main != NULL) {
1016 evas_object_hide(ad->ly_main);
1019 return SETTING_RETURN_SUCCESS;
1022 /* ***************************************************
1026 ***************************************************/
1028 static Eina_Bool __setting_font_main_click_softkey_back_cb(void *data, Elm_Object_Item *it)
1030 SETTING_TRACE_BEGIN;
1032 retv_if(data == NULL, EINA_FALSE);
1034 SettingFontUG *ad = (SettingFontUG *) data;
1036 if (ad->viewmode == FONT_SEL_VIEW_APPCONTROL) {
1038 if (app_control_create(&svc)) {
1042 app_control_add_extra_data(svc, "category", "FontType");
1043 app_control_add_extra_data(svc, "FontType", ad->font_name);
1045 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s", "category", "FontType");
1046 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s", "FontType", ad->font_name);
1049 ug_send_result(ad->ug, svc);
1050 app_control_destroy(svc);
1051 } else if (ad->viewmode == FONT_SIZE_VIEW_APPCONTROL) {
1055 int ret = setting_set_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, ad->ret_font_size, &err);
1056 setting_retvm_if(ret == -1, EINA_FALSE, "Failed to set vconf");
1058 if (app_control_create(&svc)) {
1062 char font_size[SETTING_FONT_MAX_LEN] = {0,};
1063 snprintf(font_size, SETTING_FONT_MAX_LEN, "%d", ad->ret_font_size);
1065 app_control_add_extra_data(svc, "category", "FontSize");
1066 app_control_add_extra_data(svc, "FontSize", font_size);
1068 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s", "category", "FontSize");
1069 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s", "FontSize", font_size);
1072 ug_send_result(ad->ug, svc);
1073 app_control_destroy(svc);
1075 /* Send destroy request */
1076 ug_destroy_me(ad->ug);