hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=7919f98111b53a4648d6fa72a60b31bbb300643e

commit 7919f98111b53a4648d6fa72a60b31bbb300643e
Author: ChunEon Park <[email protected]>
Date:   Sat Mar 15 16:23:18 2014 +0900

    editor - fix the group switching bug.
    
    previuosly the group switching would be done only when part highlight is 
enabled.
    
    now, it tries group switching regardless of the part highlight
---
 src/bin/edc_editor.c     |   7 +--
 src/bin/edc_parser.c     | 115 ++++++++++++++++++++++++++++++++++++++++++++---
 src/include/edc_parser.h |   1 +
 3 files changed, 114 insertions(+), 9 deletions(-)

diff --git a/src/bin/edc_editor.c b/src/bin/edc_editor.c
index c651a32..635cd71 100644
--- a/src/bin/edc_editor.c
+++ b/src/bin/edc_editor.c
@@ -599,9 +599,10 @@ cur_name_get_cb(void *data, Eina_Stringshare *part_name,
 void
 edit_view_sync(edit_data *ed)
 {
-   if (!config_part_highlight_get()) return;
-
-   parser_cur_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
+   if (!config_part_highlight_get())
+      parser_cur_group_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
+   else
+      parser_cur_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
 }
 
 static void
diff --git a/src/bin/edc_parser.c b/src/bin/edc_parser.c
index 162e620..941fa43 100644
--- a/src/bin/edc_parser.c
+++ b/src/bin/edc_parser.c
@@ -283,7 +283,82 @@ parser_markup_escape(parser_data *pd EINA_UNUSED, const 
char *str)
 }
 
 static void
-part_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
+group_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
+{
+   const char *quot = QUOT;
+   const char *group = "group";
+   const int quot_len = QUOT_LEN;
+   const int group_len = 5;  //strlen("group");
+
+   cur_name_td *td = data;
+   char *utf8 = td->utf8;
+   int cur_pos = td->cur_pos;
+   char *p = utf8;
+   char *end = utf8 + cur_pos;
+
+   int bracket = 0;
+   const char *group_name = NULL;
+   int group_name_len = 0;
+
+   while (p <= end)
+     {
+        //Skip "" range
+        if (*p == *quot)
+          {
+             p += quot_len;
+             p = strstr(p, quot);
+             if (!p) goto end;
+             p += quot_len;
+          }
+
+        if (*p == '{')
+          {
+             bracket++;
+             p++;
+             continue;
+          }
+
+        //Check whether outside of part or group
+        if ((*p == '}') && (p < end))
+          {
+             bracket--;
+             p++;
+
+             if (bracket == 1) group_name = NULL;
+             continue;
+          }
+        //Check Group in
+        if (!strncmp(p, group, group_len))
+          {
+             p += group_len;
+             char *name_begin = strstr(p, quot);
+             if (!name_begin) goto end;
+             name_begin += quot_len;
+             p = name_begin;
+             char *name_end = strstr(p, quot);
+             if (!name_end) goto end;
+             group_name = name_begin;
+             group_name_len = name_end - name_begin;
+             p = name_end + quot_len;
+             bracket++;
+             continue;
+          }
+        p++;
+     }
+   if (group_name)
+     group_name = eina_stringshare_add_length(group_name, group_name_len);
+
+end:
+   if (utf8)
+     {
+        free(utf8);
+        td->utf8 = NULL;
+     }
+   td->group_name = group_name;
+}
+
+static void
+cur_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
 {
    const char *quot = QUOT;
    const char *part = "part";
@@ -388,7 +463,7 @@ end:
 }
 
 static void
-part_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
+cur_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
 {
    cur_name_td *td = data;
    td->cb(td->cb_data, td->part_name, td->group_name);
@@ -397,7 +472,7 @@ part_name_thread_end(void *data, Ecore_Thread *thread 
EINA_UNUSED)
 }
 
 static void
-part_name_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
+cur_name_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
 {
    cur_name_td *td = data;
    td->pd->thread = NULL;
@@ -493,6 +568,34 @@ parser_paragh_name_get(parser_data *pd EINA_UNUSED, 
Evas_Object *entry)
 }
 
 void
+parser_cur_group_name_get(parser_data *pd, Evas_Object *entry,
+                          void (*cb)(void *data, Eina_Stringshare *part_name,
+                          Eina_Stringshare *group_name), void *data)
+{
+   if (pd->thread) ecore_thread_cancel(pd->thread);
+
+   cur_name_td *td = calloc(1, sizeof(cur_name_td));
+   if (!td) return;
+
+   const char *text = elm_entry_entry_get(entry);
+   if (!text) return;
+
+   char *utf8 = elm_entry_markup_to_utf8(text);
+   if (!utf8) return;
+
+   td->pd = pd;
+   td->utf8 = utf8;
+   td->cur_pos = elm_entry_cursor_pos_get(entry);
+   td->cb = cb;
+   td->cb_data = data;
+
+   pd->thread = ecore_thread_run(group_name_thread_blocking,
+                                 cur_name_thread_end,
+                                 cur_name_thread_cancel,
+                                 td);
+}
+
+void
 parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data,
                     Eina_Stringshare *part_name, Eina_Stringshare *group_name),
                     void *data)
@@ -514,9 +617,9 @@ parser_cur_name_get(parser_data *pd, Evas_Object *entry, 
void (*cb)(void *data,
    td->cb = cb;
    td->cb_data = data;
 
-   pd->thread = ecore_thread_run(part_name_thread_blocking,
-                                 part_name_thread_end,
-                                 part_name_thread_cancel,
+   pd->thread = ecore_thread_run(cur_name_thread_blocking,
+                                 cur_name_thread_end,
+                                 cur_name_thread_cancel,
                                  td);
 }
 
diff --git a/src/include/edc_parser.h b/src/include/edc_parser.h
index 8fd2966..cf43cdb 100644
--- a/src/include/edc_parser.h
+++ b/src/include/edc_parser.h
@@ -8,6 +8,7 @@ parser_data *parser_init();
 void parser_term(parser_data *pd);
 Eina_Stringshare *parser_first_group_name_get(parser_data *pd, Evas_Object 
*entry);
 void parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void 
*data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data);
+void parser_cur_group_name_get(parser_data *pd, Evas_Object *entry, void 
(*cb)(void *data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), 
void *data);
 Eina_Bool parser_type_name_compare(parser_data *pd, const char *str);
 const char *parser_markup_escape(parser_data *pd EINA_UNUSED, const char *str);
 attr_value *parser_attribute_get(parser_data *pd, const char *text, const char 
*cur);

-- 


Reply via email to