hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=67cf449fdde6c98ccfc3c760f68a1257d0f72c93

commit 67cf449fdde6c98ccfc3c760f68a1257d0f72c93
Author: ChunEon Park <[email protected]>
Date:   Tue May 27 13:52:15 2014 +0900

    syntax_color: improve syntax color.
    
    apply syntax_color on whole texts if the scroll vbar is pressed.
    so as if it's not on the partial text updating.
    
    one more thing to do is,
    applying multi-thread in this case to not block the user interaction.
---
 src/bin/edc_editor.c   | 64 ++++++++++++++++++++++++++++++++++++++++----------
 src/bin/syntax_color.c | 31 +++++++++++++++++-------
 2 files changed, 73 insertions(+), 22 deletions(-)

diff --git a/src/bin/edc_editor.c b/src/bin/edc_editor.c
index beb46b2..7c32b65 100644
--- a/src/bin/edc_editor.c
+++ b/src/bin/edc_editor.c
@@ -32,6 +32,7 @@ struct editor_s
    Eina_Bool edit_changed : 1;
    Eina_Bool linenumber : 1;
    Eina_Bool ctrl_pressed : 1;
+   Eina_Bool on_drag : 1;
 };
 
 static Eina_Bool
@@ -104,16 +105,17 @@ current_visible_text_region_get(edit_data *ed, int 
*from_line, int *to_line)
 }
 
 static void
-syntax_color_apply(edit_data *ed)
+syntax_color_apply(edit_data *ed, Eina_Bool region)
 {
    Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
    char *text = (char *) evas_object_textblock_text_markup_get(tb);
    int pos = elm_entry_cursor_pos_get(ed->en_edit);
 
-   int from_line, to_line;
-   current_visible_text_region_get(ed, &from_line, &to_line);
+   int from_line = -1, to_line = -1;
 
-   char *from, *to;
+   if (region) current_visible_text_region_get(ed, &from_line, &to_line);
+
+   char *from = NULL, *to = NULL;
    char *utf8 = (char *) color_cancel(syntax_color_data_get(ed->sh), text,
                                       strlen(text), from_line, to_line, &from,
                                       &to);
@@ -128,8 +130,11 @@ syntax_color_apply(edit_data *ed)
       Logically that's unnecessary in this case. */
    evas_object_textblock_text_markup_set(tb, translated);
    elm_entry_calc_force(ed->en_edit);
+
+   //recorver cursor position??
    elm_entry_cursor_pos_set(ed->en_edit, 0);
    elm_entry_cursor_pos_set(ed->en_edit, pos);
+
    //FIXME: Need to recover selection area.
 }
 
@@ -138,19 +143,28 @@ syntax_color_timer_cb(void *data)
 {
    edit_data *ed = data;
    if (!color_ready(syntax_color_data_get(ed->sh))) return 
ECORE_CALLBACK_RENEW;
-   syntax_color_apply(ed);
+   syntax_color_apply(ed, EINA_TRUE);
    ed->syntax_color_timer = NULL;
    return ECORE_CALLBACK_CANCEL;
 }
 
 static void
-syntax_color_timer_update(edit_data *ed, double time)
+syntax_color_partial_update(edit_data *ed, double time)
 {
+   if (ed->on_drag) return;
    ecore_timer_del(ed->syntax_color_timer);
    ed->syntax_color_timer = ecore_timer_add(time, syntax_color_timer_cb, ed);
 }
 
 static void
+syntax_color_full_update(edit_data *ed)
+{
+   ecore_timer_del(ed->syntax_color_timer);
+   ed->syntax_color_timer = NULL;
+   syntax_color_apply(ed, EINA_FALSE);
+}
+
+static void
 edit_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Entry_Change_Info *info = event_info;
@@ -195,7 +209,7 @@ edit_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, 
void *event_info)
       right after applying syntax color. This workaround makes avoid to not
       applying syntax color while entry has the selected text. */
    if (elm_entry_selection_get(ed->en_edit)) return;
-   syntax_color_timer_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
+   syntax_color_partial_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
 }
 
 static void
@@ -348,7 +362,7 @@ edit_template_insert(edit_data *ed)
 
    elm_entry_cursor_pos_set(ed->en_edit, cursor_pos);
 
-   syntax_color_timer_update(ed, 0);
+   syntax_color_partial_update(ed, 0);
    snprintf(buf, sizeof(buf), "Template code inserted. (%s)", buf2);
    stats_info_msg_update(buf);
 }
@@ -428,7 +442,7 @@ edit_template_part_insert(edit_data *ed, Edje_Part_Type 
type)
 
    elm_entry_cursor_pos_set(ed->en_edit, cursor_pos);
 
-   syntax_color_timer_update(ed, 0);
+   syntax_color_partial_update(ed, 0);
    snprintf(buf, sizeof(buf), "Template code inserted. (%s Part)", part);
    stats_info_msg_update(buf);
 }
@@ -773,10 +787,12 @@ key_up_cb(void *data, int type EINA_UNUSED, void *ev)
 }
 
 static void
-scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
+scroller_scroll_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
 {
    edit_data *ed = data;
-   syntax_color_timer_update(ed, SYNTAX_COLOR_SHORT_TIME);
+   if (ed->on_drag) syntax_color_full_update(ed);
+   else syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
 }
 
 static void
@@ -787,10 +803,28 @@ scroller_resize_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info)
    evas_object_geometry_get(obj, NULL, NULL, NULL, &h);
 
    if (h == ed->scroller_h) return;
-   syntax_color_timer_update(ed, SYNTAX_COLOR_SHORT_TIME);
+   syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
    ed->scroller_h = h;
 }
 
+static void
+scroller_vbar_press_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   ed->on_drag = EINA_TRUE;
+   syntax_color_full_update(ed);
+}
+
+static void
+scroller_vbar_unpress_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   ed->on_drag = EINA_FALSE;
+   syntax_color_partial_update(ed, SYNTAX_COLOR_SHORT_TIME);
+}
+
 edit_data *
 edit_init(Evas_Object *parent)
 {
@@ -813,6 +847,10 @@ edit_init(Evas_Object *parent)
                                   ed);
    evas_object_smart_callback_add(scroller, "scroll,down", scroller_scroll_cb,
                                   ed);
+   evas_object_smart_callback_add(scroller, "vbar,press",
+                                  scroller_vbar_press_cb, ed);
+   evas_object_smart_callback_add(scroller, "vbar,unpress",
+                                  scroller_vbar_unpress_cb, ed);
    evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE,
                                   scroller_resize_cb, ed);
    evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
@@ -1026,7 +1064,7 @@ edit_font_size_update(edit_data *ed, Eina_Bool msg, 
Eina_Bool update)
    snprintf(buf, sizeof(buf), "Font Size: %1.1fx", config_font_size_get());
    stats_info_msg_update(buf);
 
-   if (update) syntax_color_timer_update(ed, 0);
+   if (update) syntax_color_partial_update(ed, 0);
 }
 
 void
diff --git a/src/bin/syntax_color.c b/src/bin/syntax_color.c
index f2b327b..d7c676e 100644
--- a/src/bin/syntax_color.c
+++ b/src/bin/syntax_color.c
@@ -542,8 +542,19 @@ color_cancel(color_data *cd, const char *src, int length, 
int from_pos,
    char *prev = (char *) src;
    char *cur = (char *) src;
    int line = 1;
-   Eina_Bool find_from = EINA_TRUE;
-   Eina_Bool find_to = EINA_TRUE;
+   Eina_Bool find_from, find_to;
+
+   //if the from_pos equals -1, we wanna full text area of syntax color
+   if (from_pos == -1)
+     {
+        find_from = EINA_FALSE;
+        find_to = EINA_FALSE;
+     }
+   else
+     {
+        find_from = EINA_TRUE;
+        find_to = EINA_TRUE;
+     }
 
    while (cur && (cur <= (src + length)))
      {
@@ -591,8 +602,11 @@ color_cancel(color_data *cd, const char *src, int length, 
int from_pos,
    if (find_from) from_pos = 0;
    if (find_to) to_pos = eina_strbuf_length_get(strbuf);
 
-   *from = ((char *) str) + from_pos;
-   *to = ((char *) str) + to_pos;
+   if (from_pos != -1)
+     {
+        *from = ((char *) str) + from_pos;
+        *to = ((char *) str) + to_pos;
+     }
 
    return str;
 }
@@ -685,7 +699,6 @@ color_apply(color_data *cd, const char *src, int length, 
char *from, char *to)
    Eina_Bool inside_comment = EINA_FALSE;
 
    if (!src || (length < 1)) return NULL;
-   if (from == to) return NULL;
 
    Eina_Strbuf *strbuf = cd->cachebuf;
    eina_strbuf_reset(strbuf);
@@ -698,7 +711,7 @@ color_apply(color_data *cd, const char *src, int length, 
char *from, char *to)
    while (cur && (cur <= (src + length)))
      {
         //escape empty string
-        if (cur >= from)
+        if (!from || (cur >= from))
           {
              if (cur[0] == ' ')
                {
@@ -719,7 +732,7 @@ color_apply(color_data *cd, const char *src, int length, 
char *from, char *to)
         else if (ret == -1) goto finished;
 
         //handle comment: //
-        if (cur >= from)
+        if (!from || (cur >= from))
           {
              ret = comment2_apply(strbuf, &src, length, &cur, &prev,
                                   cd->col_comment, &inside_comment);
@@ -746,7 +759,7 @@ color_apply(color_data *cd, const char *src, int length, 
char *from, char *to)
         if (ret == 1) continue;
 
         //apply color markup
-        if (cur >= from)
+        if (!from || (cur >= from))
           {
              ret = color_markup_insert(strbuf, &src, length, &cur, &prev, cd);
              if (ret == 1) continue;
@@ -754,7 +767,7 @@ color_apply(color_data *cd, const char *src, int length, 
char *from, char *to)
           }
 
         cur++;
-        if (cur > to) goto finished;
+        if (to && (cur > to)) goto finished;
      }
 
    //Same with origin source.

-- 


Reply via email to