#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "common.h" #define UNSUPPORTED_FONT_CNT 28 #define UNSUPPORTED_FONT_MAX_LEN 32 //#define COLOR_KEYWORD_MAX_CNT 76 old style #define COLOR_KEYWORD_MAX_CNT 66 #define SYNTAX_TEMPLATE_MAX_LEN 3072 #define SYNTAX_TEMPLATE_FONT_SIZE 10 #define SYNTAX_COLOR_LEN 7 typedef struct color_keyword_s { int pos_begin; int pos_end; int color_type; } color_keyword; typedef struct text_setting_s { Evas_Object *layout; Evas_Object *text_edit_entry; Evas_Object *color_ctxpopup; Evas_Object *slider_font; Evas_Object *spinner_font; Evas_Object *list_font_name; Evas_Object *list_font_style; color_keyword *color_keyword_list; char *syntax_template_format; char *syntax_template_str; const char *font_name; const char *font_style; double font_scale; } text_setting_data; static char unsupported_font_list[UNSUPPORTED_FONT_CNT][UNSUPPORTED_FONT_MAX_LEN] = { "Dingbats", "KacstArt", "KacstBook", "KacstDecorative", "KacstDigital", "KacstFarsi", "KacstLetter", "KacstNaskh", "KacstOffice", "KacstPen", "KacstPoster", "KacstQurn", "KacstScreen", "KacstTitle", "KacstTitleL", "LKLUG", "Lohit Bengali", "Lohit Gujarati", "Lohit Punjabi", "Lohit Tamil", "OpenSymbol", "Pothana2000", "Saab", "Standard Symbols L", "Symbol", "Vemana2000", "ori1Uni", "mry_KacstQurn" }; static char color_val[ENVENTOR_SYNTAX_COLOR_LAST][SYNTAX_COLOR_LEN] = {{0}}; static int color_type_list[COLOR_KEYWORD_MAX_CNT] = { //comment ... #define ... ENVENTOR_SYNTAX_COLOR_COMMENT, ENVENTOR_SYNTAX_COLOR_MACRO, //rect { ... ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, //desc { ... ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, //rel1 { ... ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //relative ... ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //0.0; rel2 ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, //.relative ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, //: 1.0 1.0; ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, //color: ... ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //RECT_COLOR; ... ENVENTOR_SYNTAX_COLOR_MACRO, ENVENTOR_SYNTAX_COLOR_SYMBOL, //} } ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, //program { ... ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, // "mouse_down"; ... ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, //signal: ... ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, // "mouse,down,1" ... ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, //source: ... ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //"rect" ... ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, //action: ... ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //STATE_SET ... ENVENTOR_SYNTAX_COLOR_CONSTANT, ENVENTOR_SYNTAX_COLOR_STRING, //0.0; target ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, //: "rect" ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, //"; } ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, //script { ... ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //public flag = ... ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, //0; public ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, //func() { if ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, //(!get_int ... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC, //(flag))... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, //set_int(... ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC, ENVENTOR_SYNTAX_COLOR_SYMBOL, //flag, 1);... ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, //} } ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL }; /* old style */ #if 0 static int color_type_list[COLOR_KEYWORD_MAX_CNT] = { ENVENTOR_SYNTAX_COLOR_COMMENT, ENVENTOR_SYNTAX_COLOR_MACRO, ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_CONSTANT, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_MACRO, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_MAIN_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_CONSTANT, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_STRING, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SUB_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_KEYWORD, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SCRIPT_FUNC, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL, ENVENTOR_SYNTAX_COLOR_SYMBOL }; #endif /*****************************************************************************/ /* Internal method implementation */ /*****************************************************************************/ static void syntax_template_set(char *syntax_template_str, char *syntax_template_format, double font_scale) { if (!syntax_template_str || !syntax_template_format) return; snprintf(syntax_template_str, SYNTAX_TEMPLATE_MAX_LEN, syntax_template_format, (int) ((SYNTAX_TEMPLATE_FONT_SIZE * font_scale) + 0.5), color_val[color_type_list[0]], color_val[color_type_list[1]], color_val[color_type_list[2]], color_val[color_type_list[3]], color_val[color_type_list[4]], color_val[color_type_list[5]], color_val[color_type_list[6]], color_val[color_type_list[7]], color_val[color_type_list[8]], color_val[color_type_list[9]], color_val[color_type_list[10]], color_val[color_type_list[11]], color_val[color_type_list[12]], color_val[color_type_list[13]], color_val[color_type_list[14]], color_val[color_type_list[15]], color_val[color_type_list[16]], color_val[color_type_list[17]], color_val[color_type_list[18]], color_val[color_type_list[19]], color_val[color_type_list[20]], color_val[color_type_list[21]], color_val[color_type_list[22]], color_val[color_type_list[23]], color_val[color_type_list[24]], color_val[color_type_list[25]], color_val[color_type_list[26]], color_val[color_type_list[27]], color_val[color_type_list[28]], color_val[color_type_list[29]], color_val[color_type_list[30]], color_val[color_type_list[31]], color_val[color_type_list[32]], color_val[color_type_list[33]], color_val[color_type_list[34]], color_val[color_type_list[35]], color_val[color_type_list[36]], color_val[color_type_list[37]], color_val[color_type_list[38]], color_val[color_type_list[39]], color_val[color_type_list[40]], color_val[color_type_list[41]], color_val[color_type_list[42]], color_val[color_type_list[43]], color_val[color_type_list[44]], color_val[color_type_list[45]], color_val[color_type_list[46]], color_val[color_type_list[47]], color_val[color_type_list[48]], color_val[color_type_list[49]], color_val[color_type_list[50]], color_val[color_type_list[51]], color_val[color_type_list[52]], color_val[color_type_list[53]], color_val[color_type_list[54]], color_val[color_type_list[55]], color_val[color_type_list[56]], color_val[color_type_list[57]], color_val[color_type_list[58]], color_val[color_type_list[59]], color_val[color_type_list[60]], color_val[color_type_list[61]], color_val[color_type_list[62]], color_val[color_type_list[63]], color_val[color_type_list[64]], color_val[color_type_list[65]]); /* old style */ #if 0 snprintf(syntax_template_str, SYNTAX_TEMPLATE_MAX_LEN, syntax_template_format, (int) ((SYNTAX_TEMPLATE_FONT_SIZE * font_scale) + 0.5), color_val[color_type_list[0]], color_val[color_type_list[1]], color_val[color_type_list[2]], color_val[color_type_list[3]], color_val[color_type_list[4]], color_val[color_type_list[5]], color_val[color_type_list[6]], color_val[color_type_list[7]], color_val[color_type_list[8]], color_val[color_type_list[9]], color_val[color_type_list[10]], color_val[color_type_list[11]], color_val[color_type_list[12]], color_val[color_type_list[13]], color_val[color_type_list[14]], color_val[color_type_list[15]], color_val[color_type_list[16]], color_val[color_type_list[17]], color_val[color_type_list[18]], color_val[color_type_list[19]], color_val[color_type_list[20]], color_val[color_type_list[21]], color_val[color_type_list[22]], color_val[color_type_list[23]], color_val[color_type_list[24]], color_val[color_type_list[25]], color_val[color_type_list[26]], color_val[color_type_list[27]], color_val[color_type_list[28]], color_val[color_type_list[29]], color_val[color_type_list[30]], color_val[color_type_list[31]], color_val[color_type_list[32]], color_val[color_type_list[33]], color_val[color_type_list[34]], color_val[color_type_list[35]], color_val[color_type_list[36]], color_val[color_type_list[37]], color_val[color_type_list[38]], color_val[color_type_list[39]], color_val[color_type_list[40]], color_val[color_type_list[41]], color_val[color_type_list[42]], color_val[color_type_list[43]], color_val[color_type_list[44]], color_val[color_type_list[45]], color_val[color_type_list[46]], color_val[color_type_list[47]], color_val[color_type_list[48]], color_val[color_type_list[49]], color_val[color_type_list[50]], color_val[color_type_list[51]], color_val[color_type_list[52]], color_val[color_type_list[53]], color_val[color_type_list[54]], color_val[color_type_list[55]], color_val[color_type_list[56]], color_val[color_type_list[57]], color_val[color_type_list[58]], color_val[color_type_list[59]], color_val[color_type_list[60]], color_val[color_type_list[61]], color_val[color_type_list[62]], color_val[color_type_list[63]], color_val[color_type_list[64]], color_val[color_type_list[65]], color_val[color_type_list[66]], color_val[color_type_list[67]], color_val[color_type_list[68]], color_val[color_type_list[69]], color_val[color_type_list[70]], color_val[color_type_list[71]], color_val[color_type_list[72]], color_val[color_type_list[73]], color_val[color_type_list[74]], color_val[color_type_list[75]]); #endif } static void syntax_template_apply(text_setting_data *tsd) { Evas_Object *layout = tsd->layout; if (!layout) return; Evas_Object *entry = elm_object_part_content_get(layout, "elm.swallow.text_setting"); syntax_template_set(tsd->syntax_template_str, tsd->syntax_template_format, tsd->font_scale); elm_entry_entry_set(entry, tsd->syntax_template_str); } static void text_setting_syntax_color_load(void) { const char *color; Enventor_Syntax_Color_Type color_type = ENVENTOR_SYNTAX_COLOR_STRING; for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++) { color = config_syntax_color_get(color_type); if (color) strncpy(color_val[color_type], color, 6); else strncpy(color_val[color_type], "FFFFFF", 6); } } static void text_setting_syntax_color_reset(text_setting_data *tsd) { text_setting_syntax_color_load(); syntax_template_apply(tsd); } static void text_setting_syntax_color_save(void) { Enventor_Syntax_Color_Type color_type = ENVENTOR_SYNTAX_COLOR_STRING; for (; color_type < ENVENTOR_SYNTAX_COLOR_LAST; color_type++) { config_syntax_color_set(color_type, color_val[color_type]); } } static void text_setting_syntax_color_update(Evas_Object *ctxpopup, color_keyword *selected_color_keyword) { Evas_Object *box = elm_object_content_get(ctxpopup); Evas_Object *layout; Evas_Object *slider; Eina_List *box_children = elm_box_children_get(box); Eina_List *l; char color[SYNTAX_COLOR_LEN] = {0}; char buf[3]; if (eina_list_count(box_children) == 0) return; //Extract color value from sliders EINA_LIST_FOREACH(box_children, l, layout) { slider = elm_object_part_content_get(layout, "elm.swallow.slider"); snprintf(buf, sizeof(buf), "%02X", (int) roundf(elm_slider_value_get(slider))); strncat(color, buf, strlen(buf)); } color[SYNTAX_COLOR_LEN - 1] = '\0'; //Set the extracted color value to the selected color keyword strncpy(color_val[selected_color_keyword->color_type], color, 7); } static void color_ctxpopup_dismiss_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { evas_object_del(obj); } static void color_ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; color_keyword *selected_color_keyword; selected_color_keyword = evas_object_data_get(obj, "color_keyword"); elm_object_disabled_set(tsd->layout, EINA_FALSE); elm_object_focus_set(tsd->slider_font, EINA_TRUE); text_setting_syntax_color_update(obj, selected_color_keyword); syntax_template_apply(tsd); elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_SHOW); tsd->color_ctxpopup = NULL; } static void color_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; Evas_Object *ctxpopup = evas_object_data_get(obj, "ctxpopup"); color_keyword *selected_color_keyword; selected_color_keyword = evas_object_data_get(ctxpopup, "color_keyword"); text_setting_syntax_color_update(ctxpopup, selected_color_keyword); syntax_template_apply(tsd); } static Evas_Object * color_slider_layout_create(text_setting_data *tsd, Evas_Object *parent, Evas_Object *ctxpopup, const char *type, double slider_val) { //Layout Evas_Object *layout = elm_layout_add(parent); elm_layout_file_set(layout, EDJE_PATH, "slider_layout"); evas_object_show(layout); //Type if (type) elm_object_part_text_set(layout, "elm.text.type", type); //Slider Evas_Object *slider = elm_slider_add(layout); evas_object_data_set(slider, "ctxpopup", ctxpopup); elm_slider_span_size_set(slider, 120); elm_slider_indicator_show_set(slider, EINA_FALSE); elm_slider_min_max_set(slider, 0, 255); elm_slider_value_set(slider, slider_val); char slider_min[16]; char slider_max[16]; snprintf(slider_min, sizeof(slider_min), "%1.0f", 0.0); snprintf(slider_max, sizeof(slider_max), "%1.0f", 255.0); elm_object_part_text_set(layout, "elm.text.slider_min", slider_min); elm_object_part_text_set(layout, "elm.text.slider_max", slider_max); elm_object_part_content_set(layout, "elm.swallow.slider", slider); evas_object_smart_callback_add(slider, "changed", color_slider_changed_cb, tsd); return layout; } static int convert_hexadecimal_to_decimal(char *hexadecimal) { int i; int len; int decimal = 0; char digit; if (!hexadecimal) return 0; len = strlen(hexadecimal); if (len == 0) return 0; for (i = 0; i < len; i++) { digit = hexadecimal[i]; if ((digit >= 'a') && (digit <= 'f')) decimal += ((digit - 'a') + 10) * pow(16, (len - i - 1)); else if ((digit >= 'A') && (digit <= 'F')) decimal += ((digit - 'A') + 10) * pow(16, (len - i - 1)); else if ((digit >= '0') && (digit <= '9')) decimal += atoi(&digit) * pow(16, (len - i - 1)); } return decimal; } static void color_slider_layout_set(text_setting_data *tsd, Evas_Object *ctxpopup) { Eina_Array *type_array; Eina_Stringshare *type = NULL; Eina_Array_Iterator itr; unsigned int i; const char *color; char color_rgb_str[3][3] = {{0}}; int color_rgb_val[3] = {0}; color_keyword *selected_color_keyword; selected_color_keyword = evas_object_data_get(ctxpopup, "color_keyword"); //Box Evas_Object *box = elm_box_add(ctxpopup); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(box); //Layout Evas_Object *layout; type_array = eina_array_new(3); eina_array_push(type_array, eina_stringshare_add("R")); eina_array_push(type_array, eina_stringshare_add("G")); eina_array_push(type_array, eina_stringshare_add("B")); color = config_syntax_color_get(selected_color_keyword->color_type); for (i = 0; i < 3; i++) { strncpy(color_rgb_str[i], &color[i * 2], 2); color_rgb_val[i] = convert_hexadecimal_to_decimal(color_rgb_str[i]); } EINA_ARRAY_ITER_NEXT(type_array, i, type, itr) { layout = color_slider_layout_create(tsd, box, ctxpopup, type, color_rgb_val[i]); if (i % 2) elm_object_signal_emit(layout, "odd,item,set", ""); elm_box_pack_end(box, layout); } while (eina_array_count(type_array)) eina_stringshare_del(eina_array_pop(type_array)); eina_array_free(type_array); elm_object_content_set(ctxpopup, box); } static Evas_Object * color_ctxpopup_create(text_setting_data *tsd, color_keyword *selected_color_keyword) { Evas_Object *ctxpopup = elm_ctxpopup_add(tsd->layout); if (!ctxpopup) return NULL; elm_config_focus_autoscroll_mode_set(ELM_FOCUS_AUTOSCROLL_MODE_NONE); elm_object_style_set(ctxpopup, ENVENTOR_NAME); evas_object_data_set(ctxpopup, "color_keyword", selected_color_keyword); elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_RIGHT, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_DOWN); color_slider_layout_set(tsd, ctxpopup); evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, color_ctxpopup_del_cb, tsd); evas_object_smart_callback_add(ctxpopup, "dismissed", color_ctxpopup_dismiss_cb, NULL); return ctxpopup; } static color_keyword * color_keyword_list_create(char *syntax_template_str) { char *cur = syntax_template_str; char *next = NULL; int i; color_keyword *color_keyword_list = calloc(COLOR_KEYWORD_MAX_CNT, sizeof(color_keyword)); if (!color_keyword_list) { mem_fail_msg(); return NULL; } for (i = 0; i < COLOR_KEYWORD_MAX_CNT; i++) { next = strstr(cur, "pos_begin = cur - syntax_template_str; next = strstr(cur, ""); cur = next - 1; //Move position to last character of keyword (color_keyword_list + i)->pos_end = cur - syntax_template_str; (color_keyword_list + i)->color_type = color_type_list[i]; } return color_keyword_list; } static char * syntax_template_format_create(text_setting_data *tsd) { text_setting_syntax_color_load(); char file_path[PATH_MAX]; snprintf(file_path, sizeof(file_path), "%s/color/syntax_template.dat", elm_app_data_dir_get()); Eina_File *file = NULL; file = eina_file_open(file_path, EINA_FALSE); if (!file) { EINA_LOG_ERR(_("Failed to open file \"%s\""), file_path); return NULL; } char *utf8 = eina_file_map_all(file, EINA_FILE_POPULATE); if (!utf8) goto err; char *syntax_template_format = calloc(1, sizeof(char) * (strlen(utf8) + 1)); if (!syntax_template_format) goto err; strncpy(syntax_template_format, utf8, strlen(utf8) + 1); tsd->syntax_template_format = syntax_template_format; eina_file_close(file); return tsd->syntax_template_format; err: mem_fail_msg(); if (utf8) free(utf8); eina_file_close(file); return NULL; } static char * syntax_template_create(text_setting_data *tsd) { char *syntax_template_str = NULL; char *syntax_template_format = syntax_template_format_create(tsd); if (!syntax_template_format) goto err; syntax_template_str = calloc(1, sizeof(char) * SYNTAX_TEMPLATE_MAX_LEN); if (!syntax_template_str) goto err; syntax_template_set(syntax_template_str, syntax_template_format, tsd->font_scale); color_keyword *color_keyword_list; color_keyword_list = color_keyword_list_create(syntax_template_str); if (!color_keyword_list) goto err; tsd->syntax_template_str = syntax_template_str; tsd->color_keyword_list = color_keyword_list; return tsd->syntax_template_str; err: mem_fail_msg(); if (syntax_template_format) { free(syntax_template_format); tsd->syntax_template_format = NULL; } if (syntax_template_str) free(syntax_template_str); return NULL; } static int color_keyword_pos_get(const char *syntax_template_str, const char *selected_str) { Eina_Bool left_arrow_found = EINA_FALSE; char *cur; int i; int len = 0; int pos = 0; cur = strstr(syntax_template_str, selected_str); len = strlen(cur); for (i = 0; i < len; i++) { if (left_arrow_found) { if (*(cur + i) == '>') left_arrow_found = EINA_FALSE; continue; } if (*(cur + i) == '<') { left_arrow_found = EINA_TRUE; } else { pos = (cur + i) - syntax_template_str; break; } } return pos; } static void text_setting_double_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; color_keyword *selected_color_keyword; Evas_Object *ctxpopup; const char *syntax_template_str; const char *selected_str; int i; int pos; int x, y; syntax_template_str = elm_entry_entry_get(obj); if (!syntax_template_str) return; selected_str = elm_entry_selection_get(obj); if (!selected_str) return; pos = color_keyword_pos_get(syntax_template_str, selected_str); for (i = 0; i < COLOR_KEYWORD_MAX_CNT; i++) { selected_color_keyword = tsd->color_keyword_list + i; if ((pos >= selected_color_keyword->pos_begin) && (pos <= selected_color_keyword->pos_end)) { ctxpopup = color_ctxpopup_create(tsd, selected_color_keyword); if (!ctxpopup) return; evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y); evas_object_move(ctxpopup, x, y); evas_object_show(ctxpopup); tsd->color_ctxpopup = ctxpopup; break; } } } static Evas_Object * label_create(Evas_Object *parent, const char *text) { Evas_Object *label = elm_label_add(parent); elm_object_text_set(label, text); evas_object_show(label); return label; } static Evas_Object * list_create(Evas_Object *parent) { Evas_Object *list = elm_list_add(parent); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(list); return list; } static void font_scale_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; double val = elm_slider_value_get(obj); tsd->font_scale = val; syntax_template_apply(tsd); elm_spinner_value_set(tsd->spinner_font, val); } static void font_scale_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; double val = elm_spinner_value_get(obj); tsd->font_scale = val; syntax_template_apply(tsd); elm_slider_value_set(tsd->slider_font, val); } static void text_setting_font_apply(text_setting_data *tsd) { char text_class_name[32]; snprintf(text_class_name, sizeof(text_class_name), "%s_setting_entry", "enventor"); char *font = NULL; if (tsd->font_name) font = elm_font_fontconfig_name_get(tsd->font_name, tsd->font_style); edje_text_class_set(text_class_name, font, -100); elm_font_fontconfig_name_free(font); elm_entry_calc_force(tsd->text_edit_entry); } static int font_cmp_cb(const void *data1, const void *data2) { if (!data1) return 1; if (!data2) return -1; return strcmp(data1, data2); } static void font_style_selected_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; Elm_Object_Item *font_style_it = elm_list_selected_item_get(obj); const char *font_style = elm_object_item_text_get(font_style_it); eina_stringshare_replace(&tsd->font_style, font_style); text_setting_font_apply(tsd); } static void font_name_selected_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { text_setting_data *tsd = data; Elm_Object_Item *font_name_it = elm_list_selected_item_get(obj); Elm_Object_Item *font_style_it = NULL; const char *sel_font_name = elm_object_item_text_get(font_name_it); const char *font_name = NULL; const char *font_style = NULL; config_font_get(&font_name, &font_style); //Initialize font style elm_list_clear(tsd->list_font_style); eina_stringshare_del(tsd->font_style); tsd->font_style = NULL; //Append Items of Font Style List Elm_Font_Properties *efp; Eina_List *font_list; Eina_List *l, *ll; char *font, *style; font_list = evas_font_available_list(evas_object_evas_get(obj)); font_list = eina_list_sort(font_list, eina_list_count(font_list), font_cmp_cb); EINA_LIST_FOREACH(font_list, l, font) { efp = elm_font_properties_get(font); if (efp) { if (!strcmp(sel_font_name, efp->name)) { EINA_LIST_FOREACH(efp->styles, ll, style) { Elm_Object_Item *it = elm_list_item_append(tsd->list_font_style, style, NULL, NULL, font_style_selected_cb, tsd); if (font_name && !strcmp(font_name, efp->name) && font_style && !strcmp(font_style, style)) font_style_it = it; } } elm_font_properties_free(efp); } } elm_list_go(tsd->list_font_style); if (font_style_it) elm_list_item_selected_set(font_style_it, EINA_TRUE); eina_stringshare_replace(&tsd->font_name, sel_font_name); text_setting_font_apply(tsd); } static Eina_Bool is_supported_font(const char *font_name) { if (!font_name) return EINA_FALSE; int i; for (i = 0; i < UNSUPPORTED_FONT_CNT; i++) { if (!strcmp(font_name, unsupported_font_list[i])) return EINA_FALSE; } return EINA_TRUE; } static void text_setting_font_set(text_setting_data *tsd, const char *font_name, const char *font_style) { eina_stringshare_replace(&tsd->font_name, font_name); eina_stringshare_replace(&tsd->font_style, font_style); if (!tsd->list_font_name) return; //Reset font name if (font_name) { const Eina_List *it_list = elm_list_items_get(tsd->list_font_name); const Eina_List *l; Elm_Object_Item *it; EINA_LIST_FOREACH(it_list, l, it) { const char *name = elm_object_item_text_get(it); if (!strcmp(font_name, name)) { elm_list_item_selected_set(it, EINA_TRUE); break; } } } //Reset font style if (font_style) { const Eina_List *it_list = elm_list_items_get(tsd->list_font_style); const Eina_List *l; Elm_Object_Item *it; EINA_LIST_FOREACH(it_list, l, it) { const char *name = elm_object_item_text_get(it); if (!strcmp(font_style, name)) { elm_list_item_selected_set(it, EINA_TRUE); break; } } } } /*****************************************************************************/ /* Externally accessible calls */ /*****************************************************************************/ Evas_Object * text_setting_content_get(text_setting_data *tsd, Evas_Object *parent) { if (!tsd) return NULL; if (tsd->layout) return tsd->layout; //Layout Evas_Object *layout = elm_layout_add(parent); elm_layout_file_set(layout, EDJE_PATH, "text_setting_layout"); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(layout); //Text Editor Evas_Object *entry = elm_entry_add(layout); char style_name[128]; snprintf(style_name, sizeof(style_name), "%s_setting", "enventor"); elm_object_style_set(entry, style_name); elm_entry_context_menu_disabled_set(entry, EINA_TRUE); elm_entry_line_wrap_set(entry, ELM_WRAP_NONE); elm_entry_scrollable_set(entry, EINA_TRUE); elm_entry_editable_set(entry, EINA_FALSE); evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_layout_text_set(layout, "text_setting_guide", _("Double click a keyword to change its color :")); //Font Scale Information tsd->font_scale = (double) config_font_scale_get(); char *syntax_template_str = syntax_template_create(tsd); elm_entry_entry_set(entry, syntax_template_str); evas_object_smart_callback_add(entry, "clicked,double", text_setting_double_clicked_cb, tsd); elm_object_focus_set(entry, EINA_TRUE); elm_object_part_content_set(layout, "elm.swallow.text_setting", entry); //Box Evas_Object *box = elm_box_add(layout); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); evas_object_show(box); elm_object_part_content_set(layout, "elm.swallow.font_size", box); //Font Size (Box) Evas_Object *box2 = elm_box_add(box); elm_box_horizontal_set(box2, EINA_TRUE); evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0); evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, 0); evas_object_show(box2); elm_box_pack_end(box, box2); //Font Size (Slider) Evas_Object *slider_font = elm_slider_add(box2); evas_object_size_hint_weight_set(slider_font, 0, 0); evas_object_size_hint_align_set(slider_font, EVAS_HINT_FILL, 0.5); elm_slider_span_size_set(slider_font, 450); elm_slider_indicator_show_set(slider_font, EINA_FALSE); elm_slider_min_max_set(slider_font, MIN_FONT_SCALE, MAX_FONT_SCALE); elm_slider_value_set(slider_font, tsd->font_scale); double step = 0.01 / (double) (MAX_FONT_SCALE - MIN_FONT_SCALE); elm_slider_step_set(slider_font, step); evas_object_smart_callback_add(slider_font, "changed", font_scale_slider_changed_cb, tsd); evas_object_show(slider_font); elm_object_focus_set(slider_font, EINA_TRUE); elm_box_pack_end(box2, slider_font); Evas_Object *padding = elm_box_add(box2); evas_object_size_hint_min_set(padding, 5, 20); elm_box_pack_end(box2, padding); // Spinner font Evas_Object *spinner_box = elm_box_add(box2); evas_object_size_hint_weight_set(spinner_box, EVAS_HINT_EXPAND, 0.5); evas_object_size_hint_align_set(spinner_box, EVAS_HINT_FILL, 0.5); evas_object_show(spinner_box); elm_box_pack_end(box2, spinner_box); Evas_Object *spinner_font = elm_spinner_add(spinner_box); elm_spinner_label_format_set(spinner_font, "%1.2fx"); elm_spinner_step_set(spinner_font, 0.01); elm_spinner_wrap_set(spinner_font, EINA_TRUE); elm_spinner_editable_set(spinner_font, EINA_TRUE); elm_spinner_min_max_set(spinner_font, MIN_FONT_SCALE, MAX_FONT_SCALE); evas_object_size_hint_align_set(spinner_font, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_spinner_value_set(spinner_font, tsd->font_scale); evas_object_size_hint_min_set(spinner_font, 50, 15); elm_box_pack_end(spinner_box, spinner_font); evas_object_show(spinner_font); evas_object_smart_callback_add(spinner_font, "changed", font_scale_spinner_changed_cb, tsd); //Font Name and Style (Box) box = elm_box_add(layout); elm_box_padding_set(box, 0, ELM_SCALE_SIZE(5)); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_part_content_set(layout, "elm.swallow.font", box); //Font Name (Box) box2 = elm_box_add(box); evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(box2); elm_box_pack_end(box, box2); //Font Name (Label) /* This layout is intended to put the label aligned to left side far from 3 pixels. */ Evas_Object *layout_padding3 = elm_layout_add(box2); elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout"); evas_object_size_hint_align_set(layout_padding3, 0.0, EVAS_HINT_FILL); evas_object_show(layout_padding3); elm_box_pack_end(box2, layout_padding3); Evas_Object *label_font_name = label_create(layout_padding3, _("Font Name")); elm_object_part_content_set(layout_padding3, "elm.swallow.content", label_font_name); //Font Name (List) Evas_Object *list_font_name = list_create(box2); elm_box_pack_end(box2, list_font_name); //Font Style (Box) box2 = elm_box_add(box); evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.6); evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(box2); elm_box_pack_end(box, box2); //Font Style (Label) /* This layout is intended to put the label aligned to left side far from 3 pixels. */ layout_padding3 = elm_layout_add(box2); elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout"); evas_object_size_hint_align_set(layout_padding3, 0.0, EVAS_HINT_FILL); evas_object_show(layout_padding3); elm_box_pack_end(box2, layout_padding3); Evas_Object *label_font_style = label_create(layout_padding3, _("Font Style")); elm_object_part_content_set(layout_padding3, "elm.swallow.content", label_font_style); //Font Style (List) tsd->list_font_style = list_create(box2); elm_box_pack_end(box2, tsd->list_font_style); //Font Name and Style Information const char *font_name; const char *font_style; config_font_get(&font_name, &font_style); eina_stringshare_replace(&tsd->font_name, font_name); eina_stringshare_replace(&tsd->font_style, font_style); //Append Items of Font Name List Elm_Font_Properties *efp; Eina_List *font_list; Eina_List *l; Elm_Object_Item *font_name_it = NULL; char *font; char prev_font[128] = {0}; font_list = evas_font_available_list(evas_object_evas_get(parent)); font_list = eina_list_sort(font_list, eina_list_count(font_list), font_cmp_cb); EINA_LIST_FOREACH(font_list, l, font) { efp = elm_font_properties_get(font); if (efp) { if (strcmp(prev_font, efp->name) && is_supported_font(efp->name)) { Elm_Object_Item *it = elm_list_item_append(list_font_name, efp->name, NULL, NULL, font_name_selected_cb, tsd); if (font_name && !strcmp(font_name, efp->name)) font_name_it = it; snprintf(prev_font, sizeof(prev_font), "%s", efp->name); } elm_font_properties_free(efp); } } elm_list_go(list_font_name); if (font_name_it) { elm_list_item_selected_set(font_name_it, EINA_TRUE); elm_list_item_show(font_name_it); } tsd->layout = layout; tsd->text_edit_entry = entry; tsd->slider_font = slider_font; tsd->list_font_name = list_font_name; tsd->spinner_font = spinner_font; return layout; } void text_setting_focus_set(text_setting_data *tsd) { EINA_SAFETY_ON_NULL_RETURN(tsd); elm_object_focus_set(tsd->slider_font, EINA_TRUE); } void text_setting_config_set(text_setting_data *tsd) { if (!tsd) return; config_font_set(tsd->font_name, tsd->font_style); config_font_scale_set((float) elm_slider_value_get(tsd->slider_font)); text_setting_syntax_color_save(); } void text_setting_reset(text_setting_data *tsd) { if (!tsd) return; //font scale tsd->font_scale = (double) config_font_scale_get(); elm_slider_value_set(tsd->slider_font, tsd->font_scale); elm_spinner_value_set(tsd->spinner_font, tsd->font_scale); //font reset const char *font_name, *font_style; config_font_get(&font_name, &font_style); text_setting_font_set(tsd, font_name, font_style); text_setting_syntax_color_reset(tsd); } text_setting_data * text_setting_init(void) { text_setting_data *tsd = calloc(1, sizeof(text_setting_data)); if (!tsd) { mem_fail_msg(); return NULL; } return tsd; } void text_setting_term(text_setting_data *tsd) { if (!tsd) return; evas_object_del(tsd->color_ctxpopup); free(tsd->color_keyword_list); free(tsd->syntax_template_format); free(tsd->syntax_template_str); eina_stringshare_del(tsd->font_name); eina_stringshare_del(tsd->font_style); evas_object_del(tsd->layout); free(tsd); }