hermet pushed a commit to branch master.

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

commit b4af164c8ae930d0f778187f39ba0ca2819171a5
Author: Mykyta Biliavskyi <m.biliavs...@samsung.com>
Date:   Tue Jun 16 16:53:23 2015 +0900

    Autocomplete: show list of the candidates after '.'.
    
    Summary:
       In case, when user typed keyword and add '.' symbol, will be
       shown list of possible keywords.
       For example:
       rel1. -> will be shown list: relative, offset, to, to_x, to_y.
    
       Depends D2648
       @fix  T2178
    
    Reviewers: Hermet, Jaehyun
    
    Subscribers: jpeg
    
    Projects: #enventor
    
    Maniphest Tasks: T2178
    
    Differential Revision: https://phab.enlightenment.org/D2651
---
 src/lib/auto_comp.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 67 insertions(+), 8 deletions(-)

diff --git a/src/lib/auto_comp.c b/src/lib/auto_comp.c
index 2c90043..d7ee4a9 100644
--- a/src/lib/auto_comp.c
+++ b/src/lib/auto_comp.c
@@ -7,6 +7,8 @@
 
 #define QUEUE_SIZE 20
 #define COMPSET_PAIR_MINIMUM 1
+#define MAX_CONTEXT_STACK 20
+#define MAX_KEYWORD_LENGHT 40
 
 typedef struct lexem_s
 {
@@ -41,6 +43,7 @@ typedef struct ctx_lexem_thread_data_s
    int cur_pos;
    lexem *result;
    autocomp_data *ad;
+   Eina_Bool list_show;
 } ctx_lexem_td;
 
 static autocomp_data *g_ad = NULL;
@@ -49,6 +52,9 @@ static autocomp_data *g_ad = NULL;
 /* Internal method implementation                                            */
 /*****************************************************************************/
 static Eet_Data_Descriptor *lex_desc = NULL;
+static void candidate_list_show(autocomp_data *ad);
+static void queue_reset(autocomp_data *ad);
+static void entry_anchor_off(autocomp_data *ad);
 
 static void
 eddc_init(void)
@@ -100,6 +106,7 @@ context_lexem_thread_cb(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    ctx_lexem_td *td = (ctx_lexem_td *)data;
 
    Eina_Bool find_flag = EINA_FALSE;
+   Eina_Bool dot_lex = EINA_FALSE;
    Eina_List *l = NULL;
    Eina_List *nodes = td->ad->lexem_root->nodes;
    td->result = (lexem *)td->ad->lexem_root;
@@ -113,7 +120,7 @@ context_lexem_thread_cb(void *data, Ecore_Thread *thread 
EINA_UNUSED)
 
    char *cur = utf8;
    char *end = cur + cur_pos;
-   char stack[20][40];
+   char stack[MAX_CONTEXT_STACK][MAX_KEYWORD_LENGHT];
    int depth = 0;
    char *help_ptr = NULL;
    char *help_end_ptr = NULL;
@@ -121,6 +128,7 @@ context_lexem_thread_cb(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    const char *quot = QUOT_UTF8;
    const int quot_len = QUOT_UTF8_LEN;
    int quot_cnt = 0;
+   int context_len = 0;
 
    while (cur && cur <= end)
      {
@@ -153,12 +161,49 @@ context_lexem_thread_cb(void *data, Ecore_Thread *thread 
EINA_UNUSED)
              if (help_ptr != utf8)
                help_ptr++;
 
-             memset(stack[depth], 0x0, 40);
+             context_len = help_end_ptr - help_ptr + 1;
+             if (context_len >= MAX_KEYWORD_LENGHT)
+               {
+                  cur++;
+                  continue;
+               }
+
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
              strncpy(stack[depth], help_ptr, help_end_ptr - help_ptr + 1);
              depth++;
           }
+        if (*cur == '.')
+          {
+             Eina_Bool alpha_present = EINA_FALSE;
+             help_end_ptr = cur - 1;
+             for (help_ptr = help_end_ptr; help_ptr && isalnum(*help_ptr); 
help_ptr--)
+                if (isalpha(*help_ptr)) alpha_present = EINA_TRUE;
+             if ((!alpha_present) || (!strncmp(help_ptr, quot, quot_len)))
+               {
+                  cur++;
+                  continue;
+               }
+             if (help_ptr != utf8) help_ptr++;
+             context_len = help_end_ptr - help_ptr + 1;
+             if (context_len >= MAX_KEYWORD_LENGHT)
+               {
+                  cur++;
+                  continue;
+               }
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
+             strncpy(stack[depth], help_ptr, context_len);
+             depth++;
+             dot_lex = EINA_TRUE;
+         }
+        if ((*cur == ';') && dot_lex)
+          {
+             dot_lex = EINA_FALSE;
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
+             depth--;
+          }
         if (*cur == '}')
           {
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
              memset(stack[depth], 0x0, 40);
              if (depth > 0) depth--;
           }
@@ -201,7 +246,11 @@ context_lexem_thread_end_cb(void *data, Ecore_Thread 
*thread EINA_UNUSED)
    ctx_lexem_td *td = (ctx_lexem_td *)data;
 
    td->ad->lexem_ptr = td->result;
-   td->ad->cntx_lexem_thread = NULL;
+   if (td->ad->cntx_lexem_thread == thread)
+     td->ad->cntx_lexem_thread = NULL;
+
+   if (td->list_show)
+     candidate_list_show(td->ad);
    free(td);
 }
 
@@ -210,13 +259,16 @@ context_lexem_thread_cancel_cb(void *data, Ecore_Thread 
*thread EINA_UNUSED)
 {
    ctx_lexem_td *td = (ctx_lexem_td *)data;
 
-   td->ad->lexem_ptr = (lexem *)td->ad->lexem_root;
-   td->ad->cntx_lexem_thread = NULL;
+   td->ad->lexem_ptr = td->result ? td->result : (lexem *)td->ad->lexem_root;
+   if (td->list_show)
+     candidate_list_show(td->ad);
+   if (td->ad->cntx_lexem_thread == thread)
+     td->ad->cntx_lexem_thread = NULL;
    free(td);
 }
 
-void
-context_lexem_get(autocomp_data *ad, Evas_Object *entry)
+static void
+context_lexem_get(autocomp_data *ad, Evas_Object *entry, Eina_Bool list_show)
 {
    const char *text = elm_entry_entry_get(entry);
    if (!text)
@@ -233,6 +285,7 @@ context_lexem_get(autocomp_data *ad, Evas_Object *entry)
    td->cur_pos = elm_entry_cursor_pos_get(entry);
    td->ad = ad;
    td->result = NULL;
+   td->list_show = list_show;
 
    ad->cntx_lexem_thread =  ecore_thread_run(context_lexem_thread_cb,
                                              context_lexem_thread_end_cb,
@@ -252,7 +305,7 @@ context_changed(autocomp_data *ad, Evas_Object *edit)
         return;
      }
 
-   context_lexem_get(ad, edit);
+   context_lexem_get(ad, edit, EINA_FALSE);
 }
 
 static void
@@ -367,6 +420,8 @@ insert_completed_text(autocomp_data *ad)
    redoundo_data *rd = evas_object_data_get(entry, "redoundo");
    redoundo_entry_region_push(rd, cursor_pos, cursor_pos2);
 
+   entry_anchor_off(ad);
+
    cursor_pos2 -= (candidate->cursor_offset + (candidate->line_back * space));
    elm_entry_cursor_pos_set(entry, cursor_pos2);
    edit_line_increase(ad->ed, (candidate->txt_count - 1));
@@ -503,6 +558,10 @@ entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
             (info->change.insert.content[0] == ' ') ||
             (info->change.insert.content[0] == '.'))
           {
+             if (info->change.insert.content[0] == '.' && ad->queue_pos > 2)
+               {
+                  context_lexem_get(ad, obj, EINA_TRUE);
+               }
              queue_reset(ad);
           }
         else

-- 


Reply via email to