jaehyun pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=220e1fe10c7da4e09444431cca5fafdadf081459

commit 220e1fe10c7da4e09444431cca5fafdadf081459
Author: Jaehyun Cho <jae_hyun....@samsung.com>
Date:   Thu Feb 26 20:36:51 2015 +0900

    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, "<font=");
+   if (!start_tag) return src;
+
+   //Remove <font=> 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 </font> tag
+   start_tag = strstr(base, "</font>");
+   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, "<font=");
+
+        eina_strbuf_append(strbuf, "</font>");
+     }
+
+   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;
 
@@ -1143,6 +1249,21 @@ edit_font_scale_get(edit_data *ed)
 }
 
 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)
 {
    part_highlight = !!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), "<br/>%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)
 {

-- 


Reply via email to