Enlightenment CVS committal

Author  : rephorm
Project : e17
Module  : libs/edje

Dir     : e17/libs/edje/src/lib


Modified Files:
        Edje.h edje_calc.c edje_data.c edje_load.c edje_main.c 
        edje_message_queue.c edje_private.h edje_program.c edje_util.c 


Log Message:
Add GROUP Parts to edje.

These can be used to automatically swallow in another group from the same file.

Parts within child groups can be referred to by a ':' separated 'full path' of
part names. Any API functions that take a part name will now accept a full path
also.

Signals emitted by child objects will be repeated up to the parents with the
source changed to be the path relative to the receiving object.  E.g in the
example below, a mouse moving over the lower light green rectangle would result
in the parent object recieving a "mouse,move" signal with source "bot:inner".

**** NEW RESTRICTION ****  part names should no longer include a ':' character.
This is not yet enforced by edje_cc, but will cause the part to be inaccessible
from the API.

Example EDC:

collections {
  group {
    name: "parent";
    parts {
      part {
        name: "top";
        type: GROUP;
        source: "child";
        description {
          state: "default" 0.0;
          rel2.relative: 1 0.5;
        }
      }
      part {
        name: "bot";
        type: GROUP;
        source: "child";
        description {
          state: "default" 0.0;
          rel1.relative: 0 0.5;
        }
      }
    }
  }
  group {
    name: "child";
    parts {
      part {
        name: "base";
        type: RECT;
        description {
          state: "default" 0.0;
          color: 160 208 8 255;
        }
      }
      part {
        name: "inner";
        type: RECT;
        description {
          state: "default" 0.0;
          rel1.offset: 10 10;
          rel2.offset: -11 -11;
          color: 210 228 76 255;
        }
      }
    }
  }
}

===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/Edje.h,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -3 -r1.49 -r1.50
--- Edje.h      24 Dec 2006 10:29:16 -0000      1.49
+++ Edje.h      27 May 2007 05:28:07 -0000      1.50
@@ -145,7 +145,8 @@
      EDJE_LOAD_ERROR_CORRUPT_FILE = 5,
      EDJE_LOAD_ERROR_UNKNOWN_FORMAT = 6,
      EDJE_LOAD_ERROR_INCOMPATIBLE_FILE = 7,
-     EDJE_LOAD_ERROR_UNKNOWN_COLLECTION = 8
+     EDJE_LOAD_ERROR_UNKNOWN_COLLECTION = 8,
+     EDJE_LOAD_ERROR_RECURSIVE_REFERENCE = 9
 };
 
 #ifdef __cplusplus
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_calc.c,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -3 -r1.101 -r1.102
--- edje_calc.c 26 May 2007 23:57:21 -0000      1.101
+++ edje_calc.c 27 May 2007 05:28:07 -0000      1.102
@@ -1310,7 +1310,7 @@
             if (p3.visible) evas_object_show(ep->object);
             else evas_object_hide(ep->object);
          }
-       else if (ep->part->type == EDJE_PART_TYPE_SWALLOW)
+       else if (ep->part->type == EDJE_PART_TYPE_SWALLOW || ep->part->type == 
EDJE_PART_TYPE_GROUP)
          {
             evas_object_move(ep->object, ed->x + p3.x, ed->y + p3.y);
             evas_object_resize(ep->object, p3.w, p3.h);
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_data.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -3 -r1.35 -r1.36
--- edje_data.c 30 Mar 2007 23:39:41 -0000      1.35
+++ edje_data.c 27 May 2007 05:28:07 -0000      1.36
@@ -356,6 +356,7 @@
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, 
"dragable.count_y", dragable.count_y, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, 
"dragable.counfine_id", dragable.confine_id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, 
"dragable.events_id", dragable.events_id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source", 
source, EET_T_STRING);
    
    NEWD("Edje_Part_Collection", 
        Edje_Part_Collection);
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_load.c,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -3 -r1.104 -r1.105
--- edje_load.c 26 May 2007 23:57:21 -0000      1.104
+++ edje_load.c 27 May 2007 05:28:07 -0000      1.105
@@ -10,6 +10,8 @@
 #ifdef EDJE_PROGRAM_CACHE
 static int  _edje_collection_free_prog_cache_matches_free_cb(Evas_Hash *hash, 
const char *key, void *data, void *fdata);
 #endif
+static int _edje_object_file_set_internal(Evas_Object *obj, const char *file, 
const char *part, Evas_List *group_path);
+static void _cb_signal_repeat(void *data, Evas_Object *obj, const char 
*signal, const char *source);
 
 static Evas_List *_edje_swallows_collect(Edje *ed);
 
@@ -30,10 +32,191 @@
 EAPI int
 edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
 {
+   return _edje_object_file_set_internal(obj, file, part, NULL);
+}
+
+/* FIXDOC: Verify/expand doc. */
+/** Get the file and group name that @a obj was loaded from
+ * @param obj A valid Evas_Object handle
+ * @param file A pointer to store a pointer to the filename in
+ * @param part A pointer to store a pointer to the group name in
+ *
+ * This gets the EET file location and group for the given Evas_Object.
+ * If @a obj is either not an edje file, or has not had its file/group set
+ * using edje_object_file_set(), then both @a file and @a part will be set
+ * to NULL.
+ *
+ * It is valid to pass in NULL for either @a file or @a part if you are not
+ * interested in one of the values.
+ */
+EAPI void
+edje_object_file_get(Evas_Object *obj, const char **file, const char **part)
+{
+   Edje *ed;
+   
+   ed = _edje_fetch(obj);
+   if (!ed)
+     {
+       if (file) *file = NULL;
+       if (part) *part = NULL;
+       return;
+     }
+   if (file) *file = ed->path;
+   if (part) *part = ed->part;
+}
+
+/* FIXDOC: Verify. return error? */
+/** Gets the Edje load error
+ * @param obj A valid Evas_Object handle
+ *
+ * @return The Edje load error:\n
+ * 0: No Error\n
+ * 1: Generic Error\n
+ * 2: Does not Exist\n
+ * 3: Permission Denied\n
+ * 4: Resource Allocation Failed\n
+ * 5: Corrupt File\n
+ * 6: Unknown Format\n
+ * 7: Incompatible File
+ */
+EAPI int
+edje_object_load_error_get(Evas_Object *obj)
+{
+   Edje *ed;
+   
+   ed = _edje_fetch(obj);
+   if (!ed) return EDJE_LOAD_ERROR_NONE;
+   return ed->load_error;
+}
+
+/** Get a list of groups in an edje file
+ * @param file The path to the edje file
+ *
+ * @return The Evas_List of group names (char *)
+ *
+ * Note: the list must be freed using edje_file_collection_list_free()
+ * when you are done with it.
+ */   
+EAPI Evas_List *
+edje_file_collection_list(const char *file)
+{
+   Evas_List *lst = NULL;
+   Edje_File *edf;
+   int error_ret = 0;
+
+   if ((!file) || (!*file)) return NULL;
+   edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
+   if (edf != NULL)
+     {
+       if (edf->collection_dir)
+         {
+            Evas_List *l;
+       
+            for (l = edf->collection_dir->entries; l; l = l->next)
+              {
+                 Edje_Part_Collection_Directory_Entry *ce;
+            
+                 ce = l->data;
+                 lst = evas_list_append(lst, evas_stringshare_add(ce->entry));
+              }
+         }
+       _edje_cache_file_unref(edf);   
+     }
+   return lst;
+}
+
+/** Free file collection list
+ * @param lst The Evas_List of groups
+ *
+ * Frees the list returned by edje_file_collection_list().
+ */
+EAPI void
+edje_file_collection_list_free(Evas_List *lst)
+{
+   while (lst)
+     {
+       if (lst->data) evas_stringshare_del(lst->data);
+       lst = evas_list_remove(lst, lst->data);
+     }
+}
+
+/** Determine whether a group matching glob exists in an edje file.
+ * @param file The file path
+ * @param glob A glob to match on 
+ *
+ * @return 1 if a match is found, 0 otherwise
+ */   
+EAPI int
+edje_file_group_exists(const char *file, const char *glob)
+{
+   Edje_File *edf;
+   int error_ret = 0;
+
+   if ((!file) || (!*file)) return 0;
+   edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
+   if (edf != NULL)
+     {
+       if (edf->collection_dir)
+         {
+            Evas_List *l;
+       
+            for (l = edf->collection_dir->entries; l; l = l->next)
+              {
+                 Edje_Part_Collection_Directory_Entry *ce;
+            
+                 ce = l->data;
+                 if (_edje_glob_match(ce->entry, glob)) return 1;
+              }
+         }
+       _edje_cache_file_unref(edf);   
+     }
+   return 0;
+}
+
+
+/** Get data from the file level data block of an edje file
+ * @param file The path to the .edj file
+ * @param key The data key
+ * @return The string value of the data
+ *
+ * If an edje file is built from the following edc:
+ *
+ * data {
+ *   item: "key1" "value1";
+ *   item: "key2" "value2";
+ * }
+ * collections { ... }
+ * 
+ * Then, edje_file_data_get("key1") will return "value1"
+ */
+EAPI char *
+edje_file_data_get(const char *file, const char *key)
+{
+   Edje_File *edf;
+   char *str = NULL;
+   int error_ret = 0;
+   
+   if (key)
+     {
+       edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
+       if ((edf != NULL) && (edf->data_cache != NULL))
+         {
+            str = evas_hash_find(edf->data_cache, key);
+            if (str) str = strdup(str);
+            _edje_cache_file_unref(edf);
+         }
+     }
+   return str;
+}
+
+static int
+_edje_object_file_set_internal(Evas_Object *obj, const char *file, const char 
*part, Evas_List *group_path)
+{
    Edje *ed;
    int n;
    Evas_List *parts = NULL;
    Evas_List *old_swallows;
+   int group_path_started = 0;
    
    ed = _edje_fetch(obj);
    if (!ed) return 0;
@@ -95,6 +278,8 @@
                  ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
                  return 0;
               }
+            rp->edje = ed;
+            _edje_ref(rp->edje);
             rp->part = ep;
             parts = evas_list_append(parts, rp);
             rp->param1.description = ep->default_desc;
@@ -113,7 +298,7 @@
                  rp->object = evas_object_text_add(ed->evas);
                  evas_object_text_font_source_set(rp->object, ed->path);
               }
-            else if (ep->type == EDJE_PART_TYPE_SWALLOW)
+            else if (ep->type == EDJE_PART_TYPE_SWALLOW || ep->type == 
EDJE_PART_TYPE_GROUP)
               {
                  rp->object = evas_object_rectangle_add(ed->evas);
                  evas_object_color_set(rp->object, 0, 0, 0, 0);
@@ -131,7 +316,7 @@
               {
                  evas_object_smart_member_add(rp->object, ed->obj);
                  evas_object_layer_set(rp->object, 
evas_object_layer_get(ed->obj));
-                 if (ep->type != EDJE_PART_TYPE_SWALLOW)
+                 if (ep->type != EDJE_PART_TYPE_SWALLOW && ep->type != 
EDJE_PART_TYPE_GROUP)
                    {
                       if (ep->mouse_events)
                         {
@@ -252,6 +437,85 @@
            (evas_object_visible_get(obj)))
          evas_object_show(ed->clipper);
 
+       /* instantiate 'internal swallows' */
+       for (i = 0; i < ed->table_parts_size; i++)
+         {
+            Edje_Real_Part *rp;
+
+            rp = ed->table_parts[i];
+            if (!rp->part->type == EDJE_PART_TYPE_GROUP) continue;
+            if (rp->part->source)
+              {
+                 Evas_List *l;
+                 Evas_Object *child_obj;
+                 Edje *child_ed;
+                 const char *group_path_entry = 
evas_stringshare_add(rp->part->source);
+                 if (!group_path)
+                   {
+                      group_path = evas_list_append(NULL, 
evas_stringshare_add(part));
+                      group_path_started = 1;
+                   }
+                 /* make sure that this group isn't already in the tree of 
parents */
+                 for (l = group_path; l; l = l->next) 
+                   {
+                      if (l->data == group_path_entry)
+                        {
+                           _edje_thaw(ed);
+                           _edje_unblock(ed);
+                           _edje_unref(ed);
+                           _edje_file_del(ed);
+                           evas_stringshare_del(group_path_entry);
+                           if (group_path_started)
+                             {
+                                evas_stringshare_del(group_path->data);
+                                evas_list_free(group_path);
+                             }
+
+                           ed->load_error = 
EDJE_LOAD_ERROR_RECURSIVE_REFERENCE;
+                           return 0;
+                        }
+                   }
+
+                 child_obj = edje_object_add(ed->evas);
+                 group_path = evas_list_append(group_path, group_path_entry);
+                 if (!_edje_object_file_set_internal(child_obj, file, 
rp->part->source, group_path))
+                   {
+                      _edje_thaw(ed);
+                      _edje_unblock(ed);
+                      _edje_unref(ed);
+                      _edje_file_del(ed);
+
+                      if (group_path_started)
+                        {
+                           while (group_path)
+                             {
+                                evas_stringshare_del(group_path->data);
+                                group_path = evas_list_remove_list(group_path, 
group_path);
+                             }
+                        }
+                      ed->load_error = edje_object_load_error_get(child_obj);
+                      return 0;
+                   }
+                 child_ed = _edje_fetch(child_obj);
+                 child_ed->parent = evas_stringshare_add(rp->part->name);
+
+                 group_path = evas_list_remove(group_path, group_path_entry);
+                 evas_stringshare_del(group_path_entry);
+
+                 edje_object_signal_callback_add(child_obj, "*", "*", 
_cb_signal_repeat, obj);
+                 _edje_real_part_swallow(rp, child_obj);
+              }
+         }
+
+       if (group_path_started)
+         {
+            while (group_path)
+              {
+                 evas_stringshare_del(group_path->data);
+                 group_path = evas_list_remove_list(group_path, group_path);
+              }
+         }
+
        /* reswallow any swallows that existed before setting the file */
        if (old_swallows)
          {
@@ -287,180 +551,6 @@
    return 1;
 }
 
-/* FIXDOC: Verify/expand doc. */
-/** Get the file and group name that @a obj was loaded from
- * @param obj A valid Evas_Object handle
- * @param file A pointer to store a pointer to the filename in
- * @param part A pointer to store a pointer to the group name in
- *
- * This gets the EET file location and group for the given Evas_Object.
- * If @a obj is either not an edje file, or has not had its file/group set
- * using edje_object_file_set(), then both @a file and @a part will be set
- * to NULL.
- *
- * It is valid to pass in NULL for either @a file or @a part if you are not
- * interested in one of the values.
- */
-EAPI void
-edje_object_file_get(Evas_Object *obj, const char **file, const char **part)
-{
-   Edje *ed;
-   
-   ed = _edje_fetch(obj);
-   if (!ed)
-     {
-       if (file) *file = NULL;
-       if (part) *part = NULL;
-       return;
-     }
-   if (file) *file = ed->path;
-   if (part) *part = ed->part;
-}
-
-/* FIXDOC: Verify. return error? */
-/** Gets the Edje load error
- * @param obj A valid Evas_Object handle
- *
- * @return The Edje load error:\n
- * 0: No Error\n
- * 1: Generic Error\n
- * 2: Does not Exist\n
- * 3: Permission Denied\n
- * 4: Resource Allocation Failed\n
- * 5: Corrupt File\n
- * 6: Unknown Format\n
- * 7: Incompatible File
- */
-EAPI int
-edje_object_load_error_get(Evas_Object *obj)
-{
-   Edje *ed;
-   
-   ed = _edje_fetch(obj);
-   if (!ed) return EDJE_LOAD_ERROR_NONE;
-   return ed->load_error;
-}
-
-/** Get a list of groups in an edje file
- * @param file The path to the edje file
- *
- * @return The Evas_List of group names (char *)
- *
- * Note: the list must be freed using edje_file_collection_list_free()
- * when you are done with it.
- */   
-EAPI Evas_List *
-edje_file_collection_list(const char *file)
-{
-   Evas_List *lst = NULL;
-   Edje_File *edf;
-   int error_ret = 0;
-
-   if ((!file) || (!*file)) return NULL;
-   edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
-   if (edf != NULL)
-     {
-       if (edf->collection_dir)
-         {
-            Evas_List *l;
-       
-            for (l = edf->collection_dir->entries; l; l = l->next)
-              {
-                 Edje_Part_Collection_Directory_Entry *ce;
-            
-                 ce = l->data;
-                 lst = evas_list_append(lst, evas_stringshare_add(ce->entry));
-              }
-         }
-       _edje_cache_file_unref(edf);   
-     }
-   return lst;
-}
-
-/** Free file collection list
- * @param lst The Evas_List of groups
- *
- * Frees the list returned by edje_file_collection_list().
- */
-EAPI void
-edje_file_collection_list_free(Evas_List *lst)
-{
-   while (lst)
-     {
-       if (lst->data) evas_stringshare_del(lst->data);
-       lst = evas_list_remove(lst, lst->data);
-     }
-}
-
-/** Determine whether a group matching glob exists in an edje file.
- * @param file The file path
- * @param glob A glob to match on 
- *
- * @return 1 if a match is found, 0 otherwise
- */   
-EAPI int
-edje_file_group_exists(const char *file, const char *glob)
-{
-   Edje_File *edf;
-   int error_ret = 0;
-
-   if ((!file) || (!*file)) return 0;
-   edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
-   if (edf != NULL)
-     {
-       if (edf->collection_dir)
-         {
-            Evas_List *l;
-       
-            for (l = edf->collection_dir->entries; l; l = l->next)
-              {
-                 Edje_Part_Collection_Directory_Entry *ce;
-            
-                 ce = l->data;
-                 if (_edje_glob_match(ce->entry, glob)) return 1;
-              }
-         }
-       _edje_cache_file_unref(edf);   
-     }
-   return 0;
-}
-
-
-/** Get data from the file level data block of an edje file
- * @param file The path to the .edj file
- * @param key The data key
- * @return The string value of the data
- *
- * If an edje file is built from the following edc:
- *
- * data {
- *   item: "key1" "value1";
- *   item: "key2" "value2";
- * }
- * collections { ... }
- * 
- * Then, edje_file_data_get("key1") will return "value1"
- */
-EAPI char *
-edje_file_data_get(const char *file, const char *key)
-{
-   Edje_File *edf;
-   char *str = NULL;
-   int error_ret = 0;
-   
-   if (key)
-     {
-       edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
-       if ((edf != NULL) && (edf->data_cache != NULL))
-         {
-            str = evas_hash_find(edf->data_cache, key);
-            if (str) str = strdup(str);
-            _edje_cache_file_unref(edf);
-         }
-     }
-   return str;
-}
-
 void
 _edje_file_add(Edje *ed)
 {
@@ -491,7 +581,7 @@
        Edje_Real_Part *rp;
 
        rp = ed->table_parts[i];
-       if (!rp->swallowed_object) continue;
+       if (rp->part->type != EDJE_PART_TYPE_SWALLOW || !rp->swallowed_object) 
continue;
        swallows = evas_list_append(swallows, 
evas_stringshare_add(rp->part->name));
        swallows = evas_list_append(swallows, rp->swallowed_object);
      }
@@ -551,8 +641,10 @@
                  if (rp->part->mouse_events)
                     _edje_callbacks_del(rp->swallowed_object);
                  rp->swallowed_object = NULL;
-/* I think it would be better swallowed objects dont get deleted */
-/*               evas_object_del(rp->swallowed_object);*/
+
+/* Objects swallowed by the app do not get deleted, but those internally 
swallowed (GROUP type) do. */
+                 if (rp->part->type == EDJE_PART_TYPE_GROUP)
+                   evas_object_del(rp->swallowed_object);
               }
             if (rp->text.text) evas_stringshare_del(rp->text.text);
             if (rp->text.font) evas_stringshare_del(rp->text.font);
@@ -564,6 +656,7 @@
                  
_edje_collection_free_part_description_free(rp->custom.description);
               }
 
+            _edje_unref(rp->edje);
             free(rp);
          }
      }
@@ -859,3 +952,18 @@
    fdata = NULL;
 }
 #endif
+
+static void
+_cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char 
*source)
+{
+   Evas_Object *parent;
+   Edje *ed;
+   char new_src[4096]; /* XXX is this max reasonable? */
+
+   parent = data;
+   ed = _edje_fetch(obj);
+   if (!ed) return;
+   snprintf(new_src, sizeof(new_src), "%s%c%s", ed->parent, 
EDJE_PART_PATH_SEPARATOR, source);
+
+   edje_object_signal_emit(parent, signal, new_src);
+}
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_main.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -3 -r1.49 -r1.50
--- edje_main.c 21 Jan 2006 22:38:01 -0000      1.49
+++ edje_main.c 27 May 2007 05:28:07 -0000      1.50
@@ -85,6 +85,7 @@
    _edje_file_del(ed);
    if (ed->path) evas_stringshare_del(ed->path);
    if (ed->part) evas_stringshare_del(ed->part);
+   if (ed->parent) evas_stringshare_del(ed->parent);
    ed->path = NULL;
    ed->part = NULL;
    if ((ed->actions) || (ed->pending_actions))
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_message_queue.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- edje_message_queue.c        5 May 2007 15:14:16 -0000       1.26
+++ edje_message_queue.c        27 May 2007 05:28:07 -0000      1.27
@@ -8,6 +8,7 @@
 static Evas_List *msgq = NULL;
 static Evas_List *tmp_msgq = NULL;
 
+/* FIXME pass messages on to children? */
 EAPI void
 edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, 
void *msg)
 {
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.124
retrieving revision 1.125
diff -u -3 -r1.124 -r1.125
--- edje_private.h      26 May 2007 23:57:21 -0000      1.124
+++ edje_private.h      27 May 2007 05:28:07 -0000      1.125
@@ -132,7 +132,8 @@
 #define EDJE_PART_TYPE_SWALLOW   4
 #define EDJE_PART_TYPE_TEXTBLOCK 5
 #define EDJE_PART_TYPE_GRADIENT  6
-#define EDJE_PART_TYPE_LAST      7
+#define EDJE_PART_TYPE_GROUP     7
+#define EDJE_PART_TYPE_LAST      8
 
 #define EDJE_TEXT_EFFECT_NONE                0
 #define EDJE_TEXT_EFFECT_PLAIN               1
@@ -208,6 +209,8 @@
 #define EDJE_STATE_PARAM_VISIBLE      31
 #define EDJE_STATE_PARAM_LAST         32
 
+#define EDJE_PART_PATH_SEPARATOR ':'
+#define EDJE_PART_PATH_SEPARATOR_STRING ":"
 /*----------*/
 
 struct _Edje_File
@@ -421,6 +424,7 @@
       /* davinchi */
       int                events_id; /* If it is used as scrollbar */
    } dragable;
+   char                  *source;
 };
 
 struct _Edje_Part_Image_Id
@@ -562,6 +566,7 @@
 {
    const char           *path;
    const char           *part;
+   const char           *parent;
    
    Evas_Coord            x, y, w, h;
    struct {
@@ -617,6 +622,7 @@
 
 struct _Edje_Real_Part
 {
+   Edje                     *edje;
    int                       x, y, w, h;
    struct {
       int                    x, y, w, h;
@@ -951,6 +957,7 @@
 Evas_Font_Size _edje_text_size_calc(Evas_Font_Size size, Edje_Text_Class *tc);
 
 Edje_Real_Part   *_edje_real_part_get(Edje *ed, const char *part);
+Edje_Real_Part   *_edje_real_part_recursive_get(Edje *ed, const char *part);
 Edje_Color_Class *_edje_color_class_find(Edje *ed, const char *color_class);
 void              _edje_color_class_member_add(Edje *ed, const char 
*color_class);
 void              _edje_color_class_member_del(Edje *ed, const char 
*color_class);
@@ -973,6 +980,7 @@
 int               _edje_block_break(Edje *ed);
 void              _edje_block_violate(Edje *ed);    
 void              _edje_object_part_swallow_free_cb(void *data, Evas *e, 
Evas_Object *obj, void *event_info);
+void              _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object 
*obj_swallow);
 
 void          _edje_embryo_script_init      (Edje *ed);
 void          _edje_embryo_script_shutdown  (Edje *ed);
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -3 -r1.52 -r1.53
--- edje_program.c      15 Apr 2007 04:05:41 -0000      1.52
+++ edje_program.c      27 May 2007 05:28:07 -0000      1.53
@@ -1,3 +1,6 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
 #include "Edje.h"
 #include "edje_private.h"
 
@@ -185,6 +188,8 @@
  *  action: ...
  * }
  * @endcode
+ *
+ * FIXME should this signal be sent to children also?
  */
 EAPI void
 edje_object_signal_emit(Evas_Object *obj, const char *emission, const char 
*source)
@@ -212,6 +217,7 @@
    Edje *ed;
    double t;
    Evas_List *l;
+   int i;
    
    ed = _edje_fetch(obj);
    if (!ed) return;
@@ -235,6 +241,14 @@
        ed->paused = 1;
        ed->paused_at = ecore_time_get();
      }
+
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_play_set(rp->swallowed_object, play);
+     }
 }
 
 /* FIXDOC: Verify/Expand */
@@ -267,6 +281,7 @@
 {
    Edje *ed;
    Evas_List *l;
+   int i;
    
    ed = _edje_fetch(obj);
    if (!ed) return;   
@@ -304,6 +319,15 @@
          }
      }
    break_prog:
+
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_animation_set(rp->swallowed_object, on);
+     }
+
    _edje_thaw(ed);
    _edje_unblock(ed);
 }
===================================================================
RCS file: /cvs/e/e17/libs/edje/src/lib/edje_util.c,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -3 -r1.94 -r1.95
--- edje_util.c 26 May 2007 23:57:21 -0000      1.94
+++ edje_util.c 27 May 2007 05:28:07 -0000      1.95
@@ -1,6 +1,8 @@
 /*
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
+#include <stddef.h>
+#include <Ecore_Str.h>
 #include "Edje.h"
 #include "edje_private.h"
 
@@ -22,6 +24,8 @@
 static Evas_Bool _edje_color_class_list_foreach(Evas_Hash *hash, const char 
*key, void *data, void *fdata);
 static Evas_Bool _edje_text_class_list_foreach(Evas_Hash *hash, const char 
*key, void *data, void *fdata);
 
+Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
+
 /************************** API Routines **************************/
 
 /* FIXDOC: These all need to be looked over, Verified/Expanded upon.  I just 
got lazy and stopped putting FIXDOC next to each function in this file. */
@@ -125,9 +129,17 @@
 edje_object_freeze(Evas_Object *obj)
 {
    Edje *ed;
+   int i;
 
    ed = _edje_fetch(obj);
    if (!ed) return 0;
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_freeze(rp->swallowed_object);
+     }
    return _edje_freeze(ed);
 }
 
@@ -142,9 +154,17 @@
 edje_object_thaw(Evas_Object *obj)
 {
    Edje *ed;
+   int i;
 
    ed = _edje_fetch(obj);
    if (!ed) return 0;
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_thaw(rp->swallowed_object);
+     }
    return _edje_thaw(ed);
 }
 
@@ -329,6 +349,7 @@
    Edje *ed;
    Evas_List *l;
    Edje_Color_Class *cc;
+   int i;
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!color_class)) return;
@@ -391,6 +412,15 @@
    cc->a3 = a3;
    ed->color_classes = evas_list_append(ed->color_classes, cc);
    ed->dirty = 1;
+
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_color_class_set(rp->swallowed_object, color_class, r, g, 
b, a, r2, g2, b2, a2, r3, g3, b3, a3);
+     }
+
    _edje_recalc(ed);
 }
 
@@ -406,6 +436,7 @@
    Edje *ed;
    Evas_List *l;
    Edje_Color_Class *cc = NULL;
+   int i;
 
    if (!color_class) return;
 
@@ -422,7 +453,14 @@
          }
      }
 
-   ed = _edje_fetch(obj);
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_color_class_del(rp->swallowed_object, color_class);
+     }
+
    ed->dirty = 1;
    _edje_recalc(ed);
 }
@@ -573,6 +611,7 @@
    Edje *ed;
    Evas_List *l;
    Edje_Text_Class *tc;
+   int i;
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!text_class)) return;
@@ -620,6 +659,14 @@
    else tc->font = NULL;
    tc->size = size;
 
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_text_class_set(rp->swallowed_object, text_class, font, 
size);
+     }
+
    /* Add to edje's text class list */
    ed->text_classes = evas_list_append(ed->text_classes, tc);
    ed->dirty = 1;
@@ -641,7 +688,7 @@
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!part)) return 0;
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return 0;
    return 1;
 }
@@ -666,7 +713,7 @@
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!part)) return NULL;
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return NULL;
    return rp->object;
 }
@@ -699,7 +746,7 @@
        if (h) *h = 0;
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        if (x) *x = 0;
@@ -719,11 +766,20 @@
 edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, 
Evas_Object *obj, const char *part), void *data)
 {
    Edje *ed;
+   int i;
 
    ed = _edje_fetch(obj);
    if (!ed) return;
    ed->text_change.func = func;
    ed->text_change.data = data;
+
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+       Edje_Real_Part *rp;
+       rp = ed->table_parts[i];
+       if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
+         edje_object_text_change_cb_set(rp->swallowed_object, func, data);
+     }
 }
 
 /** Sets the text for an object part
@@ -739,7 +795,7 @@
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!part)) return;
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
    if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
        (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
@@ -751,9 +807,9 @@
    if (rp->text.text) evas_stringshare_del(rp->text.text);
    if (text) rp->text.text = evas_stringshare_add(text);
    else rp->text.text = NULL;
-   ed->dirty = 1;
-   _edje_recalc(ed);
-   if (ed->text_change.func) ed->text_change.func(ed->text_change.data, obj, 
part);
+   rp->edje->dirty = 1;
+   _edje_recalc(rp->edje);
+   if (rp->edje->text_change.func) 
rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
 }
 
 /** Returns the text of the object part
@@ -769,7 +825,7 @@
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!part)) return NULL;
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return NULL;
    if (rp->part->type == EDJE_PART_TYPE_TEXT)
      return rp->text.text;
@@ -793,95 +849,13 @@
 {
    Edje *ed;
    Edje_Real_Part *rp;
-   char *type;
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!part)) return;
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
-   if (rp->swallowed_object)
-     {
-       evas_object_smart_member_del(rp->swallowed_object);
-       evas_object_event_callback_del(rp->swallowed_object,
-                                      EVAS_CALLBACK_FREE,
-                                      _edje_object_part_swallow_free_cb);
-       evas_object_clip_unset(rp->swallowed_object);
-       evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
-        if (rp->part->mouse_events)
-          _edje_callbacks_del(rp->swallowed_object);
-       rp->swallowed_object = NULL;
-     }
-   if (!obj_swallow) return;
-   rp->swallowed_object = obj_swallow;
-   evas_object_smart_member_add(rp->swallowed_object, ed->obj);
-   if (rp->clip_to)
-     evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
-   else evas_object_clip_set(rp->swallowed_object, ed->clipper);
-   evas_object_stack_above(rp->swallowed_object, rp->object);
-   evas_object_event_callback_add(rp->swallowed_object,
-                                 EVAS_CALLBACK_FREE,
-                                 _edje_object_part_swallow_free_cb,
-                                 obj);
-   type = (char *)evas_object_type_get(obj_swallow);
-   rp->swallow_params.min.w = 0;
-   rp->swallow_params.min.w = 0;
-   rp->swallow_params.max.w = -1;
-   rp->swallow_params.max.h = -1;
-   if ((type) && (!strcmp(type, "edje")))
-     {
-       Evas_Coord w, h;
-       
-       edje_object_size_min_get(obj_swallow, &w, &h);
-       rp->swallow_params.min.w = w;
-       rp->swallow_params.min.h = h;
-       edje_object_size_max_get(obj_swallow, &w, &h);
-       rp->swallow_params.max.w = w;
-       rp->swallow_params.max.h = h;
-     }
-   else if ((type) && ((!strcmp(type, "text")) ||
-                      (!strcmp(type, "polygon")) ||
-                      (!strcmp(type, "line"))))
-     {
-       Evas_Coord w, h;
-       
-       evas_object_geometry_get(obj_swallow, NULL, NULL, &w, &h);
-       rp->swallow_params.min.w = w;
-       rp->swallow_params.min.h = h;
-       rp->swallow_params.max.w = w;
-       rp->swallow_params.max.h = h;
-     }
-     {
-       int w1, h1, w2, h2, am, aw, ah;
-       
-       w1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minw");
-       h1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minh");
-       w2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxw");
-       h2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxh");
-       am = (int)evas_object_data_get(obj_swallow, "\377 edje.aspm");
-       aw = (int)evas_object_data_get(obj_swallow, "\377 edje.aspw");
-       ah = (int)evas_object_data_get(obj_swallow, "\377 edje.asph");
-       rp->swallow_params.min.w = w1;
-       rp->swallow_params.min.h = h1;
-       if (w2 > 0) rp->swallow_params.max.w = w2;
-       if (h2 > 0) rp->swallow_params.max.h = h2;
-       rp->swallow_params.aspect.mode = am;
-       rp->swallow_params.aspect.w = aw;
-       rp->swallow_params.aspect.h = ah;
-       evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", 
rp);
-     }
-
-   if (rp->part->mouse_events)
-     {
-        _edje_callbacks_add(obj_swallow, ed, rp);
-       if (rp->part->repeat_events)
-           evas_object_repeat_events_set(obj_swallow, 1);
-     }
-   else
-     evas_object_pass_events_set(obj_swallow, 1);
-
-
-   ed->dirty = 1;
-   _edje_recalc(ed);
+   if (rp->part->type != EDJE_PART_TYPE_SWALLOW) return;
+   _edje_real_part_swallow(rp, obj_swallow);
 }
 
 static void
@@ -1022,36 +996,31 @@
 edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
 {
    Edje *ed;
-   int i;
+   Edje_Real_Part *rp;
 
-   ed = _edje_fetch(obj);
-   if ((!ed) || (!obj_swallow)) return;
-   for (i = 0; i < ed->table_parts_size; i++)
+   if (!obj_swallow) return;
+
+   rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 
edje.swallowing_part");
+   if (rp && rp->swallowed_object == obj_swallow)
      {
-       Edje_Real_Part *rp;
-       
-       rp = ed->table_parts[i];
-       if (rp->swallowed_object == obj_swallow)
-         {
-            evas_object_smart_member_del(rp->swallowed_object);
-            evas_object_event_callback_del(rp->swallowed_object,
-                                           EVAS_CALLBACK_FREE,
-                                           _edje_object_part_swallow_free_cb);
-            evas_object_clip_unset(rp->swallowed_object);
-            evas_object_data_del(rp->swallowed_object, "\377 
edje.swallowing_part");
-
-             if (rp->part->mouse_events)
-               _edje_callbacks_del(rp->swallowed_object);
-
-            rp->swallowed_object = NULL;
-            rp->swallow_params.min.w = 0;
-            rp->swallow_params.min.h = 0;
-            rp->swallow_params.max.w = 0;
-            rp->swallow_params.max.h = 0;
-            ed->dirty = 1;
-            _edje_recalc(ed);
-            return;
-         }
+       evas_object_smart_member_del(rp->swallowed_object);
+       evas_object_event_callback_del(rp->swallowed_object,
+             EVAS_CALLBACK_FREE,
+             _edje_object_part_swallow_free_cb);
+       evas_object_clip_unset(rp->swallowed_object);
+       evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
+
+       if (rp->part->mouse_events)
+         _edje_callbacks_del(rp->swallowed_object);
+
+       rp->swallowed_object = NULL;
+       rp->swallow_params.min.w = 0;
+       rp->swallow_params.min.h = 0;
+       rp->swallow_params.max.w = 0;
+       rp->swallow_params.max.h = 0;
+       rp->edje->dirty = 1;
+       _edje_recalc(rp->edje);
+       return;
      }
 }
 
@@ -1068,7 +1037,7 @@
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!part)) return NULL;
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return NULL;
    return rp->swallowed_object;
 }
@@ -1297,7 +1266,7 @@
        if (val_ret) *val_ret = 0;
        return "";
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        if (val_ret) *val_ret = 0;
@@ -1344,7 +1313,7 @@
      {
        return EDJE_DRAG_DIR_NONE;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return EDJE_DRAG_DIR_NONE;
@@ -1374,7 +1343,7 @@
      {
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return;
@@ -1390,8 +1359,8 @@
    if ((rp->drag.val.x == dx) && (rp->drag.val.y == dy)) return;
    rp->drag.val.x = dx;
    rp->drag.val.y = dy;
-   _edje_dragable_pos_set(ed, rp, dx, dy);
-   _edje_emit(ed, "drag,set", rp->part->name);
+   _edje_dragable_pos_set(rp->edje, rp, dx, dy);
+   _edje_emit(rp->edje, "drag,set", rp->part->name);
 }
 
 /** Get the dragable object location
@@ -1417,7 +1386,7 @@
        if (dy) *dy = 0;
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        if (dx) *dx = 0;
@@ -1451,7 +1420,7 @@
      {
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return;
@@ -1463,8 +1432,8 @@
    if ((rp->drag.size.x == dw) && (rp->drag.size.y == dh)) return;
    rp->drag.size.x = dw;
    rp->drag.size.y = dh;
-   ed->dirty = 1;
-   _edje_recalc(ed);
+   rp->edje->dirty = 1;
+   _edje_recalc(rp->edje);
 }
 
 /** Get the dragable object size
@@ -1488,7 +1457,7 @@
        if (dh) *dh = 0;
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        if (dw) *dw = 0;
@@ -1518,7 +1487,7 @@
      {
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return;
@@ -1552,7 +1521,7 @@
        if (dy) *dy = 0;
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        if (dx) *dx = 0;
@@ -1582,7 +1551,7 @@
      {
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return;
@@ -1616,7 +1585,7 @@
        if (dy) *dy = 0;
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        if (dx) *dx = 0;
@@ -1648,7 +1617,7 @@
      {
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return;
@@ -1661,8 +1630,8 @@
    rp->drag.val.x = CLAMP (rp->drag.val.x, 0.0, 1.0);
    rp->drag.val.y = CLAMP (rp->drag.val.y, 0.0, 1.0);
    if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return;
-   _edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
-   _edje_emit(ed, "drag,step", rp->part->name);
+   _edje_dragable_pos_set(rp->edje, rp, rp->drag.val.x, rp->drag.val.y);
+   _edje_emit(rp->edje, "drag,step", rp->part->name);
 }
 
 /** Pages x,y steps
@@ -1686,7 +1655,7 @@
      {
        return;
      }
-   rp = _edje_real_part_get(ed, (char *)part);
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp)
      {
        return;
@@ -1699,10 +1668,43 @@
    rp->drag.val.x = CLAMP (rp->drag.val.x, 0.0, 1.0);
    rp->drag.val.y = CLAMP (rp->drag.val.y, 0.0, 1.0);
    if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return;
-   _edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
-   _edje_emit(ed, "drag,page", rp->part->name);
+   _edje_dragable_pos_set(rp->edje, rp, rp->drag.val.x, rp->drag.val.y);
+   _edje_emit(rp->edje, "drag,page", rp->part->name);
+}
+
+Edje_Real_Part *
+_edje_real_part_recursive_get(Edje *ed, const char *part)
+{
+   Edje_Real_Part *rp;
+   char **path;
+   path = ecore_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
+   if (!path) return NULL;
+
+   //printf("recursive get: %s\n", part);
+   rp = _edje_real_part_recursive_get_helper(ed, path);
+
+   free(*path);
+   free(path);
+   return rp;
 }
 
+Edje_Real_Part *
+_edje_real_part_recursive_get_helper(Edje *ed, char **path)
+{
+   Edje_Real_Part *rp;
+   //printf("  lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
+   rp = _edje_real_part_get(ed, path[0]);
+   if (path[1] == NULL)
+     return rp;
+
+   if (!rp || rp->part->type != EDJE_PART_TYPE_GROUP || !rp->swallowed_object) 
return NULL;
+
+   ed = _edje_fetch(rp->swallowed_object);
+   if (!ed) return NULL;
+
+   path++;
+   return _edje_real_part_recursive_get_helper(ed, path);
+}
 
 
 /* Private Routines */
@@ -2034,3 +2036,94 @@
    e = NULL;
    event_info = NULL;
 }
+
+void
+_edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
+{
+   char *type;
+
+   if (rp->swallowed_object)
+     {
+       evas_object_smart_member_del(rp->swallowed_object);
+       evas_object_event_callback_del(rp->swallowed_object,
+                                      EVAS_CALLBACK_FREE,
+                                      _edje_object_part_swallow_free_cb);
+       evas_object_clip_unset(rp->swallowed_object);
+       evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
+        if (rp->part->mouse_events)
+          _edje_callbacks_del(rp->swallowed_object);
+       rp->swallowed_object = NULL;
+     }
+   if (!obj_swallow) return;
+   rp->swallowed_object = obj_swallow;
+   evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
+   if (rp->clip_to)
+     evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
+   else evas_object_clip_set(rp->swallowed_object, rp->edje->clipper);
+   evas_object_stack_above(rp->swallowed_object, rp->object);
+   evas_object_event_callback_add(rp->swallowed_object,
+                                 EVAS_CALLBACK_FREE,
+                                 _edje_object_part_swallow_free_cb,
+                                 rp->edje->obj);
+   type = (char *)evas_object_type_get(obj_swallow);
+   rp->swallow_params.min.w = 0;
+   rp->swallow_params.min.w = 0;
+   rp->swallow_params.max.w = -1;
+   rp->swallow_params.max.h = -1;
+   if ((type) && (!strcmp(type, "edje")))
+     {
+       Evas_Coord w, h;
+       
+       edje_object_size_min_get(obj_swallow, &w, &h);
+       rp->swallow_params.min.w = w;
+       rp->swallow_params.min.h = h;
+       edje_object_size_max_get(obj_swallow, &w, &h);
+       rp->swallow_params.max.w = w;
+       rp->swallow_params.max.h = h;
+     }
+   else if ((type) && ((!strcmp(type, "text")) ||
+                      (!strcmp(type, "polygon")) ||
+                      (!strcmp(type, "line"))))
+     {
+       Evas_Coord w, h;
+       
+       evas_object_geometry_get(obj_swallow, NULL, NULL, &w, &h);
+       rp->swallow_params.min.w = w;
+       rp->swallow_params.min.h = h;
+       rp->swallow_params.max.w = w;
+       rp->swallow_params.max.h = h;
+     }
+     {
+       int w1, h1, w2, h2, am, aw, ah;
+       
+       w1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minw");
+       h1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minh");
+       w2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxw");
+       h2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxh");
+       am = (int)evas_object_data_get(obj_swallow, "\377 edje.aspm");
+       aw = (int)evas_object_data_get(obj_swallow, "\377 edje.aspw");
+       ah = (int)evas_object_data_get(obj_swallow, "\377 edje.asph");
+       rp->swallow_params.min.w = w1;
+       rp->swallow_params.min.h = h1;
+       if (w2 > 0) rp->swallow_params.max.w = w2;
+       if (h2 > 0) rp->swallow_params.max.h = h2;
+       rp->swallow_params.aspect.mode = am;
+       rp->swallow_params.aspect.w = aw;
+       rp->swallow_params.aspect.h = ah;
+       evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", 
rp);
+     }
+
+   if (rp->part->mouse_events)
+     {
+        _edje_callbacks_add(obj_swallow, rp->edje, rp);
+       if (rp->part->repeat_events)
+           evas_object_repeat_events_set(obj_swallow, 1);
+     }
+   else
+     evas_object_pass_events_set(obj_swallow, 1);
+
+
+   rp->edje->dirty = 1;
+   _edje_recalc(rp->edje);
+}
+



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to