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 rp->swallowed_object = NULL;
98 rp->swallow_params.min.w = 0;
99 rp->swallow_params.min.h = 0;
100 rp->swallow_params.max.w = 0;
101 rp->swallow_params.max.h = 0;
103 rp->edje->recalc_call = 1;
104 #ifdef EDJE_CALC_CACHE
107 _edje_recalc_do(rp->edje);
110 case EDJE_USER_BOX_PACK:
111 child = eud->u.box.child;
112 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
113 _edje_box_child_remove(rp, child);
115 case EDJE_USER_TABLE_PACK:
116 child = eud->u.table.child;
117 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
118 _edje_table_child_remove(rp, child);
120 case EDJE_USER_STRING:
121 case EDJE_USER_DRAG_STEP:
122 case EDJE_USER_DRAG_PAGE:
123 case EDJE_USER_DRAG_VALUE:
124 case EDJE_USER_DRAG_SIZE:
128 _edje_user_definition_remove(eud, child);
132 _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
134 Edje_User_Defined *eud = data;
136 _edje_user_definition_free(eud);
140 _edje_class_member_direct_del(const char *class, Edje_List_Refcount *lookup, Eina_Hash *hash)
144 members = eina_hash_find(hash, class);
145 members = eina_list_remove_list(members, lookup->lookup);
146 eina_hash_set(hash, class, members);
151 _edje_class_member_add(Edje *ed, Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
153 Edje_List_Refcount *lookup;
156 if ((!ed) || (!ehash) || (!ghash) || (!class)) return;
158 lookup = eina_hash_find(*ehash, class);
161 EINA_REFCOUNT_REF(lookup);
165 lookup = malloc(sizeof (Edje_List_Refcount));
166 if (!lookup) return ;
167 EINA_REFCOUNT_INIT(lookup);
169 /* Get members list */
170 members = eina_hash_find(*ghash, class);
172 /* Update the member list */
173 lookup->lookup = members = eina_list_prepend(members, ed);
175 /* Don't loose track of members list */
177 *ehash = eina_hash_string_small_new(NULL);
178 eina_hash_add(*ehash, class, lookup);
180 /* Reset the member list to the right pointer */
182 *ghash = eina_hash_string_superfast_new(NULL);
183 eina_hash_set(*ghash, class, members);
187 _edje_class_member_del(Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
189 Edje_List_Refcount *lookup;
192 if ((!ehash) || (!ghash) || (!class)) return;
193 members = eina_hash_find(*ghash, class);
194 if (!members) return;
196 lookup = eina_hash_find(*ehash, class);
197 if (!lookup) return ;
199 EINA_REFCOUNT_UNREF(lookup)
201 members = eina_list_remove_list(members, lookup->lookup);
202 eina_hash_set(*ghash, class, members);
204 eina_hash_del(*ehash, class, lookup);
210 member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
212 eina_list_free(data);
217 _edje_class_members_free(Eina_Hash **ghash)
219 if (!ghash || !*ghash) return;
220 eina_hash_foreach(*ghash, member_list_free, NULL);
221 eina_hash_free(*ghash);
225 /************************** API Routines **************************/
235 // FIXME: could just have a global freeze instead of per object
236 // above i tried.. but this broke some things. notable e17's menus. why?
240 EINA_LIST_FOREACH(_edje_edjes, l, data)
241 edje_object_freeze(data);
247 _edje_thaw_edje(Edje *ed)
251 for (i = 0; i < ed->table_parts_size; i++)
255 rp = ed->table_parts[i];
256 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
260 ed2 = _edje_fetch(rp->swallowed_object);
261 if (ed2) _edje_thaw_edje(ed2);
264 if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
273 if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
277 _edje_freeze_calc_count = 0;
278 EINA_LIST_FREE(_edje_freeze_calc_list, ed)
287 // FIXME: could just have a global freeze instead of per object
288 // comment as above.. why?
291 EINA_LIST_FOREACH(_edje_edjes, l, data)
292 edje_object_thaw(data);
297 edje_fontset_append_set(const char *fonts)
299 if (_edje_fontset_append)
300 free(_edje_fontset_append);
301 _edje_fontset_append = fonts ? strdup(fonts) : NULL;
305 edje_fontset_append_get(void)
307 return _edje_fontset_append;
311 edje_scale_set(double scale)
316 if (_edje_scale == FROM_DOUBLE(scale)) return;
317 _edje_scale = FROM_DOUBLE(scale);
318 EINA_LIST_FOREACH(_edje_edjes, l, data)
319 edje_object_calc_force(data);
325 return TO_DOUBLE(_edje_scale);
329 edje_password_show_last_set(Eina_Bool password_show_last)
331 if (_edje_password_show_last == password_show_last) return;
332 _edje_password_show_last = password_show_last;
336 edje_password_show_last_timeout_set(double password_show_last_timeout)
338 if (_edje_password_show_last_timeout == FROM_DOUBLE(password_show_last_timeout)) return;
339 _edje_password_show_last_timeout = FROM_DOUBLE(password_show_last_timeout);
343 edje_object_scale_set(Evas_Object *obj, double scale)
347 ed = _edje_fetch(obj);
348 if (!ed) return EINA_FALSE;
349 if (ed->scale == scale) return EINA_TRUE;
350 ed->scale = FROM_DOUBLE(scale);
351 edje_object_calc_force(obj);
356 edje_object_scale_get(const Evas_Object *obj)
360 ed = _edje_fetch(obj);
362 return TO_DOUBLE(ed->scale);
366 edje_object_mirrored_get(const Evas_Object *obj)
370 ed = _edje_fetch(obj);
371 if (!ed) return EINA_FALSE;
377 _edje_object_orientation_inform(Evas_Object *obj)
379 if (edje_object_mirrored_get(obj))
380 edje_object_signal_emit(obj, "edje,state,rtl", "edje");
382 edje_object_signal_emit(obj, "edje,state,ltr", "edje");
386 edje_object_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
391 ed = _edje_fetch(obj);
393 if (ed->is_rtl == rtl) return;
397 for (i = 0 ; i < ed->table_parts_size ; i++)
403 ep = ed->table_parts[i];
404 s = ep->param1.description->state.name,
405 v = ep->param1.description->state.value;
406 _edje_part_description_apply(ed, ep, s, v , NULL, 0.0);
407 ep->chosen_description = ep->param1.description;
411 _edje_object_orientation_inform(obj);
417 edje_object_data_get(const Evas_Object *obj, const char *key)
421 ed = _edje_fetch(obj);
424 if (!ed->collection) return NULL;
425 if (!ed->collection->data) return NULL;
426 return edje_string_get(eina_hash_find(ed->collection->data, key));
430 edje_object_freeze(Evas_Object *obj)
435 ed = _edje_fetch(obj);
437 for (i = 0; i < ed->table_parts_size; i++)
440 rp = ed->table_parts[i];
441 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
442 edje_object_freeze(rp->swallowed_object);
444 return _edje_freeze(ed);
448 edje_object_thaw(Evas_Object *obj)
453 ed = _edje_fetch(obj);
455 for (i = 0; i < ed->table_parts_size; i++)
459 rp = ed->table_parts[i];
460 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
461 edje_object_thaw(rp->swallowed_object);
463 return _edje_thaw(ed);
467 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)
470 Edje_Color_Class *cc;
472 if (!color_class) return EINA_FALSE;
474 cc = eina_hash_find(_edje_color_class_hash, color_class);
477 cc = calloc(1, sizeof(Edje_Color_Class));
478 if (!cc) return EINA_FALSE;
479 cc->name = eina_stringshare_add(color_class);
485 if (!_edje_color_class_hash)
486 _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
487 eina_hash_add(_edje_color_class_hash, color_class, cc);
491 else if (r > 255) r = 255;
493 else if (g > 255) g = 255;
495 else if (b > 255) b = 255;
497 else if (a > 255) a = 255;
498 if ((cc->r == r) && (cc->g == g) &&
499 (cc->b == b) && (cc->a == a) &&
500 (cc->r2 == r2) && (cc->g2 == g2) &&
501 (cc->b2 == b2) && (cc->a2 == a2) &&
502 (cc->r3 == r3) && (cc->g3 == g3) &&
503 (cc->b3 == b3) && (cc->a3 == a3))
518 members = eina_hash_find(_edje_color_class_member_hash, color_class);
523 ed = eina_list_data_get(members);
526 #ifdef EDJE_CALC_CACHE
527 ed->all_part_change = 1;
530 _edje_emit(ed, "color_class,set", color_class);
531 members = eina_list_next(members);
537 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)
539 Edje_Color_Class *cc;
544 cc = eina_hash_find(_edje_color_class_hash, color_class);
548 #define X(C) if (C) *C = cc->C
549 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
559 #define X(C) if (C) *C = 0
560 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
571 edje_color_class_del(const char *color_class)
573 Edje_Color_Class *cc;
576 if (!color_class) return;
578 cc = eina_hash_find(_edje_color_class_hash, color_class);
581 eina_hash_del(_edje_color_class_hash, color_class, cc);
582 eina_stringshare_del(cc->name);
585 members = eina_hash_find(_edje_color_class_member_hash, color_class);
590 ed = eina_list_data_get(members);
593 #ifdef EDJE_CALC_CACHE
594 ed->all_part_change = 1;
597 _edje_emit(ed, "color_class,del", color_class);
598 members = eina_list_next(members);
603 edje_color_class_list(void)
605 Edje_List_Foreach_Data fdata;
607 if (!_edje_color_class_member_hash) return NULL;
609 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
610 eina_hash_foreach(_edje_color_class_member_hash,
611 _edje_color_class_list_foreach, &fdata);
617 _edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
619 Edje_List_Foreach_Data *fd;
622 fd->list = eina_list_append(fd->list, strdup(key));
627 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)
630 Edje_Color_Class *cc;
633 ed = _edje_fetch(obj);
634 if ((!ed) || (!color_class)) return EINA_FALSE;
636 else if (r > 255) r = 255;
638 else if (g > 255) g = 255;
640 else if (b > 255) b = 255;
642 else if (a > 255) a = 255;
643 cc = eina_hash_find(ed->color_classes, color_class);
646 if ((cc->r == r) && (cc->g == g) &&
647 (cc->b == b) && (cc->a == a) &&
648 (cc->r2 == r2) && (cc->g2 == g2) &&
649 (cc->b2 == b2) && (cc->a2 == a2) &&
650 (cc->r3 == r3) && (cc->g3 == g3) &&
651 (cc->b3 == b3) && (cc->a3 == a3))
667 #ifdef EDJE_CALC_CACHE
668 ed->all_part_change = 1;
674 color_class = eina_stringshare_add(color_class);
675 if (!color_class) return EINA_FALSE;
676 cc = malloc(sizeof(Edje_Color_Class));
679 eina_stringshare_del(color_class);
682 cc->name = color_class;
695 eina_hash_direct_add(ed->color_classes, cc->name, cc);
698 #ifdef EDJE_CALC_CACHE
699 ed->all_part_change = 1;
702 for (i = 0; i < ed->table_parts_size; i++)
706 rp = ed->table_parts[i];
707 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
708 edje_object_color_class_set(rp->swallowed_object, color_class,
709 r, g, b, a, r2, g2, b2, a2, r3, g3, b3,
714 _edje_emit(ed, "color_class,set", color_class);
719 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)
721 Edje *ed = _edje_fetch(obj);
722 Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
726 #define X(C) if (C) *C = cc->C
727 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
737 #define X(C) if (C) *C = 0
738 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
749 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
752 Edje_Color_Class *cc = NULL;
755 ed = _edje_fetch(obj);
757 if ((!ed) || (!color_class)) return;
759 eina_hash_del(ed->color_classes, color_class, cc);
761 for (i = 0; i < ed->table_parts_size; i++)
765 rp = ed->table_parts[i];
766 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
767 edje_object_color_class_del(rp->swallowed_object, color_class);
772 #ifdef EDJE_CALC_CACHE
773 ed->all_part_change = 1;
776 _edje_emit(ed, "color_class,del", color_class);
780 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
785 if (!text_class) return EINA_FALSE;
786 if (!font) font = "";
788 tc = eina_hash_find(_edje_text_class_hash, text_class);
789 /* Create new text class */
792 tc = calloc(1, sizeof(Edje_Text_Class));
793 if (!tc) return EINA_FALSE;
794 tc->name = eina_stringshare_add(text_class);
800 if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
801 eina_hash_add(_edje_text_class_hash, text_class, tc);
803 tc->font = eina_stringshare_add(font);
808 /* Match and the same, return */
809 if ((tc->size == size) ||
810 (tc->font == font) ||
811 (tc->font && font && !strcmp(tc->font, font)))
814 /* Update the class found */
815 eina_stringshare_replace(&tc->font, font);
819 /* Tell all members of the text class to recalc */
820 members = eina_hash_find(_edje_text_class_member_hash, text_class);
825 ed = eina_list_data_get(members);
828 _edje_textblock_style_all_update(ed);
829 #ifdef EDJE_CALC_CACHE
830 ed->text_part_change = 1;
833 members = eina_list_next(members);
839 edje_text_class_del(const char *text_class)
844 if (!text_class) return;
846 tc = eina_hash_find(_edje_text_class_hash, text_class);
849 eina_hash_del(_edje_text_class_hash, text_class, tc);
850 eina_stringshare_del(tc->name);
851 eina_stringshare_del(tc->font);
854 members = eina_hash_find(_edje_text_class_member_hash, text_class);
859 ed = eina_list_data_get(members);
861 _edje_textblock_style_all_update(ed);
862 #ifdef EDJE_CALC_CACHE
863 ed->text_part_change = 1;
866 members = eina_list_next(members);
871 edje_text_class_list(void)
873 Edje_List_Foreach_Data fdata;
875 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
876 eina_hash_foreach(_edje_text_class_member_hash,
877 _edje_text_class_list_foreach, &fdata);
882 _edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
884 Edje_List_Foreach_Data *fd;
887 fd->list = eina_list_append(fd->list, eina_stringshare_add(key));
892 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
896 Edje_Text_Class *tc = NULL;
899 ed = _edje_fetch(obj);
900 if ((!ed) || (!text_class)) return EINA_FALSE;
902 /* for each text_class in the edje */
903 EINA_LIST_FOREACH(ed->text_classes, l, tc)
905 if ((tc->name) && (!strcmp(tc->name, text_class)))
907 /* Match and the same, return */
908 if ((tc->size == size) &&
909 ((tc->font == font) ||
910 (tc->font && font && !strcmp(tc->font, font))))
913 /* Update new text class properties */
914 eina_stringshare_replace(&tc->font, font);
922 /* No matches, create a new text class */
923 tc = calloc(1, sizeof(Edje_Text_Class));
924 if (!tc) return EINA_FALSE;
925 tc->name = eina_stringshare_add(text_class);
931 tc->font = eina_stringshare_add(font);
933 /* Add to edje's text class list */
934 ed->text_classes = eina_list_append(ed->text_classes, tc);
937 for (i = 0; i < ed->table_parts_size; i++)
941 rp = ed->table_parts[i];
942 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
943 edje_object_text_class_set(rp->swallowed_object, text_class,
949 #ifdef EDJE_CALC_CACHE
950 ed->text_part_change = 1;
952 _edje_textblock_style_all_update(ed);
958 edje_object_part_exists(const Evas_Object *obj, const char *part)
963 ed = _edje_fetch(obj);
964 if ((!ed) || (!part)) return EINA_FALSE;
965 rp = _edje_real_part_recursive_get(ed, part);
966 if (!rp) return EINA_FALSE;
970 EAPI const Evas_Object *
971 edje_object_part_object_get(const Evas_Object *obj, const char *part)
976 ed = _edje_fetch(obj);
977 if ((!ed) || (!part)) return NULL;
979 /* Need to recalc before providing the object. */
982 rp = _edje_real_part_recursive_get(ed, part);
983 if (!rp) return NULL;
988 edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h )
993 ed = _edje_fetch(obj);
994 if ((!ed) || (!part))
1003 /* Need to recalc before providing the object. */
1004 _edje_recalc_do(ed);
1006 rp = _edje_real_part_recursive_get(ed, part);
1023 edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
1027 ed = _edje_fetch(obj);
1029 ed->item_provider.func = func;
1030 ed->item_provider.data = data;
1033 /* FIXDOC: New Function */
1035 edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
1040 ed = _edje_fetch(obj);
1042 ed->text_change.func = func;
1043 ed->text_change.data = data;
1045 for (i = 0; i < ed->table_parts_size; i++)
1049 rp = ed->table_parts[i];
1050 if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object))
1051 edje_object_text_change_cb_set(rp->swallowed_object, func, data);
1056 _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1058 if ((!rp->text.text) && (!text))
1059 return EINA_TRUE; /* nothing to do, no error */
1060 if ((rp->text.text) && (text) &&
1061 (!strcmp(rp->text.text, text)))
1062 return EINA_TRUE; /* nothing to do, no error */
1065 eina_stringshare_del(rp->text.text);
1066 rp->text.text = NULL;
1068 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1069 _edje_entry_text_markup_set(rp, text);
1071 if (text) rp->text.text = eina_stringshare_add(text);
1072 rp->edje->dirty = 1;
1073 rp->edje->recalc_call = 1;
1074 rp->edje->recalc_hints = 1;
1075 #ifdef EDJE_CALC_CACHE
1078 _edje_recalc(rp->edje);
1079 if (rp->edje->text_change.func)
1080 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1085 _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1087 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1088 _edje_entry_text_markup_append(rp, text);
1094 int len_added = strlen(text);
1095 int len_old = strlen(rp->text.text);
1096 new = malloc(len_old + len_added + 1);
1097 memcpy(new, rp->text.text, len_old);
1098 memcpy(new + len_old, text, len_added);
1099 new[len_old + len_added] = '\0';
1100 eina_stringshare_replace(&rp->text.text, new);
1105 eina_stringshare_replace(&rp->text.text, text);
1108 rp->edje->dirty = 1;
1109 rp->edje->recalc_call = 1;
1110 #ifdef EDJE_CALC_CACHE
1113 _edje_recalc(rp->edje);
1114 if (rp->edje->text_change.func)
1115 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1120 edje_object_part_text_style_user_push(Evas_Object *obj, const char *part,
1125 Evas_Textblock_Style *ts;
1127 ed = _edje_fetch(obj);
1128 if ((!ed) || (!part) || (!style)) return;
1129 rp = _edje_real_part_recursive_get(ed, part);
1131 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1133 ts = evas_textblock_style_new();
1134 evas_textblock_style_set(ts, style);
1135 evas_object_textblock_style_user_push(rp->object, ts);
1136 evas_textblock_style_free(ts);
1137 ed->recalc_hints = 1;
1138 #ifdef EDJE_CALC_CACHE
1145 edje_object_part_text_style_user_pop(Evas_Object *obj, const char *part)
1150 ed = _edje_fetch(obj);
1151 if ((!ed) || (!part)) return;
1152 rp = _edje_real_part_recursive_get(ed, part);
1154 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1156 evas_object_textblock_style_user_pop(rp->object);
1157 ed->recalc_hints = 1;
1158 #ifdef EDJE_CALC_CACHE
1165 edje_object_part_text_style_user_peek(const Evas_Object *obj, const char *part)
1169 const Evas_Textblock_Style *ts;
1171 ed = _edje_fetch(obj);
1172 if ((!ed) || (!part)) return NULL;
1173 rp = _edje_real_part_recursive_get(ed, part);
1174 if (!rp) return NULL;
1175 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return NULL;
1177 ts = evas_object_textblock_style_user_peek(rp->object);
1179 return evas_textblock_style_get(ts);
1185 _edje_user_define_string(Edje *ed, const char *part, const char *raw_text)
1187 /* NOTE: This one is tricky, text is referenced in rp->text.text for the life of the
1188 rp. So on edje_object_file_set, we should first ref it, before destroying the old
1190 Edje_User_Defined *eud;
1193 EINA_LIST_FOREACH(ed->user_defined, l, eud)
1194 if (eud->type == EDJE_USER_STRING && !strcmp(eud->part, part))
1198 _edje_user_definition_free(eud);
1201 eud->u.string.text = raw_text;
1205 eud = _edje_user_definition_new(EDJE_USER_STRING, part, ed);
1207 eud->u.string.text = raw_text;
1211 edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
1217 ed = _edje_fetch(obj);
1218 if ((!ed) || (!part)) return EINA_FALSE;
1219 rp = _edje_real_part_recursive_get(ed, part);
1220 if (!rp) return EINA_FALSE;
1221 if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
1222 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE;
1223 r = _edje_object_part_text_raw_set(obj, rp, part, text);
1224 _edje_user_define_string(ed, part, rp->text.text);
1229 edje_object_part_text_get(const Evas_Object *obj, const char *part)
1234 ed = _edje_fetch(obj);
1235 if ((!ed) || (!part)) return NULL;
1237 /* Need to recalc before providing the object. */
1238 _edje_recalc_do(ed);
1240 rp = _edje_real_part_recursive_get(ed, part);
1241 if (!rp) return NULL;
1242 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1243 return _edje_entry_text_get(rp);
1246 if (rp->part->type == EDJE_PART_TYPE_TEXT) return rp->text.text;
1247 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1248 return evas_object_textblock_text_markup_get(rp->object);
1254 edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char *text)
1260 ed = _edje_fetch(obj);
1261 if ((!ed) || (!part)) return EINA_FALSE;
1262 rp = _edje_real_part_recursive_get(ed, part);
1263 if (!rp) return EINA_FALSE;
1264 if ((rp->part->type == EDJE_PART_TYPE_TEXT) && (text))
1267 char *esc_start = NULL, *esc_end = NULL;
1270 sbuf = eina_strbuf_new();
1275 if ((*p == 0) || (esc_end) || (esc_start))
1281 escape = evas_textblock_escape_string_range_get
1282 (esc_start, esc_end + 1);
1283 if (escape) eina_strbuf_append(sbuf, escape);
1284 esc_start = esc_end = NULL;
1288 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1289 eina_strbuf_append_length(sbuf, s, p - s);
1298 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1301 eina_strbuf_append_length(sbuf, s, p - s);
1314 ret = _edje_object_part_text_raw_set
1315 (obj, rp, part, eina_strbuf_string_get(sbuf));
1316 _edje_user_define_string(ed, part, rp->text.text);
1317 eina_strbuf_free(sbuf);
1320 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return EINA_FALSE;
1321 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1322 _edje_user_define_string(ed, part, rp->text.text);
1328 _edje_text_escape(const char *text)
1332 const char *text_end;
1335 if (!text) return NULL;
1337 txt = eina_strbuf_new();
1338 text_len = strlen(text);
1340 text_end = text + text_len;
1341 while (text < text_end)
1344 const char *escaped = evas_textblock_string_escape_get(text, &advance);
1347 eina_strbuf_append_char(txt, text[0]);
1351 eina_strbuf_append(txt, escaped);
1356 ret = eina_strbuf_string_steal(txt);
1357 eina_strbuf_free(txt);
1362 _edje_text_unescape(const char *text)
1366 const char *text_end, *last, *escape_start;
1369 if (!text) return NULL;
1371 txt = eina_strbuf_new();
1372 text_len = strlen(text);
1374 text_end = text + text_len;
1376 escape_start = NULL;
1377 for (; text < text_end; text++)
1391 len = text - escape_start;
1396 eina_strbuf_append_n(txt, str, len);
1398 escape_start = text;
1401 else if ((*text == ';') && (escape_start))
1404 const char *str = evas_textblock_escape_string_range_get(escape_start, text);
1411 len = text + 1 - escape_start;
1414 eina_strbuf_append_n(txt, str, len);
1416 escape_start = NULL;
1421 if (!last && escape_start)
1422 last = escape_start;
1424 if (last && (text > last))
1426 size_t len = text - last;
1427 eina_strbuf_append_n(txt, last, len);
1430 ret = eina_strbuf_string_steal(txt);
1431 eina_strbuf_free(txt);
1436 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
1440 Eina_Bool ret = EINA_FALSE;
1442 ed = _edje_fetch(obj);
1443 if ((!ed) || (!part)) return ret;
1444 rp = _edje_real_part_recursive_get(ed, part);
1445 if (!rp) return ret;
1446 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1447 ret = _edje_object_part_text_raw_set(obj, rp, part, text_to_escape);
1448 else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1450 char *text = _edje_text_escape(text_to_escape);
1452 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1455 _edje_user_define_string(ed, part, rp->text.text);
1460 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
1465 ed = _edje_fetch(obj);
1466 if ((!ed) || (!part)) return NULL;
1468 /* Need to recalc before providing the object. */
1469 _edje_recalc_do(ed);
1471 rp = _edje_real_part_recursive_get(ed, part);
1472 if (!rp) return NULL;
1473 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1475 const char *t = _edje_entry_text_get(rp);
1476 return _edje_text_unescape(t);
1480 if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->text.text);
1481 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1483 const char *t = evas_object_textblock_text_markup_get(rp->object);
1484 return _edje_text_unescape(t);
1491 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
1496 ed = _edje_fetch(obj);
1497 if ((!ed) || (!part)) return NULL;
1498 rp = _edje_real_part_recursive_get(ed, part);
1499 if (!rp) return NULL;
1500 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1501 return _edje_entry_selection_get(rp);
1506 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
1511 ed = _edje_fetch(obj);
1512 if ((!ed) || (!part)) return;
1513 rp = _edje_real_part_recursive_get(ed, part);
1515 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1516 _edje_entry_select_none(rp);
1520 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
1525 ed = _edje_fetch(obj);
1526 if ((!ed) || (!part)) return;
1527 rp = _edje_real_part_recursive_get(ed, part);
1529 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1530 _edje_entry_select_all(rp);
1534 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
1539 ed = _edje_fetch(obj);
1540 if ((!ed) || (!part)) return;
1541 rp = _edje_real_part_recursive_get(ed, part);
1543 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1544 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
1545 _edje_entry_text_markup_insert(rp, text);
1546 rp->edje->dirty = 1;
1547 rp->edje->recalc_call = 1;
1548 rp->edje->recalc_hints = 1;
1549 #ifdef EDJE_CALC_CACHE
1552 _edje_recalc(rp->edje);
1553 if (rp->edje->text_change.func)
1554 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1558 edje_object_part_text_append(Evas_Object *obj, const char *part, const char *text)
1563 ed = _edje_fetch(obj);
1564 if ((!ed) || (!part)) return;
1565 rp = _edje_real_part_recursive_get(ed, part);
1567 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1568 _edje_object_part_text_raw_append(obj, rp, part, text);
1569 rp->edje->dirty = 1;
1570 rp->edje->recalc_call = 1;
1571 rp->edje->recalc_hints = 1;
1572 #ifdef EDJE_CALC_CACHE
1575 _edje_recalc(rp->edje);
1576 if (rp->edje->text_change.func)
1577 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1580 EAPI const Eina_List *
1581 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
1586 ed = _edje_fetch(obj);
1587 if ((!ed) || (!part)) return NULL;
1588 rp = _edje_real_part_recursive_get(ed, part);
1589 if (!rp) return NULL;
1590 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1591 return _edje_entry_anchors_list(rp);
1595 EAPI const Eina_List *
1596 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
1601 ed = _edje_fetch(obj);
1602 if ((!ed) || (!part)) return NULL;
1603 rp = _edje_real_part_recursive_get(ed, part);
1604 if (!rp) return NULL;
1605 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1606 return _edje_entry_anchor_geometry_get(rp, anchor);
1610 EAPI const Eina_List *
1611 edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part)
1616 ed = _edje_fetch(obj);
1617 if ((!ed) || (!part)) return NULL;
1618 rp = _edje_real_part_recursive_get(ed, part);
1619 if (!rp) return NULL;
1620 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1621 return _edje_entry_items_list(rp);
1626 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)
1631 ed = _edje_fetch(obj);
1632 if ((!ed) || (!part)) return EINA_FALSE;
1633 rp = _edje_real_part_recursive_get(ed, part);
1634 if (!rp) return EINA_FALSE;
1635 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1636 return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch);
1641 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)
1646 ed = _edje_fetch(obj);
1651 if ((!ed) || (!part)) return;
1652 rp = _edje_real_part_recursive_get(ed, part);
1654 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1656 _edje_entry_cursor_geometry_get(rp, x, y, w, h);
1657 if (x) *x -= rp->edje->x;
1658 if (y) *y -= rp->edje->y;
1663 edje_object_part_text_user_insert(const Evas_Object *obj, const char *part, const char *text)
1668 ed = _edje_fetch(obj);
1669 if ((!ed) || (!part)) return;
1670 rp = _edje_real_part_recursive_get(ed, part);
1672 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1673 _edje_entry_user_insert(rp, text);
1677 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
1682 ed = _edje_fetch(obj);
1683 if ((!ed) || (!part)) return;
1684 rp = _edje_real_part_recursive_get(ed, part);
1686 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1687 _edje_entry_select_allow_set(rp, allow);
1691 edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
1696 ed = _edje_fetch(obj);
1697 if ((!ed) || (!part)) return;
1698 rp = _edje_real_part_recursive_get(ed, part);
1700 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1701 _edje_entry_select_abort(rp);
1705 edje_object_part_text_select_begin(const Evas_Object *obj, const char *part)
1710 ed = _edje_fetch(obj);
1711 if ((!ed) || (!part)) return;
1712 rp = _edje_real_part_recursive_get(ed, part);
1714 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1715 _edje_entry_select_begin(rp);
1719 edje_object_part_text_select_extend(const Evas_Object *obj, const char *part)
1724 ed = _edje_fetch(obj);
1725 if ((!ed) || (!part)) return;
1726 rp = _edje_real_part_recursive_get(ed, part);
1728 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1729 _edje_entry_select_extend(rp);
1733 edje_object_part_text_imf_context_get(const Evas_Object *obj, const char *part)
1738 ed = _edje_fetch(obj);
1739 if ((!ed) || (!part)) return NULL;
1741 rp = _edje_real_part_recursive_get(ed, (char *)part);
1742 if (!rp) return NULL;
1744 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1745 return _edje_entry_imf_context_get(rp);
1751 edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, Edje_Cursor cur)
1756 ed = _edje_fetch(obj);
1757 if ((!ed) || (!part)) return EINA_FALSE;
1758 rp = _edje_real_part_recursive_get(ed, part);
1759 if (!rp) return EINA_FALSE;
1760 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1762 return _edje_entry_cursor_next(rp, cur);
1768 edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, Edje_Cursor cur)
1773 ed = _edje_fetch(obj);
1774 if ((!ed) || (!part)) return EINA_FALSE;
1775 rp = _edje_real_part_recursive_get(ed, part);
1776 if (!rp) return EINA_FALSE;
1777 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1779 return _edje_entry_cursor_prev(rp, cur);
1785 edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, Edje_Cursor cur)
1790 ed = _edje_fetch(obj);
1791 if ((!ed) || (!part)) return EINA_FALSE;
1792 rp = _edje_real_part_recursive_get(ed, part);
1793 if (!rp) return EINA_FALSE;
1794 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1796 return _edje_entry_cursor_up(rp, cur);
1802 edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, Edje_Cursor cur)
1807 ed = _edje_fetch(obj);
1808 if ((!ed) || (!part)) return EINA_FALSE;
1809 rp = _edje_real_part_recursive_get(ed, part);
1810 if (!rp) return EINA_FALSE;
1811 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1813 return _edje_entry_cursor_down(rp, cur);
1819 edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1824 ed = _edje_fetch(obj);
1825 if ((!ed) || (!part)) return;
1826 rp = _edje_real_part_recursive_get(ed, part);
1828 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1830 _edje_entry_cursor_begin(rp, cur);
1835 edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
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)
1846 _edje_entry_cursor_end(rp, cur);
1851 edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
1856 ed = _edje_fetch(obj);
1857 if ((!ed) || (!part)) return;
1858 rp = _edje_real_part_recursive_get(ed, part);
1860 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1862 _edje_entry_cursor_copy(rp, src, dst);
1867 edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1872 ed = _edje_fetch(obj);
1873 if ((!ed) || (!part)) return;
1874 rp = _edje_real_part_recursive_get(ed, part);
1876 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1878 _edje_entry_cursor_line_begin(rp, cur);
1883 edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1888 ed = _edje_fetch(obj);
1889 if ((!ed) || (!part)) return;
1890 rp = _edje_real_part_recursive_get(ed, part);
1892 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1894 _edje_entry_cursor_line_end(rp, cur);
1899 edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char *part,
1900 Edje_Cursor cur, Evas_Coord x, Evas_Coord y)
1905 ed = _edje_fetch(obj);
1906 if ((!ed) || (!part)) return EINA_FALSE;
1907 rp = _edje_real_part_recursive_get(ed, part);
1908 if (!rp) return EINA_FALSE;
1909 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1911 return _edje_entry_cursor_coord_set(rp, cur, x, y);
1917 edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1922 ed = _edje_fetch(obj);
1923 if ((!ed) || (!part)) return EINA_FALSE;
1924 rp = _edje_real_part_recursive_get(ed, part);
1925 if (!rp) return EINA_FALSE;
1926 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1928 return _edje_entry_cursor_is_format_get(rp, cur);
1934 edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1939 ed = _edje_fetch(obj);
1940 if ((!ed) || (!part)) return 0;
1941 rp = _edje_real_part_recursive_get(ed, part);
1943 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1945 return _edje_entry_cursor_is_visible_format_get(rp, cur);
1951 edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1956 ed = _edje_fetch(obj);
1957 if ((!ed) || (!part)) return NULL;
1958 rp = _edje_real_part_recursive_get(ed, part);
1959 if (!rp) return NULL;
1960 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1962 return _edje_entry_cursor_content_get(rp, cur);
1968 edje_object_part_text_cursor_pos_set(Evas_Object *obj, const char *part, Edje_Cursor cur, int pos)
1973 ed = _edje_fetch(obj);
1974 if ((!ed) || (!part)) return;
1975 rp = _edje_real_part_recursive_get(ed, part);
1977 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1979 _edje_entry_cursor_pos_set(rp, cur, pos);
1984 edje_object_part_text_cursor_pos_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1989 ed = _edje_fetch(obj);
1990 if ((!ed) || (!part)) return 0;
1991 rp = _edje_real_part_recursive_get(ed, part);
1993 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1995 return _edje_entry_cursor_pos_get(rp, cur);
2001 edje_object_part_text_imf_context_reset(const Evas_Object *obj, const char *part)
2006 ed = _edje_fetch(obj);
2007 if ((!ed) || (!part)) return;
2008 rp = _edje_real_part_recursive_get(ed, part);
2010 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2012 _edje_entry_imf_context_reset(rp);
2017 edje_object_part_text_input_panel_layout_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Layout layout)
2022 ed = _edje_fetch(obj);
2023 if ((!ed) || (!part)) return;
2024 rp = _edje_real_part_recursive_get(ed, part);
2026 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2028 _edje_entry_input_panel_layout_set(rp, layout);
2032 EAPI Edje_Input_Panel_Layout
2033 edje_object_part_text_input_panel_layout_get(const Evas_Object *obj, const char *part)
2038 ed = _edje_fetch(obj);
2039 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LAYOUT_INVALID;
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_input_panel_layout_get(rp);
2046 return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2050 edje_object_part_text_autocapital_type_set(Evas_Object *obj, const char *part, Edje_Text_Autocapital_Type autocapital_type)
2055 ed = _edje_fetch(obj);
2056 if ((!ed) || (!part)) return;
2057 rp = _edje_real_part_recursive_get(ed, part);
2059 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2061 _edje_entry_autocapital_type_set(rp, autocapital_type);
2065 EAPI Edje_Text_Autocapital_Type
2066 edje_object_part_text_autocapital_type_get(const Evas_Object *obj, const char *part)
2071 ed = _edje_fetch(obj);
2072 if ((!ed) || (!part)) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2073 rp = _edje_real_part_recursive_get(ed, part);
2074 if (!rp) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2075 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2077 return _edje_entry_autocapital_type_get(rp);
2079 return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2083 edje_object_part_text_prediction_allow_set(Evas_Object *obj, const char *part, Eina_Bool prediction)
2088 ed = _edje_fetch(obj);
2089 if ((!ed) || (!part)) return;
2090 rp = _edje_real_part_recursive_get(ed, part);
2092 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2094 _edje_entry_prediction_allow_set(rp, prediction);
2099 edje_object_part_text_prediction_allow_get(const Evas_Object *obj, const char *part)
2104 ed = _edje_fetch(obj);
2105 if ((!ed) || (!part)) return EINA_FALSE;
2106 rp = _edje_real_part_recursive_get(ed, part);
2107 if (!rp) return EINA_FALSE;
2108 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2110 return _edje_entry_prediction_allow_get(rp);
2116 edje_object_part_text_input_panel_enabled_set(Evas_Object *obj, const char *part, Eina_Bool enabled)
2121 ed = _edje_fetch(obj);
2122 if ((!ed) || (!part)) return;
2123 rp = _edje_real_part_recursive_get(ed, part);
2125 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2127 _edje_entry_input_panel_enabled_set(rp, enabled);
2132 edje_object_part_text_input_panel_enabled_get(const Evas_Object *obj, const char *part)
2137 ed = _edje_fetch(obj);
2138 if ((!ed) || (!part)) return EINA_FALSE;
2139 rp = _edje_real_part_recursive_get(ed, part);
2140 if (!rp) return EINA_FALSE;
2141 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2143 return _edje_entry_input_panel_enabled_get(rp);
2149 edje_object_part_text_input_panel_show(const Evas_Object *obj, const char *part)
2154 ed = _edje_fetch(obj);
2155 if ((!ed) || (!part)) return;
2156 rp = _edje_real_part_recursive_get(ed, part);
2158 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2159 _edje_entry_input_panel_show(rp);
2163 edje_object_part_text_input_panel_hide(const Evas_Object *obj, const char *part)
2168 ed = _edje_fetch(obj);
2169 if ((!ed) || (!part)) return;
2170 rp = _edje_real_part_recursive_get(ed, part);
2172 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2173 _edje_entry_input_panel_hide(rp);
2177 edje_object_part_text_input_panel_language_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Lang lang)
2182 ed = _edje_fetch(obj);
2183 if ((!ed) || (!part)) return;
2184 rp = _edje_real_part_recursive_get(ed, part);
2186 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2188 _edje_entry_input_panel_language_set(rp, lang);
2192 EAPI Edje_Input_Panel_Lang
2193 edje_object_part_text_input_panel_language_get(const Evas_Object *obj, const char *part)
2198 ed = _edje_fetch(obj);
2199 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2200 rp = _edje_real_part_recursive_get(ed, part);
2201 if (!rp) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2202 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2204 return _edje_entry_input_panel_language_get(rp);
2206 return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2210 edje_object_part_text_input_panel_imdata_set(Evas_Object *obj, const char *part, const void *data, int len)
2215 ed = _edje_fetch(obj);
2216 if ((!ed) || (!part)) return;
2217 rp = _edje_real_part_recursive_get(ed, part);
2219 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2221 _edje_entry_input_panel_imdata_set(rp, data, len);
2226 edje_object_part_text_input_panel_imdata_get(const Evas_Object *obj, const char *part, void *data, int *len)
2231 ed = _edje_fetch(obj);
2232 if ((!ed) || (!part)) return;
2233 rp = _edje_real_part_recursive_get(ed, part);
2235 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2237 _edje_entry_input_panel_imdata_get(rp, data, len);
2242 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)
2247 ed = _edje_fetch(obj);
2248 if ((!ed) || (!part)) return;
2249 rp = _edje_real_part_recursive_get(ed, part);
2251 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2253 _edje_entry_input_panel_return_key_type_set(rp, return_key_type);
2257 EAPI Edje_Input_Panel_Return_Key_Type
2258 edje_object_part_text_input_panel_return_key_type_get(const Evas_Object *obj, const char *part)
2263 ed = _edje_fetch(obj);
2264 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2265 rp = _edje_real_part_recursive_get(ed, part);
2266 if (!rp) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2267 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2269 return _edje_entry_input_panel_return_key_type_get(rp);
2271 return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2275 edje_object_part_text_input_panel_return_key_disabled_set(Evas_Object *obj, const char *part, Eina_Bool disabled)
2280 ed = _edje_fetch(obj);
2281 if ((!ed) || (!part)) return;
2282 rp = _edje_real_part_recursive_get(ed, part);
2284 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2286 _edje_entry_input_panel_return_key_disabled_set(rp, disabled);
2291 edje_object_part_text_input_panel_return_key_disabled_get(const Evas_Object *obj, const char *part)
2296 ed = _edje_fetch(obj);
2297 if ((!ed) || (!part)) return EINA_FALSE;
2298 rp = _edje_real_part_recursive_get(ed, part);
2299 if (!rp) return EINA_FALSE;
2300 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2302 return _edje_entry_input_panel_return_key_disabled_get(rp);
2308 edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2311 Edje_Text_Insert_Filter_Callback *cb;
2313 ed = _edje_fetch(obj);
2314 if ((!ed) || (!part)) return;
2315 cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
2316 cb->part = eina_stringshare_add(part);
2318 cb->data = (void *)data;
2319 ed->text_insert_filter_callbacks =
2320 eina_list_append(ed->text_insert_filter_callbacks, cb);
2324 edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
2327 Edje_Text_Insert_Filter_Callback *cb;
2330 ed = _edje_fetch(obj);
2331 if ((!ed) || (!part)) return NULL;
2332 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2334 if ((!strcmp(cb->part, part)) && (cb->func == func))
2336 void *data = cb->data;
2337 ed->text_insert_filter_callbacks =
2338 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2339 eina_stringshare_del(cb->part);
2348 edje_object_text_insert_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2351 Edje_Text_Insert_Filter_Callback *cb;
2354 ed = _edje_fetch(obj);
2355 if ((!ed) || (!part)) return NULL;
2356 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2358 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2361 void *tmp = cb->data;
2362 ed->text_insert_filter_callbacks =
2363 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2364 eina_stringshare_del(cb->part);
2373 edje_object_text_markup_filter_callback_add(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2376 Edje_Markup_Filter_Callback *cb;
2378 ed = _edje_fetch(obj);
2379 if ((!ed) || (!part)) return;
2380 cb = calloc(1, sizeof(Edje_Markup_Filter_Callback));
2381 cb->part = eina_stringshare_add(part);
2383 cb->data = (void *)data;
2384 ed->markup_filter_callbacks =
2385 eina_list_append(ed->markup_filter_callbacks, cb);
2389 edje_object_text_markup_filter_callback_del(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func)
2392 Edje_Markup_Filter_Callback *cb;
2395 ed = _edje_fetch(obj);
2396 if ((!ed) || (!part)) return NULL;
2397 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2399 if ((!strcmp(cb->part, part)) && (cb->func == func))
2401 void *data = cb->data;
2402 ed->markup_filter_callbacks =
2403 eina_list_remove_list(ed->markup_filter_callbacks, l);
2404 eina_stringshare_del(cb->part);
2413 edje_object_text_markup_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2416 Edje_Markup_Filter_Callback *cb;
2419 ed = _edje_fetch(obj);
2420 if ((!ed) || (!part)) return NULL;
2421 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2423 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2426 void *tmp = cb->data;
2427 ed->markup_filter_callbacks =
2428 eina_list_remove_list(ed->markup_filter_callbacks, l);
2429 eina_stringshare_del(cb->part);
2438 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
2442 Edje_User_Defined *eud = NULL;
2444 ed = _edje_fetch(obj);
2445 if ((!ed) || (!part)) return EINA_FALSE;
2447 /* Need to recalc before providing the object. */
2448 // XXX: I guess this is not required, removing for testing purposes
2449 // XXX: uncomment if you see glitches in e17 or others.
2450 // XXX: by Gustavo, January 21th 2009.
2451 // XXX: I got a backtrace with over 30000 calls without this,
2452 // XXX: only with 32px shelves. The problem is probably somewhere else,
2453 // XXX: but until it's found, leave this here.
2454 // XXX: by Sachiel, January 21th 2009, 19:30 UTC
2455 _edje_recalc_do(ed);
2457 rp = evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2460 /* The object is already swallowed somewhere, unswallow it first */
2461 edje_object_part_unswallow(rp->edje->obj, obj_swallow);
2464 rp = _edje_real_part_recursive_get(ed, part);
2467 DBG("cannot swallow part %s: part not exist!", part);
2470 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2472 ERR("cannot swallow part %s: not swallow type!", rp->part->name);
2475 _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE);
2477 if (rp->swallowed_object)
2481 eud = _edje_user_definition_new(EDJE_USER_SWALLOW, part, ed);
2482 evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
2484 else ed->user_defined = eina_list_append(ed->user_defined, eud);
2488 eud->u.swallow.child = obj_swallow;
2496 _recalc_extern_parent(Evas_Object *obj)
2498 Evas_Object *parent;
2501 parent = evas_object_smart_parent_get(obj);
2502 ed = _edje_fetch(parent);
2505 ed->recalc_call = 1; // ZZZ: ???
2510 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
2514 evas_object_size_hint_min_set(obj, minw, minh);
2515 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2518 rp->swallow_params.min.w = minw;
2519 rp->swallow_params.min.h = minh;
2521 _recalc_extern_parent(obj);
2526 edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
2530 evas_object_size_hint_max_set(obj, maxw, maxh);
2531 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2534 rp->swallow_params.max.w = maxw;
2535 rp->swallow_params.max.h = maxh;
2537 _recalc_extern_parent(obj);
2542 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
2545 Evas_Aspect_Control asp;
2547 asp = EVAS_ASPECT_CONTROL_NONE;
2550 case EDJE_ASPECT_CONTROL_NONE: asp = EVAS_ASPECT_CONTROL_NONE; break;
2551 case EDJE_ASPECT_CONTROL_NEITHER: asp = EVAS_ASPECT_CONTROL_NEITHER; break;
2552 case EDJE_ASPECT_CONTROL_HORIZONTAL: asp = EVAS_ASPECT_CONTROL_HORIZONTAL; break;
2553 case EDJE_ASPECT_CONTROL_VERTICAL: asp = EVAS_ASPECT_CONTROL_VERTICAL; break;
2554 case EDJE_ASPECT_CONTROL_BOTH: asp = EVAS_ASPECT_CONTROL_BOTH; break;
2559 evas_object_size_hint_aspect_set(obj, asp, aw, ah);
2560 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2563 rp->swallow_params.aspect.mode = aspect;
2564 rp->swallow_params.aspect.w = aw;
2565 rp->swallow_params.aspect.h = ah;
2566 _recalc_extern_parent(obj);
2570 struct edje_box_layout_builtin {
2572 Evas_Object_Box_Layout cb;
2575 static Evas_Object_Box_Layout
2576 _edje_box_layout_builtin_find(const char *name)
2578 const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
2579 {"horizontal", evas_object_box_layout_horizontal},
2580 {"horizontal_flow", evas_object_box_layout_flow_horizontal},
2581 {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
2582 {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
2583 {"stack", evas_object_box_layout_stack},
2584 {"vertical", evas_object_box_layout_vertical},
2585 {"vertical_flow", evas_object_box_layout_flow_vertical},
2586 {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
2587 {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
2590 const struct edje_box_layout_builtin *base;
2595 base = _edje_box_layout_builtin + 0;
2598 base = _edje_box_layout_builtin + 4;
2601 base = _edje_box_layout_builtin + 5;
2607 for (; (base->name) && (base->name[0] == name[0]); base++)
2608 if (strcmp(base->name, name) == 0)
2614 static Eina_Rbtree_Direction
2615 _edje_box_layout_external_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right, __UNUSED__ void *data)
2617 Edje_Box_Layout *l = (Edje_Box_Layout *)left;
2618 Edje_Box_Layout *r = (Edje_Box_Layout *)right;
2620 if (strcmp(l->name, r->name) < 0)
2621 return EINA_RBTREE_RIGHT;
2623 return EINA_RBTREE_LEFT;
2627 _edje_box_layout_external_find_cmp(const Eina_Rbtree *node, const void *key, __UNUSED__ int length, __UNUSED__ void *data)
2629 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2630 return strcmp(key, l->name);
2633 static Edje_Box_Layout *
2634 _edje_box_layout_external_find(const char *name)
2636 return (Edje_Box_Layout *)eina_rbtree_inline_lookup
2637 (_edje_box_layout_registry, name, 0, _edje_box_layout_external_find_cmp,
2642 _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void (**free_data)(void *data))
2644 const Edje_Box_Layout *l;
2646 if (!name) return EINA_FALSE;
2648 *cb = _edje_box_layout_builtin_find(name);
2656 l = _edje_box_layout_external_find(name);
2657 if (!l) return EINA_FALSE;
2660 *free_data = l->layout_data_free;
2661 if (l->layout_data_get)
2662 *data = l->layout_data_get(l->data);
2670 _edje_box_layout_external_free(Eina_Rbtree *node, __UNUSED__ void *data)
2672 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2674 if (l->data && l->free_data)
2675 l->free_data(l->data);
2679 static Edje_Box_Layout *
2680 _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)
2685 name_len = strlen(name) + 1;
2686 l = malloc(sizeof(Edje_Box_Layout) + name_len);
2687 if (!l) return NULL;
2690 l->layout_data_get = layout_data_get;
2691 l->layout_data_free = layout_data_free;
2692 l->free_data = free_data;
2695 memcpy(l->name, name, name_len);
2701 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)
2707 if (_edje_box_layout_builtin_find(name))
2709 ERR("Cannot register layout '%s': would override builtin!",
2712 if (data && free_data) free_data(data);
2716 l = _edje_box_layout_external_find(name);
2721 if (data && free_data) free_data(data);
2725 l = _edje_box_layout_external_new
2726 (name, func, layout_data_get, layout_data_free, free_data, data);
2730 _edje_box_layout_registry = eina_rbtree_inline_insert
2731 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2732 _edje_box_layout_external_node_cmp, NULL);
2738 if (l->data && l->free_data) l->free_data(l->data);
2741 l->layout_data_get = layout_data_get;
2742 l->layout_data_free = layout_data_free;
2743 l->free_data = free_data;
2748 if (data && free_data) free_data(data);
2750 _edje_box_layout_registry = eina_rbtree_inline_remove
2751 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2752 _edje_box_layout_external_node_cmp, NULL);
2753 _edje_box_layout_external_free((Eina_Rbtree *)l, NULL);
2759 edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
2763 if (!obj_swallow) return;
2765 rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2768 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2770 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
2774 if (rp->swallowed_object == obj_swallow)
2776 Edje_User_Defined *eud;
2783 ed = _edje_fetch(obj);
2786 ERR("edje_object_part_unswallow called on a non Edje object ('%s').",
2787 evas_object_type_get(obj));
2791 EINA_LIST_FOREACH(ed->user_defined, l, eud)
2792 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj_swallow)
2794 _edje_user_definition_free(eud);
2800 _edje_real_part_swallow_clear(rp);
2801 rp->swallowed_object = NULL;
2802 rp->swallow_params.min.w = 0;
2803 rp->swallow_params.min.h = 0;
2804 rp->swallow_params.max.w = 0;
2805 rp->swallow_params.max.h = 0;
2806 rp->edje->dirty = 1;
2807 rp->edje->recalc_call = 1;
2808 #ifdef EDJE_CALC_CACHE
2811 _edje_recalc_do(rp->edje);
2817 edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
2822 ed = _edje_fetch(obj);
2823 if ((!ed) || (!part)) return NULL;
2825 /* Need to recalc before providing the object. */
2826 _edje_recalc_do(ed);
2828 rp = _edje_real_part_recursive_get(ed, part);
2829 if (!rp) return NULL;
2830 return rp->swallowed_object;
2834 edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2838 ed = _edje_fetch(obj);
2839 if ((!ed) || (!ed->collection))
2841 if (minw) *minw = 0;
2842 if (minh) *minh = 0;
2845 if (minw) *minw = ed->collection->prop.min.w;
2846 if (minh) *minh = ed->collection->prop.min.h;
2850 edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
2854 ed = _edje_fetch(obj);
2855 if ((!ed) || (!ed->collection))
2857 if (maxw) *maxw = 0;
2858 if (maxh) *maxh = 0;
2862 /* Need to recalc before providing the object. */
2863 _edje_recalc_do(ed);
2865 if (ed->collection->prop.max.w == 0)
2867 /* XXX TODO: convert maxw to 0, fix things that break. */
2868 if (maxw) *maxw = EDJE_INF_MAX_W;
2872 if (maxw) *maxw = ed->collection->prop.max.w;
2874 if (ed->collection->prop.max.h == 0)
2876 /* XXX TODO: convert maxh to 0, fix things that break. */
2877 if (maxh) *maxh = EDJE_INF_MAX_H;
2881 if (maxh) *maxh = ed->collection->prop.max.h;
2886 edje_object_calc_force(Evas_Object *obj)
2891 ed = _edje_fetch(obj);
2894 #ifdef EDJE_CALC_CACHE
2895 ed->all_part_change = 1;
2898 pf2 = _edje_freeze_val;
2901 _edje_freeze_val = 0;
2904 _edje_recalc_do(ed);
2907 _edje_freeze_val = pf2;
2911 edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2913 edje_object_size_min_restricted_calc(obj, minw, minh, 0, 0);
2917 edje_object_parts_extends_calc(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
2920 Evas_Coord xx1 = INT_MAX, yy1 = INT_MAX;
2921 Evas_Coord xx2 = 0, yy2 = 0;
2924 ed = _edje_fetch(obj);
2936 /* Need to recalc before providing the object. */
2938 _edje_recalc_do(ed);
2940 for (i = 0; i < ed->table_parts_size; i++)
2943 Evas_Coord rpx1, rpy1;
2944 Evas_Coord rpx2, rpy2;
2946 rp = ed->table_parts[i];
2950 rpx2 = rpx1 + rp->w;
2951 rpy2 = rpy1 + rp->h;
2953 if (xx1 > rpx1) xx1 = rpx1;
2954 if (yy1 > rpy1) yy1 = rpy1;
2955 if (xx2 < rpx2) xx2 = rpx2;
2956 if (yy2 < rpy2) yy2 = rpy2;
2963 if (w) *w = xx2 - xx1;
2964 if (h) *h = yy2 - yy1;
2970 edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh, Evas_Coord restrictedw, Evas_Coord restrictedh)
2977 Edje_Real_Part *pep = NULL;
2978 Eina_Bool has_non_fixed_tb = EINA_FALSE;
2980 ed = _edje_fetch(obj);
2981 if ((!ed) || (!ed->collection))
2983 if (minw) *minw = restrictedw;
2984 if (minh) *minh = restrictedh;
2993 ed->w = restrictedw;
2994 ed->h = restrictedh;
3005 #ifdef EDJE_CALC_CACHE
3006 ed->all_part_change = 1;
3008 _edje_recalc_do(ed);
3015 has_non_fixed_tb = EINA_FALSE;
3016 for (i = 0; i < ed->table_parts_size; i++)
3022 ep = ed->table_parts[i];
3023 w = ep->w - ep->req.w;
3024 h = ep->h - ep->req.h;
3026 if (ep->chosen_description)
3028 if (!ep->chosen_description->fixed.w)
3030 if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
3033 evas_object_textblock_size_formatted_get(ep->object,
3040 has_non_fixed_tb = EINA_TRUE;
3050 if (!ep->chosen_description->fixed.h)
3052 if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
3053 (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
3064 if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
3066 has_non_fixed_tb = EINA_TRUE;
3074 if (ed->w < restrictedw) ed->w = restrictedw;
3079 if (ed->h < restrictedh) ed->h = restrictedh;
3081 if ((ed->w > 4000) || (ed->h > 4000))
3083 /* Only print it if we have a non-fixed textblock.
3084 * We should possibly avoid all of this if in this case, but in
3085 * the meanwhile, just doing this. */
3086 if (!has_non_fixed_tb)
3089 ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
3090 ed->path, ed->group, pep->part->name);
3092 ERR("file %s, group %s overflowed 4000x4000 with minimum size of %dx%d. Continuing discarding faulty parts.",
3093 ed->path, ed->group, ed->w, ed->h);
3107 if (minw) *minw = ed->min.w;
3108 if (minh) *minh = ed->min.h;
3113 #ifdef EDJE_CALC_CACHE
3114 ed->all_part_change = 1;
3120 /* FIXME: Correctly return other states */
3122 edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val_ret)
3127 ed = _edje_fetch(obj);
3128 if ((!ed) || (!part))
3130 if (val_ret) *val_ret = 0;
3134 /* Need to recalc before providing the object. */
3135 _edje_recalc_do(ed);
3137 rp = _edje_real_part_recursive_get(ed, part);
3140 if (val_ret) *val_ret = 0;
3141 INF("part not found");
3144 if (rp->chosen_description)
3146 if (val_ret) *val_ret = rp->chosen_description->state.value;
3147 if (rp->chosen_description->state.name)
3148 return rp->chosen_description->state.name;
3153 if (rp->param1.description)
3155 if (val_ret) *val_ret = rp->param1.description->state.value;
3156 if (rp->param1.description->state.name)
3157 return rp->param1.description->state.name;
3161 if (val_ret) *val_ret = 0;
3166 edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
3171 ed = _edje_fetch(obj);
3172 if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
3174 /* Need to recalc before providing the object. */
3175 _edje_recalc_do(ed);
3177 rp = _edje_real_part_recursive_get(ed, part);
3178 if (!rp) return EDJE_DRAG_DIR_NONE;
3179 if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
3180 else if (rp->part->dragable.x) return EDJE_DRAG_DIR_X;
3181 else if (rp->part->dragable.y) return EDJE_DRAG_DIR_Y;
3182 return EDJE_DRAG_DIR_NONE;
3186 edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
3190 Edje_User_Defined *eud;
3193 ed = _edje_fetch(obj);
3194 if ((!ed) || (!part)) return EINA_FALSE;
3195 rp = _edje_real_part_recursive_get(ed, part);
3196 if (!rp) return EINA_FALSE;
3197 if (!rp->drag) return EINA_FALSE;
3198 if (rp->drag->down.count > 0) return EINA_FALSE;
3200 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3201 if (eud->type == EDJE_USER_DRAG_VALUE && !strcmp(part, eud->part))
3203 eud->u.drag_position.x = dx;
3204 eud->u.drag_position.y = dy;
3209 eud = _edje_user_definition_new(EDJE_USER_DRAG_VALUE, part, ed);
3212 eud->u.drag_position.x = dx;
3213 eud->u.drag_position.y = dy;
3217 if (rp->part->dragable.confine_id != -1)
3219 dx = CLAMP(dx, 0.0, 1.0);
3220 dy = CLAMP(dy, 0.0, 1.0);
3222 if (rp->part->dragable.x < 0) dx = 1.0 - dx;
3223 if (rp->part->dragable.y < 0) dy = 1.0 - dy;
3224 if ((rp->drag->val.x == FROM_DOUBLE(dx)) && (rp->drag->val.y == FROM_DOUBLE(dy))) return EINA_TRUE;
3225 rp->drag->val.x = FROM_DOUBLE(dx);
3226 rp->drag->val.y = FROM_DOUBLE(dy);
3227 #ifdef EDJE_CALC_CACHE
3230 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3231 _edje_emit(rp->edje, "drag,set", rp->part->name);
3235 /* FIXME: Should this be x and y instead of dx/dy? */
3237 edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3243 ed = _edje_fetch(obj);
3244 if ((!ed) || (!part))
3251 /* Need to recalc before providing the object. */
3252 _edje_recalc_do(ed);
3254 rp = _edje_real_part_recursive_get(ed, part);
3255 if (!rp || !rp->drag)
3261 ddx = TO_DOUBLE(rp->drag->val.x);
3262 ddy = TO_DOUBLE(rp->drag->val.y);
3263 if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
3264 if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
3271 edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
3275 Edje_User_Defined *eud;
3278 ed = _edje_fetch(obj);
3279 if ((!ed) || (!part)) return EINA_FALSE;
3280 rp = _edje_real_part_recursive_get(ed, part);
3281 if (!rp) return EINA_FALSE;
3282 if (!rp->drag) return EINA_FALSE;
3284 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3285 if (eud->type == EDJE_USER_DRAG_SIZE && !strcmp(part, eud->part))
3287 eud->u.drag_size.w = dw;
3288 eud->u.drag_size.h = dh;
3293 eud = _edje_user_definition_new(EDJE_USER_DRAG_SIZE, part, ed);
3296 eud->u.drag_size.w = dw;
3297 eud->u.drag_size.h = dh;
3301 if (dw < 0.0) dw = 0.0;
3302 else if (dw > 1.0) dw = 1.0;
3303 if (dh < 0.0) dh = 0.0;
3304 else if (dh > 1.0) dh = 1.0;
3305 if ((rp->drag->size.x == FROM_DOUBLE(dw)) && (rp->drag->size.y == FROM_DOUBLE(dh))) return EINA_TRUE;
3306 rp->drag->size.x = FROM_DOUBLE(dw);
3307 rp->drag->size.y = FROM_DOUBLE(dh);
3308 rp->edje->dirty = 1;
3309 rp->edje->recalc_call = 1;
3310 #ifdef EDJE_CALC_CACHE
3313 _edje_recalc(rp->edje);
3318 edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double *dw, double *dh)
3323 ed = _edje_fetch(obj);
3324 if ((!ed) || (!part))
3331 /* Need to recalc before providing the object. */
3332 _edje_recalc_do(ed);
3334 rp = _edje_real_part_recursive_get(ed, part);
3335 if (!rp || !rp->drag)
3341 if (dw) *dw = TO_DOUBLE(rp->drag->size.x);
3342 if (dh) *dh = TO_DOUBLE(rp->drag->size.y);
3347 edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
3351 Edje_User_Defined *eud;
3354 ed = _edje_fetch(obj);
3355 if ((!ed) || (!part)) return EINA_FALSE;
3356 rp = _edje_real_part_recursive_get(ed, part);
3357 if (!rp) return EINA_FALSE;
3358 if (!rp->drag) return EINA_FALSE;
3360 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3361 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3363 eud->u.drag_position.x = dx;
3364 eud->u.drag_position.y = dy;
3369 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3372 eud->u.drag_position.x = dx;
3373 eud->u.drag_position.y = dy;
3377 if (dx < 0.0) dx = 0.0;
3378 else if (dx > 1.0) dx = 1.0;
3379 if (dy < 0.0) dy = 0.0;
3380 else if (dy > 1.0) dy = 1.0;
3381 rp->drag->step.x = FROM_DOUBLE(dx);
3382 rp->drag->step.y = FROM_DOUBLE(dy);
3383 #ifdef EDJE_CALC_CACHE
3390 edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3395 ed = _edje_fetch(obj);
3396 if ((!ed) || (!part))
3403 /* Need to recalc before providing the object. */
3404 _edje_recalc_do(ed);
3406 rp = _edje_real_part_recursive_get(ed, part);
3407 if (!rp || !rp->drag)
3413 if (dx) *dx = TO_DOUBLE(rp->drag->step.x);
3414 if (dy) *dy = TO_DOUBLE(rp->drag->step.y);
3419 edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
3423 Edje_User_Defined *eud;
3426 ed = _edje_fetch(obj);
3427 if ((!ed) || (!part)) return EINA_FALSE;
3428 rp = _edje_real_part_recursive_get(ed, part);
3429 if (!rp) return EINA_FALSE;
3430 if (!rp->drag) return EINA_FALSE;
3432 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3433 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3435 eud->u.drag_position.x = dx;
3436 eud->u.drag_position.y = dy;
3441 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3444 eud->u.drag_position.x = dx;
3445 eud->u.drag_position.y = dy;
3449 if (dx < 0.0) dx = 0.0;
3450 else if (dx > 1.0) dx = 1.0;
3451 if (dy < 0.0) dy = 0.0;
3452 else if (dy > 1.0) dy = 1.0;
3453 rp->drag->page.x = FROM_DOUBLE(dx);
3454 rp->drag->page.y = FROM_DOUBLE(dy);
3455 #ifdef EDJE_CALC_CACHE
3462 edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3467 ed = _edje_fetch(obj);
3468 if ((!ed) || (!part))
3475 /* Need to recalc before providing the object. */
3476 _edje_recalc_do(ed);
3478 rp = _edje_real_part_recursive_get(ed, part);
3479 if (!rp || !rp->drag)
3485 if (dx) *dx = TO_DOUBLE(rp->drag->page.x);
3486 if (dy) *dy = TO_DOUBLE(rp->drag->page.y);
3491 edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double dy)
3496 Edje_User_Defined *eud;
3499 ed = _edje_fetch(obj);
3500 if ((!ed) || (!part)) return EINA_FALSE;
3501 rp = _edje_real_part_recursive_get(ed, part);
3502 if (!rp) return EINA_FALSE;
3503 if (!rp->drag) return EINA_FALSE;
3504 if (rp->drag->down.count > 0) return EINA_FALSE;
3506 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3507 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3509 eud->u.drag_position.x = dx;
3510 eud->u.drag_position.y = dy;
3515 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3518 eud->u.drag_position.x = dx;
3519 eud->u.drag_position.y = dy;
3523 px = rp->drag->val.x;
3524 py = rp->drag->val.y;
3525 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx),
3526 MUL(rp->drag->step.x, rp->part->dragable.x)));
3527 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy),
3528 MUL(rp->drag->step.y, rp->part->dragable.y)));
3529 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3530 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3531 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3532 #ifdef EDJE_CALC_CACHE
3535 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3536 _edje_emit(rp->edje, "drag,step", rp->part->name);
3541 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
3546 Edje_User_Defined *eud;
3549 ed = _edje_fetch(obj);
3550 if ((!ed) || (!part)) return EINA_FALSE;
3551 rp = _edje_real_part_recursive_get(ed, part);
3552 if (!rp) return EINA_FALSE;
3553 if (!rp->drag) return EINA_FALSE;
3554 if (rp->drag->down.count > 0) return EINA_FALSE;
3556 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3557 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3559 eud->u.drag_position.x = dx;
3560 eud->u.drag_position.y = dy;
3565 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3568 eud->u.drag_position.x = dx;
3569 eud->u.drag_position.y = dy;
3573 px = rp->drag->val.x;
3574 py = rp->drag->val.y;
3575 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x)));
3576 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy), MUL(rp->drag->page.y, rp->part->dragable.y)));
3577 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3578 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3579 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3580 #ifdef EDJE_CALC_CACHE
3583 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3584 _edje_emit(rp->edje, "drag,page", rp->part->name);
3589 _edje_box_init(void)
3595 _edje_box_shutdown(void)
3597 if (!_edje_box_layout_registry)
3601 (_edje_box_layout_registry, _edje_box_layout_external_free, NULL);
3602 _edje_box_layout_registry = NULL;
3606 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
3612 ed = _edje_fetch(obj);
3613 if ((!ed) || (!part) || (!child)) return EINA_FALSE;
3615 rp = _edje_real_part_recursive_get(ed, part);
3616 if (!rp) return EINA_FALSE;
3617 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3619 r = _edje_real_part_box_append(rp, child);
3623 Edje_User_Defined *eud;
3625 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3627 eud->u.box.child = child;
3628 eud->u.box.index = -1;
3630 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3636 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
3642 ed = _edje_fetch(obj);
3643 if ((!ed) || (!part)) return EINA_FALSE;
3645 rp = _edje_real_part_recursive_get(ed, part);
3646 if (!rp) return EINA_FALSE;
3647 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3649 r = _edje_real_part_box_prepend(rp, child);
3653 Edje_User_Defined *eud;
3655 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3657 eud->u.box.child = child;
3659 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3665 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
3671 ed = _edje_fetch(obj);
3672 if ((!ed) || (!part)) return EINA_FALSE;
3674 rp = _edje_real_part_recursive_get(ed, part);
3675 if (!rp) return EINA_FALSE;
3676 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3678 r = _edje_real_part_box_insert_before(rp, child, reference);
3682 Edje_User_Defined *eud;
3684 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3686 eud->u.box.child = child;
3688 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3694 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
3700 ed = _edje_fetch(obj);
3701 if ((!ed) || (!part)) return EINA_FALSE;
3703 rp = _edje_real_part_recursive_get(ed, part);
3704 if (!rp) return EINA_FALSE;
3705 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3707 r = _edje_real_part_box_insert_at(rp, child, pos);
3711 Edje_User_Defined *eud;
3713 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3715 eud->u.box.child = child;
3717 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3723 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
3729 ed = _edje_fetch(obj);
3730 if ((!ed) || (!part)) return NULL;
3732 rp = _edje_real_part_recursive_get(ed, part);
3733 if (!rp) return NULL;
3734 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3736 r = _edje_real_part_box_remove(rp, child);
3740 Edje_User_Defined *eud;
3743 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3744 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == child && !strcmp(eud->part, part))
3746 _edje_user_definition_free(eud);
3754 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
3760 ed = _edje_fetch(obj);
3761 if ((!ed) || (!part)) return NULL;
3763 rp = _edje_real_part_recursive_get(ed, part);
3764 if (!rp) return NULL;
3765 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3767 r = _edje_real_part_box_remove_at(rp, pos);
3771 Edje_User_Defined *eud;
3774 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3775 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == r && !strcmp(eud->part, part))
3777 _edje_user_definition_free(eud);
3785 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
3791 ed = _edje_fetch(obj);
3792 if ((!ed) || (!part)) return EINA_FALSE;
3794 rp = _edje_real_part_recursive_get(ed, part);
3795 if (!rp) return EINA_FALSE;
3796 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3798 r = _edje_real_part_box_remove_all(rp, clear);
3801 Edje_User_Defined *eud;
3804 EINA_LIST_FOREACH_SAFE(ed->user_defined, l, ll, eud)
3805 if (eud->type == EDJE_USER_BOX_PACK && !strcmp(eud->part, part))
3807 _edje_user_definition_free(eud);
3815 edje_object_access_part_list_get(const Evas_Object *obj)
3818 Eina_List *access_parts = NULL;
3820 ed = _edje_fetch(obj);
3821 if ((!ed)) return NULL;
3824 for (i = 0; i < ed->table_parts_size; i++)
3827 rp = ed->table_parts[i];
3828 if (rp->part->access)
3829 access_parts = eina_list_append(access_parts, rp->part->name);
3832 return access_parts;
3836 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
3838 Edje_Real_Part *rp = data;
3840 rp->edje->dirty = 1;
3841 rp->edje->recalc_call = 1;
3842 #ifdef EDJE_CALC_CACHE
3845 _edje_recalc(rp->edje);
3849 _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
3851 evas_object_event_callback_add
3852 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3854 rp->edje->dirty = 1;
3855 rp->edje->recalc_call = 1;
3856 #ifdef EDJE_CALC_CACHE
3859 _edje_recalc(rp->edje);
3863 _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
3865 evas_object_event_callback_del_full
3866 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3868 rp->edje->dirty = 1;
3869 rp->edje->recalc_call = 1;
3870 #ifdef EDJE_CALC_CACHE
3873 _edje_recalc(rp->edje);
3877 _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj)
3879 Evas_Object_Box_Option *opt;
3881 opt = evas_object_box_append(rp->object, child_obj);
3882 if (!opt) return EINA_FALSE;
3884 if (!_edje_box_layout_add_child(rp, child_obj))
3886 evas_object_box_remove(rp->object, child_obj);
3890 _edje_box_child_add(rp, child_obj);
3896 _edje_real_part_box_prepend(Edje_Real_Part *rp, Evas_Object *child_obj)
3898 Evas_Object_Box_Option *opt;
3900 opt = evas_object_box_prepend(rp->object, child_obj);
3901 if (!opt) return EINA_FALSE;
3903 if (!_edje_box_layout_add_child(rp, child_obj))
3905 evas_object_box_remove(rp->object, child_obj);
3909 _edje_box_child_add(rp, child_obj);
3915 _edje_real_part_box_insert_before(Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref)
3917 Evas_Object_Box_Option *opt;
3919 opt = evas_object_box_insert_before(rp->object, child_obj, ref);
3920 if (!opt) return EINA_FALSE;
3922 if (!_edje_box_layout_add_child(rp, child_obj))
3924 evas_object_box_remove(rp->object, child_obj);
3928 _edje_box_child_add(rp, child_obj);
3934 _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned int pos)
3936 Evas_Object_Box_Option *opt;
3938 opt = evas_object_box_insert_at(rp->object, child_obj, pos);
3939 if (!opt) return EINA_FALSE;
3941 if (!_edje_box_layout_add_child(rp, child_obj))
3943 evas_object_box_remove(rp->object, child_obj);
3947 _edje_box_child_add(rp, child_obj);
3953 _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj)
3955 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
3956 if (!evas_object_box_remove(rp->object, child_obj)) return NULL;
3957 _edje_box_layout_remove_child(rp, child_obj);
3958 _edje_box_child_remove(rp, child_obj);
3963 _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
3965 Evas_Object_Box_Option *opt;
3966 Evas_Object_Box_Data *priv;
3967 Evas_Object *child_obj;
3969 priv = evas_object_smart_data_get(rp->object);
3970 opt = eina_list_nth(priv->children, pos);
3971 if (!opt) return NULL;
3972 child_obj = opt->obj;
3973 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
3974 if (!evas_object_box_remove_at(rp->object, pos)) return NULL;
3975 _edje_box_layout_remove_child(rp, child_obj);
3976 _edje_box_child_remove(rp, child_obj);
3981 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
3983 Eina_List *children;
3986 children = evas_object_box_children_get(rp->object);
3989 Evas_Object *child_obj = children->data;
3990 if (evas_object_data_get(child_obj, "\377 edje.box_item"))
3994 _edje_box_layout_remove_child(rp, child_obj);
3995 _edje_box_child_remove(rp, child_obj);
3996 if (!evas_object_box_remove_at(rp->object, i))
3999 evas_object_del(child_obj);
4001 children = eina_list_remove_list(children, children);
4007 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child, void *einfo __UNUSED__)
4009 Edje_User_Defined *eud;
4011 Edje_Real_Part *rp = data;
4013 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4014 if (rp->part->type == EDJE_PART_TYPE_BOX)
4016 if (eud->type == EDJE_USER_BOX_PACK &&
4017 eud->u.box.child == child &&
4018 !strcmp(rp->part->name, eud->part))
4020 _edje_user_definition_free(eud);
4024 else if (rp->part->type == EDJE_PART_TYPE_TABLE)
4026 if (eud->type == EDJE_USER_TABLE_PACK &&
4027 eud->u.table.child == child &&
4028 !strcmp(rp->part->name, eud->part))
4030 _edje_user_definition_free(eud);
4035 rp->edje->dirty = 1;
4036 rp->edje->recalc_call = 1;
4037 #ifdef EDJE_CALC_CACHE
4040 _edje_recalc(rp->edje);
4044 _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
4046 evas_object_event_callback_add
4047 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4049 rp->edje->dirty = 1;
4050 rp->edje->recalc_call = 1;
4051 #ifdef EDJE_CALC_CACHE
4054 _edje_recalc(rp->edje);
4058 _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
4060 evas_object_event_callback_del_full
4061 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4063 rp->edje->dirty = 1;
4064 rp->edje->recalc_call = 1;
4065 #ifdef EDJE_CALC_CACHE
4068 _edje_recalc(rp->edje);
4072 edje_object_part_table_child_get(const Evas_Object *obj, const char *part, unsigned int col, unsigned int row)
4077 ed = _edje_fetch(obj);
4078 if ((!ed) || (!part)) return NULL;
4080 rp = _edje_real_part_recursive_get(ed, part);
4081 if (!rp) return NULL;
4082 if (rp->part->type != EDJE_PART_TYPE_TABLE) return NULL;
4084 return evas_object_table_child_get(rp->object, col, row);
4088 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)
4092 Edje_User_Defined *eud;
4095 ed = _edje_fetch(obj);
4096 if ((!ed) || (!part)) return EINA_FALSE;
4098 rp = _edje_real_part_recursive_get(ed, part);
4099 if (!rp) return EINA_FALSE;
4100 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4102 r = _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
4105 eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed);
4108 eud->u.table.child = child_obj;
4109 eud->u.table.col = col;
4110 eud->u.table.row = row;
4111 eud->u.table.colspan = colspan;
4112 eud->u.table.rowspan = rowspan;
4114 evas_object_event_callback_add(child_obj, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
4120 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
4126 ed = _edje_fetch(obj);
4127 if ((!ed) || (!part)) return EINA_FALSE;
4129 rp = _edje_real_part_recursive_get(ed, part);
4130 if (!rp) return EINA_FALSE;
4131 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4133 r = _edje_real_part_table_unpack(rp, child_obj);
4137 Edje_User_Defined *eud;
4140 EINA_LIST_FOREACH(ed->user_defined, l, eud)
4141 if (eud->type == EDJE_USER_TABLE_PACK &&
4142 eud->u.table.child == child_obj &&
4143 !strcmp(part, eud->part))
4145 _edje_user_definition_free(eud);
4154 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
4159 ed = _edje_fetch(obj);
4160 if ((!ed) || (!part)) return EINA_FALSE;
4162 rp = _edje_real_part_recursive_get(ed, part);
4163 if (!rp) return EINA_FALSE;
4164 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4166 evas_object_table_col_row_size_get(rp->object, cols, rows);
4171 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
4176 ed = _edje_fetch(obj);
4177 if ((!ed) || (!part)) return EINA_FALSE;
4179 rp = _edje_real_part_recursive_get(ed, part);
4180 if (!rp) return EINA_FALSE;
4181 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4183 _edje_real_part_table_clear(rp, clear);
4188 _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
4190 Edje_Perspective *ps = data;
4193 EINA_LIST_FREE(ps->users, o)
4197 ed = evas_object_smart_data_get(o);
4201 ed->recalc_call = 1;
4202 _edje_recalc_do(ed);
4207 EAPI Edje_Perspective *
4208 edje_perspective_new(Evas *e)
4210 Edje_Perspective *ps;
4211 Evas_Coord vx, vy, vw, vh;
4213 if (!e) return NULL;
4214 ps = calloc(1, sizeof(Edje_Perspective));
4215 ps->obj = evas_object_rectangle_add(e);
4216 evas_object_data_set(ps->obj, "_edje_perspective", ps);
4217 evas_object_event_callback_add(ps->obj, EVAS_CALLBACK_DEL, _edje_perspective_obj_del, ps);
4218 evas_output_viewport_get(e, &vx, &vy, &vw, &vh);
4220 ps->px = vx + (vw / 2);
4221 ps->py = vy + (vh / 2);
4228 edje_perspective_free(Edje_Perspective *ps)
4231 evas_object_del(ps->obj);
4235 edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
4241 if ((ps->px == px) && (ps->py == py) && (ps->z0 == z0) && (ps->foc == foc)) return;
4246 EINA_LIST_FOREACH(ps->users, l, o)
4250 ed = evas_object_smart_data_get(o);
4255 ed->recalc_call = 1;
4256 _edje_recalc_do(ed);
4261 EINA_LIST_FOREACH(_edje_edjes, l, o)
4265 ed = evas_object_smart_data_get(o);
4270 ed->recalc_call = 1;
4271 _edje_recalc_do(ed);
4278 edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
4284 if (ps->global == global) return;
4287 o = evas_object_name_find(evas_object_evas_get(ps->obj),
4288 "_edje_perspective");
4289 if (o) evas_object_name_set(o, NULL);
4290 evas_object_name_set(ps->obj, "_edje_perspective");
4293 evas_object_name_set(ps->obj, NULL);
4294 ps->global = global;
4295 EINA_LIST_FOREACH(_edje_edjes, l, o)
4299 ed = evas_object_smart_data_get(o);
4304 ed->recalc_call = 1;
4305 _edje_recalc_do(ed);
4311 edje_perspective_global_get(const Edje_Perspective *ps)
4313 if (!ps) return EINA_FALSE;
4317 EAPI const Edje_Perspective *
4318 edje_evas_global_perspective_get(const Evas *e)
4322 if (!e) return NULL;
4323 obj = evas_object_name_find(e, "_edje_perspective");
4324 if (!obj) return NULL;
4325 return evas_object_data_get(obj, "_edje_perspective");
4329 edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
4333 ed = evas_object_smart_data_get(obj);
4335 if (ed->persp == ps) return;
4336 if (ed->persp != ps)
4339 ed->persp->users = eina_list_remove(ed->persp->users, obj);
4342 if (ps) ps->users = eina_list_append(ps->users, obj);
4344 ed->recalc_call = 1;
4345 _edje_recalc_do(ed);
4348 EAPI const Edje_Perspective *
4349 edje_object_perspective_get(const Evas_Object *obj)
4353 ed = evas_object_smart_data_get(obj);
4354 if (!ed) return NULL;
4358 #define EDJE_PRELOAD_EMISSION "preload,done"
4359 #define EDJE_PRELOAD_SOURCE NULL
4362 edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
4368 ed = _edje_fetch(obj);
4369 if (!ed) return EINA_FALSE;
4371 _edje_recalc_do(ed);
4373 for (i = 0, count = 0; i < ed->table_parts_size; i++)
4378 rp = ed->table_parts[i];
4381 if (ep->type == EDJE_PART_TYPE_IMAGE ||
4382 (ep->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object))
4386 ed->preload_count = count;
4390 for (i = 0; i < ed->table_parts_size; i++)
4395 rp = ed->table_parts[i];
4398 if (ep->type == EDJE_PART_TYPE_IMAGE)
4400 const char *file = NULL;
4401 const char *key = NULL;
4403 evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4405 evas_object_image_file_get(rp->object, &file, &key);
4408 ed->preload_count--;
4412 evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4413 evas_object_image_preload(rp->object, cancel);
4417 else if (ep->type == EDJE_PART_TYPE_GROUP)
4419 if (rp->swallowed_object) {
4424 tmp = alloca(strlen(rp->part->name) + 2);
4425 sprintf(tmp, "%s:", rp->part->name);
4427 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb);
4428 edje_object_signal_callback_add(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb, ed);
4429 edje_object_preload(rp->swallowed_object, cancel);
4433 ed->preload_count--;
4443 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
4450 edje_object_update_hints_set(Evas_Object *obj, Eina_Bool update)
4454 ed = _edje_fetch(obj);
4456 if (ed->update_hints == !!update) return ;
4458 ed->update_hints = !!update;
4461 ed->recalc_hints = 1;
4467 edje_object_update_hints_get(Evas_Object *obj)
4471 ed = _edje_fetch(obj);
4472 if (!ed) return EINA_FALSE;
4474 return ed->update_hints;
4478 _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)
4481 evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
4483 _edje_table_child_add(rp, child_obj);
4489 _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
4491 Eina_Bool ret = evas_object_table_unpack(rp->object, child_obj);
4494 _edje_table_child_remove(rp, child_obj);
4500 _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
4502 Eina_List *children;
4504 children = evas_object_table_children_get(rp->object);
4507 Evas_Object *child_obj = children->data;
4509 _edje_table_child_remove(rp, child_obj);
4510 if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
4512 evas_object_table_unpack(rp->object, child_obj);
4514 evas_object_del(child_obj);
4516 children = eina_list_remove_list(children, children);
4521 _edje_real_part_recursive_get(const Edje *ed, const char *part)
4526 path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
4527 if (!path) return NULL;
4529 rp = _edje_real_part_recursive_get_helper(ed, path);
4537 _edje_children_get(Edje_Real_Part *rp, const char *partid)
4544 if (!partid) return NULL;
4546 switch (rp->part->type)
4548 case EDJE_PART_TYPE_EXTERNAL:
4549 return _edje_external_content_get(rp->swallowed_object, partid);
4550 case EDJE_PART_TYPE_BOX:
4551 l = evas_object_box_children_get(rp->object);
4553 case EDJE_PART_TYPE_TABLE:
4554 l = evas_object_table_children_get(rp->object);
4560 v = strtol(partid, &p, 10);
4561 if ((*p == '\0') && (v >= 0))
4563 child = eina_list_nth(l, v);
4569 EINA_LIST_FREE(l, cur)
4571 const char *name = evas_object_name_get(cur);
4572 if ((name) && (!strcmp(name, partid)))
4584 /* rebuild alternative path */
4586 _edje_merge_path(const char *alias, char * const *path)
4589 unsigned int length = 1;
4590 unsigned int alias_length;
4593 if (!alias) return NULL;
4595 alias_length = strlen(alias);
4597 for (i = 0; path[i]; i++)
4598 length += strlen(path[i]) + 1;
4600 tmp = malloc(sizeof (char) * (length + alias_length + 2));
4601 memcpy(tmp, alias, alias_length);
4602 tmp[alias_length] = '\0';
4604 for (i = 0; path[i]; i++)
4606 strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
4607 strcat(tmp, path[i]);
4615 _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
4624 if (ed->collection && ed->collection->alias)
4628 alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
4630 rp = _edje_real_part_recursive_get(ed, alias);
4636 //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
4637 idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
4642 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
4651 rp = _edje_real_part_get(ed, path[0]);
4652 if (!path[1] && !idx) return rp;
4653 if (!rp) return NULL;
4655 switch (rp->part->type)
4657 case EDJE_PART_TYPE_GROUP:
4658 if (!rp->swallowed_object) return NULL;
4659 ed = _edje_fetch(rp->swallowed_object);
4660 if (!ed) return NULL;
4662 return _edje_real_part_recursive_get_helper(ed, path);
4663 case EDJE_PART_TYPE_BOX:
4664 case EDJE_PART_TYPE_TABLE:
4665 case EDJE_PART_TYPE_EXTERNAL:
4666 if (!idx) return rp;
4669 child = _edje_children_get(rp, idx);
4671 ed = _edje_fetch(child);
4673 if (!ed) return NULL;
4674 return _edje_real_part_recursive_get_helper(ed, path);
4680 /* Private Routines */
4682 _edje_real_part_get(const Edje *ed, const char *part)
4686 if (!part) return NULL;
4688 for (i = 0; i < ed->table_parts_size; i++)
4692 rp = ed->table_parts[i];
4693 if ((rp->part->name) && (!strcmp(rp->part->name, part))) return rp;
4699 _edje_color_class_find(Edje *ed, const char *color_class)
4701 Edje_Color_Class *cc = NULL;
4703 if ((!ed) || (!color_class)) return NULL;
4705 /* first look through the object scope */
4706 cc = eina_hash_find(ed->color_classes, color_class);
4709 /* next look through the global scope */
4710 cc = eina_hash_find(_edje_color_class_hash, color_class);
4713 /* finally, look through the file scope */
4714 cc = eina_hash_find(ed->file->color_hash, color_class);
4721 _edje_color_class_member_add(Edje *ed, const char *color_class)
4723 _edje_class_member_add(ed, &ed->members.color_class, &_edje_color_class_member_hash, color_class);
4727 _edje_color_class_member_direct_del(const char *color_class, void *l)
4729 _edje_class_member_direct_del(color_class, l, _edje_color_class_member_hash);
4733 _edje_color_class_member_del(Edje *ed, const char *color_class)
4735 if ((!ed) || (!color_class)) return;
4737 _edje_class_member_del(&ed->members.color_class, &_edje_color_class_member_hash, color_class);
4741 _edje_color_class_members_free(void)
4743 if (!_edje_color_class_member_hash) return;
4744 eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
4745 eina_hash_free(_edje_color_class_member_hash);
4746 _edje_color_class_member_hash = NULL;
4750 color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4752 Edje_Color_Class *cc;
4755 if (cc->name) eina_stringshare_del(cc->name);
4761 _edje_color_class_hash_free(void)
4763 if (!_edje_color_class_hash) return;
4764 eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
4765 eina_hash_free(_edje_color_class_hash);
4766 _edje_color_class_hash = NULL;
4770 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
4774 if ((ep->default_desc) && (ep->default_desc->color_class))
4775 _edje_color_class_member_del(ed, ep->default_desc->color_class);
4777 for (i = 0; i < ep->other.desc_count; ++i)
4778 if (ep->other.desc[i]->color_class)
4779 _edje_color_class_member_del(ed, ep->other.desc[i]->color_class);
4783 _edje_text_class_find(Edje *ed, const char *text_class)
4786 Edje_Text_Class *tc;
4788 if ((!ed) || (!text_class)) return NULL;
4789 EINA_LIST_FOREACH(ed->text_classes, l, tc)
4790 if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
4791 return eina_hash_find(_edje_text_class_hash, text_class);
4795 _edje_text_class_member_direct_del(const char *text_class,
4798 _edje_class_member_direct_del(text_class, l, _edje_text_class_member_hash);
4802 _edje_text_class_member_add(Edje *ed, const char *text_class)
4804 _edje_class_member_add(ed, &ed->members.text_class, &_edje_text_class_member_hash, text_class);
4808 _edje_text_class_member_del(Edje *ed, const char *text_class)
4810 if ((!ed) || (!text_class)) return;
4812 _edje_class_member_del(&ed->members.text_class, &_edje_text_class_member_hash, text_class);
4816 _edje_text_class_members_free(void)
4818 _edje_class_members_free(&_edje_text_class_member_hash);
4822 text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4824 Edje_Text_Class *tc;
4827 if (tc->name) eina_stringshare_del(tc->name);
4828 if (tc->font) eina_stringshare_del(tc->font);
4834 _edje_text_class_hash_free(void)
4836 if (!_edje_text_class_hash) return;
4837 eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
4838 eina_hash_free(_edje_text_class_hash);
4839 _edje_text_class_hash = NULL;
4843 _edje_fetch(const Evas_Object *obj)
4847 if (!evas_object_smart_type_check(obj, "edje"))
4849 ed = evas_object_smart_data_get(obj);
4850 if ((ed) && (ed->delete_me)) return NULL;
4855 _edje_freeze(Edje *ed)
4858 // printf("FREEZE %i\n", ed->freeze);
4863 _edje_thaw(Edje *ed)
4868 // printf("-------------########### OVER THAW\n");
4871 if ((ed->freeze == 0) && (ed->recalc))
4873 // printf("thaw recalc\n");
4880 _edje_block(Edje *ed)
4888 _edje_unblock(Edje *ed)
4892 if (!ed) return ret;
4895 if (ed->block == 0) ed->block_break = 0;
4902 _edje_block_break(Edje *ed)
4904 if (ed->block_break) return 1;
4909 _edje_block_violate(Edje *ed)
4911 if (ed->block > 0) ed->block_break = 1;
4915 _edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
4918 Edje_User_Defined *eud;
4923 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4924 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj)
4926 _edje_user_definition_free(eud);
4934 _edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
4938 type = evas_object_type_get(rp->swallowed_object);
4940 rp->swallow_params.min.w = 0;
4941 rp->swallow_params.min.h = 0;
4942 rp->swallow_params.max.w = -1;
4943 rp->swallow_params.max.h = -1;
4944 if ((type) && (!strcmp(type, "edje")))
4949 edje_object_size_min_get(rp->swallowed_object, &w, &h);
4950 rp->swallow_params.min.w = w;
4951 rp->swallow_params.min.h = h;
4953 edje_object_size_max_get(rp->swallowed_object, &w, &h);
4954 rp->swallow_params.max.w = w;
4955 rp->swallow_params.max.h = h;
4957 else if ((type) && ((!strcmp(type, "text")) || (!strcmp(type, "polygon")) ||
4958 (!strcmp(type, "line"))))
4962 evas_object_geometry_get(rp->swallowed_object, NULL, NULL, &w, &h);
4964 rp->swallow_params.min.w = w;
4965 rp->swallow_params.min.h = h;
4967 rp->swallow_params.max.w = w;
4968 rp->swallow_params.max.h = h;
4971 Evas_Coord w1, h1, w2, h2, aw, ah;
4972 Evas_Aspect_Control am;
4974 evas_object_size_hint_min_get(rp->swallowed_object, &w1, &h1);
4975 evas_object_size_hint_max_get(rp->swallowed_object, &w2, &h2);
4976 evas_object_size_hint_aspect_get(rp->swallowed_object, &am, &aw, &ah);
4977 rp->swallow_params.min.w = w1;
4978 rp->swallow_params.min.h = h1;
4979 if (w2 > 0) rp->swallow_params.max.w = w2;
4980 if (h2 > 0) rp->swallow_params.max.h = h2;
4983 case EVAS_ASPECT_CONTROL_NONE:
4984 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE;
4986 case EVAS_ASPECT_CONTROL_NEITHER:
4987 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER;
4989 case EVAS_ASPECT_CONTROL_HORIZONTAL:
4990 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL;
4992 case EVAS_ASPECT_CONTROL_VERTICAL:
4993 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
4995 case EVAS_ASPECT_CONTROL_BOTH:
4996 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH;
5001 rp->swallow_params.aspect.w = aw;
5002 rp->swallow_params.aspect.h = ah;
5003 evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp);
5006 #ifdef EDJE_CALC_CACHE
5012 _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
5017 _edje_real_part_swallow_hints_update(rp);
5018 rp->edje->dirty = 1;
5019 rp->edje->recalc_call = 1;
5020 _edje_recalc(rp->edje);
5025 _edje_real_part_swallow(Edje_Real_Part *rp,
5026 Evas_Object *obj_swallow,
5027 Eina_Bool hints_update)
5029 if (rp->swallowed_object)
5031 if (rp->swallowed_object != obj_swallow)
5033 edje_object_part_unswallow(rp->edje->obj, rp->swallowed_object);
5038 _edje_real_part_swallow_hints_update(rp);
5039 rp->edje->dirty = 1;
5040 rp->edje->recalc_call = 1;
5041 rp->edje->recalc_hints = 1;
5042 _edje_recalc(rp->edje);
5046 #ifdef EDJE_CALC_CACHE
5049 if (!obj_swallow) return;
5050 rp->swallowed_object = obj_swallow;
5051 evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
5053 evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
5054 else evas_object_clip_set(rp->swallowed_object, rp->edje->base.clipper);
5055 evas_object_stack_above(rp->swallowed_object, rp->object);
5056 evas_object_event_callback_add(rp->swallowed_object,
5058 _edje_object_part_swallow_free_cb,
5060 evas_object_event_callback_add(rp->swallowed_object,
5061 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5062 _edje_object_part_swallow_changed_hints_cb,
5066 _edje_real_part_swallow_hints_update(rp);
5068 if (rp->part->mouse_events)
5070 _edje_callbacks_add(obj_swallow, rp->edje, rp);
5071 if (rp->part->repeat_events)
5072 evas_object_repeat_events_set(obj_swallow, 1);
5073 if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB)
5074 evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode);
5075 evas_object_pass_events_set(obj_swallow, 0);
5078 evas_object_pass_events_set(obj_swallow, 1);
5079 _edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp);
5081 if (rp->part->precise_is_inside)
5082 evas_object_precise_is_inside_set(obj_swallow, 1);
5084 rp->edje->dirty = 1;
5085 rp->edje->recalc_call = 1;
5086 rp->edje->recalc_hints = 1;
5087 _edje_recalc(rp->edje);
5091 _edje_real_part_swallow_clear(Edje_Real_Part *rp)
5093 evas_object_smart_member_del(rp->swallowed_object);
5094 evas_object_event_callback_del_full(rp->swallowed_object,
5096 _edje_object_part_swallow_free_cb,
5098 evas_object_event_callback_del_full(rp->swallowed_object,
5099 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5100 _edje_object_part_swallow_changed_hints_cb,
5102 evas_object_clip_unset(rp->swallowed_object);
5103 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
5104 if (rp->part->mouse_events)
5105 _edje_callbacks_del(rp->swallowed_object, rp->edje);
5106 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
5107 rp->swallowed_object = NULL;
5111 _edje_object_preload(Edje *ed)
5113 ed->preload_count--;
5114 if (!ed->preload_count)
5115 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
5119 _edje_object_image_preload_cb(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5123 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
5124 _edje_object_preload(ed);
5128 _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const char *emission, __UNUSED__ const char *source)
5132 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
5133 _edje_object_preload(ed);
5142 _edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
5144 Edje_Program ***array;
5145 unsigned int *count;
5148 if (!p->signal && !p->source)
5150 array = &edc->programs.nocmp;
5151 count = &edc->programs.nocmp_count;
5153 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5154 && p->source && !strpbrk(p->source, "*?[\\"))
5156 array = &edc->programs.strcmp;
5157 count = &edc->programs.strcmp_count;
5159 else if (p->signal && edje_program_is_strncmp(p->signal)
5160 && p->source && edje_program_is_strncmp(p->source))
5162 array = &edc->programs.strncmp;
5163 count = &edc->programs.strncmp_count;
5165 else if (p->signal && edje_program_is_strrncmp(p->signal)
5166 && p->source && edje_program_is_strrncmp(p->source))
5168 array = &edc->programs.strrncmp;
5169 count = &edc->programs.strrncmp_count;
5173 array = &edc->programs.fnmatch;
5174 count = &edc->programs.fnmatch_count;
5177 for (i = 0; i < *count; ++i)
5178 if ((*array)[i] == p)
5180 memmove(*array + i, *array + i + 1, sizeof (Edje_Program *) * (*count - i -1));
5192 _edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
5194 Edje_Program ***array;
5195 unsigned int *count;
5197 if (!p->signal && !p->source)
5199 array = &edc->programs.nocmp;
5200 count = &edc->programs.nocmp_count;
5202 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5203 && p->source && !strpbrk(p->source, "*?[\\"))
5205 array = &edc->programs.strcmp;
5206 count = &edc->programs.strcmp_count;
5208 else if (p->signal && edje_program_is_strncmp(p->signal)
5209 && p->source && edje_program_is_strncmp(p->source))
5211 array = &edc->programs.strncmp;
5212 count = &edc->programs.strncmp_count;
5214 else if (p->signal && edje_program_is_strrncmp(p->signal)
5215 && p->source && edje_program_is_strrncmp(p->source))
5217 array = &edc->programs.strrncmp;
5218 count = &edc->programs.strrncmp_count;
5222 array = &edc->programs.fnmatch;
5223 count = &edc->programs.fnmatch_count;
5226 *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));
5227 (*array)[(*count)++] = p;
5231 edje_string_get(const Edje_String *es)
5233 /* FIXME: Handle localization here */
5234 if (!es) return NULL;
5239 edje_string_id_get(const Edje_String *es)
5241 /* FIXME: Handle localization here */
5242 if (!es) return NULL;
5247 _cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5250 _edje_subobj_unregister(ed, obj);
5254 _edje_subobj_register(Edje *ed, Evas_Object *ob)
5256 ed->subobjs = eina_list_append(ed->subobjs, ob);
5257 evas_object_event_callback_add(ob, EVAS_CALLBACK_DEL,
5258 _cb_subobj_del, ed);
5262 _edje_subobj_unregister(Edje *ed, Evas_Object *obj)
5264 ed->subobjs = eina_list_remove(ed->subobjs, obj);
5265 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
5266 _cb_subobj_del, ed);
5269 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/