From 220e1fe10c7da4e09444431cca5fafdadf081459 Mon Sep 17 00:00:00 2001 From: Jaehyun Cho Date: Thu, 26 Feb 2015 20:36:51 +0900 Subject: [PATCH] edc_editor: Add enventor_object_font_set()/get() APIs. --- src/lib/edc_editor.c | 138 ++++++++++++++++++++++++++++++++++++- src/lib/enventor_object.eo | 22 ++++++ src/lib/enventor_private.h | 2 + src/lib/enventor_smart.c | 14 ++++ 4 files changed, 174 insertions(+), 2 deletions(-) diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c index 0896f0f..7afe779 100644 --- a/src/lib/edc_editor.c +++ b/src/lib/edc_editor.c @@ -47,6 +47,10 @@ struct editor_s void *view_sync_cb_data; int select_pos; double font_scale; + const char *font_name; + const char *font_style; + + Eina_Strbuf *cachebuf; Eina_Bool edit_changed : 1; Eina_Bool linenumber : 1; @@ -64,6 +68,12 @@ struct editor_s static Eina_Bool image_preview_show(edit_data *ed, char *cur, Evas_Coord x, Evas_Coord y); +static const char * +font_cancel(edit_data *ed, const char *src); +static const char * +font_apply(edit_data *ed, const char *src); +static void +edit_font_apply(edit_data *ed); static void line_init(edit_data *ed) @@ -72,7 +82,7 @@ line_init(edit_data *ed) ed->line_max = 1; snprintf(buf, sizeof(buf), "%d", ed->line_max); - elm_entry_entry_set(ed->en_line, buf); + elm_entry_entry_set(ed->en_line, font_apply(ed, buf)); } static void @@ -118,6 +128,91 @@ entry_recover(edit_data *ed, int cursor_pos) free(utf8); } +static const char * +font_cancel(edit_data *ed, const char *src) +{ + if (!src) return NULL; + + Eina_Strbuf *strbuf = ed->cachebuf; + eina_strbuf_reset(strbuf); + eina_strbuf_append(strbuf, src); + + const char *base = eina_strbuf_string_get(strbuf); + char *start_tag = NULL; + char *end_tag = NULL; + size_t start_index; + size_t end_index; + + start_tag = strstr(base, " tag + end_tag = strstr(start_tag, ">"); + start_index = start_tag - base; + end_index = (end_tag + 1) - base; + eina_strbuf_remove(strbuf, start_index, end_index); + + //Remove tag + start_tag = strstr(base, ""); + end_tag = strstr(start_tag, ">"); + start_index = start_tag - base; + end_index = (end_tag + 1) - base; + eina_strbuf_remove(strbuf, start_index, end_index); + + return eina_strbuf_string_get(strbuf); +} + +static const char * +font_apply(edit_data *ed, const char *src) +{ + if (!src) return NULL; + + char *buf = strdup(src); + Eina_Strbuf *strbuf = ed->cachebuf; + eina_strbuf_reset(strbuf); + eina_strbuf_append(strbuf, buf); + free(buf); + + if (ed->font_name) + { + eina_strbuf_prepend(strbuf, ">"); + if (ed->font_style) + { + eina_strbuf_prepend(strbuf, ed->font_style); + eina_strbuf_prepend(strbuf, ":style="); + } + eina_strbuf_prepend(strbuf, ed->font_name); + eina_strbuf_prepend(strbuf, ""); + } + + return eina_strbuf_string_get(strbuf); +} + +static void +edit_font_apply(edit_data *ed) +{ + const char *markup_edit = elm_entry_entry_get(ed->en_edit); + const char *markup_line = elm_entry_entry_get(ed->en_line); + const char *translated_edit; + const char *translated_line; + int pos; + + //Apply font tag to Edit entry. + pos = elm_entry_cursor_pos_get(ed->en_edit); + translated_edit = font_cancel(ed, markup_edit); + translated_edit = font_apply(ed, translated_edit); + elm_entry_entry_set(ed->en_edit, translated_edit); + entry_recover(ed, pos); + + //Apply font tag to Line entry. + translated_line = font_cancel(ed, markup_line); + translated_line = font_apply(ed, translated_line); + elm_entry_entry_set(ed->en_line, translated_line); + elm_entry_calc_force(ed->en_line); +} + static void syntax_color_apply(edit_data *ed, Eina_Bool partial) { @@ -140,6 +235,8 @@ syntax_color_apply(edit_data *ed, Eina_Bool partial) strlen(utf8), from, to); if (!translated) return; + translated = font_apply(ed, translated); + /* I'm not sure this will be problem. But it can avoid entry_object_text_escaped_set() in Edje. Logically that's unnecessary in this case. */ @@ -180,6 +277,9 @@ syntax_color_thread_cb(void *data, Ecore_Thread *thread EINA_UNUSED) if (!utf8) return; td->translated = color_apply(syntax_color_data_get(td->ed->sh), utf8, strlen(utf8), NULL, NULL); + + td->translated = font_apply(td->ed, td->translated); + elm_entry_calc_force(td->ed->en_edit); } static void @@ -766,7 +866,7 @@ edit_edc_load(edit_data *ed, const char *file_path) markup_line = elm_entry_utf8_to_markup(eina_strbuf_string_get(strbuf_line)); if (!markup_line) goto err; - elm_entry_entry_append(ed->en_line, markup_line); + elm_entry_entry_append(ed->en_line, font_apply(ed, markup_line)); free(markup_line); markup_edit = elm_entry_utf8_to_markup(utf8_edit); @@ -1068,6 +1168,8 @@ edit_init(Evas_Object *enventor) ed->select_pos = -1; ed->font_scale = 1; + ed->cachebuf = eina_strbuf_new(); + ed->rd = redoundo_init(en_edit); evas_object_data_set(ed->en_edit, "redoundo", ed->rd); @@ -1085,6 +1187,10 @@ edit_term(edit_data *ed) { if (!ed) return; + if (ed->font_name) eina_stringshare_del(ed->font_name); + if (ed->font_style) eina_stringshare_del(ed->font_style); + eina_strbuf_free(ed->cachebuf); + syntax_helper *sh = ed->sh; parser_data *pd = ed->pd; @@ -1142,6 +1248,21 @@ edit_font_scale_get(edit_data *ed) return ed->font_scale; } +void +edit_font_set(edit_data *ed, const char *font_name, const char *font_style) +{ + eina_stringshare_replace(&ed->font_name, font_name); + eina_stringshare_replace(&ed->font_style, font_style); + edit_font_apply(ed); +} + +void +edit_font_get(edit_data *ed, const char **font_name, const char **font_style) +{ + if (font_name) *font_name = ed->font_name; + if (font_style) *font_style = ed->font_style; +} + void edit_part_highlight_set(edit_data *ed, Eina_Bool part_highlight) { @@ -1222,15 +1343,28 @@ edit_entry_get(edit_data *ed) void edit_line_increase(edit_data *ed, int cnt) { + const char *text; + const char *translated; char buf[MAX_LINE_DIGIT_CNT]; int i; + //Remove font tag + text = elm_entry_entry_get(ed->en_line); + translated = font_cancel(ed, text); + elm_entry_entry_set(ed->en_line, translated); + for (i = 0; i < cnt; i++) { ed->line_max++; snprintf(buf, sizeof(buf), "
%d", ed->line_max); elm_entry_entry_append(ed->en_line, buf); } + + //Restore font tag + text = elm_entry_entry_get(ed->en_line); + translated = font_apply(ed, text); + elm_entry_entry_set(ed->en_line, translated); + elm_entry_calc_force(ed->en_line); Enventor_Max_Line max_line; diff --git a/src/lib/enventor_object.eo b/src/lib/enventor_object.eo index 0f0e66c..d43a1c8 100644 --- a/src/lib/enventor_object.eo +++ b/src/lib/enventor_object.eo @@ -481,6 +481,28 @@ class Enventor.Object (Elm_Widget, Efl.File) { @ingroup Enventor */ return: Eina_Bool; } + font_set { + /*@ + @brief + @warning + @see + @ingroup Enventor */ + params { + @in const(char) *font_name; /*@ ... */ + @in const(char) *font_style; /*@ ... */ + } + } + font_get { + /*@ + @brief + @warning + @see + @ingroup Enventor */ + params { + @in const(char) **font_name; /*@ ... */ + @in const(char) **font_style; /*@ ... */ + } + } } implements { class.constructor; diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h index ef50ad4..f78fdbf 100644 --- a/src/lib/enventor_private.h +++ b/src/lib/enventor_private.h @@ -210,6 +210,8 @@ void edit_view_sync_cb_set(edit_data *ed, void (*cb)(void *data, Eina_Stringshar void edit_view_sync(edit_data *ed); void edit_font_scale_set(edit_data *ed, double font_scale); double edit_font_scale_get(edit_data *ed); +void edit_font_set(edit_data *ed, const char *font_name, const char *font_style); +void edit_font_get(edit_data *ed, const char **font_name, const char **font_style); void edit_part_highlight_toggle(edit_data *ed, Eina_Bool msg); void edit_line_delete(edit_data *ed); Eina_Stringshare *edit_cur_prog_name_get(edit_data *ed); diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c index 2785f63..277d6c1 100644 --- a/src/lib/enventor_smart.c +++ b/src/lib/enventor_smart.c @@ -470,6 +470,20 @@ _enventor_object_font_scale_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd) return edit_font_scale_get(pd->ed); } +EOLIAN static void +_enventor_object_font_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd, + const char *font_name, const char *font_style) +{ + edit_font_set(pd->ed, font_name, font_style); +} + +EOLIAN static void +_enventor_object_font_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd, + const char **font_name, const char **font_style) +{ + edit_font_get(pd->ed, font_name, font_style); +} + EOLIAN static int _enventor_object_max_line_get(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd) {