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);
111 case EDJE_USER_BOX_PACK:
112 child = eud->u.box.child;
113 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
114 _edje_box_child_remove(rp, child);
117 case EDJE_USER_TABLE_PACK:
118 child = eud->u.table.child;
119 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
120 _edje_table_child_remove(rp, child);
123 case EDJE_USER_STRING:
124 case EDJE_USER_DRAG_STEP:
125 case EDJE_USER_DRAG_PAGE:
126 case EDJE_USER_DRAG_VALUE:
127 case EDJE_USER_DRAG_SIZE:
131 _edje_user_definition_remove(eud, child);
135 _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
137 Edje_User_Defined *eud = data;
139 _edje_user_definition_free(eud);
143 _edje_class_member_direct_del(const char *class, Edje_List_Refcount *lookup, Eina_Hash *hash)
147 members = eina_hash_find(hash, class);
148 members = eina_list_remove_list(members, lookup->lookup);
149 eina_hash_set(hash, class, members);
154 _edje_class_member_add(Edje *ed, Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
156 Edje_List_Refcount *lookup;
159 if ((!ed) || (!ehash) || (!ghash) || (!class)) return;
161 lookup = eina_hash_find(*ehash, class);
164 EINA_REFCOUNT_REF(lookup);
168 lookup = malloc(sizeof (Edje_List_Refcount));
170 EINA_REFCOUNT_INIT(lookup);
172 /* Get members list */
173 members = eina_hash_find(*ghash, class);
175 /* Update the member list */
176 lookup->lookup = members = eina_list_prepend(members, ed);
178 /* Don't loose track of members list */
180 *ehash = eina_hash_string_small_new(NULL);
181 eina_hash_add(*ehash, class, lookup);
183 /* Reset the member list to the right pointer */
185 *ghash = eina_hash_string_superfast_new(NULL);
186 eina_hash_set(*ghash, class, members);
190 _edje_class_member_del(Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
192 Edje_List_Refcount *lookup;
195 if ((!ehash) || (!ghash) || (!class)) return;
196 members = eina_hash_find(*ghash, class);
197 if (!members) return;
199 lookup = eina_hash_find(*ehash, class);
202 EINA_REFCOUNT_UNREF(lookup)
204 members = eina_list_remove_list(members, lookup->lookup);
205 eina_hash_set(*ghash, class, members);
207 eina_hash_del(*ehash, class, lookup);
213 member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
215 eina_list_free(data);
220 _edje_class_members_free(Eina_Hash **ghash)
222 if (!ghash || !*ghash) return;
223 eina_hash_foreach(*ghash, member_list_free, NULL);
224 eina_hash_free(*ghash);
228 /************************** API Routines **************************/
238 // FIXME: could just have a global freeze instead of per object
239 // above i tried.. but this broke some things. notable e17's menus. why?
243 EINA_LIST_FOREACH(_edje_edjes, l, data)
244 edje_object_freeze(data);
250 _edje_thaw_edje(Edje *ed)
254 for (i = 0; i < ed->table_parts_size; i++)
258 rp = ed->table_parts[i];
259 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
263 ed2 = _edje_fetch(rp->swallowed_object);
264 if (ed2) _edje_thaw_edje(ed2);
267 if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
277 if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
281 _edje_freeze_calc_count = 0;
282 EINA_LIST_FREE(_edje_freeze_calc_list, ed)
291 // FIXME: could just have a global freeze instead of per object
292 // comment as above.. why?
295 EINA_LIST_FOREACH(_edje_edjes, l, data)
296 edje_object_thaw(data);
301 edje_fontset_append_set(const char *fonts)
303 if (_edje_fontset_append)
304 free(_edje_fontset_append);
305 _edje_fontset_append = fonts ? strdup(fonts) : NULL;
309 edje_fontset_append_get(void)
311 return _edje_fontset_append;
315 edje_scale_set(double scale)
320 if (_edje_scale == FROM_DOUBLE(scale)) return;
321 _edje_scale = FROM_DOUBLE(scale);
322 EINA_LIST_FOREACH(_edje_edjes, l, data)
323 edje_object_calc_force(data);
329 return TO_DOUBLE(_edje_scale);
333 edje_password_show_last_set(Eina_Bool password_show_last)
335 if (_edje_password_show_last == password_show_last) return;
336 _edje_password_show_last = password_show_last;
340 edje_password_show_last_timeout_set(double password_show_last_timeout)
342 if (_edje_password_show_last_timeout == FROM_DOUBLE(password_show_last_timeout)) return;
343 _edje_password_show_last_timeout = FROM_DOUBLE(password_show_last_timeout);
347 edje_object_scale_set(Evas_Object *obj, double scale)
354 ed = _edje_fetch(obj);
355 if (!ed) return EINA_FALSE;
356 if (ed->scale == scale) return EINA_TRUE;
357 ed->scale = FROM_DOUBLE(scale);
358 EINA_LIST_FOREACH(ed->groups, l, ged)
359 ged->scale = ed->scale;
360 EINA_LIST_FOREACH(ed->subobjs, l, o)
361 edje_object_calc_force(o);
362 for (i = 0; i < ed->table_parts_size; ++i)
365 ep = ed->table_parts[i];
366 if ((ep->part->type == EDJE_PART_TYPE_BOX)
367 || (ep->part->type == EDJE_PART_TYPE_TABLE))
369 EINA_LIST_FOREACH(ep->items, l, o)
370 edje_object_scale_set(o, scale);
373 edje_object_calc_force(obj);
378 edje_object_scale_get(const Evas_Object *obj)
382 ed = _edje_fetch(obj);
384 return TO_DOUBLE(ed->scale);
388 edje_object_mirrored_get(const Evas_Object *obj)
392 ed = _edje_fetch(obj);
393 if (!ed) return EINA_FALSE;
399 _edje_object_orientation_inform(Evas_Object *obj)
401 if (edje_object_mirrored_get(obj))
402 edje_object_signal_emit(obj, "edje,state,rtl", "edje");
404 edje_object_signal_emit(obj, "edje,state,ltr", "edje");
408 edje_object_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
413 ed = _edje_fetch(obj);
415 if (ed->is_rtl == rtl) return;
419 for (i = 0; i < ed->table_parts_size; i++)
425 ep = ed->table_parts[i];
426 s = ep->param1.description->state.name,
427 v = ep->param1.description->state.value;
428 _edje_part_description_apply(ed, ep, s, v, NULL, 0.0);
429 ep->chosen_description = ep->param1.description;
433 _edje_object_orientation_inform(obj);
439 edje_object_data_get(const Evas_Object *obj, const char *key)
443 ed = _edje_fetch(obj);
446 if (!ed->collection) return NULL;
447 if (!ed->collection->data) return NULL;
448 return edje_string_get(eina_hash_find(ed->collection->data, key));
452 edje_object_freeze(Evas_Object *obj)
457 ed = _edje_fetch(obj);
459 for (i = 0; i < ed->table_parts_size; i++)
462 rp = ed->table_parts[i];
463 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
464 edje_object_freeze(rp->swallowed_object);
466 return _edje_freeze(ed);
470 edje_object_thaw(Evas_Object *obj)
475 ed = _edje_fetch(obj);
477 for (i = 0; i < ed->table_parts_size; i++)
481 rp = ed->table_parts[i];
482 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
483 edje_object_thaw(rp->swallowed_object);
485 return _edje_thaw(ed);
489 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)
492 Edje_Color_Class *cc;
494 if (!color_class) return EINA_FALSE;
496 cc = eina_hash_find(_edje_color_class_hash, color_class);
499 cc = calloc(1, sizeof(Edje_Color_Class));
500 if (!cc) return EINA_FALSE;
501 cc->name = eina_stringshare_add(color_class);
507 if (!_edje_color_class_hash)
508 _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
509 eina_hash_add(_edje_color_class_hash, color_class, cc);
524 if ((cc->r == r) && (cc->g == g) &&
525 (cc->b == b) && (cc->a == a) &&
526 (cc->r2 == r2) && (cc->g2 == g2) &&
527 (cc->b2 == b2) && (cc->a2 == a2) &&
528 (cc->r3 == r3) && (cc->g3 == g3) &&
529 (cc->b3 == b3) && (cc->a3 == a3))
544 members = eina_hash_find(_edje_color_class_member_hash, color_class);
549 ed = eina_list_data_get(members);
552 #ifdef EDJE_CALC_CACHE
553 ed->all_part_change = 1;
556 _edje_emit(ed, "color_class,set", color_class);
557 members = eina_list_next(members);
563 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)
565 Edje_Color_Class *cc;
570 cc = eina_hash_find(_edje_color_class_hash, color_class);
574 #define X(C) if (C) \
576 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
586 #define X(C) if (C) \
588 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
599 edje_color_class_del(const char *color_class)
601 Edje_Color_Class *cc;
604 if (!color_class) return;
606 cc = eina_hash_find(_edje_color_class_hash, color_class);
609 eina_hash_del(_edje_color_class_hash, color_class, cc);
610 eina_stringshare_del(cc->name);
613 members = eina_hash_find(_edje_color_class_member_hash, color_class);
618 ed = eina_list_data_get(members);
621 #ifdef EDJE_CALC_CACHE
622 ed->all_part_change = 1;
625 _edje_emit(ed, "color_class,del", color_class);
626 members = eina_list_next(members);
631 edje_color_class_list(void)
633 Edje_List_Foreach_Data fdata;
635 if (!_edje_color_class_hash) return NULL;
636 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
637 eina_hash_foreach(_edje_color_class_hash,
638 _edje_color_class_list_foreach, &fdata);
644 _edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
646 Edje_List_Foreach_Data *fd;
649 fd->list = eina_list_append(fd->list, strdup(key));
654 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)
657 Edje_Color_Class *cc;
660 ed = _edje_fetch(obj);
661 if ((!ed) || (!color_class)) return EINA_FALSE;
674 cc = eina_hash_find(ed->color_classes, color_class);
677 if ((cc->r == r) && (cc->g == g) &&
678 (cc->b == b) && (cc->a == a) &&
679 (cc->r2 == r2) && (cc->g2 == g2) &&
680 (cc->b2 == b2) && (cc->a2 == a2) &&
681 (cc->r3 == r3) && (cc->g3 == g3) &&
682 (cc->b3 == b3) && (cc->a3 == a3))
698 #ifdef EDJE_CALC_CACHE
699 ed->all_part_change = 1;
705 color_class = eina_stringshare_add(color_class);
706 if (!color_class) return EINA_FALSE;
707 cc = malloc(sizeof(Edje_Color_Class));
710 eina_stringshare_del(color_class);
713 cc->name = color_class;
726 eina_hash_direct_add(ed->color_classes, cc->name, cc);
729 #ifdef EDJE_CALC_CACHE
730 ed->all_part_change = 1;
733 for (i = 0; i < ed->table_parts_size; i++)
737 rp = ed->table_parts[i];
738 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
739 edje_object_color_class_set(rp->swallowed_object, color_class,
740 r, g, b, a, r2, g2, b2, a2, r3, g3, b3,
745 _edje_emit(ed, "color_class,set", color_class);
750 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)
752 Edje *ed = _edje_fetch(obj);
753 Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
757 #define X(C) if (C) \
759 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
769 #define X(C) if (C) \
771 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
782 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
785 Edje_Color_Class *cc = NULL;
788 ed = _edje_fetch(obj);
790 if ((!ed) || (!color_class)) return;
792 eina_hash_del(ed->color_classes, color_class, cc);
794 for (i = 0; i < ed->table_parts_size; i++)
798 rp = ed->table_parts[i];
799 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
800 edje_object_color_class_del(rp->swallowed_object, color_class);
805 #ifdef EDJE_CALC_CACHE
806 ed->all_part_change = 1;
809 _edje_emit(ed, "color_class,del", color_class);
813 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
818 if (!text_class) return EINA_FALSE;
819 if (!font) font = "";
821 tc = eina_hash_find(_edje_text_class_hash, text_class);
822 /* Create new text class */
825 tc = calloc(1, sizeof(Edje_Text_Class));
826 if (!tc) return EINA_FALSE;
827 tc->name = eina_stringshare_add(text_class);
833 if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
834 eina_hash_add(_edje_text_class_hash, text_class, tc);
836 tc->font = eina_stringshare_add(font);
841 /* Match and the same, return */
842 if (((tc->font && font) && !strcmp(tc->font, font)) &&
846 /* Update the class found */
847 eina_stringshare_replace(&tc->font, font);
851 /* Tell all members of the text class to recalc */
852 members = eina_hash_find(_edje_text_class_member_hash, text_class);
857 ed = eina_list_data_get(members);
860 _edje_textblock_style_all_update(ed);
861 #ifdef EDJE_CALC_CACHE
862 ed->text_part_change = 1;
865 members = eina_list_next(members);
871 edje_text_class_del(const char *text_class)
876 if (!text_class) return;
878 tc = eina_hash_find(_edje_text_class_hash, text_class);
881 eina_hash_del(_edje_text_class_hash, text_class, tc);
882 eina_stringshare_del(tc->name);
883 eina_stringshare_del(tc->font);
886 members = eina_hash_find(_edje_text_class_member_hash, text_class);
891 ed = eina_list_data_get(members);
893 _edje_textblock_style_all_update(ed);
894 #ifdef EDJE_CALC_CACHE
895 ed->text_part_change = 1;
898 members = eina_list_next(members);
903 edje_text_class_list(void)
905 Edje_List_Foreach_Data fdata;
907 if (!_edje_text_class_hash) return NULL;
908 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
909 eina_hash_foreach(_edje_text_class_hash,
910 _edje_text_class_list_foreach, &fdata);
915 _edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
917 Edje_List_Foreach_Data *fd;
920 fd->list = eina_list_append(fd->list, eina_stringshare_add(key));
925 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
929 Edje_Text_Class *tc = NULL;
932 ed = _edje_fetch(obj);
933 if ((!ed) || (!text_class)) return EINA_FALSE;
935 /* for each text_class in the edje */
936 EINA_LIST_FOREACH(ed->text_classes, l, tc)
938 if ((tc->name) && (!strcmp(tc->name, text_class)))
940 /* Match and the same, return */
941 if ((tc->size == size) &&
942 ((tc->font == font) ||
943 (tc->font && font && !strcmp(tc->font, font))))
946 /* Update new text class properties */
947 eina_stringshare_replace(&tc->font, font);
955 /* No matches, create a new text class */
956 tc = calloc(1, sizeof(Edje_Text_Class));
957 if (!tc) return EINA_FALSE;
958 tc->name = eina_stringshare_add(text_class);
964 tc->font = eina_stringshare_add(font);
966 /* Add to edje's text class list */
967 ed->text_classes = eina_list_append(ed->text_classes, tc);
970 for (i = 0; i < ed->table_parts_size; i++)
974 rp = ed->table_parts[i];
975 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
976 edje_object_text_class_set(rp->swallowed_object, text_class,
982 #ifdef EDJE_CALC_CACHE
983 ed->text_part_change = 1;
985 _edje_textblock_style_all_update(ed);
991 edje_object_part_exists(const Evas_Object *obj, const char *part)
996 ed = _edje_fetch(obj);
997 if ((!ed) || (!part)) return EINA_FALSE;
998 rp = _edje_real_part_recursive_get(ed, part);
999 if (!rp) return EINA_FALSE;
1003 EAPI const Evas_Object *
1004 edje_object_part_object_get(const Evas_Object *obj, const char *part)
1009 ed = _edje_fetch(obj);
1010 if ((!ed) || (!part)) return NULL;
1012 /* Need to recalc before providing the object. */
1013 _edje_recalc_do(ed);
1015 rp = _edje_real_part_recursive_get(ed, part);
1016 if (!rp) return NULL;
1021 edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
1026 ed = _edje_fetch(obj);
1027 if ((!ed) || (!part))
1036 /* Need to recalc before providing the object. */
1037 _edje_recalc_do(ed);
1039 rp = _edje_real_part_recursive_get(ed, part);
1056 edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
1060 ed = _edje_fetch(obj);
1062 ed->item_provider.func = func;
1063 ed->item_provider.data = data;
1066 /* FIXDOC: New Function */
1068 edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
1073 ed = _edje_fetch(obj);
1075 ed->text_change.func = func;
1076 ed->text_change.data = data;
1078 for (i = 0; i < ed->table_parts_size; i++)
1082 rp = ed->table_parts[i];
1083 if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object))
1084 edje_object_text_change_cb_set(rp->swallowed_object, func, data);
1089 _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1091 if ((!rp->text.text) && (!text))
1092 return EINA_TRUE; /* nothing to do, no error */
1093 if ((rp->text.text) && (text) &&
1094 (!strcmp(rp->text.text, text)))
1095 return EINA_TRUE; /* nothing to do, no error */
1098 eina_stringshare_del(rp->text.text);
1099 rp->text.text = NULL;
1101 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1102 _edje_entry_text_markup_set(rp, text);
1105 rp->text.text = eina_stringshare_add(text);
1106 rp->edje->dirty = 1;
1107 rp->edje->recalc_call = 1;
1108 rp->edje->recalc_hints = 1;
1109 #ifdef EDJE_CALC_CACHE
1112 _edje_recalc(rp->edje);
1113 if (rp->edje->text_change.func)
1114 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1119 _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1121 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1122 _edje_entry_text_markup_append(rp, text);
1128 int len_added = strlen(text);
1129 int len_old = strlen(rp->text.text);
1130 new = malloc(len_old + len_added + 1);
1131 memcpy(new, rp->text.text, len_old);
1132 memcpy(new + len_old, text, len_added);
1133 new[len_old + len_added] = '\0';
1134 eina_stringshare_replace(&rp->text.text, new);
1139 eina_stringshare_replace(&rp->text.text, text);
1142 rp->edje->dirty = 1;
1143 rp->edje->recalc_call = 1;
1144 #ifdef EDJE_CALC_CACHE
1147 _edje_recalc(rp->edje);
1148 if (rp->edje->text_change.func)
1149 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1154 edje_object_part_text_style_user_push(Evas_Object *obj, const char *part,
1159 Evas_Textblock_Style *ts;
1161 ed = _edje_fetch(obj);
1162 if ((!ed) || (!part) || (!style)) return;
1163 rp = _edje_real_part_recursive_get(ed, part);
1165 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1167 ts = evas_textblock_style_new();
1168 evas_textblock_style_set(ts, style);
1169 evas_object_textblock_style_user_push(rp->object, ts);
1170 evas_textblock_style_free(ts);
1171 ed->recalc_hints = 1;
1172 #ifdef EDJE_CALC_CACHE
1179 edje_object_part_text_style_user_pop(Evas_Object *obj, const char *part)
1184 ed = _edje_fetch(obj);
1185 if ((!ed) || (!part)) return;
1186 rp = _edje_real_part_recursive_get(ed, part);
1188 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1190 evas_object_textblock_style_user_pop(rp->object);
1191 ed->recalc_hints = 1;
1192 #ifdef EDJE_CALC_CACHE
1199 edje_object_part_text_style_user_peek(const Evas_Object *obj, const char *part)
1203 const Evas_Textblock_Style *ts;
1205 ed = _edje_fetch(obj);
1206 if ((!ed) || (!part)) return NULL;
1207 rp = _edje_real_part_recursive_get(ed, part);
1208 if (!rp) return NULL;
1209 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return NULL;
1211 ts = evas_object_textblock_style_user_peek(rp->object);
1213 return evas_textblock_style_get(ts);
1219 _edje_user_define_string(Edje *ed, const char *part, const char *raw_text)
1221 /* NOTE: This one is tricky, text is referenced in rp->text.text for the life of the
1222 rp. So on edje_object_file_set, we should first ref it, before destroying the old
1224 Edje_User_Defined *eud;
1227 EINA_LIST_FOREACH(ed->user_defined, l, eud)
1228 if (eud->type == EDJE_USER_STRING && !strcmp(eud->part, part))
1232 _edje_user_definition_free(eud);
1235 eud->u.string.text = raw_text;
1239 eud = _edje_user_definition_new(EDJE_USER_STRING, part, ed);
1241 eud->u.string.text = raw_text;
1245 edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
1251 ed = _edje_fetch(obj);
1252 if ((!ed) || (!part)) return EINA_FALSE;
1253 rp = _edje_real_part_recursive_get(ed, part);
1254 if (!rp) return EINA_FALSE;
1255 if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
1256 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE;
1257 r = _edje_object_part_text_raw_set(obj, rp, part, text);
1258 _edje_user_define_string(ed, part, rp->text.text);
1263 edje_object_part_text_get(const Evas_Object *obj, const char *part)
1268 ed = _edje_fetch(obj);
1269 if ((!ed) || (!part)) return NULL;
1271 /* Need to recalc before providing the object. */
1272 _edje_recalc_do(ed);
1274 rp = _edje_real_part_recursive_get(ed, part);
1275 if (!rp) return NULL;
1276 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1277 return _edje_entry_text_get(rp);
1280 if (rp->part->type == EDJE_PART_TYPE_TEXT) return rp->text.text;
1281 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1282 return evas_object_textblock_text_markup_get(rp->object);
1288 edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char *text)
1294 ed = _edje_fetch(obj);
1295 if ((!ed) || (!part)) return EINA_FALSE;
1296 rp = _edje_real_part_recursive_get(ed, part);
1297 if (!rp) return EINA_FALSE;
1298 if ((rp->part->type == EDJE_PART_TYPE_TEXT) && (text))
1301 char *esc_start = NULL, *esc_end = NULL;
1304 sbuf = eina_strbuf_new();
1309 if ((*p == 0) || (esc_end) || (esc_start))
1315 escape = evas_textblock_escape_string_range_get
1316 (esc_start, esc_end + 1);
1317 if (escape) eina_strbuf_append(sbuf, escape);
1318 esc_start = esc_end = NULL;
1322 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1323 eina_strbuf_append_length(sbuf, s, p - s);
1332 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1335 eina_strbuf_append_length(sbuf, s, p - s);
1348 ret = _edje_object_part_text_raw_set
1349 (obj, rp, part, eina_strbuf_string_get(sbuf));
1350 _edje_user_define_string(ed, part, rp->text.text);
1351 eina_strbuf_free(sbuf);
1354 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return EINA_FALSE;
1355 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1356 _edje_user_define_string(ed, part, rp->text.text);
1361 _edje_text_escape(const char *text)
1365 const char *text_end;
1368 if (!text) return NULL;
1370 txt = eina_strbuf_new();
1371 text_len = strlen(text);
1373 text_end = text + text_len;
1374 while (text < text_end)
1377 const char *escaped = evas_textblock_string_escape_get(text, &advance);
1380 eina_strbuf_append_char(txt, text[0]);
1384 eina_strbuf_append(txt, escaped);
1389 ret = eina_strbuf_string_steal(txt);
1390 eina_strbuf_free(txt);
1395 _edje_text_unescape(const char *text)
1399 const char *text_end, *last, *escape_start;
1402 if (!text) return NULL;
1404 txt = eina_strbuf_new();
1405 text_len = strlen(text);
1407 text_end = text + text_len;
1409 escape_start = NULL;
1410 for (; text < text_end; text++)
1424 len = text - escape_start;
1429 eina_strbuf_append_n(txt, str, len);
1431 escape_start = text;
1434 else if ((*text == ';') && (escape_start))
1437 const char *str = evas_textblock_escape_string_range_get(escape_start, text);
1444 len = text + 1 - escape_start;
1447 eina_strbuf_append_n(txt, str, len);
1449 escape_start = NULL;
1454 if (!last && escape_start)
1455 last = escape_start;
1457 if (last && (text > last))
1459 size_t len = text - last;
1460 eina_strbuf_append_n(txt, last, len);
1463 ret = eina_strbuf_string_steal(txt);
1464 eina_strbuf_free(txt);
1469 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
1473 Eina_Bool ret = EINA_FALSE;
1475 ed = _edje_fetch(obj);
1476 if ((!ed) || (!part)) return ret;
1477 rp = _edje_real_part_recursive_get(ed, part);
1478 if (!rp) return ret;
1479 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1480 ret = _edje_object_part_text_raw_set(obj, rp, part, text_to_escape);
1481 else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1483 char *text = _edje_text_escape(text_to_escape);
1485 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1488 _edje_user_define_string(ed, part, rp->text.text);
1493 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
1498 ed = _edje_fetch(obj);
1499 if ((!ed) || (!part)) return NULL;
1501 /* Need to recalc before providing the object. */
1502 _edje_recalc_do(ed);
1504 rp = _edje_real_part_recursive_get(ed, part);
1505 if (!rp) return NULL;
1506 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1508 const char *t = _edje_entry_text_get(rp);
1509 return _edje_text_unescape(t);
1513 if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->text.text);
1514 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1516 const char *t = evas_object_textblock_text_markup_get(rp->object);
1517 return _edje_text_unescape(t);
1524 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
1529 ed = _edje_fetch(obj);
1530 if ((!ed) || (!part)) return NULL;
1531 rp = _edje_real_part_recursive_get(ed, part);
1532 if (!rp) return NULL;
1533 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1534 return _edje_entry_selection_get(rp);
1539 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
1544 ed = _edje_fetch(obj);
1545 if ((!ed) || (!part)) return;
1546 rp = _edje_real_part_recursive_get(ed, part);
1548 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1549 _edje_entry_select_none(rp);
1553 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
1558 ed = _edje_fetch(obj);
1559 if ((!ed) || (!part)) return;
1560 rp = _edje_real_part_recursive_get(ed, part);
1562 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1563 _edje_entry_select_all(rp);
1567 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
1572 ed = _edje_fetch(obj);
1573 if ((!ed) || (!part)) return;
1574 rp = _edje_real_part_recursive_get(ed, part);
1576 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1577 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
1578 _edje_entry_text_markup_insert(rp, text);
1579 rp->edje->dirty = 1;
1580 rp->edje->recalc_call = 1;
1581 rp->edje->recalc_hints = 1;
1582 #ifdef EDJE_CALC_CACHE
1585 _edje_recalc(rp->edje);
1586 if (rp->edje->text_change.func)
1587 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1591 edje_object_part_text_append(Evas_Object *obj, const char *part, const char *text)
1596 ed = _edje_fetch(obj);
1597 if ((!ed) || (!part)) return;
1598 rp = _edje_real_part_recursive_get(ed, part);
1600 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1601 _edje_object_part_text_raw_append(obj, rp, part, text);
1602 rp->edje->dirty = 1;
1603 rp->edje->recalc_call = 1;
1604 rp->edje->recalc_hints = 1;
1605 #ifdef EDJE_CALC_CACHE
1608 _edje_recalc(rp->edje);
1609 if (rp->edje->text_change.func)
1610 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1613 EAPI const Eina_List *
1614 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
1619 ed = _edje_fetch(obj);
1620 if ((!ed) || (!part)) return NULL;
1621 rp = _edje_real_part_recursive_get(ed, part);
1622 if (!rp) return NULL;
1623 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1624 return _edje_entry_anchors_list(rp);
1628 EAPI const Eina_List *
1629 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
1634 ed = _edje_fetch(obj);
1635 if ((!ed) || (!part)) return NULL;
1636 rp = _edje_real_part_recursive_get(ed, part);
1637 if (!rp) return NULL;
1638 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1639 return _edje_entry_anchor_geometry_get(rp, anchor);
1643 EAPI const Eina_List *
1644 edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part)
1649 ed = _edje_fetch(obj);
1650 if ((!ed) || (!part)) return NULL;
1651 rp = _edje_real_part_recursive_get(ed, part);
1652 if (!rp) return NULL;
1653 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1654 return _edje_entry_items_list(rp);
1659 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)
1664 ed = _edje_fetch(obj);
1665 if ((!ed) || (!part)) return EINA_FALSE;
1666 rp = _edje_real_part_recursive_get(ed, part);
1667 if (!rp) return EINA_FALSE;
1668 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1669 return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch);
1674 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)
1679 ed = _edje_fetch(obj);
1684 if ((!ed) || (!part)) return;
1685 rp = _edje_real_part_recursive_get(ed, part);
1687 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1689 _edje_entry_cursor_geometry_get(rp, x, y, w, h);
1690 if (x) *x -= rp->edje->x;
1691 if (y) *y -= rp->edje->y;
1696 edje_object_part_text_user_insert(const Evas_Object *obj, const char *part, const char *text)
1701 ed = _edje_fetch(obj);
1702 if ((!ed) || (!part)) return;
1703 rp = _edje_real_part_recursive_get(ed, part);
1705 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1706 _edje_entry_user_insert(rp, text);
1710 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
1715 ed = _edje_fetch(obj);
1716 if ((!ed) || (!part)) return;
1717 rp = _edje_real_part_recursive_get(ed, part);
1719 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1720 _edje_entry_select_allow_set(rp, allow);
1724 edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
1729 ed = _edje_fetch(obj);
1730 if ((!ed) || (!part)) return;
1731 rp = _edje_real_part_recursive_get(ed, part);
1733 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1734 _edje_entry_select_abort(rp);
1738 edje_object_part_text_select_begin(const Evas_Object *obj, const char *part)
1743 ed = _edje_fetch(obj);
1744 if ((!ed) || (!part)) return;
1745 rp = _edje_real_part_recursive_get(ed, part);
1747 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1748 _edje_entry_select_begin(rp);
1752 edje_object_part_text_select_extend(const Evas_Object *obj, const char *part)
1757 ed = _edje_fetch(obj);
1758 if ((!ed) || (!part)) return;
1759 rp = _edje_real_part_recursive_get(ed, part);
1761 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1762 _edje_entry_select_extend(rp);
1766 edje_object_part_text_imf_context_get(const Evas_Object *obj, const char *part)
1771 ed = _edje_fetch(obj);
1772 if ((!ed) || (!part)) return NULL;
1774 rp = _edje_real_part_recursive_get(ed, (char *)part);
1775 if (!rp) return NULL;
1777 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1778 return _edje_entry_imf_context_get(rp);
1784 edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, Edje_Cursor cur)
1789 ed = _edje_fetch(obj);
1790 if ((!ed) || (!part)) return EINA_FALSE;
1791 rp = _edje_real_part_recursive_get(ed, part);
1792 if (!rp) return EINA_FALSE;
1793 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1795 return _edje_entry_cursor_next(rp, cur);
1801 edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, Edje_Cursor cur)
1806 ed = _edje_fetch(obj);
1807 if ((!ed) || (!part)) return EINA_FALSE;
1808 rp = _edje_real_part_recursive_get(ed, part);
1809 if (!rp) return EINA_FALSE;
1810 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1812 return _edje_entry_cursor_prev(rp, cur);
1818 edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, Edje_Cursor cur)
1823 ed = _edje_fetch(obj);
1824 if ((!ed) || (!part)) return EINA_FALSE;
1825 rp = _edje_real_part_recursive_get(ed, part);
1826 if (!rp) return EINA_FALSE;
1827 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1829 return _edje_entry_cursor_up(rp, cur);
1835 edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, Edje_Cursor cur)
1840 ed = _edje_fetch(obj);
1841 if ((!ed) || (!part)) return EINA_FALSE;
1842 rp = _edje_real_part_recursive_get(ed, part);
1843 if (!rp) return EINA_FALSE;
1844 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1846 return _edje_entry_cursor_down(rp, cur);
1852 edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1857 ed = _edje_fetch(obj);
1858 if ((!ed) || (!part)) return;
1859 rp = _edje_real_part_recursive_get(ed, part);
1861 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1863 _edje_entry_cursor_begin(rp, cur);
1868 edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1873 ed = _edje_fetch(obj);
1874 if ((!ed) || (!part)) return;
1875 rp = _edje_real_part_recursive_get(ed, part);
1877 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1879 _edje_entry_cursor_end(rp, cur);
1884 edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
1889 ed = _edje_fetch(obj);
1890 if ((!ed) || (!part)) return;
1891 rp = _edje_real_part_recursive_get(ed, part);
1893 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1895 _edje_entry_cursor_copy(rp, src, dst);
1900 edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1905 ed = _edje_fetch(obj);
1906 if ((!ed) || (!part)) return;
1907 rp = _edje_real_part_recursive_get(ed, part);
1909 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1911 _edje_entry_cursor_line_begin(rp, cur);
1916 edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1921 ed = _edje_fetch(obj);
1922 if ((!ed) || (!part)) return;
1923 rp = _edje_real_part_recursive_get(ed, part);
1925 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1927 _edje_entry_cursor_line_end(rp, cur);
1932 edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char *part,
1933 Edje_Cursor cur, Evas_Coord x, Evas_Coord y)
1938 ed = _edje_fetch(obj);
1939 if ((!ed) || (!part)) return EINA_FALSE;
1940 rp = _edje_real_part_recursive_get(ed, part);
1941 if (!rp) return EINA_FALSE;
1942 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1944 return _edje_entry_cursor_coord_set(rp, cur, x, y);
1950 edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1955 ed = _edje_fetch(obj);
1956 if ((!ed) || (!part)) return EINA_FALSE;
1957 rp = _edje_real_part_recursive_get(ed, part);
1958 if (!rp) return EINA_FALSE;
1959 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1961 return _edje_entry_cursor_is_format_get(rp, cur);
1967 edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1972 ed = _edje_fetch(obj);
1973 if ((!ed) || (!part)) return 0;
1974 rp = _edje_real_part_recursive_get(ed, part);
1976 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1978 return _edje_entry_cursor_is_visible_format_get(rp, cur);
1984 edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1989 ed = _edje_fetch(obj);
1990 if ((!ed) || (!part)) return NULL;
1991 rp = _edje_real_part_recursive_get(ed, part);
1992 if (!rp) return NULL;
1993 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1995 return _edje_entry_cursor_content_get(rp, cur);
2001 edje_object_part_text_cursor_pos_set(Evas_Object *obj, const char *part, Edje_Cursor cur, int pos)
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_cursor_pos_set(rp, cur, pos);
2017 edje_object_part_text_cursor_pos_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
2022 ed = _edje_fetch(obj);
2023 if ((!ed) || (!part)) return 0;
2024 rp = _edje_real_part_recursive_get(ed, part);
2026 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2028 return _edje_entry_cursor_pos_get(rp, cur);
2034 edje_object_part_text_imf_context_reset(const Evas_Object *obj, const char *part)
2039 ed = _edje_fetch(obj);
2040 if ((!ed) || (!part)) return;
2041 rp = _edje_real_part_recursive_get(ed, part);
2043 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2045 _edje_entry_imf_context_reset(rp);
2050 edje_object_part_text_input_panel_layout_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Layout layout)
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_input_panel_layout_set(rp, layout);
2065 EAPI Edje_Input_Panel_Layout
2066 edje_object_part_text_input_panel_layout_get(const Evas_Object *obj, const char *part)
2071 ed = _edje_fetch(obj);
2072 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2073 rp = _edje_real_part_recursive_get(ed, part);
2074 if (!rp) return EINA_FALSE;
2075 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2077 return _edje_entry_input_panel_layout_get(rp);
2079 return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2083 edje_object_part_text_autocapital_type_set(Evas_Object *obj, const char *part, Edje_Text_Autocapital_Type autocapital_type)
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_autocapital_type_set(rp, autocapital_type);
2098 EAPI Edje_Text_Autocapital_Type
2099 edje_object_part_text_autocapital_type_get(const Evas_Object *obj, const char *part)
2104 ed = _edje_fetch(obj);
2105 if ((!ed) || (!part)) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2106 rp = _edje_real_part_recursive_get(ed, part);
2107 if (!rp) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2108 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2110 return _edje_entry_autocapital_type_get(rp);
2112 return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2116 edje_object_part_text_prediction_allow_set(Evas_Object *obj, const char *part, Eina_Bool prediction)
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_prediction_allow_set(rp, prediction);
2132 edje_object_part_text_prediction_allow_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_prediction_allow_get(rp);
2149 edje_object_part_text_input_panel_enabled_set(Evas_Object *obj, const char *part, Eina_Bool enabled)
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)
2160 _edje_entry_input_panel_enabled_set(rp, enabled);
2165 edje_object_part_text_input_panel_enabled_get(const Evas_Object *obj, const char *part)
2170 ed = _edje_fetch(obj);
2171 if ((!ed) || (!part)) return EINA_FALSE;
2172 rp = _edje_real_part_recursive_get(ed, part);
2173 if (!rp) return EINA_FALSE;
2174 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2176 return _edje_entry_input_panel_enabled_get(rp);
2182 edje_object_part_text_input_panel_show(const Evas_Object *obj, const char *part)
2187 ed = _edje_fetch(obj);
2188 if ((!ed) || (!part)) return;
2189 rp = _edje_real_part_recursive_get(ed, part);
2191 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2192 _edje_entry_input_panel_show(rp);
2196 edje_object_part_text_input_panel_hide(const Evas_Object *obj, const char *part)
2201 ed = _edje_fetch(obj);
2202 if ((!ed) || (!part)) return;
2203 rp = _edje_real_part_recursive_get(ed, part);
2205 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2206 _edje_entry_input_panel_hide(rp);
2210 edje_object_part_text_input_panel_language_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Lang lang)
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_language_set(rp, lang);
2225 EAPI Edje_Input_Panel_Lang
2226 edje_object_part_text_input_panel_language_get(const Evas_Object *obj, const char *part)
2231 ed = _edje_fetch(obj);
2232 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2233 rp = _edje_real_part_recursive_get(ed, part);
2234 if (!rp) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2235 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2237 return _edje_entry_input_panel_language_get(rp);
2239 return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2243 edje_object_part_text_input_panel_imdata_set(Evas_Object *obj, const char *part, const void *data, int len)
2248 ed = _edje_fetch(obj);
2249 if ((!ed) || (!part)) return;
2250 rp = _edje_real_part_recursive_get(ed, part);
2252 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2254 _edje_entry_input_panel_imdata_set(rp, data, len);
2259 edje_object_part_text_input_panel_imdata_get(const Evas_Object *obj, const char *part, void *data, int *len)
2264 ed = _edje_fetch(obj);
2265 if ((!ed) || (!part)) return;
2266 rp = _edje_real_part_recursive_get(ed, part);
2268 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2270 _edje_entry_input_panel_imdata_get(rp, data, len);
2275 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)
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_type_set(rp, return_key_type);
2290 EAPI Edje_Input_Panel_Return_Key_Type
2291 edje_object_part_text_input_panel_return_key_type_get(const Evas_Object *obj, const char *part)
2296 ed = _edje_fetch(obj);
2297 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2298 rp = _edje_real_part_recursive_get(ed, part);
2299 if (!rp) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2300 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2302 return _edje_entry_input_panel_return_key_type_get(rp);
2304 return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2308 edje_object_part_text_input_panel_return_key_disabled_set(Evas_Object *obj, const char *part, Eina_Bool disabled)
2313 ed = _edje_fetch(obj);
2314 if ((!ed) || (!part)) return;
2315 rp = _edje_real_part_recursive_get(ed, part);
2317 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2319 _edje_entry_input_panel_return_key_disabled_set(rp, disabled);
2324 edje_object_part_text_input_panel_return_key_disabled_get(const Evas_Object *obj, const char *part)
2329 ed = _edje_fetch(obj);
2330 if ((!ed) || (!part)) return EINA_FALSE;
2331 rp = _edje_real_part_recursive_get(ed, part);
2332 if (!rp) return EINA_FALSE;
2333 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2335 return _edje_entry_input_panel_return_key_disabled_get(rp);
2341 edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2344 Edje_Text_Insert_Filter_Callback *cb;
2346 ed = _edje_fetch(obj);
2347 if ((!ed) || (!part)) return;
2348 cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
2349 cb->part = eina_stringshare_add(part);
2351 cb->data = (void *)data;
2352 ed->text_insert_filter_callbacks =
2353 eina_list_append(ed->text_insert_filter_callbacks, cb);
2357 edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
2360 Edje_Text_Insert_Filter_Callback *cb;
2363 ed = _edje_fetch(obj);
2364 if ((!ed) || (!part)) return NULL;
2365 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2367 if ((!strcmp(cb->part, part)) && (cb->func == func))
2369 void *data = cb->data;
2370 ed->text_insert_filter_callbacks =
2371 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2372 eina_stringshare_del(cb->part);
2381 edje_object_text_insert_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2384 Edje_Text_Insert_Filter_Callback *cb;
2387 ed = _edje_fetch(obj);
2388 if ((!ed) || (!part)) return NULL;
2389 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2391 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2394 void *tmp = cb->data;
2395 ed->text_insert_filter_callbacks =
2396 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2397 eina_stringshare_del(cb->part);
2406 edje_object_text_markup_filter_callback_add(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2409 Edje_Markup_Filter_Callback *cb;
2411 ed = _edje_fetch(obj);
2412 if ((!ed) || (!part)) return;
2413 cb = calloc(1, sizeof(Edje_Markup_Filter_Callback));
2414 cb->part = eina_stringshare_add(part);
2416 cb->data = (void *)data;
2417 ed->markup_filter_callbacks =
2418 eina_list_append(ed->markup_filter_callbacks, cb);
2422 edje_object_text_markup_filter_callback_del(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func)
2425 Edje_Markup_Filter_Callback *cb;
2428 ed = _edje_fetch(obj);
2429 if ((!ed) || (!part)) return NULL;
2430 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2432 if ((!strcmp(cb->part, part)) && (cb->func == func))
2434 void *data = cb->data;
2435 ed->markup_filter_callbacks =
2436 eina_list_remove_list(ed->markup_filter_callbacks, l);
2437 eina_stringshare_del(cb->part);
2446 edje_object_text_markup_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2449 Edje_Markup_Filter_Callback *cb;
2452 ed = _edje_fetch(obj);
2453 if ((!ed) || (!part)) return NULL;
2454 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2456 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2459 void *tmp = cb->data;
2460 ed->markup_filter_callbacks =
2461 eina_list_remove_list(ed->markup_filter_callbacks, l);
2462 eina_stringshare_del(cb->part);
2471 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
2475 Edje_User_Defined *eud = NULL;
2477 ed = _edje_fetch(obj);
2478 if ((!ed) || (!part)) return EINA_FALSE;
2480 /* Need to recalc before providing the object. */
2481 // XXX: I guess this is not required, removing for testing purposes
2482 // XXX: uncomment if you see glitches in e17 or others.
2483 // XXX: by Gustavo, January 21th 2009.
2484 // XXX: I got a backtrace with over 30000 calls without this,
2485 // XXX: only with 32px shelves. The problem is probably somewhere else,
2486 // XXX: but until it's found, leave this here.
2487 // XXX: by Sachiel, January 21th 2009, 19:30 UTC
2488 _edje_recalc_do(ed);
2490 rp = evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2493 /* The object is already swallowed somewhere, unswallow it first */
2494 edje_object_part_unswallow(rp->edje->obj, obj_swallow);
2497 rp = _edje_real_part_recursive_get(ed, part);
2500 DBG("cannot swallow part %s: part not exist!", part);
2503 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2505 ERR("cannot swallow part %s: not swallow type!", rp->part->name);
2508 _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE);
2510 if (rp->swallowed_object)
2514 eud = _edje_user_definition_new(EDJE_USER_SWALLOW, part, ed);
2515 evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
2517 else ed->user_defined = eina_list_append(ed->user_defined, eud);
2521 eud->u.swallow.child = obj_swallow;
2529 _recalc_extern_parent(Evas_Object *obj)
2531 Evas_Object *parent;
2534 parent = evas_object_smart_parent_get(obj);
2535 ed = _edje_fetch(parent);
2538 ed->recalc_call = 1; // ZZZ: ???
2543 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
2547 evas_object_size_hint_min_set(obj, minw, minh);
2548 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2551 rp->swallow_params.min.w = minw;
2552 rp->swallow_params.min.h = minh;
2554 _recalc_extern_parent(obj);
2559 edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
2563 evas_object_size_hint_max_set(obj, maxw, maxh);
2564 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2567 rp->swallow_params.max.w = maxw;
2568 rp->swallow_params.max.h = maxh;
2570 _recalc_extern_parent(obj);
2575 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
2578 Evas_Aspect_Control asp;
2580 asp = EVAS_ASPECT_CONTROL_NONE;
2583 case EDJE_ASPECT_CONTROL_NONE: asp = EVAS_ASPECT_CONTROL_NONE; break;
2585 case EDJE_ASPECT_CONTROL_NEITHER: asp = EVAS_ASPECT_CONTROL_NEITHER; break;
2587 case EDJE_ASPECT_CONTROL_HORIZONTAL: asp = EVAS_ASPECT_CONTROL_HORIZONTAL; break;
2589 case EDJE_ASPECT_CONTROL_VERTICAL: asp = EVAS_ASPECT_CONTROL_VERTICAL; break;
2591 case EDJE_ASPECT_CONTROL_BOTH: asp = EVAS_ASPECT_CONTROL_BOTH; break;
2597 evas_object_size_hint_aspect_set(obj, asp, aw, ah);
2598 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2601 rp->swallow_params.aspect.mode = aspect;
2602 rp->swallow_params.aspect.w = aw;
2603 rp->swallow_params.aspect.h = ah;
2604 _recalc_extern_parent(obj);
2608 struct edje_box_layout_builtin
2611 Evas_Object_Box_Layout cb;
2614 static Evas_Object_Box_Layout
2615 _edje_box_layout_builtin_find(const char *name)
2617 const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
2618 {"horizontal", evas_object_box_layout_horizontal},
2619 {"horizontal_flow", evas_object_box_layout_flow_horizontal},
2620 {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
2621 {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
2622 {"stack", evas_object_box_layout_stack},
2623 {"vertical", evas_object_box_layout_vertical},
2624 {"vertical_flow", evas_object_box_layout_flow_vertical},
2625 {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
2626 {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
2629 const struct edje_box_layout_builtin *base;
2634 base = _edje_box_layout_builtin + 0;
2638 base = _edje_box_layout_builtin + 4;
2642 base = _edje_box_layout_builtin + 5;
2649 for (; (base->name) && (base->name[0] == name[0]); base++)
2650 if (strcmp(base->name, name) == 0)
2656 static Eina_Rbtree_Direction
2657 _edje_box_layout_external_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right, __UNUSED__ void *data)
2659 Edje_Box_Layout *l = (Edje_Box_Layout *)left;
2660 Edje_Box_Layout *r = (Edje_Box_Layout *)right;
2662 if (strcmp(l->name, r->name) < 0)
2663 return EINA_RBTREE_RIGHT;
2665 return EINA_RBTREE_LEFT;
2669 _edje_box_layout_external_find_cmp(const Eina_Rbtree *node, const void *key, __UNUSED__ int length, __UNUSED__ void *data)
2671 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2672 return strcmp(key, l->name);
2675 static Edje_Box_Layout *
2676 _edje_box_layout_external_find(const char *name)
2678 return (Edje_Box_Layout *)eina_rbtree_inline_lookup
2679 (_edje_box_layout_registry, name, 0, _edje_box_layout_external_find_cmp,
2684 _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void(**free_data) (void *data))
2686 const Edje_Box_Layout *l;
2688 if (!name) return EINA_FALSE;
2690 *cb = _edje_box_layout_builtin_find(name);
2698 l = _edje_box_layout_external_find(name);
2699 if (!l) return EINA_FALSE;
2702 *free_data = l->layout_data_free;
2703 if (l->layout_data_get)
2704 *data = l->layout_data_get(l->data);
2712 _edje_box_layout_external_free(Eina_Rbtree *node, __UNUSED__ void *data)
2714 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2716 if (l->data && l->free_data)
2717 l->free_data(l->data);
2721 static Edje_Box_Layout *
2722 _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)
2727 name_len = strlen(name) + 1;
2728 l = malloc(sizeof(Edje_Box_Layout) + name_len);
2729 if (!l) return NULL;
2732 l->layout_data_get = layout_data_get;
2733 l->layout_data_free = layout_data_free;
2734 l->free_data = free_data;
2737 memcpy(l->name, name, name_len);
2743 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)
2749 if (_edje_box_layout_builtin_find(name))
2751 ERR("Cannot register layout '%s': would override builtin!",
2754 if (data && free_data) free_data(data);
2758 l = _edje_box_layout_external_find(name);
2763 if (data && free_data) free_data(data);
2767 l = _edje_box_layout_external_new
2768 (name, func, layout_data_get, layout_data_free, free_data, data);
2772 _edje_box_layout_registry = eina_rbtree_inline_insert
2773 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2774 _edje_box_layout_external_node_cmp, NULL);
2780 if (l->data && l->free_data) l->free_data(l->data);
2783 l->layout_data_get = layout_data_get;
2784 l->layout_data_free = layout_data_free;
2785 l->free_data = free_data;
2790 if (data && free_data) free_data(data);
2792 _edje_box_layout_registry = eina_rbtree_inline_remove
2793 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2794 _edje_box_layout_external_node_cmp, NULL);
2795 _edje_box_layout_external_free((Eina_Rbtree *)l, NULL);
2801 edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
2805 if (!obj_swallow) return;
2807 rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2810 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2812 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
2816 if (rp->swallowed_object == obj_swallow)
2818 Edje_User_Defined *eud;
2825 ed = _edje_fetch(obj);
2828 ERR("edje_object_part_unswallow called on a non Edje object ('%s').",
2829 evas_object_type_get(obj));
2833 EINA_LIST_FOREACH(ed->user_defined, l, eud)
2834 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj_swallow)
2836 _edje_user_definition_free(eud);
2842 _edje_real_part_swallow_clear(rp);
2843 rp->swallowed_object = NULL;
2844 rp->swallow_params.min.w = 0;
2845 rp->swallow_params.min.h = 0;
2846 rp->swallow_params.max.w = 0;
2847 rp->swallow_params.max.h = 0;
2848 rp->edje->dirty = 1;
2849 rp->edje->recalc_call = 1;
2850 #ifdef EDJE_CALC_CACHE
2853 _edje_recalc_do(rp->edje);
2859 edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
2864 ed = _edje_fetch(obj);
2865 if ((!ed) || (!part)) return NULL;
2867 /* Need to recalc before providing the object. */
2868 _edje_recalc_do(ed);
2870 rp = _edje_real_part_recursive_get(ed, part);
2871 if (!rp) return NULL;
2872 return rp->swallowed_object;
2876 edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2880 ed = _edje_fetch(obj);
2881 if ((!ed) || (!ed->collection))
2883 if (minw) *minw = 0;
2884 if (minh) *minh = 0;
2887 if (minw) *minw = ed->collection->prop.min.w;
2888 if (minh) *minh = ed->collection->prop.min.h;
2892 edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
2896 ed = _edje_fetch(obj);
2897 if ((!ed) || (!ed->collection))
2899 if (maxw) *maxw = 0;
2900 if (maxh) *maxh = 0;
2904 /* Need to recalc before providing the object. */
2905 _edje_recalc_do(ed);
2907 if (ed->collection->prop.max.w == 0)
2909 /* XXX TODO: convert maxw to 0, fix things that break. */
2910 if (maxw) *maxw = EDJE_INF_MAX_W;
2914 if (maxw) *maxw = ed->collection->prop.max.w;
2916 if (ed->collection->prop.max.h == 0)
2918 /* XXX TODO: convert maxh to 0, fix things that break. */
2919 if (maxh) *maxh = EDJE_INF_MAX_H;
2923 if (maxh) *maxh = ed->collection->prop.max.h;
2928 edje_object_calc_force(Evas_Object *obj)
2933 ed = _edje_fetch(obj);
2936 #ifdef EDJE_CALC_CACHE
2937 ed->all_part_change = 1;
2940 pf2 = _edje_freeze_val;
2943 _edje_freeze_val = 0;
2946 _edje_recalc_do(ed);
2949 _edje_freeze_val = pf2;
2953 edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2955 edje_object_size_min_restricted_calc(obj, minw, minh, 0, 0);
2959 edje_object_parts_extends_calc(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
2962 Evas_Coord xx1 = INT_MAX, yy1 = INT_MAX;
2963 Evas_Coord xx2 = 0, yy2 = 0;
2966 ed = _edje_fetch(obj);
2978 /* Need to recalc before providing the object. */
2980 _edje_recalc_do(ed);
2982 for (i = 0; i < ed->table_parts_size; i++)
2985 Evas_Coord rpx1, rpy1;
2986 Evas_Coord rpx2, rpy2;
2988 rp = ed->table_parts[i];
2992 rpx2 = rpx1 + rp->w;
2993 rpy2 = rpy1 + rp->h;
2995 if (xx1 > rpx1) xx1 = rpx1;
2996 if (yy1 > rpy1) yy1 = rpy1;
2997 if (xx2 < rpx2) xx2 = rpx2;
2998 if (yy2 < rpy2) yy2 = rpy2;
3005 if (w) *w = xx2 - xx1;
3006 if (h) *h = yy2 - yy1;
3012 edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh, Evas_Coord restrictedw, Evas_Coord restrictedh)
3019 Edje_Real_Part *pep = NULL;
3020 Eina_Bool has_non_fixed_tb = EINA_FALSE;
3022 ed = _edje_fetch(obj);
3023 if ((!ed) || (!ed->collection))
3025 if (minw) *minw = restrictedw;
3026 if (minh) *minh = restrictedh;
3035 ed->w = restrictedw;
3036 ed->h = restrictedh;
3047 #ifdef EDJE_CALC_CACHE
3048 ed->all_part_change = 1;
3050 _edje_recalc_do(ed);
3057 has_non_fixed_tb = EINA_FALSE;
3058 for (i = 0; i < ed->table_parts_size; i++)
3064 ep = ed->table_parts[i];
3065 w = ep->w - ep->req.w;
3066 h = ep->h - ep->req.h;
3068 if (ep->chosen_description)
3070 if (!ep->chosen_description->fixed.w)
3072 if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
3075 evas_object_textblock_size_formatted_get(ep->object,
3082 has_non_fixed_tb = EINA_TRUE;
3092 if (!ep->chosen_description->fixed.h)
3094 if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
3095 (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
3106 if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
3108 has_non_fixed_tb = EINA_TRUE;
3116 if (ed->w < restrictedw) ed->w = restrictedw;
3121 if (ed->h < restrictedh) ed->h = restrictedh;
3123 if ((ed->w > 4000) || (ed->h > 4000))
3125 /* Only print it if we have a non-fixed textblock.
3126 * We should possibly avoid all of this if in this case, but in
3127 * the meanwhile, just doing this. */
3128 if (!has_non_fixed_tb)
3131 ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
3132 ed->path, ed->group, pep->part->name);
3134 ERR("file %s, group %s overflowed 4000x4000 with minimum size of %dx%d. Continuing discarding faulty parts.",
3135 ed->path, ed->group, ed->w, ed->h);
3149 if (minw) *minw = ed->min.w;
3150 if (minh) *minh = ed->min.h;
3155 #ifdef EDJE_CALC_CACHE
3156 ed->all_part_change = 1;
3162 /* FIXME: Correctly return other states */
3164 edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val_ret)
3169 ed = _edje_fetch(obj);
3170 if ((!ed) || (!part))
3172 if (val_ret) *val_ret = 0;
3176 /* Need to recalc before providing the object. */
3177 _edje_recalc_do(ed);
3179 rp = _edje_real_part_recursive_get(ed, part);
3182 if (val_ret) *val_ret = 0;
3183 INF("part not found");
3186 if (rp->chosen_description)
3188 if (val_ret) *val_ret = rp->chosen_description->state.value;
3189 if (rp->chosen_description->state.name)
3190 return rp->chosen_description->state.name;
3195 if (rp->param1.description)
3197 if (val_ret) *val_ret = rp->param1.description->state.value;
3198 if (rp->param1.description->state.name)
3199 return rp->param1.description->state.name;
3203 if (val_ret) *val_ret = 0;
3208 edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
3213 ed = _edje_fetch(obj);
3214 if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
3216 /* Need to recalc before providing the object. */
3217 _edje_recalc_do(ed);
3219 rp = _edje_real_part_recursive_get(ed, part);
3220 if (!rp) return EDJE_DRAG_DIR_NONE;
3221 if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
3222 else if (rp->part->dragable.x)
3223 return EDJE_DRAG_DIR_X;
3224 else if (rp->part->dragable.y)
3225 return EDJE_DRAG_DIR_Y;
3226 return EDJE_DRAG_DIR_NONE;
3230 edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
3234 Edje_User_Defined *eud;
3237 ed = _edje_fetch(obj);
3238 if ((!ed) || (!part)) return EINA_FALSE;
3239 rp = _edje_real_part_recursive_get(ed, part);
3240 if (!rp) return EINA_FALSE;
3241 if (!rp->drag) return EINA_FALSE;
3242 if (rp->drag->down.count > 0) return EINA_FALSE;
3244 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3245 if (eud->type == EDJE_USER_DRAG_VALUE && !strcmp(part, eud->part))
3247 eud->u.drag_position.x = dx;
3248 eud->u.drag_position.y = dy;
3253 eud = _edje_user_definition_new(EDJE_USER_DRAG_VALUE, part, ed);
3256 eud->u.drag_position.x = dx;
3257 eud->u.drag_position.y = dy;
3261 if (rp->part->dragable.confine_id != -1)
3263 dx = CLAMP(dx, 0.0, 1.0);
3264 dy = CLAMP(dy, 0.0, 1.0);
3266 if (rp->part->dragable.x < 0) dx = 1.0 - dx;
3267 if (rp->part->dragable.y < 0) dy = 1.0 - dy;
3268 if ((rp->drag->val.x == FROM_DOUBLE(dx)) && (rp->drag->val.y == FROM_DOUBLE(dy))) return EINA_TRUE;
3269 rp->drag->val.x = FROM_DOUBLE(dx);
3270 rp->drag->val.y = FROM_DOUBLE(dy);
3271 #ifdef EDJE_CALC_CACHE
3274 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3275 _edje_emit(rp->edje, "drag,set", rp->part->name);
3279 /* FIXME: Should this be x and y instead of dx/dy? */
3281 edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3287 ed = _edje_fetch(obj);
3288 if ((!ed) || (!part))
3295 /* Need to recalc before providing the object. */
3296 _edje_recalc_do(ed);
3298 rp = _edje_real_part_recursive_get(ed, part);
3299 if (!rp || !rp->drag)
3305 ddx = TO_DOUBLE(rp->drag->val.x);
3306 ddy = TO_DOUBLE(rp->drag->val.y);
3307 if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
3308 if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
3315 edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
3319 Edje_User_Defined *eud;
3322 ed = _edje_fetch(obj);
3323 if ((!ed) || (!part)) return EINA_FALSE;
3324 rp = _edje_real_part_recursive_get(ed, part);
3325 if (!rp) return EINA_FALSE;
3326 if (!rp->drag) return EINA_FALSE;
3328 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3329 if (eud->type == EDJE_USER_DRAG_SIZE && !strcmp(part, eud->part))
3331 eud->u.drag_size.w = dw;
3332 eud->u.drag_size.h = dh;
3337 eud = _edje_user_definition_new(EDJE_USER_DRAG_SIZE, part, ed);
3340 eud->u.drag_size.w = dw;
3341 eud->u.drag_size.h = dh;
3345 if (dw < 0.0) dw = 0.0;
3348 if (dh < 0.0) dh = 0.0;
3351 if ((rp->drag->size.x == FROM_DOUBLE(dw)) && (rp->drag->size.y == FROM_DOUBLE(dh))) return EINA_TRUE;
3352 rp->drag->size.x = FROM_DOUBLE(dw);
3353 rp->drag->size.y = FROM_DOUBLE(dh);
3354 rp->edje->dirty = 1;
3355 rp->edje->recalc_call = 1;
3356 #ifdef EDJE_CALC_CACHE
3359 _edje_recalc(rp->edje);
3364 edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double *dw, double *dh)
3369 ed = _edje_fetch(obj);
3370 if ((!ed) || (!part))
3377 /* Need to recalc before providing the object. */
3378 _edje_recalc_do(ed);
3380 rp = _edje_real_part_recursive_get(ed, part);
3381 if (!rp || !rp->drag)
3387 if (dw) *dw = TO_DOUBLE(rp->drag->size.x);
3388 if (dh) *dh = TO_DOUBLE(rp->drag->size.y);
3393 edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
3397 Edje_User_Defined *eud;
3400 ed = _edje_fetch(obj);
3401 if ((!ed) || (!part)) return EINA_FALSE;
3402 rp = _edje_real_part_recursive_get(ed, part);
3403 if (!rp) return EINA_FALSE;
3404 if (!rp->drag) return EINA_FALSE;
3406 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3407 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3409 eud->u.drag_position.x = dx;
3410 eud->u.drag_position.y = dy;
3415 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3418 eud->u.drag_position.x = dx;
3419 eud->u.drag_position.y = dy;
3423 if (dx < 0.0) dx = 0.0;
3426 if (dy < 0.0) dy = 0.0;
3429 rp->drag->step.x = FROM_DOUBLE(dx);
3430 rp->drag->step.y = FROM_DOUBLE(dy);
3431 #ifdef EDJE_CALC_CACHE
3438 edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3443 ed = _edje_fetch(obj);
3444 if ((!ed) || (!part))
3451 /* Need to recalc before providing the object. */
3452 _edje_recalc_do(ed);
3454 rp = _edje_real_part_recursive_get(ed, part);
3455 if (!rp || !rp->drag)
3461 if (dx) *dx = TO_DOUBLE(rp->drag->step.x);
3462 if (dy) *dy = TO_DOUBLE(rp->drag->step.y);
3467 edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
3471 Edje_User_Defined *eud;
3474 ed = _edje_fetch(obj);
3475 if ((!ed) || (!part)) return EINA_FALSE;
3476 rp = _edje_real_part_recursive_get(ed, part);
3477 if (!rp) return EINA_FALSE;
3478 if (!rp->drag) return EINA_FALSE;
3480 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3481 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3483 eud->u.drag_position.x = dx;
3484 eud->u.drag_position.y = dy;
3489 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3492 eud->u.drag_position.x = dx;
3493 eud->u.drag_position.y = dy;
3497 if (dx < 0.0) dx = 0.0;
3500 if (dy < 0.0) dy = 0.0;
3503 rp->drag->page.x = FROM_DOUBLE(dx);
3504 rp->drag->page.y = FROM_DOUBLE(dy);
3505 #ifdef EDJE_CALC_CACHE
3512 edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3517 ed = _edje_fetch(obj);
3518 if ((!ed) || (!part))
3525 /* Need to recalc before providing the object. */
3526 _edje_recalc_do(ed);
3528 rp = _edje_real_part_recursive_get(ed, part);
3529 if (!rp || !rp->drag)
3535 if (dx) *dx = TO_DOUBLE(rp->drag->page.x);
3536 if (dy) *dy = TO_DOUBLE(rp->drag->page.y);
3541 edje_object_part_drag_step(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_STEP && !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_STEP, 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),
3576 MUL(rp->drag->step.x, rp->part->dragable.x)));
3577 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy),
3578 MUL(rp->drag->step.y, rp->part->dragable.y)));
3579 rp->drag->val.x = CLAMP(rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3580 rp->drag->val.y = CLAMP(rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3581 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3582 #ifdef EDJE_CALC_CACHE
3585 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3586 _edje_emit(rp->edje, "drag,step", rp->part->name);
3591 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
3596 Edje_User_Defined *eud;
3599 ed = _edje_fetch(obj);
3600 if ((!ed) || (!part)) return EINA_FALSE;
3601 rp = _edje_real_part_recursive_get(ed, part);
3602 if (!rp) return EINA_FALSE;
3603 if (!rp->drag) return EINA_FALSE;
3604 if (rp->drag->down.count > 0) return EINA_FALSE;
3606 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3607 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3609 eud->u.drag_position.x = dx;
3610 eud->u.drag_position.y = dy;
3615 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3618 eud->u.drag_position.x = dx;
3619 eud->u.drag_position.y = dy;
3623 px = rp->drag->val.x;
3624 py = rp->drag->val.y;
3625 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x)));
3626 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy), MUL(rp->drag->page.y, rp->part->dragable.y)));
3627 rp->drag->val.x = CLAMP(rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3628 rp->drag->val.y = CLAMP(rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3629 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3630 #ifdef EDJE_CALC_CACHE
3633 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3634 _edje_emit(rp->edje, "drag,page", rp->part->name);
3639 _edje_box_init(void)
3644 _edje_box_shutdown(void)
3646 if (!_edje_box_layout_registry)
3650 (_edje_box_layout_registry, _edje_box_layout_external_free, NULL);
3651 _edje_box_layout_registry = NULL;
3655 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
3661 ed = _edje_fetch(obj);
3662 if ((!ed) || (!part) || (!child)) return EINA_FALSE;
3664 rp = _edje_real_part_recursive_get(ed, part);
3665 if (!rp) return EINA_FALSE;
3666 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3668 r = _edje_real_part_box_append(rp, child);
3672 Edje_User_Defined *eud;
3674 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3676 eud->u.box.child = child;
3677 eud->u.box.index = -1;
3679 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3685 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
3691 ed = _edje_fetch(obj);
3692 if ((!ed) || (!part)) return EINA_FALSE;
3694 rp = _edje_real_part_recursive_get(ed, part);
3695 if (!rp) return EINA_FALSE;
3696 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3698 r = _edje_real_part_box_prepend(rp, child);
3702 Edje_User_Defined *eud;
3704 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3706 eud->u.box.child = child;
3708 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3714 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
3720 ed = _edje_fetch(obj);
3721 if ((!ed) || (!part)) return EINA_FALSE;
3723 rp = _edje_real_part_recursive_get(ed, part);
3724 if (!rp) return EINA_FALSE;
3725 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3727 r = _edje_real_part_box_insert_before(rp, child, reference);
3731 Edje_User_Defined *eud;
3733 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3735 eud->u.box.child = child;
3737 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3743 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
3749 ed = _edje_fetch(obj);
3750 if ((!ed) || (!part)) return EINA_FALSE;
3752 rp = _edje_real_part_recursive_get(ed, part);
3753 if (!rp) return EINA_FALSE;
3754 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3756 r = _edje_real_part_box_insert_at(rp, child, pos);
3760 Edje_User_Defined *eud;
3762 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3764 eud->u.box.child = child;
3766 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3772 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
3778 ed = _edje_fetch(obj);
3779 if ((!ed) || (!part)) return NULL;
3781 rp = _edje_real_part_recursive_get(ed, part);
3782 if (!rp) return NULL;
3783 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3785 r = _edje_real_part_box_remove(rp, child);
3789 Edje_User_Defined *eud;
3792 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3793 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == child && !strcmp(eud->part, part))
3795 _edje_user_definition_free(eud);
3803 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
3809 ed = _edje_fetch(obj);
3810 if ((!ed) || (!part)) return NULL;
3812 rp = _edje_real_part_recursive_get(ed, part);
3813 if (!rp) return NULL;
3814 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3816 r = _edje_real_part_box_remove_at(rp, pos);
3820 Edje_User_Defined *eud;
3823 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3824 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == r && !strcmp(eud->part, part))
3826 _edje_user_definition_free(eud);
3834 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
3840 ed = _edje_fetch(obj);
3841 if ((!ed) || (!part)) return EINA_FALSE;
3843 rp = _edje_real_part_recursive_get(ed, part);
3844 if (!rp) return EINA_FALSE;
3845 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3847 r = _edje_real_part_box_remove_all(rp, clear);
3850 Edje_User_Defined *eud;
3853 EINA_LIST_FOREACH_SAFE(ed->user_defined, l, ll, eud)
3854 if (eud->type == EDJE_USER_BOX_PACK && !strcmp(eud->part, part))
3856 _edje_user_definition_free(eud);
3864 edje_object_access_part_list_get(const Evas_Object *obj)
3867 Eina_List *access_parts = NULL;
3869 ed = _edje_fetch(obj);
3870 if ((!ed)) return NULL;
3873 for (i = 0; i < ed->table_parts_size; i++)
3876 rp = ed->table_parts[i];
3877 if (rp->part->access)
3878 access_parts = eina_list_append(access_parts, rp->part->name);
3881 return access_parts;
3885 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
3887 Edje_Real_Part *rp = data;
3889 rp->edje->dirty = 1;
3890 rp->edje->recalc_call = 1;
3891 #ifdef EDJE_CALC_CACHE
3894 _edje_recalc(rp->edje);
3898 _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
3900 evas_object_event_callback_add
3901 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3903 rp->edje->dirty = 1;
3904 rp->edje->recalc_call = 1;
3905 #ifdef EDJE_CALC_CACHE
3908 _edje_recalc(rp->edje);
3912 _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
3914 evas_object_event_callback_del_full
3915 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3917 rp->edje->dirty = 1;
3918 rp->edje->recalc_call = 1;
3919 #ifdef EDJE_CALC_CACHE
3922 _edje_recalc(rp->edje);
3926 _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj)
3928 Evas_Object_Box_Option *opt;
3930 opt = evas_object_box_append(rp->object, child_obj);
3931 if (!opt) return EINA_FALSE;
3933 if (!_edje_box_layout_add_child(rp, child_obj))
3935 evas_object_box_remove(rp->object, child_obj);
3939 _edje_box_child_add(rp, child_obj);
3945 _edje_real_part_box_prepend(Edje_Real_Part *rp, Evas_Object *child_obj)
3947 Evas_Object_Box_Option *opt;
3949 opt = evas_object_box_prepend(rp->object, child_obj);
3950 if (!opt) return EINA_FALSE;
3952 if (!_edje_box_layout_add_child(rp, child_obj))
3954 evas_object_box_remove(rp->object, child_obj);
3958 _edje_box_child_add(rp, child_obj);
3964 _edje_real_part_box_insert_before(Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref)
3966 Evas_Object_Box_Option *opt;
3968 opt = evas_object_box_insert_before(rp->object, child_obj, ref);
3969 if (!opt) return EINA_FALSE;
3971 if (!_edje_box_layout_add_child(rp, child_obj))
3973 evas_object_box_remove(rp->object, child_obj);
3977 _edje_box_child_add(rp, child_obj);
3983 _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned int pos)
3985 Evas_Object_Box_Option *opt;
3987 opt = evas_object_box_insert_at(rp->object, child_obj, pos);
3988 if (!opt) return EINA_FALSE;
3990 if (!_edje_box_layout_add_child(rp, child_obj))
3992 evas_object_box_remove(rp->object, child_obj);
3996 _edje_box_child_add(rp, child_obj);
4002 _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj)
4004 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
4005 if (!evas_object_box_remove(rp->object, child_obj)) return NULL;
4006 _edje_box_layout_remove_child(rp, child_obj);
4007 _edje_box_child_remove(rp, child_obj);
4012 _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
4014 Evas_Object_Box_Option *opt;
4015 Evas_Object_Box_Data *priv;
4016 Evas_Object *child_obj;
4018 priv = evas_object_smart_data_get(rp->object);
4019 opt = eina_list_nth(priv->children, pos);
4020 if (!opt) return NULL;
4021 child_obj = opt->obj;
4022 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
4023 if (!evas_object_box_remove_at(rp->object, pos)) return NULL;
4024 _edje_box_layout_remove_child(rp, child_obj);
4025 _edje_box_child_remove(rp, child_obj);
4030 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
4032 Eina_List *children;
4035 children = evas_object_box_children_get(rp->object);
4038 Evas_Object *child_obj = children->data;
4039 if (evas_object_data_get(child_obj, "\377 edje.box_item"))
4043 _edje_box_layout_remove_child(rp, child_obj);
4044 _edje_box_child_remove(rp, child_obj);
4045 if (!evas_object_box_remove_at(rp->object, i))
4048 evas_object_del(child_obj);
4050 children = eina_list_remove_list(children, children);
4056 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child, void *einfo __UNUSED__)
4058 Edje_User_Defined *eud;
4060 Edje_Real_Part *rp = data;
4062 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4063 if (rp->part->type == EDJE_PART_TYPE_BOX)
4065 if (eud->type == EDJE_USER_BOX_PACK &&
4066 eud->u.box.child == child &&
4067 !strcmp(rp->part->name, eud->part))
4069 _edje_user_definition_free(eud);
4073 else if (rp->part->type == EDJE_PART_TYPE_TABLE)
4075 if (eud->type == EDJE_USER_TABLE_PACK &&
4076 eud->u.table.child == child &&
4077 !strcmp(rp->part->name, eud->part))
4079 _edje_user_definition_free(eud);
4084 rp->edje->dirty = 1;
4085 rp->edje->recalc_call = 1;
4086 #ifdef EDJE_CALC_CACHE
4089 _edje_recalc(rp->edje);
4093 _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
4095 evas_object_event_callback_add
4096 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4098 rp->edje->dirty = 1;
4099 rp->edje->recalc_call = 1;
4100 #ifdef EDJE_CALC_CACHE
4103 _edje_recalc(rp->edje);
4107 _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
4109 evas_object_event_callback_del_full
4110 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4112 rp->edje->dirty = 1;
4113 rp->edje->recalc_call = 1;
4114 #ifdef EDJE_CALC_CACHE
4117 _edje_recalc(rp->edje);
4121 edje_object_part_table_child_get(const Evas_Object *obj, const char *part, unsigned int col, unsigned int row)
4126 ed = _edje_fetch(obj);
4127 if ((!ed) || (!part)) return NULL;
4129 rp = _edje_real_part_recursive_get(ed, part);
4130 if (!rp) return NULL;
4131 if (rp->part->type != EDJE_PART_TYPE_TABLE) return NULL;
4133 return evas_object_table_child_get(rp->object, col, row);
4137 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)
4141 Edje_User_Defined *eud;
4144 ed = _edje_fetch(obj);
4145 if ((!ed) || (!part)) return EINA_FALSE;
4147 rp = _edje_real_part_recursive_get(ed, part);
4148 if (!rp) return EINA_FALSE;
4149 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4151 r = _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
4154 eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed);
4157 eud->u.table.child = child_obj;
4158 eud->u.table.col = col;
4159 eud->u.table.row = row;
4160 eud->u.table.colspan = colspan;
4161 eud->u.table.rowspan = rowspan;
4163 evas_object_event_callback_add(child_obj, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
4169 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
4175 ed = _edje_fetch(obj);
4176 if ((!ed) || (!part)) return EINA_FALSE;
4178 rp = _edje_real_part_recursive_get(ed, part);
4179 if (!rp) return EINA_FALSE;
4180 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4182 r = _edje_real_part_table_unpack(rp, child_obj);
4186 Edje_User_Defined *eud;
4189 EINA_LIST_FOREACH(ed->user_defined, l, eud)
4190 if (eud->type == EDJE_USER_TABLE_PACK &&
4191 eud->u.table.child == child_obj &&
4192 !strcmp(part, eud->part))
4194 _edje_user_definition_free(eud);
4203 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
4208 ed = _edje_fetch(obj);
4209 if ((!ed) || (!part)) return EINA_FALSE;
4211 rp = _edje_real_part_recursive_get(ed, part);
4212 if (!rp) return EINA_FALSE;
4213 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4215 evas_object_table_col_row_size_get(rp->object, cols, rows);
4220 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
4225 ed = _edje_fetch(obj);
4226 if ((!ed) || (!part)) return EINA_FALSE;
4228 rp = _edje_real_part_recursive_get(ed, part);
4229 if (!rp) return EINA_FALSE;
4230 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4232 _edje_real_part_table_clear(rp, clear);
4237 _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
4239 Edje_Perspective *ps = data;
4242 EINA_LIST_FREE(ps->users, o)
4246 ed = evas_object_smart_data_get(o);
4250 ed->recalc_call = 1;
4251 _edje_recalc_do(ed);
4256 EAPI Edje_Perspective *
4257 edje_perspective_new(Evas *e)
4259 Edje_Perspective *ps;
4260 Evas_Coord vx, vy, vw, vh;
4262 if (!e) return NULL;
4263 ps = calloc(1, sizeof(Edje_Perspective));
4264 ps->obj = evas_object_rectangle_add(e);
4265 evas_object_data_set(ps->obj, "_edje_perspective", ps);
4266 evas_object_event_callback_add(ps->obj, EVAS_CALLBACK_DEL, _edje_perspective_obj_del, ps);
4267 evas_output_viewport_get(e, &vx, &vy, &vw, &vh);
4269 ps->px = vx + (vw / 2);
4270 ps->py = vy + (vh / 2);
4277 edje_perspective_free(Edje_Perspective *ps)
4280 evas_object_del(ps->obj);
4284 edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
4290 if ((ps->px == px) && (ps->py == py) && (ps->z0 == z0) && (ps->foc == foc)) return;
4295 EINA_LIST_FOREACH(ps->users, l, o)
4299 ed = evas_object_smart_data_get(o);
4304 ed->recalc_call = 1;
4305 _edje_recalc_do(ed);
4310 EINA_LIST_FOREACH(_edje_edjes, l, o)
4314 ed = evas_object_smart_data_get(o);
4319 ed->recalc_call = 1;
4320 _edje_recalc_do(ed);
4327 edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
4333 if (ps->global == global) return;
4336 o = evas_object_name_find(evas_object_evas_get(ps->obj),
4337 "_edje_perspective");
4338 if (o) evas_object_name_set(o, NULL);
4339 evas_object_name_set(ps->obj, "_edje_perspective");
4342 evas_object_name_set(ps->obj, NULL);
4343 ps->global = global;
4344 EINA_LIST_FOREACH(_edje_edjes, l, o)
4348 ed = evas_object_smart_data_get(o);
4353 ed->recalc_call = 1;
4354 _edje_recalc_do(ed);
4360 edje_perspective_global_get(const Edje_Perspective *ps)
4362 if (!ps) return EINA_FALSE;
4366 EAPI const Edje_Perspective *
4367 edje_evas_global_perspective_get(const Evas *e)
4371 if (!e) return NULL;
4372 obj = evas_object_name_find(e, "_edje_perspective");
4373 if (!obj) return NULL;
4374 return evas_object_data_get(obj, "_edje_perspective");
4378 edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
4382 ed = evas_object_smart_data_get(obj);
4384 if (ed->persp == ps) return;
4385 if (ed->persp != ps)
4388 ed->persp->users = eina_list_remove(ed->persp->users, obj);
4391 if (ps) ps->users = eina_list_append(ps->users, obj);
4393 ed->recalc_call = 1;
4394 _edje_recalc_do(ed);
4397 EAPI const Edje_Perspective *
4398 edje_object_perspective_get(const Evas_Object *obj)
4402 ed = evas_object_smart_data_get(obj);
4403 if (!ed) return NULL;
4407 #define EDJE_PRELOAD_EMISSION "preload,done"
4408 #define EDJE_PRELOAD_SOURCE NULL
4411 edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
4417 ed = _edje_fetch(obj);
4418 if (!ed) return EINA_FALSE;
4420 _edje_recalc_do(ed);
4422 for (i = 0, count = 0; i < ed->table_parts_size; i++)
4427 rp = ed->table_parts[i];
4430 if (ep->type == EDJE_PART_TYPE_IMAGE ||
4431 (ep->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object))
4435 ed->preload_count = count;
4439 for (i = 0; i < ed->table_parts_size; i++)
4444 rp = ed->table_parts[i];
4447 if (ep->type == EDJE_PART_TYPE_IMAGE)
4449 const char *file = NULL;
4450 const char *key = NULL;
4452 evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4454 evas_object_image_file_get(rp->object, &file, &key);
4457 ed->preload_count--;
4461 evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4462 evas_object_image_preload(rp->object, cancel);
4466 else if (ep->type == EDJE_PART_TYPE_GROUP)
4468 if (rp->swallowed_object)
4474 tmp = alloca(strlen(rp->part->name) + 2);
4475 sprintf(tmp, "%s:", rp->part->name);
4477 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb);
4478 edje_object_signal_callback_add(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb, ed);
4479 edje_object_preload(rp->swallowed_object, cancel);
4483 ed->preload_count--;
4493 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
4500 edje_object_update_hints_set(Evas_Object *obj, Eina_Bool update)
4504 ed = _edje_fetch(obj);
4506 if (ed->update_hints == !!update) return;
4508 ed->update_hints = !!update;
4511 ed->recalc_hints = 1;
4517 edje_object_update_hints_get(Evas_Object *obj)
4521 ed = _edje_fetch(obj);
4522 if (!ed) return EINA_FALSE;
4524 return ed->update_hints;
4528 _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)
4531 evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
4533 _edje_table_child_add(rp, child_obj);
4539 _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
4541 Eina_Bool ret = evas_object_table_unpack(rp->object, child_obj);
4544 _edje_table_child_remove(rp, child_obj);
4550 _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
4552 Eina_List *children;
4554 children = evas_object_table_children_get(rp->object);
4557 Evas_Object *child_obj = children->data;
4559 _edje_table_child_remove(rp, child_obj);
4560 if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
4562 evas_object_table_unpack(rp->object, child_obj);
4564 evas_object_del(child_obj);
4566 children = eina_list_remove_list(children, children);
4571 _edje_real_part_recursive_get(const Edje *ed, const char *part)
4576 path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
4577 if (!path) return NULL;
4579 rp = _edje_real_part_recursive_get_helper(ed, path);
4587 _edje_children_get(Edje_Real_Part *rp, const char *partid)
4594 if (!partid) return NULL;
4596 switch (rp->part->type)
4598 case EDJE_PART_TYPE_EXTERNAL:
4599 return _edje_external_content_get(rp->swallowed_object, partid);
4601 case EDJE_PART_TYPE_BOX:
4602 l = evas_object_box_children_get(rp->object);
4605 case EDJE_PART_TYPE_TABLE:
4606 l = evas_object_table_children_get(rp->object);
4613 v = strtol(partid, &p, 10);
4614 if ((*p == '\0') && (v >= 0))
4616 child = eina_list_nth(l, v);
4622 EINA_LIST_FREE(l, cur)
4624 const char *name = evas_object_name_get(cur);
4625 if ((name) && (!strcmp(name, partid)))
4637 /* rebuild alternative path */
4639 _edje_merge_path(const char *alias, char *const *path)
4642 unsigned int length = 1;
4643 unsigned int alias_length;
4646 if (!alias) return NULL;
4648 alias_length = strlen(alias);
4650 for (i = 0; path[i]; i++)
4651 length += strlen(path[i]) + 1;
4653 tmp = malloc(sizeof (char) * (length + alias_length + 2));
4654 memcpy(tmp, alias, alias_length);
4655 tmp[alias_length] = '\0';
4657 for (i = 0; path[i]; i++)
4659 strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
4660 strcat(tmp, path[i]);
4667 _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
4676 if (ed->collection && ed->collection->alias)
4680 alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
4683 rp = _edje_real_part_recursive_get(ed, alias);
4689 //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
4690 idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
4695 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
4704 rp = _edje_real_part_get(ed, path[0]);
4705 if (!path[1] && !idx) return rp;
4706 if (!rp) return NULL;
4708 switch (rp->part->type)
4710 case EDJE_PART_TYPE_GROUP:
4711 if (!rp->swallowed_object) return NULL;
4712 ed = _edje_fetch(rp->swallowed_object);
4713 if (!ed) return NULL;
4715 return _edje_real_part_recursive_get_helper(ed, path);
4717 case EDJE_PART_TYPE_BOX:
4718 case EDJE_PART_TYPE_TABLE:
4719 case EDJE_PART_TYPE_EXTERNAL:
4720 if (!idx) return rp;
4723 child = _edje_children_get(rp, idx);
4725 ed = _edje_fetch(child);
4727 if (!ed) return NULL;
4728 return _edje_real_part_recursive_get_helper(ed, path);
4735 /* Private Routines */
4737 _edje_real_part_get(const Edje *ed, const char *part)
4741 if (!part) return NULL;
4743 for (i = 0; i < ed->table_parts_size; i++)
4747 rp = ed->table_parts[i];
4748 if ((rp->part->name) && (!strcmp(rp->part->name, part))) return rp;
4754 _edje_color_class_find(Edje *ed, const char *color_class)
4756 Edje_Color_Class *cc = NULL;
4758 if ((!ed) || (!color_class)) return NULL;
4760 /* first look through the object scope */
4761 cc = eina_hash_find(ed->color_classes, color_class);
4764 /* next look through the global scope */
4765 cc = eina_hash_find(_edje_color_class_hash, color_class);
4768 /* finally, look through the file scope */
4769 cc = eina_hash_find(ed->file->color_hash, color_class);
4776 _edje_color_class_member_add(Edje *ed, const char *color_class)
4778 _edje_class_member_add(ed, &ed->members.color_class, &_edje_color_class_member_hash, color_class);
4782 _edje_color_class_member_direct_del(const char *color_class, void *l)
4784 _edje_class_member_direct_del(color_class, l, _edje_color_class_member_hash);
4788 _edje_color_class_member_del(Edje *ed, const char *color_class)
4790 if ((!ed) || (!color_class)) return;
4792 _edje_class_member_del(&ed->members.color_class, &_edje_color_class_member_hash, color_class);
4796 _edje_color_class_members_free(void)
4798 if (!_edje_color_class_member_hash) return;
4799 eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
4800 eina_hash_free(_edje_color_class_member_hash);
4801 _edje_color_class_member_hash = NULL;
4805 color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4807 Edje_Color_Class *cc;
4810 if (cc->name) eina_stringshare_del(cc->name);
4816 _edje_color_class_hash_free(void)
4818 if (!_edje_color_class_hash) return;
4819 eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
4820 eina_hash_free(_edje_color_class_hash);
4821 _edje_color_class_hash = NULL;
4825 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
4829 if ((ep->default_desc) && (ep->default_desc->color_class))
4830 _edje_color_class_member_del(ed, ep->default_desc->color_class);
4832 for (i = 0; i < ep->other.desc_count; ++i)
4833 if (ep->other.desc[i]->color_class)
4834 _edje_color_class_member_del(ed, ep->other.desc[i]->color_class);
4838 _edje_text_class_find(Edje *ed, const char *text_class)
4841 Edje_Text_Class *tc;
4843 if ((!ed) || (!text_class)) return NULL;
4844 EINA_LIST_FOREACH(ed->text_classes, l, tc)
4845 if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
4846 return eina_hash_find(_edje_text_class_hash, text_class);
4850 _edje_text_class_member_direct_del(const char *text_class,
4853 _edje_class_member_direct_del(text_class, l, _edje_text_class_member_hash);
4857 _edje_text_class_member_add(Edje *ed, const char *text_class)
4859 _edje_class_member_add(ed, &ed->members.text_class, &_edje_text_class_member_hash, text_class);
4863 _edje_text_class_member_del(Edje *ed, const char *text_class)
4865 if ((!ed) || (!text_class)) return;
4867 _edje_class_member_del(&ed->members.text_class, &_edje_text_class_member_hash, text_class);
4871 _edje_text_class_members_free(void)
4873 _edje_class_members_free(&_edje_text_class_member_hash);
4877 text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4879 Edje_Text_Class *tc;
4882 if (tc->name) eina_stringshare_del(tc->name);
4883 if (tc->font) eina_stringshare_del(tc->font);
4889 _edje_text_class_hash_free(void)
4891 if (!_edje_text_class_hash) return;
4892 eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
4893 eina_hash_free(_edje_text_class_hash);
4894 _edje_text_class_hash = NULL;
4898 _edje_fetch(const Evas_Object *obj)
4902 if (!evas_object_smart_type_check(obj, "edje"))
4904 ed = evas_object_smart_data_get(obj);
4905 if ((ed) && (ed->delete_me)) return NULL;
4910 _edje_freeze(Edje *ed)
4913 // printf("FREEZE %i\n", ed->freeze);
4918 _edje_thaw(Edje *ed)
4923 // printf("-------------########### OVER THAW\n");
4926 if ((ed->freeze == 0) && (ed->recalc))
4928 // printf("thaw recalc\n");
4935 _edje_block(Edje *ed)
4943 _edje_unblock(Edje *ed)
4947 if (!ed) return ret;
4950 if (ed->block == 0) ed->block_break = 0;
4957 _edje_block_break(Edje *ed)
4959 if (ed->block_break) return 1;
4964 _edje_block_violate(Edje *ed)
4966 if (ed->block > 0) ed->block_break = 1;
4970 _edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
4973 Edje_User_Defined *eud;
4978 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4979 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj)
4981 _edje_user_definition_free(eud);
4989 _edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
4993 type = evas_object_type_get(rp->swallowed_object);
4995 rp->swallow_params.min.w = 0;
4996 rp->swallow_params.min.h = 0;
4997 rp->swallow_params.max.w = -1;
4998 rp->swallow_params.max.h = -1;
4999 if ((type) && (!strcmp(type, "edje")))
5004 edje_object_size_min_get(rp->swallowed_object, &w, &h);
5005 rp->swallow_params.min.w = w;
5006 rp->swallow_params.min.h = h;
5008 edje_object_size_max_get(rp->swallowed_object, &w, &h);
5009 rp->swallow_params.max.w = w;
5010 rp->swallow_params.max.h = h;
5012 else if ((type) && ((!strcmp(type, "text")) || (!strcmp(type, "polygon")) ||
5013 (!strcmp(type, "line"))))
5017 evas_object_geometry_get(rp->swallowed_object, NULL, NULL, &w, &h);
5019 rp->swallow_params.min.w = w;
5020 rp->swallow_params.min.h = h;
5022 rp->swallow_params.max.w = w;
5023 rp->swallow_params.max.h = h;
5026 Evas_Coord w1, h1, w2, h2, aw, ah;
5027 Evas_Aspect_Control am;
5029 evas_object_size_hint_min_get(rp->swallowed_object, &w1, &h1);
5030 evas_object_size_hint_max_get(rp->swallowed_object, &w2, &h2);
5031 evas_object_size_hint_aspect_get(rp->swallowed_object, &am, &aw, &ah);
5032 rp->swallow_params.min.w = w1;
5033 rp->swallow_params.min.h = h1;
5034 if (w2 > 0) rp->swallow_params.max.w = w2;
5035 if (h2 > 0) rp->swallow_params.max.h = h2;
5038 case EVAS_ASPECT_CONTROL_NONE:
5039 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE;
5042 case EVAS_ASPECT_CONTROL_NEITHER:
5043 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER;
5046 case EVAS_ASPECT_CONTROL_HORIZONTAL:
5047 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL;
5050 case EVAS_ASPECT_CONTROL_VERTICAL:
5051 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
5054 case EVAS_ASPECT_CONTROL_BOTH:
5055 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH;
5061 rp->swallow_params.aspect.w = aw;
5062 rp->swallow_params.aspect.h = ah;
5063 evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp);
5066 #ifdef EDJE_CALC_CACHE
5072 _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
5077 _edje_real_part_swallow_hints_update(rp);
5078 rp->edje->dirty = 1;
5079 rp->edje->recalc_call = 1;
5080 _edje_recalc(rp->edje);
5085 _edje_real_part_swallow(Edje_Real_Part *rp,
5086 Evas_Object *obj_swallow,
5087 Eina_Bool hints_update)
5089 if (rp->swallowed_object)
5091 if (rp->swallowed_object != obj_swallow)
5093 edje_object_part_unswallow(rp->edje->obj, rp->swallowed_object);
5098 _edje_real_part_swallow_hints_update(rp);
5099 rp->edje->dirty = 1;
5100 rp->edje->recalc_call = 1;
5101 rp->edje->recalc_hints = 1;
5102 _edje_recalc(rp->edje);
5106 #ifdef EDJE_CALC_CACHE
5109 if (!obj_swallow) return;
5110 rp->swallowed_object = obj_swallow;
5111 evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
5113 evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
5114 else evas_object_clip_set(rp->swallowed_object, rp->edje->base.clipper);
5115 evas_object_stack_above(rp->swallowed_object, rp->object);
5116 evas_object_event_callback_add(rp->swallowed_object,
5118 _edje_object_part_swallow_free_cb,
5120 evas_object_event_callback_add(rp->swallowed_object,
5121 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5122 _edje_object_part_swallow_changed_hints_cb,
5126 _edje_real_part_swallow_hints_update(rp);
5128 if (rp->part->mouse_events)
5130 _edje_callbacks_add(obj_swallow, rp->edje, rp);
5131 if (rp->part->repeat_events)
5132 evas_object_repeat_events_set(obj_swallow, 1);
5133 if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB)
5134 evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode);
5135 evas_object_pass_events_set(obj_swallow, 0);
5138 evas_object_pass_events_set(obj_swallow, 1);
5139 _edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp);
5141 if (rp->part->precise_is_inside)
5142 evas_object_precise_is_inside_set(obj_swallow, 1);
5144 rp->edje->dirty = 1;
5145 rp->edje->recalc_call = 1;
5146 rp->edje->recalc_hints = 1;
5147 _edje_recalc(rp->edje);
5151 _edje_real_part_swallow_clear(Edje_Real_Part *rp)
5153 evas_object_smart_member_del(rp->swallowed_object);
5154 evas_object_event_callback_del_full(rp->swallowed_object,
5156 _edje_object_part_swallow_free_cb,
5158 evas_object_event_callback_del_full(rp->swallowed_object,
5159 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5160 _edje_object_part_swallow_changed_hints_cb,
5162 evas_object_clip_unset(rp->swallowed_object);
5163 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
5164 if (rp->part->mouse_events)
5165 _edje_callbacks_del(rp->swallowed_object, rp->edje);
5166 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
5167 rp->swallowed_object = NULL;
5171 _edje_object_preload(Edje *ed)
5173 ed->preload_count--;
5174 if (!ed->preload_count)
5175 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
5179 _edje_object_image_preload_cb(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5183 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
5184 _edje_object_preload(ed);
5188 _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const char *emission, __UNUSED__ const char *source)
5192 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
5193 _edje_object_preload(ed);
5202 _edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
5204 Edje_Program ***array;
5205 unsigned int *count;
5208 if (!p->signal && !p->source)
5210 array = &edc->programs.nocmp;
5211 count = &edc->programs.nocmp_count;
5213 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5214 && p->source && !strpbrk(p->source, "*?[\\"))
5216 array = &edc->programs.strcmp;
5217 count = &edc->programs.strcmp_count;
5219 else if (p->signal && edje_program_is_strncmp(p->signal)
5220 && p->source && edje_program_is_strncmp(p->source))
5222 array = &edc->programs.strncmp;
5223 count = &edc->programs.strncmp_count;
5225 else if (p->signal && edje_program_is_strrncmp(p->signal)
5226 && p->source && edje_program_is_strrncmp(p->source))
5228 array = &edc->programs.strrncmp;
5229 count = &edc->programs.strrncmp_count;
5233 array = &edc->programs.fnmatch;
5234 count = &edc->programs.fnmatch_count;
5237 for (i = 0; i < *count; ++i)
5238 if ((*array)[i] == p)
5240 memmove(*array + i, *array + i + 1, sizeof (Edje_Program *) * (*count - i - 1));
5252 _edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
5254 Edje_Program ***array;
5255 unsigned int *count;
5257 if (!p->signal && !p->source)
5259 array = &edc->programs.nocmp;
5260 count = &edc->programs.nocmp_count;
5262 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5263 && p->source && !strpbrk(p->source, "*?[\\"))
5265 array = &edc->programs.strcmp;
5266 count = &edc->programs.strcmp_count;
5268 else if (p->signal && edje_program_is_strncmp(p->signal)
5269 && p->source && edje_program_is_strncmp(p->source))
5271 array = &edc->programs.strncmp;
5272 count = &edc->programs.strncmp_count;
5274 else if (p->signal && edje_program_is_strrncmp(p->signal)
5275 && p->source && edje_program_is_strrncmp(p->source))
5277 array = &edc->programs.strrncmp;
5278 count = &edc->programs.strrncmp_count;
5282 array = &edc->programs.fnmatch;
5283 count = &edc->programs.fnmatch_count;
5286 *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));
5287 (*array)[(*count)++] = p;
5291 edje_string_get(const Edje_String *es)
5293 /* FIXME: Handle localization here */
5294 if (!es) return NULL;
5299 edje_string_id_get(const Edje_String *es)
5301 /* FIXME: Handle localization here */
5302 if (!es) return NULL;
5307 _cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5310 _edje_subobj_unregister(ed, obj);
5314 _edje_subobj_register(Edje *ed, Evas_Object *ob)
5316 ed->subobjs = eina_list_append(ed->subobjs, ob);
5317 evas_object_event_callback_add(ob, EVAS_CALLBACK_DEL,
5318 _cb_subobj_del, ed);
5322 _edje_subobj_unregister(Edje *ed, Evas_Object *obj)
5324 ed->subobjs = eina_list_remove(ed->subobjs, obj);
5325 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
5326 _cb_subobj_del, ed);
5329 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/