3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #include <setting-font-main.h>
19 #include <fontconfig/fontconfig.h>
20 #include <unicode/uloc.h>
21 #include <libxml/xmlmemory.h>
22 #include <libxml/parser.h>
24 #include <system_settings.h>
26 #define SETTING_FONT_MAX_LEN 10
27 #define FONT_BUF_SIZE 256
29 static int setting_font_main_create(void *cb);
30 static int setting_font_main_destroy(void *cb);
31 static int setting_font_main_update(void *cb);
32 static int setting_font_main_cleanup(void *cb);
34 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
37 setting_view setting_view_font_main = {
38 .create = setting_font_main_create,
39 .destroy = setting_font_main_destroy,
40 .update = setting_font_main_update,
41 .cleanup = setting_font_main_cleanup,
48 static char* __setting_font_main_get_font_size(int value)
50 const char* font_size_arr[] = {
51 _("IDS_ST_BODY_SMALL_M_TEXTSIZE"), // 0
52 _("IDS_ST_BODY_NORMAL_T_PROFILE"), // 1
53 _("IDS_ST_BODY_TEXTSTYLE_LARGE"), // 2
54 _("IDS_EMAIL_OPT_HUGE_M_TEXTSIZE"), // 3
55 _("IDS_EMAIL_POP_GIANT_M_TEXTSIZE"), // 4
59 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
60 return (char *)font_size_arr[0];
61 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
62 return (char *)font_size_arr[1];
63 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
64 return (char *)font_size_arr[2];
65 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
66 return (char *)font_size_arr[3];
67 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
68 return (char *)font_size_arr[4];
70 return (char *)font_size_arr[1];
76 * [API] get a font list from current system
77 * REFACTORING: move this feature to system-settings
79 static Eina_List *__setting_font_main_available_list_get()
82 FcObjectSet *os = NULL;
84 FcPattern *pat = NULL;
85 Eina_List *list = NULL;
86 FcConfig *font_config = NULL;
88 font_config = FcInitLoadConfigAndFonts();
90 setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts");
92 pat = FcPatternCreate();
94 os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char *) 0);
97 fs = FcFontList(font_config, pat, os);
98 FcObjectSetDestroy(os);
103 FcPatternDestroy(pat);
109 SETTING_TRACE_DEBUG("fs->nfont = %d", fs->nfont);
111 for (j = 0; j < fs->nfont; j++) {
112 FcChar8 *family = NULL;
113 FcChar8 *file = NULL;
115 if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
116 //SETTING_TRACE_DEBUG("FC_FILE : %s\n", file);
117 int preload_path_len = safeStrLen(SETTING_FONT_PRELOAD_FONT_PATH);
118 int download_path_len = safeStrLen(SETTING_FONT_DOWNLOADED_FONT_PATH);
119 if (!safeStrNCmp((const char*)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len) ||
120 !safeStrNCmp((const char*)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len)) {
121 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch) {
122 SETTING_TRACE_DEBUG("Family name is invalid");
126 //SETTING_TRACE_DEBUG("family = %s", (char *)family);
127 if (eina_list_data_find(list, family) == NULL) {
128 list = eina_list_append(list, family);
129 /* list = eina_list_append(list, family); */
130 // for TEST because there's 1 font on target.
135 FcFontSetDestroy(fs);
139 FcConfigDestroy(font_config);
144 static void __setting_font_main_genlist_sel_cb(void *data, Evas_Object * obj, void *event_info)
147 setting_retm_if(data == NULL, "Data parameter is NULL");
149 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
150 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
151 elm_genlist_item_selected_set(item, 0);
152 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
154 SettingFontUG *ad = (SettingFontUG *)data;
156 if (ad->font_size == list_item) {
157 setting_view_change(&setting_view_font_main, &setting_view_font_font_size, ad);
162 int get_font_name_str(char* font_type_name, char* trans_font_type_name, int bufsize)
164 if(safeStrCmp(font_type_name, "Choco cooky") == 0)
165 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
166 else if(safeStrCmp(font_type_name, "Cool jazz") == 0)
167 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
168 else if (safeStrCmp(font_type_name, "HelveticaNeue") == 0)
169 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
171 snprintf(trans_font_type_name, bufsize, "%s", font_type_name);
176 int get_font_name_tag(char* font_data, char* temp, int bufsize)
178 SETTING_TRACE("font data : %s", (char*)font_data);
180 char* pos = font_data;
181 char new_name[bufsize];
186 SETTING_TRACE(">>> %c", *pos);
189 SETTING_TRACE(">>> empty ' ' ");
190 new_name[count] = '\\';
192 new_name[count] = ' ';
194 new_name[count] = font_data[i];
201 new_name[count] = '\0';
203 SETTING_TRACE(">>> new_name length : %d : string : %s", count, (char*)new_name);
204 snprintf(temp, bufsize, "<font=%s>%s</font>", new_name, font_data);
208 static void __setting_font_main_genlist_item_create(void *data)
211 setting_retm_if(NULL == data, "data is NULL");
213 SettingFontUG *ad = (SettingFontUG *)data;
214 Elm_Object_Item *item = NULL;
216 if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SEL_VIEW_APPCONTROL) // font type only
219 item = elm_genlist_item_append(ad->genlist, &(ad->itc_seperator), NULL, NULL,
220 ELM_GENLIST_ITEM_NONE, NULL, NULL);
221 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
223 char *font_type_name = NULL;
224 int ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, &font_type_name);
225 SETTING_TRACE("---------------- system-setting call : (%s) ", font_type_name);
228 char trans_font_type_name[256] = {0,};
229 if(safeStrCmp(font_type_name, "Choco cooky") == 0)
230 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
231 else if(safeStrCmp(font_type_name, "Cool jazz") == 0)
232 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
233 else if (safeStrCmp(font_type_name, "HelveticaNeue") == 0)
234 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
236 snprintf(trans_font_type_name, 256, "%s", font_type_name);
238 char trans_font_type_name[FONT_BUF_SIZE] = {0,};
239 ret = get_font_name_str(font_type_name, trans_font_type_name, FONT_BUF_SIZE);
240 //SETTING_TRACE_DEBUG("font data : %s", (char*)font_data);
242 SETTING_TRACE_DEBUG("current font : %s, trans font name: %s", font_type_name, trans_font_type_name);
244 ad->font_type = setting_create_Gendial_exp_parent_field(ad->genlist,
245 &(ad->itc_2text_3_parent),
247 SWALLOW_Type_INVALID,
248 SETTING_FONT_TYPE_STR,
249 trans_font_type_name);
251 ad->font_type->userdata = ad;
253 SETTING_TRACE_ERROR("ad->font_type is NULL");
255 G_FREE(ad->font_name);
256 ad->font_name = g_strdup(font_type_name);
257 G_FREE(font_type_name);
260 if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SIZE_VIEW_APPCONTROL) // font size only
264 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &ad->ret_font_size, &err);
266 SETTING_TRACE_ERROR("get vconf failed");
269 ad->font_size = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2),
270 __setting_font_main_genlist_sel_cb,
271 ad, SWALLOW_Type_INVALID, NULL,
272 NULL, ad->ret_font_size, SETTING_FONT_SIZE_STR,
273 __setting_font_main_get_font_size(ad->ret_font_size), NULL);
275 ad->font_size->userdata = ad;
277 SETTING_TRACE_ERROR("ad->font_size is NULL");
281 setting_create_Gendial_field_def(ad->genlist, &(ad->itc_bg_1icon), NULL,
282 ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
283 NULL, NULL, 0, SETTING_FONT_SIZE_DESC, NULL,
291 * [API] set current font
294 static void __setting_font_main_font_set(char *font_name)
296 retm_if(font_name == NULL, "Invalid argument: font_name is NULL");
298 ret = system_settings_set_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, font_name);
302 static void __setting_font_main_popup_cb(void *data, Evas_Object *obj, void *event_info)
305 setting_retm_if(data == NULL, "Data parameter is NULL");
306 SettingFontUG *ad = (SettingFontUG *) data;
308 switch (btn_type(obj)) {
309 case POPUP_RESPONSE_OK:
311 /* extract font name from tag mixed string */
312 SETTING_TRACE("??? --> popup - get FONT : %s ", ad->subitem->keyStr);
314 SETTING_TRACE("sub_desc --> popup - get FONT : %s ", ad->subitem->sub_desc);
317 temp = strchr(ad->subitem->keyStr, '>');
320 last = strrchr(temp, '<');
323 char font_name[64] = {0,};
324 safeCopyStr(font_name, temp, (int)(last-temp));
327 char *font_name = g_strdup(ad->subitem->sub_desc);
329 /* set font name to font main and font config */
330 ad->font_type->sub_desc = (char *)g_strdup(_(font_name));
331 elm_object_item_data_set(ad->font_type->item, ad->font_type);
332 elm_genlist_item_update(ad->font_type->item);
334 ad->prev_font = ad->subitem->chk_status;
335 G_FREE(ad->font_name);
336 ad->font_name = (char *)g_strdup(_(font_name));
337 SETTING_TRACE("ad->subitem->keyStr = %s", font_name);
339 __setting_font_main_font_set(font_name);
340 ug_destroy_me(ad->ug);
343 case POPUP_RESPONSE_CANCEL:
345 elm_radio_value_set(ad->subitem->rgd, ad->prev_font);
356 evas_object_del(ad->popup);
361 static void __setting_font_main_popup(void *data)
364 setting_retm_if(data == NULL, "Data parameter is NULL");
365 SettingFontUG *ad = (SettingFontUG *) data;
367 char popup_desc[SETTING_STR_SLP_LEN + 1] = {0,};
368 snprintf(popup_desc, SETTING_STR_SLP_LEN, "%s %s?", _(SETTING_FONT_POPUP_DESC), ad->subitem->keyStr);
370 ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
372 __setting_font_main_popup_cb, 0,
373 2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
378 * [UI][expandable list][event handler:selection][font change]
380 void __setting_font_main_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
384 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
385 Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
386 elm_genlist_item_selected_set(subitem, 0);
387 Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
388 ret_if(NULL == data_subItem);
390 SettingFontUG *ad = (SettingFontUG *) data;
392 /* if not change, return */
393 if (ad->prev_font == data_subItem->chk_status) {
394 SETTING_TRACE("NOT CHANGED ");
398 ad->subitem = data_subItem;
399 elm_radio_value_set(ad->subitem->rgd, ad->subitem->chk_status);
401 __setting_font_main_popup(ad);
404 static void __setting_font_main_exp_cb(void *data, Evas_Object *obj, void *event_info)
406 ret_if(NULL == data || NULL == event_info);
408 SettingFontUG *ad = (SettingFontUG *) data;
409 Elm_Object_Item *parentItem = event_info; /* parent item */
410 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
411 Evas_Object *scroller = elm_object_item_widget_get(parentItem);
413 Evas_Object *rgd = NULL;
414 if (data_parentItem == ad->font_type) {
415 rgd = elm_radio_add(scroller);
416 elm_radio_value_set(rgd, -1);
418 Eina_List *font_list = NULL;
420 FcChar8 *font_data = NULL;
421 font_list = __setting_font_main_available_list_get();
424 int matched_font = -1;
425 Setting_GenGroupItem_Data *item = NULL;
426 EINA_LIST_FOREACH(font_list, l, font_data)
428 char temp[FONT_BUF_SIZE] = {0,};
429 int ret = get_font_name_tag(font_data, temp, FONT_BUF_SIZE);
430 SETTING_TRACE_DEBUG("font data : %s", (char*)font_data);
432 item = setting_create_Gendial_exp_sub_field(scroller, &(ad->itc_1text_1icon_2),
433 __setting_font_main_sub_list_sel_cb, ad,
434 parentItem, SWALLOW_Type_1RADIO, rgd,
440 //item->sub_desc = font_data;
441 item->sub_desc = strdup(font_data);
442 //if (!safeStrCmp(ad->font_name, (const char*)font_data)) {
443 if (!safeStrCmp(ad->font_name, (const char*)item->sub_desc)) {
451 /* update check status */
452 if (matched_font != -1) {
453 elm_radio_value_set(rgd, matched_font);
456 ad->prev_font = matched_font;
461 /* ***************************************************
465 ***************************************************/
466 static int setting_font_main_create(void *cb)
470 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
472 SettingFontUG *ad = (SettingFontUG *) cb;
474 retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
475 "win_main_layout is NULL");
478 setting_create_layout_navi_bar_genlist(ad->win_main_layout,
481 _("IDS_COM_BODY_BACK"),
483 __setting_font_main_click_softkey_back_cb,
485 ad, &ad->genlist, &ad->navibar);
487 setting_enable_expandable_genlist(ad->genlist, ad, __setting_font_main_exp_cb, NULL);
489 __setting_font_main_genlist_item_create(ad);
491 setting_view_font_main.is_create = 1;
492 return SETTING_RETURN_SUCCESS;
495 static int setting_font_main_destroy(void *cb)
499 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
501 SettingFontUG *ad = (SettingFontUG *) cb;
505 G_FREE(ad->font_name);
506 ad->font_name = NULL;
510 evas_object_del(ad->popup);
514 if (ad->ly_main != NULL) {
515 evas_object_del(ad->ly_main);
519 setting_view_font_main.is_create = 0;
521 return SETTING_RETURN_SUCCESS;
524 static int setting_font_main_update(void *cb)
528 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
530 SettingFontUG *ad = (SettingFontUG *) cb;
532 if (ad->ly_main != NULL) {
533 evas_object_show(ad->ly_main);
537 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &value, &err);
539 SETTING_TRACE_ERROR("get vconf failed");
543 G_FREE(ad->font_size->sub_desc);
544 ad->font_size->sub_desc = (char *)g_strdup(__setting_font_main_get_font_size(value));
545 elm_object_item_data_set(ad->font_size->item, ad->font_size);
546 elm_genlist_item_update(ad->font_size->item);
549 setting_font_update_vconf_key(ad, SETTING_VCONF_INT_TYPE,
550 INT_SLP_SETTING_LCD_TIMEOUT_NORMAL);
553 return SETTING_RETURN_SUCCESS;
556 static int setting_font_main_cleanup(void *cb)
559 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
561 SettingFontUG *ad = (SettingFontUG *) cb;
563 if (ad->ly_main != NULL) {
564 evas_object_hide(ad->ly_main);
567 return SETTING_RETURN_SUCCESS;
570 /* ***************************************************
574 ***************************************************/
576 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
581 ret_if(data == NULL);
583 SettingFontUG *ad = (SettingFontUG *) data;
585 if (ad->viewmode == FONT_SEL_VIEW_APPCONTROL)
588 if (service_create(&svc))
591 service_add_extra_data(svc, "category", "FontType");
592 service_add_extra_data(svc, "FontType", ad->font_name);
594 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontType");
595 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontType", ad->font_name);
598 ug_send_result(ad->ug, svc);
599 service_destroy(svc);
601 else if (ad->viewmode == FONT_SIZE_VIEW_APPCONTROL)
606 int ret = setting_set_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, ad->ret_font_size, &err);
607 setting_retm_if(ret == -1, "Failed to set vconf");
609 if (service_create(&svc))
612 char font_size[SETTING_FONT_MAX_LEN] = {0,};
613 snprintf(font_size, SETTING_FONT_MAX_LEN, "%d", ad->ret_font_size);
615 service_add_extra_data(svc, "category", "FontSize");
616 service_add_extra_data(svc, "FontSize", font_size);
618 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontSize");
619 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontSize", font_size);
622 ug_send_result(ad->ug, svc);
623 service_destroy(svc);
625 /* Send destroy request */
626 ug_destroy_me(ad->ug);