rimmed pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=04e81aa200c399f28acadef1ed59c0313c3c6873

commit 04e81aa200c399f28acadef1ed59c0313c3c6873
Author: Andrii Kroitor <[email protected]>
Date:   Wed Jun 8 11:28:14 2016 +0300

    resource manager: refactor
---
 src/bin/common/validator.c                 |  14 +-
 src/bin/project_manager/group_manager.c    | 250 ++++++++++++++--------------
 src/bin/project_manager/project_manager.c  |  37 ++---
 src/bin/project_manager/resource_manager.c | 258 ++++++++++++++++++++++-------
 src/bin/project_manager/resource_manager.h | 117 +++++--------
 src/bin/ui/colorclass_manager.c            |  15 +-
 src/bin/ui/image_manager.c                 |  20 ++-
 src/bin/ui/popup.c                         |   6 +-
 src/bin/ui/property/property_group.c       |  15 +-
 src/bin/ui/sound_manager.c                 |  34 ++--
 src/bin/ui/style_manager.c                 |  22 ++-
 src/bin/ui/tabs.c                          |  10 +-
 src/bin/ui/workspace/group_navigator.c     |  24 +--
 src/bin/ui/workspace/groupview_calc.c      |  12 +-
 src/bin/ui/workspace/workspace.c           |  94 +++++++----
 15 files changed, 541 insertions(+), 387 deletions(-)

diff --git a/src/bin/common/validator.c b/src/bin/common/validator.c
index 5875c83..6659f16 100644
--- a/src/bin/common/validator.c
+++ b/src/bin/common/validator.c
@@ -83,7 +83,8 @@ resource_name_validator_status_get(Resource_Name_Validator 
*validator)
 Eina_Bool
 resource_name_validator_helper(void *data, const Eo_Event *event)
 {
-   Resource *res;
+   Resource *res = NULL;
+   Resource request;
    Elm_Validate_Content *vc = event->info;
    Resource_Name_Validator *validator = (Resource_Name_Validator *)data;
 
@@ -94,10 +95,13 @@ resource_name_validator_helper(void *data, const Eo_Event 
*event)
    if (validator->status == ELM_REG_NOERROR) /* new name match regex */
      {
         /* check if resource with this name already exists in list */
-        if (validator->sorted)
-          res = pm_resource_get(*validator->list, vc->text);
-        else
-          res = pm_resource_unsorted_get(*validator->list, vc->text);
+        if (eina_list_data_get(*validator->list))
+          {
+             request.name = vc->text;
+             request.resource_type = ((Resource 
*)eina_list_data_get(*validator->list))->resource_type;
+             TODO("remove sorted flag");
+             res = resource_get(*validator->list, &request);
+          }
 
         if (!res) /* name is free */
           validator->status = ELM_REG_NOERROR;
diff --git a/src/bin/project_manager/group_manager.c 
b/src/bin/project_manager/group_manager.c
index f116415..15e7daf 100644
--- a/src/bin/project_manager/group_manager.c
+++ b/src/bin/project_manager/group_manager.c
@@ -76,8 +76,8 @@ gm_group_edit_object_reload(Project *pro, Group *group)
    EINA_LIST_FOREACH(group->parts, l, part)
       edje_edit_part_selected_state_set(group->edit_object,
                                         part->name,
-                                        part->current_state->parsed_name,
-                                        part->current_state->parsed_val);
+                                        part->current_state->name,
+                                        part->current_state->val);
 }
 
 void
@@ -415,62 +415,67 @@ gm_group_used_fonts_get(const char *edj, const char 
*group)
 State *
 gm_state_add(Project *pro, Part *part, const char *state_name)
 {
+   Resource *resource, request;
    State *state;
-   Eina_Stringshare *image_name, *name;
+   Eina_Stringshare *parsed_state_name, *image_name, *name;
+   double val;
    Eina_List *tween_list, *l;
 
    assert(pro != NULL);
    assert(part != NULL);
    assert(state_name != NULL);
 
-   state = mem_calloc(1, sizeof(State));
-   state->name = eina_stringshare_add(state_name);
+   state_name_split(state_name, &parsed_state_name, &val);
+
+   state = (State *) resource_add(parsed_state_name, RESOURCE_TYPE_STATE);
+   state->val = val;
    state->part = part;
+   eina_stringshare_del(parsed_state_name);
 
-   part->states = eina_list_sorted_insert(part->states, (Eina_Compare_Cb) 
resource_cmp, state);
+   resource_insert(&part->states, (Resource *)state);
 
    /* default 0.0 should be allways first state */
    if (part->current_state == NULL)
      part->current_state = state;
 
-   state_name_split(state_name, &state->parsed_name, &state->parsed_val);
-
-   #define USAGE_ADD(TYPE, USAGE_LIST) \
+   #define USAGE_ADD(TYPE, LIST, USAGE_TYPE) \
    name = edje_edit_state_ ## TYPE ## _get(part->group->edit_object, \
                                            part->name, \
-                                           state->parsed_name, \
-                                           state->parsed_val); \
+                                           state->name, \
+                                           state->val); \
    if (name) \
      { \
-        pm_resource_usage_add(USAGE_LIST, name, state); \
+        request.resource_type = USAGE_TYPE; \
+        request.name = name; \
+        resource = resource_get(LIST, &request); \
+        resource_used_in_add(resource, (Resource *)state); \
         edje_edit_string_free(name); \
      }
 
    #define COLORCLASS_USAGE_ADD() \
    name = edje_edit_state_color_class_get(part->group->edit_object, \
                                           part->name, \
-                                          state->parsed_name, \
-                                          state->parsed_val); \
+                                          state->name, \
+                                          state->val); \
    if (name) \
      { \
-        if (!pm_resource_usage_add(pro->colorclasses, name, state)) \
+        request.resource_type = RESOURCE_TYPE_COLORCLASS; \
+        request.name = name; \
+        resource = resource_get(pro->colorclasses, &request); \
+        if (!resource) \
           { \
              /* Colorclass can be specified but not defined in edc.
                 If colorclass don't exist yet adding it */ \
              TODO("move this code to colorclass resource manager"); \
              edje_edit_color_class_add(pro->global_object, name); \
-             Colorclass_Resource *res = mem_calloc(1, 
sizeof(Colorclass_Resource)); \
-             res->name = eina_stringshare_add(name); \
+             Colorclass_Resource *res = (Colorclass_Resource 
*)resource_add(name, RESOURCE_TYPE_COLORCLASS); \
              res->color1.r = res->color1.g = res->color1.b = res->color1.a = 
255; \
              res->color2.r = res->color2.g = res->color2.b = res->color2.a = 
255; \
              res->color3.r = res->color3.g = res->color3.b = res->color3.a = 
255; \
-             pro->colorclasses = eina_list_sorted_insert(pro->colorclasses, 
(Eina_Compare_Cb) resource_cmp, res); \
-             if (!pm_resource_usage_add(pro->colorclasses, name, state)) \
-               { \
-                  ERR("Err: resource not found: %s", name); \
-                  abort(); \
-               }; \
+             resource = (Resource *) res; \
+             resource_insert(&pro->colorclasses, resource); \
           } \
+        resource_used_in_add(resource, (Resource *)state); \
         edje_edit_string_free(name); \
      }
 
@@ -486,23 +491,28 @@ gm_state_add(Project *pro, Part *part, const char 
*state_name)
       case EDJE_PART_TYPE_IMAGE:
          COLORCLASS_USAGE_ADD();
 
-         USAGE_ADD(image, pro->images);
+         USAGE_ADD(image, pro->images, RESOURCE_TYPE_IMAGE);
 
          tween_list = edje_edit_state_tweens_list_get(part->group->edit_object,
                                                       part->name,
-                                                      state->parsed_name,
-                                                      state->parsed_val);
+                                                      state->name,
+                                                      state->val);
          EINA_LIST_FOREACH(tween_list, l, image_name)
-            pm_resource_usage_add(pro->images, image_name, state);
+           {
+              request.resource_type = RESOURCE_TYPE_IMAGE;
+              request.name = image_name;
+              resource = resource_get(pro->images, &request);
+              resource_used_in_add(resource, (Resource *)state);
+           }
          edje_edit_string_list_free(tween_list);
 
          break;
       case EDJE_PART_TYPE_TEXT:
          COLORCLASS_USAGE_ADD();
-         USAGE_ADD(font, pro->fonts);
+         //USAGE_ADD(font, pro->fonts, RESOURCE_TYPE_FONT);
          break;
       case EDJE_PART_TYPE_TEXTBLOCK:
-         USAGE_ADD(text_style, pro->styles);
+         USAGE_ADD(text_style, pro->styles, RESOURCE_TYPE_STYLE);
          break;
       default:
          break;
@@ -515,6 +525,7 @@ gm_state_add(Project *pro, Part *part, const char 
*state_name)
 Part *
 gm_part_add(Project *pro, Group *group, const char *part_name)
 {
+   Resource *resource, request;
    Part *part;
    Eina_List *states, *l;
    Eina_Stringshare *state_name, *group_name, *item_name;
@@ -523,12 +534,11 @@ gm_part_add(Project *pro, Group *group, const char 
*part_name)
    assert(group != NULL);
    assert(part_name != NULL);
 
-   part = mem_calloc(1, sizeof(Part));
-   part->name = eina_stringshare_add(part_name);
+   part = (Part*)resource_add(part_name, RESOURCE_TYPE_PART);
    part->group = group;
    part->type = edje_edit_part_type_get(group->edit_object, part_name);
    part->visible = true;
-   group->parts = eina_list_append(group->parts, part);
+   resource_insert(&group->parts, (Resource *)part);
    states = edje_edit_part_states_list_get(group->edit_object, part_name);
    EINA_LIST_FOREACH(states, l, state_name)
      gm_state_add(pro, part, state_name);
@@ -543,7 +553,10 @@ gm_part_add(Project *pro, Group *group, const char 
*part_name)
                                                 part->name); \
    if (group_name) \
      { \
-        pm_resource_usage_add(pro->groups, group_name, part); \
+        request.resource_type = RESOURCE_TYPE_GROUP; \
+        request.name = group_name; \
+        resource = resource_get(pro->groups, &request); \
+        resource_used_in_add(resource, (Resource *)part); \
         edje_edit_string_free(group_name); \
      }
 
@@ -558,7 +571,11 @@ gm_part_add(Project *pro, Group *group, const char 
*part_name)
                                                           item_name);
               if (group_name)
                 {
-                   pm_resource_usage_add(pro->groups, group_name, part);
+                   request.resource_type = RESOURCE_TYPE_GROUP;
+                   request.name = group_name;
+                   resource = resource_get(pro->groups, &request);
+                   TODO("replace with item");
+                   resource_used_in_add(resource, (Resource *)part);
                    edje_edit_string_free(group_name);
                 }
            }
@@ -584,13 +601,15 @@ gm_part_add(Project *pro, Group *group, const char 
*part_name)
 static void
 _group_load(Project *pro, Group *group)
 {
+   Resource request;
+   State state_request;
    Eina_Stringshare *main_group_name;
    Eina_List *parts, *l, *lt, *programs, *targets, *datas;
    Eina_Stringshare *part_name, *program_name, *target_name, *state_name,
-                    *state_full_name, *sample_name, *tone_name, 
*group_data_name;
+                    *sample_name, *tone_name, *group_data_name;
    double state_val;
    Part *part;
-   State *state;
+   Resource *state, *sound, *tone;
    Program *program;
 
    assert(pro != NULL);
@@ -603,14 +622,10 @@ _group_load(Project *pro, Group *group)
    if (edje_edit_group_alias_is(group->edit_object, group->name))
      {
         main_group_name = edje_edit_group_aliased_get(group->edit_object, 
group->name);
-        group->main_group = pm_resource_get(pro->groups, main_group_name);
-        if (!(group->main_group))
-          {
-             group->main_group = mem_calloc(1, sizeof(Group));
-             group->main_group->name = eina_stringshare_add(main_group_name);
-             pro->groups = eina_list_append(pro->groups, group->main_group);
-          }
-        group->main_group->aliases = 
eina_list_sorted_insert(group->main_group->aliases, 
(Eina_Compare_Cb)resource_cmp, group);
+        request.resource_type = RESOURCE_TYPE_GROUP;
+        request.name = main_group_name;
+        group->main_group = (Group *)resource_get(pro->groups, &request);
+        resource_insert(&group->main_group->aliases, (Resource *)group);
         edje_edit_string_free(main_group_name);
      }
    else
@@ -627,10 +642,9 @@ _group_load(Project *pro, Group *group)
         programs = edje_edit_programs_list_get(group->edit_object);
         EINA_LIST_FOREACH(programs, l, program_name)
           {
-            program = mem_calloc(1, sizeof(Program));
-            program->name = eina_stringshare_add(program_name);
+            program = (Program *)resource_add(program_name, 
RESOURCE_TYPE_PROGRAM);
             program->type = edje_edit_program_action_get(group->edit_object, 
program_name);
-            group->programs = eina_list_sorted_insert(group->programs, 
(Eina_Compare_Cb)resource_cmp, program);
+            resource_insert(&group->programs, (Resource *)program);
           }
         edje_edit_string_list_free(programs);
         EINA_LIST_FOREACH(group->programs, l, program)
@@ -641,23 +655,24 @@ _group_load(Project *pro, Group *group)
                    targets = edje_edit_program_targets_get(group->edit_object, 
program->name);
                    state_name = 
edje_edit_program_state_get(group->edit_object, program->name);
                    state_val = edje_edit_program_value_get(group->edit_object, 
program->name);
-                   state_full_name = eina_stringshare_printf("%s %.2f", 
state_name, state_val);
+                   state_request.name = state_name;
+                   state_request.val = state_val;
+                   state_request.resource_type = RESOURCE_TYPE_STATE;
                    eina_stringshare_del(state_name);
                    EINA_LIST_FOREACH(targets, lt, target_name)
                      {
-                        part = (Part *) pm_resource_unsorted_get(group->parts, 
target_name);
-                        state = (State *) pm_resource_get(part->states, 
state_full_name);
+                        request.resource_type = RESOURCE_TYPE_PART;
+                        request.name = target_name;
+                        part = (Part *) resource_get(group->parts, &request);
+                        state = resource_get(part->states, (Resource 
*)&state_request);
                         if (state)
-                          state->used_in = 
eina_list_sorted_insert(state->used_in,
-                                                                   
(Eina_Compare_Cb) resource_cmp,
-                                                                   program);
+                          resource_used_in_add(state, (Resource *)program);
                         else
                           {
                              TODO("Handle programs with states that don't 
exist");
                           }
 
                      }
-                   eina_stringshare_del(state_full_name);
                    edje_edit_string_list_free(targets);
                    break;
                 case EDJE_ACTION_TYPE_DRAG_VAL_SET:
@@ -665,17 +680,28 @@ _group_load(Project *pro, Group *group)
                 case EDJE_ACTION_TYPE_DRAG_VAL_PAGE:
                    targets = edje_edit_program_targets_get(group->edit_object, 
program->name);
                    EINA_LIST_FOREACH(targets, lt, target_name)
-                      pm_resource_usage_unsorted_add(group->parts, 
target_name, (void *) program);
+                     {
+                        request.resource_type = RESOURCE_TYPE_PART;
+                        request.name = target_name;
+                        part = (Part *) resource_get(group->parts, &request);
+                        resource_used_in_add((Resource *)part, (Resource 
*)program);
+                     }
                    edje_edit_string_list_free(targets);
                    break;
                 case EDJE_ACTION_TYPE_SOUND_SAMPLE:
                    sample_name = 
edje_edit_program_sample_name_get(group->edit_object, program->name);
-                   pm_resource_usage_add(pro->sounds, sample_name, (void *) 
program);
+                   request.resource_type = RESOURCE_TYPE_SOUND;
+                   request.name = sample_name;
+                   sound = resource_get(pro->sounds, &request);
+                   resource_used_in_add(sound, (Resource *)program);
                    eina_stringshare_del(sample_name);
                    break;
                 case EDJE_ACTION_TYPE_SOUND_TONE:
                    tone_name = 
edje_edit_program_tone_name_get(group->edit_object, program->name);
-                   pm_resource_usage_add(pro->tones, tone_name, (void *) 
program);
+                   request.resource_type = RESOURCE_TYPE_TONE;
+                   request.name = tone_name;
+                   tone = resource_get(pro->tones, &request);
+                   resource_used_in_add(tone, (Resource *)program);
                    eina_stringshare_del(tone_name);
                    break;
                 default:
@@ -697,9 +723,8 @@ gm_group_add(Project *pro, const char *group_name)
    assert(pro != NULL);
    assert(group_name != NULL);
 
-   group = mem_calloc(1, sizeof(Group));
-   group->name = eina_stringshare_add(group_name);
-   pro->groups = eina_list_sorted_insert(pro->groups, (Eina_Compare_Cb) 
resource_cmp, group);
+   group = (Group *)resource_add(group_name, RESOURCE_TYPE_GROUP);
+   resource_insert(&pro->groups, (Resource *)group);
 
    _group_load(pro, group);
    evas_object_smart_callback_call(ap.win, SIGNAL_GROUP_ADDED, (void *)group);
@@ -732,9 +757,8 @@ gm_group_del(Project *pro, Group *group)
      }
    EINA_LIST_FREE(group->programs, program)
      {
-        eina_stringshare_del(program->name);
         assert(program->used_in == NULL);
-        free(program);
+        resource_free((Resource *)program);
      }
    pro->groups = eina_list_remove(pro->groups, group);
    eina_stringshare_del(group->widget);
@@ -743,8 +767,7 @@ gm_group_del(Project *pro, Group *group)
    evas_object_smart_callback_call(ap.win, SIGNAL_GROUP_DELETED, (void 
*)group->name);
    /* delete group name after call signal, because the group name need in the
     * callbacks */
-   eina_stringshare_del(group->name);
-   free(group);
+   resource_free((Resource *)group);
 }
 
 Eina_Bool
@@ -828,8 +851,7 @@ gm_groups_load(Project *pro)
                }
              if (!check) continue;
           }
-        group = mem_calloc(1, sizeof(Group));
-        group->name = eina_stringshare_add(group_name);
+        group = (Group *)resource_add(group_name, RESOURCE_TYPE_GROUP);
         pro->groups = eina_list_append(pro->groups, group);
      }
    edje_file_collection_list_free(collections);
@@ -851,7 +873,6 @@ gm_groups_free(Project *pro)
 
    EINA_LIST_FREE(pro->groups, group)
      {
-        eina_stringshare_del(group->name);
         eina_list_free(group->used_in);
         eina_stringshare_del(group->widget);
         eina_stringshare_del(group->class);
@@ -860,28 +881,24 @@ gm_groups_free(Project *pro)
 
         EINA_LIST_FREE(group->parts, part)
           {
-             eina_stringshare_del(part->name);
              eina_list_free(part->used_in);
              EINA_LIST_FREE(part->states, state)
                {
-                  eina_stringshare_del(state->name);
-                  eina_stringshare_del(state->parsed_name);
                   eina_list_free(state->used_in);
-                  free(state);
+                  resource_free((Resource *)state);
                }
             EINA_LIST_FREE(part->items, item_name)
                eina_stringshare_del(item_name);
-            free(part);
+            resource_free((Resource *)part);
           }
         EINA_LIST_FREE(group->programs, program)
           {
-             eina_stringshare_del(program->name);
              eina_list_free(program->used_in);
-             free(program);
+             resource_free((Resource *)program);
           }
         /* object should be deleted before freeing groups list*/
         assert(group->edit_object == NULL);
-        free(group);
+        resource_free((Resource *)group);
      }
 }
 
@@ -897,8 +914,8 @@ gm_state_del(Project *pro, State *state)
 #define USAGE_DEL(TYPE, USAGE_LIST) \
    name = edje_edit_state_ ## TYPE ## _get(state->part->group->edit_object, \
                                            state->part->name, \
-                                           state->parsed_name, \
-                                           state->parsed_val); \
+                                           state->name, \
+                                           state->val); \
    if (name) \
      { \
         pm_resource_usage_del(USAGE_LIST, name, state); \
@@ -921,8 +938,8 @@ TODO("fix usage adding on properties change before using 
this code")
 
          tween_list = 
edje_edit_state_tweens_list_get(state->part->group->edit_object,
                                                       state->part->name,
-                                                      state->parsed_name,
-                                                      state->parsed_val);
+                                                      state->name,
+                                                      state->val);
          EINA_LIST_FOREACH(tween_list, l, image_name)
             pm_resource_usage_del(pro->images, image_name, state);
          edje_edit_string_list_free(tween_list);
@@ -943,10 +960,8 @@ TODO("fix usage adding on properties change before using 
this code")
      }
 #endif
    state->used_in = eina_list_free(state->used_in);
-   state->part->states = eina_list_remove(state->part->states, state);
-   eina_stringshare_del(state->parsed_name);
-   eina_stringshare_del(state->name);
-   free(state);
+   resource_remove(&state->part->states, (Resource *)state);
+   resource_free((Resource *)state);
 
 #undef USAGE_DEL
 }
@@ -986,6 +1001,7 @@ void
 gm_part_del(Project *pro, Part* part)
 {
    State *state;
+   Resource *group, request;
    const char *group_name, *item_name;
    Eina_List *l;
 
@@ -997,7 +1013,10 @@ gm_part_del(Project *pro, Part* part)
                                                 part->name); \
    if (group_name) \
      { \
-        pm_resource_usage_del(pro->groups, group_name, part); \
+        request.resource_type = RESOURCE_TYPE_GROUP; \
+        request.name = group_name; \
+        group = resource_get(pro->groups, &request); \
+        resource_used_in_del(group, (Resource *)part); \
         edje_edit_string_free(group_name); \
      }
 
@@ -1012,7 +1031,10 @@ gm_part_del(Project *pro, Part* part)
                                                           item_name);
               if (group_name)
                 {
-                   pm_resource_usage_del(pro->groups, group_name, part);
+                   request.resource_type = RESOURCE_TYPE_GROUP;
+                   request.name = group_name;
+                   group = resource_get(pro->groups, &request);
+                   resource_used_in_del(group, (Resource *)part);
                    edje_edit_string_free(group_name);
                 }
            }
@@ -1099,34 +1121,24 @@ gm_program_add(Project *pro, Group *group, 
Eina_Stringshare *program_name)
    assert(program_name != NULL);
    assert(group != NULL);
 
-   program = mem_calloc(1, sizeof(Program));
-   program->name = eina_stringshare_add(program_name);
+   program = (Program *)resource_add(program_name, RESOURCE_TYPE_PROGRAM);
    program->type = edje_edit_program_action_get(group->edit_object, 
program_name);
-   group->programs = eina_list_sorted_insert(group->programs, 
(Eina_Compare_Cb)resource_cmp, program);
+   resource_insert(&group->programs, (Resource *)program);
 }
 
 void
 gm_program_del(Project *pro, Group *group, Eina_Stringshare *program_name)
 {
-   Eina_List *l;
-   Resource *program;
+   Resource *program, request;
 
    assert(pro != NULL);
    assert(program_name != NULL);
    assert(group != NULL);
 
-   program = pm_resource_get(group->programs, program_name);
-
-   assert(program != NULL);
-
-   l = eina_list_data_find_list(group->programs, program);
-
-   assert(l != NULL);
-
-   group->programs = eina_list_remove_list(group->programs, l);
-   eina_stringshare_del(program->name);
-   eina_list_free(program->used_in);
-   free(program);
+   request.resource_type = RESOURCE_TYPE_PROGRAM;
+   request.name = program_name;
+   program = resource_remove(&group->programs, &request);
+   resource_free(program);
 }
 
 void
@@ -1138,53 +1150,37 @@ gm_group_data_add(Project *pro, Group *group, 
Eina_Stringshare *group_data_name)
    assert(group_data_name != NULL);
    assert(group != NULL);
 
-   group_data = mem_calloc(1, sizeof(Program));
-   group_data->name = eina_stringshare_add(group_data_name);
-   group->data_items = eina_list_sorted_insert(group->data_items, 
(Eina_Compare_Cb)resource_cmp, group_data);
+   group_data = (Resource *)resource_add(group_data_name, RESOURCE_TYPE_DATA);
+   resource_insert(&group->data_items, group_data);
 }
 
 void
 gm_group_data_del(Project *pro, Group *group, Eina_Stringshare 
*group_data_name)
 {
-   Eina_List *l;
-   Resource *group_data;
+   Resource *group_data, request;
 
    assert(pro != NULL);
    assert(group_data_name != NULL);
    assert(group != NULL);
 
-   group_data = pm_resource_get(group->data_items, group_data_name);
-
-   assert(group_data != NULL);
-
-   l = eina_list_data_find_list(group->data_items, group_data);
-
-   assert(l != NULL);
-
-   group->data_items = eina_list_remove_list(group->data_items, l);
-   eina_stringshare_del(group_data->name);
-   eina_list_free(group_data->used_in);
-   free(group_data);
+   request.resource_type = RESOURCE_TYPE_DATA;
+   request.name = group_data_name;
+   group_data = resource_remove(&group->data_items, &request);
+   resource_free(group_data);
 }
 
 void
 gm_group_data_rename(Project *pro, Group *group, Resource* group_data, const 
char *new_data_name)
 {
-   Eina_List *l;
-
    assert(pro != NULL);
    assert(group != NULL);
    assert(group_data != NULL);
    assert(new_data_name != NULL);
 
-   l = eina_list_data_find_list(group->data_items, group_data);
-
-   assert(l != NULL);
-
-   group->data_items = eina_list_remove_list(group->data_items, l);
+   resource_remove(&group->data_items, group_data);
    eina_stringshare_del(group_data->name);
    group_data->name = eina_stringshare_add(new_data_name);
-   group->data_items = eina_list_sorted_insert(group->data_items, 
(Eina_Compare_Cb)resource_cmp, group_data);
+   resource_insert(&group->data_items, group_data);
 }
 
 /**
diff --git a/src/bin/project_manager/project_manager.c 
b/src/bin/project_manager/project_manager.c
index c54a0dc..51550a5 100644
--- a/src/bin/project_manager/project_manager.c
+++ b/src/bin/project_manager/project_manager.c
@@ -1026,15 +1026,14 @@ _image_resources_load(Project *project)
         PROGRESS_SEND(_("image processing (%d/%d): %s"),
                       im_proc, im_total, image_name);
 
-        res = mem_calloc(1, sizeof(External_Resource));
-        res->name = eina_stringshare_add(image_name);
+        res = (External_Resource *) resource_add(image_name, 
RESOURCE_TYPE_IMAGE);
         comp_type = 
edje_edit_image_compression_type_get(project->global_object,
                                                          res->name);
         if (comp_type == EDJE_EDIT_IMAGE_COMP_USER)
           res->source = eina_stringshare_add(image_name);
         else
           res->source = eina_stringshare_printf("%s/%s", resource_folder, 
image_name);
-        project->images = eina_list_sorted_insert(project->images, 
(Eina_Compare_Cb) resource_cmp, res);
+        resource_insert(&project->images, (Resource *)res);
 
         if (!ecore_file_exists(res->source))
           {
@@ -1103,10 +1102,9 @@ _sound_resources_load(Project *project)
         PROGRESS_SEND(_("sound processing (%d/%d): %s"),
                       snd_proc, snd_total, sound_file);
 
-        res = mem_calloc(1, sizeof(External_Resource));
-        res->name = eina_stringshare_add(sound_name);
+        res = (External_Resource*)resource_add(sound_name, 
RESOURCE_TYPE_SOUND);
         res->source = eina_stringshare_printf("%s/%s", resource_folder, 
sound_file);
-        project->sounds = eina_list_sorted_insert(project->sounds, 
(Eina_Compare_Cb) resource_cmp, res);
+        resource_insert(&project->sounds, (Resource *)res);
 
         if (!ecore_file_exists(res->source))
           {
@@ -1171,10 +1169,9 @@ _font_resources_load(Project *project)
         PROGRESS_SEND(_("font processing (%d/%d): %s"),
                       fnt_proc, fnt_total, font_file);
 
-        res = mem_calloc(1, sizeof(External_Resource));
-        res->name = eina_stringshare_add(font_file);
+        res = (External_Resource *)resource_add(font_file, RESOURCE_TYPE_FONT);
         res->source = eina_stringshare_printf("%s/%s", resource_folder, 
font_file);
-        project->fonts = eina_list_sorted_insert(project->fonts, 
(Eina_Compare_Cb) resource_cmp, res);
+        resource_insert(&project->fonts, (Resource *)res);
 
         if (!ecore_file_exists(res->source))
           {
@@ -1219,10 +1216,9 @@ _tones_resources_load(Project *project)
         PROGRESS_SEND(_("tone processing (%d/%d): %s"),
                       ++tones_proc, tones_total, name);
 
-        res = mem_calloc(1, sizeof(Tone_Resource));
-        res->name = eina_stringshare_add(name);
+        res = (Tone_Resource *)resource_add(name, RESOURCE_TYPE_TONE);
         res->freq = edje_edit_sound_tone_frequency_get(project->global_object, 
name);
-        project->tones = eina_list_sorted_insert(project->tones, 
(Eina_Compare_Cb) resource_cmp, res);
+        resource_insert(&project->tones, (Resource *)res);
      }
 
    edje_edit_string_list_free(tones);
@@ -1247,8 +1243,7 @@ _colorclasses_resources_load(Project *project)
         PROGRESS_SEND(_("colorclass processing (%d/%d): %s"),
                       ++cc_proc, cc_total, name);
 
-        res = mem_calloc(1, sizeof(Colorclass_Resource));
-        res->name = eina_stringshare_add(name);
+        res = (Colorclass_Resource *)resource_add(name, 
RESOURCE_TYPE_COLORCLASS);
 
         if (!edje_edit_color_class_colors_get(project->global_object, name,
                                               &res->color1.r, &res->color1.g, 
&res->color1.b, &res->color1.a,
@@ -1256,10 +1251,10 @@ _colorclasses_resources_load(Project *project)
                                               &res->color3.r, &res->color3.g, 
&res->color3.b, &res->color3.a))
           {
              eina_stringshare_del(res->name);
-             free(res);
+             resource_free((Resource *)res);
           }
         else
-          project->colorclasses = 
eina_list_sorted_insert(project->colorclasses, (Eina_Compare_Cb) resource_cmp, 
res);
+          resource_insert(&project->colorclasses, (Resource *)res);
      }
 
    edje_edit_string_list_free(colorclasses);
@@ -1284,10 +1279,8 @@ _styles_resources_load(Project *project)
         PROGRESS_SEND(_("style processing (%d/%d): %s"),
                       ++styles_proc, styles_total, name);
 
-        res = mem_calloc(1, sizeof(Resource));
-        res->name = eina_stringshare_add(name);
-
-        project->styles = eina_list_sorted_insert(project->styles, 
(Eina_Compare_Cb) resource_cmp, res);
+        res = resource_add(name, RESOURCE_TYPE_STYLE);
+        resource_insert(&project->styles, res);
      }
 
    edje_edit_string_list_free(styles);
@@ -1405,7 +1398,7 @@ _group_source_code_export(void *data, Eina_Thread *thread 
__UNUSED__)
              ecore_file_mkdir(eina_strbuf_string_get(buf));
              EINA_LIST_FOREACH(part->states, ls, state)
                {
-                  resource = edje_edit_state_image_get(group->edit_object, 
part->name, state->parsed_name, state->parsed_val);
+                  resource = edje_edit_state_image_get(group->edit_object, 
part->name, state->name, state->val);
                   PROGRESS_SEND(_("Export image '%s'"), resource);
                   _external_resource_export(worker.project->images, resource, 
eina_strbuf_string_get(buf));
                   eina_stringshare_del(resource);
@@ -1419,7 +1412,7 @@ _group_source_code_export(void *data, Eina_Thread *thread 
__UNUSED__)
              ecore_file_mkdir(eina_strbuf_string_get(buf));
              EINA_LIST_FOREACH(part->states, ls, state)
                {
-                  resource = edje_edit_state_font_get(group->edit_object, 
part->name, state->parsed_name, state->parsed_val);
+                  resource = edje_edit_state_font_get(group->edit_object, 
part->name, state->name, state->val);
                   Eina_Stringshare *font_res = 
edje_edit_font_path_get(group->edit_object, resource);
                   PROGRESS_SEND(_("Export font '%s'"), font_res);
                   _external_resource_export(worker.project->fonts, font_res, 
eina_strbuf_string_get(buf));
diff --git a/src/bin/project_manager/resource_manager.c 
b/src/bin/project_manager/resource_manager.c
index ee6f787..f049061 100644
--- a/src/bin/project_manager/resource_manager.c
+++ b/src/bin/project_manager/resource_manager.c
@@ -19,99 +19,245 @@
 
 #include "resource_manager.h"
 
-int
-resource_cmp(Resource *res1, Resource *res2)
+Resource *
+resource_add(const char *name, Resource_Type type)
 {
-   return strcmp(res1->name, res2->name);
-}
+   Resource *res = NULL;
 
-void *
-pm_resource_get(Eina_List *list, Eina_Stringshare *name)
-{
-   Resource res;
-   res.name = name;
-   return eina_list_search_sorted(list, (Eina_Compare_Cb)resource_cmp, &res);
+   assert(name != NULL);
+
+   switch (type)
+     {
+      case RESOURCE_TYPE_NONE:
+         break;
+      case RESOURCE_TYPE_GROUP:
+         res = mem_calloc(1, sizeof(Group));
+         break;
+      case RESOURCE_TYPE_PART:
+         res = mem_calloc(1, sizeof(Part));
+         break;
+      case RESOURCE_TYPE_STATE:
+         res = mem_calloc(1, sizeof(State));
+         break;
+      case RESOURCE_TYPE_PROGRAM:
+         res = mem_calloc(1, sizeof(Program));
+         break;
+      case RESOURCE_TYPE_ITEM:
+         //res = mem_calloc(1, sizeof(Item));
+         break;
+      case RESOURCE_TYPE_DATA:
+         res = mem_calloc(1, sizeof(Resource));
+         break;
+      case RESOURCE_TYPE_IMAGE:
+         res = mem_calloc(1, sizeof(External_Resource));
+         break;
+      case RESOURCE_TYPE_SOUND:
+         res = mem_calloc(1, sizeof(External_Resource));
+         break;
+      case RESOURCE_TYPE_FONT:
+         res = mem_calloc(1, sizeof(External_Resource));
+         break;
+      case RESOURCE_TYPE_TONE:
+         res = mem_calloc(1, sizeof(Tone_Resource));
+         break;
+      case RESOURCE_TYPE_STYLE:
+         res = mem_calloc(1, sizeof(Resource));
+         break;
+      case RESOURCE_TYPE_TAG:
+         res = mem_calloc(1, sizeof(Resource));
+         break;
+      case RESOURCE_TYPE_COLORCLASS:
+         res = mem_calloc(1, sizeof(Colorclass_Resource));
+         break;
+     }
+   assert(res != NULL);
+
+   res->resource_type = type;
+   res->name = eina_stringshare_add(name);
+
+   return res;
 }
 
-void *
-pm_resource_unsorted_get(Eina_List *list, Eina_Stringshare *name)
+void
+resource_free(Resource *res)
 {
-   Resource res;
-   res.name = name;
-   return eina_list_search_unsorted(list, (Eina_Compare_Cb)resource_cmp, &res);
+   assert(res != NULL);
+
+   eina_stringshare_del(res->name);
+   free(res);
 }
 
-Eina_Bool
-pm_resource_usage_add(Eina_List *list, Eina_Stringshare *name, void 
*usage_data)
+static int
+resource_cmp(Resource *res1, Resource *res2)
 {
-   Resource *res = (Resource *) pm_resource_get(list, name);
+   int cmp;
+
+   if (res1->resource_type != res2->resource_type)
+     return res1->resource_type - res2->resource_type;
+
+   if (res1->resource_type == RESOURCE_TYPE_ITEM)
+     abort();
 
-   if (!res)
-      return false;
+   /* stringshares */
+   if (res1->name == res2->name)
+     cmp = 0;
+   else
+     cmp = strcmp(res1->name, res2->name);
+
+   if (!cmp && (res1->resource_type == RESOURCE_TYPE_STATE))
+     {
+        if (((State *)res1)->val > ((State *)res2)->val)
+          return 1;
+        if (((State *)res1)->val < ((State *)res2)->val)
+          return -1;
+        return 0;
+     }
 
-   res->used_in = eina_list_sorted_insert(res->used_in, 
(Eina_Compare_Cb)resource_cmp, usage_data);
-   return true;
+   return strcmp(res1->name, res2->name);
 }
 
-Eina_Bool
-pm_resource_usage_unsorted_add(Eina_List *list, Eina_Stringshare *name, void 
*usage_data)
+Resource *
+resource_get(const Eina_List *list, const Resource *request)
 {
-   Resource *res = (Resource *) pm_resource_unsorted_get(list, name);
+   Resource *ret = NULL;
 
-   if (!res)
-      return false;
+   assert(request != NULL);
+   assert(request->resource_type != RESOURCE_TYPE_NONE);
 
-   res->used_in = eina_list_sorted_insert(res->used_in, 
(Eina_Compare_Cb)resource_cmp, usage_data);
-   return true;
+   switch (request->resource_type)
+     {
+      case RESOURCE_TYPE_GROUP:
+      case RESOURCE_TYPE_STATE:
+      case RESOURCE_TYPE_PROGRAM:
+      case RESOURCE_TYPE_DATA:
+      case RESOURCE_TYPE_IMAGE:
+      case RESOURCE_TYPE_SOUND:
+      case RESOURCE_TYPE_FONT:
+      case RESOURCE_TYPE_TONE:
+      case RESOURCE_TYPE_STYLE:
+      case RESOURCE_TYPE_TAG:
+      case RESOURCE_TYPE_COLORCLASS:
+      case RESOURCE_TYPE_ITEM:
+         ret = eina_list_search_sorted(list, (Eina_Compare_Cb)resource_cmp, 
request);
+         break;
+      case RESOURCE_TYPE_PART:
+         ret = eina_list_search_unsorted(list, (Eina_Compare_Cb)resource_cmp, 
request);
+         break;
+      case RESOURCE_TYPE_NONE:
+         break;
+     }
+   return ret;
 }
 
-Eina_List *
-pm_resource_del(Eina_List *list, void *res)
+void
+resource_insert(Eina_List **list, const Resource *res)
 {
+   assert(list != NULL);
    assert(res != NULL);
+   assert(res->resource_type != RESOURCE_TYPE_NONE);
+
+   switch (res->resource_type)
+   {
+      case RESOURCE_TYPE_GROUP:
+      case RESOURCE_TYPE_STATE:
+      case RESOURCE_TYPE_PROGRAM:
+      case RESOURCE_TYPE_DATA:
+      case RESOURCE_TYPE_IMAGE:
+      case RESOURCE_TYPE_SOUND:
+      case RESOURCE_TYPE_FONT:
+      case RESOURCE_TYPE_TONE:
+      case RESOURCE_TYPE_STYLE:
+      case RESOURCE_TYPE_TAG:
+      case RESOURCE_TYPE_COLORCLASS:
+      case RESOURCE_TYPE_ITEM:
+         *list = eina_list_sorted_insert(*list, (Eina_Compare_Cb)resource_cmp, 
res);
+         break;
+      case RESOURCE_TYPE_PART:
+         *list = eina_list_append(*list, res);
+         break;
+      case RESOURCE_TYPE_NONE:
+         break;
+   }
+}
+
+Resource *
+resource_remove(Eina_List **list, const Resource *res)
+{
+   Eina_List *l_del = NULL;
+   Resource *ret;
+
    assert(list != NULL);
-   list = eina_list_remove(list, res);
-   return list;
+   assert(res != NULL);
+   assert(res->resource_type != RESOURCE_TYPE_NONE);
+
+   switch (res->resource_type)
+   {
+      case RESOURCE_TYPE_GROUP:
+      case RESOURCE_TYPE_STATE:
+      case RESOURCE_TYPE_PROGRAM:
+      case RESOURCE_TYPE_DATA:
+      case RESOURCE_TYPE_IMAGE:
+      case RESOURCE_TYPE_SOUND:
+      case RESOURCE_TYPE_FONT:
+      case RESOURCE_TYPE_TONE:
+      case RESOURCE_TYPE_STYLE:
+      case RESOURCE_TYPE_TAG:
+      case RESOURCE_TYPE_COLORCLASS:
+      case RESOURCE_TYPE_ITEM:
+         l_del = eina_list_search_sorted_list(res->used_in, 
(Eina_Compare_Cb)resource_cmp, res);
+         break;
+      case RESOURCE_TYPE_PART:
+         l_del = eina_list_search_unsorted_list(res->used_in, 
(Eina_Compare_Cb)resource_cmp, res);
+         break;
+      case RESOURCE_TYPE_NONE:
+         break;
+   }
+   assert(l_del != NULL);
+
+   ret = eina_list_data_get(l_del);
+   *list = eina_list_remove_list(*list, l_del);
+   return ret;
 }
 
 void
-pm_resource_usage_del(Eina_List *list, Eina_Stringshare *name, void 
*usage_data)
+resource_insert_after(Eina_List **list, const Resource *after, const Resource 
*res)
 {
-   Resource *res = (Resource *) pm_resource_get(list, name);
-   Eina_List *l_del;
-
+   assert(list != NULL);
    assert(res != NULL);
+   assert(res->resource_type == RESOURCE_TYPE_PART);
 
-   l_del = eina_list_search_sorted_list(res->used_in, 
(Eina_Compare_Cb)resource_cmp, usage_data);
+   *list = eina_list_append_relative(*list, res, after);
+}
 
-   TODO("remove this after fixing resource managment");
-   if (!l_del)
-     {
-        ERR("Can't delete resource \"%s\"", name);
-        return;
-     }
-   assert(l_del);
+void
+resource_used_in_add(Resource *res, const Resource *used_in)
+{
+   assert(res != NULL);
+   assert(used_in != NULL);
 
-   res->used_in = eina_list_remove_list(res->used_in, l_del);
+   res->used_in = eina_list_sorted_insert(res->used_in, 
(Eina_Compare_Cb)resource_cmp, used_in);
 }
 
 void
-pm_resource_usage_unsorted_del(Eina_List *list, Eina_Stringshare *name, void 
*usage_data)
+resource_used_in_del(Resource *res, const Resource *used_in)
 {
-   Resource *res = (Resource *) pm_resource_unsorted_get(list, name);
    Eina_List *l_del;
 
    assert(res != NULL);
+   assert(used_in != NULL);
 
-   l_del = eina_list_search_sorted_list(res->used_in, 
(Eina_Compare_Cb)resource_cmp, usage_data);
+   l_del = eina_list_search_sorted_list(res->used_in, 
(Eina_Compare_Cb)resource_cmp, used_in);
 
-   TODO("remove this after fixing resource managment");
-   if (!l_del)
-     {
-        ERR("Can't delete resource \"%s\"", name);
-        return;
-     }
-   assert(l_del);
+   assert(l_del != NULL);
 
    res->used_in = eina_list_remove_list(res->used_in, l_del);
 }
+
+Eina_Bool
+resource_used_in_get(Resource *res, const Resource *used_in)
+{
+   assert(res != NULL);
+   assert(used_in != NULL);
+
+   return !!eina_list_search_sorted(res->used_in, 
(Eina_Compare_Cb)resource_cmp, used_in);
+}
diff --git a/src/bin/project_manager/resource_manager.h 
b/src/bin/project_manager/resource_manager.h
index 7e8eab0..0ee1c20 100644
--- a/src/bin/project_manager/resource_manager.h
+++ b/src/bin/project_manager/resource_manager.h
@@ -22,8 +22,27 @@
 
 #include "eflete.h"
 
+typedef enum
+{
+   RESOURCE_TYPE_NONE,
+   RESOURCE_TYPE_GROUP,
+   RESOURCE_TYPE_PART,
+   RESOURCE_TYPE_STATE,
+   RESOURCE_TYPE_PROGRAM,
+   RESOURCE_TYPE_ITEM,
+   RESOURCE_TYPE_DATA,
+   RESOURCE_TYPE_IMAGE,
+   RESOURCE_TYPE_SOUND,
+   RESOURCE_TYPE_TONE,
+   RESOURCE_TYPE_STYLE,
+   RESOURCE_TYPE_TAG,
+   RESOURCE_TYPE_COLORCLASS,
+   RESOURCE_TYPE_FONT,
+} Resource_Type;
+
 #define RESOURCE_COMMON \
    Eina_Stringshare *name; \
+   Resource_Type resource_type; \
    Eina_List *used_in; \
 
 /**
@@ -73,8 +92,7 @@ struct _State
 {
    RESOURCE_COMMON;
 
-   Eina_Stringshare *parsed_name;  /**< parsed state name */
-   double parsed_val;          /**< parsed state value */
+   double val;                /**< parsed state value */
    Part *part;                /**< pointer to part */
 };
 
@@ -162,92 +180,31 @@ typedef struct _Tone_Resource Tone_Resource;
  */
 typedef struct _External_Resource External_Resource;
 
-int
-resource_cmp(Resource *res1, Resource *res2);
+Resource *
+resource_add(const char *name, Resource_Type type);
 
-/**
- * Find resource in sorted list by its name.
- *
- * @param list Resources list
- * @param name Name of the resource to be found
- *
- * @return pointer to resource or NULL if it was not found
- *
- * @ingroup ProjectManager.
- */
-void *
-pm_resource_get(Eina_List *list, Eina_Stringshare *name);
+void
+resource_free(Resource *res);
 
-/**
- * Find resource in not sorted list by its name.
- *
- * @param list Resources list
- * @param name Name of the resource to be found
- *
- * @return pointer to resource or NULL if it was not found
- *
- * @ingroup ProjectManager.
- */
-void *
-pm_resource_unsorted_get(Eina_List *list, Eina_Stringshare *name);
+Resource *
+resource_get(const Eina_List *list, const Resource *request);
 
-/**
- * Add reference to resource with info where it is used (i.e. part for images)
- *
- * @param list Resources list
- * @param name Name of the resource. Must be in the list.
- * @param usage_data Place where resource is used
- *
- * @ingroup ProjectManager.
- */
-Eina_Bool
-pm_resource_usage_add(Eina_List *list, Eina_Stringshare *name, void 
*usage_data);
+void
+resource_insert(Eina_List **list, const Resource *res);
 
-/**
- * Add reference to resource with info where it is used (i.e. part for images)
- *
- * @param list Resources list
- * @param name Name of the resource. Must be in the list.
- * @param usage_data Place where resource is used
- *
- * @ingroup ProjectManager.
- */
-Eina_Bool
-pm_resource_usage_unsorted_add(Eina_List *list, Eina_Stringshare *name, void 
*usage_data);
+void
+resource_insert_after(Eina_List **list, const Resource *after, const Resource 
*res);
 
-/**
- * Remove resource.
- *
- * @param list Resources list
- * @param res Resource structure
- *
- * @ingroup ProjectManager.
- */
-Eina_List *
-pm_resource_del(Eina_List *list, void *res);
+Resource *
+resource_remove(Eina_List **list, const Resource *res);
 
-/**
- * Remove reference to resource.
- *
- * @param list Resources list
- * @param name Name of the resource. Must be in the list.
- * @param usage_data Place where resource is used. Must be added to usage list.
- *
- * @ingroup ProjectManager.
- */
 void
-pm_resource_usage_del(Eina_List *list, Eina_Stringshare *name, void 
*usage_data);
+resource_used_in_add(Resource *res, const Resource *used_in);
 
-/**
- * Remove reference to resource.
- *
- * @param list Resources list
- * @param name Name of the resource. Must be in the list.
- * @param usage_data Place where resource is used. Must be added to usage list.
- *
- * @ingroup ProjectManager.
- */
 void
-pm_resource_usage_unsorted_del(Eina_List *list, Eina_Stringshare *name, void 
*usage_data);
+resource_used_in_del(Resource *res, const Resource *used_in);
+
+Eina_Bool
+resource_used_in_get(Resource *res, const Resource *used_in);
 
 #endif /* RESOURCE_MANAGER_H */
diff --git a/src/bin/ui/colorclass_manager.c b/src/bin/ui/colorclass_manager.c
index 08bf78e..146aecd 100644
--- a/src/bin/ui/colorclass_manager.c
+++ b/src/bin/ui/colorclass_manager.c
@@ -100,11 +100,8 @@ _colorclass_add_cb(void *data __UNUSED__,
    it = (Colorclass_Item *)mem_calloc(1, sizeof(Colorclass_Item));
    it->name = elm_entry_entry_get(mng.entry);
 
-   res = mem_calloc(1, sizeof(Colorclass_Resource));
-   res->name = eina_stringshare_add(it->name);
-   ap.project->colorclasses = eina_list_sorted_insert(ap.project->colorclasses,
-                                                      (Eina_Compare_Cb) 
resource_cmp,
-                                                      res);
+   res = (Colorclass_Resource *)resource_add(it->name, 
RESOURCE_TYPE_COLORCLASS);
+   resource_insert(&ap.project->colorclasses, (Resource *)res);
    edje_edit_color_class_add(ap.project->global_object, 
eina_stringshare_add(it->name));
 
    glit_ccl = elm_genlist_item_append(mng.genlist, _itc_ccl, it, NULL,
@@ -129,14 +126,18 @@ _colorclass_del_cb(void *data __UNUSED__,
                    void *event_info __UNUSED__)
 {
    Resource *res;
+   Resource request;
 
    Elm_Object_Item *it = elm_genlist_selected_item_get(mng.genlist);
    Elm_Object_Item *next = elm_genlist_item_next_get(it);
    Colorclass_Item *ccl = elm_object_item_data_get(it);
 
-   res = pm_resource_get(ap.project->colorclasses, ccl->name);
+   request.resource_type = RESOURCE_TYPE_COLORCLASS;
+   request.name = ccl->name;
+   res = resource_get(ap.project->colorclasses, &request);
    edje_edit_color_class_del(ap.project->global_object, ccl->name);
-   ap.project->colorclasses = pm_resource_del(ap.project->colorclasses, res);
+   resource_remove(&ap.project->colorclasses, res);
+   resource_free(res);
    elm_object_item_del(it);
 
 #if 0
diff --git a/src/bin/ui/image_manager.c b/src/bin/ui/image_manager.c
index 93ed69c..ae481c7 100644
--- a/src/bin/ui/image_manager.c
+++ b/src/bin/ui/image_manager.c
@@ -120,6 +120,7 @@ _grid_content_get(void *data,
    Evas_Object *image_obj = NULL;
    Evas_Object *grid = (Evas_Object *)obj;
    Resource *res;
+   Resource request;
 
    assert(it != NULL);
    assert(grid != NULL);
@@ -134,7 +135,9 @@ _grid_content_get(void *data,
    else if (!strcmp(part, "elm.swallow.end"))
      {
         it->is_used = true;
-        res = (Resource *) pm_resource_get(ap.project->images, it->image_name);
+        request.name = it->image_name;
+        request.resource_type = RESOURCE_TYPE_IMAGE;
+        res = resource_get(ap.project->images, &request);
         if (eina_list_count(res->used_in) == 0)
           {
              image_obj = elm_icon_add(grid);
@@ -285,21 +288,20 @@ _on_image_done(void *data __UNUSED__,
           }
         file_name = ecore_file_file_get(selected);
 
-        res = mem_calloc(1, sizeof(External_Resource));
-        res->name = eina_stringshare_add(file_name);
+        res = (External_Resource *)resource_add(file_name, 
RESOURCE_TYPE_IMAGE);
         res->source = eina_stringshare_printf("%s/images/%s", 
ap.project->develop_path, file_name);
 
         if (!ecore_file_exists(res->source))
           {
              ecore_file_cp(selected, res->source);
 
-             ap.project->images = eina_list_sorted_insert(ap.project->images, 
(Eina_Compare_Cb) resource_cmp, res);
+             resource_insert(&ap.project->images, (Resource *)res);
           }
         else
           {
              ERR(_("File exist"));
              free(image);
-             free(res);
+             resource_free((Resource *)res);
              continue;
           }
         edje_edit_image_add(ap.project->global_object, selected);
@@ -348,6 +350,7 @@ _image_del_cb(void *data __UNUSED__,
    Image_Item *it = NULL;
    Eina_List *grid_list, *l, *l2;
    External_Resource *res;
+   Resource request;
 
    assert(mng.gengrid != NULL);
 
@@ -358,14 +361,17 @@ _image_del_cb(void *data __UNUSED__,
    EINA_LIST_FOREACH_SAFE(grid_list, l, l2, grid_item)
      {
         it = elm_object_item_data_get(grid_item);
-        res = pm_resource_get(ap.project->images, it->image_name);
+        request.name = it->image_name;
+        request.resource_type = RESOURCE_TYPE_IMAGE;
+        res = (External_Resource *)resource_get(ap.project->images, &request);
 
         if (!res->used_in)
           {
              ecore_file_unlink(res->source);
              elm_object_item_del(grid_item);
              edje_edit_image_del(ap.project->global_object, it->image_name);
-             ap.project->images = pm_resource_del(ap.project->images, res);
+             resource_remove(&ap.project->images, (Resource *)res);
+             resource_free((Resource *)res);
           }
         else
           elm_gengrid_item_selected_set(grid_item, false);
diff --git a/src/bin/ui/popup.c b/src/bin/ui/popup.c
index 160a6c0..995789d 100644
--- a/src/bin/ui/popup.c
+++ b/src/bin/ui/popup.c
@@ -654,7 +654,7 @@ _grid_content_get(void *data,
    Item *it = data;
    Evas_Object *image_obj = NULL;
    Evas_Object *grid = (Evas_Object *)obj;
-   Resource *res;
+   Resource *res, request;
 
    assert(it != NULL);
    assert(grid != NULL);
@@ -668,7 +668,9 @@ _grid_content_get(void *data,
      }
    else if (!strcmp(part, "elm.swallow.end"))
      {
-        res = (Resource *) pm_resource_get(ap.project->images, it->image_name);
+        request.resource_type = RESOURCE_TYPE_IMAGE;
+        request.name = it->image_name;
+        res = resource_get(ap.project->images, &request);
         if (eina_list_count(res->used_in) == 0)
           {
              image_obj = elm_icon_add(grid);
diff --git a/src/bin/ui/property/property_group.c 
b/src/bin/ui/property/property_group.c
index fd2d2e9..57e439a 100644
--- a/src/bin/ui/property/property_group.c
+++ b/src/bin/ui/property/property_group.c
@@ -204,8 +204,8 @@ TODO("remove NULL's after fixing genlist filters")
 #define PART_ARGS (group_pd.part) ? group_pd.part->name : NULL
 #define GROUP_DATA_ARGS (group_pd.group_data) ? group_pd.group_data->name : 
NULL
 #define ITEM_ARGS PART_ARGS, (group_pd.part) ? 
group_pd.part->current_item_name : NULL
-#define STATE_ARGS PART_ARGS, (group_pd.part) ? 
group_pd.part->current_state->parsed_name : NULL, (group_pd.part) ? 
group_pd.part->current_state->parsed_val : 0
-#define STATE_SOURCE_ARGS str_val1, (group_pd.part) ? 
group_pd.part->current_state->parsed_name : NULL, (group_pd.part) ? 
group_pd.part->current_state->parsed_val : 0
+#define STATE_ARGS PART_ARGS, (group_pd.part) ? 
group_pd.part->current_state->name : NULL, (group_pd.part) ? 
group_pd.part->current_state->val : 0
+#define STATE_SOURCE_ARGS str_val1, (group_pd.part) ? 
group_pd.part->current_state->name : NULL, (group_pd.part) ? 
group_pd.part->current_state->val : 0
 #define PROGRAM_ARGS (group_pd.program) ? group_pd.program->name : NULL
 #define CHANGE_MERGE group_pd.history.change, true, true
 #define CHANGE_NO_MERGE group_pd.history.change, false, true
@@ -1090,6 +1090,7 @@ static void
 _part_states_combobox_fill(Evas_Object *combo, const char *part_name, const 
char *selected, Eina_Bool ignore_value)
 {
    Eina_List *l;
+   Resource request;
    Part *part;
    State *state;
    const char *state_name = NULL;
@@ -1109,18 +1110,20 @@ _part_states_combobox_fill(Evas_Object *combo, const 
char *part_name, const char
 
    elm_object_disabled_set(combo, false);
 
-   part = pm_resource_unsorted_get(group_pd.group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(group_pd.group->parts, &request);
 
    if (ignore_value)
      {
         /* skipping states with same name but different value */
         EINA_LIST_FOREACH(part->states, l, state)
           {
-             if (state_name && !strcmp(state_name, state->parsed_name))
+             if (state_name && !strcmp(state_name, state->name))
                continue;
 
-             ewe_combobox_item_add(combo, state->parsed_name);
-             state_name = state->parsed_name;
+             ewe_combobox_item_add(combo, state->name);
+             state_name = state->name;
           }
      }
    else
diff --git a/src/bin/ui/sound_manager.c b/src/bin/ui/sound_manager.c
index 9ec61a6..c876e67 100644
--- a/src/bin/ui/sound_manager.c
+++ b/src/bin/ui/sound_manager.c
@@ -130,16 +130,21 @@ _grid_sel_cb(void *data __UNUSED__,
              void *event_info)
 {
    External_Resource *res = NULL;
+   Resource request;
    Sound_Data *snd;
 
    snd = elm_object_item_data_get((Elm_Gengrid_Item *)event_info);
    switch (snd->type)
      {
       case SOUND_TYPE_SAMPLE:
-         res = pm_resource_get(ap.project->sounds, snd->name);
+         request.name = snd->name;
+         request.resource_type = RESOURCE_TYPE_SOUND;
+         res = (External_Resource *)resource_get(ap.project->sounds, &request);
          break;
       case SOUND_TYPE_TONE:
-         res = pm_resource_get(ap.project->tones, snd->name);
+         request.name = snd->name;
+         request.resource_type = RESOURCE_TYPE_TONE;
+         res = (External_Resource *)resource_get(ap.project->tones, &request);
          break;
      }
 
@@ -240,20 +245,19 @@ _add_sample_done(void *data __UNUSED__,
         return false;
      }
 
-   res = mem_calloc(1, sizeof(External_Resource));
-   res->name = eina_stringshare_add(file_name);
+   res = (External_Resource *)resource_add(file_name, RESOURCE_TYPE_SOUND);
    res->source = eina_stringshare_printf("%s/sounds/%s", 
ap.project->develop_path, file_name);
 
    if (!ecore_file_exists(res->source))
      {
         ecore_file_cp(selected, res->source);
 
-        ap.project->sounds = eina_list_sorted_insert(ap.project->sounds, 
(Eina_Compare_Cb) resource_cmp, res);
+        resource_insert(&ap.project->sounds, (Resource *)res);
      }
    else
      {
         ERR(_("File '%s' exist"), res->name);
-        free(res);
+        resource_free((Resource *)res);
         return true;
      }
 
@@ -285,10 +289,9 @@ _tone_add(void)
    frq = atoi(elm_entry_entry_get(mng.frq_entry));
    edje_edit_sound_tone_add(ap.project->global_object, tone_name, frq);
 
-   tone = (Tone_Resource *)mem_calloc(1, sizeof(Tone_Resource));
-   tone->name = eina_stringshare_add(tone_name);
+   tone = (Tone_Resource *)resource_add(tone_name, RESOURCE_TYPE_TONE);
    tone->freq = frq;
-   ap.project->tones = eina_list_sorted_insert(ap.project->tones, 
(Eina_Compare_Cb)resource_cmp, tone);
+   resource_insert(&ap.project->tones, (Resource *)tone);
 
    snd = (Sound_Data *)mem_malloc(sizeof(Sound_Data));
    snd->name = eina_stringshare_ref(tone->name);
@@ -395,6 +398,7 @@ _sound_del_cb(void *data __UNUSED__,
    Sound_Data *snd;
    Eina_List *list, *l, *l_next;
    External_Resource *res;
+   Resource request;
 
    list = (Eina_List *)elm_gengrid_selected_items_get(mng.gengrid);
    EINA_LIST_FOREACH_SAFE(list, l, l_next, grid_it)
@@ -404,18 +408,22 @@ _sound_del_cb(void *data __UNUSED__,
         switch (snd->type)
           {
            case SOUND_TYPE_SAMPLE:
-              res = pm_resource_get(ap.project->sounds, snd->name);
+              request.name = snd->name;
+              request.resource_type = RESOURCE_TYPE_SOUND;
+              res = (External_Resource *)resource_get(ap.project->sounds, 
&request);
               if (res->used_in) ERR("Unable to delete sample '%s'", res->name);
               edje_edit_sound_sample_del(ap.project->global_object, snd->name);
               ecore_file_unlink(res->source);
-              ap.project->sounds = pm_resource_del(ap.project->sounds, res);
+              resource_remove(&ap.project->sounds, (Resource *)res);
               elm_object_item_del(grid_it);
               break;
            case SOUND_TYPE_TONE:
-              res = pm_resource_get(ap.project->tones, snd->name);
+              request.name = snd->name;
+              request.resource_type = RESOURCE_TYPE_SOUND;
+              res = (External_Resource *)resource_get(ap.project->tones, 
&request);
               if (res->used_in) ERR("Unable to delete tone '%s'", res->name);
               edje_edit_sound_tone_del(ap.project->global_object, snd->name);
-              ap.project->tones = pm_resource_del(ap.project->tones, res);
+              resource_remove(&ap.project->tones, (Resource *)res);
               elm_object_item_del(grid_it);
               break;
           }
diff --git a/src/bin/ui/style_manager.c b/src/bin/ui/style_manager.c
index ab15483..293c276 100644
--- a/src/bin/ui/style_manager.c
+++ b/src/bin/ui/style_manager.c
@@ -206,9 +206,8 @@ _style_add_cb(void *data __UNUSED__,
    elm_genlist_item_selected_set(glit, true);
    elm_genlist_item_bring_in(glit, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
 
-   res = mem_calloc(1, sizeof(Resource));
-   res->name = eina_stringshare_add(style_name);
-   ap.project->styles = eina_list_sorted_insert(ap.project->styles, 
(Eina_Compare_Cb)resource_cmp, res);
+   res = resource_add(style_name, RESOURCE_TYPE_STYLE);
+   resource_insert(&ap.project->styles, res);
 
    CRIT_ON_FAIL(editor_save(ap.project->global_object));
    TODO("Remove this line once edje_edit API would be added into Editor Module 
and saving would work properly")
@@ -249,9 +248,8 @@ _tab_add_cb(void *data __UNUSED__,
    tags = edje_edit_style_tags_list_get(ap.project->global_object, style_name);
    EINA_LIST_FOREACH(tags, l, buf)
      {
-        res = mem_calloc(1, sizeof(Resource));
-        res->name = eina_stringshare_add(buf);
-        resources = eina_list_sorted_insert(resources, 
(Eina_Compare_Cb)resource_cmp, res);
+        res = resource_add(buf, RESOURCE_TYPE_TAG);
+        resource_insert(&resources, res);
      }
    edje_edit_string_list_free(tags);
 
@@ -293,10 +291,7 @@ _tab_add_cb(void *data __UNUSED__,
 
 close:
    EINA_LIST_FREE(resources, res)
-     {
-        eina_stringshare_del(res->name);
-        free(res);
-     }
+      resource_free(res);
    evas_object_del(item);
    eina_stringshare_del(buf);
 }
@@ -309,6 +304,7 @@ _btn_del_cb(void *data __UNUSED__,
    Evas_Object *edje_edit_obj = NULL;
    const char *style_name, *tag;
    Resource *res;
+   Resource request;
 
    Elm_Object_Item *glit = elm_genlist_selected_item_get(mng.genlist);
    if (!glit) return;
@@ -318,9 +314,11 @@ _btn_del_cb(void *data __UNUSED__,
    if (!glit_parent)
      {
         style_name = elm_object_item_part_text_get(glit, "elm.text");
-        res = pm_resource_get(ap.project->styles, style_name);
+        request.resource_type = RESOURCE_TYPE_STYLE;
+        request.name = style_name;
+        res = resource_get(ap.project->styles, &request);
         edje_edit_style_del(edje_edit_obj, style_name);
-        ap.project->styles = pm_resource_del(ap.project->styles, res);
+        resource_remove(&ap.project->styles, res);
      }
    else
      {
diff --git a/src/bin/ui/tabs.c b/src/bin/ui/tabs.c
index c961753..8f52aea 100644
--- a/src/bin/ui/tabs.c
+++ b/src/bin/ui/tabs.c
@@ -416,12 +416,15 @@ _part_renamed(void *data __UNUSED__,
 {
    Rename *ren = ei;
    Part *part;
+   Resource request;
 
    assert(tabs.current_group != NULL);
    assert(tabs.current_workspace != NULL);
    assert(ren != NULL);
 
-   part = pm_resource_unsorted_get(tabs.current_group->parts, ren->old_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = ren->old_name;
+   part = (Part *)resource_get(tabs.current_group->parts, &request);
    gm_part_rename(part, ren->new_name);
    workspace_group_navigator_update_part(tabs.current_workspace, part);
 }
@@ -433,12 +436,15 @@ _group_data_renamed(void *data __UNUSED__,
 {
    Rename *ren = ei;
    Resource *group_data;
+   Resource request;
 
    assert(tabs.current_group != NULL);
    assert(tabs.current_workspace != NULL);
    assert(ren != NULL);
 
-   group_data = pm_resource_get(tabs.current_group->data_items, ren->old_name);
+   request.resource_type = RESOURCE_TYPE_DATA;
+   request.name = ren->old_name;
+   group_data = resource_get(tabs.current_group->data_items, &request);
    gm_group_data_rename(ap.project, tabs.current_group, group_data, 
ren->new_name);
    workspace_group_navigator_update_group_data(tabs.current_workspace, 
group_data);
 }
diff --git a/src/bin/ui/workspace/group_navigator.c 
b/src/bin/ui/workspace/group_navigator.c
index 612c54c..a5efb48 100644
--- a/src/bin/ui/workspace/group_navigator.c
+++ b/src/bin/ui/workspace/group_navigator.c
@@ -485,8 +485,8 @@ _on_activated(void *data,
         state = elm_object_item_data_get(glit);
         CRIT_ON_FAIL(editor_part_selected_state_set(pl->group->edit_object, 
NULL, false, true,
                                                     state->part->name,
-                                                    state->parsed_name,
-                                                    state->parsed_val));
+                                                    state->name,
+                                                    state->val));
      }
 }
 
@@ -1159,6 +1159,7 @@ _popup_add_state_ok_clicked(void *data,
    double val;
    Part *part;
    State *state_from;
+   Resource request;
    Eina_Stringshare *msg;
    Change *change;
 
@@ -1181,13 +1182,16 @@ _popup_add_state_ok_clicked(void *data,
      }
    else
      {
-        state_from = pm_resource_get(part->states, item->title);
+        request.resource_type = RESOURCE_TYPE_STATE;
+        TODO("Check this");
+        request.name = item->title;
+        state_from = (State *)resource_get(part->states, &request);
         msg = eina_stringshare_printf(_("added new state \"%s\" %.2f as copy 
of \"%s\" %.2f"),
-                                      name, val, state_from->parsed_name, 
state_from->parsed_val);
+                                      name, val, state_from->name, 
state_from->val);
         change = change_add(msg);
         CRIT_ON_FAIL(editor_state_copy(pl->group->edit_object, change, false, 
true,
                                        part->name,
-                                       state_from->parsed_name, 
state_from->parsed_val,
+                                       state_from->name, state_from->val,
                                        name, val));
      }
 
@@ -1843,12 +1847,12 @@ _state_del(Part_List *pl,
    assert(state != NULL);
    assert(strcmp(state->name, "default 0.00")); /* default state can't be 
deleted */
 
-   msg = eina_stringshare_printf(_("deleted state \"%s\" %.2f"), 
state->parsed_name, state->parsed_val);
+   msg = eina_stringshare_printf(_("deleted state \"%s\" %.2f"), state->name, 
state->val);
    change = change_add(msg);
    eina_stringshare_del(msg);
    part_name = eina_stringshare_ref(state->part->name);
-   state_name = eina_stringshare_ref(state->parsed_name);
-   state_val = state->parsed_val;
+   state_name = eina_stringshare_ref(state->name);
+   state_val = state->val;
    TODO("recheck string args logic");
    CRIT_ON_FAIL(editor_state_del(pl->group->edit_object, change, false, true, 
part_name, state_name, state_val));
    eina_stringshare_del(part_name);
@@ -2494,8 +2498,8 @@ group_navigator_state_next_request(Evas_Object *obj)
 
              
CRIT_ON_FAIL(editor_part_selected_state_set(pl->group->edit_object, NULL, 
false, true,
                                                          state->part->name,
-                                                         state->parsed_name,
-                                                         state->parsed_val));
+                                                         state->name,
+                                                         state->val));
           }
      }
 }
diff --git a/src/bin/ui/workspace/groupview_calc.c 
b/src/bin/ui/workspace/groupview_calc.c
index 1538787..5911240 100644
--- a/src/bin/ui/workspace/groupview_calc.c
+++ b/src/bin/ui/workspace/groupview_calc.c
@@ -534,12 +534,12 @@ _part_calc(Groupview_Smart_Data *sd, Groupview_Part *gp)
 
         x_align = edje_edit_state_text_align_x_get(sd->group->edit_object,
                                                    gp->part->name,
-                                                   
gp->part->current_state->parsed_name,
-                                                   
gp->part->current_state->parsed_val);
+                                                   
gp->part->current_state->name,
+                                                   
gp->part->current_state->val);
         y_align = edje_edit_state_text_align_y_get(sd->group->edit_object,
                                                    gp->part->name,
-                                                   
gp->part->current_state->parsed_name,
-                                                   
gp->part->current_state->parsed_val);
+                                                   
gp->part->current_state->name,
+                                                   
gp->part->current_state->val);
         evas_object_size_hint_align_set(gp->proxy_part, x_align, y_align);
      }
 }
@@ -558,8 +558,8 @@ _part_update(Groupview_Smart_Data *sd, Groupview_Part *gp)
       case EDJE_PART_TYPE_TEXT:
       case EDJE_PART_TYPE_TEXTBLOCK:
          str = edje_edit_state_text_get(sd->group->edit_object, gp->part->name,
-                                        gp->part->current_state->parsed_name,
-                                        gp->part->current_state->parsed_val);
+                                        gp->part->current_state->name,
+                                        gp->part->current_state->val);
          if (!str)
            edje_object_part_text_set(sd->group->edit_object, gp->part->name, 
gp->part->name);
          eina_stringshare_del(str);
diff --git a/src/bin/ui/workspace/workspace.c b/src/bin/ui/workspace/workspace.c
index 98b888c..c23259a 100644
--- a/src/bin/ui/workspace/workspace.c
+++ b/src/bin/ui/workspace/workspace.c
@@ -943,20 +943,20 @@ _groupview_hl_part_drag_start(void *data,
    if (MIDDLE != event->hl_type)
      {
         part_w = edje_edit_state_max_w_get(wd->group->edit_object, 
event->part->name,
-                                           
event->part->current_state->parsed_name,
-                                           
event->part->current_state->parsed_val);
+                                           event->part->current_state->name,
+                                           event->part->current_state->val);
         part_h = edje_edit_state_max_h_get(wd->group->edit_object, 
event->part->name,
-                                           
event->part->current_state->parsed_name,
-                                           
event->part->current_state->parsed_val);
+                                           event->part->current_state->name,
+                                           event->part->current_state->val);
      }
    else
      {
         part_align_x = edje_edit_state_align_x_get(wd->group->edit_object, 
event->part->name,
-                                                   
event->part->current_state->parsed_name,
-                                                   
event->part->current_state->parsed_val);
+                                                   
event->part->current_state->name,
+                                                   
event->part->current_state->val);
         part_align_y = edje_edit_state_align_y_get(wd->group->edit_object, 
event->part->name,
-                                                   
event->part->current_state->parsed_name,
-                                                   
event->part->current_state->parsed_val);
+                                                   
event->part->current_state->name,
+                                                   
event->part->current_state->val);
      }
 }
 
@@ -974,13 +974,13 @@ _groupview_hl_part_changed(void *data,
      {
         CRIT_ON_FAIL(editor_state_max_w_set(wd->group->edit_object, change, 
true, true,
                                             event->part->name,
-                                            
event->part->current_state->parsed_name,
-                                            
event->part->current_state->parsed_val,
+                                            event->part->current_state->name,
+                                            event->part->current_state->val,
                                             event->w));
         CRIT_ON_FAIL(editor_state_max_h_set(wd->group->edit_object, change, 
true, true,
                                             event->part->name,
-                                            
event->part->current_state->parsed_name,
-                                            
event->part->current_state->parsed_val,
+                                            event->part->current_state->name,
+                                            event->part->current_state->val,
                                             event->h));
      }
    else
@@ -997,13 +997,12 @@ _groupview_hl_part_changed(void *data,
         if (align_y > 1.0) align_y = 1.0;
         CRIT_ON_FAIL(editor_state_align_x_set(wd->group->edit_object, change, 
true, true,
                                               event->part->name,
-                                              
event->part->current_state->parsed_name,
-                                              
event->part->current_state->parsed_val, align_x));
+                                              event->part->current_state->name,
+                                              event->part->current_state->val, 
align_x));
         CRIT_ON_FAIL(editor_state_align_y_set(wd->group->edit_object, change, 
true, true,
                                               event->part->name,
-                                              
event->part->current_state->parsed_name,
-                                              
event->part->current_state->parsed_val, align_y));
-
+                                              event->part->current_state->name,
+                                              event->part->current_state->val, 
align_y));
      }
 }
 
@@ -1031,11 +1030,11 @@ _groupview_hl_part_drag_stop(void *data,
    else
      {
         double align_x = edje_edit_state_align_x_get(wd->group->edit_object, 
event->part->name,
-                                                     
event->part->current_state->parsed_name,
-                                                     
event->part->current_state->parsed_val);
+                                                     
event->part->current_state->name,
+                                                     
event->part->current_state->val);
         double align_y = edje_edit_state_align_y_get(wd->group->edit_object, 
event->part->name,
-                                                     
event->part->current_state->parsed_name,
-                                                     
event->part->current_state->parsed_val);
+                                                     
event->part->current_state->name,
+                                                     
event->part->current_state->val);
         if ((align_x == part_align_x) && (align_y == part_align_y))
           change_free(change);
         else
@@ -1330,10 +1329,13 @@ void
 workspace_part_del(Evas_Object *obj, Eina_Stringshare *part_name)
 {
    Part *part;
+   Resource request;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
    group_navigator_part_del(wd->group_navi, part);
    demo_group_part_del(wd->demo_navi, part);
    groupview_part_del(wd->normal.content, part);
@@ -1346,11 +1348,14 @@ workspace_part_item_add(Evas_Object *obj,
                         Eina_Stringshare *item_name)
 {
    Part *part;
+   Resource request;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
    assert(item_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
 
    assert((part->type == EDJE_PART_TYPE_TABLE) ||
           (part->type == EDJE_PART_TYPE_BOX));
@@ -1367,11 +1372,14 @@ workspace_part_item_del(Evas_Object *obj,
                         Eina_Stringshare *item_name)
 {
    Part *part;
+   Resource request;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
    assert(item_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
 
    assert((part->type == EDJE_PART_TYPE_TABLE) ||
           (part->type == EDJE_PART_TYPE_BOX));
@@ -1387,12 +1395,15 @@ workspace_part_state_add(Evas_Object *obj,
                          Eina_Stringshare *state_name)
 {
    Part *part;
+   Resource request;
    State *state;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
    assert(state_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
 
    group_navigator_part_select(wd->group_navi, part);
    state = gm_state_add(ap.project, part, state_name);
@@ -1405,13 +1416,18 @@ workspace_part_state_select(Evas_Object *obj,
                             Eina_Stringshare *state_name)
 {
    Part *part;
+   Resource request;
    State *state;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
    assert(state_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
-   state = pm_resource_get(part->states, state_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
+   request.resource_type = RESOURCE_TYPE_STATE;
+   request.name = state_name;
+   state = (State *)resource_get(part->states, &request);
 
    groupview_hard_update(wd->normal.content);
    group_navigator_part_state_select(wd->group_navi, state);
@@ -1423,13 +1439,18 @@ workspace_part_state_del(Evas_Object *obj,
                          Eina_Stringshare *state_name)
 {
    Part *part;
+   Resource request;
    State *state;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
    assert(state_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
-   state = pm_resource_get(part->states, state_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
+   request.resource_type = RESOURCE_TYPE_STATE;
+   request.name = state_name;
+   state = (State *)resource_get(part->states, &request);
 
    group_navigator_part_select(wd->group_navi, part);
    group_navigator_part_state_del(wd->group_navi, part, state);
@@ -1442,12 +1463,18 @@ workspace_part_restack(Evas_Object *obj,
                        Eina_Stringshare *relative_part_name)
 {
    Part *part, *rel_part = NULL;
+   Resource request;
    WS_DATA_GET(obj);
    assert(part_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
    if (relative_part_name)
-     rel_part = pm_resource_unsorted_get(wd->group->parts, relative_part_name);
+     {
+        request.name = relative_part_name;
+        rel_part = (Part *)resource_get(wd->group->parts, &request);
+     }
 
    group_navigator_part_select(wd->group_navi, part);
    group_navigator_part_restack(wd->group_navi, part, rel_part);
@@ -1463,10 +1490,13 @@ workspace_part_item_restack(Evas_Object *obj,
                             Eina_Stringshare *relative_part_item_name)
 {
    Part *part;
+   Resource request;
    WS_DATA_GET(obj);
    assert(part_item_name != NULL);
 
-   part = pm_resource_unsorted_get(wd->group->parts, part_name);
+   request.resource_type = RESOURCE_TYPE_PART;
+   request.name = part_name;
+   part = (Part *)resource_get(wd->group->parts, &request);
 
    group_navigator_part_select(wd->group_navi, part);
    gm_part_item_restack(part, part_item_name, relative_part_item_name);

-- 


Reply via email to