1 #include "edje_private.h"
3 typedef struct _Edje_Box_Layout Edje_Box_Layout;
4 struct _Edje_Box_Layout
7 Evas_Object_Box_Layout func;
8 void *(*layout_data_get)(void *);
9 void (*layout_data_free)(void *);
11 void (*free_data)(void *);
15 static Eina_Hash *_edje_color_class_hash = NULL;
16 static Eina_Hash *_edje_color_class_member_hash = NULL;
18 static Eina_Hash *_edje_text_class_hash = NULL;
19 static Eina_Hash *_edje_text_class_member_hash = NULL;
21 static Eina_Rbtree *_edje_box_layout_registry = NULL;
23 char *_edje_fontset_append = NULL;
24 FLOAT_T _edje_scale = ZERO;
25 Eina_Bool _edje_password_show_last = EINA_FALSE;
26 FLOAT_T _edje_password_show_last_timeout = ZERO;
27 int _edje_freeze_val = 0;
28 int _edje_freeze_calc_count = 0;
29 Eina_List *_edje_freeze_calc_list = NULL;
31 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
32 struct _Edje_List_Foreach_Data
37 typedef struct _Edje_List_Refcount Edje_List_Refcount;
38 struct _Edje_List_Refcount
45 static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
46 static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
47 static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
48 static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
49 static void _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__);
50 static void _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child);
51 static void _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child);
53 Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path);
55 static Edje_User_Defined *
56 _edje_user_definition_new(Edje_User_Defined_Type type, const char *part, Edje *ed)
58 Edje_User_Defined *eud;
60 eud = malloc(sizeof (Edje_User_Defined));
61 if (!eud) return NULL;
64 eud->part = eina_stringshare_add(part);
66 ed->user_defined = eina_list_append(ed->user_defined, eud);
72 _edje_user_definition_remove(Edje_User_Defined *eud, Evas_Object *child)
74 eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud);
76 if (child) evas_object_event_callback_del_full(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
77 eina_stringshare_del(eud->part);
82 _edje_user_definition_free(Edje_User_Defined *eud)
84 Evas_Object *child = NULL;
87 eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud);
91 case EDJE_USER_SWALLOW:
92 child = eud->u.swallow.child;
93 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
96 _edje_real_part_swallow_clear(rp);
97 if ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
98 (rp->typedata.swallow))
100 rp->typedata.swallow->swallowed_object = NULL;
101 rp->typedata.swallow->swallow_params.min.w = 0;
102 rp->typedata.swallow->swallow_params.min.h = 0;
103 rp->typedata.swallow->swallow_params.max.w = 0;
104 rp->typedata.swallow->swallow_params.max.h = 0;
106 rp->edje->dirty = EINA_TRUE;
107 rp->edje->recalc_call = EINA_TRUE;
108 #ifdef EDJE_CALC_CACHE
111 _edje_recalc_do(rp->edje);
114 case EDJE_USER_BOX_PACK:
115 child = eud->u.box.child;
116 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
117 _edje_box_child_remove(rp, child);
119 case EDJE_USER_TABLE_PACK:
120 child = eud->u.table.child;
121 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
122 _edje_table_child_remove(rp, child);
124 case EDJE_USER_STRING:
125 case EDJE_USER_DRAG_STEP:
126 case EDJE_USER_DRAG_PAGE:
127 case EDJE_USER_DRAG_VALUE:
128 case EDJE_USER_DRAG_SIZE:
132 _edje_user_definition_remove(eud, child);
136 _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
138 Edje_User_Defined *eud = data;
140 _edje_user_definition_free(eud);
144 _edje_class_member_direct_del(const char *class, Edje_List_Refcount *lookup, Eina_Hash *hash)
148 members = eina_hash_find(hash, class);
149 members = eina_list_remove_list(members, lookup->lookup);
150 eina_hash_set(hash, class, members);
155 _edje_class_member_add(Edje *ed, Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
157 Edje_List_Refcount *lookup;
160 if ((!ed) || (!ehash) || (!ghash) || (!class)) return;
162 lookup = eina_hash_find(*ehash, class);
165 EINA_REFCOUNT_REF(lookup);
169 lookup = malloc(sizeof (Edje_List_Refcount));
170 if (!lookup) return ;
171 EINA_REFCOUNT_INIT(lookup);
173 /* Get members list */
174 members = eina_hash_find(*ghash, class);
176 /* Update the member list */
177 lookup->lookup = members = eina_list_prepend(members, ed);
179 /* Don't loose track of members list */
181 *ehash = eina_hash_string_small_new(NULL);
182 eina_hash_add(*ehash, class, lookup);
184 /* Reset the member list to the right pointer */
186 *ghash = eina_hash_string_superfast_new(NULL);
187 eina_hash_set(*ghash, class, members);
191 _edje_class_member_del(Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
193 Edje_List_Refcount *lookup;
196 if ((!ehash) || (!ghash) || (!class)) return;
197 members = eina_hash_find(*ghash, class);
198 if (!members) return;
200 lookup = eina_hash_find(*ehash, class);
201 if (!lookup) return ;
203 EINA_REFCOUNT_UNREF(lookup)
205 members = eina_list_remove_list(members, lookup->lookup);
206 eina_hash_set(*ghash, class, members);
208 eina_hash_del(*ehash, class, lookup);
214 member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
216 eina_list_free(data);
221 _edje_class_members_free(Eina_Hash **ghash)
223 if (!ghash || !*ghash) return;
224 eina_hash_foreach(*ghash, member_list_free, NULL);
225 eina_hash_free(*ghash);
229 /************************** API Routines **************************/
239 // FIXME: could just have a global freeze instead of per object
240 // above i tried.. but this broke some things. notable e17's menus. why?
244 EINA_LIST_FOREACH(_edje_edjes, l, data)
245 edje_object_freeze(data);
251 _edje_thaw_edje(Edje *ed)
255 for (i = 0; i < ed->table_parts_size; i++)
259 rp = ed->table_parts[i];
260 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
261 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
262 (rp->typedata.swallow)) &&
263 (rp->typedata.swallow->swallowed_object))
267 ed2 = _edje_fetch(rp->typedata.swallow->swallowed_object);
268 if (ed2) _edje_thaw_edje(ed2);
271 if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
280 if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
284 _edje_freeze_calc_count = 0;
285 EINA_LIST_FREE(_edje_freeze_calc_list, ed)
288 ed->freeze_calc = EINA_FALSE;
294 // FIXME: could just have a global freeze instead of per object
295 // comment as above.. why?
298 EINA_LIST_FOREACH(_edje_edjes, l, data)
299 edje_object_thaw(data);
304 edje_fontset_append_set(const char *fonts)
306 if (_edje_fontset_append)
307 free(_edje_fontset_append);
308 _edje_fontset_append = fonts ? strdup(fonts) : NULL;
312 edje_fontset_append_get(void)
314 return _edje_fontset_append;
318 edje_scale_set(double scale)
323 if (_edje_scale == FROM_DOUBLE(scale)) return;
324 _edje_scale = FROM_DOUBLE(scale);
325 EINA_LIST_FOREACH(_edje_edjes, l, data)
326 edje_object_calc_force(data);
332 return TO_DOUBLE(_edje_scale);
336 edje_password_show_last_set(Eina_Bool password_show_last)
338 if (_edje_password_show_last == password_show_last) return;
339 _edje_password_show_last = password_show_last;
343 edje_password_show_last_timeout_set(double password_show_last_timeout)
345 if (_edje_password_show_last_timeout == FROM_DOUBLE(password_show_last_timeout)) return;
346 _edje_password_show_last_timeout = FROM_DOUBLE(password_show_last_timeout);
350 edje_object_scale_set(Evas_Object *obj, double scale)
357 ed = _edje_fetch(obj);
358 if (!ed) return EINA_FALSE;
359 if (ed->scale == scale) return EINA_TRUE;
360 ed->scale = FROM_DOUBLE(scale);
361 EINA_LIST_FOREACH(ed->groups, l, ged)
362 ged->scale = ed->scale;
363 EINA_LIST_FOREACH(ed->subobjs, l, o)
364 edje_object_calc_force(o);
365 for(i = 0; i < ed->table_parts_size; ++i)
368 ep = ed->table_parts[i];
369 if ((ep->part->type == EDJE_PART_TYPE_BOX)
370 || (ep->part->type == EDJE_PART_TYPE_TABLE))
374 EINA_LIST_FOREACH(ep->typedata.container->items, l, o)
375 edje_object_scale_set(o, scale);
378 edje_object_calc_force(obj);
383 edje_object_scale_get(const Evas_Object *obj)
387 ed = _edje_fetch(obj);
389 return TO_DOUBLE(ed->scale);
393 edje_object_mirrored_get(const Evas_Object *obj)
397 ed = _edje_fetch(obj);
398 if (!ed) return EINA_FALSE;
404 _edje_object_orientation_inform(Evas_Object *obj)
406 if (edje_object_mirrored_get(obj))
407 edje_object_signal_emit(obj, "edje,state,rtl", "edje");
409 edje_object_signal_emit(obj, "edje,state,ltr", "edje");
413 edje_object_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
418 ed = _edje_fetch(obj);
420 if (ed->is_rtl == rtl) return;
424 for (i = 0 ; i < ed->table_parts_size ; i++)
430 ep = ed->table_parts[i];
431 s = ep->param1.description->state.name,
432 v = ep->param1.description->state.value;
433 _edje_part_description_apply(ed, ep, s, v , NULL, 0.0);
434 ep->chosen_description = ep->param1.description;
438 _edje_object_orientation_inform(obj);
444 edje_object_data_get(const Evas_Object *obj, const char *key)
448 ed = _edje_fetch(obj);
451 if (!ed->collection) return NULL;
452 if (!ed->collection->data) return NULL;
453 return edje_string_get(eina_hash_find(ed->collection->data, key));
457 edje_object_freeze(Evas_Object *obj)
462 ed = _edje_fetch(obj);
464 for (i = 0; i < ed->table_parts_size; i++)
467 rp = ed->table_parts[i];
468 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
469 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
470 (rp->typedata.swallow)) &&
471 (rp->typedata.swallow->swallowed_object))
472 edje_object_freeze(rp->typedata.swallow->swallowed_object);
474 return _edje_freeze(ed);
478 edje_object_thaw(Evas_Object *obj)
483 ed = _edje_fetch(obj);
485 for (i = 0; i < ed->table_parts_size; i++)
489 rp = ed->table_parts[i];
490 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
491 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
492 (rp->typedata.swallow)) &&
493 (rp->typedata.swallow->swallowed_object))
494 edje_object_thaw(rp->typedata.swallow->swallowed_object);
496 return _edje_thaw(ed);
500 edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
503 Edje_Color_Class *cc;
505 if (!color_class) return EINA_FALSE;
507 cc = eina_hash_find(_edje_color_class_hash, color_class);
510 cc = calloc(1, sizeof(Edje_Color_Class));
511 if (!cc) return EINA_FALSE;
512 cc->name = eina_stringshare_add(color_class);
518 if (!_edje_color_class_hash)
519 _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
520 eina_hash_add(_edje_color_class_hash, color_class, cc);
524 else if (r > 255) r = 255;
526 else if (g > 255) g = 255;
528 else if (b > 255) b = 255;
530 else if (a > 255) a = 255;
531 if ((cc->r == r) && (cc->g == g) &&
532 (cc->b == b) && (cc->a == a) &&
533 (cc->r2 == r2) && (cc->g2 == g2) &&
534 (cc->b2 == b2) && (cc->a2 == a2) &&
535 (cc->r3 == r3) && (cc->g3 == g3) &&
536 (cc->b3 == b3) && (cc->a3 == a3))
551 members = eina_hash_find(_edje_color_class_member_hash, color_class);
556 ed = eina_list_data_get(members);
557 ed->dirty = EINA_TRUE;
558 ed->recalc_call = EINA_TRUE;
559 #ifdef EDJE_CALC_CACHE
560 ed->all_part_change = EINA_TRUE;
563 _edje_emit(ed, "color_class,set", color_class);
564 members = eina_list_next(members);
570 edje_color_class_get(const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
572 Edje_Color_Class *cc;
577 cc = eina_hash_find(_edje_color_class_hash, color_class);
581 #define X(C) if (C) *C = cc->C
582 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
592 #define X(C) if (C) *C = 0
593 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
604 edje_color_class_del(const char *color_class)
606 Edje_Color_Class *cc;
609 if (!color_class) return;
611 cc = eina_hash_find(_edje_color_class_hash, color_class);
614 eina_hash_del(_edje_color_class_hash, color_class, cc);
615 eina_stringshare_del(cc->name);
618 members = eina_hash_find(_edje_color_class_member_hash, color_class);
623 ed = eina_list_data_get(members);
624 ed->dirty = EINA_TRUE;
625 ed->recalc_call = EINA_TRUE;
626 #ifdef EDJE_CALC_CACHE
627 ed->all_part_change = EINA_TRUE;
630 _edje_emit(ed, "color_class,del", color_class);
631 members = eina_list_next(members);
636 edje_color_class_list(void)
638 Edje_List_Foreach_Data fdata;
640 if (!_edje_color_class_member_hash) return NULL;
642 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
643 eina_hash_foreach(_edje_color_class_member_hash,
644 _edje_color_class_list_foreach, &fdata);
650 _edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
652 Edje_List_Foreach_Data *fd;
655 fd->list = eina_list_append(fd->list, strdup(key));
660 edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
663 Edje_Color_Class *cc;
666 ed = _edje_fetch(obj);
667 if ((!ed) || (!color_class)) return EINA_FALSE;
669 else if (r > 255) r = 255;
671 else if (g > 255) g = 255;
673 else if (b > 255) b = 255;
675 else if (a > 255) a = 255;
676 cc = eina_hash_find(ed->color_classes, color_class);
679 if ((cc->r == r) && (cc->g == g) &&
680 (cc->b == b) && (cc->a == a) &&
681 (cc->r2 == r2) && (cc->g2 == g2) &&
682 (cc->b2 == b2) && (cc->a2 == a2) &&
683 (cc->r3 == r3) && (cc->g3 == g3) &&
684 (cc->b3 == b3) && (cc->a3 == a3))
698 ed->dirty = EINA_TRUE;
699 ed->recalc_call = EINA_TRUE;
700 #ifdef EDJE_CALC_CACHE
701 ed->all_part_change = EINA_TRUE;
707 color_class = eina_stringshare_add(color_class);
708 if (!color_class) return EINA_FALSE;
709 cc = malloc(sizeof(Edje_Color_Class));
712 eina_stringshare_del(color_class);
715 cc->name = color_class;
728 eina_hash_direct_add(ed->color_classes, cc->name, cc);
729 ed->dirty = EINA_TRUE;
730 ed->recalc_call = EINA_TRUE;
731 #ifdef EDJE_CALC_CACHE
732 ed->all_part_change = EINA_TRUE;
735 for (i = 0; i < ed->table_parts_size; i++)
739 rp = ed->table_parts[i];
740 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
741 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
742 (rp->typedata.swallow)) &&
743 (rp->typedata.swallow->swallowed_object))
744 edje_object_color_class_set(rp->typedata.swallow->swallowed_object,
746 r, g, b, a, r2, g2, b2, a2, r3, g3, b3,
751 _edje_emit(ed, "color_class,set", color_class);
756 edje_object_color_class_get(const Evas_Object *obj, const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
758 Edje *ed = _edje_fetch(obj);
759 Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
763 #define X(C) if (C) *C = cc->C
764 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
774 #define X(C) if (C) *C = 0
775 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
786 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
789 Edje_Color_Class *cc = NULL;
792 ed = _edje_fetch(obj);
794 if ((!ed) || (!color_class)) return;
796 eina_hash_del(ed->color_classes, color_class, cc);
798 for (i = 0; i < ed->table_parts_size; i++)
802 rp = ed->table_parts[i];
803 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
804 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
805 (rp->typedata.swallow)) &&
806 (rp->typedata.swallow->swallowed_object))
807 edje_object_color_class_del(rp->typedata.swallow->swallowed_object, color_class);
810 ed->dirty = EINA_TRUE;
811 ed->recalc_call = EINA_TRUE;
812 #ifdef EDJE_CALC_CACHE
813 ed->all_part_change = EINA_TRUE;
816 _edje_emit(ed, "color_class,del", color_class);
820 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
825 if (!text_class) return EINA_FALSE;
826 if (!font) font = "";
828 tc = eina_hash_find(_edje_text_class_hash, text_class);
829 /* Create new text class */
832 tc = calloc(1, sizeof(Edje_Text_Class));
833 if (!tc) return EINA_FALSE;
834 tc->name = eina_stringshare_add(text_class);
840 if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
841 eina_hash_add(_edje_text_class_hash, text_class, tc);
843 tc->font = eina_stringshare_add(font);
848 /* Match and the same, return */
849 if (((tc->font && font) && !strcmp(tc->font, font)) &&
853 /* Update the class found */
854 eina_stringshare_replace(&tc->font, font);
858 /* Tell all members of the text class to recalc */
859 members = eina_hash_find(_edje_text_class_member_hash, text_class);
864 ed = eina_list_data_get(members);
865 ed->dirty = EINA_TRUE;
866 ed->recalc_call = EINA_TRUE;
867 _edje_textblock_style_all_update(ed);
868 #ifdef EDJE_CALC_CACHE
869 ed->text_part_change = EINA_TRUE;
872 members = eina_list_next(members);
878 edje_text_class_del(const char *text_class)
883 if (!text_class) return;
885 tc = eina_hash_find(_edje_text_class_hash, text_class);
888 eina_hash_del(_edje_text_class_hash, text_class, tc);
889 eina_stringshare_del(tc->name);
890 eina_stringshare_del(tc->font);
893 members = eina_hash_find(_edje_text_class_member_hash, text_class);
898 ed = eina_list_data_get(members);
899 ed->dirty = EINA_TRUE;
900 _edje_textblock_style_all_update(ed);
901 #ifdef EDJE_CALC_CACHE
902 ed->text_part_change = EINA_TRUE;
905 members = eina_list_next(members);
910 edje_text_class_list(void)
912 Edje_List_Foreach_Data fdata;
914 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
915 eina_hash_foreach(_edje_text_class_member_hash,
916 _edje_text_class_list_foreach, &fdata);
921 _edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
923 Edje_List_Foreach_Data *fd;
926 fd->list = eina_list_append(fd->list, eina_stringshare_add(key));
931 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
935 Edje_Text_Class *tc = NULL;
938 ed = _edje_fetch(obj);
939 if ((!ed) || (!text_class)) return EINA_FALSE;
941 /* for each text_class in the edje */
942 EINA_LIST_FOREACH(ed->text_classes, l, tc)
944 if ((tc->name) && (!strcmp(tc->name, text_class)))
946 /* Match and the same, return */
947 if ((tc->size == size) &&
948 ((tc->font == font) ||
949 (tc->font && font && !strcmp(tc->font, font))))
952 /* Update new text class properties */
953 eina_stringshare_replace(&tc->font, font);
961 /* No matches, create a new text class */
962 tc = calloc(1, sizeof(Edje_Text_Class));
963 if (!tc) return EINA_FALSE;
964 tc->name = eina_stringshare_add(text_class);
970 tc->font = eina_stringshare_add(font);
972 /* Add to edje's text class list */
973 ed->text_classes = eina_list_append(ed->text_classes, tc);
976 for (i = 0; i < ed->table_parts_size; i++)
980 rp = ed->table_parts[i];
981 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
982 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
983 (rp->typedata.swallow)) &&
984 (rp->typedata.swallow->swallowed_object))
985 edje_object_text_class_set(rp->typedata.swallow->swallowed_object,
986 text_class, font, size);
989 ed->dirty = EINA_TRUE;
990 ed->recalc_call = EINA_TRUE;
991 #ifdef EDJE_CALC_CACHE
992 ed->text_part_change = EINA_TRUE;
994 _edje_textblock_style_all_update(ed);
1000 edje_object_part_exists(const Evas_Object *obj, const char *part)
1005 ed = _edje_fetch(obj);
1006 if ((!ed) || (!part)) return EINA_FALSE;
1007 rp = _edje_real_part_recursive_get(ed, part);
1008 if (!rp) return EINA_FALSE;
1012 EAPI const Evas_Object *
1013 edje_object_part_object_get(const Evas_Object *obj, const char *part)
1018 ed = _edje_fetch(obj);
1019 if ((!ed) || (!part)) return NULL;
1021 /* Need to recalc before providing the object. */
1022 _edje_recalc_do(ed);
1024 rp = _edje_real_part_recursive_get(ed, part);
1025 if (!rp) return NULL;
1030 edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h )
1035 ed = _edje_fetch(obj);
1036 if ((!ed) || (!part))
1045 /* Need to recalc before providing the object. */
1046 _edje_recalc_do(ed);
1048 rp = _edje_real_part_recursive_get(ed, part);
1065 edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
1069 ed = _edje_fetch(obj);
1071 ed->item_provider.func = func;
1072 ed->item_provider.data = data;
1075 /* FIXDOC: New Function */
1077 edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
1082 ed = _edje_fetch(obj);
1084 ed->text_change.func = func;
1085 ed->text_change.data = data;
1087 for (i = 0; i < ed->table_parts_size; i++)
1091 rp = ed->table_parts[i];
1092 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
1093 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
1094 (rp->typedata.swallow)) &&
1095 (rp->typedata.swallow->swallowed_object))
1096 edje_object_text_change_cb_set(rp->typedata.swallow->swallowed_object, func, data);
1101 _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1103 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1104 (!rp->typedata.text)) return EINA_TRUE;
1105 if ((!rp->typedata.text->text) && (!text))
1106 return EINA_TRUE; /* nothing to do, no error */
1107 if ((rp->typedata.text->text) && (text) &&
1108 (!strcmp(rp->typedata.text->text, text)))
1109 return EINA_TRUE; /* nothing to do, no error */
1110 if (rp->typedata.text->text)
1112 eina_stringshare_del(rp->typedata.text->text);
1113 rp->typedata.text->text = NULL;
1115 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1116 _edje_entry_text_markup_set(rp, text);
1118 if (text) rp->typedata.text->text = eina_stringshare_add(text);
1119 rp->edje->dirty = EINA_TRUE;
1120 rp->edje->recalc_call = EINA_TRUE;
1121 rp->edje->recalc_hints = EINA_TRUE;
1122 #ifdef EDJE_CALC_CACHE
1125 _edje_recalc(rp->edje);
1126 if (rp->edje->text_change.func)
1127 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1132 _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1134 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1135 (!rp->typedata.text)) return EINA_TRUE;
1136 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1137 _edje_entry_text_markup_append(rp, text);
1140 if (rp->typedata.text->text)
1143 int len_added = strlen(text);
1144 int len_old = strlen(rp->typedata.text->text);
1145 new = malloc(len_old + len_added + 1);
1146 memcpy(new, rp->typedata.text->text, len_old);
1147 memcpy(new + len_old, text, len_added);
1148 new[len_old + len_added] = '\0';
1149 eina_stringshare_replace(&rp->typedata.text->text, new);
1154 eina_stringshare_replace(&rp->typedata.text->text, text);
1157 rp->edje->dirty = EINA_TRUE;
1158 rp->edje->recalc_call = 1;
1159 #ifdef EDJE_CALC_CACHE
1162 _edje_recalc(rp->edje);
1163 if (rp->edje->text_change.func)
1164 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1169 edje_object_part_text_style_user_push(Evas_Object *obj, const char *part,
1174 Evas_Textblock_Style *ts;
1176 ed = _edje_fetch(obj);
1177 if ((!ed) || (!part) || (!style)) return;
1178 rp = _edje_real_part_recursive_get(ed, part);
1180 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1182 ts = evas_textblock_style_new();
1183 evas_textblock_style_set(ts, style);
1184 evas_object_textblock_style_user_push(rp->object, ts);
1185 evas_textblock_style_free(ts);
1186 ed->recalc_hints = EINA_TRUE;
1187 #ifdef EDJE_CALC_CACHE
1194 edje_object_part_text_style_user_pop(Evas_Object *obj, const char *part)
1199 ed = _edje_fetch(obj);
1200 if ((!ed) || (!part)) return;
1201 rp = _edje_real_part_recursive_get(ed, part);
1203 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1205 evas_object_textblock_style_user_pop(rp->object);
1206 ed->recalc_hints = EINA_TRUE;
1207 #ifdef EDJE_CALC_CACHE
1214 edje_object_part_text_style_user_peek(const Evas_Object *obj, const char *part)
1218 const Evas_Textblock_Style *ts;
1220 ed = _edje_fetch(obj);
1221 if ((!ed) || (!part)) return NULL;
1222 rp = _edje_real_part_recursive_get(ed, part);
1223 if (!rp) return NULL;
1224 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return NULL;
1226 ts = evas_object_textblock_style_user_peek(rp->object);
1228 return evas_textblock_style_get(ts);
1234 _edje_user_define_string(Edje *ed, const char *part, const char *raw_text)
1236 /* NOTE: This one is tricky, text is referenced in rp->typedata.text->text for the life of the
1237 rp. So on edje_object_file_set, we should first ref it, before destroying the old
1239 Edje_User_Defined *eud;
1242 EINA_LIST_FOREACH(ed->user_defined, l, eud)
1243 if (eud->type == EDJE_USER_STRING && !strcmp(eud->part, part))
1247 _edje_user_definition_free(eud);
1250 eud->u.string.text = raw_text;
1254 eud = _edje_user_definition_new(EDJE_USER_STRING, part, ed);
1256 eud->u.string.text = raw_text;
1260 edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
1266 ed = _edje_fetch(obj);
1267 if ((!ed) || (!part)) return EINA_FALSE;
1268 rp = _edje_real_part_recursive_get(ed, part);
1269 if (!rp) return EINA_FALSE;
1270 if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
1271 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE;
1272 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1273 (!rp->typedata.text)) return EINA_TRUE;
1274 r = _edje_object_part_text_raw_set(obj, rp, part, text);
1275 _edje_user_define_string(ed, part, rp->typedata.text->text);
1280 * @brief Return the text of the object part.
1282 * @param obj A valid Evas_Object handle
1283 * @param part The part name
1285 * @return The text string
1287 * This function returns the text associated to the object part.
1291 edje_object_part_text_get(const Evas_Object *obj, const char *part)
1296 ed = _edje_fetch(obj);
1297 if ((!ed) || (!part)) return NULL;
1299 /* Need to recalc before providing the object. */
1300 _edje_recalc_do(ed);
1302 rp = _edje_real_part_recursive_get(ed, part);
1303 if (!rp) return NULL;
1304 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1305 (!rp->typedata.text)) return NULL;
1306 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1307 return _edje_entry_text_get(rp);
1310 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1311 return rp->typedata.text->text;
1312 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1313 return evas_object_textblock_text_markup_get(rp->object);
1319 edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char *text)
1325 ed = _edje_fetch(obj);
1326 if ((!ed) || (!part)) return EINA_FALSE;
1327 rp = _edje_real_part_recursive_get(ed, part);
1328 if (!rp) return EINA_FALSE;
1329 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1330 (!rp->typedata.text)) return EINA_FALSE;
1331 if ((rp->part->type == EDJE_PART_TYPE_TEXT) && (text))
1334 char *esc_start = NULL, *esc_end = NULL;
1337 sbuf = eina_strbuf_new();
1342 if ((*p == 0) || (esc_end) || (esc_start))
1348 escape = evas_textblock_escape_string_range_get
1349 (esc_start, esc_end + 1);
1350 if (escape) eina_strbuf_append(sbuf, escape);
1351 esc_start = esc_end = NULL;
1355 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1356 eina_strbuf_append_length(sbuf, s, p - s);
1365 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1368 eina_strbuf_append_length(sbuf, s, p - s);
1381 ret = _edje_object_part_text_raw_set
1382 (obj, rp, part, eina_strbuf_string_get(sbuf));
1383 _edje_user_define_string(ed, part, rp->typedata.text->text);
1384 eina_strbuf_free(sbuf);
1387 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return EINA_FALSE;
1388 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1389 _edje_user_define_string(ed, part, rp->typedata.text->text);
1395 _edje_text_escape(const char *text)
1399 const char *text_end;
1402 if (!text) return NULL;
1404 txt = eina_strbuf_new();
1405 text_len = strlen(text);
1407 text_end = text + text_len;
1408 while (text < text_end)
1411 const char *escaped = evas_textblock_string_escape_get(text, &advance);
1414 eina_strbuf_append_char(txt, text[0]);
1418 eina_strbuf_append(txt, escaped);
1423 ret = eina_strbuf_string_steal(txt);
1424 eina_strbuf_free(txt);
1429 _edje_text_unescape(const char *text)
1433 const char *text_end, *last, *escape_start;
1436 if (!text) return NULL;
1438 txt = eina_strbuf_new();
1439 text_len = strlen(text);
1441 text_end = text + text_len;
1443 escape_start = NULL;
1444 for (; text < text_end; text++)
1458 len = text - escape_start;
1463 eina_strbuf_append_n(txt, str, len);
1465 escape_start = text;
1468 else if ((*text == ';') && (escape_start))
1471 const char *str = evas_textblock_escape_string_range_get(escape_start, text);
1478 len = text + 1 - escape_start;
1481 eina_strbuf_append_n(txt, str, len);
1483 escape_start = NULL;
1488 if (!last && escape_start)
1489 last = escape_start;
1491 if (last && (text > last))
1493 size_t len = text - last;
1494 eina_strbuf_append_n(txt, last, len);
1497 ret = eina_strbuf_string_steal(txt);
1498 eina_strbuf_free(txt);
1503 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
1507 Eina_Bool ret = EINA_FALSE;
1509 ed = _edje_fetch(obj);
1510 if ((!ed) || (!part)) return ret;
1511 rp = _edje_real_part_recursive_get(ed, part);
1512 if (!rp) return ret;
1513 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1514 (!rp->typedata.text)) return EINA_FALSE;
1515 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1516 ret = _edje_object_part_text_raw_set(obj, rp, part, text_to_escape);
1517 else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1519 char *text = _edje_text_escape(text_to_escape);
1521 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1524 _edje_user_define_string(ed, part, rp->typedata.text->text);
1529 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
1534 ed = _edje_fetch(obj);
1535 if ((!ed) || (!part)) return NULL;
1537 /* Need to recalc before providing the object. */
1538 _edje_recalc_do(ed);
1540 rp = _edje_real_part_recursive_get(ed, part);
1541 if (!rp) return NULL;
1542 if ((rp->type != EDJE_RP_TYPE_TEXT) ||
1543 (!rp->typedata.text)) return NULL;
1544 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1546 const char *t = _edje_entry_text_get(rp);
1547 return _edje_text_unescape(t);
1551 if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->typedata.text->text);
1552 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1554 const char *t = evas_object_textblock_text_markup_get(rp->object);
1555 return _edje_text_unescape(t);
1562 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
1567 ed = _edje_fetch(obj);
1568 if ((!ed) || (!part)) return NULL;
1569 rp = _edje_real_part_recursive_get(ed, part);
1570 if (!rp) return NULL;
1571 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1572 return _edje_entry_selection_get(rp);
1577 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
1582 ed = _edje_fetch(obj);
1583 if ((!ed) || (!part)) return;
1584 rp = _edje_real_part_recursive_get(ed, part);
1586 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1587 _edje_entry_select_none(rp);
1591 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
1596 ed = _edje_fetch(obj);
1597 if ((!ed) || (!part)) return;
1598 rp = _edje_real_part_recursive_get(ed, part);
1600 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1601 _edje_entry_select_all(rp);
1605 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
1610 ed = _edje_fetch(obj);
1611 if ((!ed) || (!part)) return;
1612 rp = _edje_real_part_recursive_get(ed, part);
1614 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1615 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
1616 _edje_entry_text_markup_insert(rp, text);
1617 rp->edje->dirty = EINA_TRUE;
1618 rp->edje->recalc_call = EINA_TRUE;
1619 rp->edje->recalc_hints = EINA_TRUE;
1620 #ifdef EDJE_CALC_CACHE
1623 _edje_recalc(rp->edje);
1624 if (rp->edje->text_change.func)
1625 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1629 edje_object_part_text_append(Evas_Object *obj, const char *part, const char *text)
1634 ed = _edje_fetch(obj);
1635 if ((!ed) || (!part)) return;
1636 rp = _edje_real_part_recursive_get(ed, part);
1638 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1639 _edje_object_part_text_raw_append(obj, rp, part, text);
1640 rp->edje->dirty = EINA_TRUE;
1641 rp->edje->recalc_call = EINA_TRUE;
1642 rp->edje->recalc_hints = EINA_TRUE;
1643 #ifdef EDJE_CALC_CACHE
1646 _edje_recalc(rp->edje);
1647 if (rp->edje->text_change.func)
1648 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1651 EAPI const Eina_List *
1652 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
1657 ed = _edje_fetch(obj);
1658 if ((!ed) || (!part)) return NULL;
1659 rp = _edje_real_part_recursive_get(ed, part);
1660 if (!rp) return NULL;
1661 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1662 return _edje_entry_anchors_list(rp);
1666 EAPI const Eina_List *
1667 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
1672 ed = _edje_fetch(obj);
1673 if ((!ed) || (!part)) return NULL;
1674 rp = _edje_real_part_recursive_get(ed, part);
1675 if (!rp) return NULL;
1676 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1677 return _edje_entry_anchor_geometry_get(rp, anchor);
1681 EAPI const Eina_List *
1682 edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part)
1687 ed = _edje_fetch(obj);
1688 if ((!ed) || (!part)) return NULL;
1689 rp = _edje_real_part_recursive_get(ed, part);
1690 if (!rp) return NULL;
1691 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1692 return _edje_entry_items_list(rp);
1697 edje_object_part_text_item_geometry_get(const Evas_Object *obj, const char *part, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
1702 ed = _edje_fetch(obj);
1703 if ((!ed) || (!part)) return EINA_FALSE;
1704 rp = _edje_real_part_recursive_get(ed, part);
1705 if (!rp) return EINA_FALSE;
1706 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1707 return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch);
1712 edje_object_part_text_copy_paste_disabled_set(const Evas_Object *obj, const char *part, Eina_Bool disabled)
1717 ed = _edje_fetch(obj);
1718 if ((!ed) || (!part)) return;
1719 rp = _edje_real_part_recursive_get(ed, (char *)part);
1721 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1722 _edje_entry_copy_paste_disabled_set(rp, disabled);
1727 edje_object_part_text_viewport_region_set(const Evas_Object *obj, const char *part, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
1732 ed = _edje_fetch(obj);
1733 if ((!ed) || (!part)) return;
1734 rp = _edje_real_part_recursive_get(ed, (char *)part);
1736 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1737 _edje_entry_viewport_region_set(rp, x, y, w, h);
1742 edje_object_part_text_layout_region_set(const Evas_Object *obj, const char *part, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
1747 ed = _edje_fetch(obj);
1748 if ((!ed) || (!part)) return;
1749 rp = _edje_real_part_recursive_get(ed, (char *)part);
1751 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1752 _edje_entry_layout_region_set(rp, x, y, w, h);
1757 edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
1762 ed = _edje_fetch(obj);
1767 if ((!ed) || (!part)) return;
1768 rp = _edje_real_part_recursive_get(ed, part);
1770 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1772 _edje_entry_cursor_geometry_get(rp, x, y, w, h);
1773 if (x) *x -= rp->edje->x;
1774 if (y) *y -= rp->edje->y;
1779 edje_object_part_text_user_insert(const Evas_Object *obj, const char *part, const char *text)
1784 ed = _edje_fetch(obj);
1785 if ((!ed) || (!part)) return;
1786 rp = _edje_real_part_recursive_get(ed, part);
1788 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1789 _edje_entry_user_insert(rp, text);
1793 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
1798 ed = _edje_fetch(obj);
1799 if ((!ed) || (!part)) return;
1800 rp = _edje_real_part_recursive_get(ed, part);
1802 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1803 _edje_entry_select_allow_set(rp, allow);
1807 edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
1812 ed = _edje_fetch(obj);
1813 if ((!ed) || (!part)) return;
1814 rp = _edje_real_part_recursive_get(ed, part);
1816 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1817 _edje_entry_select_abort(rp);
1821 edje_object_part_text_select_begin(const Evas_Object *obj, const char *part)
1826 ed = _edje_fetch(obj);
1827 if ((!ed) || (!part)) return;
1828 rp = _edje_real_part_recursive_get(ed, part);
1830 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1831 _edje_entry_select_begin(rp);
1835 edje_object_part_text_select_extend(const Evas_Object *obj, const char *part)
1840 ed = _edje_fetch(obj);
1841 if ((!ed) || (!part)) return;
1842 rp = _edje_real_part_recursive_get(ed, part);
1844 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1845 _edje_entry_select_extend(rp);
1849 edje_object_part_text_imf_context_get(const Evas_Object *obj, const char *part)
1854 ed = _edje_fetch(obj);
1855 if ((!ed) || (!part)) return NULL;
1857 rp = _edje_real_part_recursive_get(ed, (char *)part);
1858 if (!rp) return NULL;
1860 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1861 return _edje_entry_imf_context_get(rp);
1867 edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, Edje_Cursor cur)
1872 ed = _edje_fetch(obj);
1873 if ((!ed) || (!part)) return EINA_FALSE;
1874 rp = _edje_real_part_recursive_get(ed, part);
1875 if (!rp) return EINA_FALSE;
1876 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1878 return _edje_entry_cursor_next(rp, cur);
1884 edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, Edje_Cursor cur)
1889 ed = _edje_fetch(obj);
1890 if ((!ed) || (!part)) return EINA_FALSE;
1891 rp = _edje_real_part_recursive_get(ed, part);
1892 if (!rp) return EINA_FALSE;
1893 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1895 return _edje_entry_cursor_prev(rp, cur);
1901 edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, Edje_Cursor cur)
1906 ed = _edje_fetch(obj);
1907 if ((!ed) || (!part)) return EINA_FALSE;
1908 rp = _edje_real_part_recursive_get(ed, part);
1909 if (!rp) return EINA_FALSE;
1910 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1912 return _edje_entry_cursor_up(rp, cur);
1918 edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, Edje_Cursor cur)
1923 ed = _edje_fetch(obj);
1924 if ((!ed) || (!part)) return EINA_FALSE;
1925 rp = _edje_real_part_recursive_get(ed, part);
1926 if (!rp) return EINA_FALSE;
1927 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1929 return _edje_entry_cursor_down(rp, cur);
1935 edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1940 ed = _edje_fetch(obj);
1941 if ((!ed) || (!part)) return;
1942 rp = _edje_real_part_recursive_get(ed, part);
1944 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1946 _edje_entry_cursor_begin(rp, cur);
1951 edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1956 ed = _edje_fetch(obj);
1957 if ((!ed) || (!part)) return;
1958 rp = _edje_real_part_recursive_get(ed, part);
1960 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1962 _edje_entry_cursor_end(rp, cur);
1967 edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
1972 ed = _edje_fetch(obj);
1973 if ((!ed) || (!part)) return;
1974 rp = _edje_real_part_recursive_get(ed, part);
1976 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1978 _edje_entry_cursor_copy(rp, src, dst);
1983 edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1988 ed = _edje_fetch(obj);
1989 if ((!ed) || (!part)) return;
1990 rp = _edje_real_part_recursive_get(ed, part);
1992 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1994 _edje_entry_cursor_line_begin(rp, cur);
1999 edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
2004 ed = _edje_fetch(obj);
2005 if ((!ed) || (!part)) return;
2006 rp = _edje_real_part_recursive_get(ed, part);
2008 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2010 _edje_entry_cursor_line_end(rp, cur);
2015 edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char *part,
2016 Edje_Cursor cur, Evas_Coord x, Evas_Coord y)
2021 ed = _edje_fetch(obj);
2022 if ((!ed) || (!part)) return EINA_FALSE;
2023 rp = _edje_real_part_recursive_get(ed, part);
2024 if (!rp) return EINA_FALSE;
2025 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2027 return _edje_entry_cursor_coord_set(rp, cur, x, y);
2033 edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
2038 ed = _edje_fetch(obj);
2039 if ((!ed) || (!part)) return EINA_FALSE;
2040 rp = _edje_real_part_recursive_get(ed, part);
2041 if (!rp) return EINA_FALSE;
2042 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2044 return _edje_entry_cursor_is_format_get(rp, cur);
2050 edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
2055 ed = _edje_fetch(obj);
2056 if ((!ed) || (!part)) return 0;
2057 rp = _edje_real_part_recursive_get(ed, part);
2059 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2061 return _edje_entry_cursor_is_visible_format_get(rp, cur);
2067 edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
2072 ed = _edje_fetch(obj);
2073 if ((!ed) || (!part)) return NULL;
2074 rp = _edje_real_part_recursive_get(ed, part);
2075 if (!rp) return NULL;
2076 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2078 return _edje_entry_cursor_content_get(rp, cur);
2084 edje_object_part_text_cursor_pos_set(Evas_Object *obj, const char *part, Edje_Cursor cur, int pos)
2089 ed = _edje_fetch(obj);
2090 if ((!ed) || (!part)) return;
2091 rp = _edje_real_part_recursive_get(ed, part);
2093 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2095 _edje_entry_cursor_pos_set(rp, cur, pos);
2100 edje_object_part_text_cursor_pos_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
2105 ed = _edje_fetch(obj);
2106 if ((!ed) || (!part)) return 0;
2107 rp = _edje_real_part_recursive_get(ed, part);
2109 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2111 return _edje_entry_cursor_pos_get(rp, cur);
2117 edje_object_part_text_selection_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
2122 ed = _edje_fetch(obj);
2123 if ((!ed) || (!part)) return 0;
2124 rp = _edje_real_part_recursive_get(ed, part);
2127 return _edje_entry_selection_geometry_get(rp, x, y, w, h);
2131 edje_object_part_text_imf_context_reset(const Evas_Object *obj, const char *part)
2136 ed = _edje_fetch(obj);
2137 if ((!ed) || (!part)) return;
2138 rp = _edje_real_part_recursive_get(ed, part);
2140 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2142 _edje_entry_imf_context_reset(rp);
2147 edje_object_part_text_input_panel_layout_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Layout layout)
2152 ed = _edje_fetch(obj);
2153 if ((!ed) || (!part)) return;
2154 rp = _edje_real_part_recursive_get(ed, part);
2156 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2158 _edje_entry_input_panel_layout_set(rp, layout);
2162 EAPI Edje_Input_Panel_Layout
2163 edje_object_part_text_input_panel_layout_get(const Evas_Object *obj, const char *part)
2168 ed = _edje_fetch(obj);
2169 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2170 rp = _edje_real_part_recursive_get(ed, part);
2171 if (!rp) return EINA_FALSE;
2172 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2174 return _edje_entry_input_panel_layout_get(rp);
2176 return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2180 edje_object_part_text_autocapital_type_set(Evas_Object *obj, const char *part, Edje_Text_Autocapital_Type autocapital_type)
2185 ed = _edje_fetch(obj);
2186 if ((!ed) || (!part)) return;
2187 rp = _edje_real_part_recursive_get(ed, part);
2189 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2191 _edje_entry_autocapital_type_set(rp, autocapital_type);
2195 EAPI Edje_Text_Autocapital_Type
2196 edje_object_part_text_autocapital_type_get(const Evas_Object *obj, const char *part)
2201 ed = _edje_fetch(obj);
2202 if ((!ed) || (!part)) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2203 rp = _edje_real_part_recursive_get(ed, part);
2204 if (!rp) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2205 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2207 return _edje_entry_autocapital_type_get(rp);
2209 return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2213 edje_object_part_text_prediction_allow_set(Evas_Object *obj, const char *part, Eina_Bool prediction)
2218 ed = _edje_fetch(obj);
2219 if ((!ed) || (!part)) return;
2220 rp = _edje_real_part_recursive_get(ed, part);
2222 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2224 _edje_entry_prediction_allow_set(rp, prediction);
2229 edje_object_part_text_prediction_allow_get(const Evas_Object *obj, const char *part)
2234 ed = _edje_fetch(obj);
2235 if ((!ed) || (!part)) return EINA_FALSE;
2236 rp = _edje_real_part_recursive_get(ed, part);
2237 if (!rp) return EINA_FALSE;
2238 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2240 return _edje_entry_prediction_allow_get(rp);
2246 edje_object_part_text_input_panel_enabled_set(Evas_Object *obj, const char *part, Eina_Bool enabled)
2251 ed = _edje_fetch(obj);
2252 if ((!ed) || (!part)) return;
2253 rp = _edje_real_part_recursive_get(ed, part);
2255 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2257 _edje_entry_input_panel_enabled_set(rp, enabled);
2262 edje_object_part_text_input_panel_enabled_get(const Evas_Object *obj, const char *part)
2267 ed = _edje_fetch(obj);
2268 if ((!ed) || (!part)) return EINA_FALSE;
2269 rp = _edje_real_part_recursive_get(ed, part);
2270 if (!rp) return EINA_FALSE;
2271 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2273 return _edje_entry_input_panel_enabled_get(rp);
2279 edje_object_part_text_input_panel_show(const Evas_Object *obj, const char *part)
2284 ed = _edje_fetch(obj);
2285 if ((!ed) || (!part)) return;
2286 rp = _edje_real_part_recursive_get(ed, part);
2288 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2289 _edje_entry_input_panel_show(rp);
2293 edje_object_part_text_input_panel_hide(const Evas_Object *obj, const char *part)
2298 ed = _edje_fetch(obj);
2299 if ((!ed) || (!part)) return;
2300 rp = _edje_real_part_recursive_get(ed, part);
2302 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2303 _edje_entry_input_panel_hide(rp);
2307 edje_object_part_text_input_panel_language_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Lang lang)
2312 ed = _edje_fetch(obj);
2313 if ((!ed) || (!part)) return;
2314 rp = _edje_real_part_recursive_get(ed, part);
2316 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2318 _edje_entry_input_panel_language_set(rp, lang);
2322 EAPI Edje_Input_Panel_Lang
2323 edje_object_part_text_input_panel_language_get(const Evas_Object *obj, const char *part)
2328 ed = _edje_fetch(obj);
2329 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2330 rp = _edje_real_part_recursive_get(ed, part);
2331 if (!rp) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2332 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2334 return _edje_entry_input_panel_language_get(rp);
2336 return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2340 edje_object_part_text_input_panel_imdata_set(Evas_Object *obj, const char *part, const void *data, int len)
2345 ed = _edje_fetch(obj);
2346 if ((!ed) || (!part)) return;
2347 rp = _edje_real_part_recursive_get(ed, part);
2349 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2351 _edje_entry_input_panel_imdata_set(rp, data, len);
2356 edje_object_part_text_input_panel_imdata_get(const Evas_Object *obj, const char *part, void *data, int *len)
2361 ed = _edje_fetch(obj);
2362 if ((!ed) || (!part)) return;
2363 rp = _edje_real_part_recursive_get(ed, part);
2365 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2367 _edje_entry_input_panel_imdata_get(rp, data, len);
2372 edje_object_part_text_input_panel_return_key_type_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Return_Key_Type return_key_type)
2377 ed = _edje_fetch(obj);
2378 if ((!ed) || (!part)) return;
2379 rp = _edje_real_part_recursive_get(ed, part);
2381 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2383 _edje_entry_input_panel_return_key_type_set(rp, return_key_type);
2387 EAPI Edje_Input_Panel_Return_Key_Type
2388 edje_object_part_text_input_panel_return_key_type_get(const Evas_Object *obj, const char *part)
2393 ed = _edje_fetch(obj);
2394 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2395 rp = _edje_real_part_recursive_get(ed, part);
2396 if (!rp) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2397 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2399 return _edje_entry_input_panel_return_key_type_get(rp);
2401 return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2405 edje_object_part_text_input_panel_return_key_disabled_set(Evas_Object *obj, const char *part, Eina_Bool disabled)
2410 ed = _edje_fetch(obj);
2411 if ((!ed) || (!part)) return;
2412 rp = _edje_real_part_recursive_get(ed, part);
2414 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2416 _edje_entry_input_panel_return_key_disabled_set(rp, disabled);
2421 edje_object_part_text_input_panel_return_key_disabled_get(const Evas_Object *obj, const char *part)
2426 ed = _edje_fetch(obj);
2427 if ((!ed) || (!part)) return EINA_FALSE;
2428 rp = _edje_real_part_recursive_get(ed, part);
2429 if (!rp) return EINA_FALSE;
2430 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2432 return _edje_entry_input_panel_return_key_disabled_get(rp);
2438 edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2441 Edje_Text_Insert_Filter_Callback *cb;
2443 ed = _edje_fetch(obj);
2444 if ((!ed) || (!part)) return;
2445 cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
2446 cb->part = eina_stringshare_add(part);
2448 cb->data = (void *)data;
2449 ed->text_insert_filter_callbacks =
2450 eina_list_append(ed->text_insert_filter_callbacks, cb);
2454 edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
2457 Edje_Text_Insert_Filter_Callback *cb;
2460 ed = _edje_fetch(obj);
2461 if ((!ed) || (!part)) return NULL;
2462 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2464 if ((!strcmp(cb->part, part)) && (cb->func == func))
2466 void *data = cb->data;
2467 ed->text_insert_filter_callbacks =
2468 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2469 eina_stringshare_del(cb->part);
2478 edje_object_text_insert_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2481 Edje_Text_Insert_Filter_Callback *cb;
2484 ed = _edje_fetch(obj);
2485 if ((!ed) || (!part)) return NULL;
2486 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2488 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2491 void *tmp = cb->data;
2492 ed->text_insert_filter_callbacks =
2493 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2494 eina_stringshare_del(cb->part);
2503 edje_object_text_markup_filter_callback_add(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2506 Edje_Markup_Filter_Callback *cb;
2508 ed = _edje_fetch(obj);
2509 if ((!ed) || (!part)) return;
2510 cb = calloc(1, sizeof(Edje_Markup_Filter_Callback));
2511 cb->part = eina_stringshare_add(part);
2513 cb->data = (void *)data;
2514 ed->markup_filter_callbacks =
2515 eina_list_append(ed->markup_filter_callbacks, cb);
2519 edje_object_text_markup_filter_callback_del(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func)
2522 Edje_Markup_Filter_Callback *cb;
2525 ed = _edje_fetch(obj);
2526 if ((!ed) || (!part)) return NULL;
2527 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2529 if ((!strcmp(cb->part, part)) && (cb->func == func))
2531 void *data = cb->data;
2532 ed->markup_filter_callbacks =
2533 eina_list_remove_list(ed->markup_filter_callbacks, l);
2534 eina_stringshare_del(cb->part);
2543 edje_object_text_markup_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2546 Edje_Markup_Filter_Callback *cb;
2549 ed = _edje_fetch(obj);
2550 if ((!ed) || (!part)) return NULL;
2551 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2553 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2556 void *tmp = cb->data;
2557 ed->markup_filter_callbacks =
2558 eina_list_remove_list(ed->markup_filter_callbacks, l);
2559 eina_stringshare_del(cb->part);
2568 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
2572 Edje_User_Defined *eud = NULL;
2574 ed = _edje_fetch(obj);
2575 if ((!ed) || (!part)) return EINA_FALSE;
2577 /* Need to recalc before providing the object. */
2578 // XXX: I guess this is not required, removing for testing purposes
2579 // XXX: uncomment if you see glitches in e17 or others.
2580 // XXX: by Gustavo, January 21th 2009.
2581 // XXX: I got a backtrace with over 30000 calls without this,
2582 // XXX: only with 32px shelves. The problem is probably somewhere else,
2583 // XXX: but until it's found, leave this here.
2584 // XXX: by Sachiel, January 21th 2009, 19:30 UTC
2585 _edje_recalc_do(ed);
2587 rp = evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2590 /* The object is already swallowed somewhere, unswallow it first */
2591 edje_object_part_unswallow(rp->edje->obj, obj_swallow);
2594 rp = _edje_real_part_recursive_get(ed, part);
2597 DBG("cannot swallow part %s: part not exist!", part);
2600 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2602 ERR("cannot swallow part %s: not swallow type!", rp->part->name);
2605 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
2606 (!rp->typedata.swallow)) return EINA_FALSE;
2607 _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE);
2609 if (rp->typedata.swallow->swallowed_object)
2613 eud = _edje_user_definition_new(EDJE_USER_SWALLOW, part, ed);
2614 evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
2616 else ed->user_defined = eina_list_append(ed->user_defined, eud);
2620 eud->u.swallow.child = obj_swallow;
2628 _recalc_extern_parent(Evas_Object *obj)
2630 Evas_Object *parent;
2633 parent = evas_object_smart_parent_get(obj);
2634 if (!(ed = _edje_fetch(parent))) return;
2636 ed->dirty = EINA_TRUE;
2637 ed->recalc_call = EINA_TRUE; // ZZZ: ???
2642 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
2646 evas_object_size_hint_min_set(obj, minw, minh);
2647 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2650 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
2651 (!rp->typedata.swallow)) return;
2652 rp->typedata.swallow->swallow_params.min.w = minw;
2653 rp->typedata.swallow->swallow_params.min.h = minh;
2655 _recalc_extern_parent(obj);
2660 edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
2664 evas_object_size_hint_max_set(obj, maxw, maxh);
2665 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2668 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
2669 (!rp->typedata.swallow)) return;
2670 rp->typedata.swallow->swallow_params.max.w = maxw;
2671 rp->typedata.swallow->swallow_params.max.h = maxh;
2673 _recalc_extern_parent(obj);
2678 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
2681 Evas_Aspect_Control asp;
2683 asp = EVAS_ASPECT_CONTROL_NONE;
2686 case EDJE_ASPECT_CONTROL_NONE: asp = EVAS_ASPECT_CONTROL_NONE; break;
2687 case EDJE_ASPECT_CONTROL_NEITHER: asp = EVAS_ASPECT_CONTROL_NEITHER; break;
2688 case EDJE_ASPECT_CONTROL_HORIZONTAL: asp = EVAS_ASPECT_CONTROL_HORIZONTAL; break;
2689 case EDJE_ASPECT_CONTROL_VERTICAL: asp = EVAS_ASPECT_CONTROL_VERTICAL; break;
2690 case EDJE_ASPECT_CONTROL_BOTH: asp = EVAS_ASPECT_CONTROL_BOTH; break;
2695 evas_object_size_hint_aspect_set(obj, asp, aw, ah);
2696 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2699 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
2700 (!rp->typedata.swallow)) return;
2701 rp->typedata.swallow->swallow_params.aspect.mode = aspect;
2702 rp->typedata.swallow->swallow_params.aspect.w = aw;
2703 rp->typedata.swallow->swallow_params.aspect.h = ah;
2704 _recalc_extern_parent(obj);
2708 struct edje_box_layout_builtin {
2710 Evas_Object_Box_Layout cb;
2713 static Evas_Object_Box_Layout
2714 _edje_box_layout_builtin_find(const char *name)
2716 const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
2717 {"horizontal", evas_object_box_layout_horizontal},
2718 {"horizontal_flow", evas_object_box_layout_flow_horizontal},
2719 {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
2720 {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
2721 {"stack", evas_object_box_layout_stack},
2722 {"vertical", evas_object_box_layout_vertical},
2723 {"vertical_flow", evas_object_box_layout_flow_vertical},
2724 {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
2725 {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
2728 const struct edje_box_layout_builtin *base;
2733 base = _edje_box_layout_builtin + 0;
2736 base = _edje_box_layout_builtin + 4;
2739 base = _edje_box_layout_builtin + 5;
2745 for (; (base->name) && (base->name[0] == name[0]); base++)
2746 if (strcmp(base->name, name) == 0)
2752 static Eina_Rbtree_Direction
2753 _edje_box_layout_external_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right, __UNUSED__ void *data)
2755 Edje_Box_Layout *l = (Edje_Box_Layout *)left;
2756 Edje_Box_Layout *r = (Edje_Box_Layout *)right;
2758 if (strcmp(l->name, r->name) < 0)
2759 return EINA_RBTREE_RIGHT;
2761 return EINA_RBTREE_LEFT;
2765 _edje_box_layout_external_find_cmp(const Eina_Rbtree *node, const void *key, __UNUSED__ int length, __UNUSED__ void *data)
2767 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2768 return strcmp(key, l->name);
2771 static Edje_Box_Layout *
2772 _edje_box_layout_external_find(const char *name)
2774 return (Edje_Box_Layout *)eina_rbtree_inline_lookup
2775 (_edje_box_layout_registry, name, 0, _edje_box_layout_external_find_cmp,
2780 _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void (**free_data)(void *data))
2782 const Edje_Box_Layout *l;
2784 if (!name) return EINA_FALSE;
2786 *cb = _edje_box_layout_builtin_find(name);
2794 l = _edje_box_layout_external_find(name);
2795 if (!l) return EINA_FALSE;
2798 *free_data = l->layout_data_free;
2799 if (l->layout_data_get)
2800 *data = l->layout_data_get(l->data);
2808 _edje_box_layout_external_free(Eina_Rbtree *node, __UNUSED__ void *data)
2810 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2812 if (l->data && l->free_data)
2813 l->free_data(l->data);
2817 static Edje_Box_Layout *
2818 _edje_box_layout_external_new(const char *name, Evas_Object_Box_Layout func, void *(*layout_data_get)(void *), void (*layout_data_free)(void *), void (*free_data)(void *), void *data)
2823 name_len = strlen(name) + 1;
2824 l = malloc(sizeof(Edje_Box_Layout) + name_len);
2825 if (!l) return NULL;
2828 l->layout_data_get = layout_data_get;
2829 l->layout_data_free = layout_data_free;
2830 l->free_data = free_data;
2833 memcpy(l->name, name, name_len);
2839 edje_box_layout_register(const char *name, Evas_Object_Box_Layout func, void *(*layout_data_get)(void *), void (*layout_data_free)(void *), void (*free_data)(void *), void *data)
2845 if (_edje_box_layout_builtin_find(name))
2847 ERR("Cannot register layout '%s': would override builtin!",
2850 if (data && free_data) free_data(data);
2854 l = _edje_box_layout_external_find(name);
2859 if (data && free_data) free_data(data);
2863 l = _edje_box_layout_external_new
2864 (name, func, layout_data_get, layout_data_free, free_data, data);
2868 _edje_box_layout_registry = eina_rbtree_inline_insert
2869 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2870 _edje_box_layout_external_node_cmp, NULL);
2876 if (l->data && l->free_data) l->free_data(l->data);
2879 l->layout_data_get = layout_data_get;
2880 l->layout_data_free = layout_data_free;
2881 l->free_data = free_data;
2886 if (data && free_data) free_data(data);
2888 _edje_box_layout_registry = eina_rbtree_inline_remove
2889 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2890 _edje_box_layout_external_node_cmp, NULL);
2891 _edje_box_layout_external_free((Eina_Rbtree *)l, NULL);
2897 edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
2901 if (!obj_swallow) return;
2903 rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2906 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2908 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
2912 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
2913 (!rp->typedata.swallow)) return;
2915 if (rp->typedata.swallow->swallowed_object == obj_swallow)
2917 Edje_User_Defined *eud;
2924 ed = _edje_fetch(obj);
2927 ERR("edje_object_part_unswallow called on a non Edje object ('%s').",
2928 evas_object_type_get(obj));
2932 EINA_LIST_FOREACH(ed->user_defined, l, eud)
2933 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj_swallow)
2935 _edje_user_definition_free(eud);
2941 _edje_real_part_swallow_clear(rp);
2942 rp->typedata.swallow->swallowed_object = NULL;
2943 rp->typedata.swallow->swallow_params.min.w = 0;
2944 rp->typedata.swallow->swallow_params.min.h = 0;
2945 rp->typedata.swallow->swallow_params.max.w = 0;
2946 rp->typedata.swallow->swallow_params.max.h = 0;
2947 rp->edje->dirty = EINA_TRUE;
2948 rp->edje->recalc_call = EINA_TRUE;
2949 #ifdef EDJE_CALC_CACHE
2952 _edje_recalc_do(rp->edje);
2958 edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
2963 ed = _edje_fetch(obj);
2964 if ((!ed) || (!part)) return NULL;
2966 /* Need to recalc before providing the object. */
2967 _edje_recalc_do(ed);
2969 rp = _edje_real_part_recursive_get(ed, part);
2970 if (!rp) return NULL;
2971 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
2972 (!rp->typedata.swallow)) return NULL;
2973 return rp->typedata.swallow->swallowed_object;
2977 edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2981 ed = _edje_fetch(obj);
2982 if ((!ed) || (!ed->collection))
2984 if (minw) *minw = 0;
2985 if (minh) *minh = 0;
2988 if (minw) *minw = ed->collection->prop.min.w;
2989 if (minh) *minh = ed->collection->prop.min.h;
2993 edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
2997 ed = _edje_fetch(obj);
2998 if ((!ed) || (!ed->collection))
3000 if (maxw) *maxw = 0;
3001 if (maxh) *maxh = 0;
3005 /* Need to recalc before providing the object. */
3006 _edje_recalc_do(ed);
3008 if (ed->collection->prop.max.w == 0)
3010 /* XXX TODO: convert maxw to 0, fix things that break. */
3011 if (maxw) *maxw = EDJE_INF_MAX_W;
3015 if (maxw) *maxw = ed->collection->prop.max.w;
3017 if (ed->collection->prop.max.h == 0)
3019 /* XXX TODO: convert maxh to 0, fix things that break. */
3020 if (maxh) *maxh = EDJE_INF_MAX_H;
3024 if (maxh) *maxh = ed->collection->prop.max.h;
3029 edje_object_calc_force(Evas_Object *obj)
3034 ed = _edje_fetch(obj);
3036 ed->dirty = EINA_TRUE;
3037 #ifdef EDJE_CALC_CACHE
3038 ed->all_part_change = EINA_TRUE;
3041 pf2 = _edje_freeze_val;
3044 _edje_freeze_val = 0;
3047 _edje_recalc_do(ed);
3050 _edje_freeze_val = pf2;
3054 edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
3056 edje_object_size_min_restricted_calc(obj, minw, minh, 0, 0);
3060 edje_object_parts_extends_calc(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
3063 Evas_Coord xx1 = INT_MAX, yy1 = INT_MAX;
3064 Evas_Coord xx2 = 0, yy2 = 0;
3067 ed = _edje_fetch(obj);
3077 ed->calc_only = EINA_TRUE;
3079 /* Need to recalc before providing the object. */
3080 ed->dirty = EINA_TRUE;
3081 _edje_recalc_do(ed);
3083 for (i = 0; i < ed->table_parts_size; i++)
3086 Evas_Coord rpx1, rpy1;
3087 Evas_Coord rpx2, rpy2;
3089 rp = ed->table_parts[i];
3093 rpx2 = rpx1 + rp->w;
3094 rpy2 = rpy1 + rp->h;
3096 if (xx1 > rpx1) xx1 = rpx1;
3097 if (yy1 > rpy1) yy1 = rpy1;
3098 if (xx2 < rpx2) xx2 = rpx2;
3099 if (yy2 < rpy2) yy2 = rpy2;
3102 ed->calc_only = EINA_FALSE;
3106 if (w) *w = xx2 - xx1;
3107 if (h) *h = yy2 - yy1;
3113 edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh, Evas_Coord restrictedw, Evas_Coord restrictedh)
3120 Edje_Real_Part *pep = NULL;
3121 Eina_Bool has_non_fixed_tb = EINA_FALSE;
3123 ed = _edje_fetch(obj);
3124 if ((!ed) || (!ed->collection))
3126 if (minw) *minw = restrictedw;
3127 if (minh) *minh = restrictedh;
3131 ed->calc_only = EINA_TRUE;
3136 ed->w = restrictedw;
3137 ed->h = restrictedh;
3147 ed->dirty = EINA_TRUE;
3148 #ifdef EDJE_CALC_CACHE
3149 ed->all_part_change = EINA_TRUE;
3151 _edje_recalc_do(ed);
3158 has_non_fixed_tb = EINA_FALSE;
3159 for (i = 0; i < ed->table_parts_size; i++)
3165 ep = ed->table_parts[i];
3166 w = ep->w - ep->req.w;
3167 h = ep->h - ep->req.h;
3169 if (ep->chosen_description)
3171 if (!ep->chosen_description->fixed.w)
3173 if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
3176 evas_object_textblock_size_formatted_get(ep->object,
3183 has_non_fixed_tb = EINA_TRUE;
3193 if (!ep->chosen_description->fixed.h)
3195 if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
3196 (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
3207 if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
3209 has_non_fixed_tb = EINA_TRUE;
3217 if (ed->w < restrictedw) ed->w = restrictedw;
3222 if (ed->h < restrictedh) ed->h = restrictedh;
3224 if ((ed->w > 4000) || (ed->h > 4000))
3226 /* Only print it if we have a non-fixed textblock.
3227 * We should possibly avoid all of this if in this case, but in
3228 * the meanwhile, just doing this. */
3229 if (!has_non_fixed_tb)
3232 ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
3233 ed->path, ed->group, pep->part->name);
3235 ERR("file %s, group %s overflowed 4000x4000 with minimum size of %dx%d. Continuing discarding faulty parts.",
3236 ed->path, ed->group, ed->w, ed->h);
3250 if (minw) *minw = ed->min.w;
3251 if (minh) *minh = ed->min.h;
3255 ed->dirty = EINA_TRUE;
3256 #ifdef EDJE_CALC_CACHE
3257 ed->all_part_change = EINA_TRUE;
3260 ed->calc_only = EINA_FALSE;
3263 /* FIXME: Correctly return other states */
3265 edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val_ret)
3270 ed = _edje_fetch(obj);
3271 if ((!ed) || (!part))
3273 if (val_ret) *val_ret = 0;
3277 /* Need to recalc before providing the object. */
3278 _edje_recalc_do(ed);
3280 rp = _edje_real_part_recursive_get(ed, part);
3283 if (val_ret) *val_ret = 0;
3284 INF("part not found");
3287 if (rp->chosen_description)
3289 if (val_ret) *val_ret = rp->chosen_description->state.value;
3290 if (rp->chosen_description->state.name)
3291 return rp->chosen_description->state.name;
3296 if (rp->param1.description)
3298 if (val_ret) *val_ret = rp->param1.description->state.value;
3299 if (rp->param1.description->state.name)
3300 return rp->param1.description->state.name;
3304 if (val_ret) *val_ret = 0;
3309 edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
3314 ed = _edje_fetch(obj);
3315 if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
3317 /* Need to recalc before providing the object. */
3318 _edje_recalc_do(ed);
3320 rp = _edje_real_part_recursive_get(ed, part);
3321 if (!rp) return EDJE_DRAG_DIR_NONE;
3322 if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
3323 else if (rp->part->dragable.x) return EDJE_DRAG_DIR_X;
3324 else if (rp->part->dragable.y) return EDJE_DRAG_DIR_Y;
3325 return EDJE_DRAG_DIR_NONE;
3329 edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
3333 Edje_User_Defined *eud;
3336 ed = _edje_fetch(obj);
3337 if ((!ed) || (!part)) return EINA_FALSE;
3338 rp = _edje_real_part_recursive_get(ed, part);
3339 if (!rp) return EINA_FALSE;
3340 if (!rp->drag) return EINA_FALSE;
3341 if (rp->drag->down.count > 0) return EINA_FALSE;
3343 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3344 if (eud->type == EDJE_USER_DRAG_VALUE && !strcmp(part, eud->part))
3346 eud->u.drag_position.x = dx;
3347 eud->u.drag_position.y = dy;
3352 eud = _edje_user_definition_new(EDJE_USER_DRAG_VALUE, part, ed);
3355 eud->u.drag_position.x = dx;
3356 eud->u.drag_position.y = dy;
3360 if (rp->part->dragable.confine_id != -1)
3362 dx = CLAMP(dx, 0.0, 1.0);
3363 dy = CLAMP(dy, 0.0, 1.0);
3365 if (rp->part->dragable.x < 0) dx = 1.0 - dx;
3366 if (rp->part->dragable.y < 0) dy = 1.0 - dy;
3367 if ((rp->drag->val.x == FROM_DOUBLE(dx)) && (rp->drag->val.y == FROM_DOUBLE(dy))) return EINA_TRUE;
3368 rp->drag->val.x = FROM_DOUBLE(dx);
3369 rp->drag->val.y = FROM_DOUBLE(dy);
3370 #ifdef EDJE_CALC_CACHE
3373 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3374 _edje_emit(rp->edje, "drag,set", rp->part->name);
3378 /* FIXME: Should this be x and y instead of dx/dy? */
3380 edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3386 ed = _edje_fetch(obj);
3387 if ((!ed) || (!part))
3394 /* Need to recalc before providing the object. */
3395 _edje_recalc_do(ed);
3397 rp = _edje_real_part_recursive_get(ed, part);
3398 if (!rp || !rp->drag)
3404 ddx = TO_DOUBLE(rp->drag->val.x);
3405 ddy = TO_DOUBLE(rp->drag->val.y);
3406 if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
3407 if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
3414 edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
3418 Edje_User_Defined *eud;
3421 ed = _edje_fetch(obj);
3422 if ((!ed) || (!part)) return EINA_FALSE;
3423 rp = _edje_real_part_recursive_get(ed, part);
3424 if (!rp) return EINA_FALSE;
3425 if (!rp->drag) return EINA_FALSE;
3427 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3428 if (eud->type == EDJE_USER_DRAG_SIZE && !strcmp(part, eud->part))
3430 eud->u.drag_size.w = dw;
3431 eud->u.drag_size.h = dh;
3436 eud = _edje_user_definition_new(EDJE_USER_DRAG_SIZE, part, ed);
3439 eud->u.drag_size.w = dw;
3440 eud->u.drag_size.h = dh;
3444 if (dw < 0.0) dw = 0.0;
3445 else if (dw > 1.0) dw = 1.0;
3446 if (dh < 0.0) dh = 0.0;
3447 else if (dh > 1.0) dh = 1.0;
3448 if ((rp->drag->size.x == FROM_DOUBLE(dw)) && (rp->drag->size.y == FROM_DOUBLE(dh))) return EINA_TRUE;
3449 rp->drag->size.x = FROM_DOUBLE(dw);
3450 rp->drag->size.y = FROM_DOUBLE(dh);
3451 rp->edje->dirty = EINA_TRUE;
3452 rp->edje->recalc_call = EINA_TRUE;
3453 #ifdef EDJE_CALC_CACHE
3456 _edje_recalc(rp->edje);
3461 edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double *dw, double *dh)
3466 ed = _edje_fetch(obj);
3467 if ((!ed) || (!part))
3474 /* Need to recalc before providing the object. */
3475 _edje_recalc_do(ed);
3477 rp = _edje_real_part_recursive_get(ed, part);
3478 if (!rp || !rp->drag)
3484 if (dw) *dw = TO_DOUBLE(rp->drag->size.x);
3485 if (dh) *dh = TO_DOUBLE(rp->drag->size.y);
3490 edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
3494 Edje_User_Defined *eud;
3497 ed = _edje_fetch(obj);
3498 if ((!ed) || (!part)) return EINA_FALSE;
3499 rp = _edje_real_part_recursive_get(ed, part);
3500 if (!rp) return EINA_FALSE;
3501 if (!rp->drag) return EINA_FALSE;
3503 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3504 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3506 eud->u.drag_position.x = dx;
3507 eud->u.drag_position.y = dy;
3512 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3515 eud->u.drag_position.x = dx;
3516 eud->u.drag_position.y = dy;
3520 if (dx < 0.0) dx = 0.0;
3521 else if (dx > 1.0) dx = 1.0;
3522 if (dy < 0.0) dy = 0.0;
3523 else if (dy > 1.0) dy = 1.0;
3524 rp->drag->step.x = FROM_DOUBLE(dx);
3525 rp->drag->step.y = FROM_DOUBLE(dy);
3526 #ifdef EDJE_CALC_CACHE
3533 edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3538 ed = _edje_fetch(obj);
3539 if ((!ed) || (!part))
3546 /* Need to recalc before providing the object. */
3547 _edje_recalc_do(ed);
3549 rp = _edje_real_part_recursive_get(ed, part);
3550 if (!rp || !rp->drag)
3556 if (dx) *dx = TO_DOUBLE(rp->drag->step.x);
3557 if (dy) *dy = TO_DOUBLE(rp->drag->step.y);
3562 edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
3566 Edje_User_Defined *eud;
3569 ed = _edje_fetch(obj);
3570 if ((!ed) || (!part)) return EINA_FALSE;
3571 rp = _edje_real_part_recursive_get(ed, part);
3572 if (!rp) return EINA_FALSE;
3573 if (!rp->drag) return EINA_FALSE;
3575 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3576 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3578 eud->u.drag_position.x = dx;
3579 eud->u.drag_position.y = dy;
3584 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3587 eud->u.drag_position.x = dx;
3588 eud->u.drag_position.y = dy;
3592 if (dx < 0.0) dx = 0.0;
3593 else if (dx > 1.0) dx = 1.0;
3594 if (dy < 0.0) dy = 0.0;
3595 else if (dy > 1.0) dy = 1.0;
3596 rp->drag->page.x = FROM_DOUBLE(dx);
3597 rp->drag->page.y = FROM_DOUBLE(dy);
3598 #ifdef EDJE_CALC_CACHE
3605 edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3610 ed = _edje_fetch(obj);
3611 if ((!ed) || (!part))
3618 /* Need to recalc before providing the object. */
3619 _edje_recalc_do(ed);
3621 rp = _edje_real_part_recursive_get(ed, part);
3622 if (!rp || !rp->drag)
3628 if (dx) *dx = TO_DOUBLE(rp->drag->page.x);
3629 if (dy) *dy = TO_DOUBLE(rp->drag->page.y);
3634 edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double dy)
3639 Edje_User_Defined *eud;
3642 ed = _edje_fetch(obj);
3643 if ((!ed) || (!part)) return EINA_FALSE;
3644 rp = _edje_real_part_recursive_get(ed, part);
3645 if (!rp) return EINA_FALSE;
3646 if (!rp->drag) return EINA_FALSE;
3647 if (rp->drag->down.count > 0) return EINA_FALSE;
3649 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3650 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3652 eud->u.drag_position.x = dx;
3653 eud->u.drag_position.y = dy;
3658 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3661 eud->u.drag_position.x = dx;
3662 eud->u.drag_position.y = dy;
3666 px = rp->drag->val.x;
3667 py = rp->drag->val.y;
3668 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx),
3669 MUL(rp->drag->step.x, rp->part->dragable.x)));
3670 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy),
3671 MUL(rp->drag->step.y, rp->part->dragable.y)));
3672 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3673 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3674 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3675 #ifdef EDJE_CALC_CACHE
3678 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3679 _edje_emit(rp->edje, "drag,step", rp->part->name);
3684 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
3689 Edje_User_Defined *eud;
3692 ed = _edje_fetch(obj);
3693 if ((!ed) || (!part)) return EINA_FALSE;
3694 rp = _edje_real_part_recursive_get(ed, part);
3695 if (!rp) return EINA_FALSE;
3696 if (!rp->drag) return EINA_FALSE;
3697 if (rp->drag->down.count > 0) return EINA_FALSE;
3699 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3700 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3702 eud->u.drag_position.x = dx;
3703 eud->u.drag_position.y = dy;
3708 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3711 eud->u.drag_position.x = dx;
3712 eud->u.drag_position.y = dy;
3716 px = rp->drag->val.x;
3717 py = rp->drag->val.y;
3718 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x)));
3719 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy), MUL(rp->drag->page.y, rp->part->dragable.y)));
3720 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3721 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3722 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3723 #ifdef EDJE_CALC_CACHE
3726 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3727 _edje_emit(rp->edje, "drag,page", rp->part->name);
3732 _edje_box_init(void)
3738 _edje_box_shutdown(void)
3740 if (!_edje_box_layout_registry)
3744 (_edje_box_layout_registry, _edje_box_layout_external_free, NULL);
3745 _edje_box_layout_registry = NULL;
3749 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
3755 ed = _edje_fetch(obj);
3756 if ((!ed) || (!part) || (!child)) return EINA_FALSE;
3758 rp = _edje_real_part_recursive_get(ed, part);
3759 if (!rp) return EINA_FALSE;
3760 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3762 r = _edje_real_part_box_append(rp, child);
3766 Edje_User_Defined *eud;
3768 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3770 eud->u.box.child = child;
3771 eud->u.box.index = -1;
3773 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3779 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
3785 ed = _edje_fetch(obj);
3786 if ((!ed) || (!part)) return EINA_FALSE;
3788 rp = _edje_real_part_recursive_get(ed, part);
3789 if (!rp) return EINA_FALSE;
3790 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3792 r = _edje_real_part_box_prepend(rp, child);
3796 Edje_User_Defined *eud;
3798 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3800 eud->u.box.child = child;
3802 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3808 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
3814 ed = _edje_fetch(obj);
3815 if ((!ed) || (!part)) return EINA_FALSE;
3817 rp = _edje_real_part_recursive_get(ed, part);
3818 if (!rp) return EINA_FALSE;
3819 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3821 r = _edje_real_part_box_insert_before(rp, child, reference);
3825 Edje_User_Defined *eud;
3827 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3829 eud->u.box.child = child;
3831 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3837 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
3843 ed = _edje_fetch(obj);
3844 if ((!ed) || (!part)) return EINA_FALSE;
3846 rp = _edje_real_part_recursive_get(ed, part);
3847 if (!rp) return EINA_FALSE;
3848 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3850 r = _edje_real_part_box_insert_at(rp, child, pos);
3854 Edje_User_Defined *eud;
3856 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3858 eud->u.box.child = child;
3860 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3866 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
3872 ed = _edje_fetch(obj);
3873 if ((!ed) || (!part)) return NULL;
3875 rp = _edje_real_part_recursive_get(ed, part);
3876 if (!rp) return NULL;
3877 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3879 r = _edje_real_part_box_remove(rp, child);
3883 Edje_User_Defined *eud;
3886 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3887 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == child && !strcmp(eud->part, part))
3889 _edje_user_definition_free(eud);
3897 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
3903 ed = _edje_fetch(obj);
3904 if ((!ed) || (!part)) return NULL;
3906 rp = _edje_real_part_recursive_get(ed, part);
3907 if (!rp) return NULL;
3908 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3910 r = _edje_real_part_box_remove_at(rp, pos);
3914 Edje_User_Defined *eud;
3917 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3918 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == r && !strcmp(eud->part, part))
3920 _edje_user_definition_free(eud);
3928 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
3934 ed = _edje_fetch(obj);
3935 if ((!ed) || (!part)) return EINA_FALSE;
3937 rp = _edje_real_part_recursive_get(ed, part);
3938 if (!rp) return EINA_FALSE;
3939 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3941 r = _edje_real_part_box_remove_all(rp, clear);
3944 Edje_User_Defined *eud;
3947 EINA_LIST_FOREACH_SAFE(ed->user_defined, l, ll, eud)
3948 if (eud->type == EDJE_USER_BOX_PACK && !strcmp(eud->part, part))
3950 _edje_user_definition_free(eud);
3958 edje_object_access_part_list_get(const Evas_Object *obj)
3961 Eina_List *access_parts = NULL;
3963 ed = _edje_fetch(obj);
3964 if ((!ed)) return NULL;
3967 for (i = 0; i < ed->table_parts_size; i++)
3970 rp = ed->table_parts[i];
3971 if (rp->part->access)
3972 access_parts = eina_list_append(access_parts, rp->part->name);
3975 return access_parts;
3979 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
3981 Edje_Real_Part *rp = data;
3983 rp->edje->dirty = EINA_TRUE;
3984 rp->edje->recalc_call = EINA_TRUE;
3985 #ifdef EDJE_CALC_CACHE
3988 _edje_recalc(rp->edje);
3992 _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
3994 evas_object_event_callback_add
3995 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3997 rp->edje->dirty = EINA_TRUE;
3998 rp->edje->recalc_call = EINA_TRUE;
3999 #ifdef EDJE_CALC_CACHE
4002 _edje_recalc(rp->edje);
4006 _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
4008 evas_object_event_callback_del_full
4009 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
4011 rp->edje->dirty = EINA_TRUE;
4012 rp->edje->recalc_call = EINA_TRUE;
4013 #ifdef EDJE_CALC_CACHE
4016 _edje_recalc(rp->edje);
4020 _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj)
4022 Evas_Object_Box_Option *opt;
4024 opt = evas_object_box_append(rp->object, child_obj);
4025 if (!opt) return EINA_FALSE;
4027 if (!_edje_box_layout_add_child(rp, child_obj))
4029 evas_object_box_remove(rp->object, child_obj);
4033 _edje_box_child_add(rp, child_obj);
4039 _edje_real_part_box_prepend(Edje_Real_Part *rp, Evas_Object *child_obj)
4041 Evas_Object_Box_Option *opt;
4043 opt = evas_object_box_prepend(rp->object, child_obj);
4044 if (!opt) return EINA_FALSE;
4046 if (!_edje_box_layout_add_child(rp, child_obj))
4048 evas_object_box_remove(rp->object, child_obj);
4052 _edje_box_child_add(rp, child_obj);
4058 _edje_real_part_box_insert_before(Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref)
4060 Evas_Object_Box_Option *opt;
4062 opt = evas_object_box_insert_before(rp->object, child_obj, ref);
4063 if (!opt) return EINA_FALSE;
4065 if (!_edje_box_layout_add_child(rp, child_obj))
4067 evas_object_box_remove(rp->object, child_obj);
4071 _edje_box_child_add(rp, child_obj);
4077 _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned int pos)
4079 Evas_Object_Box_Option *opt;
4081 opt = evas_object_box_insert_at(rp->object, child_obj, pos);
4082 if (!opt) return EINA_FALSE;
4084 if (!_edje_box_layout_add_child(rp, child_obj))
4086 evas_object_box_remove(rp->object, child_obj);
4090 _edje_box_child_add(rp, child_obj);
4096 _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj)
4098 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
4099 if (!evas_object_box_remove(rp->object, child_obj)) return NULL;
4100 _edje_box_layout_remove_child(rp, child_obj);
4101 _edje_box_child_remove(rp, child_obj);
4106 _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
4108 Evas_Object_Box_Option *opt;
4109 Evas_Object_Box_Data *priv;
4110 Evas_Object *child_obj;
4112 priv = evas_object_smart_data_get(rp->object);
4113 opt = eina_list_nth(priv->children, pos);
4114 if (!opt) return NULL;
4115 child_obj = opt->obj;
4116 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
4117 if (!evas_object_box_remove_at(rp->object, pos)) return NULL;
4118 _edje_box_layout_remove_child(rp, child_obj);
4119 _edje_box_child_remove(rp, child_obj);
4124 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
4126 Eina_List *children;
4129 children = evas_object_box_children_get(rp->object);
4132 Evas_Object *child_obj = children->data;
4133 if (evas_object_data_get(child_obj, "\377 edje.box_item"))
4137 _edje_box_layout_remove_child(rp, child_obj);
4138 _edje_box_child_remove(rp, child_obj);
4139 if (!evas_object_box_remove_at(rp->object, i))
4142 evas_object_del(child_obj);
4144 children = eina_list_remove_list(children, children);
4150 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child, void *einfo __UNUSED__)
4152 Edje_User_Defined *eud;
4154 Edje_Real_Part *rp = data;
4156 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4157 if (rp->part->type == EDJE_PART_TYPE_BOX)
4159 if (eud->type == EDJE_USER_BOX_PACK &&
4160 eud->u.box.child == child &&
4161 !strcmp(rp->part->name, eud->part))
4163 _edje_user_definition_free(eud);
4167 else if (rp->part->type == EDJE_PART_TYPE_TABLE)
4169 if (eud->type == EDJE_USER_TABLE_PACK &&
4170 eud->u.table.child == child &&
4171 !strcmp(rp->part->name, eud->part))
4173 _edje_user_definition_free(eud);
4178 rp->edje->dirty = EINA_TRUE;
4179 rp->edje->recalc_call = EINA_TRUE;
4180 #ifdef EDJE_CALC_CACHE
4183 _edje_recalc(rp->edje);
4187 _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
4189 evas_object_event_callback_add
4190 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4192 rp->edje->dirty = EINA_TRUE;
4193 rp->edje->recalc_call = EINA_TRUE;
4194 #ifdef EDJE_CALC_CACHE
4197 _edje_recalc(rp->edje);
4201 _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
4203 evas_object_event_callback_del_full
4204 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4206 rp->edje->dirty = EINA_TRUE;
4207 rp->edje->recalc_call = EINA_TRUE;
4208 #ifdef EDJE_CALC_CACHE
4211 _edje_recalc(rp->edje);
4215 edje_object_part_table_child_get(const Evas_Object *obj, const char *part, unsigned int col, unsigned int row)
4220 ed = _edje_fetch(obj);
4221 if ((!ed) || (!part)) return NULL;
4223 rp = _edje_real_part_recursive_get(ed, part);
4224 if (!rp) return NULL;
4225 if (rp->part->type != EDJE_PART_TYPE_TABLE) return NULL;
4227 return evas_object_table_child_get(rp->object, col, row);
4231 edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
4235 Edje_User_Defined *eud;
4238 ed = _edje_fetch(obj);
4239 if ((!ed) || (!part)) return EINA_FALSE;
4241 rp = _edje_real_part_recursive_get(ed, part);
4242 if (!rp) return EINA_FALSE;
4243 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4245 r = _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
4248 eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed);
4251 eud->u.table.child = child_obj;
4252 eud->u.table.col = col;
4253 eud->u.table.row = row;
4254 eud->u.table.colspan = colspan;
4255 eud->u.table.rowspan = rowspan;
4257 evas_object_event_callback_add(child_obj, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
4263 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
4269 ed = _edje_fetch(obj);
4270 if ((!ed) || (!part)) return EINA_FALSE;
4272 rp = _edje_real_part_recursive_get(ed, part);
4273 if (!rp) return EINA_FALSE;
4274 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4276 r = _edje_real_part_table_unpack(rp, child_obj);
4280 Edje_User_Defined *eud;
4283 EINA_LIST_FOREACH(ed->user_defined, l, eud)
4284 if (eud->type == EDJE_USER_TABLE_PACK &&
4285 eud->u.table.child == child_obj &&
4286 !strcmp(part, eud->part))
4288 _edje_user_definition_free(eud);
4297 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
4302 ed = _edje_fetch(obj);
4303 if ((!ed) || (!part)) return EINA_FALSE;
4305 rp = _edje_real_part_recursive_get(ed, part);
4306 if (!rp) return EINA_FALSE;
4307 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4309 evas_object_table_col_row_size_get(rp->object, cols, rows);
4314 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
4319 ed = _edje_fetch(obj);
4320 if ((!ed) || (!part)) return EINA_FALSE;
4322 rp = _edje_real_part_recursive_get(ed, part);
4323 if (!rp) return EINA_FALSE;
4324 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4326 _edje_real_part_table_clear(rp, clear);
4331 _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
4333 Edje_Perspective *ps = data;
4336 EINA_LIST_FREE(ps->users, o)
4340 ed = evas_object_smart_data_get(o);
4343 ed->dirty = EINA_TRUE;
4344 ed->recalc_call = EINA_TRUE;
4345 _edje_recalc_do(ed);
4350 EAPI Edje_Perspective *
4351 edje_perspective_new(Evas *e)
4353 Edje_Perspective *ps;
4354 Evas_Coord vx, vy, vw, vh;
4356 if (!e) return NULL;
4357 ps = calloc(1, sizeof(Edje_Perspective));
4358 ps->obj = evas_object_rectangle_add(e);
4359 evas_object_data_set(ps->obj, "_edje_perspective", ps);
4360 evas_object_event_callback_add(ps->obj, EVAS_CALLBACK_DEL, _edje_perspective_obj_del, ps);
4361 evas_output_viewport_get(e, &vx, &vy, &vw, &vh);
4363 ps->px = vx + (vw / 2);
4364 ps->py = vy + (vh / 2);
4371 edje_perspective_free(Edje_Perspective *ps)
4374 evas_object_del(ps->obj);
4378 edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
4384 if ((ps->px == px) && (ps->py == py) && (ps->z0 == z0) && (ps->foc == foc)) return;
4389 EINA_LIST_FOREACH(ps->users, l, o)
4393 ed = evas_object_smart_data_get(o);
4397 ed->dirty = EINA_TRUE;
4398 ed->recalc_call = EINA_TRUE;
4399 _edje_recalc_do(ed);
4404 EINA_LIST_FOREACH(_edje_edjes, l, o)
4408 ed = evas_object_smart_data_get(o);
4412 ed->dirty = EINA_TRUE;
4413 ed->recalc_call = EINA_TRUE;
4414 _edje_recalc_do(ed);
4421 edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
4427 if (ps->global == global) return;
4430 o = evas_object_name_find(evas_object_evas_get(ps->obj),
4431 "_edje_perspective");
4432 if (o) evas_object_name_set(o, NULL);
4433 evas_object_name_set(ps->obj, "_edje_perspective");
4436 evas_object_name_set(ps->obj, NULL);
4437 ps->global = global;
4438 EINA_LIST_FOREACH(_edje_edjes, l, o)
4442 ed = evas_object_smart_data_get(o);
4446 ed->dirty = EINA_TRUE;
4447 ed->recalc_call = EINA_TRUE;
4448 _edje_recalc_do(ed);
4454 edje_perspective_global_get(const Edje_Perspective *ps)
4456 if (!ps) return EINA_FALSE;
4460 EAPI const Edje_Perspective *
4461 edje_evas_global_perspective_get(const Evas *e)
4465 if (!e) return NULL;
4466 obj = evas_object_name_find(e, "_edje_perspective");
4467 if (!obj) return NULL;
4468 return evas_object_data_get(obj, "_edje_perspective");
4472 edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
4476 ed = evas_object_smart_data_get(obj);
4478 if (ed->persp == ps) return;
4479 if (ed->persp != ps)
4482 ed->persp->users = eina_list_remove(ed->persp->users, obj);
4485 if (ps) ps->users = eina_list_append(ps->users, obj);
4486 ed->dirty = EINA_TRUE;
4487 ed->recalc_call = EINA_TRUE;
4488 _edje_recalc_do(ed);
4491 EAPI const Edje_Perspective *
4492 edje_object_perspective_get(const Evas_Object *obj)
4496 ed = evas_object_smart_data_get(obj);
4497 if (!ed) return NULL;
4501 #define EDJE_PRELOAD_EMISSION "preload,done"
4502 #define EDJE_PRELOAD_SOURCE NULL
4505 edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
4511 ed = _edje_fetch(obj);
4512 if (!ed) return EINA_FALSE;
4514 _edje_recalc_do(ed);
4516 for (i = 0, count = 0; i < ed->table_parts_size; i++)
4521 rp = ed->table_parts[i];
4524 if ((ep->type == EDJE_PART_TYPE_IMAGE) ||
4525 ((ep->type == EDJE_PART_TYPE_GROUP) &&
4526 ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
4527 (rp->typedata.swallow)) &&
4528 (rp->typedata.swallow->swallowed_object)))
4532 ed->preload_count = count;
4536 for (i = 0; i < ed->table_parts_size; i++)
4541 rp = ed->table_parts[i];
4544 if (ep->type == EDJE_PART_TYPE_IMAGE)
4546 const char *file = NULL;
4547 const char *key = NULL;
4549 evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4551 evas_object_image_file_get(rp->object, &file, &key);
4554 ed->preload_count--;
4558 evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4559 evas_object_image_preload(rp->object, cancel);
4563 else if (ep->type == EDJE_PART_TYPE_GROUP)
4565 if (((rp->type == EDJE_RP_TYPE_SWALLOW) &&
4566 (rp->typedata.swallow)) &&
4567 (rp->typedata.swallow->swallowed_object))
4573 tmp = alloca(strlen(rp->part->name) + 2);
4574 sprintf(tmp, "%s:", rp->part->name);
4576 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb);
4577 edje_object_signal_callback_add(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb, ed);
4578 edje_object_preload(rp->typedata.swallow->swallowed_object, cancel);
4582 ed->preload_count--;
4591 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
4598 edje_object_update_hints_set(Evas_Object *obj, Eina_Bool update)
4602 ed = _edje_fetch(obj);
4604 if (ed->update_hints == !!update) return ;
4606 ed->update_hints = !!update;
4609 ed->recalc_hints = EINA_TRUE;
4615 edje_object_update_hints_get(Evas_Object *obj)
4619 ed = _edje_fetch(obj);
4620 if (!ed) return EINA_FALSE;
4622 return ed->update_hints;
4626 _edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
4629 evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
4631 _edje_table_child_add(rp, child_obj);
4637 _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
4639 Eina_Bool ret = evas_object_table_unpack(rp->object, child_obj);
4642 _edje_table_child_remove(rp, child_obj);
4648 _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
4650 Eina_List *children;
4652 children = evas_object_table_children_get(rp->object);
4655 Evas_Object *child_obj = children->data;
4657 _edje_table_child_remove(rp, child_obj);
4658 if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
4660 evas_object_table_unpack(rp->object, child_obj);
4662 evas_object_del(child_obj);
4664 children = eina_list_remove_list(children, children);
4669 _edje_real_part_recursive_get(const Edje *ed, const char *part)
4674 path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
4675 if (!path) return NULL;
4677 rp = _edje_real_part_recursive_get_helper(ed, path);
4685 _edje_children_get(Edje_Real_Part *rp, const char *partid)
4692 if (!partid) return NULL;
4694 switch (rp->part->type)
4696 case EDJE_PART_TYPE_EXTERNAL:
4697 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
4698 (!rp->typedata.swallow)) return NULL;
4699 return _edje_external_content_get
4700 (rp->typedata.swallow->swallowed_object, partid);
4701 case EDJE_PART_TYPE_BOX:
4702 l = evas_object_box_children_get(rp->object);
4704 case EDJE_PART_TYPE_TABLE:
4705 l = evas_object_table_children_get(rp->object);
4711 v = strtol(partid, &p, 10);
4712 if ((*p == '\0') && (v >= 0))
4714 child = eina_list_nth(l, v);
4720 EINA_LIST_FREE(l, cur)
4722 const char *name = evas_object_name_get(cur);
4723 if ((name) && (!strcmp(name, partid)))
4735 /* rebuild alternative path */
4737 _edje_merge_path(const char *alias, char * const *path)
4740 unsigned int length = 1;
4741 unsigned int alias_length;
4744 if (!alias) return NULL;
4746 alias_length = strlen(alias);
4748 for (i = 0; path[i]; i++)
4749 length += strlen(path[i]) + 1;
4751 tmp = malloc(sizeof (char) * (length + alias_length + 2));
4752 memcpy(tmp, alias, alias_length);
4753 tmp[alias_length] = '\0';
4755 for (i = 0; path[i]; i++)
4757 strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
4758 strcat(tmp, path[i]);
4766 _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
4775 if (ed->collection && ed->collection->alias)
4779 alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
4781 rp = _edje_real_part_recursive_get(ed, alias);
4787 //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
4788 idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
4793 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
4802 rp = _edje_real_part_get(ed, path[0]);
4803 if (!path[1] && !idx) return rp;
4804 if (!rp) return NULL;
4806 switch (rp->part->type)
4808 case EDJE_PART_TYPE_GROUP:
4809 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
4810 (!rp->typedata.swallow)) return NULL;
4811 if (!rp->typedata.swallow->swallowed_object) return NULL;
4812 ed = _edje_fetch(rp->typedata.swallow->swallowed_object);
4813 if (!ed) return NULL;
4815 return _edje_real_part_recursive_get_helper(ed, path);
4816 case EDJE_PART_TYPE_BOX:
4817 case EDJE_PART_TYPE_TABLE:
4818 case EDJE_PART_TYPE_EXTERNAL:
4819 if (!idx) return rp;
4822 child = _edje_children_get(rp, idx);
4824 ed = _edje_fetch(child);
4826 if (!ed) return NULL;
4827 return _edje_real_part_recursive_get_helper(ed, path);
4833 /* Private Routines */
4835 _edje_real_part_get(const Edje *ed, const char *part)
4839 if (!part) return NULL;
4841 for (i = 0; i < ed->table_parts_size; i++)
4845 rp = ed->table_parts[i];
4846 if ((rp->part->name) && (!strcmp(rp->part->name, part))) return rp;
4852 _edje_color_class_find(Edje *ed, const char *color_class)
4854 Edje_Color_Class *cc = NULL;
4856 if ((!ed) || (!color_class)) return NULL;
4858 /* first look through the object scope */
4859 cc = eina_hash_find(ed->color_classes, color_class);
4862 /* next look through the global scope */
4863 cc = eina_hash_find(_edje_color_class_hash, color_class);
4866 /* finally, look through the file scope */
4867 cc = eina_hash_find(ed->file->color_hash, color_class);
4874 _edje_color_class_member_add(Edje *ed, const char *color_class)
4876 _edje_class_member_add(ed, &ed->members.color_class, &_edje_color_class_member_hash, color_class);
4880 _edje_color_class_member_direct_del(const char *color_class, void *l)
4882 _edje_class_member_direct_del(color_class, l, _edje_color_class_member_hash);
4886 _edje_color_class_member_del(Edje *ed, const char *color_class)
4888 if ((!ed) || (!color_class)) return;
4890 _edje_class_member_del(&ed->members.color_class, &_edje_color_class_member_hash, color_class);
4894 _edje_color_class_members_free(void)
4896 if (!_edje_color_class_member_hash) return;
4897 eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
4898 eina_hash_free(_edje_color_class_member_hash);
4899 _edje_color_class_member_hash = NULL;
4903 color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4905 Edje_Color_Class *cc;
4908 if (cc->name) eina_stringshare_del(cc->name);
4914 _edje_color_class_hash_free(void)
4916 if (!_edje_color_class_hash) return;
4917 eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
4918 eina_hash_free(_edje_color_class_hash);
4919 _edje_color_class_hash = NULL;
4923 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
4927 if ((ep->default_desc) && (ep->default_desc->color_class))
4928 _edje_color_class_member_del(ed, ep->default_desc->color_class);
4930 for (i = 0; i < ep->other.desc_count; ++i)
4931 if (ep->other.desc[i]->color_class)
4932 _edje_color_class_member_del(ed, ep->other.desc[i]->color_class);
4936 _edje_text_class_find(Edje *ed, const char *text_class)
4939 Edje_Text_Class *tc;
4941 if ((!ed) || (!text_class)) return NULL;
4942 EINA_LIST_FOREACH(ed->text_classes, l, tc)
4943 if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
4944 return eina_hash_find(_edje_text_class_hash, text_class);
4948 _edje_text_class_member_direct_del(const char *text_class,
4951 _edje_class_member_direct_del(text_class, l, _edje_text_class_member_hash);
4955 _edje_text_class_member_add(Edje *ed, const char *text_class)
4957 _edje_class_member_add(ed, &ed->members.text_class, &_edje_text_class_member_hash, text_class);
4961 _edje_text_class_member_del(Edje *ed, const char *text_class)
4963 if ((!ed) || (!text_class)) return;
4965 _edje_class_member_del(&ed->members.text_class, &_edje_text_class_member_hash, text_class);
4969 _edje_text_class_members_free(void)
4971 _edje_class_members_free(&_edje_text_class_member_hash);
4975 text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4977 Edje_Text_Class *tc;
4980 if (tc->name) eina_stringshare_del(tc->name);
4981 if (tc->font) eina_stringshare_del(tc->font);
4987 _edje_text_class_hash_free(void)
4989 if (!_edje_text_class_hash) return;
4990 eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
4991 eina_hash_free(_edje_text_class_hash);
4992 _edje_text_class_hash = NULL;
4996 _edje_fetch(const Evas_Object *obj)
5000 if (!evas_object_smart_type_check(obj, "edje"))
5002 ed = evas_object_smart_data_get(obj);
5003 if ((ed) && (ed->delete_me)) return NULL;
5008 _edje_freeze(Edje *ed)
5011 // printf("FREEZE %i\n", ed->freeze);
5016 _edje_thaw(Edje *ed)
5021 // printf("-------------########### OVER THAW\n");
5024 if ((ed->freeze == 0) && (ed->recalc))
5026 // printf("thaw recalc\n");
5033 _edje_block(Edje *ed)
5041 _edje_unblock(Edje *ed)
5045 if (!ed) return ret;
5048 if (ed->block == 0) ed->block_break = EINA_FALSE;
5055 _edje_block_break(Edje *ed)
5057 if (ed->block_break) return 1;
5062 _edje_block_violate(Edje *ed)
5064 if (ed->block > 0) ed->block_break = EINA_TRUE;
5068 _edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
5071 Edje_User_Defined *eud;
5076 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
5077 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj)
5079 _edje_user_definition_free(eud);
5087 _edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
5091 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
5092 (!rp->typedata.swallow)) return;
5093 type = evas_object_type_get(rp->typedata.swallow->swallowed_object);
5095 rp->typedata.swallow->swallow_params.min.w = 0;
5096 rp->typedata.swallow->swallow_params.min.h = 0;
5097 rp->typedata.swallow->swallow_params.max.w = -1;
5098 rp->typedata.swallow->swallow_params.max.h = -1;
5099 if ((type) && (!strcmp(type, "edje")))
5104 edje_object_size_min_get(rp->typedata.swallow->swallowed_object, &w, &h);
5105 rp->typedata.swallow->swallow_params.min.w = w;
5106 rp->typedata.swallow->swallow_params.min.h = h;
5108 edje_object_size_max_get(rp->typedata.swallow->swallowed_object, &w, &h);
5109 rp->typedata.swallow->swallow_params.max.w = w;
5110 rp->typedata.swallow->swallow_params.max.h = h;
5112 else if ((type) && ((!strcmp(type, "text")) || (!strcmp(type, "polygon")) ||
5113 (!strcmp(type, "line"))))
5117 evas_object_geometry_get(rp->typedata.swallow->swallowed_object, NULL, NULL, &w, &h);
5119 rp->typedata.swallow->swallow_params.min.w = w;
5120 rp->typedata.swallow->swallow_params.min.h = h;
5122 rp->typedata.swallow->swallow_params.max.w = w;
5123 rp->typedata.swallow->swallow_params.max.h = h;
5126 Evas_Coord w1, h1, w2, h2, aw, ah;
5127 Evas_Aspect_Control am;
5129 evas_object_size_hint_min_get(rp->typedata.swallow->swallowed_object, &w1, &h1);
5130 evas_object_size_hint_max_get(rp->typedata.swallow->swallowed_object, &w2, &h2);
5131 evas_object_size_hint_aspect_get(rp->typedata.swallow->swallowed_object, &am, &aw, &ah);
5132 rp->typedata.swallow->swallow_params.min.w = w1;
5133 rp->typedata.swallow->swallow_params.min.h = h1;
5134 if (w2 > 0) rp->typedata.swallow->swallow_params.max.w = w2;
5135 if (h2 > 0) rp->typedata.swallow->swallow_params.max.h = h2;
5138 case EVAS_ASPECT_CONTROL_NONE:
5139 rp->typedata.swallow->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE;
5141 case EVAS_ASPECT_CONTROL_NEITHER:
5142 rp->typedata.swallow->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER;
5144 case EVAS_ASPECT_CONTROL_HORIZONTAL:
5145 rp->typedata.swallow->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL;
5147 case EVAS_ASPECT_CONTROL_VERTICAL:
5148 rp->typedata.swallow->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
5150 case EVAS_ASPECT_CONTROL_BOTH:
5151 rp->typedata.swallow->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH;
5156 rp->typedata.swallow->swallow_params.aspect.w = aw;
5157 rp->typedata.swallow->swallow_params.aspect.h = ah;
5158 evas_object_data_set(rp->typedata.swallow->swallowed_object, "\377 edje.swallowing_part", rp);
5161 #ifdef EDJE_CALC_CACHE
5167 _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
5172 _edje_real_part_swallow_hints_update(rp);
5173 rp->edje->dirty = EINA_TRUE;
5174 rp->edje->recalc_call = EINA_TRUE;
5175 _edje_recalc(rp->edje);
5180 _edje_object_part_swallow_image_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
5182 Edje_Real_Part *rp = data;
5186 if (!rp->chosen_description->map.on) return;
5188 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
5189 (!rp->typedata.swallow)) return;
5190 map = (Evas_Map *)evas_object_map_get(rp->typedata.swallow->swallowed_object);
5193 evas_object_image_size_get(rp->typedata.swallow->swallowed_object, &w, &h);
5194 evas_map_point_image_uv_set(map, 0, 0, 0);
5195 evas_map_point_image_uv_set(map, 1, w, 0);
5196 evas_map_point_image_uv_set(map, 2, w, h);
5197 evas_map_point_image_uv_set(map, 3, 0, h);
5199 evas_object_map_set(rp->typedata.swallow->swallowed_object, map);
5203 _edje_real_part_swallow(Edje_Real_Part *rp,
5204 Evas_Object *obj_swallow,
5205 Eina_Bool hints_update)
5207 const char *obj_type;
5209 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
5210 (!rp->typedata.swallow)) return;
5211 if (rp->typedata.swallow->swallowed_object)
5213 if (rp->typedata.swallow->swallowed_object != obj_swallow)
5215 edje_object_part_unswallow(rp->edje->obj, rp->typedata.swallow->swallowed_object);
5220 _edje_real_part_swallow_hints_update(rp);
5221 rp->edje->dirty = EINA_TRUE;
5222 rp->edje->recalc_call = EINA_TRUE;
5223 rp->edje->recalc_hints = EINA_TRUE;
5224 _edje_recalc(rp->edje);
5228 #ifdef EDJE_CALC_CACHE
5231 if (!obj_swallow) return;
5232 rp->typedata.swallow->swallowed_object = obj_swallow;
5233 evas_object_smart_member_add(rp->typedata.swallow->swallowed_object, rp->edje->obj);
5235 evas_object_clip_set(rp->typedata.swallow->swallowed_object, rp->clip_to->object);
5236 else evas_object_clip_set(rp->typedata.swallow->swallowed_object, rp->edje->base.clipper);
5237 evas_object_stack_above(rp->typedata.swallow->swallowed_object, rp->object);
5238 evas_object_event_callback_add(rp->typedata.swallow->swallowed_object,
5240 _edje_object_part_swallow_free_cb,
5242 evas_object_event_callback_add(rp->typedata.swallow->swallowed_object,
5243 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5244 _edje_object_part_swallow_changed_hints_cb,
5247 //If the map is enabled, uv should be updated when image size is changed.
5248 obj_type = evas_object_type_get(rp->typedata.swallow->swallowed_object);
5249 if (obj_type && !strcmp(obj_type, "image"))
5250 evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_IMAGE_RESIZE,
5251 _edje_object_part_swallow_image_resize_cb,
5255 _edje_real_part_swallow_hints_update(rp);
5257 if (rp->part->mouse_events)
5259 _edje_callbacks_add(obj_swallow, rp->edje, rp);
5260 if (rp->part->repeat_events)
5261 evas_object_repeat_events_set(obj_swallow, 1);
5262 if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB)
5263 evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode);
5264 evas_object_pass_events_set(obj_swallow, 0);
5267 evas_object_pass_events_set(obj_swallow, 1);
5268 _edje_callbacks_focus_add(rp->typedata.swallow->swallowed_object, rp->edje, rp);
5270 if (rp->part->precise_is_inside)
5271 evas_object_precise_is_inside_set(obj_swallow, 1);
5273 rp->edje->dirty = EINA_TRUE;
5274 rp->edje->recalc_call = EINA_TRUE;
5275 rp->edje->recalc_hints = EINA_TRUE;
5276 _edje_recalc(rp->edje);
5280 _edje_real_part_swallow_clear(Edje_Real_Part *rp)
5282 if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
5283 (!rp->typedata.swallow)) return;
5284 if (!rp->typedata.swallow->swallowed_object) return;
5285 evas_object_smart_member_del(rp->typedata.swallow->swallowed_object);
5286 evas_object_event_callback_del_full(rp->typedata.swallow->swallowed_object,
5288 _edje_object_part_swallow_free_cb,
5290 evas_object_event_callback_del_full(rp->typedata.swallow->swallowed_object,
5291 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5292 _edje_object_part_swallow_changed_hints_cb,
5294 if (!strcmp(evas_object_type_get(rp->typedata.swallow->swallowed_object), "image"))
5295 evas_object_event_callback_del_full(rp->typedata.swallow->swallowed_object,
5296 EVAS_CALLBACK_IMAGE_RESIZE,
5297 _edje_object_part_swallow_image_resize_cb,
5299 evas_object_clip_unset(rp->typedata.swallow->swallowed_object);
5300 evas_object_data_del(rp->typedata.swallow->swallowed_object, "\377 edje.swallowing_part");
5301 if (rp->part->mouse_events)
5302 _edje_callbacks_del(rp->typedata.swallow->swallowed_object, rp->edje);
5303 _edje_callbacks_focus_del(rp->typedata.swallow->swallowed_object, rp->edje);
5304 rp->typedata.swallow->swallowed_object = NULL;
5308 _edje_object_preload(Edje *ed)
5310 ed->preload_count--;
5311 if (!ed->preload_count)
5312 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
5316 _edje_object_image_preload_cb(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5320 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
5321 _edje_object_preload(ed);
5325 _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const char *emission, __UNUSED__ const char *source)
5329 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
5330 _edje_object_preload(ed);
5339 _edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
5341 Edje_Program ***array;
5342 unsigned int *count;
5345 if (!p->signal && !p->source)
5347 array = &edc->programs.nocmp;
5348 count = &edc->programs.nocmp_count;
5350 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5351 && p->source && !strpbrk(p->source, "*?[\\"))
5353 array = &edc->programs.strcmp;
5354 count = &edc->programs.strcmp_count;
5356 else if (p->signal && edje_program_is_strncmp(p->signal)
5357 && p->source && edje_program_is_strncmp(p->source))
5359 array = &edc->programs.strncmp;
5360 count = &edc->programs.strncmp_count;
5362 else if (p->signal && edje_program_is_strrncmp(p->signal)
5363 && p->source && edje_program_is_strrncmp(p->source))
5365 array = &edc->programs.strrncmp;
5366 count = &edc->programs.strrncmp_count;
5370 array = &edc->programs.fnmatch;
5371 count = &edc->programs.fnmatch_count;
5374 for (i = 0; i < *count; ++i)
5375 if ((*array)[i] == p)
5377 memmove(*array + i, *array + i + 1, sizeof (Edje_Program *) * (*count - i -1));
5389 _edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
5391 Edje_Program ***array;
5392 unsigned int *count;
5394 if (!p->signal && !p->source)
5396 array = &edc->programs.nocmp;
5397 count = &edc->programs.nocmp_count;
5399 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5400 && p->source && !strpbrk(p->source, "*?[\\"))
5402 array = &edc->programs.strcmp;
5403 count = &edc->programs.strcmp_count;
5405 else if (p->signal && edje_program_is_strncmp(p->signal)
5406 && p->source && edje_program_is_strncmp(p->source))
5408 array = &edc->programs.strncmp;
5409 count = &edc->programs.strncmp_count;
5411 else if (p->signal && edje_program_is_strrncmp(p->signal)
5412 && p->source && edje_program_is_strrncmp(p->source))
5414 array = &edc->programs.strrncmp;
5415 count = &edc->programs.strrncmp_count;
5419 array = &edc->programs.fnmatch;
5420 count = &edc->programs.fnmatch_count;
5423 *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));
5424 (*array)[(*count)++] = p;
5428 edje_string_get(const Edje_String *es)
5430 /* FIXME: Handle localization here */
5431 if (!es) return NULL;
5436 edje_string_id_get(const Edje_String *es)
5438 /* FIXME: Handle localization here */
5439 if (!es) return NULL;
5444 _cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5447 _edje_subobj_unregister(ed, obj);
5451 _edje_subobj_register(Edje *ed, Evas_Object *ob)
5453 ed->subobjs = eina_list_append(ed->subobjs, ob);
5454 evas_object_event_callback_add(ob, EVAS_CALLBACK_DEL,
5455 _cb_subobj_del, ed);
5459 _edje_subobj_unregister(Edje *ed, Evas_Object *obj)
5461 ed->subobjs = eina_list_remove(ed->subobjs, obj);
5462 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
5463 _cb_subobj_del, ed);
5466 /////////////////////////////////// TIZEN ONLY(130129) ////////////////////////////////////////////////
5467 EAPI void edje_object_part_text_freeze(Evas_Object *obj, const char *part)
5472 ed = _edje_fetch(obj);
5473 if ((!ed) || (!part)) return;
5474 rp = _edje_real_part_recursive_get(ed, part);
5476 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
5477 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
5479 _edje_entry_freeze(rp);
5482 EAPI void edje_object_part_text_thaw(Evas_Object *obj, const char *part)
5487 ed = _edje_fetch(obj);
5488 if ((!ed) || (!part)) return;
5489 rp = _edje_real_part_recursive_get(ed, part);
5491 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
5492 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
5494 _edje_entry_thaw(rp);
5496 /////////////////////////////////////////////////////////////////////////////////////////////////////
5498 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/