* edje: remove edje_convert use in edje_cc.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 15 Aug 2010 18:14:33 +0000 (18:14 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 15 Aug 2010 18:14:33 +0000 (18:14 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@51134 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/Makefile.am
src/bin/edje_cc.c
src/bin/edje_cc.h
src/bin/edje_cc_handlers.c
src/bin/edje_cc_out.c
src/bin/edje_convert.c
src/lib/edje_edit.c
src/lib/edje_private.h
src/lib/edje_util.c

index b011fe2..5b5a85d 100644 (file)
@@ -26,8 +26,7 @@ edje_cc_parse.c \
 edje_cc_mem.c \
 edje_cc_handlers.c \
 edje_cc_sources.c \
-edje_prefix.c \
-edje_convert.c
+edje_prefix.c
 
 edje_cc_LDADD = $(top_builddir)/src/lib/libedje.la $(ECORE_EVAS_LIBS) $(EVIL_LIBS)
 edje_cc_LDFLAGS = @lt_enable_auto_import@
index 3f36170..d6b1892 100644 (file)
@@ -195,7 +195,7 @@ main(int argc, char **argv)
    if (!edje_init())
      exit(-1);
 
-   edje_file = mem_alloc(SZ(Old_Edje_File));
+   edje_file = mem_alloc(SZ(Edje_File));
    edje_file->compiler = strdup("edje_cc");
    edje_file->version = EDJE_FILE_VERSION;
    edje_file->feature_ver = 1; /* increment this every time we add a field
index 795386f..9f8838f 100644 (file)
@@ -3,8 +3,6 @@
 
 #include <edje_private.h>
 
-#include "edje_convert.h"
-
 /*
  * On Windows, if the file is not opened in binary mode,
  * read does not return the correct size, because of
@@ -105,8 +103,8 @@ struct _SrcFile_List
 /* global fn calls */
 void    data_setup(void);
 void    data_write(void);
-void    data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest);
-void    data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest);
+void    data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest);
+void    data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest);
 void    data_queue_image_lookup(char *name, int *dest, Eina_Bool *set);
 void    data_queue_part_slave_lookup(int *master, int *slave);
 void    data_queue_image_slave_lookup(int *master, int *slave);
@@ -170,7 +168,7 @@ extern int                    max_quality;
 extern int                    line;
 extern Eina_List             *stack;
 extern Eina_List             *params;
-extern Old_Edje_File         *edje_file;
+extern Edje_File             *edje_file;
 extern Eina_List             *edje_collections;
 extern Eina_List             *externals;
 extern Eina_List             *fonts;
index 58f2caf..79749a7 100644 (file)
@@ -65,6 +65,9 @@
  * <table class="edcref" border="0">
  */
 
+static Edje_Part_Collection_Directory_Entry *current_de = NULL;
+static Edje_Program *current_program = NULL;
+
 static void st_externals_external(void);
 
 static void st_images_image(void);
@@ -781,6 +784,127 @@ statement_handler_num(void)
    return sizeof(statement_handlers) / sizeof (New_Object_Handler);
 }
 
+static Edje_Part_Description_Common *
+_edje_part_description_alloc(unsigned char type, const char *collection, const char *part)
+{
+   Edje_Part_Description_Common *result = NULL;
+
+   switch (type)
+     {
+      case EDJE_PART_TYPE_RECTANGLE:
+      case EDJE_PART_TYPE_SWALLOW:
+      case EDJE_PART_TYPE_GROUP:
+        result = mem_alloc(SZ(Edje_Part_Description_Common));
+        break;
+      case EDJE_PART_TYPE_TEXT:
+      case EDJE_PART_TYPE_TEXTBLOCK:
+       {
+          Edje_Part_Description_Text *ed;
+
+          ed = mem_alloc(SZ(Edje_Part_Description_Text));
+
+          ed->text.color3.r = 0;
+          ed->text.color3.g = 0;
+          ed->text.color3.b = 0;
+          ed->text.color3.a = 128;
+          ed->text.align.x = FROM_DOUBLE(0.5);
+          ed->text.align.y = FROM_DOUBLE(0.5);
+          ed->text.id_source = -1;
+          ed->text.id_text_source = -1;
+
+          result = &ed->common;
+          break;
+       }
+      case EDJE_PART_TYPE_IMAGE:
+       {
+          Edje_Part_Description_Image *ed;
+
+          ed = mem_alloc(SZ(Edje_Part_Description_Image));
+
+          ed->image.id = -1;
+          ed->image.fill.smooth = 1;
+          ed->image.fill.pos_rel_x = FROM_DOUBLE(0.0);
+          ed->image.fill.pos_abs_x = 0;
+          ed->image.fill.rel_x = FROM_DOUBLE(1.0);
+          ed->image.fill.abs_x = 0;
+          ed->image.fill.pos_rel_y = FROM_DOUBLE(0.0);
+          ed->image.fill.pos_abs_y = 0;
+          ed->image.fill.rel_y = FROM_DOUBLE(1.0);
+          ed->image.fill.abs_y = 0;
+          ed->image.fill.angle = 0;
+          ed->image.fill.spread = 0;
+          ed->image.fill.type = EDJE_FILL_TYPE_SCALE;
+
+          result = &ed->common;
+          break;
+       }
+      case EDJE_PART_TYPE_BOX:
+       {
+          Edje_Part_Description_Box *ed;
+
+          ed = mem_alloc(SZ(Edje_Part_Description_Box));
+
+          ed->box.layout = NULL;
+          ed->box.alt_layout = NULL;
+          ed->box.align.x = FROM_DOUBLE(0.5);
+          ed->box.align.y = FROM_DOUBLE(0.5);
+          ed->box.padding.x = 0;
+          ed->box.padding.y = 0;
+
+          result = &ed->common;
+          break;
+       }
+      case EDJE_PART_TYPE_TABLE:
+       {
+          Edje_Part_Description_Table *ed;
+
+          ed = mem_alloc(SZ(Edje_Part_Description_Table));
+
+          ed->table.homogeneous = EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE;
+          ed->table.align.x = FROM_DOUBLE(0.5);
+          ed->table.align.y = FROM_DOUBLE(0.5);
+          ed->table.padding.x = 0;
+          ed->table.padding.y = 0;
+
+          result = &ed->common;
+          break;
+       }
+      case EDJE_PART_TYPE_EXTERNAL:
+       {
+          Edje_Part_Description_External *ed;
+
+          ed = mem_alloc(SZ(Edje_Part_Description_External));
+
+          ed->external_params = NULL;
+
+          result = &ed->common;
+          break;
+       }
+     }
+
+   if (!result)
+     {
+       ERR("%s: Error. Unknow type %i of part %s in collection %s.", progname, type, part, collection);
+       exit(-1);
+     }
+
+   return result;
+}
+
+static void
+_edje_program_check(const char *name, Edje_Program *me, Edje_Program **pgrms, unsigned int count)
+{
+   unsigned int i;
+
+   for (i = 0; i < count; ++i)
+     if (pgrms[i] != me && pgrms[i]->name && (!strcmp(name, pgrms[i]->name)))
+       {
+         ERR("%s: Error. parse error %s:%i. There is already a program of the name %s\n",
+             progname, file_in, line - 1, name);
+         exit(-1);
+       }
+}
+
 /*****/
 
 /**
@@ -813,12 +937,11 @@ static void
 st_externals_external(void)
 {
    External *ex;
-   Edje_External_Directory_Entry *ext;
 
    check_arg_count(1);
 
    if (!edje_file->external_dir)
-     edje_file->external_dir = mem_alloc(SZ(Old_Edje_External_Directory));
+     edje_file->external_dir = mem_alloc(SZ(Edje_External_Directory));
 
    ex = mem_alloc(SZ(External));
    ex->name = parse_str(0);
@@ -840,9 +963,18 @@ st_externals_external(void)
 
    if (edje_file->external_dir)
      {
-       ext = mem_alloc(SZ(Edje_External_Directory_Entry));
-       ext->entry = mem_strdup(ex->name);
-       edje_file->external_dir->entries = eina_list_append(edje_file->external_dir->entries, ext);
+       edje_file->external_dir->entries_count++;
+       edje_file->external_dir->entries = realloc(edje_file->external_dir->entries,
+                                                  sizeof (Edje_External_Directory) * edje_file->external_dir->entries_count);
+       memset(edje_file->external_dir->entries + edje_file->external_dir->entries_count - 1,
+              0, sizeof (Edje_External_Directory));
+       if (!edje_file->external_dir->entries)
+         {
+            ERR("%s: Error. not enought memory", progname);
+            exit(-1);
+         }
+
+       edje_file->external_dir->entries[edje_file->external_dir->entries_count - 1].entry = mem_strdup(ex->name);
      }
 }
 
@@ -903,28 +1035,37 @@ static void
 st_images_image(void)
 {
    Edje_Image_Directory_Entry *img;
+   const char *tmp;
+   unsigned int i;
    int v;
 
    if (!edje_file->image_dir)
-     edje_file->image_dir = mem_alloc(SZ(Old_Edje_Image_Directory));
-   img = mem_alloc(SZ(Edje_Image_Directory_Entry));
-   img->entry = parse_str(0);
-     {
-       Eina_List *l;
-       Edje_Image_Directory_Entry *limg;
+     edje_file->image_dir = mem_alloc(SZ(Edje_Image_Directory));
 
-       EINA_LIST_FOREACH(edje_file->image_dir->entries, l, limg)
-         {
-            if (!strcmp(limg->entry, img->entry))
-              {
-                 free((char*) img->entry);
-                 free(img);
-                 return;
-              }
-         }
+   tmp = parse_str(0);
+
+   for (i = 0; i < edje_file->image_dir->entries_count; ++i)
+     if (!strcmp(edje_file->image_dir->entries[i].entry, tmp))
+       {
+         free((char*) tmp);
+         return;
+       }
+
+   edje_file->image_dir->entries_count++;
+   edje_file->image_dir->entries = realloc(edje_file->image_dir->entries,
+                                          sizeof (Edje_Image_Directory_Entry) * edje_file->image_dir->entries_count);
+   memset(edje_file->image_dir->entries + edje_file->image_dir->entries_count - 1,
+         0, sizeof (Edje_Image_Directory_Entry));
+   if (!edje_file->image_dir->entries)
+     {
+       ERR("%s: Error. No enought memory.", progname);
+       exit(-1);
      }
-   edje_file->image_dir->entries = eina_list_append(edje_file->image_dir->entries, img);
-   img->id = eina_list_count(edje_file->image_dir->entries) - 1;
+
+   img = edje_file->image_dir->entries + edje_file->image_dir->entries_count - 1;
+
+   img->entry = tmp;
+   img->id = edje_file->image_dir->entries_count - 1;
    v = parse_enum(1,
                  "RAW", 0,
                  "COMP", 1,
@@ -996,13 +1137,20 @@ st_images_image(void)
 static void
 ob_images_set(void)
 {
-   Edje_Image_Directory_Set *set;
-
    if (!edje_file->image_dir)
-     edje_file->image_dir = mem_alloc(SZ(Old_Edje_Image_Directory));
-   set = mem_alloc(SZ(Edje_Image_Directory_Set));
-   set->id = eina_list_count(edje_file->image_dir->sets);
-   edje_file->image_dir->sets = eina_list_append(edje_file->image_dir->sets, set);
+     edje_file->image_dir = mem_alloc(SZ(Edje_Image_Directory));
+
+   edje_file->image_dir->sets_count++;
+   edje_file->image_dir->sets = realloc(edje_file->image_dir->sets,
+                                       sizeof (Edje_Image_Directory_Set) * edje_file->image_dir->sets_count);
+   memset(edje_file->image_dir->sets + edje_file->image_dir->sets_count - 1,
+         0, sizeof (Edje_Image_Directory_Set));
+   if (!edje_file->image_dir->sets)
+     {
+       ERR("%s: Error. Not enought memory.", progname);
+       exit(-1);
+     }
+   edje_file->image_dir->sets[edje_file->image_dir->sets_count - 1].id = edje_file->image_dir->sets_count - 1;
 }
 
 /**
@@ -1019,12 +1167,9 @@ ob_images_set(void)
 static void
 st_images_set_name(void)
 {
-   Edje_Image_Directory_Set *set;
-
    check_arg_count(1);
 
-   set = eina_list_data_get(eina_list_last(edje_file->image_dir->sets));
-   set->name = parse_str(0);
+   edje_file->image_dir->sets[edje_file->image_dir->sets_count - 1].name = parse_str(0);
 }
 
 static void
@@ -1033,7 +1178,7 @@ ob_images_set_image(void)
    Edje_Image_Directory_Set_Entry *entry;
    Edje_Image_Directory_Set *set;
 
-   set = eina_list_data_get(eina_list_last(edje_file->image_dir->sets));
+   set = edje_file->image_dir->sets + edje_file->image_dir->sets_count - 1;
 
    entry = mem_alloc(SZ(Edje_Image_Directory_Set_Entry));
 
@@ -1045,10 +1190,9 @@ st_images_set_image_image(void)
 {
    Edje_Image_Directory_Set_Entry *entry;
    Edje_Image_Directory_Set *set;
-   Edje_Image_Directory_Entry *img;
-   Eina_List *l;
+   unsigned int i;
 
-   set =  eina_list_data_get(eina_list_last(edje_file->image_dir->sets));
+   set = edje_file->image_dir->sets + edje_file->image_dir->sets_count - 1;
    entry = eina_list_data_get(eina_list_last(set->entries));
 
    /* Add the image to the global pool with the same syntax. */
@@ -1056,12 +1200,12 @@ st_images_set_image_image(void)
 
    entry->name = parse_str(0);
 
-   EINA_LIST_FOREACH(edje_file->image_dir->entries, l, img)
-     if (!strcmp(img->entry, entry->name))
+   for (i = 0; i < edje_file->image_dir->entries_count; ++i)
+     if (!strcmp(edje_file->image_dir->entries[i].entry, entry->name))
        {
-        entry->id = img->id;
+        entry->id = i;
         return;
-       }  
+       }
 }
 
 /**
@@ -1080,8 +1224,8 @@ st_images_set_image_size(void)
 {
    Edje_Image_Directory_Set_Entry *entry;
    Edje_Image_Directory_Set *set;
-  
-   set =  eina_list_data_get(eina_list_last(edje_file->image_dir->sets));
+
+   set = edje_file->image_dir->sets + edje_file->image_dir->sets_count - 1;
    entry = eina_list_data_get(eina_list_last(set->entries));
 
    entry->size.min.w = parse_int(0);
@@ -1130,40 +1274,25 @@ static void
 st_fonts_font(void)
 {
    Font *fn;
-   Edje_Font_Directory_Entry *fnt;
 
    check_arg_count(2);
 
-   if (!edje_file->font_dir)
-     edje_file->font_dir = mem_alloc(SZ(Old_Edje_Font_Directory));
+   if (!edje_file->fonts)
+     edje_file->fonts = eina_hash_string_small_new(free);
 
    fn = mem_alloc(SZ(Font));
    fn->file = parse_str(0);
    fn->name = parse_str(1);
-     {
-       Eina_List *l;
-       Font *lfn;
 
-       EINA_LIST_FOREACH(fonts, l, lfn)
-         {
-            if (!strcmp(lfn->name, fn->name))
-              {
-                 free(fn->file);
-                 free(fn->name);
-                 free(fn);
-                 return;
-              }
-         }
-     }
-   fonts = eina_list_append(fonts, fn);
-
-   if (edje_file->font_dir)
+   if (eina_hash_find(edje_file->fonts, fn->name))
      {
-       fnt = mem_alloc(SZ(Edje_Font_Directory_Entry));
-       fnt->entry = mem_strdup(fn->name);
-       fnt->file = mem_strdup(fn->file);
-       edje_file->font_dir->entries = eina_list_append(edje_file->font_dir->entries, fnt);
+       free(fn->file);
+       free(fn->name);
+       free(fn);
+       return;
      }
+
+   eina_hash_direct_add(edje_file->fonts, fn->name, fn);
 }
 
 /**
@@ -1194,14 +1323,21 @@ st_fonts_font(void)
 static void
 st_data_item(void)
 {
-   Old_Edje_Data *di;
+   Edje_String *es;
+   char *key;
 
    check_arg_count(2);
 
-   di = mem_alloc(SZ(Old_Edje_Data));
-   di->key = parse_str(0);
-   di->value = parse_str(1);
-   edje_file->data = eina_list_append(edje_file->data, di);
+   key = parse_str(0);
+
+   es = mem_alloc(SZ(Edje_String));
+   es->str = parse_str(1);
+
+   if (!edje_file->data)
+     edje_file->data = eina_hash_string_small_new(free);
+
+   /* FIXME: check if data already exist */
+   eina_hash_direct_add(edje_file->data, key, es);
 }
 
 /**
@@ -1221,17 +1357,19 @@ st_data_file(void)
 {
    const char *data;
    const char *over;
-   Old_Edje_Data *di;
+   Edje_String *es;
    char *filename;
    char *value;
+   char *key;
    int fd;
    int i;
    struct stat buf;
 
    check_arg_count(2);
 
-   di = mem_alloc(SZ(Old_Edje_Data));
-   di->key = parse_str(0);
+   key = parse_str(0);
+
+   es = mem_alloc(SZ(Edje_String));
    filename = parse_str(1);
 
    fd = open(filename, O_RDONLY | O_BINARY, S_IRUSR | S_IWUSR);
@@ -1272,8 +1410,9 @@ st_data_file(void)
    munmap((void*)data, buf.st_size);
    close(fd);
 
-   di->value = value;
-   edje_file->data = eina_list_append(edje_file->data, di);
+   es->str = value;
+
+   eina_hash_direct_add(edje_file->data, key, es);
 
    free(filename);
 }
@@ -1556,8 +1695,8 @@ st_styles_style_tag(void)
 static void
 ob_collections(void)
 {
-   if (!edje_file->collection_dir)
-     edje_file->collection_dir = mem_alloc(SZ(Old_Edje_Part_Collection_Directory));
+   if (!edje_file->collection)
+     edje_file->collection = eina_hash_string_small_new(NULL);
 }
 
 /**
@@ -1592,17 +1731,21 @@ ob_collections(void)
 static void
 ob_collections_group(void)
 {
-   Edje_Part_Collection_Directory_Entry *de;
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    Code *cd;
-   
-   de = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
-   edje_file->collection_dir->entries = eina_list_append(edje_file->collection_dir->entries, de);
-   de->id = eina_list_count(edje_file->collection_dir->entries) - 1;
 
-   pc = mem_alloc(SZ(Old_Edje_Part_Collection));
+   if (current_de != NULL && current_de->entry == NULL)
+     {
+       ERR("%p: Error. A collection without a name was detected, that's not allowed.", progname);
+       exit(-1);
+     }
+
+   current_de = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
+   current_de->id = eina_list_count(edje_collections);
+
+   pc = mem_alloc(SZ(Edje_Part_Collection));
    edje_collections = eina_list_append(edje_collections, pc);
-   pc->id = eina_list_count(edje_collections) - 1;
+   pc->id = current_de->id;
 
    cd = mem_alloc(SZ(Code));
    codes = eina_list_append(codes, cd);
@@ -1624,51 +1767,42 @@ ob_collections_group(void)
 static void
 st_collections_group_name(void)
 {
-   Edje_Part_Collection_Directory_Entry *de, *de_other, *alias;
-   Eina_List *l, *l2;
+   Edje_Part_Collection_Directory_Entry *older;
+   Edje_Part_Collection *current_pc;
 
    check_arg_count(1);
 
-   de = eina_list_data_get(eina_list_last(edje_file->collection_dir->entries));
-   de->entry = parse_str(0);
-   EINA_LIST_FOREACH(edje_file->collection_dir->entries, l, de_other)
+   current_pc = eina_list_data_get(eina_list_last(edje_collections));
+
+   current_de->entry = parse_str(0);
+   current_pc->part = current_de->entry;
+
+   older = eina_hash_find(edje_file->collection, current_de->entry);
+
+   if (older)
      {
-       if ((de_other != de) && (de_other->entry) && 
-           (!strcmp(de->entry, de_other->entry)))
+       Edje_Part_Collection *pc;
+       Eina_List *l;
+       Code *cd;
+       int i = 0;
+
+       pc = eina_list_nth(edje_collections, older->id);
+       cd = eina_list_nth(codes, older->id);
+
+       eina_hash_del(edje_file->collection, current_de->entry, older);
+       edje_collections = eina_list_remove(edje_collections, pc);
+       codes = eina_list_remove(codes, cd);
+
+       EINA_LIST_FOREACH(edje_collections, l, pc)
          {
-            Old_Edje_Part_Collection *pc;
-            Code *cd;
-            int i;
-            
-            pc = eina_list_nth(edje_collections, de_other->id);
-            cd = eina_list_nth(codes, de_other->id);
-            
-            edje_file->collection_dir->entries = 
-              eina_list_remove(edje_file->collection_dir->entries, de_other);
-            edje_collections = 
-              eina_list_remove(edje_collections, pc);
-            codes =
-              eina_list_remove(codes, cd);
-
-            for (i = 0, l = edje_file->collection_dir->entries; l; l = eina_list_next(l), i++)
-              {
-                 de_other = eina_list_data_get(l);
-                  for (l2 = aliases; l2; l2 = l2->next)
-                    {
-                       alias = l2->data;
-                       if (alias->id == de_other->id)
-                         alias->id = i;
-                    }
-                 de_other->id = i;
-              }
-            for (i = 0, l = edje_collections; l; l = eina_list_next(l), i++)
-              {
-                 pc = eina_list_data_get(l);
-                 pc->id = i;
-              }
-            break;
+            older = eina_hash_find(edje_file->collection, pc->part);
+
+            pc->id = i++;
+            if (older) older->id = pc->id;
          }
      }
+
+   eina_hash_direct_add(edje_file->collection, current_de->entry, current_de);
 }
 
 /**
@@ -1685,7 +1819,7 @@ st_collections_group_name(void)
 static void
 st_collections_group_script_only(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
@@ -1696,7 +1830,7 @@ st_collections_group_script_only(void)
 static void
 st_collections_group_lua_script_only(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
@@ -1718,13 +1852,12 @@ st_collections_group_lua_script_only(void)
 static void
 st_collections_group_alias(void)
 {
-   Edje_Part_Collection_Directory_Entry *de, *alias;
+   Edje_Part_Collection_Directory_Entry *alias;
 
    check_arg_count(1);
-   de = eina_list_data_get(eina_list_last(edje_file->collection_dir->entries));
 
    alias = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
-   alias->id = de->id;
+   alias->id = current_de->id;
    alias->entry = parse_str(0);
 
    aliases = eina_list_append(aliases, alias);
@@ -1744,7 +1877,7 @@ st_collections_group_alias(void)
 static void
 st_collections_group_min(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
 
    check_arg_count(2);
 
@@ -1767,7 +1900,7 @@ st_collections_group_min(void)
 static void
 st_collections_group_max(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
 
    check_arg_count(2);
 
@@ -1867,16 +2000,23 @@ ob_collections_group_lua_script(void)
 static void
 st_collections_group_data_item(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Data *di;
+   Edje_Part_Collection *pc;
+   Edje_String *es;
+   char *key;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   di = mem_alloc(SZ(Old_Edje_Data));
-   di->key = parse_str(0);
-   di->value = parse_str(1);
-   pc->data = eina_list_append(pc->data, di);
+
+   if (!pc->data)
+     pc->data = eina_hash_string_small_new(free);
+
+   key = parse_str(0);
+
+   es = mem_alloc(SZ(Edje_String));
+   es->str = parse_str(1);
+
+   eina_hash_direct_add(pc->data, key, es);
 }
 
 /**
@@ -1898,7 +2038,7 @@ st_collections_group_data_item(void)
 static void
 st_collections_group_parts_alias(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
 
    check_arg_count(2);
 
@@ -1944,13 +2084,22 @@ st_collections_group_parts_alias(void)
 static void
 ob_collections_group_parts_part(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+
+   ep = mem_alloc(SZ(Edje_Part));
 
-   ep = mem_alloc(SZ(Old_Edje_Part));
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   pc->parts = eina_list_append(pc->parts, ep);
-   ep->id = eina_list_count(pc->parts) - 1;
+   pc->parts_count++;
+   pc->parts = realloc(pc->parts, pc->parts_count * sizeof (Edje_Part *));
+   if (!pc->parts)
+     {
+       ERR("%s: Error. Not enought memory.", progname);
+       exit(-1);
+     }
+   pc->parts[pc->parts_count - 1] = ep;
+
+   ep->id = pc->parts_count - 1;
    ep->type = EDJE_PART_TYPE_IMAGE;
    ep->mouse_events = 1;
    ep->repeat_events = 0;
@@ -1980,22 +2129,21 @@ ob_collections_group_parts_part(void)
 static void
 st_collections_group_parts_part_name(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->name = parse_str(0);
 
    {
-       Eina_List *l;
-       Old_Edje_Part *lep;
+       unsigned int i;
 
-       EINA_LIST_FOREACH(pc->parts, l, lep)
+       for (i = 0; i < pc->parts_count - 1; ++i)
          {
-            if ((lep != ep) && (lep->name) && (!strcmp(lep->name, ep->name)))
+            if (pc->parts[i]->name && (!strcmp(pc->parts[i]->name, ep->name)))
               {
                  ERR("%s: Error. parse error %s:%i. There is already a part of the name %s",
                      progname, file_in, line - 1, ep->name);
@@ -2028,13 +2176,13 @@ st_collections_group_parts_part_name(void)
 static void
 st_collections_group_parts_part_type(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->type = parse_enum(0,
                         "NONE", EDJE_PART_TYPE_NONE,
                         "RECT", EDJE_PART_TYPE_RECTANGLE,
@@ -2047,6 +2195,13 @@ st_collections_group_parts_part_type(void)
                         "TABLE", EDJE_PART_TYPE_TABLE,
                         "EXTERNAL", EDJE_PART_TYPE_EXTERNAL,
                         NULL);
+
+   if (ep->default_desc || ep->other.desc_count > 0)
+     {
+       ERR("%s: Error. parse error %s:%i. You can't change type after defining description in part of the name %s",
+           progname, file_in, line - 1, ep->name);
+       exit(-1);
+     }
 }
 
 /**
@@ -2064,13 +2219,13 @@ st_collections_group_parts_part_type(void)
 static void
 st_collections_group_parts_part_mouse_events(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->mouse_events = parse_bool(0);
 }
 
@@ -2088,13 +2243,13 @@ st_collections_group_parts_part_mouse_events(void)
 static void
 st_collections_group_parts_part_repeat_events(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->repeat_events = parse_bool(0);
 }
 
@@ -2116,13 +2271,13 @@ st_collections_group_parts_part_repeat_events(void)
 static void
 st_collections_group_parts_part_ignore_flags(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_min_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->ignore_flags = parse_flags(0,
                                  "NONE", EVAS_EVENT_FLAG_NONE,
                                  "ON_HOLD", EVAS_EVENT_FLAG_ON_HOLD,
@@ -2148,13 +2303,13 @@ st_collections_group_parts_part_ignore_flags(void)
 static void
 st_collections_group_parts_part_scale(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->scale = parse_bool(0);
 }
 
@@ -2177,13 +2332,13 @@ st_collections_group_parts_part_scale(void)
 static void
 st_collections_group_parts_part_pointer_mode(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->pointer_mode = parse_enum(0,
                                 "AUTOGRAB", EVAS_OBJECT_POINTER_MODE_AUTOGRAB,
                                 "NOGRAB", EVAS_OBJECT_POINTER_MODE_NOGRAB,
@@ -2204,13 +2359,13 @@ st_collections_group_parts_part_pointer_mode(void)
 static void
 st_collections_group_parts_part_precise_is_inside(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->precise_is_inside = parse_bool(0);
 }
 
@@ -2229,13 +2384,13 @@ st_collections_group_parts_part_precise_is_inside(void)
 static void
 st_collections_group_parts_part_use_alternate_font_metrics(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->use_alternate_font_metrics = parse_bool(0);
 }
 
@@ -2253,13 +2408,13 @@ st_collections_group_parts_part_use_alternate_font_metrics(void)
 static void
 st_collections_group_parts_part_clip_to_id(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
      {
        char *name;
 
@@ -2286,13 +2441,13 @@ st_collections_group_parts_part_clip_to_id(void)
 static void
 st_collections_group_parts_part_source(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    //FIXME: validate this somehow (need to decide on the format also)
    ep->source = parse_str(0);
@@ -2313,13 +2468,13 @@ st_collections_group_parts_part_source(void)
 static void
 st_collections_group_parts_part_source2(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    //FIXME: validate this somehow (need to decide on the format also)
    ep->source2 = parse_str(0);
@@ -2340,13 +2495,13 @@ st_collections_group_parts_part_source2(void)
 static void
 st_collections_group_parts_part_source3(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    //FIXME: validate this somehow (need to decide on the format also)
    ep->source3 = parse_str(0);
@@ -2367,13 +2522,13 @@ st_collections_group_parts_part_source3(void)
 static void
 st_collections_group_parts_part_source4(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    //FIXME: validate this somehow (need to decide on the format also)
    ep->source4 = parse_str(0);
@@ -2394,13 +2549,13 @@ st_collections_group_parts_part_source4(void)
 static void
 st_collections_group_parts_part_source5(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    //FIXME: validate this somehow (need to decide on the format also)
    ep->source5 = parse_str(0);
@@ -2421,13 +2576,13 @@ st_collections_group_parts_part_source5(void)
 static void
 st_collections_group_parts_part_source6(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    //FIXME: validate this somehow (need to decide on the format also)
    ep->source6 = parse_str(0);
@@ -2457,13 +2612,13 @@ st_collections_group_parts_part_source6(void)
 static void
 st_collections_group_parts_part_effect(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->effect = parse_enum(0,
                "NONE", EDJE_TEXT_EFFECT_NONE,
                "PLAIN", EDJE_TEXT_EFFECT_PLAIN,
@@ -2501,13 +2656,13 @@ st_collections_group_parts_part_effect(void)
 static void
 st_collections_group_parts_part_entry_mode(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->entry_mode = parse_enum(0,
                               "NONE", EDJE_ENTRY_EDIT_MODE_NONE,
                               "PLAIN", EDJE_ENTRY_EDIT_MODE_SELECTABLE,
@@ -2535,13 +2690,13 @@ st_collections_group_parts_part_entry_mode(void)
 static void
 st_collections_group_parts_part_select_mode(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->select_mode = parse_enum(0,
                                 "DEFAULT", EDJE_ENTRY_SELECTION_MODE_DEFAULT,
                                 "EXPLICIT", EDJE_ENTRY_SELECTION_MODE_EXPLICIT,
@@ -2562,13 +2717,13 @@ st_collections_group_parts_part_select_mode(void)
 static void
 st_collections_group_parts_part_multiline(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->multiline = parse_bool(0);
 }
 
@@ -2612,13 +2767,13 @@ st_collections_group_parts_part_multiline(void)
 static void
 st_collections_group_parts_part_dragable_x(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(3);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->dragable.x = parse_int_range(0, -1, 1);
    ep->dragable.step_x = parse_int_range(1, 0, 0x7fffffff);
    ep->dragable.count_x = parse_int_range(2, 0, 0x7fffffff);
@@ -2642,13 +2797,13 @@ st_collections_group_parts_part_dragable_x(void)
 static void
 st_collections_group_parts_part_dragable_y(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(3);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
    ep->dragable.y = parse_int_range(0, -1, 1);
    ep->dragable.step_y = parse_int_range(1, 0, 0x7fffffff);
    ep->dragable.count_y = parse_int_range(2, 0, 0x7fffffff);
@@ -2669,13 +2824,13 @@ st_collections_group_parts_part_dragable_y(void)
 static void
 st_collections_group_parts_part_dragable_confine(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
      {
        char *name;
 
@@ -2699,13 +2854,13 @@ st_collections_group_parts_part_dragable_confine(void)
 static void
 st_collections_group_parts_part_dragable_events(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
      {
        char *name;
 
@@ -2750,12 +2905,12 @@ st_collections_group_parts_part_dragable_events(void)
 */
 static void ob_collections_group_parts_part_box_items_item(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_BOX) && (ep->type != EDJE_PART_TYPE_TABLE))
      {
@@ -2765,8 +2920,16 @@ static void ob_collections_group_parts_part_box_items_item(void)
        exit(-1);
      }
 
+   ep->items_count++;
+   ep->items = realloc(ep->items, sizeof (Edje_Pack_Element*) * ep->items_count);
+   if (!ep->items)
+     {
+       ERR("%s: Error. Not enought memory.", progname);
+       exit(-1);
+     }
+
    item = mem_alloc(SZ(Edje_Pack_Element));
-   ep->items = eina_list_append(ep->items, item);
+   ep->items[ep->items_count - 1] = item;
    item->type = EDJE_PART_TYPE_GROUP;
    item->name = NULL;
    item->source = NULL;
@@ -2806,16 +2969,15 @@ static void ob_collections_group_parts_part_box_items_item(void)
 */
 static void st_collections_group_parts_part_box_items_item_type(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-
-   item = eina_list_data_get(eina_list_last(ep->items));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
      {
        char *s;
@@ -2845,16 +3007,16 @@ static void st_collections_group_parts_part_box_items_item_type(void)
 */
 static void st_collections_group_parts_part_box_items_item_name(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->name = parse_str(0);
 }
 
@@ -2870,16 +3032,16 @@ static void st_collections_group_parts_part_box_items_item_name(void)
 */
 static void st_collections_group_parts_part_box_items_item_source(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->source = parse_str(0);
 }
 
@@ -2895,16 +3057,16 @@ static void st_collections_group_parts_part_box_items_item_source(void)
 */
 static void st_collections_group_parts_part_box_items_item_min(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->min.w = parse_int_range(0, 0, 0x7ffffff);
    item->min.h = parse_int_range(1, 0, 0x7ffffff);
 }
@@ -2921,16 +3083,16 @@ static void st_collections_group_parts_part_box_items_item_min(void)
 */
 static void st_collections_group_parts_part_box_items_item_prefer(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->prefer.w = parse_int_range(0, 0, 0x7ffffff);
    item->prefer.h = parse_int_range(1, 0, 0x7ffffff);
 }
@@ -2946,16 +3108,16 @@ static void st_collections_group_parts_part_box_items_item_prefer(void)
 */
 static void st_collections_group_parts_part_box_items_item_max(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->max.w = parse_int_range(0, 0, 0x7ffffff);
    item->max.h = parse_int_range(1, 0, 0x7ffffff);
 }
@@ -2972,16 +3134,16 @@ static void st_collections_group_parts_part_box_items_item_max(void)
 */
 static void st_collections_group_parts_part_box_items_item_padding(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(4);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->padding.l = parse_int_range(0, 0, 0x7ffffff);
    item->padding.r = parse_int_range(1, 0, 0x7ffffff);
    item->padding.t = parse_int_range(2, 0, 0x7ffffff);
@@ -3000,16 +3162,16 @@ static void st_collections_group_parts_part_box_items_item_padding(void)
 */
 static void st_collections_group_parts_part_box_items_item_align(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->align.x = FROM_DOUBLE(parse_float_range(0, -1.0, 1.0));
    item->align.y = FROM_DOUBLE(parse_float_range(1, -1.0, 1.0));
 }
@@ -3026,16 +3188,16 @@ static void st_collections_group_parts_part_box_items_item_align(void)
 */
 static void st_collections_group_parts_part_box_items_item_weight(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->weight.x = FROM_DOUBLE(parse_float_range(0, 0.0, 99999.99));
    item->weight.y = FROM_DOUBLE(parse_float_range(1, 0.0, 99999.99));
 }
@@ -3052,16 +3214,16 @@ static void st_collections_group_parts_part_box_items_item_weight(void)
 */
 static void st_collections_group_parts_part_box_items_item_aspect(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->aspect.w = parse_int_range(0, 0, 0x7fffffff);
    item->aspect.h = parse_int_range(1, 0, 0x7fffffff);
 }
@@ -3078,16 +3240,16 @@ static void st_collections_group_parts_part_box_items_item_aspect(void)
 */
 static void st_collections_group_parts_part_box_items_item_aspect_mode(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->aspect.mode = parse_enum(0,
                                  "NONE", EDJE_ASPECT_CONTROL_NONE,
                                  "NEITHER", EDJE_ASPECT_CONTROL_NEITHER,
@@ -3109,16 +3271,16 @@ static void st_collections_group_parts_part_box_items_item_aspect_mode(void)
 */
 static void st_collections_group_parts_part_box_items_item_options(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->options = parse_str(0);
 }
 
@@ -3135,14 +3297,15 @@ static void st_collections_group_parts_part_box_items_item_options(void)
 */
 static void st_collections_group_parts_part_table_items_item_position(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_TABLE)
      {
@@ -3151,8 +3314,7 @@ static void st_collections_group_parts_part_table_items_item_position(void)
            progname, file_in, line - 1);
        exit(-1);
      }
-   
-   item = eina_list_data_get(eina_list_last(ep->items));
+
    item->col = parse_int_range(0, 0, 0xffff);
    item->row = parse_int_range(1, 0, 0xffff);
 }
@@ -3170,14 +3332,15 @@ static void st_collections_group_parts_part_table_items_item_position(void)
 */
 static void st_collections_group_parts_part_table_items_item_span(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+   item = ep->items[ep->items_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_TABLE)
      {
@@ -3187,7 +3350,6 @@ static void st_collections_group_parts_part_table_items_item_span(void)
        exit(-1);
      }
 
-   item = eina_list_data_get(eina_list_last(ep->items));
    item->colspan = parse_int_range(0, 1, 0xffff);
    item->rowspan = parse_int_range(1, 1, 0xffff);
 }
@@ -3229,93 +3391,70 @@ static void st_collections_group_parts_part_table_items_item_span(void)
 static void
 ob_collections_group_parts_part_description(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   ed = mem_alloc(SZ(Old_Edje_Part_Description));
+   ep = pc->parts[pc->parts_count - 1];
+
+   ed = _edje_part_description_alloc(ep->type, pc->part, ep->name);
+
    if (!ep->default_desc)
-     ep->default_desc = ed;
+     {
+       ep->default_desc = ed;
+     }
    else
-     ep->other_desc = eina_list_append(ep->other_desc, ed);
-   ed->common.visible = 1;
-   ed->common.align.x = FROM_DOUBLE(0.5);
-   ed->common.align.y = FROM_DOUBLE(0.5);
-   ed->common.min.w = 0;
-   ed->common.min.h = 0;
-   ed->common.fixed.w = 0;
-   ed->common.fixed.h = 0;
-   ed->common.max.w = -1;
-   ed->common.max.h = -1;
-   ed->common.rel1.relative_x = FROM_DOUBLE(0.0);
-   ed->common.rel1.relative_y = FROM_DOUBLE(0.0);
-   ed->common.rel1.offset_x = 0;
-   ed->common.rel1.offset_y = 0;
-   ed->common.rel1.id_x = -1;
-   ed->common.rel1.id_y = -1;
-   ed->common.rel2.relative_x = FROM_DOUBLE(1.0);
-   ed->common.rel2.relative_y = FROM_DOUBLE(1.0);
-   ed->common.rel2.offset_x = -1;
-   ed->common.rel2.offset_y = -1;
-   ed->common.rel2.id_x = -1;
-   ed->common.rel2.id_y = -1;
-   ed->image.id = -1;
-   ed->image.fill.smooth = 1;
-   ed->image.fill.pos_rel_x = FROM_DOUBLE(0.0);
-   ed->image.fill.pos_abs_x = 0;
-   ed->image.fill.rel_x = FROM_DOUBLE(1.0);
-   ed->image.fill.abs_x = 0;
-   ed->image.fill.pos_rel_y = FROM_DOUBLE(0.0);
-   ed->image.fill.pos_abs_y = 0;
-   ed->image.fill.rel_y = FROM_DOUBLE(1.0);
-   ed->image.fill.abs_y = 0;
-   ed->image.fill.angle = 0;
-   ed->image.fill.spread = 0;
-   ed->image.fill.type = EDJE_FILL_TYPE_SCALE;
-   ed->common.color_class = NULL;
-   ed->common.color.r = 255;
-   ed->common.color.g = 255;
-   ed->common.color.b = 255;
-   ed->common.color.a = 255;
-   ed->common.color2.r = 0;
-   ed->common.color2.g = 0;
-   ed->common.color2.b = 0;
-   ed->common.color2.a = 255;
-   ed->text.color3.r = 0;
-   ed->text.color3.g = 0;
-   ed->text.color3.b = 0;
-   ed->text.color3.a = 128;
-   ed->text.align.x = FROM_DOUBLE(0.5);
-   ed->text.align.y = FROM_DOUBLE(0.5);
-   ed->text.id_source = -1;
-   ed->text.id_text_source = -1;
-   ed->box.layout = NULL;
-   ed->box.alt_layout = NULL;
-   ed->box.align.x = FROM_DOUBLE(0.5);
-   ed->box.align.y = FROM_DOUBLE(0.5);
-   ed->box.padding.x = 0;
-   ed->box.padding.y = 0;
-   ed->table.homogeneous = EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE;
-   ed->table.align.x = FROM_DOUBLE(0.5);
-   ed->table.align.y = FROM_DOUBLE(0.5);
-   ed->table.padding.x = 0;
-   ed->table.padding.y = 0;
-   ed->common.map.id_persp = -1;
-   ed->common.map.id_light = -1;
-   ed->common.map.rot.id_center = -1;
-   ed->common.map.rot.x = FROM_DOUBLE(0.0);
-   ed->common.map.rot.y = FROM_DOUBLE(0.0);
-   ed->common.map.rot.z = FROM_DOUBLE(0.0);
-   ed->common.map.on = 0;
-   ed->common.map.smooth = 1;
-   ed->common.map.alpha = 1;
-   ed->common.map.backcull = 0;
-   ed->common.map.persp_on = 0;
-   ed->common.persp.zplane = 0;
-   ed->common.persp.focal = 1000;
-   ed->external_params = NULL;
+     {
+       ep->other.desc_count++;
+       ep->other.desc = realloc(ep->other.desc,
+                                sizeof (Edje_Part_Description_Common*) * ep->other.desc_count);
+       ep->other.desc[ep->other.desc_count - 1] = ed;
+     }
+
+   ed->visible = 1;
+   ed->align.x = FROM_DOUBLE(0.5);
+   ed->align.y = FROM_DOUBLE(0.5);
+   ed->min.w = 0;
+   ed->min.h = 0;
+   ed->fixed.w = 0;
+   ed->fixed.h = 0;
+   ed->max.w = -1;
+   ed->max.h = -1;
+   ed->rel1.relative_x = FROM_DOUBLE(0.0);
+   ed->rel1.relative_y = FROM_DOUBLE(0.0);
+   ed->rel1.offset_x = 0;
+   ed->rel1.offset_y = 0;
+   ed->rel1.id_x = -1;
+   ed->rel1.id_y = -1;
+   ed->rel2.relative_x = FROM_DOUBLE(1.0);
+   ed->rel2.relative_y = FROM_DOUBLE(1.0);
+   ed->rel2.offset_x = -1;
+   ed->rel2.offset_y = -1;
+   ed->rel2.id_x = -1;
+   ed->rel2.id_y = -1;
+   ed->color_class = NULL;
+   ed->color.r = 255;
+   ed->color.g = 255;
+   ed->color.b = 255;
+   ed->color.a = 255;
+   ed->color2.r = 0;
+   ed->color2.g = 0;
+   ed->color2.b = 0;
+   ed->color2.a = 255;
+   ed->map.id_persp = -1;
+   ed->map.id_light = -1;
+   ed->map.rot.id_center = -1;
+   ed->map.rot.x = FROM_DOUBLE(0.0);
+   ed->map.rot.y = FROM_DOUBLE(0.0);
+   ed->map.rot.z = FROM_DOUBLE(0.0);
+   ed->map.on = 0;
+   ed->map.smooth = 1;
+   ed->map.alpha = 1;
+   ed->map.backcull = 0;
+   ed->map.persp_on = 0;
+   ed->persp.zplane = 0;
+   ed->persp.focal = 1000;
 }
 
 /**
@@ -3334,10 +3473,9 @@ ob_collections_group_parts_part_description(void)
 static void
 st_collections_group_parts_part_description_inherit(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed, *parent = NULL;
-   Eina_List *l;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed, *parent = NULL;
    Edje_Part_Image_Id *iid;
    char *parent_name;
    const char *state_name;
@@ -3346,10 +3484,10 @@ st_collections_group_parts_part_description_inherit(void)
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    /* inherit may not be used in the default description */
-   if (!ep->other_desc)
+   if (!ep->other.desc_count)
      {
        ERR("%s: Error. parse error %s:%i. "
            "inherit may not be used in the default description",
@@ -3357,9 +3495,9 @@ st_collections_group_parts_part_description_inherit(void)
        exit(-1);
      }
 
-   ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = ep->other.desc[ep->other.desc_count - 1];
 
-   if (!ed->common.state.name)
+   if (!ed->state.name)
      {
         ERR("%s: Error. parse error %s:%i. "
            "inherit may only be used after state",
@@ -3375,22 +3513,25 @@ st_collections_group_parts_part_description_inherit(void)
      parent = ep->default_desc;
    else
      {
+       Edje_Part_Description_Common *d;
        double min_dst = 999.0;
-       Old_Edje_Part_Description *d;
+       unsigned int i;
 
        if (!strcmp(parent_name, "default"))
          {
             parent = ep->default_desc;
-            min_dst = ABS(ep->default_desc->common.state.value - parent_val);
+            min_dst = ABS(ep->default_desc->state.value - parent_val);
          }
 
-       EINA_LIST_FOREACH(ep->other_desc, l, d)
+       for (i = 0; i < ep->other.desc_count; ++i)
          {
-            if (!strcmp (d->common.state.name, parent_name))
+            d = ep->other.desc[i];
+
+            if (!strcmp (d->state.name, parent_name))
               {
                  double dst;
 
-                 dst = ABS(d->common.state.value - parent_val);
+                 dst = ABS(d->state.value - parent_val);
                  if (dst < min_dst)
                    {
                       parent = d;
@@ -3408,61 +3549,118 @@ st_collections_group_parts_part_description_inherit(void)
        exit(-1);
      }
 
-   free (parent_name);
+   free(parent_name);
 
    /* now do a full copy, only state info will be kept */
-   state_name = ed->common.state.name;
-   state_val = ed->common.state.value;
+   state_name = ed->state.name;
+   state_val = ed->state.value;
 
    *ed = *parent;
 
-   ed->common.state.name = state_name;
-   ed->common.state.value = state_val;
+   ed->state.name = state_name;
+   ed->state.value = state_val;
 
-   data_queue_part_slave_lookup(&parent->common.rel1.id_x, &ed->common.rel1.id_x);
-   data_queue_part_slave_lookup(&parent->common.rel1.id_y, &ed->common.rel1.id_y);
-   data_queue_part_slave_lookup(&parent->common.rel2.id_x, &ed->common.rel2.id_x);
-   data_queue_part_slave_lookup(&parent->common.rel2.id_y, &ed->common.rel2.id_y);
-   data_queue_image_slave_lookup(&parent->image.id, &ed->image.id);
+   data_queue_part_slave_lookup(&parent->rel1.id_x, &ed->rel1.id_x);
+   data_queue_part_slave_lookup(&parent->rel1.id_y, &ed->rel1.id_y);
+   data_queue_part_slave_lookup(&parent->rel2.id_x, &ed->rel2.id_x);
+   data_queue_part_slave_lookup(&parent->rel2.id_y, &ed->rel2.id_y);
 
    /* make sure all the allocated memory is getting copied, not just
     * referenced
     */
-   ed->image.tween_list = NULL;
+#define STRDUP(x) x ? strdup(x) : NULL
 
-   EINA_LIST_FOREACH(parent->image.tween_list, l, iid)
+   ed->color_class = STRDUP(ed->color_class);
+   switch (ep->type)
      {
-       Edje_Part_Image_Id *iid_new;
-
-       iid_new = mem_alloc(SZ(Edje_Part_Image_Id));
-       data_queue_image_slave_lookup(&(iid->id), &(iid_new->id));
-       ed->image.tween_list = eina_list_append(ed->image.tween_list, iid_new);
+      case EDJE_PART_TYPE_RECTANGLE:
+      case EDJE_PART_TYPE_SWALLOW:
+      case EDJE_PART_TYPE_GROUP:
+        /* Nothing todo, this part only have a common description. */
+        break;
+      case EDJE_PART_TYPE_TEXT:
+      case EDJE_PART_TYPE_TEXTBLOCK:
+       {
+          Edje_Part_Description_Text *ted = (Edje_Part_Description_Text*) ed;
+          Edje_Part_Description_Text *tparent = (Edje_Part_Description_Text*) parent;
+
+          ted->text = tparent->text;
+
+          ted->text.text.str = STRDUP(ted->text.text.str);
+          ted->text.text_class = STRDUP(ted->text.text_class);
+          ted->text.font.str = STRDUP(ted->text.font.str);
+
+          data_queue_part_slave_lookup(&(tparent->text.id_source), &(ted->text.id_source));
+          data_queue_part_slave_lookup(&(tparent->text.id_text_source), &(ted->text.id_text_source));
+
+          break;
+       }
+      case EDJE_PART_TYPE_IMAGE:
+       {
+          Edje_Part_Description_Image *ied = (Edje_Part_Description_Image *) ed;
+          Edje_Part_Description_Image *iparent = (Edje_Part_Description_Image *) parent;
+          unsigned int i;
+
+          ied->image = iparent->image;
+
+          data_queue_image_slave_lookup(&iparent->image.id, &ied->image.id);
+
+          ied->image.tweens = calloc(iparent->image.tweens_count,
+                                     sizeof (Edje_Part_Image_Id*));
+          for (i = 0; i < iparent->image.tweens_count; i++)
+            {
+               Edje_Part_Image_Id *iid_new;
+
+               iid = iparent->image.tweens[i];
+
+               iid_new = mem_alloc(SZ(Edje_Part_Image_Id));
+               data_queue_image_slave_lookup(&(iid->id), &(iid_new->id));
+               ied->image.tweens[i] = iid_new;
+            }
+
+          break;
+       }
+      case EDJE_PART_TYPE_BOX:
+       {
+          Edje_Part_Description_Box *bed = (Edje_Part_Description_Box *) ed;
+          Edje_Part_Description_Box *bparent = (Edje_Part_Description_Box *) parent;
+
+          bed->box = bparent->box;
+
+          break;
+       }
+      case EDJE_PART_TYPE_TABLE:
+       {
+          Edje_Part_Description_Table *ted = (Edje_Part_Description_Table *) ed;
+          Edje_Part_Description_Table *tparent = (Edje_Part_Description_Table *) parent;
+
+          ted->table = tparent->table;
+
+          break;
+       }
+      case EDJE_PART_TYPE_EXTERNAL:
+       {
+          Edje_Part_Description_External *eed = (Edje_Part_Description_External *) ed;
+          Edje_Part_Description_External *eparent = (Edje_Part_Description_External *) parent;
+
+          if (eparent->external_params)
+            {
+               Eina_List *l;
+               Edje_External_Param *param, *new_param;
+
+               eed->external_params = NULL;
+               EINA_LIST_FOREACH(eparent->external_params, l, param)
+                 {
+                    new_param = mem_alloc(SZ(Edje_External_Param));
+                    *new_param = *param;
+                    eed->external_params = eina_list_append(eed->external_params, new_param);
+                 }
+            }
+          break;
+       }
      }
 
-#define STRDUP(x) x ? strdup(x) : NULL
-
-   ed->common.color_class = STRDUP(ed->common.color_class);
-   ed->text.text.str = STRDUP(ed->text.text.str);
-   ed->text.text_class = STRDUP(ed->text.text_class);
-   ed->text.font.str = STRDUP(ed->text.font.str);
 #undef STRDUP
-
-   data_queue_part_slave_lookup(&(parent->text.id_source), &(ed->text.id_source));
-   data_queue_part_slave_lookup(&(parent->text.id_text_source), &(ed->text.id_text_source));
-
-   if (parent->external_params)
-     {
-       Eina_List *l;
-       Edje_External_Param *param, *new_param;
-
-       ed->external_params = NULL;
-       EINA_LIST_FOREACH(parent->external_params, l, param)
-         {
-            new_param = mem_alloc(SZ(Edje_External_Param));
-            *new_param = *param;
-            ed->external_params = eina_list_append(ed->external_params, new_param);
-         }
-     }
 }
 
 /**
@@ -3482,17 +3680,18 @@ st_collections_group_parts_part_description_inherit(void)
 static void
 st_collections_group_parts_part_description_state(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
    char *s;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
    s = parse_str(0);
    if (!strcmp (s, "custom"))
@@ -3503,8 +3702,8 @@ st_collections_group_parts_part_description_state(void)
        exit(-1);
      }
 
-   ed->common.state.name = s;
-   ed->common.state.value = parse_float_range(1, 0.0, 1.0);
+   ed->state.name = s;
+   ed->state.value = parse_float_range(1, 0.0, 1.0);
 }
 
 /**
@@ -3521,17 +3720,19 @@ st_collections_group_parts_part_description_state(void)
 static void
 st_collections_group_parts_part_description_visible(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.visible = parse_bool(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->visible = parse_bool(0);
 }
 
 /**
@@ -3549,18 +3750,20 @@ st_collections_group_parts_part_description_visible(void)
 static void
 st_collections_group_parts_part_description_align(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.align.x = FROM_DOUBLE(parse_float_range(0, 0.0, 1.0));
-   ed->common.align.y = FROM_DOUBLE(parse_float_range(1, 0.0, 1.0));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->align.x = FROM_DOUBLE(parse_float_range(0, 0.0, 1.0));
+   ed->align.y = FROM_DOUBLE(parse_float_range(1, 0.0, 1.0));
 }
 
 /**
@@ -3580,18 +3783,20 @@ st_collections_group_parts_part_description_align(void)
 static void
 st_collections_group_parts_part_description_fixed(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.fixed.w = parse_float_range(0, 0, 1);
-   ed->common.fixed.h = parse_float_range(1, 0, 1);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->fixed.w = parse_float_range(0, 0, 1);
+   ed->fixed.h = parse_float_range(1, 0, 1);
 }
 
 /**
@@ -3607,18 +3812,20 @@ st_collections_group_parts_part_description_fixed(void)
 static void
 st_collections_group_parts_part_description_min(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.min.w = parse_float_range(0, 0, 0x7fffffff);
-   ed->common.min.h = parse_float_range(1, 0, 0x7fffffff);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->min.w = parse_float_range(0, 0, 0x7fffffff);
+   ed->min.h = parse_float_range(1, 0, 0x7fffffff);
 }
 
 /**
@@ -3634,18 +3841,20 @@ st_collections_group_parts_part_description_min(void)
 static void
 st_collections_group_parts_part_description_max(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.max.w = parse_float_range(0, 0, 0x7fffffff);
-   ed->common.max.h = parse_float_range(1, 0, 0x7fffffff);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->max.w = parse_float_range(0, 0, 0x7fffffff);
+   ed->max.h = parse_float_range(1, 0, 0x7fffffff);
 }
 
 /**
@@ -3663,18 +3872,20 @@ st_collections_group_parts_part_description_max(void)
 static void
 st_collections_group_parts_part_description_step(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.step.x = parse_float_range(0, 0, 0x7fffffff);
-   ed->common.step.y = parse_float_range(1, 0, 0x7fffffff);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->step.x = parse_float_range(0, 0, 0x7fffffff);
+   ed->step.y = parse_float_range(1, 0, 0x7fffffff);
 }
 
 /**
@@ -3694,18 +3905,20 @@ st_collections_group_parts_part_description_step(void)
 static void
 st_collections_group_parts_part_description_aspect(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.aspect.min = FROM_DOUBLE(parse_float_range(0, 0.0, 999999999.0));
-   ed->common.aspect.max = FROM_DOUBLE(parse_float_range(1, 0.0, 999999999.0));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->aspect.min = FROM_DOUBLE(parse_float_range(0, 0.0, 999999999.0));
+   ed->aspect.max = FROM_DOUBLE(parse_float_range(1, 0.0, 999999999.0));
 }
 
 /**
@@ -3722,22 +3935,24 @@ st_collections_group_parts_part_description_aspect(void)
 static void
 st_collections_group_parts_part_description_aspect_preference(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.aspect.prefer =  parse_enum(0,
-                                         "NONE", EDJE_ASPECT_PREFER_NONE,
-                                         "VERTICAL", EDJE_ASPECT_PREFER_VERTICAL,
-                                         "HORIZONTAL", EDJE_ASPECT_PREFER_HORIZONTAL,
-                                         "BOTH", EDJE_ASPECT_PREFER_BOTH,
-                                         NULL);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->aspect.prefer =  parse_enum(0,
+                                  "NONE", EDJE_ASPECT_PREFER_NONE,
+                                  "VERTICAL", EDJE_ASPECT_PREFER_VERTICAL,
+                                  "HORIZONTAL", EDJE_ASPECT_PREFER_HORIZONTAL,
+                                  "BOTH", EDJE_ASPECT_PREFER_BOTH,
+                                  NULL);
 }
 
 /**
@@ -3755,17 +3970,19 @@ st_collections_group_parts_part_description_aspect_preference(void)
 static void
 st_collections_group_parts_part_description_color_class(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.color_class = parse_str(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->color_class = parse_str(0);
 }
 
 /**
@@ -3781,20 +3998,22 @@ st_collections_group_parts_part_description_color_class(void)
 static void
 st_collections_group_parts_part_description_color(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(4);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.color.r = parse_int_range(0, 0, 255);
-   ed->common.color.g = parse_int_range(1, 0, 255);
-   ed->common.color.b = parse_int_range(2, 0, 255);
-   ed->common.color.a = parse_int_range(3, 0, 255);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->color.r = parse_int_range(0, 0, 255);
+   ed->color.g = parse_int_range(1, 0, 255);
+   ed->color.b = parse_int_range(2, 0, 255);
+   ed->color.a = parse_int_range(3, 0, 255);
 }
 
 /**
@@ -3810,20 +4029,22 @@ st_collections_group_parts_part_description_color(void)
 static void
 st_collections_group_parts_part_description_color2(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(4);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.color2.r = parse_int_range(0, 0, 255);
-   ed->common.color2.g = parse_int_range(1, 0, 255);
-   ed->common.color2.b = parse_int_range(2, 0, 255);
-   ed->common.color2.a = parse_int_range(3, 0, 255);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->color2.r = parse_int_range(0, 0, 255);
+   ed->color2.g = parse_int_range(1, 0, 255);
+   ed->color2.b = parse_int_range(2, 0, 255);
+   ed->color2.a = parse_int_range(3, 0, 255);
 }
 
 /**
@@ -3839,16 +4060,25 @@ st_collections_group_parts_part_description_color2(void)
 static void
 st_collections_group_parts_part_description_color3(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(4);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ep = pc->parts[pc->parts_count - 1];
+
+   if (ep->type != EDJE_PART_TYPE_TEXT
+       && ep->type != EDJE_PART_TYPE_TEXTBLOCK)
+     {
+       ERR("%s: Error. Setting color3 in part %s from %s not of type TEXT or TEXTBLOCK.", progname, ep->name, pc->part);
+       exit(-1);
+     }
+
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*) ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.color3.r = parse_int_range(0, 0, 255);
    ed->text.color3.g = parse_int_range(1, 0, 255);
    ed->text.color3.b = parse_int_range(2, 0, 255);
@@ -3892,18 +4122,20 @@ st_collections_group_parts_part_description_color3(void)
 static void
 st_collections_group_parts_part_description_rel1_relative(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.rel1.relative_x = FROM_DOUBLE(parse_float(0));
-   ed->common.rel1.relative_y = FROM_DOUBLE(parse_float(1));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->rel1.relative_x = FROM_DOUBLE(parse_float(0));
+   ed->rel1.relative_y = FROM_DOUBLE(parse_float(1));
 }
 
 /**
@@ -3919,18 +4151,20 @@ st_collections_group_parts_part_description_rel1_relative(void)
 static void
 st_collections_group_parts_part_description_rel1_offset(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.rel1.offset_x = parse_int(0);
-   ed->common.rel1.offset_y = parse_int(1);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->rel1.offset_x = parse_int(0);
+   ed->rel1.offset_y = parse_int(1);
 }
 
 /**
@@ -3947,24 +4181,26 @@ st_collections_group_parts_part_description_rel1_offset(void)
 static void
 st_collections_group_parts_part_description_rel1_to(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.rel1.id_x));
-       data_queue_part_lookup(pc, name, &(ed->common.rel1.id_y));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->rel1.id_x));
+      data_queue_part_lookup(pc, name, &(ed->rel1.id_y));
+      free(name);
+   }
 }
 
 /**
@@ -3981,23 +4217,25 @@ st_collections_group_parts_part_description_rel1_to(void)
 static void
 st_collections_group_parts_part_description_rel1_to_x(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.rel1.id_x));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->rel1.id_x));
+      free(name);
+   }
 }
 
 /**
@@ -4015,124 +4253,136 @@ st_collections_group_parts_part_description_rel1_to_x(void)
 static void
 st_collections_group_parts_part_description_rel1_to_y(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.rel1.id_y));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->rel1.id_y));
+      free(name);
+   }
 }
 
 static void
 st_collections_group_parts_part_description_rel2_relative(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.rel2.relative_x = FROM_DOUBLE(parse_float(0));
-   ed->common.rel2.relative_y = FROM_DOUBLE(parse_float(1));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->rel2.relative_x = FROM_DOUBLE(parse_float(0));
+   ed->rel2.relative_y = FROM_DOUBLE(parse_float(1));
 }
 
 static void
 st_collections_group_parts_part_description_rel2_offset(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.rel2.offset_x = parse_int(0);
-   ed->common.rel2.offset_y = parse_int(1);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->rel2.offset_x = parse_int(0);
+   ed->rel2.offset_y = parse_int(1);
 }
 
 static void
 st_collections_group_parts_part_description_rel2_to(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.rel2.id_x));
-       data_queue_part_lookup(pc, name, &(ed->common.rel2.id_y));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->rel2.id_x));
+      data_queue_part_lookup(pc, name, &(ed->rel2.id_y));
+      free(name);
+   }
 }
 
 static void
 st_collections_group_parts_part_description_rel2_to_x(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.rel2.id_x));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->rel2.id_x));
+      free(name);
+   }
 }
 
 static void
 st_collections_group_parts_part_description_rel2_to_y(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.rel2.id_y));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->rel2.id_y));
+      free(name);
+   }
 }
 
 /**
@@ -4172,14 +4422,14 @@ st_collections_group_parts_part_description_rel2_to_y(void)
 static void
 st_collections_group_parts_part_description_image_normal(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
@@ -4189,15 +4439,16 @@ st_collections_group_parts_part_description_image_normal(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_image_lookup(name, &(ed->image.id), &(ed->image.set));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_image_lookup(name, &(ed->image.id), &(ed->image.set));
+      free(name);
+   }
 }
 
 /**
@@ -4215,14 +4466,14 @@ st_collections_group_parts_part_description_image_normal(void)
 static void
 st_collections_group_parts_part_description_image_tween(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
@@ -4232,18 +4483,22 @@ st_collections_group_parts_part_description_image_tween(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
-       Edje_Part_Image_Id *iid;
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
 
-       iid = mem_alloc(SZ(Edje_Part_Image_Id));
-       ed->image.tween_list = eina_list_append(ed->image.tween_list, iid);
-       name = parse_str(0);
-       data_queue_image_lookup(name, &(iid->id), &(iid->set));
-       free(name);
-     }
+   {
+      char *name;
+      Edje_Part_Image_Id *iid;
+
+      iid = mem_alloc(SZ(Edje_Part_Image_Id));
+      ed->image.tweens_count++;
+      ed->image.tweens = realloc(ed->image.tweens,
+                                sizeof (Edje_Part_Image_Id*) * ed->image.tweens_count);
+      ed->image.tweens[ed->image.tweens_count - 1] = iid;
+      name = parse_str(0);
+      data_queue_image_lookup(name, &(iid->id), &(iid->set));
+      free(name);
+   }
 }
 
 /**
@@ -4261,14 +4516,14 @@ st_collections_group_parts_part_description_image_tween(void)
 static void
 st_collections_group_parts_part_description_image_border(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(4);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
@@ -4278,8 +4533,9 @@ st_collections_group_parts_part_description_image_border(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.border.l = parse_int_range(0, 0, 0x7fffffff);
    ed->image.border.r = parse_int_range(1, 0, 0x7fffffff);
    ed->image.border.t = parse_int_range(2, 0, 0x7fffffff);
@@ -4301,14 +4557,14 @@ st_collections_group_parts_part_description_image_border(void)
 static void
 st_collections_group_parts_part_description_image_middle(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
@@ -4318,8 +4574,9 @@ st_collections_group_parts_part_description_image_middle(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.border.no_fill =  parse_enum(0,
                                          "1", 0,
                                          "DEFAULT", 0,
@@ -4343,14 +4600,14 @@ st_collections_group_parts_part_description_image_middle(void)
 static void
 st_collections_group_parts_part_description_image_border_scale(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
@@ -4360,8 +4617,9 @@ st_collections_group_parts_part_description_image_border_scale(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.border.scale =  parse_enum(0,
                                        "0", 0,
                                        "1", 1,
@@ -4382,14 +4640,14 @@ st_collections_group_parts_part_description_image_border_scale(void)
 static void
 st_collections_group_parts_part_description_image_scale_hint(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
@@ -4399,8 +4657,9 @@ st_collections_group_parts_part_description_image_scale_hint(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.scale_hint =  parse_enum(0,
                                      "NONE", EVAS_IMAGE_SCALE_HINT_NONE,
                                      "DYNAMIC", EVAS_IMAGE_SCALE_HINT_DYNAMIC,
@@ -4446,25 +4705,26 @@ st_collections_group_parts_part_description_image_scale_hint(void)
 static void
 st_collections_group_parts_part_description_fill_smooth(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
        ERR("%s: Error. parse error %s:%i. "
-           "fill.type attribute in non-IMAGE part.",
+           "image attributes in non-IMAGE part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.smooth = parse_bool(0);
 }
 
@@ -4482,26 +4742,35 @@ st_collections_group_parts_part_description_fill_smooth(void)
 static void
 st_collections_group_parts_part_description_fill_spread(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
 
    /* XXX this will need to include IMAGES when spread support is added to evas images */
-   if (ep->type != EDJE_PART_TYPE_GRADIENT)
+   {
+      ERR("%s: Error. parse error %s:%i. "
+         "fill.spread not supported yet.",
+         progname, file_in, line - 1);
+      exit(-1);
+   }
+
+   ep = pc->parts[pc->parts_count - 1];
+
+   if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
-       fprintf(stderr, "%s: Error. parse error %s:%i. "
-               "gradient attributes in non-GRADIENT part.\n",
-               progname, file_in, line - 1);
+       ERR("%s: Error. parse error %s:%i. "
+           "image attributes in non-IMAGE part.",
+           progname, file_in, line - 1);
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.spread = parse_int_range(0, 0, 1);
 }
 
@@ -4519,25 +4788,26 @@ st_collections_group_parts_part_description_fill_spread(void)
 static void
 st_collections_group_parts_part_description_fill_type(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
        ERR("%s: Error. parse error %s:%i. "
-           "fill attributes in non-IMAGE part.",
+           "image attributes in non-IMAGE part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.type = parse_enum(0,
                                    "SCALE", EDJE_FILL_TYPE_SCALE,
                                    "TILE", EDJE_FILL_TYPE_TILE,
@@ -4578,25 +4848,26 @@ st_collections_group_parts_part_description_fill_type(void)
 static void
 st_collections_group_parts_part_description_fill_origin_relative(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
        ERR("%s: Error. parse error %s:%i. "
-           "fill attributes in non-IMAGE part.",
+           "image attributes in non-IMAGE part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.pos_rel_x = FROM_DOUBLE(parse_float_range(0, -999999999.0, 999999999.0));
    ed->image.fill.pos_rel_y = FROM_DOUBLE(parse_float_range(1, -999999999.0, 999999999.0));
 }
@@ -4614,25 +4885,26 @@ st_collections_group_parts_part_description_fill_origin_relative(void)
 static void
 st_collections_group_parts_part_description_fill_origin_offset(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
        ERR("%s: Error. parse error %s:%i. "
-           "fill attributes in non-IMAGE part.",
+           "image attributes in non-IMAGE part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.pos_abs_x = parse_int(0);
    ed->image.fill.pos_abs_y = parse_int(1);
 }
@@ -4673,25 +4945,26 @@ st_collections_group_parts_part_description_fill_origin_offset(void)
 static void
 st_collections_group_parts_part_description_fill_size_relative(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
        ERR("%s: Error. parse error %s:%i. "
-           "fill attributes in non-IMAGE part.",
+           "image attributes in non-IMAGE part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.rel_x = FROM_DOUBLE(parse_float_range(0, 0.0, 999999999.0));
    ed->image.fill.rel_y = FROM_DOUBLE(parse_float_range(1, 0.0, 999999999.0));
 }
@@ -4709,25 +4982,26 @@ st_collections_group_parts_part_description_fill_size_relative(void)
 static void
 st_collections_group_parts_part_description_fill_size_offset(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Image *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_IMAGE)
      {
        ERR("%s: Error. parse error %s:%i. "
-           "fill attributes in non-IMAGE part.",
+           "image attributes in non-IMAGE part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
+   ed = (Edje_Part_Description_Image*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Image*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->image.fill.abs_x = parse_int(0);
    ed->image.fill.abs_y = parse_int(1);
 }
@@ -4778,14 +5052,14 @@ st_collections_group_parts_part_description_fill_size_offset(void)
 static void
 st_collections_group_parts_part_description_text_text(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
    char *str = NULL;
    int i;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_TEXT) &&
        (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
@@ -4796,8 +5070,9 @@ st_collections_group_parts_part_description_text_text(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    for (i = 0; ;i++)
      {
        char *s;
@@ -4830,14 +5105,14 @@ st_collections_group_parts_part_description_text_text(void)
 static void
 st_collections_group_parts_part_description_text_text_class(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_TEXT) &&
        (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
@@ -4848,8 +5123,9 @@ st_collections_group_parts_part_description_text_text_class(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.text_class = parse_str(0);
 }
 
@@ -4868,16 +5144,17 @@ st_collections_group_parts_part_description_text_text_class(void)
 static void
 st_collections_group_parts_part_description_text_font(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXT)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
            "text attributes in non-TEXT part.",
@@ -4885,8 +5162,9 @@ st_collections_group_parts_part_description_text_font(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.font.str = parse_str(0);
 }
 
@@ -4905,25 +5183,27 @@ st_collections_group_parts_part_description_text_font(void)
 static void
 st_collections_group_parts_part_description_text_style(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXTBLOCK)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
-           "text attributes in non-TEXTBLOCK part.",
+           "text attributes in non-TEXT part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.style.str = parse_str(0);
 }
 
@@ -4943,25 +5223,27 @@ st_collections_group_parts_part_description_text_style(void)
 static void
 st_collections_group_parts_part_description_text_repch(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXTBLOCK)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
-           "text attributes in non-TEXTBLOCK part.",
+           "text attributes in non-TEXT part.",
            progname, file_in, line - 1);
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.repch.str = parse_str(0);
 }
 
@@ -4980,16 +5262,17 @@ st_collections_group_parts_part_description_text_repch(void)
 static void
 st_collections_group_parts_part_description_text_size(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXT)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
            "text attributes in non-TEXT part.",
@@ -4997,8 +5280,9 @@ st_collections_group_parts_part_description_text_size(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.size = parse_int_range(0, 0, 255);
 }
 
@@ -5017,16 +5301,17 @@ st_collections_group_parts_part_description_text_size(void)
 static void
 st_collections_group_parts_part_description_text_fit(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXT)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
            "text attributes in non-TEXT part.",
@@ -5034,8 +5319,9 @@ st_collections_group_parts_part_description_text_fit(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.fit_x = parse_bool(0);
    ed->text.fit_y = parse_bool(1);
 }
@@ -5056,14 +5342,14 @@ st_collections_group_parts_part_description_text_fit(void)
 static void
 st_collections_group_parts_part_description_text_min(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_TEXT) &&
        (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
@@ -5074,8 +5360,9 @@ st_collections_group_parts_part_description_text_min(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.min_x = parse_bool(0);
    ed->text.min_y = parse_bool(1);
 }
@@ -5096,14 +5383,14 @@ st_collections_group_parts_part_description_text_min(void)
 static void
 st_collections_group_parts_part_description_text_max(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_TEXT) &&
        (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
@@ -5114,8 +5401,9 @@ st_collections_group_parts_part_description_text_max(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.max_x = parse_bool(0);
    ed->text.max_y = parse_bool(1);
 }
@@ -5135,16 +5423,17 @@ st_collections_group_parts_part_description_text_max(void)
 static void
 st_collections_group_parts_part_description_text_align(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXT)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
            "text attributes in non-TEXT part.",
@@ -5152,8 +5441,9 @@ st_collections_group_parts_part_description_text_align(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.align.x = FROM_DOUBLE(parse_float_range(0, 0.0, 1.0));
    ed->text.align.y = FROM_DOUBLE(parse_float_range(1, 0.0, 1.0));
 }
@@ -5173,14 +5463,14 @@ st_collections_group_parts_part_description_text_align(void)
 static void
 st_collections_group_parts_part_description_text_source(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_TEXT) &&
        (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
@@ -5191,15 +5481,16 @@ st_collections_group_parts_part_description_text_source(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->text.id_source));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->text.id_source));
+      free(name);
+   }
 }
 
 /**
@@ -5217,14 +5508,14 @@ st_collections_group_parts_part_description_text_source(void)
 static void
 st_collections_group_parts_part_description_text_text_source(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if ((ep->type != EDJE_PART_TYPE_TEXT) &&
        (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
@@ -5235,15 +5526,16 @@ st_collections_group_parts_part_description_text_text_source(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->text.id_text_source));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->text.id_text_source));
+      free(name);
+   }
 }
 
 /**
@@ -5262,16 +5554,17 @@ st_collections_group_parts_part_description_text_text_source(void)
 static void
 st_collections_group_parts_part_description_text_elipsis(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
-   if (ep->type != EDJE_PART_TYPE_TEXT)
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
      {
        ERR("%s: Error. parse error %s:%i. "
            "text attributes in non-TEXT part.",
@@ -5279,8 +5572,9 @@ st_collections_group_parts_part_description_text_elipsis(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->text.elipsis = parse_float_range(0, 0.0, 1.0);
 }
 
@@ -5363,14 +5657,14 @@ st_collections_group_parts_part_description_text_elipsis(void)
 */
 static void st_collections_group_parts_part_description_box_layout(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Box *ed;
 
    check_min_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_BOX)
      {
@@ -5380,8 +5674,9 @@ static void st_collections_group_parts_part_description_box_layout(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Box*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Box*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->box.layout = parse_str(0);
    if (is_param(1))
      ed->box.alt_layout = parse_str(1);
@@ -5389,14 +5684,14 @@ static void st_collections_group_parts_part_description_box_layout(void)
 
 static void st_collections_group_parts_part_description_box_align(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Box *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_BOX)
      {
@@ -5406,22 +5701,23 @@ static void st_collections_group_parts_part_description_box_align(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Box*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Box*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->box.align.x = FROM_DOUBLE(parse_float_range(0, -1.0, 1.0));
    ed->box.align.y = FROM_DOUBLE(parse_float_range(1, -1.0, 1.0));
 }
 
 static void st_collections_group_parts_part_description_box_padding(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Box *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_BOX)
      {
@@ -5431,8 +5727,9 @@ static void st_collections_group_parts_part_description_box_padding(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Box*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Box*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->box.padding.x = parse_int_range(0, 0, 0x7fffffff);
    ed->box.padding.y = parse_int_range(1, 0, 0x7fffffff);
 }
@@ -5440,14 +5737,14 @@ static void st_collections_group_parts_part_description_box_padding(void)
 static void
 st_collections_group_parts_part_description_box_min(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Box *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_BOX)
      {
@@ -5457,8 +5754,9 @@ st_collections_group_parts_part_description_box_min(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Box*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Box*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->box.min.h = parse_bool(0);
    ed->box.min.v = parse_bool(1);
 }
@@ -5521,14 +5819,14 @@ st_collections_group_parts_part_description_box_min(void)
 */
 static void st_collections_group_parts_part_description_table_homogeneous(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Table *ed;
 
    check_min_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_TABLE)
      {
@@ -5538,8 +5836,9 @@ static void st_collections_group_parts_part_description_table_homogeneous(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Table*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Table*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->table.homogeneous = parse_enum(0,
                                     "NONE", EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE,
                                     "TABLE", EDJE_OBJECT_TABLE_HOMOGENEOUS_TABLE,
@@ -5549,14 +5848,14 @@ static void st_collections_group_parts_part_description_table_homogeneous(void)
 
 static void st_collections_group_parts_part_description_table_align(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Table *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_TABLE)
      {
@@ -5566,22 +5865,23 @@ static void st_collections_group_parts_part_description_table_align(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Table*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Table*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->table.align.x = FROM_DOUBLE(parse_float_range(0, -1.0, 1.0));
    ed->table.align.y = FROM_DOUBLE(parse_float_range(1, -1.0, 1.0));
 }
 
 static void st_collections_group_parts_part_description_table_padding(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Table *ed;
 
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_TABLE)
      {
@@ -5591,8 +5891,9 @@ static void st_collections_group_parts_part_description_table_padding(void)
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_Table*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Table*)  ep->other.desc[ep->other.desc_count - 1];
+
    ed->table.padding.x = parse_int_range(0, 0, 0x7fffffff);
    ed->table.padding.y = parse_int_range(1, 0, 0x7fffffff);
 }
@@ -5645,25 +5946,27 @@ static void st_collections_group_parts_part_description_table_padding(void)
 static void
 st_collections_group_parts_part_description_map_perspective(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.map.id_persp));
-       free(name);
-     }
-   ed->common.map.persp_on = 1;
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->map.id_persp));
+      free(name);
+   }
+
+   ed->map.persp_on = 1;
 }
 
 /**
@@ -5687,24 +5990,25 @@ st_collections_group_parts_part_description_map_perspective(void)
 static void
 st_collections_group_parts_part_description_map_light(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.map.id_light));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->map.id_light));
+      free(name);
+   }
 }
 
 /**
@@ -5720,18 +6024,19 @@ st_collections_group_parts_part_description_map_light(void)
 static void
 st_collections_group_parts_part_description_map_on(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.on = parse_bool(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.on = parse_bool(0);
 }
 
 /**
@@ -5750,18 +6055,19 @@ st_collections_group_parts_part_description_map_on(void)
 static void
 st_collections_group_parts_part_description_map_smooth(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.smooth = parse_bool(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.smooth = parse_bool(0);
 }
 
 /**
@@ -5777,18 +6083,19 @@ st_collections_group_parts_part_description_map_smooth(void)
 static void
 st_collections_group_parts_part_description_map_alpha(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.alpha = parse_bool(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.alpha = parse_bool(0);
 }
 
 /**
@@ -5806,18 +6113,19 @@ st_collections_group_parts_part_description_map_alpha(void)
 static void
 st_collections_group_parts_part_description_map_backface_cull(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.backcull = parse_bool(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.backcull = parse_bool(0);
 }
 
 /**
@@ -5836,18 +6144,19 @@ st_collections_group_parts_part_description_map_backface_cull(void)
 static void
 st_collections_group_parts_part_description_map_perspective_on(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.persp_on = parse_bool(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.persp_on = parse_bool(0);
 }
 /**
     @page edcref
@@ -5883,24 +6192,25 @@ st_collections_group_parts_part_description_map_perspective_on(void)
 static void
 st_collections_group_parts_part_description_map_rotation_center(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-     {
-       char *name;
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
 
-       name = parse_str(0);
-       data_queue_part_lookup(pc, name, &(ed->common.map.rot.id_center));
-       free(name);
-     }
+   {
+      char *name;
+
+      name = parse_str(0);
+      data_queue_part_lookup(pc, name, &(ed->map.rot.id_center));
+      free(name);
+   }
 }
 
 /**
@@ -5917,18 +6227,19 @@ st_collections_group_parts_part_description_map_rotation_center(void)
 static void
 st_collections_group_parts_part_description_map_rotation_x(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.rot.x = FROM_DOUBLE(parse_float(0));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.rot.x = FROM_DOUBLE(parse_float(0));
 }
 
 /**
@@ -5945,18 +6256,19 @@ st_collections_group_parts_part_description_map_rotation_x(void)
 static void
 st_collections_group_parts_part_description_map_rotation_y(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.rot.y = FROM_DOUBLE(parse_float(0));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.rot.y = FROM_DOUBLE(parse_float(0));
 }
 
 /**
@@ -5973,18 +6285,19 @@ st_collections_group_parts_part_description_map_rotation_y(void)
 static void
 st_collections_group_parts_part_description_map_rotation_z(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.map.rot.z = FROM_DOUBLE(parse_float(0));
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->map.rot.z = FROM_DOUBLE(parse_float(0));
 }
 
 /**
@@ -6017,18 +6330,19 @@ st_collections_group_parts_part_description_map_rotation_z(void)
 static void
 st_collections_group_parts_part_description_perspective_zplane(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.persp.zplane = parse_int(0);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->persp.zplane = parse_int(0);
 }
 
 
@@ -6046,18 +6360,19 @@ st_collections_group_parts_part_description_perspective_zplane(void)
 static void
 st_collections_group_parts_part_description_perspective_focal(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Common *ed;
 
    check_arg_count(1);
-   
+
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   
+   ep = pc->parts[pc->parts_count - 1];
+
    ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
-   ed->common.persp.focal = parse_int_range(0, 1, 0x7fffffff);
+   if (ep->other.desc_count) ed = ep->other.desc[ep->other.desc_count - 1];
+
+   ed->persp.focal = parse_int_range(0, 1, 0x7fffffff);
 }
 
 
@@ -6089,9 +6404,9 @@ st_collections_group_parts_part_description_perspective_focal(void)
 static void
 _st_collections_group_parts_part_description_params(Edje_External_Param_Type type)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-   Old_Edje_Part_Description *ed;
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_External *ed;
    Edje_External_Param *param;
    Eina_List *l;
    const char *name;
@@ -6100,7 +6415,7 @@ _st_collections_group_parts_part_description_params(Edje_External_Param_Type typ
    check_arg_count(2);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
+   ep = pc->parts[pc->parts_count - 1];
 
    if (ep->type != EDJE_PART_TYPE_EXTERNAL)
      {
@@ -6110,8 +6425,8 @@ _st_collections_group_parts_part_description_params(Edje_External_Param_Type typ
        exit(-1);
      }
 
-   ed = ep->default_desc;
-   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+   ed = (Edje_Part_Description_External*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_External*) ep->other.desc[ep->other.desc_count - 1];
 
    name = parse_str(0);
 
@@ -6279,15 +6594,19 @@ st_collections_group_parts_part_description_params_choice(void)
 static void
 ob_collections_group_programs_program(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
+
    ep = mem_alloc(SZ(Edje_Program));
-   pc->programs = eina_list_append(pc->programs, ep);
-   ep->id = eina_list_count(pc->programs) - 1;
+   ep->id = -1;
    ep->tween.mode = EDJE_TWEEN_MODE_LINEAR;
    ep->after = NULL;
+
+   _edje_program_insert(pc, ep);
+
+   current_program = ep;
 }
 
 /**
@@ -6303,28 +6622,18 @@ ob_collections_group_programs_program(void)
 static void
 st_collections_group_programs_program_name(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
+   Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-   ep->name = parse_str(0);
-     {
-       Eina_List *l;
-       Edje_Program *lep;
+   current_program->name = parse_str(0);
 
-       EINA_LIST_FOREACH(pc->programs, l, lep)
-         {
-            if ((lep != ep) && (lep->name) && (!strcmp(lep->name, ep->name)))
-              {
-                 ERR("%s: Error. parse error %s:%i. There is already a program of the name %s\n",
-                     progname, file_in, line - 1, ep->name);
-                 exit(-1);
-              }
-         }
-     }
+   _edje_program_check(current_program->name, current_program, pc->programs.fnmatch, pc->programs.fnmatch_count);
+   _edje_program_check(current_program->name, current_program, pc->programs.strcmp, pc->programs.strcmp_count);
+   _edje_program_check(current_program->name, current_program, pc->programs.strncmp, pc->programs.strncmp_count);
+   _edje_program_check(current_program->name, current_program, pc->programs.strrncmp, pc->programs.strrncmp_count);
+   _edje_program_check(current_program->name, current_program, pc->programs.nocmp, pc->programs.nocmp_count);
 }
 
 /**
@@ -6344,14 +6653,15 @@ st_collections_group_programs_program_name(void)
 static void
 st_collections_group_programs_program_signal(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
+   Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-   ep->signal = parse_str(0);
+
+   _edje_program_remove(pc, current_program);
+   current_program->signal = parse_str(0);
+   _edje_program_insert(pc, current_program);
 }
 
 /**
@@ -6369,14 +6679,15 @@ st_collections_group_programs_program_signal(void)
 static void
 st_collections_group_programs_program_source(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
+   Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-   ep->source = parse_str(0);
+
+   _edje_program_remove(pc, current_program);
+   current_program->source = parse_str(0);
+   _edje_program_insert(pc, current_program);
 }
 
 /**
@@ -6394,19 +6705,13 @@ st_collections_group_programs_program_source(void)
 static void
 st_collections_group_programs_program_filter(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
-
    check_min_arg_count(1);
 
-   pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-
    if(is_param(1)) {
-          ep->filter.part = parse_str(0);
-          ep->filter.state = parse_str(1);
+          current_program->filter.part = parse_str(0);
+          current_program->filter.state = parse_str(1);
    } else {
-          ep->filter.state = parse_str(0);
+          current_program->filter.state = parse_str(0);
    }
 }
 
@@ -6424,15 +6729,10 @@ st_collections_group_programs_program_filter(void)
 static void
 st_collections_group_programs_program_in(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
-
    check_arg_count(2);
 
-   pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-   ep->in.from = parse_float_range(0, 0.0, 999999999.0);
-   ep->in.range = parse_float_range(1, 0.0, 999999999.0);
+   current_program->in.from = parse_float_range(0, 0.0, 999999999.0);
+   current_program->in.range = parse_float_range(1, 0.0, 999999999.0);
 }
 
 /**
@@ -6461,11 +6761,11 @@ st_collections_group_programs_program_in(void)
 static void
 st_collections_group_programs_program_action(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
+   ep = current_program;
    ep->action = parse_enum(0,
                           "STATE_SET", EDJE_ACTION_TYPE_STATE_SET,
                           "ACTION_STOP", EDJE_ACTION_TYPE_ACTION_STOP,
@@ -6576,20 +6876,15 @@ st_collections_group_programs_program_action(void)
 static void
 st_collections_group_programs_program_transition(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
-
    check_arg_count(2);
 
-   pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-   ep->tween.mode = parse_enum(0,
-                              "LINEAR", EDJE_TWEEN_MODE_LINEAR,
-                              "SINUSOIDAL", EDJE_TWEEN_MODE_SINUSOIDAL,
-                              "ACCELERATE", EDJE_TWEEN_MODE_ACCELERATE,
-                              "DECELERATE", EDJE_TWEEN_MODE_DECELERATE,
-                              NULL);
-   ep->tween.time = FROM_DOUBLE(parse_float_range(1, 0.0, 999999999.0));
+   current_program->tween.mode = parse_enum(0,
+                                           "LINEAR", EDJE_TWEEN_MODE_LINEAR,
+                                           "SINUSOIDAL", EDJE_TWEEN_MODE_SINUSOIDAL,
+                                           "ACCELERATE", EDJE_TWEEN_MODE_ACCELERATE,
+                                           "DECELERATE", EDJE_TWEEN_MODE_DECELERATE,
+                                           NULL);
+   current_program->tween.time = FROM_DOUBLE(parse_float_range(1, 0.0, 999999999.0));
 }
 
 /**
@@ -6607,13 +6902,13 @@ st_collections_group_programs_program_transition(void)
 static void
 st_collections_group_programs_program_target(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
+   ep = current_program;
      {
        Edje_Program_Target *et;
        char *name;
@@ -6660,13 +6955,13 @@ st_collections_group_programs_program_target(void)
 static void
 st_collections_group_programs_program_after(void)
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
+   ep = current_program;
      {
        Edje_Program_After *pa;
        char *name;
@@ -6698,49 +6993,37 @@ st_collections_group_programs_program_after(void)
 static void
 st_collections_group_programs_program_api(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
-
    check_min_arg_count(1);
 
-   pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
-   ep->api.name = parse_str(0);
+   current_program->api.name = parse_str(0);
 
    if (is_param(1))
      {
        check_arg_count(2);
-       ep->api.description = parse_str(1);
+       current_program->api.description = parse_str(1);
      }
 }
 
 static void
 st_collections_group_parts_part_api(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Old_Edje_Part *ep;
-
    check_min_arg_count(1);
 
-   pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->parts));
-   ep->api.name = parse_str(0);
+   current_program->api.name = parse_str(0);
    if (is_param(1))
      {
        check_arg_count(2);
-       ep->api.description = parse_str(1);
+       current_program->api.description = parse_str(1);
      }
 }
 
 static void
 ob_collections_group_programs_program_script(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
+   Edje_Part_Collection *pc;
    Code *cd;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
    cd = eina_list_data_get(eina_list_last(codes));
 
    if (!is_verbatim()) track_verbatim(1);
@@ -6753,10 +7036,10 @@ ob_collections_group_programs_program_script(void)
          {
             Code_Program *cp;
 
+            /* FIXME: Need to store the script somewhere to be restored when using edje_edit API */
             cp = mem_alloc(SZ(Code_Program));
             cp->l1 = get_verbatim_line1();
             cp->l2 = get_verbatim_line2();
-            cp->id = ep->id;
             cp->script = s;
             if (cd->shared && cd->is_lua)
               {
@@ -6766,8 +7049,10 @@ ob_collections_group_programs_program_script(void)
               }
             cd->is_lua = 0;
             cd->programs = eina_list_append(cd->programs, cp);
+            data_queue_program_lookup(pc, current_program->name, &(cp->id));
+
             set_verbatim(NULL, 0, 0);
-            ep->action = EDJE_ACTION_TYPE_SCRIPT;
+            current_program->action = EDJE_ACTION_TYPE_SCRIPT;
          }
      }
 }
@@ -6775,12 +7060,10 @@ ob_collections_group_programs_program_script(void)
 static void
 ob_collections_group_programs_program_lua_script(void)
 {
-   Old_Edje_Part_Collection *pc;
-   Edje_Program *ep;
+   Edje_Part_Collection *pc;
    Code *cd;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
-   ep = eina_list_data_get(eina_list_last(pc->programs));
    cd = eina_list_data_get(eina_list_last(codes));
 
    if (!is_verbatim()) track_verbatim(1);
@@ -6796,7 +7079,6 @@ ob_collections_group_programs_program_lua_script(void)
             cp = mem_alloc(SZ(Code_Program));
             cp->l1 = get_verbatim_line1();
             cp->l2 = get_verbatim_line2();
-            cp->id = ep->id;
             cp->script = s;
             if (cd->shared && !cd->is_lua)
               {
@@ -6806,8 +7088,9 @@ ob_collections_group_programs_program_lua_script(void)
               }
             cd->is_lua = 1;
             cd->programs = eina_list_append(cd->programs, cp);
+            data_queue_program_lookup(pc, current_program->name, &(cp->id));
             set_verbatim(NULL, 0, 0);
-            ep->action = EDJE_ACTION_TYPE_LUA_SCRIPT;
+            current_program->action = EDJE_ACTION_TYPE_LUA_SCRIPT;
          }
      }
 }
index 2296ffe..a0aa59a 100644 (file)
@@ -49,14 +49,14 @@ struct _External_Lookup
 
 struct _Part_Lookup
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    char *name;
    int *dest;
 };
 
 struct _Program_Lookup
 {
-   Old_Edje_Part_Collection *pc;
+   Edje_Part_Collection *pc;
    char *name;
    int *dest;
 };
@@ -93,10 +93,9 @@ struct _Code_Lookup
    Eina_Bool set;
 };
 
-static void data_process_string(Old_Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Old_Edje_Part_Collection *pc, char *name, char *ptr, int len));
+static void data_process_string(Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Edje_Part_Collection *pc, char *name, char *ptr, int len));
 
-Old_Edje_File *edje_file = NULL;
-Edje_File *new_edje_file = NULL;
+Edje_File *edje_file = NULL;
 Eina_List *edje_collections = NULL;
 Eina_List *externals = NULL;
 Eina_List *fonts = NULL;
@@ -140,21 +139,21 @@ data_setup(void)
 }
 
 static void
-check_image_part_desc (Old_Edje_Part_Collection *pc, Old_Edje_Part *ep,
-                       Old_Edje_Part_Description *epd, Eet_File *ef)
+check_image_part_desc (Edje_Part_Collection *pc, Edje_Part *ep,
+                       Edje_Part_Description_Image *epd, Eet_File *ef)
 {
-   Eina_List *l;
-   Edje_Part_Image_Id *iid;
+   unsigned int i;
 
-   return;
+#if 0 /* FIXME: This check sounds like not a usefull one */
    if (epd->image.id == -1)
-     error_and_abort(ef, "Collection %i: image attributes missing for "
-                    "part \"%s\", description \"%s\" %f\n",
-                    pc->id, ep->name, epd->common.state.name, epd->common.state.value);
+     ERR(ef, "Collection %s(%i): image attributes missing for "
+        "part \"%s\", description \"%s\" %f\n",
+        pc->part, pc->id, ep->name, epd->common.state.name, epd->common.state.value);
+#endif
 
-   EINA_LIST_FOREACH(epd->image.tween_list, l, iid)
+   for (i = 0; i < epd->image.tweens_count; ++i)
      {
-       if (iid->id == -1)
+       if (epd->image.tweens[i]->id == -1)
          error_and_abort(ef, "Collection %i: tween image id missing for "
                          "part \"%s\", description \"%s\" %f\n",
                          pc->id, ep->name, epd->common.state.name, epd->common.state.value);
@@ -162,18 +161,17 @@ check_image_part_desc (Old_Edje_Part_Collection *pc, Old_Edje_Part *ep,
 }
 
 static void
-check_packed_items(Old_Edje_Part_Collection *pc, Old_Edje_Part *ep, Eet_File *ef)
+check_packed_items(Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
 {
-   Eina_List *l;
-   Edje_Pack_Element *it;
+   unsigned int i;
 
-   EINA_LIST_FOREACH(ep->items, l, it)
+   for (i = 0; i < ep->items_count; ++i)
      {
-       if (it->type == EDJE_PART_TYPE_GROUP && !it->source)
+       if (ep->items[i]->type == EDJE_PART_TYPE_GROUP && !ep->items[i]->source)
          error_and_abort(ef, "Collection %i: missing source on packed item "
                          "of type GROUP in part \"%s\"\n",
                          pc->id, ep->name);
-       if (ep->type == EDJE_PART_TYPE_TABLE && (it->col < 0 || it->row < 0))
+       if (ep->type == EDJE_PART_TYPE_TABLE && (ep->items[i]->col < 0 || ep->items[i]->row < 0))
          error_and_abort(ef, "Collection %i: missing col/row on packed item "
                          "for part \"%s\" of type TABLE\n",
                          pc->id, ep->name);
@@ -181,23 +179,21 @@ check_packed_items(Old_Edje_Part_Collection *pc, Old_Edje_Part *ep, Eet_File *ef
 }
 
 static void
-check_part (Old_Edje_Part_Collection *pc, Old_Edje_Part *ep, Eet_File *ef)
+check_part (Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
 {
-   Old_Edje_Part_Description *epd = ep->default_desc;
-   Eina_List *l;
-   Old_Edje_Part_Description *data;
-
    /* FIXME: check image set and sort them. */
-   if (!epd)
+   if (!ep->default_desc)
      error_and_abort(ef, "Collection %i: default description missing "
                     "for part \"%s\"\n", pc->id, ep->name);
 
    if (ep->type == EDJE_PART_TYPE_IMAGE)
      {
-       check_image_part_desc (pc, ep, epd, ef);
+       unsigned int i;
 
-       EINA_LIST_FOREACH(ep->other_desc, l, data)
-         check_image_part_desc (pc, ep, data, ef);
+       check_image_part_desc(pc, ep, (Edje_Part_Description_Image*) ep->default_desc, ef);
+
+       for (i = 0; i < ep->other.desc_count; ++i)
+         check_image_part_desc (pc, ep, (Edje_Part_Description_Image*) ep->other.desc[i], ef);
      }
    else if ((ep->type == EDJE_PART_TYPE_BOX) ||
            (ep->type == EDJE_PART_TYPE_TABLE))
@@ -205,7 +201,7 @@ check_part (Old_Edje_Part_Collection *pc, Old_Edje_Part *ep, Eet_File *ef)
 }
 
 static void
-check_program (Old_Edje_Part_Collection *pc, Edje_Program *ep, Eet_File *ef)
+check_program (Edje_Part_Collection *pc, Edje_Program *ep, Eet_File *ef)
 {
    switch (ep->action)
      {
@@ -228,9 +224,9 @@ data_write_header(Eet_File *ef)
 {
    int bytes = 0;
 
-   if (new_edje_file)
+   if (edje_file)
      {
-       if (new_edje_file->collection)
+       if (edje_file->collection)
          {
             Edje_Part_Collection_Directory_Entry *ce;
 
@@ -243,7 +239,7 @@ data_write_header(Eet_File *ef)
                  if (!ce->entry)
                    error_and_abort(ef, "Collection %i: name missing.\n", ce->id);
 
-                 it = eina_hash_iterator_data_new(new_edje_file->collection);
+                 it = eina_hash_iterator_data_new(edje_file->collection);
 
                  EINA_ITERATOR_FOREACH(it, sce)
                    if (ce->id == sce->id)
@@ -257,10 +253,10 @@ data_write_header(Eet_File *ef)
 
                  eina_iterator_free(it);
 
-                 eina_hash_direct_add(new_edje_file->collection, ce->entry, ce);
+                 eina_hash_direct_add(edje_file->collection, ce->entry, ce);
               }
          }
-       bytes = eet_data_write(ef, edd_edje_file, "edje/file", new_edje_file, 1);
+       bytes = eet_data_write(ef, edd_edje_file, "edje/file", edje_file, 1);
        if (bytes <= 0)
          error_and_abort(ef, "Unable to write \"edje_file\" entry to \"%s\" \n",
                          file_out);
@@ -461,7 +457,7 @@ data_write_images(Eet_File *ef, int *image_num, int *input_bytes, int *input_raw
    int bytes = 0;
    int total_bytes = 0;
 
-   if ((new_edje_file) && (new_edje_file->image_dir))
+   if ((edje_file) && (edje_file->image_dir))
      {
        Ecore_Evas *ee;
        Evas *evas;
@@ -476,9 +472,9 @@ data_write_images(Eet_File *ef, int *image_num, int *input_bytes, int *input_raw
                          "load.\n");
 
        evas = ecore_evas_get(ee);
-       for (i = 0; i < new_edje_file->image_dir->entries_count; i++)
+       for (i = 0; i < edje_file->image_dir->entries_count; i++)
          {
-            img = &new_edje_file->image_dir->entries[i];
+            img = &edje_file->image_dir->entries[i];
 
             if (img->source_type == EDJE_IMAGE_SOURCE_TYPE_EXTERNAL)
               {
@@ -635,20 +631,26 @@ data_write_images(Eet_File *ef, int *image_num, int *input_bytes, int *input_raw
 static void
 check_groups(Eet_File *ef)
 {
+   Edje_Part_Collection *pc;
    Eina_List *l;
-   Old_Edje_Part_Collection *pc;
 
    /* sanity checks for parts and programs */
    EINA_LIST_FOREACH(edje_collections, l, pc)
      {
-       Eina_List *ll;
-       Old_Edje_Part *part;
-       Edje_Program *prog;
+       unsigned int i;
+
+       for (i = 0; i < pc->parts_count; ++i)
+         check_part(pc, pc->parts[i], ef);
 
-       EINA_LIST_FOREACH(pc->parts, ll, part)
-         check_part(pc, part, ef);
-       EINA_LIST_FOREACH(pc->programs, ll, prog)
-         check_program(pc, prog, ef);
+#define CHECK_PROGRAM(Type, Pc, It)                            \
+       for (It = 0; It < Pc->programs.Type ## _count; ++It)    \
+         check_program(Pc, Pc->programs.Type[i], ef);          \
+
+       CHECK_PROGRAM(fnmatch, pc, i);
+       CHECK_PROGRAM(strcmp, pc, i);
+       CHECK_PROGRAM(strncmp, pc, i);
+       CHECK_PROGRAM(strrncmp, pc, i);
+       CHECK_PROGRAM(nocmp, pc, i);
      }
 }
 
@@ -1009,10 +1011,6 @@ void
 data_write(void)
 {
    Eet_File *ef;
-   Edje_Part_Collection_Directory_Entry *ce;
-   Old_Edje_Part_Collection *pc;
-   Eina_Iterator *it;
-   Eina_List *tmp = NULL;
    int input_bytes = 0;
    int total_bytes = 0;
    int src_bytes = 0;
@@ -1039,30 +1037,6 @@ data_write(void)
 
    check_groups(ef);
 
-   new_edje_file = _edje_file_convert(ef, edje_file);
-   _edje_file_set(new_edje_file);
-
-   if (!new_edje_file)
-     {
-       ERR("%s: Error convertion failed for \"%s\"", progname, file_out);
-       exit(-1);
-     }
-
-   /* convert old structure to new one */
-   it = eina_hash_iterator_data_new(new_edje_file->collection);
-
-   EINA_ITERATOR_FOREACH(it, ce)
-     {
-       pc = eina_list_nth(edje_collections, ce->id);
-       tmp = eina_list_append(tmp,
-                              _edje_collection_convert(ef,
-                                                       ce, pc));
-     }
-
-   eina_iterator_free(it);
-   edje_collections = eina_list_free(edje_collections);
-   edje_collections = tmp;
-
    total_bytes += data_write_header(ef);
    total_bytes += data_write_fonts(ef, &font_num, &input_bytes,
                                   &input_raw_bytes);
@@ -1132,7 +1106,7 @@ data_queue_group_lookup(char *name)
 }
 
 void
-data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest)
+data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
 {
    Part_Lookup *pl;
 
@@ -1144,7 +1118,7 @@ data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest)
 }
 
 void
-data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest)
+data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
 {
    Program_Lookup *pl;
 
@@ -1203,154 +1177,184 @@ handle_slave_lookup(Eina_List *list, int *master, int value)
 void
 data_process_lookups(void)
 {
+   Edje_Part_Collection *pc;
+   Part_Lookup *part;
+   Program_Lookup *program;
+   Group_Lookup *group;
+   Image_Lookup *image;
    Eina_List *l;
+   void *data;
 
-   while (part_lookups)
+   EINA_LIST_FOREACH(edje_collections, l, pc)
      {
-       Part_Lookup *pl;
-       Old_Edje_Part *ep;
+       unsigned int count = 0;
+       unsigned int i;
 
-       pl = eina_list_data_get(part_lookups);
+#define PROGRAM_ID_SET(Type, Pc, It, Count)                            \
+       for (It = 0; It < Pc->programs.Type ## _count; ++It)            \
+         {                                                             \
+            Pc->programs.Type[It]->id = Count++;                       \
+         }
+
+       PROGRAM_ID_SET(fnmatch, pc, i, count);
+       PROGRAM_ID_SET(strcmp, pc, i, count);
+       PROGRAM_ID_SET(strncmp, pc, i, count);
+       PROGRAM_ID_SET(strrncmp, pc, i, count);
+       PROGRAM_ID_SET(nocmp, pc, i, count);
+
+#undef PROGRAM_ID_SET
+     }
 
-       EINA_LIST_FOREACH(pl->pc->parts, l, ep)
+   EINA_LIST_FREE(part_lookups, part)
+     {
+       Edje_Part *ep;
+       unsigned int i;
+
+       for (i = 0; i < part->pc->parts_count; ++i)
          {
-            if ((ep->name) && (!strcmp(ep->name, pl->name)))
+            ep = part->pc->parts[i];
+
+            if ((ep->name) && (!strcmp(ep->name, part->name)))
               {
-                 handle_slave_lookup(part_slave_lookups, pl->dest, ep->id);
-                 *(pl->dest) = ep->id;
+                 handle_slave_lookup(part_slave_lookups, part->dest, ep->id);
+                 *(part->dest) = ep->id;
                  break;
               }
          }
-       if (!l)
+
+       if (i == part->pc->parts_count)
          {
             ERR("%s: Error. Unable to find part name \"%s\".",
-                progname, pl->name);
+                progname, part->name);
             exit(-1);
          }
-       part_lookups = eina_list_remove(part_lookups, pl);
-       free(pl->name);
-       free(pl);
+
+       free(part->name);
+       free(part);
      }
 
-   while (program_lookups)
+   EINA_LIST_FREE(program_lookups, program)
      {
-       Program_Lookup *pl;
-       Edje_Program *ep;
+       unsigned int i;
+       Eina_Bool find = EINA_FALSE;
+
+#define PROGRAM_MATCH(Type, Pl, It)                                    \
+       for (It = 0; It < Pl->pc->programs.Type ## _count; ++It)        \
+         {                                                             \
+            Edje_Program *ep;                                          \
+                                                                       \
+            ep = Pl->pc->programs.Type[It];                            \
+                                                                       \
+            if ((ep->name) && (!strcmp(ep->name, Pl->name)))           \
+              {                                                        \
+                 *(Pl->dest) = ep->id;                                 \
+                 find = EINA_TRUE;                                     \
+                 break;                                                \
+              }                                                        \
+         }
 
-       pl = eina_list_data_get(program_lookups);
+       PROGRAM_MATCH(fnmatch, program, i);
+       PROGRAM_MATCH(strcmp, program, i);
+       PROGRAM_MATCH(strncmp, program, i);
+       PROGRAM_MATCH(strrncmp, program, i);
+       PROGRAM_MATCH(nocmp, program, i);
 
-       EINA_LIST_FOREACH(pl->pc->programs, l, ep)
-         {
-            if ((ep->name) && (!strcmp(ep->name, pl->name)))
-              {
-                 *(pl->dest) = ep->id;
-                 break;
-              }
-         }
-       if (!l)
+#undef PROGRAM_MATCH
+
+       if (!find)
          {
             ERR("%s: Error. Unable to find program name \"%s\".",
-                progname, pl->name);
+                progname, program->name);
             exit(-1);
          }
-       program_lookups = eina_list_remove(program_lookups, pl);
-       free(pl->name);
-       free(pl);
+
+       free(program->name);
+       free(program);
      }
 
-   while (group_lookups)
+   EINA_LIST_FREE(group_lookups, group)
      {
-        Group_Lookup *gl;
        Edje_Part_Collection_Directory_Entry *de;
 
-        gl = eina_list_data_get(group_lookups);
+       de = eina_hash_find(edje_file->collection, group->name);
 
-       EINA_LIST_FOREACH(edje_file->collection_dir->entries, l, de)
-          {
-             if (!strcmp(de->entry, gl->name))
-               {
-                  break;
-               }
-          }
-        if (!l)
+       if (!de)
           {
              ERR("%s: Error. Unable to find group name \"%s\".",
-                progname, gl->name);
+                progname, group->name);
              exit(-1);
           }
-        group_lookups = eina_list_remove(group_lookups, gl);
-        free(gl->name);
-        free(gl);
+
+        free(group->name);
+        free(group);
      }
 
-   while (image_lookups)
+   EINA_LIST_FREE(image_lookups, image)
      {
-       Image_Lookup *il;
        Edje_Image_Directory_Entry *de;
+       Eina_Bool find = EINA_FALSE;
 
-       il = eina_list_data_get(image_lookups);
-
-       if (!edje_file->image_dir)
-         l = NULL;
-       else
+       if (edje_file->image_dir)
          {
-            EINA_LIST_FOREACH(edje_file->image_dir->entries, l, de)
+            unsigned int i;
+
+            for (i = 0; i < edje_file->image_dir->entries_count; ++i)
               {
-                 if ((de->entry) && (!strcmp(de->entry, il->name)))
+                 de = edje_file->image_dir->entries + i;
+
+                 if ((de->entry) && (!strcmp(de->entry, image->name)))
                    {
-                      handle_slave_lookup(image_slave_lookups, il->dest, de->id);
+                      handle_slave_lookup(image_slave_lookups, image->dest, de->id);
                       if (de->source_type == EDJE_IMAGE_SOURCE_TYPE_EXTERNAL)
-                        *(il->dest) = -de->id - 1;
+                        *(image->dest) = -de->id - 1;
                       else
-                        *(il->dest) = de->id;
-                      *(il->set) = EINA_FALSE;
+                        *(image->dest) = de->id;
+                      *(image->set) = EINA_FALSE;
+                      find = EINA_TRUE;
                       break;
                    }
               }
 
-            if (!l)
+            if (!find)
               {
                 Edje_Image_Directory_Set *set;
 
-                EINA_LIST_FOREACH(edje_file->image_dir->sets, l, set)
+                for (i = 0; i < edje_file->image_dir->sets_count; ++i)
                   {
-                    if ((set->name) && (!strcmp(set->name, il->name)))
-                      {
-                        handle_slave_lookup(image_slave_lookups, il->dest, set->id);
-                        *(il->dest) = set->id;
-                        *(il->set) = EINA_TRUE;
-                        break;
-                      }
+                     set = edje_file->image_dir->sets + i;
+
+                     if ((set->name) && (!strcmp(set->name, image->name)))
+                       {
+                          handle_slave_lookup(image_slave_lookups, image->dest, set->id);
+                          *(image->dest) = set->id;
+                          *(image->set) = EINA_TRUE;
+                          find = EINA_TRUE;
+                          break;
+                       }
                   }
               }
          }
 
-       if (!l)
+       if (!find)
          {
             ERR("%s: Error. Unable to find image name \"%s\".",
-                progname, il->name);
+                progname, image->name);
             exit(-1);
          }
-       image_lookups = eina_list_remove(image_lookups, il);
-       free(il->name);
-       free(il);
-     }
 
-   while (part_slave_lookups)
-     {
-        free(eina_list_data_get(part_slave_lookups));
-       part_slave_lookups = eina_list_remove_list(part_slave_lookups, part_slave_lookups);
+       free(image->name);
+       free(image);
      }
 
-   while (image_slave_lookups)
-     {
-        free(eina_list_data_get(image_slave_lookups));
-       image_slave_lookups = eina_list_remove_list(image_slave_lookups, image_slave_lookups);
-     }
+   EINA_LIST_FREE(part_slave_lookups, data)
+     free(data);
+
+   EINA_LIST_FREE(image_slave_lookups, data)
+     free(data);
 }
 
 static void
-data_process_string(Old_Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Old_Edje_Part_Collection *pc, char *name, char* ptr, int len))
+data_process_string(Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Edje_Part_Collection *pc, char *name, char* ptr, int len))
 {
    char *p;
    char *key;
@@ -1461,7 +1465,7 @@ data_process_string(Old_Edje_Part_Collection *pc, const char *prefix, char *s, v
 }
 
 static void
-_data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, char *ptr, int len)
+_data_queue_part_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
    cl = mem_alloc(SZ(Code_Lookup));
@@ -1473,7 +1477,7 @@ _data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, char *ptr, int
    code_lookups = eina_list_append(code_lookups, cl);
 }
 static void
-_data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, char *ptr, int len)
+_data_queue_program_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
 
@@ -1486,12 +1490,12 @@ _data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, char *ptr,
    code_lookups = eina_list_append(code_lookups, cl);
 }
 static void
-_data_queue_group_lookup(Old_Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr __UNUSED__, int len __UNUSED__)
+_data_queue_group_lookup(Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr __UNUSED__, int len __UNUSED__)
 {
    data_queue_group_lookup(name);
 }
 static void
-_data_queue_image_pc_lookup(Old_Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr, int len)
+_data_queue_image_pc_lookup(Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
 
@@ -1511,23 +1515,25 @@ data_process_scripts(void)
 
    for (l = codes, l2 = edje_collections; (l) && (l2); l = eina_list_next(l), l2 = eina_list_next(l2))
      {
+       Edje_Part_Collection *pc;
        Code *cd;
-       Old_Edje_Part_Collection *pc;
 
        cd = eina_list_data_get(l);
        pc = eina_list_data_get(l2);
-       if ((cd->shared) || (cd->programs))
+
+       if ((cd->shared) && (!cd->is_lua))
+         {
+            data_process_string(pc, "PART",    cd->shared, _data_queue_part_lookup);
+            data_process_string(pc, "PROGRAM", cd->shared, _data_queue_program_lookup);
+            data_process_string(pc, "IMAGE",   cd->shared, _data_queue_image_pc_lookup);
+            data_process_string(pc, "GROUP",   cd->shared, _data_queue_group_lookup);
+         }
+
+       if (cd->programs)
          {
-            Eina_List *ll;
             Code_Program *cp;
+            Eina_List *ll;
 
-            if ((cd->shared) && (!cd->is_lua))
-              {
-                 data_process_string(pc, "PART",    cd->shared, _data_queue_part_lookup);
-                 data_process_string(pc, "PROGRAM", cd->shared, _data_queue_program_lookup);
-                 data_process_string(pc, "IMAGE",   cd->shared, _data_queue_image_pc_lookup);
-                 data_process_string(pc, "GROUP",   cd->shared, _data_queue_group_lookup);
-              }
             EINA_LIST_FOREACH(cd->programs, ll, cp)
               {
                  if (cp->script)
index 66cd8da..7e9a73e 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "edje_cc.h"
 #include "edje_prefix.h"
+#include "edje_convert.h"
 
 static const Edje_File *_current_edje_file = NULL;
 
index bd85ccd..3ae46a2 100644 (file)
@@ -4725,7 +4725,7 @@ edje_edit_program_del(Evas_Object *obj, const char *prog)
 
    //Remove program from programs list
    id = epr->id;
-   edje_edit_program_remove(ed, epr);
+   _edje_program_remove(ed->collection, epr);
 
    /* fix table program */
    if (epr->id != ed->table_programs_size - 1)
@@ -4844,12 +4844,12 @@ edje_edit_program_source_set(Evas_Object *obj, const char *prog, const char *sou
    if (!source) return EINA_FALSE;
 
    /* Remove from program array */
-   edje_edit_program_remove(ed, epr);
+   _edje_program_remove(ed->collection, epr);
    _edje_if_string_free(ed, epr->source);
 
    /* Insert it back */
    epr->source = eina_stringshare_add(source);
-   edje_edit_program_insert(ed, epr);
+   _edje_program_insert(ed->collection, epr);
 
    //Update patterns
    _edje_programs_patterns_clean(ed);
@@ -4923,12 +4923,12 @@ edje_edit_program_signal_set(Evas_Object *obj, const char *prog, const char *sig
    if (!signal) return EINA_FALSE;
 
    /* Remove from program array */
-   edje_edit_program_remove(ed, epr);
+   _edje_program_remove(ed->collection, epr);
    _edje_if_string_free(ed, epr->signal);
 
    /* Insert it back */
    epr->signal = eina_stringshare_add(signal);
-   edje_edit_program_insert(ed, epr);
+   _edje_program_insert(ed->collection, epr);
 
    //Update patterns
    _edje_programs_patterns_clean(ed);
index da482d1..94f826c 100644 (file)
@@ -202,7 +202,7 @@ struct _Edje_Aspect
 
 struct _Edje_String
 {
-   const char *str;
+   char *str;
    unsigned int id;
 };
 
@@ -1754,8 +1754,8 @@ edje_program_is_strrncmp(const char *str)
    return EINA_TRUE;
 }
 
-void edje_edit_program_insert(Edje *ed, Edje_Program *p);
-void edje_edit_program_remove(Edje *ed, Edje_Program *p);
+void _edje_program_insert(Edje_Part_Collection *ed, Edje_Program *p);
+void _edje_program_remove(Edje_Part_Collection *ed, Edje_Program *p);
 
 // new lua stuff - supercedes the old
 #define LUA2 1
index 4d7d191..a0f1944 100644 (file)
@@ -4828,7 +4828,7 @@ _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const ch
 }
 
 void
-edje_edit_program_remove(Edje *ed, Edje_Program *p)
+_edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
 {
    Edje_Program ***array;
    unsigned int *count;
@@ -4836,31 +4836,31 @@ edje_edit_program_remove(Edje *ed, Edje_Program *p)
 
    if (!p->signal && !p->source)
      {
-       array = &ed->collection->programs.nocmp;
-       count = &ed->collection->programs.nocmp_count;
+       array = &edc->programs.nocmp;
+       count = &edc->programs.nocmp_count;
      }
    else if (p->signal && strpbrk(p->signal, "*?[\\") == NULL
            && p->source && strpbrk(p->source, "*?[\\") == NULL)
      {
-       array = &ed->collection->programs.strcmp;
-       count = &ed->collection->programs.strcmp_count;
+       array = &edc->programs.strcmp;
+       count = &edc->programs.strcmp_count;
      }
    else if (p->signal && edje_program_is_strncmp(p->signal)
            && p->source && edje_program_is_strncmp(p->source))
      {
-       array = &ed->collection->programs.strncmp;
-       count = &ed->collection->programs.strncmp_count;
+       array = &edc->programs.strncmp;
+       count = &edc->programs.strncmp_count;
      }
    else if (p->signal && edje_program_is_strrncmp(p->signal)
            && p->source && edje_program_is_strrncmp(p->source))
      {
-       array = &ed->collection->programs.strrncmp;
-       count = &ed->collection->programs.strrncmp_count;
+       array = &edc->programs.strrncmp;
+       count = &edc->programs.strrncmp_count;
      }
    else
      {
-       array = &ed->collection->programs.fnmatch;
-       count = &ed->collection->programs.fnmatch_count;
+       array = &edc->programs.fnmatch;
+       count = &edc->programs.fnmatch_count;
      }
 
    for (i = 0; i < *count; ++i)
@@ -4873,38 +4873,38 @@ edje_edit_program_remove(Edje *ed, Edje_Program *p)
 }
 
 void
-edje_edit_program_insert(Edje *ed, Edje_Program *p)
+_edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
 {
    Edje_Program ***array;
    unsigned int *count;
 
    if (!p->signal && !p->source)
      {
-       array = &ed->collection->programs.nocmp;
-       count = &ed->collection->programs.nocmp_count;
+       array = &edc->programs.nocmp;
+       count = &edc->programs.nocmp_count;
      }
    else if (p->signal && strpbrk(p->signal, "*?[\\") == NULL
            && p->source && strpbrk(p->source, "*?[\\") == NULL)
      {
-       array = &ed->collection->programs.strcmp;
-       count = &ed->collection->programs.strcmp_count;
+       array = &edc->programs.strcmp;
+       count = &edc->programs.strcmp_count;
      }
    else if (p->signal && edje_program_is_strncmp(p->signal)
            && p->source && edje_program_is_strncmp(p->source))
      {
-       array = &ed->collection->programs.strncmp;
-       count = &ed->collection->programs.strncmp_count;
+       array = &edc->programs.strncmp;
+       count = &edc->programs.strncmp_count;
      }
    else if (p->signal && edje_program_is_strrncmp(p->signal)
            && p->source && edje_program_is_strrncmp(p->source))
      {
-       array = &ed->collection->programs.strrncmp;
-       count = &ed->collection->programs.strrncmp_count;
+       array = &edc->programs.strrncmp;
+       count = &edc->programs.strrncmp_count;
      }
    else
      {
-       array = &ed->collection->programs.fnmatch;
-       count = &ed->collection->programs.fnmatch_count;
+       array = &edc->programs.fnmatch;
+       count = &edc->programs.fnmatch_count;
      }
 
    *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));