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>
23 #include <fontconfig/fontconfig.h>
24 #include <unicode/uloc.h>
25 #include <libxml/xmlmemory.h>
26 #include <libxml/parser.h>
28 #include <system_settings.h>
30 #define SETTING_FONT_MAX_LEN 10
32 static int setting_font_main_create(void *cb);
33 static int setting_font_main_destroy(void *cb);
34 static int setting_font_main_update(void *cb);
35 static int setting_font_main_cleanup(void *cb);
37 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
40 setting_view setting_view_font_main = {
41 .create = setting_font_main_create,
42 .destroy = setting_font_main_destroy,
43 .update = setting_font_main_update,
44 .cleanup = setting_font_main_cleanup,
47 static char* __setting_font_main_get_font_size(int value)
49 const char* font_size_arr[] = {
50 _("IDS_ST_BODY_SMALL_M_TEXTSIZE"), // 0
51 _("IDS_ST_BODY_NORMAL_T_PROFILE"), // 1
52 _("IDS_ST_BODY_TEXTSTYLE_LARGE"), // 2
53 _("IDS_EMAIL_OPT_HUGE_M_TEXTSIZE"), // 3
54 _("IDS_EMAIL_POP_GIANT_M_TEXTSIZE"), // 4
58 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
59 return (char *)font_size_arr[0];
60 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
61 return (char *)font_size_arr[1];
62 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
63 return (char *)font_size_arr[2];
64 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
65 return (char *)font_size_arr[3];
66 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
67 return (char *)font_size_arr[4];
69 return (char *)font_size_arr[1];
73 static Eina_List *__setting_font_main_available_list_get()
76 FcObjectSet *os = NULL;
78 FcPattern *pat = NULL;
79 Eina_List *list = NULL;
80 FcConfig *font_config = NULL;
82 font_config = FcInitLoadConfigAndFonts();
84 setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts");
86 pat = FcPatternCreate();
88 os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char *) 0);
91 fs = FcFontList(font_config, pat, os);
92 FcObjectSetDestroy(os);
97 FcPatternDestroy(pat);
103 SETTING_TRACE_DEBUG("fs->nfont = %d", fs->nfont);
105 for (j = 0; j < fs->nfont; j++) {
106 FcChar8 *family = NULL;
107 FcChar8 *file = NULL;
109 if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
110 //SETTING_TRACE_DEBUG("FC_FILE : %s\n", file);
111 int preload_path_len = safeStrLen(SETTING_FONT_PRELOAD_FONT_PATH);
112 int download_path_len = safeStrLen(SETTING_FONT_DOWNLOADED_FONT_PATH);
113 if (!safeStrNCmp((const char*)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len) ||
114 !safeStrNCmp((const char*)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len)) {
115 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch) {
116 SETTING_TRACE_DEBUG("Family name is invalid");
120 //SETTING_TRACE_DEBUG("family = %s", (char *)family);
121 if (eina_list_data_find(list, family) == NULL) {
122 list = eina_list_append(list, family);
123 /* list = eina_list_append(list, family); */
124 // for TEST because there's 1 font on target.
129 FcFontSetDestroy(fs);
133 FcConfigDestroy(font_config);
138 static void __setting_font_main_genlist_sel_cb(void *data, Evas_Object * obj, void *event_info)
141 setting_retm_if(data == NULL, "Data parameter is NULL");
143 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
144 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
145 elm_genlist_item_selected_set(item, 0);
146 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
148 SettingFontUG *ad = (SettingFontUG *)data;
150 if (ad->font_size == list_item) {
151 setting_view_change(&setting_view_font_main, &setting_view_font_font_size, ad);
155 static void __setting_font_main_genlist_item_create(void *data)
158 setting_retm_if(NULL == data, "data is NULL");
160 SettingFontUG *ad = (SettingFontUG *)data;
161 Elm_Object_Item *item = NULL;
163 if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SEL_VIEW_APPCONTROL) // font type only
166 item = elm_genlist_item_append(ad->genlist, &(ad->itc_seperator), NULL, NULL,
167 ELM_GENLIST_ITEM_NONE, NULL, NULL);
168 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
169 char *font_type_name = NULL;
170 font_type_name = cur_font_get();
172 char trans_font_type_name[256] = {0,};
173 if(safeStrCmp(font_type_name, "Choco cooky") == 0)
174 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
175 else if(safeStrCmp(font_type_name, "Cool jazz") == 0)
176 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
178 snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
180 SETTING_TRACE_DEBUG("current font : %s, trans font name: %s", font_type_name, trans_font_type_name);
182 ad->font_type = setting_create_Gendial_exp_parent_field(ad->genlist,
183 &(ad->itc_2text_3_parent),
185 SWALLOW_Type_INVALID,
186 SETTING_FONT_TYPE_STR,
187 trans_font_type_name);
189 ad->font_type->userdata = ad;
191 SETTING_TRACE_ERROR("ad->font_type is NULL");
193 G_FREE(ad->font_name);
194 ad->font_name = g_strdup(font_type_name);
195 G_FREE(font_type_name);
198 if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SIZE_VIEW_APPCONTROL) // font size only
202 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &ad->ret_font_size, &err);
204 SETTING_TRACE_ERROR("get vconf failed");
207 ad->font_size = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2),
208 __setting_font_main_genlist_sel_cb,
209 ad, SWALLOW_Type_INVALID, NULL,
210 NULL, ad->ret_font_size, SETTING_FONT_SIZE_STR,
211 __setting_font_main_get_font_size(ad->ret_font_size), NULL);
213 ad->font_size->userdata = ad;
215 SETTING_TRACE_ERROR("ad->font_size is NULL");
219 setting_create_Gendial_field_def(ad->genlist, &(ad->itc_bg_1icon), NULL,
220 ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
221 NULL, NULL, 0, SETTING_FONT_SIZE_DESC, NULL,
231 static void __setting_font_main_font_set(char *font_name)
233 retm_if(font_name == NULL, "Invalid argument: font_name is NULL");
234 xmlDocPtr doc = (xmlDocPtr)font_conf_doc_parse(SETTING_FONT_CONF_FILE, font_name);
237 xmlSaveFormatFile(SETTING_FONT_CONF_FILE, doc, 0);
242 font_config_set(font_name);
245 Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
246 Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
247 ecore_x_window_prop_string_set(ecore_win, atom, "slp");
250 static void __setting_font_main_popup_cb(void *data, Evas_Object *obj, void *event_info)
253 setting_retm_if(data == NULL, "Data parameter is NULL");
254 SettingFontUG *ad = (SettingFontUG *) data;
256 switch (btn_type(obj)) {
257 case POPUP_RESPONSE_OK:
259 /* extract font name from tag mixed string */
261 temp = strchr(ad->subitem->keyStr, '>');
264 last = strrchr(temp, '<');
266 char font_name[64] = {0,};
267 safeCopyStr(font_name, temp, (int)(last-temp));
269 /* set font name to font main and font config */
270 ad->font_type->sub_desc = (char *)g_strdup(_(font_name));
271 elm_object_item_data_set(ad->font_type->item, ad->font_type);
272 elm_genlist_item_update(ad->font_type->item);
274 ad->prev_font = ad->subitem->chk_status;
275 G_FREE(ad->font_name);
276 ad->font_name = (char *)g_strdup(_(font_name));
277 SETTING_TRACE("ad->subitem->keyStr = %s", font_name);
279 __setting_font_main_font_set(font_name);
280 ug_destroy_me(ad->ug);
283 case POPUP_RESPONSE_CANCEL:
285 elm_radio_value_set(ad->subitem->rgd, ad->prev_font);
296 evas_object_del(ad->popup);
301 static void __setting_font_main_popup(void *data)
304 setting_retm_if(data == NULL, "Data parameter is NULL");
305 SettingFontUG *ad = (SettingFontUG *) data;
307 char popup_desc[SETTING_STR_SLP_LEN + 1] = {0,};
308 snprintf(popup_desc, SETTING_STR_SLP_LEN, "%s %s?", _(SETTING_FONT_POPUP_DESC), ad->subitem->keyStr);
310 ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
312 __setting_font_main_popup_cb, 0,
313 2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
318 * [UI][expandable list][event handler:selection][font change]
320 void __setting_font_main_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
324 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
325 Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
326 elm_genlist_item_selected_set(subitem, 0);
327 Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
328 ret_if(NULL == data_subItem);
330 SettingFontUG *ad = (SettingFontUG *) data;
332 /* if not change, return */
333 if (ad->prev_font == data_subItem->chk_status) {
334 SETTING_TRACE("NOT CHANGED ");
338 ad->subitem = data_subItem;
339 elm_radio_value_set(ad->subitem->rgd, ad->subitem->chk_status);
341 __setting_font_main_popup(ad);
344 static void __setting_font_main_exp_cb(void *data, Evas_Object *obj, void *event_info)
346 ret_if(NULL == data || NULL == event_info);
348 SettingFontUG *ad = (SettingFontUG *) data;
349 Elm_Object_Item *parentItem = event_info; /* parent item */
350 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
351 Evas_Object *scroller = elm_object_item_widget_get(parentItem);
353 Evas_Object *rgd = NULL;
354 if (data_parentItem == ad->font_type) {
355 rgd = elm_radio_add(scroller);
356 elm_radio_value_set(rgd, -1);
358 Eina_List *font_list = NULL;
360 FcChar8 *font_data = NULL;
361 font_list = __setting_font_main_available_list_get();
364 int matched_font = -1;
365 Setting_GenGroupItem_Data *item = NULL;
366 EINA_LIST_FOREACH(font_list, l, font_data)
368 SETTING_TRACE_DEBUG("font data : %s", (char*)font_data);
369 char temp[256] = {0,};
370 if(safeStrCmp(font_data, "Choco cooky") == 0)
371 snprintf(temp, 256, "<font=%s>%s</font>", "Chococooky", _("IDS_ST_BODY_CHOCO_COOKY"));
372 else if(safeStrCmp(font_data, "Cool jazz") == 0)
373 snprintf(temp, 256, "<font=%s>%s</font>", "Cooljazz", _("IDS_ST_BODY_COOL_JAZZ"));
375 snprintf(temp, 256, "<font=%s>%s</font>", "HelveticaNeue", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
377 item = setting_create_Gendial_exp_sub_field(scroller, &(ad->itc_1text_1icon_2),
378 __setting_font_main_sub_list_sel_cb, ad,
379 parentItem, SWALLOW_Type_1RADIO, rgd,
385 if (!safeStrCmp(ad->font_name, (const char*)font_data)) {
393 /* update check status */
394 if (matched_font != -1) {
395 elm_radio_value_set(rgd, matched_font);
398 ad->prev_font = matched_font;
403 /* ***************************************************
407 ***************************************************/
408 static int setting_font_main_create(void *cb)
412 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
414 SettingFontUG *ad = (SettingFontUG *) cb;
416 retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
417 "win_main_layout is NULL");
420 setting_create_layout_navi_bar_genlist(ad->win_main_layout,
423 _("IDS_COM_BODY_BACK"),
425 __setting_font_main_click_softkey_back_cb,
427 ad, &ad->genlist, &ad->navibar);
429 setting_enable_expandable_genlist(ad->genlist, ad,
430 __setting_font_main_exp_cb, NULL);
432 __setting_font_main_genlist_item_create(ad);
434 setting_view_font_main.is_create = 1;
435 return SETTING_RETURN_SUCCESS;
438 static int setting_font_main_destroy(void *cb)
442 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
444 SettingFontUG *ad = (SettingFontUG *) cb;
448 G_FREE(ad->font_name);
449 ad->font_name = NULL;
453 evas_object_del(ad->popup);
457 if (ad->ly_main != NULL) {
458 evas_object_del(ad->ly_main);
462 setting_view_font_main.is_create = 0;
464 return SETTING_RETURN_SUCCESS;
467 static int setting_font_main_update(void *cb)
471 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
473 SettingFontUG *ad = (SettingFontUG *) cb;
475 if (ad->ly_main != NULL) {
476 evas_object_show(ad->ly_main);
480 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &value, &err);
482 SETTING_TRACE_ERROR("get vconf failed");
486 G_FREE(ad->font_size->sub_desc);
487 ad->font_size->sub_desc = (char *)g_strdup(__setting_font_main_get_font_size(value));
488 elm_object_item_data_set(ad->font_size->item, ad->font_size);
489 elm_genlist_item_update(ad->font_size->item);
492 setting_font_update_vconf_key(ad, SETTING_VCONF_INT_TYPE,
493 INT_SLP_SETTING_LCD_TIMEOUT_NORMAL);
496 return SETTING_RETURN_SUCCESS;
499 static int setting_font_main_cleanup(void *cb)
502 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
504 SettingFontUG *ad = (SettingFontUG *) cb;
506 if (ad->ly_main != NULL) {
507 evas_object_hide(ad->ly_main);
510 return SETTING_RETURN_SUCCESS;
513 /* ***************************************************
517 ***************************************************/
519 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
524 ret_if(data == NULL);
526 SettingFontUG *ad = (SettingFontUG *) data;
528 if (ad->viewmode == FONT_SEL_VIEW_APPCONTROL)
531 if (service_create(&svc))
534 service_add_extra_data(svc, "category", "FontType");
535 service_add_extra_data(svc, "FontType", ad->font_name);
537 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontType");
538 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontType", ad->font_name);
541 ug_send_result(ad->ug, svc);
542 service_destroy(svc);
544 else if (ad->viewmode == FONT_SIZE_VIEW_APPCONTROL)
549 int ret = setting_set_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, ad->ret_font_size, &err);
550 setting_retm_if(ret == -1, "Failed to set vconf");
552 if (service_create(&svc))
555 char font_size[SETTING_FONT_MAX_LEN] = {0,};
556 snprintf(font_size, SETTING_FONT_MAX_LEN, "%d", ad->ret_font_size);
558 service_add_extra_data(svc, "category", "FontSize");
559 service_add_extra_data(svc, "FontSize", font_size);
561 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontSize");
562 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontSize", font_size);
565 ug_send_result(ad->ug, svc);
566 service_destroy(svc);
568 /* Send destroy request */
569 ug_destroy_me(ad->ug);