[Pkg-e-commits] [SCM] Python bindings for Edje branch, master, updated. debian/0.2.1-2-150-g43e2f7a

Albin Tonnerre albin.tonnerre at gmail.com
Wed Dec 23 19:51:07 UTC 2009


The following commit has been merged in the master branch:
commit cf9763c4b0776fd90a094455f1e1a629db810383
Author: Albin Tonnerre <albin.tonnerre at gmail.com>
Date:   Wed Dec 16 22:40:51 2009 +0100

    Import new SVN snapshot

diff --git a/edje/__init__.py b/edje/__init__.py
index e8f6650..73ee98a 100644
--- a/edje/__init__.py
+++ b/edje/__init__.py
@@ -27,11 +27,27 @@ from c_edje import Edje, shutdown, frametime_set, frametime_get, \
      color_class_set, color_class_del, color_class_list, \
      text_class_set, text_class_del, text_class_list, \
      extern_object_min_size_set, extern_object_max_size_set, \
-     extern_object_aspect_set, message_signal_process, EdjeLoadError, \
-     Message, MessageSignal, MessageString, MessageInt, MessageFloat, \
-     MessageStringSet, MessageIntSet, MessageFloatSet, MessageStringInt, \
-     MessageStringFloat, MessageStringIntSet, MessageStringFloatSet
+     extern_object_aspect_set, available_modules_get, message_signal_process, \
+     module_load, external_param_info_get, EdjeLoadError, Message, \
+     MessageSignal, MessageString, MessageInt, MessageFloat, MessageStringSet, \
+     MessageIntSet, MessageFloatSet, MessageStringInt, MessageStringFloat, \
+     MessageStringIntSet, MessageStringFloatSet, ExternalParam, \
+     ExternalParamInfo, ExternalParamInfoInt, ExternalParamInfoInt, \
+     ExternalParamInfoDouble, ExternalParamInfoString, ExternalType, \
+     ExternalIterator
 
+EDJE_MESSAGE_NONE = 0
+EDJE_MESSAGE_SIGNAL = 1
+EDJE_MESSAGE_STRING = 2
+EDJE_MESSAGE_INT = 3
+EDJE_MESSAGE_FLOAT = 4
+EDJE_MESSAGE_STRING_SET = 5
+EDJE_MESSAGE_INT_SET = 6
+EDJE_MESSAGE_FLOAT_SET = 7
+EDJE_MESSAGE_STRING_INT = 8
+EDJE_MESSAGE_STRING_FLOAT = 9
+EDJE_MESSAGE_STRING_INT_SET = 10
+EDJE_MESSAGE_STRING_FLOAT_SET = 11
 
 EDJE_ASPECT_CONTROL_NONE = 0
 EDJE_ASPECT_CONTROL_NEITHER = 1
@@ -39,5 +55,69 @@ EDJE_ASPECT_CONTROL_HORIZONTAL = 2
 EDJE_ASPECT_CONTROL_VERTICAL = 3
 EDJE_ASPECT_CONTROL_BOTH = 4
 
+EDJE_DRAG_DIR_NONE = 0
+EDJE_DRAG_DIR_X = 1
+EDJE_DRAG_DIR_Y = 2
+EDJE_DRAG_DIR_XY = 3
+
+EDJE_LOAD_ERROR_NONE = 0
+EDJE_LOAD_ERROR_GENERIC = 1
+EDJE_LOAD_ERROR_DOES_NOT_EXIST = 2
+EDJE_LOAD_ERROR_PERMISSION_DENIED = 3
+EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 4
+EDJE_LOAD_ERROR_CORRUPT_FILE = 5
+EDJE_LOAD_ERROR_UNKNOWN_FORMAT = 6
+EDJE_LOAD_ERROR_INCOMPATIBLE_FILE = 7
+EDJE_LOAD_ERROR_UNKNOWN_COLLECTION = 8
+
+EDJE_PART_TYPE_NONE      = 0
+EDJE_PART_TYPE_RECTANGLE = 1
+EDJE_PART_TYPE_TEXT      = 2
+EDJE_PART_TYPE_IMAGE     = 3
+EDJE_PART_TYPE_SWALLOW   = 4
+EDJE_PART_TYPE_TEXTBLOCK = 5
+EDJE_PART_TYPE_GRADIENT  = 6
+EDJE_PART_TYPE_GROUP     = 7
+EDJE_PART_TYPE_BOX       = 8
+EDJE_PART_TYPE_TABLE     = 9
+EDJE_PART_TYPE_EXTERNAL  = 10
+EDJE_PART_TYPE_LAST      = 11
+
+EDJE_TEXT_EFFECT_NONE                = 0
+EDJE_TEXT_EFFECT_PLAIN               = 1
+EDJE_TEXT_EFFECT_OUTLINE             = 2
+EDJE_TEXT_EFFECT_SOFT_OUTLINE        = 3
+EDJE_TEXT_EFFECT_SHADOW              = 4
+EDJE_TEXT_EFFECT_SOFT_SHADOW         = 5
+EDJE_TEXT_EFFECT_OUTLINE_SHADOW      = 6
+EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW = 7
+EDJE_TEXT_EFFECT_FAR_SHADOW          = 8
+EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW     = 9
+EDJE_TEXT_EFFECT_GLOW                = 10
+EDJE_TEXT_EFFECT_LAST                = 11
+
+EDJE_ACTION_TYPE_NONE          = 0
+EDJE_ACTION_TYPE_STATE_SET     = 1
+EDJE_ACTION_TYPE_ACTION_STOP   = 2
+EDJE_ACTION_TYPE_SIGNAL_EMIT   = 3
+EDJE_ACTION_TYPE_DRAG_VAL_SET  = 4
+EDJE_ACTION_TYPE_DRAG_VAL_STEP = 5
+EDJE_ACTION_TYPE_DRAG_VAL_PAGE = 6
+EDJE_ACTION_TYPE_SCRIPT        = 7
+EDJE_ACTION_TYPE_FOCUS_SET     = 8
+EDJE_ACTION_TYPE_LUA_SCRIPT    = 9
+EDJE_ACTION_TYPE_LAST          = 10
+
+EDJE_TWEEN_MODE_NONE       = 0
+EDJE_TWEEN_MODE_LINEAR     = 1
+EDJE_TWEEN_MODE_SINUSOIDAL = 2
+EDJE_TWEEN_MODE_ACCELERATE = 3
+EDJE_TWEEN_MODE_DECELERATE = 4
+EDJE_TWEEN_MODE_LAST       = 5
+
+EDJE_EXTERNAL_PARAM_TYPE_INT    = 0
+EDJE_EXTERNAL_PARAM_TYPE_DOUBLE = 1
+EDJE_EXTERNAL_PARAM_TYPE_STRING = 2
+EDJE_EXTERNAL_PARAM_TYPE_MAX    = 3
 
 c_edje.init()
diff --git a/edje/decorators.py b/edje/edit/__init__.py
similarity index 67%
copy from edje/decorators.py
copy to edje/edit/__init__.py
index 22e3e34..aeb8169 100644
--- a/edje/decorators.py
+++ b/edje/edit/__init__.py
@@ -15,18 +15,14 @@
 # You should have received a copy of the GNU Lesser General Public License
 # along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
 
-def signal_callback(emission, source):
-    def deco(func):
-        func.edje_signal_callback = (emission, source)
-        return staticmethod(func)
-    return deco
+#!/usr/bin/env python
 
+import c_edit
 
-def text_change_callback(func):
-    func.edje_text_change_callback = True
-    return staticmethod(func)
+from c_edit import EdjeEdit
 
+EDJE_EDIT_IMAGE_COMP_RAW = 0
+EDJE_EDIT_IMAGE_COMP_USER = 1
+EDJE_EDIT_IMAGE_COMP_COMP = 2
+EDJE_EDIT_IMAGE_COMP_LOSSY =3
 
-def message_handler(func):
-    func.edje_message_handler = True
-    return staticmethod(func)
diff --git a/edje/decorators.py b/edje/edit/c_edit.pyx
similarity index 51%
copy from edje/decorators.py
copy to edje/edit/c_edit.pyx
index 22e3e34..b5d3c89 100644
--- a/edje/decorators.py
+++ b/edje/edit/c_edit.pyx
@@ -1,4 +1,4 @@
-# Copyright (C) 2007-2008 Gustavo Sverzut Barbieri
+# Copyright (C) 2007-2008 Gustavo Sverzut Barbieri, Ulisses Furquim
 #
 # This file is part of Python-Edje.
 #
@@ -15,18 +15,27 @@
 # You should have received a copy of the GNU Lesser General Public License
 # along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
 
-def signal_callback(emission, source):
-    def deco(func):
-        func.edje_signal_callback = (emission, source)
-        return staticmethod(func)
-    return deco
+cimport evas.python as python
+cimport evas.c_evas
+import evas.c_evas
+cimport edje.c_edje
+import edje.c_edje
+cimport edje.edit.c_edit
+import edje.edit.c_edit
 
+__extra_epydoc_fields__ = (
+    ("parm", "Parameter", "Parameters"), # epydoc don't support pyrex properly
+    )
+
+include "c_edit_object.pxi"
+include "c_edit_object_group.pxi"
+include "c_edit_object_data.pxi"
+include "c_edit_object_color_class.pxi"
+include "c_edit_object_text_style.pxi"
+include "c_edit_object_spectra.pxi"
+include "c_edit_object_programs.pxi"
+include "c_edit_object_part.pxi"
+include "c_edit_object_state.pxi"
 
-def text_change_callback(func):
-    func.edje_text_change_callback = True
-    return staticmethod(func)
 
 
-def message_handler(func):
-    func.edje_message_handler = True
-    return staticmethod(func)
diff --git a/edje/edit/c_edit_object.pxi b/edje/edit/c_edit_object.pxi
new file mode 100644
index 0000000..9c96e49
--- /dev/null
+++ b/edje/edit/c_edit_object.pxi
@@ -0,0 +1,311 @@
+# Copyright (C) 2007-2008 Tiago Falcao
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+cdef class EdjeEdit(edje.c_edje.Edje): # [object PyEdjeEdit, type PyEdjeEdit_Type]:
+    def compiler_get(self):
+        """@rtype: str"""
+        cdef char *s
+        s = edje_edit_compiler_get(self.obj)
+        if s != NULL:
+            r = s
+            edje_edit_string_free(s)
+            return r
+
+    def save(self):
+        """@rtype: bool"""
+        cdef int r
+        r = edje_edit_save(self.obj)
+        if r == 0:
+            return False
+        return True
+
+    def print_internal_status(self):
+        edje_edit_print_internal_status(self.obj)
+
+    # Group
+
+    property current_group:
+        """@rtype: bool"""
+        def __get__(self):
+            return Group(self)
+
+    def group_add(self, char *name):
+        """@rtype: bool"""
+        cdef unsigned char r
+        r = edje_edit_group_add(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    def group_exist(self, char *name):
+        """@rtype: bool"""
+        cdef unsigned char r
+        r = edje_edit_group_exist(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    # Data
+
+    property data:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_data_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def data_get(self, char *name):
+        return Data(self, name)
+
+    def data_add(self, char *name, char *value):
+        cdef unsigned char r
+        r = edje_edit_data_add(self.obj, name, value)
+        if r == 0:
+            return False
+        return True
+
+    def data_del(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_data_del(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    # Text Style
+
+    property text_styles:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_styles_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def text_style_get(self, char *name):
+        return Text_Style(self, name)
+
+    def text_style_add(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_style_add(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    def text_style_del(self, char *name):
+        edje_edit_style_del(self.obj, name)
+        return True
+
+    # Color Class
+
+    property color_classes:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_color_classes_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def color_class_get(self, char *name):
+        return Color_Class(self, name)
+
+    def color_class_add(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_color_class_add(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    def color_class_del(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_color_class_del(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    # External
+    property externals:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_externals_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def external_add(self, char *name):
+        return bool(edje_edit_external_add(self.obj, name))
+
+    def external_del(self, char *name):
+        edje_edit_external_del(self.obj, name)
+
+    # Part
+
+    property parts:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_parts_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def part_get(self, char *name):
+        if self.part_exist(name):
+            return Part(self, name)
+
+    def part_add(self, char *name, int type, char *source=""):
+        cdef unsigned char r
+        if type != edje.EDJE_PART_TYPE_EXTERNAL:
+            r = edje_edit_part_add(self.obj, name, <edje.c_edje.Edje_Part_Type>type)
+        else:
+            r = edje_edit_part_external_add(self.obj, name, source)
+        if r == 0:
+            return False
+        return True
+
+    def part_del(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_part_del(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    def part_exist(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_part_exist(self.obj, name)
+        if r == 0:
+            return False
+        return True
+
+    property fonts:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_fonts_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def font_add(self, char *font):
+        return bool(edje_edit_font_add(self.obj, font))
+
+    # Image
+
+    property images:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_images_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def image_id_get(self, char *image):
+        return edje_edit_image_id_get(self.obj, image)
+
+    def image_add(self, char *image):
+        cdef unsigned char r
+        r = edje_edit_image_add(self.obj, image)
+        if r == 0:
+            return False
+        return True
+
+    # Spectrum
+
+    property spectrum:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_spectrum_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def spectra_get(self, char *name):
+        return Spectra(self, name)
+
+    def spectra_add(self, char *name):
+        return bool(edje_edit_spectra_add(self.obj, name))
+
+    def spectra_del(self, char *name):
+        return bool(edje_edit_spectra_del(self.obj, name))
+
+    # Programs
+
+    property programs:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_programs_list_get(self.obj)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def program_get(self, char *name):
+        if self.program_exist(name):
+            return Program(self, name)
+
+    def program_add(self, char *name):
+        return bool(edje_edit_program_add(self.obj, name))
+
+    def program_del(self, char *name):
+        return bool(edje_edit_program_del(self.obj, name))
+
+    def program_exist(self, char *name):
+        return bool(edje_edit_program_exist(self.obj, name))
diff --git a/edje/edit/c_edit_object_color_class.pxi b/edje/edit/c_edit_object_color_class.pxi
new file mode 100644
index 0000000..224fc86
--- /dev/null
+++ b/edje/edit/c_edit_object_color_class.pxi
@@ -0,0 +1,72 @@
+# Copyright (C) 2007-2008 Tiago Falcao
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+
+#   evas.c_evas.Eina_List * edje_edit_color_classes_list_get(evas.c_evas.Evas_Object * obj)
+#   unsigned char edje_edit_color_class_colors_get(evas.c_evas.Evas_Object *obj, char *class_name, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
+#    unsigned char edje_edit_color_class_colors_set(evas.c_evas.Evas_Object *obj, char *class_name, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
+#cdef class color:
+#    self.r
+#    self.g
+#    self.b
+#    self.a
+
+cdef class Color_Class:
+    cdef EdjeEdit edje
+    cdef object _name
+
+    def __init__(self, EdjeEdit edje, char *name):
+        self.edje = edje
+        self._name = name
+
+    property name:
+        def __get__(self):
+            return self._name
+
+        def __set__(self, newname):
+            self.rename(newname)
+
+    def rename(self, char *newname):
+        cdef unsigned char r
+        r = edje_edit_color_class_name_set(self.edje.obj, self.name, newname)
+        if r == 0:
+            return False
+        self._name = newname
+        return True
+
+    def colors_get(self):
+        cdef int r, g, b, a
+        cdef int r2, g2, b2, a2
+        cdef int r3, g3, b3, a3
+        edje_edit_color_class_colors_get(self.edje.obj, self.name,
+                                         &r, &g, &b, &a,
+                                         &r2, &g2, &b2, &a2,
+                                         &r3, &g3, &b3, &a3)
+        return ((r, g, b, a),
+                (r2, g2, b2, a2),
+                (r3, g3, b3, a3))
+
+    def colors_set(self, int r, int g, int b, int a,
+                   int r2, int g2, int b2, int a2,
+                   int r3, int g3, int b3, int a3):
+        edje_edit_color_class_colors_set(self.edje.obj, self.name,
+                                         r, g, b, a,
+                                         r2, g2, b2, a2,
+                                         r3, g3, b3, a3)
+
diff --git a/edje/edit/c_edit_object_data.pxi b/edje/edit/c_edit_object_data.pxi
new file mode 100644
index 0000000..fcfb58a
--- /dev/null
+++ b/edje/edit/c_edit_object_data.pxi
@@ -0,0 +1,46 @@
+# Copyright (C) 2007-2008 Tiago Falcao
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+
+cdef class Data:
+    cdef EdjeEdit edje
+    cdef object name
+
+    def __init__(self, EdjeEdit edje, char *name):
+        self.edje = edje
+        self.name = name
+
+    property value:
+        def __get__(self):
+            cdef char *val
+            val = edje_edit_data_value_get(self.edje.obj, self.itemname)
+            if val == NULL: return None
+            r = val
+            edje_edit_string_free(val)
+            return r
+        def __set__(self, value):
+            edje_edit_data_value_set(self.edje.obj, self.itemname, value)
+
+    def rename(self, char * newname):
+        cdef unsigned char r
+        r = edje_edit_data_name_set(self.edje.obj, self.itemname, newname)
+        if r == 0:
+            return False
+        return True
+
diff --git a/edje/edit/c_edit_object_group.pxi b/edje/edit/c_edit_object_group.pxi
new file mode 100644
index 0000000..dfd673e
--- /dev/null
+++ b/edje/edit/c_edit_object_group.pxi
@@ -0,0 +1,65 @@
+# Copyright (C) 2007-2008 Tiago Falcao
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+
+cdef class Group:
+    cdef EdjeEdit edje
+
+    def __init__(self, EdjeEdit edje):
+        self.edje = edje
+
+    def delete(self):
+        """@rtype: bool"""
+        cdef unsigned char r
+        r = edje_edit_group_del(self.edje.obj)
+        if r == 0:
+            return False
+        return True
+
+    property w_min:
+        def __get__(self):
+            return edje_edit_group_min_w_get(self.edje.obj)
+        def __set__(self, value):
+            edje_edit_group_min_w_set(self.edje.obj, value)
+
+    property w_max:
+        def __get__(self):
+            return edje_edit_group_max_w_get(self.edje.obj)
+        def __set__(self, value):
+            edje_edit_group_max_w_set(self.edje.obj, value)
+
+    property h_min:
+        def __get__(self):
+            return edje_edit_group_min_h_get(self.edje.obj)
+        def __set__(self, value):
+            edje_edit_group_min_h_set(self.edje.obj, value)
+
+    property h_max:
+        def __get__(self):
+            return edje_edit_group_max_h_get(self.edje.obj)
+        def __set__(self, value):
+            edje_edit_group_max_h_set(self.edje.obj, value)
+
+    def rename(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_group_name_set(self.edje.obj, name)
+        if r == 0:
+            return False
+        return True
+
diff --git a/edje/edit/c_edit_object_part.pxi b/edje/edit/c_edit_object_part.pxi
new file mode 100644
index 0000000..e590f01
--- /dev/null
+++ b/edje/edit/c_edit_object_part.pxi
@@ -0,0 +1,235 @@
+# Copyright (C) 2007-2008 Tiago Falcao
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+cdef class Part:
+    cdef EdjeEdit edje
+    cdef object _name
+
+    property name:
+        def __get__(self):
+            return self._name
+        def __set__(self, name):
+            self.rename(name)
+
+    def __init__(self, EdjeEdit edje, char *name):
+        self.edje = edje
+        self._name = name
+
+    def restack_below(self):
+        cdef unsigned char r
+        r = edje_edit_part_restack_below(self.edje.obj, self.name)
+        if r == 0:
+            return False
+        return True
+
+    def restack_above(self):
+        cdef unsigned char r
+        r = edje_edit_part_restack_above(self.edje.obj, self.name)
+        if r == 0:
+            return False
+        return True
+
+    def rename(self, newname):
+        cdef unsigned char r
+        r = edje_edit_part_name_set(self.edje.obj, self.name, newname)
+        if r == 0:
+            return False
+        self.name = newname
+        return True
+
+    property type:
+        def __get__(self):
+            return edje_edit_part_type_get(self.edje.obj, self.name)
+
+    property states:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_part_states_list_get(self.edje.obj, self.name)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def state_get(self, char *sname):
+        if self.state_exist(sname):
+            return State(self, sname)
+
+    def state_add(self, char *sname):
+        edje_edit_state_add(self.edje.obj, self.name, sname)
+
+    def state_del(self, char *sname):
+        edje_edit_state_del(self.edje.obj, self.name, sname)
+
+    def state_exist(self, char *sname):
+        cdef unsigned char r
+        r = edje_edit_state_exist(self.edje.obj, self.name, sname)
+        if r == 0:
+            return False
+        return True
+
+    def state_copy(self, char *sfrom, char *sto):
+        return bool(edje_edit_state_copy(self.edje.obj, self.name,
+                    sfrom, sto))
+
+    def state_selected_get(self):
+        cdef char *sel
+        sel = edje_edit_part_selected_state_get(self.edje.obj, self.name)
+        if sel == NULL: return None
+        r = sel
+        edje_edit_string_free(sel)
+        return r
+
+    def state_selected_set(self, char *state):
+        edje_edit_part_selected_state_set(self.edje.obj, self.name, state)
+
+    property clip_to:
+        def __get__(self):
+            cdef char *clipper
+            clipper = edje_edit_part_clip_to_get(self.edje.obj, self.name)
+            if clipper == NULL: return None
+            r = clipper
+            edje_edit_string_free(clipper)
+            return r
+
+        def __set__(self, clipper):
+            if clipper == "" or clipper is None:
+                edje_edit_part_clip_to_set(self.edje.obj, self.name, NULL)
+            else:
+                edje_edit_part_clip_to_set(self.edje.obj, self.name, clipper)
+
+        def __del__(self):
+            edje_edit_part_clip_to_set(self.edje.obj, self.name, NULL)
+
+    property source:
+        def __get__(self):
+            cdef char *source
+            source = edje_edit_part_source_get(self.edje.obj, self.name)
+            if source == NULL: return None
+            r = source
+            edje_edit_string_free(source)
+            return r
+
+        def __set__(self, source):
+            if source == "" or source is None:
+                edje_edit_part_source_set(self.edje.obj, self.name, NULL)
+            else:
+                edje_edit_part_source_set(self.edje.obj, self.name, source)
+
+        def __del__(self):
+            edje_edit_part_source_set(self.edje.obj, self.name, NULL)
+
+    property mouse_events:
+        def __get__(self):
+            return bool(edje_edit_part_mouse_events_get(self.edje.obj,
+                                                        self.name))
+
+        def __set__(self, me):
+            if me:
+                edje_edit_part_mouse_events_set(self.edje.obj, self.name, 1)
+            else:
+                edje_edit_part_mouse_events_set(self.edje.obj, self.name, 0)
+
+    property repeat_events:
+        def __get__(self):
+            return bool(edje_edit_part_repeat_events_get(self.edje.obj,
+                                                         self.name))
+
+        def __set__(self, re):
+            if re:
+                edje_edit_part_repeat_events_set(self.edje.obj, self.name, 1)
+            else:
+                edje_edit_part_repeat_events_set(self.edje.obj, self.name, 0)
+
+    property effect:
+        def __get__(self):
+            return edje_edit_part_effect_get(self.edje.obj, self.name)
+
+        def __set__(self, effect):
+            edje_edit_part_effect_set(self.edje.obj, self.name, effect)
+
+    property ignore_flags:
+        def __get__(self):
+            return edje_edit_part_ignore_flags_get(self.edje.obj, self.name)
+
+        def __set__(self, flags):
+            edje_edit_part_ignore_flags_set(self.edje.obj, self.name, flags)
+
+    property drag:
+        def __get__(self):
+            cdef int x, y
+            x = edje_edit_part_drag_x_get(self.edje.obj, self.name)
+            y = edje_edit_part_drag_y_get(self.edje.obj, self.name)
+            return (x, y)
+
+        def __set__(self, val):
+            x, y = val
+            edje_edit_part_drag_x_set(self.edje.obj, self.name, x)
+            edje_edit_part_drag_y_set(self.edje.obj, self.name, y)
+
+    property drag_step:
+        def __get__(self):
+            cdef int x, y
+            x = edje_edit_part_drag_step_x_get(self.edje.obj, self.name)
+            y = edje_edit_part_drag_step_y_get(self.edje.obj, self.name)
+            return (x, y)
+
+        def __set__(self, val):
+            x, y = val
+            edje_edit_part_drag_step_x_set(self.edje.obj, self.name, x)
+            edje_edit_part_drag_step_y_set(self.edje.obj, self.name, y)
+
+    property drag_count:
+        def __get__(self):
+            cdef int x, y
+            x = edje_edit_part_drag_count_x_get(self.edje.obj, self.name)
+            y = edje_edit_part_drag_count_y_get(self.edje.obj, self.name)
+            return (x, y)
+
+        def __set__(self, val):
+            x, y = val
+            edje_edit_part_drag_count_x_set(self.edje.obj, self.name, x)
+            edje_edit_part_drag_count_y_set(self.edje.obj, self.name, y)
+
+    property drag_confine:
+        def __get__(self):
+            cdef char *confine
+            confine = edje_edit_part_drag_confine_get(self.edje.obj, self.name)
+            if confine == NULL: return None
+            r = confine
+            edje_edit_string_free(confine)
+            return r
+
+        def __set__(self, confine):
+            edje_edit_part_drag_confine_set(self.edje.obj, self.name, confine)
+
+    property drag_event:
+        def __get__(self):
+            cdef char *event
+            event = edje_edit_part_drag_event_get(self.edje.obj, self.name)
+            if event == NULL: return None
+            r = event
+            edje_edit_string_free(event)
+            return r
+
+        def __set__(self, event):
+            edje_edit_part_drag_event_set(self.edje.obj, self.name, event)
diff --git a/edje/edit/c_edit_object_programs.pxi b/edje/edit/c_edit_object_programs.pxi
new file mode 100644
index 0000000..37bc93b
--- /dev/null
+++ b/edje/edit/c_edit_object_programs.pxi
@@ -0,0 +1,171 @@
+# Copyright (C) 2007-2008 Ivan Briano
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+cdef class Program:
+    cdef EdjeEdit edje
+    cdef object _name
+
+    def __init__(self, EdjeEdit edje, char *name):
+        self.edje = edje
+        self._name = name
+
+    property name:
+        def __get__(self):
+            return self._name
+
+        def __set__(self, char *newname):
+            self.rename(newname)
+
+    def rename(self, char *newname):
+        cdef unsigned char r
+        r = edje_edit_program_name_set(self.edje.obj, self.name, newname)
+        if r == 0:
+            return False
+        self._name = newname
+        return True
+
+    def run(self):
+        return bool(edje_edit_program_run(self.edje.obj, self.name))
+
+    def source_get(self):
+        cdef char *s
+        s = edje_edit_program_source_get(self.edje.obj, self.name)
+        if s == NULL:
+            return None
+        ret = s
+        edje_edit_string_free(s)
+        return ret
+
+    def source_set(self, char *s):
+        return bool(edje_edit_program_source_set(self.edje.obj, self.name, s))
+
+    def signal_get(self):
+        cdef char *s
+        s = edje_edit_program_signal_get(self.edje.obj, self.name)
+        if s == NULL:
+            return None
+        ret = s
+        edje_edit_string_free(s)
+        return ret
+
+    def signal_set(self, char *s):
+        return bool(edje_edit_program_signal_set(self.edje.obj, self.name, s))
+
+    def in_from_get(self):
+        return edje_edit_program_in_from_get(self.edje.obj, self.name)
+
+    def in_from_set(self, double f):
+        return bool(edje_edit_program_in_from_set(self.edje.obj, self.name, f))
+
+    def in_range_get(self):
+        return edje_edit_program_in_range_get(self.edje.obj, self.name)
+
+    def in_range_set(self, double r):
+        return bool(edje_edit_program_in_range_set(self.edje.obj, self.name, r))
+
+    def action_get(self):
+        return edje_edit_program_action_get(self.edje.obj, self.name)
+
+    def action_set(self, action):
+        return bool(edje_edit_program_action_set(self.edje.obj, self.name,
+                                                 action))
+
+    def targets_get(self):
+        cdef evas.c_evas.Eina_List *lst, *itr
+        ret = []
+        lst = edje_edit_program_targets_get(self.edje.obj, self.name)
+        itr = lst
+        while itr:
+            ret.append(<char*>itr.data)
+            itr = itr.next
+        edje_edit_string_list_free(lst)
+        return ret
+
+    def target_add(self, char *t):
+        return bool(edje_edit_program_target_add(self.edje.obj, self.name, t))
+
+    def targets_clear(self):
+        return bool(edje_edit_program_targets_clear(self.edje.obj, self.name))
+
+    def afters_get(self):
+        cdef evas.c_evas.Eina_List *lst, *itr
+        ret = []
+        lst = edje_edit_program_afters_get(self.edje.obj, self.name)
+        itr = lst
+        while itr:
+            ret.append(<char*>itr.data)
+            itr = itr.next
+        edje_edit_string_list_free(lst)
+        return ret
+
+    def after_add(self, char *a):
+        return bool(edje_edit_program_after_add(self.edje.obj, self.name, a))
+
+    def afters_clear(self):
+        return bool(edje_edit_program_afters_clear(self.edje.obj, self.name))
+
+    def state_get(self):
+        cdef char *s
+        s = edje_edit_program_state_get(self.edje.obj, self.name)
+        if s == NULL:
+            return None
+        ret = s
+        edje_edit_string_free(s)
+        return ret
+
+    def state_set(self, char *s):
+        return bool(edje_edit_program_state_set(self.edje.obj, self.name, s))
+
+    def value_get(self):
+        return edje_edit_program_value_get(self.edje.obj, self.name)
+
+    def value_set(self, double v):
+        return bool(edje_edit_program_value_set(self.edje.obj, self.name, v))
+
+    def state2_get(self):
+        cdef char *s
+        s = edje_edit_program_state2_get(self.edje.obj, self.name)
+        if s == NULL:
+            return None
+        ret = s
+        edje_edit_string_free(s)
+        return ret
+
+    def state2_set(self, char *s):
+        return bool(edje_edit_program_state2_set(self.edje.obj, self.name, s))
+
+    def value2_get(self):
+        return edje_edit_program_value2_get(self.edje.obj, self.name)
+
+    def value2_set(self, double v):
+        return bool(edje_edit_program_value2_set(self.edje.obj, self.name, v))
+
+    def transition_get(self):
+        return edje_edit_program_transition_get(self.edje.obj, self.name)
+
+    def transition_set(self, t):
+        return bool(edje_edit_program_transition_set(self.edje.obj, self.name,
+                                                     t))
+
+    def transition_time_get(self):
+        return edje_edit_program_transition_time_get(self.edje.obj, self.name)
+
+    def transition_time_set(self, double t):
+        return bool(edje_edit_program_transition_time_set(self.edje.obj,
+                                                          self.name, t))
diff --git a/edje/edit/c_edit_object_spectra.pxi b/edje/edit/c_edit_object_spectra.pxi
new file mode 100644
index 0000000..1e34404
--- /dev/null
+++ b/edje/edit/c_edit_object_spectra.pxi
@@ -0,0 +1,57 @@
+# Copyright (C) 2007-2008 Ivan Briano
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+cdef class Spectra:
+    cdef EdjeEdit edje
+    cdef object _name
+
+    def __init__(self, EdjeEdit edje, char *name):
+        self.edje = edje
+        self._name = name
+
+    property name:
+        def __get__(self):
+            return self._name
+
+        def __set__(self, char *newname):
+            self.rename(newname)
+
+    def rename(self, char *newname):
+        cdef unsigned char r
+        r = edje_edit_spectra_name_set(self.edje.obj, self.name, newname)
+        if r == 0:
+            return False
+        self._name = newname
+        return True
+
+    def stop_num_get(self):
+        return edje_edit_spectra_stop_num_get(self.edje.obj, self.name)
+
+    def stop_num_set(self, int num):
+        edje_edit_spectra_stop_num_set(self.edje.obj, self.name, num)
+
+    def stop_color_get(self, int stop_num):
+        cdef int r, g, b, a, d
+        edje_edit_spectra_stop_color_get(self.edje.obj, self.name, stop_num,
+                                         &r, &g, &b, &a, &d)
+        return (r, g, b, a, d)
+
+    def stop_color_set(self, int stop_num, int r, int g, int b, int a, int d):
+        edje_edit_spectra_stop_color_set(self.edje.obj, self.name, stop_num,
+                                         r, g, b, a, d)
diff --git a/edje/edit/c_edit_object_state.pxi b/edje/edit/c_edit_object_state.pxi
new file mode 100644
index 0000000..cddf8ab
--- /dev/null
+++ b/edje/edit/c_edit_object_state.pxi
@@ -0,0 +1,714 @@
+# Copyright (C) 2007-2008 Tiago Falcao, Ivan Briano
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+cdef class State:
+    cdef EdjeEdit edje
+    cdef object part
+    cdef object _name
+
+    def __init__(self, Part part, char *name):
+        self.edje = part.edje
+        self.part = part.name
+        self._name = name
+
+    property name:
+        def __get__(self):
+            return self._name
+
+    def copy_from(self, from_state):
+        return bool(edje_edit_state_copy(self.edje.obj, self.part,
+                                         from_state, self.name))
+
+    def rel1_relative_get(self):
+        cdef double x, y
+        x = edje_edit_state_rel1_relative_x_get(self.edje.obj, self.part,
+                                                self.name)
+        y = edje_edit_state_rel1_relative_y_get(self.edje.obj, self.part,
+                                                self.name)
+        return (x, y)
+
+    def rel1_offset_get(self):
+        cdef int x, y
+        x = edje_edit_state_rel1_offset_x_get(self.edje.obj, self.part,
+                                              self.name)
+        y = edje_edit_state_rel1_offset_y_get(self.edje.obj, self.part,
+                                              self.name)
+        return (x, y)
+
+    def rel1_to_get(self):
+        cdef char *tx, *ty
+        cdef object x, y
+        tx = edje_edit_state_rel1_to_x_get(self.edje.obj, self.part, self.name)
+        ty = edje_edit_state_rel1_to_y_get(self.edje.obj, self.part, self.name)
+        if tx != NULL:
+            x = tx
+            edje_edit_string_free(tx)
+        if ty != NULL:
+            y = ty
+            edje_edit_string_free(ty)
+        return (x, y)
+
+    def rel1_relative_set(self, double x, double y):
+        edje_edit_state_rel1_relative_x_set(self.edje.obj, self.part, self.name,
+                                            x)
+        edje_edit_state_rel1_relative_y_set(self.edje.obj, self.part, self.name,
+                                            y)
+    def rel1_relative_x_set(self, double x):
+        edje_edit_state_rel1_relative_x_set(self.edje.obj, self.part, self.name,
+                                            x)
+    def rel1_relative_y_set(self, double y):
+        edje_edit_state_rel1_relative_y_set(self.edje.obj, self.part, self.name,
+                                            y)
+
+    def rel1_offset_set(self, int x, int y):
+        edje_edit_state_rel1_offset_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+        edje_edit_state_rel1_offset_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+    def rel1_offset_x_set(self, int x):
+        edje_edit_state_rel1_offset_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+    def rel1_offset_y_set(self, int y):
+        edje_edit_state_rel1_offset_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+
+    def rel1_to_set(self, x, y):
+        if x != "":
+            edje_edit_state_rel1_to_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+        else:
+            edje_edit_state_rel1_to_x_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        if y != "":
+            edje_edit_state_rel1_to_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+        else:
+            edje_edit_state_rel1_to_y_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        # remove when fixed in edje_edit
+        edje_edit_part_selected_state_set(self.edje.obj, self.part, self.name)
+    def rel1_to_x_set(self, x):
+        if x != "":
+            edje_edit_state_rel1_to_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+        else:
+            edje_edit_state_rel1_to_x_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        # remove when fixed in edje_edit
+        edje_edit_part_selected_state_set(self.edje.obj, self.part, self.name)
+    def rel1_to_y_set(self, y):
+        if y != "":
+            edje_edit_state_rel1_to_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+        else:
+            edje_edit_state_rel1_to_y_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        # remove when fixed in edje_edit
+        edje_edit_part_selected_state_set(self.edje.obj, self.part, self.name)
+
+    def rel2_relative_get(self):
+        cdef double x, y
+        x = edje_edit_state_rel2_relative_x_get(self.edje.obj, self.part,
+                                                self.name)
+        y = edje_edit_state_rel2_relative_y_get(self.edje.obj, self.part,
+                                                self.name)
+        return (x, y)
+
+    def rel2_offset_get(self):
+        cdef int x, y
+        x = edje_edit_state_rel2_offset_x_get(self.edje.obj, self.part,
+                                              self.name)
+        y = edje_edit_state_rel2_offset_y_get(self.edje.obj, self.part,
+                                              self.name)
+        return (x, y)
+
+    def rel2_to_get(self):
+        cdef char *tx, *ty
+        cdef object x, y
+        tx = edje_edit_state_rel2_to_x_get(self.edje.obj, self.part, self.name)
+        ty = edje_edit_state_rel2_to_y_get(self.edje.obj, self.part, self.name)
+        if tx != NULL:
+            x = tx
+            edje_edit_string_free(tx)
+        if ty != NULL:
+            y = ty
+            edje_edit_string_free(ty)
+        return (x, y)
+
+    def rel2_relative_set(self, double x, double y):
+        edje_edit_state_rel2_relative_x_set(self.edje.obj, self.part, self.name,
+                                            x)
+        edje_edit_state_rel2_relative_y_set(self.edje.obj, self.part, self.name,
+                                            y)
+    def rel2_relative_x_set(self, double x):
+        edje_edit_state_rel2_relative_x_set(self.edje.obj, self.part, self.name,
+                                            x)
+    def rel2_relative_y_set(self, double y):
+        edje_edit_state_rel2_relative_y_set(self.edje.obj, self.part, self.name,
+                                            y)
+
+    def rel2_offset_set(self, int x, int y):
+        edje_edit_state_rel2_offset_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+        edje_edit_state_rel2_offset_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+    def rel2_offset_x_set(self, int x):
+        edje_edit_state_rel2_offset_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+    def rel2_offset_y_set(self, int y):
+        edje_edit_state_rel2_offset_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+
+    def rel2_to_set(self, x, y):
+        if x != "":
+            edje_edit_state_rel2_to_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+        else:
+            edje_edit_state_rel2_to_x_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        if y != "":
+            edje_edit_state_rel2_to_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+        else:
+            edje_edit_state_rel2_to_y_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        # remove when fixed in edje_edit
+        edje_edit_part_selected_state_set(self.edje.obj, self.part, self.name)
+    def rel2_to_x_set(self, x):
+        if x != "":
+            edje_edit_state_rel2_to_x_set(self.edje.obj, self.part, self.name,
+                                          x)
+        else:
+            edje_edit_state_rel2_to_x_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        # remove when fixed in edje_edit
+        edje_edit_part_selected_state_set(self.edje.obj, self.part, self.name)
+    def rel2_to_y_set(self, y):
+        if y != "":
+            edje_edit_state_rel2_to_y_set(self.edje.obj, self.part, self.name,
+                                          y)
+        else:
+            edje_edit_state_rel2_to_y_set(self.edje.obj, self.part, self.name,
+                                          NULL)
+        # remove when fixed in edje_edit
+        edje_edit_part_selected_state_set(self.edje.obj, self.part, self.name)
+
+    def color_get(self):
+        cdef int r, g, b, a
+        edje_edit_state_color_get(self.edje.obj, self.part, self.name,
+                                  &r, &g, &b, &a)
+        return (r, g, b, a)
+
+    def color_set(self, int r, int g, int b, int a):
+        edje_edit_state_color_set(self.edje.obj, self.part, self.name,
+                                  r, g, b, a)
+
+    def color2_get(self):
+        cdef int r, g, b, a
+        edje_edit_state_color2_get(self.edje.obj, self.part, self.name,
+                                  &r, &g, &b, &a)
+        return (r, g, b, a)
+
+    def color2_set(self, int r, int g, int b, int a):
+        edje_edit_state_color2_set(self.edje.obj, self.part, self.name,
+                                  r, g, b, a)
+
+    def color3_get(self):
+        cdef int r, g, b, a
+        edje_edit_state_color3_get(self.edje.obj, self.part, self.name,
+                                  &r, &g, &b, &a)
+        return (r, g, b, a)
+
+    def color3_set(self, int r, int g, int b, int a):
+        edje_edit_state_color3_set(self.edje.obj, self.part, self.name,
+                                   r, g, b, a)
+
+    def align_get(self):
+        cdef double x, y
+        x = edje_edit_state_align_x_get(self.edje.obj, self.part, self.name)
+        y = edje_edit_state_align_y_get(self.edje.obj, self.part, self.name)
+        return (x, y)
+
+    def align_set(self, double x, double y):
+        edje_edit_state_align_x_set(self.edje.obj, self.part, self.name, x)
+        edje_edit_state_align_y_set(self.edje.obj, self.part, self.name, y)
+
+    property align:
+        def __get__(self):
+            return self.align_get()
+        def __set__(self, align):
+            self.align_set(*align)
+
+    def min_get(self):
+        cdef int w, h
+        w = edje_edit_state_min_w_get(self.edje.obj, self.part, self.name)
+        h = edje_edit_state_min_h_get(self.edje.obj, self.part, self.name)
+        return (w, h)
+
+    def min_set(self, int w, int h):
+        edje_edit_state_min_w_set(self.edje.obj, self.part, self.name, w)
+        edje_edit_state_min_h_set(self.edje.obj, self.part, self.name, h)
+
+    property min:
+        def __get__(self):
+            return self.min_get()
+        def __set__(self, min):
+            self.min_set(*min)
+
+    def max_get(self):
+        cdef int w, h
+        w = edje_edit_state_max_w_get(self.edje.obj, self.part, self.name)
+        h = edje_edit_state_max_h_get(self.edje.obj, self.part, self.name)
+        return (w, h)
+
+    def max_set(self, int w, int h):
+        edje_edit_state_max_w_set(self.edje.obj, self.part, self.name, w)
+        edje_edit_state_max_h_set(self.edje.obj, self.part, self.name, h)
+
+    property max:
+        def __get__(self):
+            return self.max_get()
+        def __set__(self, max):
+            self.max_set(*max)
+
+    def aspect_min_get(self):
+        cdef double a
+        a = edje_edit_state_aspect_min_get(self.edje.obj, self.part, self.name)
+        return a
+
+    def aspect_min_set(self, double a):
+        edje_edit_state_aspect_min_set(self.edje.obj, self.part, self.name, a)
+
+    def aspect_max_get(self):
+        cdef double a
+        a = edje_edit_state_aspect_max_get(self.edje.obj, self.part, self.name)
+        return a
+
+    def aspect_max_set(self, double a):
+        edje_edit_state_aspect_max_set(self.edje.obj, self.part, self.name, a)
+
+    def aspect_pref_get(self):
+        cdef char a
+        a = edje_edit_state_aspect_pref_get(self.edje.obj, self.part, self.name)
+        return a
+
+    def aspect_pref_set(self, char a):
+        edje_edit_state_aspect_pref_set(self.edje.obj, self.part, self.name, a)
+
+    def fill_origin_relative_get(self):
+        cdef double x, y
+        x = edje_edit_state_fill_origin_relative_x_get(self.edje.obj, self.part,
+                                                       self.name)
+        y = edje_edit_state_fill_origin_relative_y_get(self.edje.obj, self.part,
+                                                       self.name)
+        return (x, y)
+
+    def fill_origin_relative_set(self, double x, double y):
+        edje_edit_state_fill_origin_relative_x_set(self.edje.obj, self.part,
+                                                   self.name, x)
+        edje_edit_state_fill_origin_relative_y_set(self.edje.obj, self.part,
+                                                   self.name, y)
+
+    def fill_origin_offset_get(self):
+        cdef int x, y
+        x = edje_edit_state_fill_origin_offset_x_get(self.edje.obj, self.part,
+                                                     self.name)
+        y = edje_edit_state_fill_origin_offset_y_get(self.edje.obj, self.part,
+                                                     self.name)
+        return (x, y)
+
+    def fill_origin_offset_set(self, x, y):
+        edje_edit_state_fill_origin_offset_x_set(self.edje.obj, self.part,
+                                                 self.name, x)
+        edje_edit_state_fill_origin_offset_y_set(self.edje.obj, self.part,
+                                                 self.name, y)
+
+    def fill_size_relative_get(self):
+        cdef double x, y
+        x = edje_edit_state_fill_size_relative_x_get(self.edje.obj, self.part,
+                                                     self.name)
+        y = edje_edit_state_fill_size_relative_y_get(self.edje.obj, self.part,
+                                                     self.name)
+        return (x, y)
+
+    def fill_size_relative_set(self, double x, double y):
+        edje_edit_state_fill_size_relative_x_set(self.edje.obj, self.part,
+                                                 self.name, x)
+        edje_edit_state_fill_size_relative_y_set(self.edje.obj, self.part,
+                                                 self.name, y)
+
+    def fill_size_offset_get(self):
+        cdef int x, y
+        x = edje_edit_state_fill_size_offset_x_get(self.edje.obj, self.part,
+                                                   self.name)
+        y = edje_edit_state_fill_size_offset_y_get(self.edje.obj, self.part,
+                                                   self.name)
+        return (x, y)
+
+    def fill_size_offset_set(self, x, y):
+        edje_edit_state_fill_size_offset_x_set(self.edje.obj, self.part,
+                                               self.name, x)
+        edje_edit_state_fill_size_offset_y_set(self.edje.obj, self.part,
+                                               self.name, y)
+
+    property visible:
+        def __get__(self):
+            return bool(edje_edit_state_visible_get(self.edje.obj, self.part,
+                                                    self.name))
+        def __set__(self, v):
+            if v:
+                edje_edit_state_visible_set(self.edje.obj, self.part, self.name,
+                                            1)
+            else:
+                edje_edit_state_visible_set(self.edje.obj, self.part, self.name,                                            0)
+
+    def color_class_get(self):
+        cdef char *cc
+        cc = edje_edit_state_color_class_get(self.edje.obj, self.part,
+                                             self.name)
+        if cc == NULL:
+            return None
+        rcc = cc
+        edje_edit_string_free(cc)
+        return rcc
+
+    def color_class_set(self, cc):
+        if cc != "":
+            edje_edit_state_color_class_set(self.edje.obj, self.part,
+                                            self.name, cc)
+        else:
+            edje_edit_state_color_class_set(self.edje.obj, self.part,
+                                            self.name, NULL)
+
+    def external_params_get(self):
+        cdef evas.c_evas.Eina_List *lst
+        ret = []
+        lst = edje_edit_state_external_params_list_get(self.edje.obj, self.part,
+                                                       self.name)
+        while lst:
+            ret.append(edje.c_edje._ExternalParam_from_ptr(<long>lst.data))
+            lst = lst.next
+        return ret
+
+    def external_param_get(self, param):
+        cdef edje.c_edje.Edje_External_Param_Type type
+        cdef void *value
+
+        if not edje_edit_state_external_param_get(self.edje.obj, self.part,
+                                                  self.name, param, &type,
+                                                  &value):
+            return None
+        if type == edje.EDJE_EXTERNAL_PARAM_TYPE_INT:
+            i = (<int *>value)[0]
+            return (type, i)
+        elif type == edje.EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+            d = (<double *>value)[0]
+            return (type, d)
+        elif type == edje.EDJE_EXTERNAL_PARAM_TYPE_STRING:
+            s = <char *>value
+            return (type, s)
+        return None
+
+    def external_param_int_get(self, param):
+        cdef int value
+
+        if not edje_edit_state_external_param_int_get(self.edje.obj, self.part,
+                                                      self.name, param, &value):
+            return None
+        return value
+
+    def external_param_double_get(self, param):
+        cdef double value
+
+        if not edje_edit_state_external_param_double_get(self.edje.obj, self.part,
+                                                      self.name, param, &value):
+            return None
+        return value
+
+    def external_param_string_get(self, param):
+        cdef char *value
+
+        if not edje_edit_state_external_param_string_get(self.edje.obj, self.part,
+                                                      self.name, param, &value):
+            return None
+        r = value
+        return r
+
+    def external_param_set(self, param, value):
+        if isinstance(value, (long, int)):
+            return self.external_param_int_set(param, value)
+        elif isinstance(value, float):
+            return self.external_param_double_set(param, value)
+        elif isinstance(value, basestring):
+            return self.external_param_string_set(param, value)
+        else:
+            raise TypeError("invalid external parameter type '%s'" %
+                            type(value).__name__)
+
+    def external_param_int_set(self, param, value):
+        return bool(edje_edit_state_external_param_int_set(self.edje.obj,
+                                                           self.part, self.name,
+                                                           param, value))
+
+    def external_param_double_set(self, param, value):
+        return bool(edje_edit_state_external_param_double_set(self.edje.obj,
+                                                           self.part, self.name,
+                                                           param, value))
+
+    def external_param_string_set(self, param, value):
+        return bool(edje_edit_state_external_param_string_set(self.edje.obj,
+                                                           self.part, self.name,
+                                                           param, value))
+
+    def text_get(self):
+        cdef char *t
+        t = edje_edit_state_text_get(self.edje.obj, self.part, self.name)
+        if t == NULL: return None
+        r = t
+        edje_edit_string_free(t)
+        return r
+
+    def text_set(self, t):
+        edje_edit_state_text_set(self.edje.obj, self.part, self.name, t)
+
+    def font_get(self):
+        cdef char *f
+        f = edje_edit_state_font_get(self.edje.obj, self.part, self.name)
+        if f == NULL: return None
+        r = f
+        edje_edit_string_free(f)
+        return r
+
+    def font_set(self, f):
+        edje_edit_state_font_set(self.edje.obj, self.part, self.name, f)
+
+    def text_size_get(self):
+        return edje_edit_state_text_size_get(self.edje.obj, self.part,
+                                             self.name)
+
+    def text_size_set(self, int s):
+        edje_edit_state_text_size_set(self.edje.obj, self.part, self.name, s)
+
+    def text_align_get(self):
+        cdef double x, y
+        x = edje_edit_state_text_align_x_get(self.edje.obj, self.part,
+                                             self.name)
+        y = edje_edit_state_text_align_y_get(self.edje.obj, self.part,
+                                             self.name)
+        return (x, y)
+
+    def text_align_set(self, double x, double y):
+        edje_edit_state_text_align_x_set(self.edje.obj, self.part, self.name, x)
+        edje_edit_state_text_align_y_set(self.edje.obj, self.part, self.name, y)
+
+    property text_align:
+        def __get__(self):
+            return self.text_align_get()
+        def __set__(self, align):
+            self.text_align_set(*align)
+
+    def text_elipsis_get(self):
+        return edje_edit_state_text_elipsis_get(self.edje.obj, self.part,
+                                                self.name)
+
+    def text_elipsis_set(self, double e):
+        edje_edit_state_text_elipsis_set(self.edje.obj, self.part, self.name, e)
+
+    def text_fit_get(self):
+        x = bool(edje_edit_state_text_fit_x_get(self.edje.obj, self.part,
+                                                self.name))
+        y = bool(edje_edit_state_text_fit_y_get(self.edje.obj, self.part,
+                                                self.name))
+        return (x, y)
+
+    def text_fit_set(self, x, y):
+        if x:
+            edje_edit_state_text_fit_x_set(self.edje.obj, self.part, self.name,
+                                           1)
+        else:
+            edje_edit_state_text_fit_x_set(self.edje.obj, self.part, self.name,
+                                           0)
+        if y:
+            edje_edit_state_text_fit_y_set(self.edje.obj, self.part, self.name,
+                                           1)
+        else:
+            edje_edit_state_text_fit_y_set(self.edje.obj, self.part, self.name,
+                                           0)
+
+    def image_get(self):
+        cdef char *img
+        img = edje_edit_state_image_get(self.edje.obj, self.part, self.name)
+        if img == NULL:
+            return None
+        r = img
+        edje_edit_string_free(img)
+        return r
+
+    def image_set(self, char *image):
+        edje_edit_state_image_set(self.edje.obj, self.part, self.name, image)
+
+    def image_border_get(self):
+        cdef int l, r, t, b
+        edje_edit_state_image_border_get(self.edje.obj, self.part, self.name,
+                                         &l, &r, &t, &b)
+        return (l, r, t, b)
+
+    def image_border_set(self, int l, int r, int t, int b):
+        edje_edit_state_image_border_set(self.edje.obj, self.part, self.name,
+                                         l, r, t, b)
+
+    def image_border_fill_get(self):
+        cdef unsigned char r
+        r = edje_edit_state_image_border_fill_get(self.edje.obj, self.part,
+                                                  self.name)
+        if r == 0:
+            return False
+        return True
+
+    def image_border_fill_set(self, fill):
+        if fill:
+            edje_edit_state_image_border_fill_set(self.edje.obj, self.part,
+                                                  self.name, 1)
+        else:
+            edje_edit_state_image_border_fill_set(self.edje.obj, self.part,
+                                                  self.name, 0)
+
+    property tweens:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_state_tweens_list_get(self.edje.obj, self.part,
+                                                  self.name)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def tween_add(self, char *img):
+        cdef unsigned char r
+        r = edje_edit_state_tween_add(self.edje.obj, self.part, self.name, img)
+        if r == 0:
+            return False
+        return True
+
+    def tween_del(self, char *img):
+        cdef unsigned char r
+        r = edje_edit_state_tween_del(self.edje.obj, self.part, self.name, img)
+        if r == 0:
+            return False
+        return True
+
+    def gradient_type_get(self):
+        cdef char *t
+        t = edje_edit_state_gradient_type_get(self.edje.obj, self.part,
+                                              self.name)
+        if t == NULL:
+            return None
+        ret = t
+        edje_edit_string_free(t)
+        return ret
+
+    def gradient_type_set(self, type):
+        return bool(edje_edit_state_gradient_type_set(self.edje.obj, self.part,
+                                                      self.name, type))
+
+    def gradient_spectra_get(self):
+        cdef char *s
+        s = edje_edit_state_gradient_spectra_get(self.edje.obj, self.part,
+                                                 self.name)
+        if s == NULL:
+            return None
+        ret = s
+        edje_edit_string_free(s)
+        return ret
+
+    def gradient_spectra_set(self, s):
+        edje_edit_state_gradient_spectra_set(self.edje.obj, self.part,
+                                             self.name, s)
+
+    def gradient_angle_get(self):
+        return edje_edit_state_gradient_angle_get(self.edje.obj, self.part,
+                                                  self.name)
+
+    def gradient_angle_set(self, int angle):
+        edje_edit_state_gradient_angle_set(self.edje.obj, self.part, self.name,
+                                           angle)
+
+    def gradient_use_fill_get(self):
+        return bool(edje_edit_state_gradient_use_fill_get(self.edje.obj,
+                                                          self.part, self.name))
+
+    def gradient_rel1_relative_get(self):
+        cdef double x, y
+        x = edje_edit_state_gradient_rel1_relative_x_get(self.edje.obj,
+                                                         self.part, self.name)
+        y = edje_edit_state_gradient_rel1_relative_y_get(self.edje.obj,
+                                                         self.part, self.name)
+        return (x, y)
+
+    def gradient_rel1_relative_set(self, double x, double y):
+        edje_edit_state_gradient_rel1_relative_x_set(self.edje.obj, self.part,
+                                                     self.name, x)
+        edje_edit_state_gradient_rel1_relative_y_set(self.edje.obj, self.part,
+                                                     self.name, y)
+
+    def gradient_rel1_offset_get(self):
+        cdef int x, y
+        x = edje_edit_state_gradient_rel1_offset_x_get(self.edje.obj,
+                                                       self.part, self.name)
+        y = edje_edit_state_gradient_rel1_offset_y_get(self.edje.obj,
+                                                       self.part, self.name)
+        return (x, y)
+
+    def gradient_rel1_offset_set(self, int x, int y):
+        edje_edit_state_gradient_rel1_offset_x_set(self.edje.obj, self.part,
+                                                   self.name, x)
+        edje_edit_state_gradient_rel1_offset_y_set(self.edje.obj, self.part,
+                                                   self.name, y)
+
+    def gradient_rel2_relative_get(self):
+        cdef double x, y
+        x = edje_edit_state_gradient_rel2_relative_x_get(self.edje.obj,
+                                                         self.part, self.name)
+        y = edje_edit_state_gradient_rel2_relative_y_get(self.edje.obj,
+                                                         self.part, self.name)
+        return (x, y)
+
+    def gradient_rel2_relative_set(self, double x, double y):
+        edje_edit_state_gradient_rel2_relative_x_set(self.edje.obj, self.part,
+                                                     self.name, x)
+        edje_edit_state_gradient_rel2_relative_y_set(self.edje.obj, self.part,
+                                                     self.name, y)
+
+    def gradient_rel2_offset_get(self):
+        cdef int x, y
+        x = edje_edit_state_gradient_rel2_offset_x_get(self.edje.obj,
+                                                       self.part, self.name)
+        y = edje_edit_state_gradient_rel2_offset_y_get(self.edje.obj,
+                                                       self.part, self.name)
+        return (x, y)
+
+    def gradient_rel2_offset_set(self, int x, int y):
+        edje_edit_state_gradient_rel2_offset_x_set(self.edje.obj, self.part,
+                                                   self.name, x)
+        edje_edit_state_gradient_rel2_offset_y_set(self.edje.obj, self.part,
+                                                   self.name, y)
diff --git a/edje/edit/c_edit_object_text_style.pxi b/edje/edit/c_edit_object_text_style.pxi
new file mode 100644
index 0000000..f9b16e8
--- /dev/null
+++ b/edje/edit/c_edit_object_text_style.pxi
@@ -0,0 +1,78 @@
+# Copyright (C) 2007-2008 Tiago Falcao
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.edit.pyx
+
+cdef class Text_Style:
+    cdef EdjeEdit edje
+    cdef object name
+
+    def __init__(self, EdjeEdit edje, char *name):
+        self.edje = edje
+        self.name = name
+
+    property tags:
+        def __get__(self):
+            "@rtype: list of str"
+            cdef evas.c_evas.Eina_List *lst, *itr
+            ret = []
+            lst = edje_edit_style_tags_list_get(self.edje.obj, self.name)
+            itr = lst
+            while itr:
+                ret.append(<char*>itr.data)
+                itr = itr.next
+            edje_edit_string_list_free(lst)
+            return ret
+
+    def tag_get(self, char *name):
+        return Text_Style_Tag(self, name)
+
+    def tag_add(self, char *name):
+        cdef unsigned char r
+        r = edje_edit_style_tag_add(self.edje.obj, self.name, name)
+        if r == 0:
+            return False
+        return True
+
+    def tag_del(self, char *name):
+        edje_edit_style_tag_del(self.edje.obj, self.name, name)
+        return True
+
+cdef class Text_Style_Tag:
+    cdef Text_Style text_style
+    cdef object name
+
+    def __init__(self, Text_Style text_style, char *name):
+        self.text_style = text_style
+        self.name = name
+
+    property value:
+        def __get__(self):
+            cdef char *val
+            val =  edje_edit_style_tag_value_get(self.text_style.edje.obj, self.text_style.name, self.name)
+            if val == NULL: return None
+            ret = val
+            edje_edit_string_free(val)
+            return ret
+        def __set__(self, value):
+            edje_edit_style_tag_value_set(self.text_style.edje.obj, self.text_style.name, self.name, value)
+
+    def rename(self, char *newname):
+        edje_edit_style_tag_name_set(self.text_style.edje.obj, self.text_style.name, self.name, newname)
+        self.name = newname
+        return True
+
diff --git a/edje/edje.c_edje.pyx b/edje/edje.c_edje.pyx
index d45c15f..ba370e4 100644
--- a/edje/edje.c_edje.pyx
+++ b/edje/edje.c_edje.pyx
@@ -24,8 +24,12 @@ __extra_epydoc_fields__ = (
     )
 
 def init():
-    return edje_init()
+    cdef int r = edje_init()
 
+    if edje_external_type_abi_version_get() != EDJE_EXTERNAL_TYPE_ABI_VERSION:
+        raise TypeError("python-edje Edje_External_Type abi_version differs "
+                        "from libedje.so. Recompile python-edje!")
+    return r
 
 def shutdown():
     return edje_shutdown()
@@ -246,6 +250,18 @@ def extern_object_aspect_set(evas.c_evas.Object obj, int aspect, int w, int h):
     """
     edje_extern_object_aspect_set(obj.obj, <Edje_Aspect_Control>aspect, w, h)
 
+def available_modules_get():
+    cdef evas.c_evas.Eina_List *lst
+    lst = edje_available_modules_get()
+    ret = []
+    while lst:
+        ret.append(<char*>lst.data)
+        lst = lst.next
+    return ret
+
+def module_load(char *name):
+    return bool(edje_module_load(name))
+
 
 cdef void _install_metaclass(python.PyTypeObject *ctype, object metaclass):
     python.Py_INCREF(metaclass)
@@ -253,4 +269,5 @@ cdef void _install_metaclass(python.PyTypeObject *ctype, object metaclass):
 
 
 include "edje.c_edje_message.pxi"
+include "edje.c_edje_external.pxi"
 include "edje.c_edje_object.pxi"
diff --git a/edje/edje.c_edje_external.pxi b/edje/edje.c_edje_external.pxi
new file mode 100644
index 0000000..e98b183
--- /dev/null
+++ b/edje/edje.c_edje_external.pxi
@@ -0,0 +1,278 @@
+# Copyright (C) 2007-2009 Gustavo Sverzut Barbieri, Ulisses Furquim, Ivan Briano
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is included verbatim by edje.c_edje.pyx
+
+cdef class ExternalParam:
+    property name:
+        def __get__(self):
+            if self.obj == NULL:
+                raise ValueError("Object uninitialized")
+            return self.obj.name
+
+    property type:
+        def __get__(self):
+            if self.obj == NULL:
+                raise ValueError("Object uninitialized")
+            return self.obj.type
+
+    property i:
+        def __get__(self):
+            if self.obj == NULL:
+                raise ValueError("Object uninitialized")
+            return self.obj.i
+
+    property d:
+        def __get__(self):
+            if self.obj == NULL:
+                raise ValueError("Object uninitialized")
+            return self.obj.d
+
+    property s:
+        def __get__(self):
+            if self.obj == NULL:
+                raise ValueError("Object uninitialized")
+            if self.obj.s != NULL:
+                return self.obj.s
+
+    property value:
+        def __get__(self):
+            if self.obj == NULL:
+                raise ValueError("Object uninitialized")
+            if self.obj.type == EDJE_EXTERNAL_PARAM_TYPE_INT:
+                return self.obj.i
+            elif self.obj.type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+                return self.obj.d
+            elif self.obj.type == EDJE_EXTERNAL_PARAM_TYPE_STRING:
+                if self.obj.s != NULL:
+                    return self.obj.s
+
+cdef ExternalParam ExternalParam_from_ptr(Edje_External_Param *param):
+    cdef ExternalParam p
+    p = ExternalParam()
+    p.obj = param
+    return p
+
+# XXX: this should be C-only, but it would require edje_edit
+# XXX: being able to use it.
+def _ExternalParam_from_ptr(long ptr):
+    return ExternalParam_from_ptr(<Edje_External_Param *>ptr)
+
+
+cdef class ExternalParamInfo:
+    property name:
+        def __get__(self):
+            return self.obj.name
+
+    property type:
+        def __get__(self):
+            return self.obj.type
+
+    def validate(self, value):
+        return True
+
+cdef class ExternalParamInfoInt(ExternalParamInfo):
+    property default:
+        def __get__(self):
+            if self.obj.info.i.default == EDJE_EXTERNAL_INT_UNSET:
+                return None
+            return self.obj.info.i.default
+    property min:
+        def __get__(self):
+            if self.obj.info.i.min == EDJE_EXTERNAL_INT_UNSET:
+                return None
+            return self.obj.info.i.min
+
+    property max:
+        def __get__(self):
+            if self.obj.info.i.max == EDJE_EXTERNAL_INT_UNSET:
+                return None
+            return self.obj.info.i.max
+
+    property step:
+        def __get__(self):
+            if self.obj.info.i.step == EDJE_EXTERNAL_INT_UNSET:
+                return None
+            return self.obj.info.i.step
+
+    def validate(self, value):
+        min = self.min
+        max = self.max
+        if min is not None and value < min:
+            return False
+        if max is not None and value > max:
+            return False
+        return True
+
+cdef class ExternalParamInfoDouble(ExternalParamInfo):
+    property default:
+        def __get__(self):
+            if isnan(self.obj.info.d.default):
+                return None
+            return self.obj.info.d.default
+    property min:
+        def __get__(self):
+            if isnan(self.obj.info.d.min):
+                return None
+            return self.obj.info.d.min
+
+    property max:
+        def __get__(self):
+            if isnan(self.obj.info.d.max):
+                return None
+            return self.obj.info.d.max
+
+    property step:
+        def __get__(self):
+            if isnan(self.obj.info.d.step):
+                return None
+            return self.obj.info.d.step
+
+    def validate(self, value):
+        min = self.min
+        max = self.max
+        if min is not None and value < min:
+            return False
+        if max is not None and value > max:
+            return False
+        return True
+
+cdef class ExternalParamInfoString(ExternalParamInfo):
+    property default:
+        def __get__(self):
+            if self.obj.info.s.default == NULL:
+                return None
+            return self.obj.info.s.default
+    property accept_format:
+        def __get__(self):
+            if self.obj.info.s.accept_fmt == NULL:
+                return None
+            return self.obj.info.s.accept_fmt
+
+    property deny_format:
+        def __get__(self):
+            if self.obj.info.s.deny_fmt == NULL:
+                return None
+            return self.obj.info.s.deny_fmt
+
+cdef ExternalParamInfo ExternalParamInfo_from_ptr(Edje_External_Param_Info *ptr):
+    cdef ExternalParamInfo p
+    if ptr.type == EDJE_EXTERNAL_PARAM_TYPE_INT:
+        p = ExternalParamInfoInt()
+    elif ptr.type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+        p = ExternalParamInfoDouble()
+    elif ptr.type == EDJE_EXTERNAL_PARAM_TYPE_STRING:
+        p = ExternalParamInfoString()
+    else:
+        return None
+    p.obj = ptr
+    return p
+
+def external_param_info_get(char *type_name):
+    cdef Edje_External_Param_Info *params
+    cdef int i
+
+    ret = []
+    params = edje_external_param_info_get(type_name)
+    if params == NULL:
+        return ret
+
+    i = 0
+    while params[i].name != NULL:
+        ret.append(ExternalParamInfo_from_ptr(&params[i]))
+        i += 1
+
+    return ret
+
+cdef class ExternalType:
+    property name:
+        def __get__(self):
+            return self._name
+
+    property module:
+        def __get__(self):
+            if self._obj.module == NULL:
+                return None
+            return self._obj.module
+
+    def label_get(self):
+        cdef char *l
+        if self._obj.label_get == NULL:
+            return None
+        l = self._obj.label_get(self._obj.data)
+        if l == NULL:
+            return None
+        ret = l
+        return ret
+
+    def description_get(self):
+        cdef char *l
+        if self._obj.description_get == NULL:
+            return None
+        l = self._obj.description_get(self._obj.data)
+        if l == NULL:
+            return None
+        ret = l
+        return ret
+
+    def icon_add(self, evas.c_evas.Canvas canvas not None):
+        cdef evas.c_evas.Evas_Object *icon
+        if self._obj.icon_add == NULL:
+            return None
+        icon = self._obj.icon_add(self._obj.data, canvas.obj)
+        if icon == NULL:
+            return None
+        return evas.c_evas._Object_from_instance(<long>icon)
+
+    def preview_add(self, evas.c_evas.Canvas canvas not None):
+        cdef evas.c_evas.Evas_Object *preview
+        if self._obj.preview_add == NULL:
+            return None
+        preview = self._obj.preview_add(self._obj.data, canvas.obj)
+        if preview == NULL:
+            return None
+        return evas.c_evas._Object_from_instance(<long>preview)
+
+cdef class ExternalIterator:
+    cdef evas.c_evas.Eina_Iterator *obj
+
+    def __init__(self):
+        cdef evas.c_evas.Eina_Iterator *it
+        it = edje_external_iterator_get()
+        self._set_obj(it)
+
+    cdef _set_obj(self, evas.c_evas.Eina_Iterator *ptr):
+        self.obj = ptr
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        cdef evas.c_evas.Eina_Hash_Tuple *tuple
+        cdef ExternalType t
+        if evas.c_evas.eina_iterator_next(self.obj, <void **>&tuple):
+            t = ExternalType()
+            t._name = <char*>tuple.key
+            t._obj = <Edje_External_Type*>tuple.data
+            return t
+        else:
+            raise StopIteration
+
+    def __del__(self):
+        if self.obj:
+            evas.c_evas.eina_iterator_free(self.obj)
+
diff --git a/edje/edje.c_edje_object.pxi b/edje/edje.c_edje_object.pxi
index 42b4513..4806340 100644
--- a/edje/edje.c_edje_object.pxi
+++ b/edje/edje.c_edje_object.pxi
@@ -477,6 +477,125 @@ cdef public class Edje(evas.c_evas.Object) [object PyEdje, type PyEdje_Type]:
         o = edje_object_part_swallow_get(self.obj, part)
         return evas.c_evas._Object_from_instance(<long>o)
 
+    def part_box_append(self, char *part, c_evas.Object obj):
+        """Adds an item to a BOX part.
+
+        Appends an item to the BOX edje part, where some box's properties
+        inherited. Like the color properties has some nice effect on the
+        box's childrens.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_box_append(self.obj, part, obj.obj))
+
+    def part_box_prepend(self, char *part, c_evas.Object obj):
+        """Adds an item to a BOX part.
+
+        Prepends an item to the BOX edje part, where some box's properties
+        inherited. Like the color properties has some nice effect on the
+        box's childrens.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_box_prepend(self.obj, part, obj.obj))
+
+    def part_box_insert_at(self, char *part, c_evas.Object obj,
+                           unsigned int pos):
+        """Inserts an item at the given position in a BOX part.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_box_insert_at(self.obj, part, obj.obj,
+                    pos))
+
+    def part_box_insert_before(self, char *part, c_evas.Object obj,
+                               c_evas.Object reference):
+        """Inserts an item in a BOX part before the reference object.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_box_insert_before(self.obj, part, obj.obj,
+                                                       reference.obj))
+
+    def part_box_remove(self, char *part, c_evas.Object obj):
+        """Removes the object given from a BOX part.
+
+        Returns the object removed, or none if it wasn't found or is
+        internal to Edje.
+
+        @rtype: L{evas.c_evas.Object} or None
+        """
+        cdef evas.c_evas.Evas_Object *o
+        o = edje_object_part_box_remove(self.obj, part, obj.obj)
+        return evas.c_evas._Object_from_instance(<long>o)
+
+    def part_box_remove_at(self, char *part, unsigned int pos):
+        """Removes the object at the given position in a BOX part.
+
+        Returns the object removed, or None nothing was found at the
+        given position, or if the object was internal to Edje.
+
+        @rtype: L{evas.c_evas.Object} or None
+        """
+        cdef evas.c_evas.Evas_Object *o
+        o = edje_object_part_box_remove_at(self.obj, part, pos)
+        return evas.c_evas._Object_from_instance(<long>o)
+
+    def part_box_remove_all(self, char *part, int clear):
+        """Removes all objects from a BOX part.
+
+        @parm: B{part} BOX part to remove from.
+        @parm: B{clear} if 1, it will delete the objects it removes.
+
+        Note: this function doesn't remove items created from the theme.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_box_remove_all(self.obj, part, clear))
+
+    def part_table_pack(self, char *part, c_evas.Object child, short col, short row, short colspan, short rowspan):
+        """Pack an object inside a TABLE part.
+
+        @parm: B{part} TABLE part to pack in.
+        @parm: B{child} Object to pack.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_table_pack(self.obj, part, child.obj, col, row, colspan, rowspan))
+
+    def part_table_unpack(self, char *part, c_evas.Object child):
+        """Remove an object from a TABLE part.
+
+        @parm: B{part} TABLE part to remove from.
+        @parm: B{child} Object to remove.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_table_unpack(self.obj, part, child.obj))
+
+    def part_table_col_row_size_get(self, char *part):
+        """Returns the size in columns/rows of the TABLE part.
+
+        @parm: B{part} TABLE part to get the size of.
+
+        @rtype: tuple of int
+        """
+        cdef int c, r
+        edje_object_part_table_col_row_size_get(self.obj, part, &c, &r)
+        return (c, r)
+
+    def part_table_clear(self, char *part, int clear):
+        """Clears a TABLE part.
+
+        @parm: B{part} TABLE part to clear all its elements from.
+        @parm: B{clear} Delete objects when removed from the table.
+
+        Note: This function will not remove the elements defined by the theme.
+
+        @rtype: bool
+        """
+        return bool(edje_object_part_table_clear(self.obj, part, clear))
+
     def part_state_get(self, char *part):
         "@rtype: (name, value)"
         cdef double sv
diff --git a/include/edje/c_edje.pxd b/include/edje/c_edje.pxd
index 36e4d20..342cf1c 100644
--- a/include/edje/c_edje.pxd
+++ b/include/edje/c_edje.pxd
@@ -21,6 +21,8 @@ import evas.c_evas
 cdef extern from "evas/python_evas_utils.h":
     int PY_REFCOUNT(object)
 
+cdef extern from "math.h":
+    int isnan(double n)
 
 cdef extern from "Edje.h":
     ####################################################################
@@ -64,6 +66,64 @@ cdef extern from "Edje.h":
         EDJE_LOAD_ERROR_INCOMPATIBLE_FILE = 7
         EDJE_LOAD_ERROR_UNKNOWN_COLLECTION = 8
 
+    ctypedef enum Edje_Part_Type:
+        EDJE_PART_TYPE_NONE      = 0
+        EDJE_PART_TYPE_RECTANGLE = 1
+        EDJE_PART_TYPE_TEXT      = 2
+        EDJE_PART_TYPE_IMAGE     = 3
+        EDJE_PART_TYPE_SWALLOW   = 4
+        EDJE_PART_TYPE_TEXTBLOCK = 5
+        EDJE_PART_TYPE_GRADIENT  = 6
+        EDJE_PART_TYPE_GROUP     = 7
+        EDJE_PART_TYPE_BOX       = 8
+        EDJE_PART_TYPE_TABLE     = 9
+        EDJE_PART_TYPE_EXTERNAL  = 10
+        EDJE_PART_TYPE_LAST      = 11
+
+    ctypedef enum Edje_Text_Effect:
+       EDJE_TEXT_EFFECT_NONE                = 0
+       EDJE_TEXT_EFFECT_PLAIN               = 1
+       EDJE_TEXT_EFFECT_OUTLINE             = 2
+       EDJE_TEXT_EFFECT_SOFT_OUTLINE        = 3
+       EDJE_TEXT_EFFECT_SHADOW              = 4
+       EDJE_TEXT_EFFECT_SOFT_SHADOW         = 5
+       EDJE_TEXT_EFFECT_OUTLINE_SHADOW      = 6
+       EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW = 7
+       EDJE_TEXT_EFFECT_FAR_SHADOW          = 8
+       EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW     = 9
+       EDJE_TEXT_EFFECT_GLOW                = 10
+       EDJE_TEXT_EFFECT_LAST                = 11
+
+    ctypedef enum Edje_Action_Type:
+       EDJE_ACTION_TYPE_NONE          = 0
+       EDJE_ACTION_TYPE_STATE_SET     = 1
+       EDJE_ACTION_TYPE_ACTION_STOP   = 2
+       EDJE_ACTION_TYPE_SIGNAL_EMIT   = 3
+       EDJE_ACTION_TYPE_DRAG_VAL_SET  = 4
+       EDJE_ACTION_TYPE_DRAG_VAL_STEP = 5
+       EDJE_ACTION_TYPE_DRAG_VAL_PAGE = 6
+       EDJE_ACTION_TYPE_SCRIPT        = 7
+       EDJE_ACTION_TYPE_FOCUS_SET     = 8
+       EDJE_ACTION_TYPE_LUA_SCRIPT    = 9
+       EDJE_ACTION_TYPE_LAST          = 10
+
+    ctypedef enum Edje_Tween_Mode:
+       EDJE_TWEEN_MODE_NONE       = 0
+       EDJE_TWEEN_MODE_LINEAR     = 1
+       EDJE_TWEEN_MODE_SINUSOIDAL = 2
+       EDJE_TWEEN_MODE_ACCELERATE = 3
+       EDJE_TWEEN_MODE_DECELERATE = 4
+       EDJE_TWEEN_MODE_LAST       = 5
+
+    ctypedef enum Edje_External_Param_Type:
+        EDJE_EXTERNAL_PARAM_TYPE_INT    = 0
+        EDJE_EXTERNAL_PARAM_TYPE_DOUBLE = 1
+        EDJE_EXTERNAL_PARAM_TYPE_STRING = 2
+        EDJE_EXTERNAL_PARAM_TYPE_MAX    = 3
+
+    cdef int EDJE_EXTERNAL_INT_UNSET
+    cdef double EDJE_EXTERNAL_DOUBLE_UNSET
+    cdef unsigned int EDJE_EXTERNAL_TYPE_ABI_VERSION
 
     ####################################################################
     # Structures
@@ -107,6 +167,46 @@ cdef extern from "Edje.h":
         int count
         double val[1]
 
+    ctypedef struct Edje_External_Param:
+        char *name
+        Edje_External_Param_Type type
+        int i
+        double d
+        char *s
+
+    ctypedef struct aux_external_param_info_int:
+        int default "def", min, max, step
+
+    ctypedef struct aux_external_param_info_double:
+        double default "def", min, max, step
+
+    ctypedef struct aux_external_param_info_string:
+        char *default "def", *accept_fmt, *deny_fmt
+
+    ctypedef union aux_external_param_info:
+        aux_external_param_info_int i
+        aux_external_param_info_double d
+        aux_external_param_info_string s
+
+    ctypedef struct Edje_External_Param_Info:
+        char *name
+        Edje_External_Param_Type type
+        aux_external_param_info info
+
+    ctypedef struct Edje_External_Type:
+        unsigned int abi_version
+        char *module
+        evas.c_evas.Evas_Object *(*add)(void *data, evas.c_evas.Evas *evas, evas.c_evas.Evas_Object *parent, evas.c_evas.Eina_List *params)
+        void (*state_set)(void *data, evas.c_evas.Evas_Object *obj, void *from_params, void *to_params, float pos)
+        void (*signal_emit)(void *data, evas.c_evas.Evas_Object *obj, char *emission, char *source)
+        void *(*params_parse)(void *data, evas.c_evas.Evas_Object *obj, evas.c_evas.Eina_List *params)
+        void (*params_free)(void *params)
+        evas.c_evas.Evas_Object *(*icon_add)(void *data, evas.c_evas.Evas *e)
+        evas.c_evas.Evas_Object *(*preview_add)(void *data, evas.c_evas.Evas *e)
+        char *(*label_get)(void *data)
+        char *(*description_get)(void *data)
+        Edje_External_Param_Info *paramters_info
+        void *data
 
     ####################################################################
     # Engine
@@ -191,6 +291,19 @@ cdef extern from "Edje.h":
     void edje_object_part_unswallow(evas.c_evas.Evas_Object *obj, evas.c_evas.Evas_Object *obj_swallow)
     evas.c_evas.Evas_Object *edje_object_part_swallow_get(evas.c_evas.Evas_Object *obj, char *part)
 
+    evas.c_evas.Eina_Bool edje_object_part_box_append(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child)
+    evas.c_evas.Eina_Bool edje_object_part_box_prepend(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child)
+    evas.c_evas.Eina_Bool edje_object_part_box_insert_at(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child, unsigned int pos)
+    evas.c_evas.Eina_Bool edje_object_part_box_insert_before(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child, evas.c_evas.Evas_Object *reference)
+    evas.c_evas.Evas_Object *edje_object_part_box_remove(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child)
+    evas.c_evas.Evas_Object *edje_object_part_box_remove_at(evas.c_evas.Evas_Object *obj, char *part, unsigned int pos)
+    evas.c_evas.Eina_Bool edje_object_part_box_remove_all(evas.c_evas.Evas_Object *obj, char *part, int clear)
+
+    evas.c_evas.Eina_Bool edje_object_part_table_pack(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
+    evas.c_evas.Eina_Bool edje_object_part_table_unpack(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Object *child)
+    evas.c_evas.Eina_Bool edje_object_part_table_col_row_size_get(evas.c_evas.Evas_Object *obj, char *part, int *cols, int *rows)
+    evas.c_evas.Eina_Bool edje_object_part_table_clear(evas.c_evas.Evas_Object *obj, char *part, int clear)
+
     char *edje_object_part_state_get(evas.c_evas.Evas_Object *obj, char *part, double *val_ret)
 
     int edje_object_part_drag_dir_get(evas.c_evas.Evas_Object *obj, char *part)
@@ -211,6 +324,13 @@ cdef extern from "Edje.h":
 
     void edje_message_signal_process()
 
+    unsigned int edje_external_type_abi_version_get()
+
+    evas.c_evas.Eina_Iterator *edje_external_iterator_get()
+    Edje_External_Param_Info *edje_external_param_info_get(char *type_name)
+
+    evas.c_evas.Eina_Bool edje_module_load(char *name)
+    evas.c_evas.Eina_List *edje_available_modules_get()
 
 cdef class Message:
     cdef int _type
@@ -260,6 +380,25 @@ cdef class MessageStringIntSet(Message):
 cdef class MessageStringFloatSet(Message):
     cdef Edje_Message_String_Float_Set *obj
 
+cdef class ExternalParam:
+    cdef Edje_External_Param *obj
+
+cdef class ExternalParamInfo:
+    cdef Edje_External_Param_Info *obj
+
+cdef class ExternalParamInfoInt(ExternalParamInfo):
+    pass
+
+cdef class ExternalParamInfoDouble(ExternalParamInfo):
+    pass
+
+cdef class ExternalParamInfoString(ExternalParamInfo):
+    pass
+
+cdef class ExternalType:
+    cdef object _name
+    cdef Edje_External_Type *_obj
+
 
 cdef public class Edje(evas.c_evas.Object) [object PyEdje, type PyEdje_Type]:
     cdef object _text_change_cb
diff --git a/include/edje/__init__.py b/include/edje/edit/__init__.py
similarity index 100%
copy from include/edje/__init__.py
copy to include/edje/edit/__init__.py
diff --git a/include/edje/edit/c_edit.pxd b/include/edje/edit/c_edit.pxd
new file mode 100644
index 0000000..6de2336
--- /dev/null
+++ b/include/edje/edit/c_edit.pxd
@@ -0,0 +1,349 @@
+# Copyright (C) 2007-2008 Gustavo Sverzut Barbieri, Ulisses Furquim
+#
+# This file is part of Python-Edje.
+#
+# Python-Edje is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-Edje is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-Edje.  If not, see <http://www.gnu.org/licenses/>.
+
+cimport evas.c_evas
+import evas.c_evas
+cimport edje.c_edje
+import edje.c_edje
+
+cdef extern from "evas/python_evas_utils.h":
+    int PY_REFCOUNT(object)
+
+
+cdef extern from "Edje_Edit.h":
+    ####################################################################
+    # Enumerations
+    #
+    ctypedef enum Edje_Edit_Image_Comp:
+        EDJE_EDIT_IMAGE_COMP_RAW = 0
+        EDJE_EDIT_IMAGE_COMP_USER = 1
+        EDJE_EDIT_IMAGE_COMP_COMP = 2
+        EDJE_EDIT_IMAGE_COMP_LOSSY =3
+
+    ####################################################################
+    # Structures
+    #
+
+
+    ####################################################################
+    # Engine
+    #
+    void edje_edit_string_list_free( evas.c_evas.Eina_List *lst)
+    void edje_edit_string_free( char *str)
+    char* edje_edit_compiler_get(evas.c_evas.Evas_Object *obj)
+    int edje_edit_save(evas.c_evas.Evas_Object *obj)
+    void edje_edit_print_internal_status(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_group_add(evas.c_evas.Evas_Object *obj, char  *name)
+    evas.c_evas.Eina_Bool edje_edit_group_del(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_group_exist(evas.c_evas.Evas_Object *obj, char *group)
+    evas.c_evas.Eina_Bool edje_edit_group_name_set(evas.c_evas.Evas_Object *obj, char  *new_name)
+    int edje_edit_group_min_w_get(evas.c_evas.Evas_Object *obj)
+    void edje_edit_group_min_w_set(evas.c_evas.Evas_Object *obj, int w)
+    int edje_edit_group_min_h_get(evas.c_evas.Evas_Object *obj)
+    void edje_edit_group_min_h_set(evas.c_evas.Evas_Object *obj, int h)
+    int edje_edit_group_max_w_get(evas.c_evas.Evas_Object *obj)
+    void edje_edit_group_max_w_set(evas.c_evas.Evas_Object *obj, int w)
+    int edje_edit_group_max_h_get(evas.c_evas.Evas_Object *obj)
+    void edje_edit_group_max_h_set(evas.c_evas.Evas_Object *obj, int h)
+
+    # DATA API
+    evas.c_evas.Eina_List * edje_edit_data_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_data_add(evas.c_evas.Evas_Object *obj, char *itemname, char *value)
+    evas.c_evas.Eina_Bool edje_edit_data_del(evas.c_evas.Evas_Object *obj, char *itemname)
+    char * edje_edit_data_value_get(evas.c_evas.Evas_Object * obj, char *itemname)
+    evas.c_evas.Eina_Bool edje_edit_data_value_set(evas.c_evas.Evas_Object * obj, char *itemname, char *value)
+    evas.c_evas.Eina_Bool edje_edit_data_name_set(evas.c_evas.Evas_Object *obj, char *itemname, char *newname)
+
+    # COLOR CLASSES API
+    evas.c_evas.Eina_List * edje_edit_color_classes_list_get(evas.c_evas.Evas_Object * obj)
+    evas.c_evas.Eina_Bool edje_edit_color_class_add(evas.c_evas.Evas_Object *obj, char *name)
+    evas.c_evas.Eina_Bool edje_edit_color_class_del(evas.c_evas.Evas_Object *obj, char *name)
+    evas.c_evas.Eina_Bool edje_edit_color_class_colors_get(evas.c_evas.Evas_Object *obj, char *class_name, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
+    evas.c_evas.Eina_Bool edje_edit_color_class_colors_set(evas.c_evas.Evas_Object *obj, char *class_name, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
+    evas.c_evas.Eina_Bool edje_edit_color_class_name_set(evas.c_evas.Evas_Object *obj, char *name, char *newname)
+
+    # TEXT STYLES
+    evas.c_evas.Eina_List * edje_edit_styles_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_style_add(evas.c_evas.Evas_Object *obj, char *style)
+    void edje_edit_style_del(evas.c_evas.Evas_Object *obj, char *style)
+    evas.c_evas.Eina_List * edje_edit_style_tags_list_get(evas.c_evas.Evas_Object *obj, char *style)
+    char* edje_edit_style_tag_value_get(evas.c_evas.Evas_Object *obj, char *style, char *tag)
+    void edje_edit_style_tag_value_set(evas.c_evas.Evas_Object *obj, char *style, char *tag, char *new_value)
+    void edje_edit_style_tag_name_set(evas.c_evas.Evas_Object *obj, char *style, char *tag, char *new_name)
+    evas.c_evas.Eina_Bool edje_edit_style_tag_add(evas.c_evas.Evas_Object *obj, char *style, char* tag_name)
+    void edje_edit_style_tag_del(evas.c_evas.Evas_Object *obj, char *style, char* tag)
+
+    # EXTERNALS API
+    evas.c_evas.Eina_List *edje_edit_externals_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_external_add(evas.c_evas.Evas_Object *obj, char *name)
+    void edje_edit_external_del(evas.c_evas.Evas_Object *obj, char *name)
+
+    # PARTS API
+    evas.c_evas.Eina_List * edje_edit_parts_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_part_add(evas.c_evas.Evas_Object *obj, char *name, edje.c_edje.Edje_Part_Type type)
+    evas.c_evas.Eina_Bool edje_edit_part_external_add(evas.c_evas.Evas_Object *obj, char *name, char *source)
+    evas.c_evas.Eina_Bool edje_edit_part_del(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_exist(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_restack_below(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_restack_above(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_name_set(evas.c_evas.Evas_Object *obj, char  *part, char  *new_name)
+    edje.c_edje.Edje_Part_Type edje_edit_part_type_get(evas.c_evas.Evas_Object *obj, char *part)
+    char * edje_edit_part_clip_to_get(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_clip_to_set(evas.c_evas.Evas_Object *obj, char *part, char *clip_to)
+    char * edje_edit_part_source_get(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_source_set(evas.c_evas.Evas_Object *obj, char *part, char *source)
+    edje.c_edje.Edje_Text_Effect edje_edit_part_effect_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_effect_set(evas.c_evas.Evas_Object *obj, char *part, edje.c_edje.Edje_Text_Effect effect)
+    char * edje_edit_part_selected_state_get(evas.c_evas.Evas_Object *obj, char *part)
+    evas.c_evas.Eina_Bool edje_edit_part_selected_state_set(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_part_mouse_events_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_mouse_events_set(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Eina_Bool mouse_events)
+    evas.c_evas.Eina_Bool edje_edit_part_repeat_events_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_repeat_events_set(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Eina_Bool repeat_events)
+    evas.c_evas.Evas_Event_Flags edje_edit_part_ignore_flags_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_ignore_flags_set(evas.c_evas.Evas_Object *obj, char *part, evas.c_evas.Evas_Event_Flags ignore_flags)
+    int edje_edit_part_drag_x_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_x_set(evas.c_evas.Evas_Object *obj, char *part, int drag)
+    int edje_edit_part_drag_y_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_y_set(evas.c_evas.Evas_Object *obj, char *part, int drag)
+    int edje_edit_part_drag_step_x_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_step_x_set(evas.c_evas.Evas_Object *obj, char *part, int step)
+    int edje_edit_part_drag_step_y_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_step_y_set(evas.c_evas.Evas_Object *obj, char *part, int step)
+    int edje_edit_part_drag_count_x_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_count_x_set(evas.c_evas.Evas_Object *obj, char *part, int count)
+    int edje_edit_part_drag_count_y_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_count_y_set(evas.c_evas.Evas_Object *obj, char *part, int count)
+    char* edje_edit_part_drag_confine_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_confine_set(evas.c_evas.Evas_Object *obj, char *part, char *confine)
+    char* edje_edit_part_drag_event_get(evas.c_evas.Evas_Object *obj, char *part)
+    void edje_edit_part_drag_event_set(evas.c_evas.Evas_Object *obj, char *part, char *event)
+
+    # STATES API
+    evas.c_evas.Eina_List * edje_edit_part_states_list_get(evas.c_evas.Evas_Object *obj, char *part)
+    int edje_edit_state_name_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *new_name)
+    void edje_edit_state_add(evas.c_evas.Evas_Object *obj, char *part, char *name)
+    void edje_edit_state_del(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_exist(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_copy(evas.c_evas.Evas_Object *obj, char *part, char *sfrom, char *sto)
+    double edje_edit_state_rel1_relative_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_rel1_relative_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_rel2_relative_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_rel2_relative_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_rel1_relative_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_rel1_relative_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double y)
+    void edje_edit_state_rel2_relative_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_rel2_relative_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double y)
+    int edje_edit_state_rel1_offset_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_rel1_offset_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_rel2_offset_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_rel2_offset_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_rel1_offset_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_rel1_offset_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double y)
+    void edje_edit_state_rel2_offset_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_rel2_offset_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double y)
+    char * edje_edit_state_rel1_to_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    char * edje_edit_state_rel1_to_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    char * edje_edit_state_rel2_to_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    char * edje_edit_state_rel2_to_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_rel1_to_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *rel_to)
+    void edje_edit_state_rel1_to_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *rel_to)
+    void edje_edit_state_rel2_to_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *rel_to)
+    void edje_edit_state_rel2_to_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *rel_to)
+    void edje_edit_state_color_get(evas.c_evas.Evas_Object *obj, char *part, char *state, int *r, int *g, int *b, int *a)
+    void edje_edit_state_color2_get(evas.c_evas.Evas_Object *obj, char *part, char *state, int *r, int *g, int *b, int *a)
+    void edje_edit_state_color3_get(evas.c_evas.Evas_Object *obj, char *part, char *state, int *r, int *g, int *b, int *a)
+    void edje_edit_state_color_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int r, int g, int b, int a)
+    void edje_edit_state_color2_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int r, int g, int b, int a)
+    void edje_edit_state_color3_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int r, int g, int b, int a)
+    double edje_edit_state_align_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_align_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_align_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double align)
+    void edje_edit_state_align_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double align)
+    int edje_edit_state_min_w_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_min_w_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int min_w)
+    int edje_edit_state_min_h_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_min_h_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int min_h)
+    int edje_edit_state_max_w_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_max_w_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int max_w)
+    int edje_edit_state_max_h_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_max_h_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int max_h)
+    double edje_edit_state_aspect_min_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_aspect_max_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_aspect_min_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double aspect)
+    void edje_edit_state_aspect_max_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double aspect)
+    unsigned char edje_edit_state_aspect_pref_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_aspect_pref_set(evas.c_evas.Evas_Object *obj, char *part, char *state, unsigned char pref)
+    double edje_edit_state_fill_origin_relative_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_fill_origin_relative_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_fill_origin_offset_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_fill_origin_offset_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_fill_origin_relative_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_fill_origin_relative_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_fill_origin_offset_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_fill_origin_offset_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double y)
+    double edje_edit_state_fill_size_relative_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_fill_size_relative_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_fill_size_offset_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_fill_size_offset_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_fill_size_relative_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_fill_size_relative_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_fill_size_offset_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double x)
+    void edje_edit_state_fill_size_offset_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double y)
+    evas.c_evas.Eina_Bool edje_edit_state_visible_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_visible_set(evas.c_evas.Evas_Object *obj, char *part, char *state, evas.c_evas.Eina_Bool visible)
+    char* edje_edit_state_color_class_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_color_class_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *color_class)
+    evas.c_evas.Eina_List * edje_edit_state_external_params_list_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_get(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, edje.c_edje.Edje_External_Param_Type *type, void **value)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_int_get(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, int *value)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_double_get(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, double *value)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_string_get(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, char **value)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, edje.c_edje.Edje_External_Param_Type type, ...)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_int_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, int value)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_double_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, double value)
+    evas.c_evas.Eina_Bool edje_edit_state_external_param_string_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *param, char *value)
+
+    # TEXT API
+    char * edje_edit_state_text_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_text_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *text)
+    int edje_edit_state_text_size_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_text_size_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int size)
+    double edje_edit_state_text_align_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_text_align_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_text_align_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double align)
+    void edje_edit_state_text_align_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double align)
+    double edje_edit_state_text_elipsis_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_text_elipsis_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double balance)
+    evas.c_evas.Eina_Bool edje_edit_state_text_fit_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_text_fit_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, evas.c_evas.Eina_Bool fit)
+    evas.c_evas.Eina_Bool edje_edit_state_text_fit_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_text_fit_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, evas.c_evas.Eina_Bool fit)
+    evas.c_evas.Eina_List * edje_edit_fonts_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_font_add(evas.c_evas.Evas_Object *obj, char* path)
+    char * edje_edit_state_font_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_font_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *font)
+
+    # IMAGES API
+    evas.c_evas.Eina_List * edje_edit_images_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_image_add(evas.c_evas.Evas_Object *obj, char* path)
+    evas.c_evas.Eina_Bool edje_edit_image_data_add(evas.c_evas.Evas_Object *obj, char *name, int id)
+    char * edje_edit_state_image_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_image_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *image)
+    int edje_edit_image_id_get(evas.c_evas.Evas_Object *obj, char *image_name)
+    Edje_Edit_Image_Comp edje_edit_image_compression_type_get(evas.c_evas.Evas_Object *obj, char *image)
+    int edje_edit_image_compression_rate_get(evas.c_evas.Evas_Object *obj, char *image)
+    void edje_edit_state_image_border_get(evas.c_evas.Evas_Object *obj, char *part, char *state, int *l, int *r, int *t, int *b)
+    void edje_edit_state_image_border_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int l, int r, int t, int b)
+    unsigned char edje_edit_state_image_border_fill_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_image_border_fill_set(evas.c_evas.Evas_Object *obj, char *part, char *state, unsigned char fill)
+    evas.c_evas.Eina_List * edje_edit_state_tweens_list_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_tween_add(evas.c_evas.Evas_Object *obj, char *part, char *state, char *tween)
+    evas.c_evas.Eina_Bool edje_edit_state_tween_del(evas.c_evas.Evas_Object *obj, char *part, char *state, char *tween)
+
+    # SPECTRUM API
+    evas.c_evas.Eina_List * edje_edit_spectrum_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_spectra_add(evas.c_evas.Evas_Object *obj, char* name)
+    evas.c_evas.Eina_Bool edje_edit_spectra_del(evas.c_evas.Evas_Object *obj, char* spectra)
+    evas.c_evas.Eina_Bool edje_edit_spectra_name_set(evas.c_evas.Evas_Object *obj, char* spectra, char* name)
+    int edje_edit_spectra_stop_num_get(evas.c_evas.Evas_Object *obj, char* spectra)
+    evas.c_evas.Eina_Bool edje_edit_spectra_stop_num_set(evas.c_evas.Evas_Object *obj, char* spectra, int num)
+    evas.c_evas.Eina_Bool edje_edit_spectra_stop_color_get(evas.c_evas.Evas_Object *obj, char* spectra, int stop_number, int *r, int *g, int *b, int *a, int *d)
+    evas.c_evas.Eina_Bool edje_edit_spectra_stop_color_set(evas.c_evas.Evas_Object *obj, char* spectra, int stop_number, int r, int g, int b, int a, int d)
+
+    # GRADIENT API
+    char * edje_edit_state_gradient_type_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_type_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char *type)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_use_fill_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    char * edje_edit_state_gradient_spectra_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_spectra_set(evas.c_evas.Evas_Object *obj, char *part, char *state, char* spectra)
+    int edje_edit_state_gradient_angle_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    void edje_edit_state_gradient_angle_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int angle)
+    double edje_edit_state_gradient_rel1_relative_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_gradient_rel1_relative_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_gradient_rel2_relative_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    double edje_edit_state_gradient_rel2_relative_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel1_relative_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double val)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel1_relative_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double val)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel2_relative_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double val)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel2_relative_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, double val)
+    int edje_edit_state_gradient_rel1_offset_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_gradient_rel1_offset_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_gradient_rel2_offset_x_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    int edje_edit_state_gradient_rel2_offset_y_get(evas.c_evas.Evas_Object *obj, char *part, char *state)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel1_offset_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int val)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel1_offset_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int val)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel2_offset_x_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int val)
+    evas.c_evas.Eina_Bool edje_edit_state_gradient_rel2_offset_y_set(evas.c_evas.Evas_Object *obj, char *part, char *state, int val)
+
+    # PROGRAMS API
+    evas.c_evas.Eina_List* edje_edit_programs_list_get(evas.c_evas.Evas_Object *obj)
+    evas.c_evas.Eina_Bool edje_edit_program_add(evas.c_evas.Evas_Object *obj, char *name)
+    evas.c_evas.Eina_Bool edje_edit_program_del(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_exist(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_run(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_name_set(evas.c_evas.Evas_Object *obj, char *prog, char *new_name)
+    char * edje_edit_program_source_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_source_set(evas.c_evas.Evas_Object *obj, char *prog, char *source)
+    char * edje_edit_program_signal_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_signal_set(evas.c_evas.Evas_Object *obj, char *prog, char *signal)
+    double edje_edit_program_in_from_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_in_from_set(evas.c_evas.Evas_Object *obj, char *prog, double seconds)
+    double edje_edit_program_in_range_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_in_range_set(evas.c_evas.Evas_Object *obj, char *prog, double seconds)
+    edje.c_edje.Edje_Action_Type edje_edit_program_action_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_action_set(evas.c_evas.Evas_Object *obj, char *prog, edje.c_edje.Edje_Action_Type action)
+    evas.c_evas.Eina_List* edje_edit_program_targets_get(evas.c_evas.Evas_Object *, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_target_add(evas.c_evas.Evas_Object *obj, char *prog, char *target)
+    evas.c_evas.Eina_Bool edje_edit_program_targets_clear(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_List* edje_edit_program_afters_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_after_add(evas.c_evas.Evas_Object *obj, char *prog, char *after)
+    evas.c_evas.Eina_Bool edje_edit_program_afters_clear(evas.c_evas.Evas_Object *obj, char *prog)
+    char* edje_edit_program_state_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_state_set(evas.c_evas.Evas_Object *obj, char *prog, char *state)
+    double edje_edit_program_value_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_value_set(evas.c_evas.Evas_Object *obj, char *prog, double value)
+    char* edje_edit_program_state2_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_state2_set(evas.c_evas.Evas_Object *obj, char *prog, char *state2)
+    double edje_edit_program_value2_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_value2_set(evas.c_evas.Evas_Object *obj, char *prog, double value)
+    edje.c_edje.Edje_Tween_Mode edje_edit_program_transition_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_transition_set(evas.c_evas.Evas_Object *obj, char *prog, edje.c_edje.Edje_Tween_Mode transition)
+    double edje_edit_program_transition_time_get(evas.c_evas.Evas_Object *obj, char *prog)
+    evas.c_evas.Eina_Bool edje_edit_program_transition_time_set(evas.c_evas.Evas_Object *obj, char *prog, double seconds)
+
+    # SCRIPTS API
+    char* edje_edit_script_get(evas.c_evas.Evas_Object *obj)
+
+cdef public class EdjeEdit(edje.c_edje.Edje) [object PyEdjeEdit, type PyEdjeEdit_Type]:
+    pass
+#    cdef object _text_change_cb
+#    cdef object _message_handler_cb
+#    cdef object _signal_callbacks
+#
+#    cdef void message_send_int(self, int id, int data)
+#    cdef void message_send_float(self, int id, float data)
+#    cdef void message_send_str(self, int id, char *data)
+#    cdef void message_send_str_set(self, int id, data)
+#    cdef void message_send_str_int(self, int id, char *s, int i)
+#    cdef void message_send_str_float(self, int id, char *s, float f)
+#    cdef void message_send_str_int_set(self, int id, char *s, data)
+#    cdef void message_send_str_float_set(self, int id, char *s, data)
+#    cdef void message_send_int_set(self, int id, data)
+#    cdef void message_send_float_set(self, int id, data)
+#    cdef message_send_set(self, int id, data)
+
diff --git a/python_edje.egg-info/SOURCES.txt b/python_edje.egg-info/SOURCES.txt
index eac9268..468b213 100644
--- a/python_edje.egg-info/SOURCES.txt
+++ b/python_edje.egg-info/SOURCES.txt
@@ -10,10 +10,24 @@ setup.py
 edje/__init__.py
 edje/decorators.py
 edje/edje.c_edje.pyx
+edje/edje.c_edje_external.pxi
 edje/edje.c_edje_message.pxi
 edje/edje.c_edje_object.pxi
+edje/edit/__init__.py
+edje/edit/c_edit.pyx
+edje/edit/c_edit_object.pxi
+edje/edit/c_edit_object_color_class.pxi
+edje/edit/c_edit_object_data.pxi
+edje/edit/c_edit_object_group.pxi
+edje/edit/c_edit_object_part.pxi
+edje/edit/c_edit_object_programs.pxi
+edje/edit/c_edit_object_spectra.pxi
+edje/edit/c_edit_object_state.pxi
+edje/edit/c_edit_object_text_style.pxi
 include/edje/__init__.py
 include/edje/c_edje.pxd
+include/edje/edit/__init__.py
+include/edje/edit/c_edit.pxd
 python_edje.egg-info/PKG-INFO
 python_edje.egg-info/SOURCES.txt
 python_edje.egg-info/dependency_links.txt
@@ -23,4 +37,9 @@ python_edje.egg-info/top_level.txt
 tests/01-basics.py
 tests/02-decorators.py
 tests/theme.edc
-tests/theme.edj
\ No newline at end of file
+tests/theme.edj
+tests/edit/01-edje.py
+tests/edit/02-group.py
+tests/edit/03-parts.py
+tests/edit/groups.edc
+tests/edit/theme.edc
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 3da46c7..a063512 100644
--- a/setup.py
+++ b/setup.py
@@ -65,6 +65,20 @@ edjemodule = Extension('edje.c_edje',
                                 ],
                        **pkgconfig('"edje >= 0.9.9.050"'))
 
+edjeeditmodule = Extension('edje.edit.c_edit',
+                       sources=['edje/edit/c_edit.pyx',
+                                ],
+                       depends=['edje/edit/c_edit_object.pxi',
+                                'edje/edit/c_edit_object_group.pxi',
+                                'edje/edit/c_edit_object_data.pxi',
+                                'edje/edit/c_edit_object_color_class.pxi',
+                                'edje/edit/c_edit_object_text_style.pxi',
+                                'edje/edit/c_edit_object_part.pxi',
+                                'edje/edit/c_edit_object_state.pxi',
+                                'include/edje/edit/c_edit.pxd',
+                                ],
+                       **pkgconfig('"edje >= 0.9.9.050"'))
+
 
 trove_classifiers = [
     "Development Status :: 3 - Alpha",
@@ -143,7 +157,7 @@ setup(name='python-edje',
       packages=find_packages(),
       install_requires=['python-evas>=0.3.1'],
       setup_requires=['python-evas>=0.3.1'],
-      ext_modules=[edjemodule],
+      ext_modules=[edjemodule, edjeeditmodule],
       zip_safe=False,
       cmdclass={'build_ext': edje_build_ext,},
       )
diff --git a/tests/edit/01-edje.py b/tests/edit/01-edje.py
new file mode 100644
index 0000000..4f3e4af
--- /dev/null
+++ b/tests/edit/01-edje.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python
+
+import edje
+import edje.edit
+import ecore.evas
+import unittest
+
+class Basics(unittest.TestCase):
+    def setUp(self):
+        import shutil
+        shutil.copyfile("theme.edj","test.edj")
+        self.canvas = ecore.evas.Buffer(300, 300)
+        self.edj = edje.edit.EdjeEdit(self.canvas.evas, file="test.edj", group="main")
+
+    def tearDown(self):
+        self.edj.delete()
+        del self.canvas
+        self.canvas = None
+        self.edj = None
+        import os
+        os.remove("test.edj")
+
+    def test_compiler_get(self):
+        self.assertEqual(self.edj.compiler_get(), "edje_cc")
+
+    def test_save(self):
+        pass #self.assertTrue(self.edj.save())
+
+    # Group
+
+    def test_current_group(self):
+        self.assertNotEqual(self.edj.current_group, None)
+
+    def test_group_add(self):
+        self.assertTrue(self.edj.group_add("gNEW"))
+        self.assertFalse(self.edj.group_add("main"))
+        self.assertFalse(self.edj.group_add("g1"))
+        self.assertFalse(self.edj.group_add("gNEW"))
+        self.assertTrue(self.edj.group_add(""))
+
+    def test_group_exist(self):
+        self.assertTrue(self.edj.group_exist("main"))
+        self.assertTrue(self.edj.group_exist("g2"))
+        self.assertFalse(self.edj.group_exist("gNEW"))
+        self.assertFalse(self.edj.group_exist(""))
+        self.assertTrue(self.edj.group_add("gNEW"))
+        self.assertFalse(self.edj.group_exist("gNew"))
+        self.assertTrue(self.edj.group_add(""))
+        self.assertTrue(self.edj.group_exist("gNEW"))
+        self.assertTrue(self.edj.group_exist(""))
+
+    # Data
+
+    def test_data(self):
+        print self.edj.data
+
+    def test_data_add(self):
+        pass
+
+    def test_data_del(self):
+        pass
+
+    # Text Style
+
+    def test_text_styles(self):
+        print self.edj.text_styles
+
+    def test_text_styles_get(self):
+        pass
+
+    def test_text_styles_add(self):
+        pass
+
+    def test_text_styles_del(self):
+        pass
+
+    # Color Class
+
+    def test_color_classes(self):
+        pass
+
+    def text_color_class_get(self):
+        pass
+
+    def test_color_class_add(self):
+        pass
+
+    def test_color_class_del(self):
+        pass
+
+    # Part
+
+    def test_parts(self):
+        print self.edj.parts
+        self.assertEqual(self.edj.parts, ['main_rect', 'main_text', 'main_image', 'main_swallow', 'main_textblock', 'main_gradient', 'main_group', 'main_box', 'main_table'])
+
+    def test_part_get(self):
+#        self.assertEqual(self.edj.part_get(""), None)
+        self.assertNotEqual(self.edj.part_get("main_rect"), None)
+        self.assertEqual(self.edj.part_get("noexist"), None)
+
+    def test_part_add(self):
+        print "PART_ADD"
+#        self.assertFalse(self.edj.part_add("fail1", edje.EDJE_PART_TYPE_NONE))
+#        self.assertFalse(self.edj.part_add("fail2", edje.EDJE_PART_TYPE_LAST))
+#        self.assertFalse(self.edj.part_add("fail3", edje.EDJE_PART_TYPE_LAST + 1))
+#        self.assertFalse(self.edj.part_add("", edje.EDJE_PART_TYPE_RECTANGLE))
+        self.assertTrue(self.edj.part_add("new_rect", edje.EDJE_PART_TYPE_RECTANGLE))
+        self.assertTrue(self.edj.part_add("new_image", edje.EDJE_PART_TYPE_IMAGE))
+        self.assertTrue(self.edj.part_add("new_swallow", edje.EDJE_PART_TYPE_SWALLOW))
+
+    def test_part_exist(self):
+#        self.assertFalse(self.edj.part_exist(""))
+        self.assertFalse(self.edj.part_exist("fail"))
+        self.assertTrue(self.edj.part_add("new_rect", edje.EDJE_PART_TYPE_RECTANGLE))
+        self.assertTrue(self.edj.part_exist("new_rect"))
+        self.assertTrue(self.edj.part_exist("main_gradient"))
+
+    def test_part_del(self):
+        self.assertFalse(self.edj.part_exist(""))
+        self.assertFalse(self.edj.part_exist("fail"))
+        self.assertTrue(self.edj.part_add("new_rect", edje.EDJE_PART_TYPE_RECTANGLE))
+        self.assertTrue(self.edj.part_del("new_rect"))
+        self.assertTrue(self.edj.part_del("main_gradient"))
+
+edje.file_cache_set(0)
+unittest.main()
+edje.shutdown()
+ecore.evas.shutdown()
diff --git a/tests/edit/02-group.py b/tests/edit/02-group.py
new file mode 100644
index 0000000..e8d7e68
--- /dev/null
+++ b/tests/edit/02-group.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+
+import edje
+import edje.edit
+import ecore.evas
+import unittest
+
+class Basics(unittest.TestCase):
+    def setUp(self):
+        import shutil
+        shutil.copyfile("theme.edj","test.edj")
+        self.canvas = ecore.evas.Buffer(300, 300)
+        self.edj = edje.edit.EdjeEdit(self.canvas.evas, file="test.edj", group="main")
+        self.group = self.edj.current_group
+
+    def tearDown(self):
+        self.edj.delete()
+        del self.canvas
+        self.canvas = None
+        self.edj = None
+        self.group = None
+        import os
+        os.remove("test.edj")
+
+    def test_rename(self):
+        self.assertFalse(self.group.rename("g1"))
+        self.assertTrue(self.group.rename("main"))
+        self.assertTrue(self.group.rename("gNewName"))
+        self.assertTrue(self.group.rename("main"))
+
+    def test_w_min(self):
+        self.assertEqual(self.group.w_min, 123)
+        self.group.w_min = 555
+        self.assertEqual(self.group.w_min, 555)
+
+    def test_w_max(self):
+        self.assertEqual(self.group.w_max, 789)
+        self.group.w_max = 888
+        self.assertEqual(self.group.w_max, 888)
+
+    def test_h_min(self):
+        self.assertEqual(self.group.h_min, 456)
+        self.group.h_min = 600
+        self.assertEqual(self.group.h_min, 600)
+
+    def test_h_max(self):
+        self.assertEqual(self.group.h_max, 999)
+        self.group.h_max = 1111
+        self.assertEqual(self.group.h_max, 1111)
+
+    def test_delete(self):
+        self.assertTrue(self.edj.group_exist("main"))
+#        self.assertTrue(self.group.delete())                 #segfault
+#        self.assertFalse(self.edj.group_exist("main"))
+
+edje.file_cache_set(0)
+unittest.main()
+edje.shutdown()
+ecore.evas.shutdown()
diff --git a/tests/edit/03-parts.py b/tests/edit/03-parts.py
new file mode 100644
index 0000000..d820207
--- /dev/null
+++ b/tests/edit/03-parts.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+
+import edje
+import edje.edit
+import ecore.evas
+import unittest
+
+class Basics(unittest.TestCase):
+    def setUp(self):
+        import shutil
+        shutil.copyfile("theme.edj","test.edj")
+        self.canvas = ecore.evas.Buffer(300, 300)
+        self.edj = edje.edit.EdjeEdit(self.canvas.evas, file="test.edj", group="main")
+        self.group = self.edj.current_group
+        self.parts = self.edj.parts
+
+    def tearDown(self):
+        self.edj.delete()
+        del self.canvas
+        self.canvas = None
+        self.edj = None
+        self.group = None
+        import os
+        os.remove("test.edj")
+
+    def test_name(self):
+        for part in self.edj.parts:
+            self.assertEqual(self.edj.part_get(part).name, part)
+
+    def test_restack_below(self):
+        # You can't pre-load parts
+        self.assertFalse(self.edj.part_get(self.parts[0]).restack_below())
+        self.assertTrue(self.edj.part_get(self.parts[1]).restack_below())
+        self.assertFalse(self.edj.part_get(self.parts[1]).restack_below())
+        self.assertTrue(self.edj.part_get(self.parts[0]).restack_below())
+        self.assertTrue(self.edj.part_get(self.parts[8]).restack_below())
+        self.assertTrue(self.edj.part_get(self.parts[8]).restack_below())
+        self.assertTrue(self.edj.part_get(self.parts[8]).restack_below())
+        self.assertEqual(self.edj.parts, ['main_rect', 'main_text', 'main_image', 'main_swallow', 'main_textblock', 'main_table', 'main_gradient', 'main_group', 'main_box'])
+
+    def test_restack_above(self):
+        # You can't pre-load parts
+        self.assertFalse(self.edj.part_get(self.parts[8]).restack_above())
+        self.assertTrue(self.edj.part_get(self.parts[7]).restack_above())
+        self.assertFalse(self.edj.part_get(self.parts[7]).restack_above())
+        self.assertTrue(self.edj.part_get(self.parts[8]).restack_above())
+        self.assertTrue(self.edj.part_get(self.parts[0]).restack_above())
+        self.assertTrue(self.edj.part_get(self.parts[0]).restack_above())
+        self.assertTrue(self.edj.part_get(self.parts[0]).restack_above())
+        self.assertEqual(self.edj.parts, ['main_text', 'main_image', 'main_swallow', 'main_rect', 'main_textblock', 'main_gradient', 'main_group', 'main_box', 'main_table'])
+
+    def test_rename(self):
+        for part_name in self.parts[:-1]:
+            part = self.edj.part_get(part_name)
+            self.assertFalse(part.rename(self.parts[8]))
+            self.assertTrue(part.rename(part_name))
+            self.assertTrue(part.rename("New Part"))
+            self.assertTrue(part.rename(part_name))
+
+edje.file_cache_set(0)
+unittest.main()
+edje.shutdown()
+ecore.evas.shutdown()
diff --git a/tests/edit/groups.edc b/tests/edit/groups.edc
new file mode 100644
index 0000000..1042137
--- /dev/null
+++ b/tests/edit/groups.edc
@@ -0,0 +1,41 @@
+   group {
+      name: "g1";
+      parts {
+         part {
+            name: "g1_p1";
+            type: RECT;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+            }
+         }
+      }
+   }
+
+   group {
+      name: "g2";
+      parts {
+         part {
+            name: "g2_p1";
+            type: RECT;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+            }
+         }
+      }
+   }
+
+   group {
+      name: "g3";
+      parts {
+         part {
+            name: "g3_p1";
+            type: RECT;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+            }
+         }
+      }
+   }
diff --git a/tests/edit/theme.edc b/tests/edit/theme.edc
new file mode 100644
index 0000000..cc3ff77
--- /dev/null
+++ b/tests/edit/theme.edc
@@ -0,0 +1,166 @@
+collections {
+   group {
+      name: "main";
+      min: 123 456;
+      max: 789 999;
+
+      parts {
+         part {
+            name: "main_rect";
+            type: RECT;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_text";
+            type: TEXT;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_image";
+            type: IMAGE;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_swallow";
+            type: SWALLOW;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_textblock";
+            type: TEXTBLOCK;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_gradient";
+            type: GRADIENT;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_group";
+            type: GROUP;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_box";
+            type: BOX;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               box.layout: "horizontal";
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+         part {
+            name: "main_table";
+            type: TABLE;
+            mouse_events: 0;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 255;
+               rel1 {
+                  relative: 0.0 0.0;
+                  offset: 0 0;
+               }
+               rel2 {
+                  relative: 0.5 0.5;
+                  offset: -1 -1;
+               }
+            }
+         }
+      }
+   }
+
+#include "groups.edc"
+}

-- 
Python bindings for Edje



More information about the Pkg-e-commits mailing list