nikawhite pushed a commit to branch master.

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

commit 9863ea304ceecd3c9fa5bde7e9058b27df67e9c5
Author: Mykyta Biliavskyi <m.biliavs...@samsung.com>
Date:   Tue Dec 22 09:25:53 2015 +0900

    Edje viewer:  Jump to code of current clicked part.
    
    When user click a part in the live view,
    the entry cursor jumps to the corresponded part line.
    
    Need additional attention for the invisible parts. Swallow
    and spacer parts primitives created after edje-layout. And this
    causes situation when this primitives is placed above other
    parts.
    
    T2179
---
 src/lib/dummy_obj.c        | 18 ++++++++++++-
 src/lib/edc_editor.c       | 61 +++++++++++++++++++++++++++++++++++++++++++
 src/lib/edj_viewer.c       | 65 ++++++++++++++++++++++++++++++++++++++++++++++
 src/lib/enventor_private.h |  1 +
 src/lib/enventor_smart.c   | 11 ++++++++
 5 files changed, 155 insertions(+), 1 deletion(-)

diff --git a/src/lib/dummy_obj.c b/src/lib/dummy_obj.c
index 1fcd8b0..11c81d9 100644
--- a/src/lib/dummy_obj.c
+++ b/src/lib/dummy_obj.c
@@ -23,10 +23,19 @@ typedef struct dummy_obj_s
 } dummy_obj;
 
 const char *DUMMYOBJ = "dummy_obj";
+const char *EDIT_LAYOUT_KEY = "edit_layout";
 
 /*****************************************************************************/
 /* Internal method implementation                                            */
 /*****************************************************************************/
+static void
+edje_part_clicked(void *data, Evas *e EINA_UNUSED,
+                  Evas_Object *obj, void *ei EINA_UNUSED)
+{
+   part_obj *po = (part_obj *)data;
+   Evas_Object *layout = evas_object_data_get(obj, EDIT_LAYOUT_KEY);
+   evas_object_smart_callback_call(layout, "dummy,clicked", (char 
*)(po->name));
+}
 
 static void
 dummy_objs_update(dummy_obj *dummy)
@@ -76,7 +85,7 @@ dummy_objs_update(dummy_obj *dummy)
 
         if (type == EDJE_PART_TYPE_SWALLOW)
           {
-             //Check this part is exist 
+             //Check this part is exist
              if (edje_object_part_swallow_get(dummy->layout, part_name))
                continue;
 
@@ -93,8 +102,11 @@ dummy_objs_update(dummy_obj *dummy)
              edje_object_part_swallow(dummy->layout, part_name, obj);
 
              po->obj = obj;
+             evas_object_data_set(po->obj, EDIT_LAYOUT_KEY, dummy->layout);
              po->name = eina_stringshare_add(part_name);
              dummy->swallows = eina_list_append(dummy->swallows, po);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
+                                            edje_part_clicked, po);
           }
         else if (type == EDJE_PART_TYPE_SPACER)
           {
@@ -126,6 +138,10 @@ dummy_objs_update(dummy_obj *dummy)
                   dummy->spacers = eina_list_append(dummy->spacers, po);
                   evas_object_show(obj);
                   evas_object_clip_set(obj, clipper);
+                  evas_object_data_set(obj, EDIT_LAYOUT_KEY, dummy->layout);
+
+                  evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
+                                                 edje_part_clicked, po);
                }
              evas_object_geometry_get(dummy->layout, &lx, &ly, NULL, NULL);
              edje_object_part_geometry_get(dummy->layout, part_name, &x, &y, 
&w, &h);
diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c
index bea9119..702ff02 100644
--- a/src/lib/edc_editor.c
+++ b/src/lib/edc_editor.c
@@ -936,6 +936,67 @@ edit_focused_cb(void *data, Evas_Object *obj EINA_UNUSED,
 /*****************************************************************************/
 
 void
+edit_part_cursor_set(edit_data *ed,
+                     const char *group_name,
+                     const char *part_name)
+{
+   if (!group_name || !part_name) return;
+   const char *text = elm_entry_entry_get(ed->en_edit);
+   char *utf8 = elm_entry_markup_to_utf8(text);
+
+   int part_name_size = strlen(part_name) + 2; // 2 - is quotes.
+   char *part_name_search = calloc(part_name_size, sizeof(char));
+   snprintf(part_name_search, part_name_size, "\"%s\"", part_name);
+
+   int group_name_size = strlen(group_name) + 2; // 2 - is quotes.
+   char *group_name_search = calloc(group_name_size, sizeof(char));
+   snprintf(group_name_search, group_name_size, "\"%s\"", group_name);
+
+   const char *group_pos = strstr(utf8, group_name_search);
+
+   char *itr = strstr(group_pos, part_name_search);
+   const char *part_pos = itr;
+   Eina_Bool word_present = EINA_FALSE;
+   Eina_Bool found_part = EINA_FALSE;
+   /* Search entry of '{ "part_name" ' or  '{ name: "part_name"' patternsd*/
+   for (; (itr != NULL) && (itr > utf8); itr--)
+     {
+        if (isalnum(*itr))
+          word_present = EINA_TRUE;
+        else if (*itr == '{')
+          {
+             if (word_present)
+               {
+                  char *name_keyword = strstr(itr, "name");
+                  if (name_keyword && name_keyword < part_pos)
+                    {
+                       found_part = EINA_TRUE;
+                       break;
+                    }
+               }
+             else
+               {
+                  found_part = EINA_TRUE;
+                  break;
+               }
+             itr = strstr(part_pos + 1, part_name_search);
+             part_pos = itr;
+          }
+     }
+
+   if (found_part)
+     {
+        int cur_pos = part_pos - utf8 + strlen(part_name);
+        elm_entry_select_none(ed->en_edit);
+        elm_entry_cursor_pos_set(ed->en_edit, cur_pos);
+     }
+
+   free(utf8);
+   free(part_name_search);
+   free(group_name_search);
+}
+
+void
 edit_view_sync_cb_set(edit_data *ed,
                       void (*cb)(void *data, Eina_Stringshare *state_name, 
double state_value,
                       Eina_Stringshare *part_name, Eina_Stringshare 
*group_name), void *data)
diff --git a/src/lib/edj_viewer.c b/src/lib/edj_viewer.c
index f65f05f..c53cb37 100644
--- a/src/lib/edj_viewer.c
+++ b/src/lib/edj_viewer.c
@@ -28,6 +28,7 @@ struct viewer_s
    Ecore_Timer *timer;
    Eio_Monitor *edj_monitor;
    Eina_List *img_monitors;
+   Eina_List *part_names;
    Eio_Monitor *img_monitor;
    Ecore_Event_Handler *edj_monitor_event;
    Ecore_Event_Handler *img_monitor_event;
@@ -41,6 +42,8 @@ struct viewer_s
    Eina_Bool edj_reload_need : 1;
 };
 
+const char *PART_NAME = "part_name";
+
 /*****************************************************************************/
 /* Internal method implementation                                            */
 /*****************************************************************************/
@@ -270,6 +273,53 @@ view_scroller_create(Evas_Object *parent)
    return scroller;
 }
 
+static void
+edje_part_clicked(void *data, Evas *e EINA_UNUSED,
+                  Evas_Object *obj  EINA_UNUSED,
+                  void *ei EINA_UNUSED)
+{
+   view_data *vd = (view_data *)data;
+   char *part_name = evas_object_data_get(obj, PART_NAME);
+   evas_object_smart_callback_call(vd->enventor, "part,clicked", part_name);
+}
+
+inline static void
+view_obj_parts_names_free(view_data *vd)
+{
+   Eina_Stringshare *part_name = NULL;
+
+   EINA_LIST_FREE(vd->part_names, part_name)
+      eina_stringshare_del(part_name);
+
+   vd->part_names = NULL;
+}
+
+static void
+view_obj_parts_callbacks_set(view_data *vd)
+{
+   if (vd->part_names)
+      view_obj_parts_names_free(vd);
+
+   Eina_List *l = NULL;
+   Eina_Stringshare *part_name = NULL;
+   Eina_List *parts = edje_edit_parts_list_get(vd->layout);
+
+   EINA_LIST_FOREACH(parts, l, part_name)
+     {
+        Evas_Object *edje_part =
+               (Evas_Object *)edje_object_part_object_get(vd->layout, 
part_name);
+        if (edje_part)
+          {
+             Eina_Stringshare *name = eina_stringshare_add(part_name);
+             vd->part_names = eina_list_append(vd->part_names, name);
+             evas_object_data_set(edje_part, PART_NAME, name);
+             evas_object_event_callback_add(edje_part, 
EVAS_CALLBACK_MOUSE_DOWN,
+                                            edje_part_clicked, vd);
+          }
+     }
+   edje_edit_string_list_free(parts);
+}
+
 static Eina_Bool
 exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
 {
@@ -290,6 +340,7 @@ exe_del_event_cb(void *data, int type EINA_UNUSED, void 
*event EINA_UNUSED)
    view_part_highlight_set(vd, vd->part_name);
    dummy_obj_update(vd->layout);
 
+   view_obj_parts_callbacks_set(vd);
    vd->edj_reload_need = EINA_FALSE;
 
    evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_UPDATED,
@@ -305,6 +356,7 @@ edj_changed_cb(void *data, int type EINA_UNUSED, void 
*event)
    Eio_Monitor_Event *ev = event;
 
    if (vd->edj_monitor != ev->monitor) return ECORE_CALLBACK_PASS_ON;
+   view_obj_parts_names_free(vd);
 
    //FIXME: why it need to add monitor again??
    eio_monitor_del(vd->edj_monitor);
@@ -358,6 +410,14 @@ base_create(Evas_Object *parent)
 }
 
 static void
+dummy_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+   char *part_name = (char *)ei;
+   view_data *vd = (view_data *)data;
+   evas_object_smart_callback_call(vd->enventor, "part,clicked", part_name);
+}
+
+static void
 view_obj_create(view_data *vd)
 {
    Evas *e = evas_object_evas_get(vd->base);
@@ -371,6 +431,11 @@ view_obj_create(view_data *vd)
                                     EVAS_HINT_EXPAND);
    evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
                                   layout_resize_cb, vd);
+   evas_object_smart_callback_add(vd->layout, "dummy,clicked",
+                                  dummy_clicked_cb, vd);
+
+   view_obj_parts_callbacks_set(vd);
+
 }
 
 static void
diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h
index 3e2adc6..30cc449 100644
--- a/src/lib/enventor_private.h
+++ b/src/lib/enventor_private.h
@@ -281,5 +281,6 @@ Eina_Bool edit_redoundo(edit_data *ed, Eina_Bool undo);
 void edit_disabled_set(edit_data *ed, Eina_Bool disabled);
 void edit_error_set(edit_data *ed, int line, const char *target);
 void edit_text_insert(edit_data *ed, const char *text);
+void edit_part_cursor_set(edit_data *ed, const char *group_name, const char 
*part_name);
 
 #endif
diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c
index e99fab0..5ab049f 100644
--- a/src/lib/enventor_smart.c
+++ b/src/lib/enventor_smart.c
@@ -166,6 +166,15 @@ call_error:
 
 }
 
+static void
+_enventor_part_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+   Enventor_Object_Data *pd = (Enventor_Object_Data *)data;
+   const char *part_name = (const char *)ei;
+   edit_part_cursor_set(pd->ed, view_group_name_get(VIEW_DATA), part_name);
+}
+
+
 /*****************************************************************************/
 /* Internal Eo object required routines                                      */
 /*****************************************************************************/
@@ -198,6 +207,8 @@ _enventor_object_evas_object_smart_add(Eo *obj, 
Enventor_Object_Data *pd)
       ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_down_cb, pd);
    pd->key_up_handler =
       ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_up_cb, pd);
+
+   evas_object_smart_callback_add(pd->obj, "part,clicked", 
_enventor_part_clicked_cb, pd);
 }
 
 EOLIAN static void

-- 


Reply via email to