hermet pushed a commit to branch master.

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

commit f05dca3a22e538458d195913e73e67b512e41745
Author: Jaehyun Cho <[email protected]>
Date:   Tue Dec 9 11:09:36 2014 +0900

    Change the way of activating candidate ctxpopup.
    
    Summary:
    Change the way of activating candidate ctxpopup.
             @feature
    
    Reviewers: Hermet
    
    Differential Revision: https://phab.enlightenment.org/D1729
---
 src/lib/ctxpopup.c         | 170 ++++++++++++++++++++++++++-------------
 src/lib/edc_editor.c       |  31 +++++++-
 src/lib/edc_parser.c       | 194 ++++++++++++++++++++++++++++++++-------------
 src/lib/enventor_private.h |  10 ++-
 4 files changed, 295 insertions(+), 110 deletions(-)

diff --git a/src/lib/ctxpopup.c b/src/lib/ctxpopup.c
index 980da82..2fc61e3 100644
--- a/src/lib/ctxpopup.c
+++ b/src/lib/ctxpopup.c
@@ -43,44 +43,66 @@ btn_minus_cb(void *data, Evas_Object *obj EINA_UNUSED,
 }
 
 static void
-ctxpopup_it_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+ctxpopup_it_cb(void *data, Evas_Object *obj, void *event_info)
 {
+   attr_value *attr = data;
    Elm_Object_Item *it = event_info;
    ctxpopup_data *ctxdata = evas_object_data_get(obj, "ctxpopup_data");
-   ctxdata->selected_cb(ctxdata->data, obj,
-                        (void *) elm_object_item_text_get(it));
+   const char *text = elm_object_item_text_get(it);
+   char candidate[128];
+
+   snprintf(candidate, sizeof(candidate), "%s%s%s", attr->prepend_str, text,
+            attr->append_str);
+
+   ctxdata->selected_cb(ctxdata->data, obj, (void *) candidate);
 }
 
 static void
-slider_dismiss_cb(void *data EINA_UNUSED, Evas_Object *obj,
-                  void *event_info EINA_UNUSED)
+slider_dismiss_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
-   Evas_Object *layout = elm_object_content_get(obj);
-   Evas_Object *slider = elm_object_part_content_get(layout,
-                                                     "elm.swallow.slider");
+   attr_value *attr = data;
+   Evas_Object *box = elm_object_content_get(obj);
+   Evas_Object *layout;
+   Evas_Object *slider;
+   Eina_List *box_children = elm_box_children_get(box);
+   Eina_List *l;
+   char candidate[512];
    char buf[128];
-   attr_value *attr = evas_object_data_get(slider, "attr");
-   if (attr->type & ATTR_VALUE_INTEGER)
-     {
-        snprintf(buf, sizeof(buf), "%d",
-                 (int) roundf(elm_slider_value_get(slider)));
-     }
-   else
+
+   if (eina_list_count(box_children) == 0) return;
+
+   snprintf(candidate, sizeof(candidate), "%s", attr->prepend_str);
+
+   EINA_LIST_FOREACH(box_children, l, layout)
      {
-        //if the last digit number is 0 then round up.
-        double val = elm_slider_value_get(slider);
-        snprintf(buf, sizeof(buf), "%0.2f", val);
-        double round_down = atof(buf);
-        snprintf(buf, sizeof(buf), "%0.1f", val);
-        double round_down2 = atof(buf);
-        if (fabs(round_down - round_down2) < 0.0005)
-          snprintf(buf, sizeof(buf), "%0.1f", val);
+        slider = elm_object_part_content_get(layout,
+                                             "elm.swallow.slider");
+        if (attr->type & ATTR_VALUE_INTEGER)
+          {
+             snprintf(buf, sizeof(buf), "%d",
+                      (int) roundf(elm_slider_value_get(slider)));
+          }
         else
-          snprintf(buf, sizeof(buf), "%0.2f", val);
+          {
+             //if the last digit number is 0 then round up.
+             double val = elm_slider_value_get(slider);
+             snprintf(buf, sizeof(buf), "%0.2f", val);
+             double round_down = atof(buf);
+             snprintf(buf, sizeof(buf), "%0.1f", val);
+             double round_down2 = atof(buf);
+             if (fabs(round_down - round_down2) < 0.0005)
+               snprintf(buf, sizeof(buf), "%0.1f", val);
+             else
+               snprintf(buf, sizeof(buf), "%0.2f", val);
+          }
+        strcat(candidate, buf);
+        strcat(candidate, " ");
      }
+   candidate[strlen(candidate) - 1] = '\0'; //Remove last appended " ".
+   strcat(candidate, attr->append_str);
 
    ctxpopup_data *ctxdata = evas_object_data_get(obj, "ctxpopup_data");
-   ctxdata->selected_cb(ctxdata->data, obj, buf);
+   ctxdata->selected_cb(ctxdata->data, obj, candidate);
 }
 
 static void
@@ -90,14 +112,14 @@ ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
    free(data);
 }
 
-static void
-slider_layout_set(Evas_Object *ctxpopup, attr_value *attr, double slider_val,
-                  void *data, Eina_Bool integer)
+static Evas_Object *
+slider_layout_create(Evas_Object *parent, attr_value *attr,
+                     double slider_val, Eina_Bool integer)
 {
    //Layout
-   Evas_Object *layout = elm_layout_add(ctxpopup);
+   Evas_Object *layout = elm_layout_add(parent);
    elm_layout_file_set(layout, EDJE_PATH, "slider_layout");
-   elm_object_content_set(ctxpopup, layout);
+   evas_object_show(layout);
 
    /* FIXME: Disable slider and it's button's focus since scroller has weired
       focus region show from this. Actually we don't need focus from here
@@ -140,37 +162,69 @@ slider_layout_set(Evas_Object *ctxpopup, attr_value 
*attr, double slider_val,
    elm_image_file_set(img, EDJE_PATH, "plus");
    elm_object_content_set(btn, img);
 
+   return layout;
+}
+
+static void
+slider_layout_set(Evas_Object *ctxpopup, attr_value *attr, Eina_Bool integer)
+{
+   Eina_Stringshare *type;
+   Eina_Array_Iterator itr;
+   int i;
+
+   //Box
+   Evas_Object *box = elm_box_add(ctxpopup);
+   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(box);
+
+   //Layout
+   Evas_Object *layout;
+   for (i = 0; i < attr->cnt; i++)
+     {
+        layout = slider_layout_create(box, attr, attr->val[i], integer);
+        elm_box_pack_end(box, layout);
+     }
+
+   elm_object_content_set(ctxpopup, box);
    evas_object_smart_callback_add(ctxpopup, "dismissed", slider_dismiss_cb,
-                                  data);
+                                  (void *) attr);
 }
 
 static void
-constant_candidate_set(Evas_Object *ctxpopup, attr_value *attr, void *data)
+constant_candidate_set(Evas_Object *ctxpopup, attr_value *attr)
 {
    Eina_Stringshare *candidate;
    Eina_Array_Iterator itr;
    unsigned int i;
 
    EINA_ARRAY_ITER_NEXT(attr->strs, i, candidate, itr)
-     elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, data);
+      elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb,
+                               (void *) attr);
 }
 
 static Eina_Bool
-part_candidate_set(Evas_Object *ctxpopup, void *data)
+part_candidate_set(Evas_Object *ctxpopup, attr_value *attr)
 {
    view_data *vd = edj_mgr_view_get(NULL);
    if (!vd) return EINA_FALSE;
    Eina_List *parts = view_parts_list_get(vd);
    Eina_List *l;
    char *part;
+   char candidate[128];
    EINA_LIST_FOREACH(parts, l, part)
-     elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, data);
+     {
+        snprintf(candidate, sizeof(candidate), "\"%s\"", part);
+        elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb,
+                                 (void *) attr);
+     }
    view_string_list_free(parts);
    return EINA_TRUE;
 }
 
 static Eina_Bool
-image_candidate_set(Evas_Object *ctxpopup, void *data)
+image_candidate_set(Evas_Object *ctxpopup, attr_value *attr)
 {
    view_data *vd = edj_mgr_view_get(NULL);
    if (!vd) return EINA_FALSE;
@@ -178,39 +232,44 @@ image_candidate_set(Evas_Object *ctxpopup, void *data)
    Eina_List *l;
    char *part;
    EINA_LIST_FOREACH(parts, l, part)
-     elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, data);
+      elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb,
+                               (void *) attr);
    view_string_list_free(parts);
    return EINA_TRUE;
 }
 
 static Eina_Bool
-program_candidate_set(Evas_Object *ctxpopup, void *data)
+program_candidate_set(Evas_Object *ctxpopup, attr_value *attr)
 {
    view_data *vd = edj_mgr_view_get(NULL);
    if (!vd) return EINA_FALSE;
    Eina_List *parts = view_programs_list_get(vd);
    Eina_List *l;
    char *part;
+   char candidate[128];
    EINA_LIST_FOREACH(parts, l, part)
-     elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, data);
+     {
+        snprintf(candidate, sizeof(candidate), "\"%s\"", part);
+        elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb,
+                                 (void *) attr);
+     }
    view_string_list_free(parts);
    return EINA_TRUE;
 }
 
 static Eina_Bool
-state_candidate_set(Evas_Object *ctxpopup, void *data, Eina_Bool prog)
+state_candidate_set(Evas_Object *ctxpopup, attr_value *attr, edit_data *ed)
 {
    view_data *vd = edj_mgr_view_get(NULL);
    if (!vd) return EINA_FALSE;
 
-   edit_data *ed = data;
    Eina_Stringshare *program = NULL;
    Eina_List *targets = NULL;
    Eina_Stringshare *target = NULL;
    Eina_Bool ret = EINA_FALSE;
 
    //Trace the part name from the program.
-   if (prog)
+   if (attr->program)
      {
         program = edit_cur_prog_name_get(ed);
         if (!program) return EINA_FALSE;
@@ -233,9 +292,12 @@ state_candidate_set(Evas_Object *ctxpopup, void *data, 
Eina_Bool prog)
 
    Eina_List *l;
    char *state;
+   char candidate[128];
    EINA_LIST_FOREACH(converted, l, state)
      {
-        elm_ctxpopup_item_append(ctxpopup, state, NULL, ctxpopup_it_cb, data);
+        snprintf(candidate, sizeof(candidate), "\"%s\"", state);
+        elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb,
+                                 (void *) attr);
         free(state);
      }
    view_string_list_free(states);
@@ -244,7 +306,7 @@ state_candidate_set(Evas_Object *ctxpopup, void *data, 
Eina_Bool prog)
 end:
    eina_stringshare_del(program);
    view_string_list_free(targets);
-   if (!prog && target) eina_stringshare_del(target);
+   if (!attr->program && target) eina_stringshare_del(target);
    return ret;
 }
 
@@ -338,7 +400,6 @@ ctxpopup_img_preview_create(edit_data *ed,
 
 Evas_Object *
 ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr,
-                               double slider_val,
                                Evas_Smart_Cb ctxpopup_dismiss_cb,
                                Evas_Smart_Cb ctxpopup_selected_cb)
 {
@@ -347,7 +408,10 @@ ctxpopup_candidate_list_create(edit_data *ed, attr_value 
*attr,
    if (!ctxpopup) return NULL;
 
    elm_object_style_set(ctxpopup, "enventor");
-
+   elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_RIGHT,
+                                       ELM_CTXPOPUP_DIRECTION_LEFT,
+                                       ELM_CTXPOPUP_DIRECTION_UP,
+                                       ELM_CTXPOPUP_DIRECTION_DOWN);
    //ctxpopup data
    ctxpopup_data *ctxdata = malloc(sizeof(ctxpopup_data));
    if (!ctxdata)
@@ -363,37 +427,37 @@ ctxpopup_candidate_list_create(edit_data *ed, attr_value 
*attr,
      {
         case ATTR_VALUE_INTEGER:
           {
-             slider_layout_set(ctxpopup, attr, slider_val, ed, EINA_TRUE);
+             slider_layout_set(ctxpopup, attr, EINA_TRUE);
              break;
           }
         case ATTR_VALUE_FLOAT:
           {
-             slider_layout_set(ctxpopup, attr, slider_val, ed, EINA_FALSE);
+             slider_layout_set(ctxpopup, attr, EINA_FALSE);
              break;
           }
         case ATTR_VALUE_CONSTANT:
           {
-             constant_candidate_set(ctxpopup, attr, ed);
+             constant_candidate_set(ctxpopup, attr);
              break;
           }
         case ATTR_VALUE_PART:
           {
-             if (!part_candidate_set(ctxpopup, ed)) goto err;
+             if (!part_candidate_set(ctxpopup, attr)) goto err;
              break;
           }
         case ATTR_VALUE_STATE:
           {
-             if (!state_candidate_set(ctxpopup, ed, attr->program)) goto err;
+             if (!state_candidate_set(ctxpopup, attr, ed)) goto err;
              break;
           }
         case ATTR_VALUE_IMAGE:
           {
-             if (!image_candidate_set(ctxpopup, ed)) goto err;
+             if (!image_candidate_set(ctxpopup, attr)) goto err;
              break;
           }
         case ATTR_VALUE_PROGRAM:
           {
-             if (!program_candidate_set(ctxpopup, ed)) goto err;
+             if (!program_candidate_set(ctxpopup, attr)) goto err;
              break;
           }
    }
diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c
index e551ac4..764915f 100644
--- a/src/lib/edc_editor.c
+++ b/src/lib/edc_editor.c
@@ -276,6 +276,31 @@ ctxpopup_candidate_selected_cb(void *data, Evas_Object 
*obj, void *event_info)
 {
    edit_data *ed = data;
    const char *text = event_info;
+   char *ch;
+   int cur_pos, end_pos;
+   int i;
+
+   cur_pos = elm_entry_cursor_pos_get(ed->en_edit);
+   elm_entry_cursor_line_end_set(ed->en_edit);
+   end_pos = elm_entry_cursor_pos_get(ed->en_edit);
+
+   for (i = cur_pos; i <= end_pos; i++)
+   {
+      elm_entry_cursor_pos_set(ed->en_edit, i);
+      ch = elm_entry_cursor_content_get(ed->en_edit);
+      if (!strcmp(ch, ";"))
+        {
+           //1 more space for end_pos to replace until ';'.
+           end_pos = elm_entry_cursor_pos_get(ed->en_edit) + 1;
+           break;
+        }
+   }
+
+   elm_entry_cursor_pos_set(ed->en_edit, cur_pos);
+   elm_entry_cursor_selection_begin(ed->en_edit);
+   elm_entry_cursor_pos_set(ed->en_edit, end_pos);
+   elm_entry_cursor_selection_end(ed->en_edit);
+
    redoundo_text_relative_push(ed->rd, text);
    elm_entry_entry_insert(ed->en_edit, text);
    elm_ctxpopup_dismiss(obj);
@@ -438,12 +463,14 @@ image_preview_show(edit_data *ed, char *cur, Evas_Coord 
x, Evas_Coord y)
 static void
 candidate_list_show(edit_data *ed, char *text, char *cur, char *selected)
 {
-   attr_value * attr = parser_attribute_get(ed->pd, text, cur);
+   attr_value * attr = parser_attribute_get(ed->pd, text, cur, selected);
    if (!attr) return;
 
+   parser_attribute_value_set(attr, cur);
+
    //Show up the list of the types
    Evas_Object *ctxpopup =
-      ctxpopup_candidate_list_create(ed, attr, atof(selected),
+      ctxpopup_candidate_list_create(ed, attr,
                                      ctxpopup_candidate_dismiss_cb,
                                      ctxpopup_candidate_selected_cb);
    if (!ctxpopup) return;
diff --git a/src/lib/edc_parser.c b/src/lib/edc_parser.c
index 1ca4d58..77059f3 100644
--- a/src/lib/edc_parser.c
+++ b/src/lib/edc_parser.c
@@ -7,6 +7,11 @@
 #include <Enventor.h>
 #include "enventor_private.h"
 
+const char ATTR_PREPEND_COLON[] = ": ";
+const char ATTR_PREPEND_NONE[] = " ";
+const char ATTR_APPEND_SEMICOLON[] = ";";
+const char ATTR_APPEND_STATE_VAL[] = " 0.0;";
+
 struct parser_s
 {
    Eina_Inarray *attrs;
@@ -18,7 +23,6 @@ typedef struct parser_attr_s
 {
    Eina_Stringshare *keyword;
    attr_value value;
-   Eina_Bool instring : 1;
 } parser_attr;
 
 typedef struct cur_name_thread_data_s
@@ -263,9 +267,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    eina_array_push(types, eina_stringshare_add("SPACER"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("type:");
+   attr.keyword = eina_stringshare_add("type");
    attr.value.strs = types;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    Eina_Array *comps = eina_array_new(4);
@@ -275,9 +281,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    eina_array_push(comps, eina_stringshare_add("LOSSY"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("image:");
+   attr.keyword = eina_stringshare_add("image");
    attr.value.strs = comps;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    Eina_Array *trans = eina_array_new(11);
@@ -294,9 +302,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    eina_array_push(trans, eina_stringshare_add("CUBIC_BEZIER"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("transition:");
+   attr.keyword = eina_stringshare_add("transition");
    attr.value.strs = trans;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    Eina_Array *aspect_mode = eina_array_new(5);
@@ -307,9 +317,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    eina_array_push(aspect_mode, eina_stringshare_add("BOTH"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("aspect_mode:");
+   attr.keyword = eina_stringshare_add("aspect_mode");
    attr.value.strs = aspect_mode;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    Eina_Array *aspect_prefer = eina_array_new(4);
@@ -319,9 +331,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    eina_array_push(aspect_prefer, eina_stringshare_add("BOTH"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("aspect_preference:");
+   attr.keyword = eina_stringshare_add("aspect_preference");
    attr.value.strs = aspect_prefer;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    Eina_Array *effect = eina_array_new(11);
@@ -338,9 +352,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    eina_array_push(effect, eina_stringshare_add("GLOW"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("effect:");
+   attr.keyword = eina_stringshare_add("effect");
    attr.value.strs = effect;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    Eina_Array *action = eina_array_new(23);
@@ -369,148 +385,194 @@ type_init_thread_blocking(void *data, Ecore_Thread 
*thread EINA_UNUSED)
    eina_array_push(action, eina_stringshare_add("PHYSICS_ROT_SET"));
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("action:");
+   attr.keyword = eina_stringshare_add("action");
    attr.value.strs = action;
    attr.value.type = ATTR_VALUE_CONSTANT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    //Type: Integer
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("color:");
+   attr.keyword = eina_stringshare_add("color");
+   attr.value.cnt = 4;
    attr.value.min = 0;
    attr.value.max = 255;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("color2:");
+   attr.keyword = eina_stringshare_add("color2");
+   attr.value.cnt = 4;
    attr.value.min = 0;
    attr.value.max = 255;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("color3:");
+   attr.keyword = eina_stringshare_add("color3");
+   attr.value.cnt = 4;
    attr.value.min = 0;
    attr.value.max = 255;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("scale:");
+   attr.keyword = eina_stringshare_add("scale");
+   attr.value.cnt = 1;
    attr.value.min = 0;
    attr.value.max = 1;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("fixed:");
+   attr.keyword = eina_stringshare_add("fixed");
+   attr.value.cnt = 2;
    attr.value.min = 0;
    attr.value.max = 1;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("size:");
+   attr.keyword = eina_stringshare_add("size");
+   attr.value.cnt = 1;
    attr.value.min = 1;
    attr.value.max = 255;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("min:");
+   attr.keyword = eina_stringshare_add("min");
+   attr.value.cnt = 2;
    attr.value.min = 0;
    attr.value.max = 1000;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("max:");
+   attr.keyword = eina_stringshare_add("max");
+   attr.value.cnt = 2;
    attr.value.min = 0;
    attr.value.max = 1000;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("mouse_events:");
+   attr.keyword = eina_stringshare_add("mouse_events");
+   attr.value.cnt = 1;
    attr.value.min = 0;
    attr.value.max = 1;
    attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    //Type: Float
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("relative:");
+   attr.keyword = eina_stringshare_add("relative");
+   attr.value.cnt = 2;
    attr.value.min = 0.0;
    attr.value.max = 1;
    attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("aspect:");
+   attr.keyword = eina_stringshare_add("aspect");
+   attr.value.cnt = 2;
    attr.value.min = 0.0;
    attr.value.max = 1.0;
    attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("align:");
+   attr.keyword = eina_stringshare_add("align");
+   attr.value.cnt = 2;
    attr.value.min = 0.0;
    attr.value.max = 1.0;
    attr.value.type = ATTR_VALUE_FLOAT;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    //Type: Part
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("target:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("target");
    attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("to:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("to");
    attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("source:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("source");
    attr.value.type = ATTR_VALUE_PART;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    //Type: State
    memset(&attr, 0x00, sizeof(parser_attr));
    attr.keyword = eina_stringshare_add("STATE_SET");
-   attr.instring = EINA_TRUE;
    attr.value.type = ATTR_VALUE_STATE;
+   attr.value.prepend_str = ATTR_PREPEND_NONE;
+   attr.value.append_str = ATTR_APPEND_STATE_VAL;
    attr.value.program = EINA_TRUE;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("inherit:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("inherit");
    attr.value.type = ATTR_VALUE_STATE;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_STATE_VAL;
    eina_inarray_push(td->attrs, &attr);
 
    //Type: Image
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("normal:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("normal");
    attr.value.type = ATTR_VALUE_IMAGE;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("tween:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("tween");
    attr.value.type = ATTR_VALUE_IMAGE;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 
    //Type: Program
    memset(&attr, 0x00, sizeof(parser_attr));
-   attr.keyword = eina_stringshare_add("after:");
-   attr.instring = EINA_TRUE;
+   attr.keyword = eina_stringshare_add("after");
    attr.value.type = ATTR_VALUE_PROGRAM;
+   attr.value.prepend_str = ATTR_PREPEND_COLON;
+   attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
 }
 
@@ -646,45 +708,71 @@ parser_colon_pos_get(parser_data *pd EINA_UNUSED, const 
char *cur)
 }
 
 attr_value *
-parser_attribute_get(parser_data *pd, const char *text, const char *cur)
+parser_attribute_get(parser_data *pd, const char *text, const char *cur,
+                     const char *selected)
 {
    if (!text || !cur) return NULL;
    if ((*cur == ';') || (*cur == ':')) return NULL;
 
    parser_attr *attr;
    Eina_Bool instring = EINA_FALSE;
-   Eina_Bool necessary = EINA_FALSE;
 
    char *p = (char *) cur;
 
    while (p >= text)
      {
-        if (*p == ':')
-          {
-             necessary = EINA_TRUE;
-             break;
-          }
         if (*p == '\"') instring = !instring;
         p--;
      }
-   if (!p || !necessary) return NULL;
+   if (instring) return NULL;
 
-   while (p > text)
+   EINA_INARRAY_FOREACH(pd->attrs, attr)
      {
-        if ((*p == ';') || (*p == '.') || (*p == ' ')) break;
-        p--;
+        if (!strcmp(selected, attr->keyword))
+             return &attr->value;
      }
 
-   if (!p) return NULL;
-   if (p != text) p++;
+   return NULL;
+}
 
-   EINA_INARRAY_FOREACH(pd->attrs, attr)
+/* Function is_numberic is refer to the following url.
+   http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#C */
+static Eina_Bool
+is_numberic(const char *str)
+{
+   Eina_Bool ret = EINA_FALSE;
+   char *p;
+
+   if (!str || (*str == '\0') || isspace(*str))
+     return EINA_FALSE;
+
+   strtod(str, &p);
+   if (*p == '\0') ret = EINA_TRUE;
+
+   return ret;
+}
+
+void
+parser_attribute_value_set(attr_value *value, char *cur)
+{
+   const char token[4] = " ;:";
+   char *str = strtok(cur, token);
+   int i;
+
+   if (!str) return;
+   str = strtok(NULL, token); //Skip the keyword
+
+   //Initialize attribute values
+   for (i = 0; i < value->cnt; i++)
+     value->val[i] = 0;
+
+   for (i = 0; str && (i < value->cnt); str = strtok(NULL, token))
      {
-        if ((instring == attr->instring) && strstr(p, attr->keyword))
-          return &attr->value;
-     }
+        if (!is_numberic(str)) continue;
 
-   return NULL;
+        value->val[i] = atof(str);
+        i++;
+     }
 }
 
 Eina_Stringshare *
diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h
index ee46b78..6787e9d 100644
--- a/src/lib/enventor_private.h
+++ b/src/lib/enventor_private.h
@@ -14,6 +14,7 @@
 #define REL2_X 0.75f
 #define REL2_Y 0.75f
 #define VIEW_DATA edj_mgr_view_get(NULL)
+#define ATTR_VALUE_MAX_CNT 4
 
 extern char EDJE_PATH[PATH_MAX];
 extern const char SIG_CURSOR_LINE_CHANGED[];
@@ -51,9 +52,13 @@ typedef enum attr_value_type
 struct attr_value_s
 {
    Eina_Array *strs;
+   int cnt;
+   float val[ATTR_VALUE_MAX_CNT];
    float min;
    float max;
    attr_value_type type;
+   const char *prepend_str;
+   const char *append_str;
    Eina_Bool program : 1;
 };
 
@@ -82,7 +87,8 @@ void parser_cur_name_get(parser_data *pd, Evas_Object *entry, 
void (*cb)(void *d
 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_Stringshare *parser_cur_name_fast_get(Evas_Object *entry, const char 
*scope);
 Eina_Bool parser_type_name_compare(parser_data *pd, const char *str);
-attr_value *parser_attribute_get(parser_data *pd, const char *text, const char 
*cur);
+attr_value *parser_attribute_get(parser_data *pd, const char *text, const char 
*cur, const char *selected);
+void parser_attribute_value_set(attr_value *attr, char *cur);
 Eina_Stringshare *parser_paragh_name_get(parser_data *pd, Evas_Object *entry);
 char *parser_name_get(parser_data *pd, const char *cur);
 void parser_cancel(parser_data *pd);
@@ -179,7 +185,7 @@ Eina_Bool template_insert(edit_data *ed, 
Enventor_Template_Insert_Type insert_ty
 
 
 /* ctxpopup */
-Evas_Object *ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, 
double slider_val, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb 
ctxpopup_selected_cb);
+Evas_Object *ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, 
Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_selected_cb);
 Evas_Object *ctxpopup_img_preview_create(edit_data*ed, const char *imgpath, 
Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_relay_cb);
 
 

-- 


Reply via email to