1 #include "edje_private.h"
3 typedef struct _Edje_Box_Layout Edje_Box_Layout;
4 struct _Edje_Box_Layout
7 Evas_Object_Box_Layout func;
8 void *(*layout_data_get)(void *);
9 void (*layout_data_free)(void *);
11 void (*free_data)(void *);
15 static Eina_Hash *_edje_color_class_hash = NULL;
16 static Eina_Hash *_edje_color_class_member_hash = NULL;
18 static Eina_Hash *_edje_text_class_hash = NULL;
19 static Eina_Hash *_edje_text_class_member_hash = NULL;
21 static Eina_Rbtree *_edje_box_layout_registry = NULL;
23 char *_edje_fontset_append = NULL;
24 FLOAT_T _edje_scale = ZERO;
25 Eina_Bool _edje_password_show_last = EINA_FALSE;
26 FLOAT_T _edje_password_show_last_timeout = ZERO;
27 int _edje_freeze_val = 0;
28 int _edje_freeze_calc_count = 0;
29 Eina_List *_edje_freeze_calc_list = NULL;
31 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
32 struct _Edje_List_Foreach_Data
37 typedef struct _Edje_List_Refcount Edje_List_Refcount;
38 struct _Edje_List_Refcount
45 static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
46 static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
47 static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
48 static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
49 static void _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__);
50 static void _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child);
51 static void _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child);
53 Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path);
55 static Edje_User_Defined *
56 _edje_user_definition_new(Edje_User_Defined_Type type, const char *part, Edje *ed)
58 Edje_User_Defined *eud;
60 eud = malloc(sizeof (Edje_User_Defined));
61 if (!eud) return NULL;
64 eud->part = eina_stringshare_add(part);
66 ed->user_defined = eina_list_append(ed->user_defined, eud);
72 _edje_user_definition_remove(Edje_User_Defined *eud, Evas_Object *child)
74 eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud);
76 if (child) evas_object_event_callback_del_full(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
77 eina_stringshare_del(eud->part);
82 _edje_user_definition_free(Edje_User_Defined *eud)
84 Evas_Object *child = NULL;
87 eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud);
91 case EDJE_USER_SWALLOW:
92 child = eud->u.swallow.child;
93 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
96 _edje_real_part_swallow_clear(rp);
97 rp->swallowed_object = NULL;
98 rp->swallow_params.min.w = 0;
99 rp->swallow_params.min.h = 0;
100 rp->swallow_params.max.w = 0;
101 rp->swallow_params.max.h = 0;
103 rp->edje->recalc_call = 1;
104 #ifdef EDJE_CALC_CACHE
107 _edje_recalc_do(rp->edje);
110 case EDJE_USER_BOX_PACK:
111 child = eud->u.box.child;
112 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
113 _edje_box_child_remove(rp, child);
115 case EDJE_USER_TABLE_PACK:
116 child = eud->u.table.child;
117 rp = _edje_real_part_recursive_get(eud->ed, eud->part);
118 _edje_table_child_remove(rp, child);
120 case EDJE_USER_STRING:
121 case EDJE_USER_DRAG_STEP:
122 case EDJE_USER_DRAG_PAGE:
123 case EDJE_USER_DRAG_VALUE:
124 case EDJE_USER_DRAG_SIZE:
128 _edje_user_definition_remove(eud, child);
132 _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
134 Edje_User_Defined *eud = data;
136 _edje_user_definition_free(eud);
140 _edje_class_member_direct_del(const char *class, Edje_List_Refcount *lookup, Eina_Hash *hash)
144 members = eina_hash_find(hash, class);
145 members = eina_list_remove_list(members, lookup->lookup);
146 eina_hash_set(hash, class, members);
151 _edje_class_member_add(Edje *ed, Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
153 Edje_List_Refcount *lookup;
156 if ((!ed) || (!ehash) || (!ghash) || (!class)) return;
158 lookup = eina_hash_find(*ehash, class);
161 EINA_REFCOUNT_REF(lookup);
165 lookup = malloc(sizeof (Edje_List_Refcount));
166 if (!lookup) return ;
167 EINA_REFCOUNT_INIT(lookup);
169 /* Get members list */
170 members = eina_hash_find(*ghash, class);
172 /* Update the member list */
173 lookup->lookup = members = eina_list_prepend(members, ed);
175 /* Don't loose track of members list */
177 *ehash = eina_hash_string_small_new(NULL);
178 eina_hash_add(*ehash, class, lookup);
180 /* Reset the member list to the right pointer */
182 *ghash = eina_hash_string_superfast_new(NULL);
183 eina_hash_set(*ghash, class, members);
187 _edje_class_member_del(Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
189 Edje_List_Refcount *lookup;
192 if ((!ehash) || (!ghash) || (!class)) return;
193 members = eina_hash_find(*ghash, class);
194 if (!members) return;
196 lookup = eina_hash_find(*ehash, class);
197 if (!lookup) return ;
199 EINA_REFCOUNT_UNREF(lookup)
201 members = eina_list_remove_list(members, lookup->lookup);
202 eina_hash_set(*ghash, class, members);
204 eina_hash_del(*ehash, class, lookup);
210 member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
212 eina_list_free(data);
217 _edje_class_members_free(Eina_Hash **ghash)
219 if (!ghash || !*ghash) return;
220 eina_hash_foreach(*ghash, member_list_free, NULL);
221 eina_hash_free(*ghash);
225 /************************** API Routines **************************/
235 // FIXME: could just have a global freeze instead of per object
236 // above i tried.. but this broke some things. notable e17's menus. why?
240 EINA_LIST_FOREACH(_edje_edjes, l, data)
241 edje_object_freeze(data);
247 _edje_thaw_edje(Edje *ed)
251 for (i = 0; i < ed->table_parts_size; i++)
255 rp = ed->table_parts[i];
256 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
260 ed2 = _edje_fetch(rp->swallowed_object);
261 if (ed2) _edje_thaw_edje(ed2);
264 if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
273 if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
277 _edje_freeze_calc_count = 0;
278 EINA_LIST_FREE(_edje_freeze_calc_list, ed)
287 // FIXME: could just have a global freeze instead of per object
288 // comment as above.. why?
291 EINA_LIST_FOREACH(_edje_edjes, l, data)
292 edje_object_thaw(data);
297 edje_fontset_append_set(const char *fonts)
299 if (_edje_fontset_append)
300 free(_edje_fontset_append);
301 _edje_fontset_append = fonts ? strdup(fonts) : NULL;
305 edje_fontset_append_get(void)
307 return _edje_fontset_append;
311 edje_scale_set(double scale)
316 if (_edje_scale == FROM_DOUBLE(scale)) return;
317 _edje_scale = FROM_DOUBLE(scale);
318 EINA_LIST_FOREACH(_edje_edjes, l, data)
319 edje_object_calc_force(data);
325 return TO_DOUBLE(_edje_scale);
329 edje_password_show_last_set(Eina_Bool password_show_last)
331 if (_edje_password_show_last == password_show_last) return;
332 _edje_password_show_last = password_show_last;
336 edje_password_show_last_timeout_set(double password_show_last_timeout)
338 if (_edje_password_show_last_timeout == FROM_DOUBLE(password_show_last_timeout)) return;
339 _edje_password_show_last_timeout = FROM_DOUBLE(password_show_last_timeout);
343 edje_object_scale_set(Evas_Object *obj, double scale)
349 ed = _edje_fetch(obj);
350 if (!ed) return EINA_FALSE;
351 if (ed->scale == scale) return EINA_TRUE;
352 ed->scale = FROM_DOUBLE(scale);
353 EINA_LIST_FOREACH(ed->groups, l, ged)
354 ged->scale = ed->scale;
355 EINA_LIST_FOREACH(ed->subobjs, l, o)
356 edje_object_calc_force(o);
357 edje_object_calc_force(obj);
362 edje_object_scale_get(const Evas_Object *obj)
366 ed = _edje_fetch(obj);
368 return TO_DOUBLE(ed->scale);
372 edje_object_mirrored_get(const Evas_Object *obj)
376 ed = _edje_fetch(obj);
377 if (!ed) return EINA_FALSE;
383 _edje_object_orientation_inform(Evas_Object *obj)
385 if (edje_object_mirrored_get(obj))
386 edje_object_signal_emit(obj, "edje,state,rtl", "edje");
388 edje_object_signal_emit(obj, "edje,state,ltr", "edje");
392 edje_object_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
397 ed = _edje_fetch(obj);
399 if (ed->is_rtl == rtl) return;
403 for (i = 0 ; i < ed->table_parts_size ; i++)
409 ep = ed->table_parts[i];
410 s = ep->param1.description->state.name,
411 v = ep->param1.description->state.value;
412 _edje_part_description_apply(ed, ep, s, v , NULL, 0.0);
413 ep->chosen_description = ep->param1.description;
417 _edje_object_orientation_inform(obj);
423 edje_object_data_get(const Evas_Object *obj, const char *key)
427 ed = _edje_fetch(obj);
430 if (!ed->collection) return NULL;
431 if (!ed->collection->data) return NULL;
432 return edje_string_get(eina_hash_find(ed->collection->data, key));
436 edje_object_freeze(Evas_Object *obj)
441 ed = _edje_fetch(obj);
443 for (i = 0; i < ed->table_parts_size; i++)
446 rp = ed->table_parts[i];
447 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
448 edje_object_freeze(rp->swallowed_object);
450 return _edje_freeze(ed);
454 edje_object_thaw(Evas_Object *obj)
459 ed = _edje_fetch(obj);
461 for (i = 0; i < ed->table_parts_size; i++)
465 rp = ed->table_parts[i];
466 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
467 edje_object_thaw(rp->swallowed_object);
469 return _edje_thaw(ed);
473 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)
476 Edje_Color_Class *cc;
478 if (!color_class) return EINA_FALSE;
480 cc = eina_hash_find(_edje_color_class_hash, color_class);
483 cc = calloc(1, sizeof(Edje_Color_Class));
484 if (!cc) return EINA_FALSE;
485 cc->name = eina_stringshare_add(color_class);
491 if (!_edje_color_class_hash)
492 _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
493 eina_hash_add(_edje_color_class_hash, color_class, cc);
497 else if (r > 255) r = 255;
499 else if (g > 255) g = 255;
501 else if (b > 255) b = 255;
503 else if (a > 255) a = 255;
504 if ((cc->r == r) && (cc->g == g) &&
505 (cc->b == b) && (cc->a == a) &&
506 (cc->r2 == r2) && (cc->g2 == g2) &&
507 (cc->b2 == b2) && (cc->a2 == a2) &&
508 (cc->r3 == r3) && (cc->g3 == g3) &&
509 (cc->b3 == b3) && (cc->a3 == a3))
524 members = eina_hash_find(_edje_color_class_member_hash, color_class);
529 ed = eina_list_data_get(members);
532 #ifdef EDJE_CALC_CACHE
533 ed->all_part_change = 1;
536 _edje_emit(ed, "color_class,set", color_class);
537 members = eina_list_next(members);
543 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)
545 Edje_Color_Class *cc;
550 cc = eina_hash_find(_edje_color_class_hash, color_class);
554 #define X(C) if (C) *C = cc->C
555 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
565 #define X(C) if (C) *C = 0
566 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
577 edje_color_class_del(const char *color_class)
579 Edje_Color_Class *cc;
582 if (!color_class) return;
584 cc = eina_hash_find(_edje_color_class_hash, color_class);
587 eina_hash_del(_edje_color_class_hash, color_class, cc);
588 eina_stringshare_del(cc->name);
591 members = eina_hash_find(_edje_color_class_member_hash, color_class);
596 ed = eina_list_data_get(members);
599 #ifdef EDJE_CALC_CACHE
600 ed->all_part_change = 1;
603 _edje_emit(ed, "color_class,del", color_class);
604 members = eina_list_next(members);
609 edje_color_class_list(void)
611 Edje_List_Foreach_Data fdata;
613 if (!_edje_color_class_member_hash) return NULL;
615 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
616 eina_hash_foreach(_edje_color_class_member_hash,
617 _edje_color_class_list_foreach, &fdata);
623 _edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
625 Edje_List_Foreach_Data *fd;
628 fd->list = eina_list_append(fd->list, strdup(key));
633 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)
636 Edje_Color_Class *cc;
639 ed = _edje_fetch(obj);
640 if ((!ed) || (!color_class)) return EINA_FALSE;
642 else if (r > 255) r = 255;
644 else if (g > 255) g = 255;
646 else if (b > 255) b = 255;
648 else if (a > 255) a = 255;
649 cc = eina_hash_find(ed->color_classes, color_class);
652 if ((cc->r == r) && (cc->g == g) &&
653 (cc->b == b) && (cc->a == a) &&
654 (cc->r2 == r2) && (cc->g2 == g2) &&
655 (cc->b2 == b2) && (cc->a2 == a2) &&
656 (cc->r3 == r3) && (cc->g3 == g3) &&
657 (cc->b3 == b3) && (cc->a3 == a3))
673 #ifdef EDJE_CALC_CACHE
674 ed->all_part_change = 1;
680 color_class = eina_stringshare_add(color_class);
681 if (!color_class) return EINA_FALSE;
682 cc = malloc(sizeof(Edje_Color_Class));
685 eina_stringshare_del(color_class);
688 cc->name = color_class;
701 eina_hash_direct_add(ed->color_classes, cc->name, cc);
704 #ifdef EDJE_CALC_CACHE
705 ed->all_part_change = 1;
708 for (i = 0; i < ed->table_parts_size; i++)
712 rp = ed->table_parts[i];
713 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
714 edje_object_color_class_set(rp->swallowed_object, color_class,
715 r, g, b, a, r2, g2, b2, a2, r3, g3, b3,
720 _edje_emit(ed, "color_class,set", color_class);
725 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)
727 Edje *ed = _edje_fetch(obj);
728 Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
732 #define X(C) if (C) *C = cc->C
733 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
743 #define X(C) if (C) *C = 0
744 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
755 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
758 Edje_Color_Class *cc = NULL;
761 ed = _edje_fetch(obj);
763 if ((!ed) || (!color_class)) return;
765 eina_hash_del(ed->color_classes, color_class, cc);
767 for (i = 0; i < ed->table_parts_size; i++)
771 rp = ed->table_parts[i];
772 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
773 edje_object_color_class_del(rp->swallowed_object, color_class);
778 #ifdef EDJE_CALC_CACHE
779 ed->all_part_change = 1;
782 _edje_emit(ed, "color_class,del", color_class);
786 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
791 if (!text_class) return EINA_FALSE;
792 if (!font) font = "";
794 tc = eina_hash_find(_edje_text_class_hash, text_class);
795 /* Create new text class */
798 tc = calloc(1, sizeof(Edje_Text_Class));
799 if (!tc) return EINA_FALSE;
800 tc->name = eina_stringshare_add(text_class);
806 if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
807 eina_hash_add(_edje_text_class_hash, text_class, tc);
809 tc->font = eina_stringshare_add(font);
814 /* Match and the same, return */
815 if ((tc->size == size) ||
816 (tc->font == font) ||
817 (tc->font && font && !strcmp(tc->font, font)))
820 /* Update the class found */
821 eina_stringshare_replace(&tc->font, font);
825 /* Tell all members of the text class to recalc */
826 members = eina_hash_find(_edje_text_class_member_hash, text_class);
831 ed = eina_list_data_get(members);
834 _edje_textblock_style_all_update(ed);
835 #ifdef EDJE_CALC_CACHE
836 ed->text_part_change = 1;
839 members = eina_list_next(members);
845 edje_text_class_del(const char *text_class)
850 if (!text_class) return;
852 tc = eina_hash_find(_edje_text_class_hash, text_class);
855 eina_hash_del(_edje_text_class_hash, text_class, tc);
856 eina_stringshare_del(tc->name);
857 eina_stringshare_del(tc->font);
860 members = eina_hash_find(_edje_text_class_member_hash, text_class);
865 ed = eina_list_data_get(members);
867 _edje_textblock_style_all_update(ed);
868 #ifdef EDJE_CALC_CACHE
869 ed->text_part_change = 1;
872 members = eina_list_next(members);
877 edje_text_class_list(void)
879 Edje_List_Foreach_Data fdata;
881 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
882 eina_hash_foreach(_edje_text_class_member_hash,
883 _edje_text_class_list_foreach, &fdata);
888 _edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
890 Edje_List_Foreach_Data *fd;
893 fd->list = eina_list_append(fd->list, eina_stringshare_add(key));
898 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
902 Edje_Text_Class *tc = NULL;
905 ed = _edje_fetch(obj);
906 if ((!ed) || (!text_class)) return EINA_FALSE;
908 /* for each text_class in the edje */
909 EINA_LIST_FOREACH(ed->text_classes, l, tc)
911 if ((tc->name) && (!strcmp(tc->name, text_class)))
913 /* Match and the same, return */
914 if ((tc->size == size) &&
915 ((tc->font == font) ||
916 (tc->font && font && !strcmp(tc->font, font))))
919 /* Update new text class properties */
920 eina_stringshare_replace(&tc->font, font);
928 /* No matches, create a new text class */
929 tc = calloc(1, sizeof(Edje_Text_Class));
930 if (!tc) return EINA_FALSE;
931 tc->name = eina_stringshare_add(text_class);
937 tc->font = eina_stringshare_add(font);
939 /* Add to edje's text class list */
940 ed->text_classes = eina_list_append(ed->text_classes, tc);
943 for (i = 0; i < ed->table_parts_size; i++)
947 rp = ed->table_parts[i];
948 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
949 edje_object_text_class_set(rp->swallowed_object, text_class,
955 #ifdef EDJE_CALC_CACHE
956 ed->text_part_change = 1;
958 _edje_textblock_style_all_update(ed);
964 edje_object_part_exists(const Evas_Object *obj, const char *part)
969 ed = _edje_fetch(obj);
970 if ((!ed) || (!part)) return EINA_FALSE;
971 rp = _edje_real_part_recursive_get(ed, part);
972 if (!rp) return EINA_FALSE;
976 EAPI const Evas_Object *
977 edje_object_part_object_get(const Evas_Object *obj, const char *part)
982 ed = _edje_fetch(obj);
983 if ((!ed) || (!part)) return NULL;
985 /* Need to recalc before providing the object. */
988 rp = _edje_real_part_recursive_get(ed, part);
989 if (!rp) return NULL;
994 edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h )
999 ed = _edje_fetch(obj);
1000 if ((!ed) || (!part))
1009 /* Need to recalc before providing the object. */
1010 _edje_recalc_do(ed);
1012 rp = _edje_real_part_recursive_get(ed, part);
1029 edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
1033 ed = _edje_fetch(obj);
1035 ed->item_provider.func = func;
1036 ed->item_provider.data = data;
1039 /* FIXDOC: New Function */
1041 edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
1046 ed = _edje_fetch(obj);
1048 ed->text_change.func = func;
1049 ed->text_change.data = data;
1051 for (i = 0; i < ed->table_parts_size; i++)
1055 rp = ed->table_parts[i];
1056 if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object))
1057 edje_object_text_change_cb_set(rp->swallowed_object, func, data);
1062 _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1064 if ((!rp->text.text) && (!text))
1065 return EINA_TRUE; /* nothing to do, no error */
1066 if ((rp->text.text) && (text) &&
1067 (!strcmp(rp->text.text, text)))
1068 return EINA_TRUE; /* nothing to do, no error */
1071 eina_stringshare_del(rp->text.text);
1072 rp->text.text = NULL;
1074 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1075 _edje_entry_text_markup_set(rp, text);
1077 if (text) rp->text.text = eina_stringshare_add(text);
1078 rp->edje->dirty = 1;
1079 rp->edje->recalc_call = 1;
1080 rp->edje->recalc_hints = 1;
1081 #ifdef EDJE_CALC_CACHE
1084 _edje_recalc(rp->edje);
1085 if (rp->edje->text_change.func)
1086 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1091 _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1093 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1094 _edje_entry_text_markup_append(rp, text);
1100 int len_added = strlen(text);
1101 int len_old = strlen(rp->text.text);
1102 new = malloc(len_old + len_added + 1);
1103 memcpy(new, rp->text.text, len_old);
1104 memcpy(new + len_old, text, len_added);
1105 new[len_old + len_added] = '\0';
1106 eina_stringshare_replace(&rp->text.text, new);
1111 eina_stringshare_replace(&rp->text.text, text);
1114 rp->edje->dirty = 1;
1115 rp->edje->recalc_call = 1;
1116 #ifdef EDJE_CALC_CACHE
1119 _edje_recalc(rp->edje);
1120 if (rp->edje->text_change.func)
1121 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1126 edje_object_part_text_style_user_push(Evas_Object *obj, const char *part,
1131 Evas_Textblock_Style *ts;
1133 ed = _edje_fetch(obj);
1134 if ((!ed) || (!part) || (!style)) return;
1135 rp = _edje_real_part_recursive_get(ed, part);
1137 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1139 ts = evas_textblock_style_new();
1140 evas_textblock_style_set(ts, style);
1141 evas_object_textblock_style_user_push(rp->object, ts);
1142 evas_textblock_style_free(ts);
1143 ed->recalc_hints = 1;
1144 #ifdef EDJE_CALC_CACHE
1151 edje_object_part_text_style_user_pop(Evas_Object *obj, const char *part)
1156 ed = _edje_fetch(obj);
1157 if ((!ed) || (!part)) return;
1158 rp = _edje_real_part_recursive_get(ed, part);
1160 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return;
1162 evas_object_textblock_style_user_pop(rp->object);
1163 ed->recalc_hints = 1;
1164 #ifdef EDJE_CALC_CACHE
1171 edje_object_part_text_style_user_peek(const Evas_Object *obj, const char *part)
1175 const Evas_Textblock_Style *ts;
1177 ed = _edje_fetch(obj);
1178 if ((!ed) || (!part)) return NULL;
1179 rp = _edje_real_part_recursive_get(ed, part);
1180 if (!rp) return NULL;
1181 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return NULL;
1183 ts = evas_object_textblock_style_user_peek(rp->object);
1185 return evas_textblock_style_get(ts);
1191 _edje_user_define_string(Edje *ed, const char *part, const char *raw_text)
1193 /* NOTE: This one is tricky, text is referenced in rp->text.text for the life of the
1194 rp. So on edje_object_file_set, we should first ref it, before destroying the old
1196 Edje_User_Defined *eud;
1199 EINA_LIST_FOREACH(ed->user_defined, l, eud)
1200 if (eud->type == EDJE_USER_STRING && !strcmp(eud->part, part))
1204 _edje_user_definition_free(eud);
1207 eud->u.string.text = raw_text;
1211 eud = _edje_user_definition_new(EDJE_USER_STRING, part, ed);
1213 eud->u.string.text = raw_text;
1217 edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
1223 ed = _edje_fetch(obj);
1224 if ((!ed) || (!part)) return EINA_FALSE;
1225 rp = _edje_real_part_recursive_get(ed, part);
1226 if (!rp) return EINA_FALSE;
1227 if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
1228 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE;
1229 r = _edje_object_part_text_raw_set(obj, rp, part, text);
1230 _edje_user_define_string(ed, part, rp->text.text);
1235 edje_object_part_text_get(const Evas_Object *obj, const char *part)
1240 ed = _edje_fetch(obj);
1241 if ((!ed) || (!part)) return NULL;
1243 /* Need to recalc before providing the object. */
1244 _edje_recalc_do(ed);
1246 rp = _edje_real_part_recursive_get(ed, part);
1247 if (!rp) return NULL;
1248 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1249 return _edje_entry_text_get(rp);
1252 if (rp->part->type == EDJE_PART_TYPE_TEXT) return rp->text.text;
1253 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1254 return evas_object_textblock_text_markup_get(rp->object);
1260 edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char *text)
1266 ed = _edje_fetch(obj);
1267 if ((!ed) || (!part)) return EINA_FALSE;
1268 rp = _edje_real_part_recursive_get(ed, part);
1269 if (!rp) return EINA_FALSE;
1270 if ((rp->part->type == EDJE_PART_TYPE_TEXT) && (text))
1273 char *esc_start = NULL, *esc_end = NULL;
1276 sbuf = eina_strbuf_new();
1281 if ((*p == 0) || (esc_end) || (esc_start))
1287 escape = evas_textblock_escape_string_range_get
1288 (esc_start, esc_end + 1);
1289 if (escape) eina_strbuf_append(sbuf, escape);
1290 esc_start = esc_end = NULL;
1294 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1295 eina_strbuf_append_length(sbuf, s, p - s);
1304 if (!s) s = esc_start; /* This would happen when there is & that isn't escaped */
1307 eina_strbuf_append_length(sbuf, s, p - s);
1320 ret = _edje_object_part_text_raw_set
1321 (obj, rp, part, eina_strbuf_string_get(sbuf));
1322 _edje_user_define_string(ed, part, rp->text.text);
1323 eina_strbuf_free(sbuf);
1326 if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return EINA_FALSE;
1327 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1328 _edje_user_define_string(ed, part, rp->text.text);
1334 _edje_text_escape(const char *text)
1338 const char *text_end;
1341 if (!text) return NULL;
1343 txt = eina_strbuf_new();
1344 text_len = strlen(text);
1346 text_end = text + text_len;
1347 while (text < text_end)
1350 const char *escaped = evas_textblock_string_escape_get(text, &advance);
1353 eina_strbuf_append_char(txt, text[0]);
1357 eina_strbuf_append(txt, escaped);
1362 ret = eina_strbuf_string_steal(txt);
1363 eina_strbuf_free(txt);
1368 _edje_text_unescape(const char *text)
1372 const char *text_end, *last, *escape_start;
1375 if (!text) return NULL;
1377 txt = eina_strbuf_new();
1378 text_len = strlen(text);
1380 text_end = text + text_len;
1382 escape_start = NULL;
1383 for (; text < text_end; text++)
1397 len = text - escape_start;
1402 eina_strbuf_append_n(txt, str, len);
1404 escape_start = text;
1407 else if ((*text == ';') && (escape_start))
1410 const char *str = evas_textblock_escape_string_range_get(escape_start, text);
1417 len = text + 1 - escape_start;
1420 eina_strbuf_append_n(txt, str, len);
1422 escape_start = NULL;
1427 if (!last && escape_start)
1428 last = escape_start;
1430 if (last && (text > last))
1432 size_t len = text - last;
1433 eina_strbuf_append_n(txt, last, len);
1436 ret = eina_strbuf_string_steal(txt);
1437 eina_strbuf_free(txt);
1442 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
1446 Eina_Bool ret = EINA_FALSE;
1448 ed = _edje_fetch(obj);
1449 if ((!ed) || (!part)) return ret;
1450 rp = _edje_real_part_recursive_get(ed, part);
1451 if (!rp) return ret;
1452 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1453 ret = _edje_object_part_text_raw_set(obj, rp, part, text_to_escape);
1454 else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1456 char *text = _edje_text_escape(text_to_escape);
1458 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1461 _edje_user_define_string(ed, part, rp->text.text);
1466 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
1471 ed = _edje_fetch(obj);
1472 if ((!ed) || (!part)) return NULL;
1474 /* Need to recalc before providing the object. */
1475 _edje_recalc_do(ed);
1477 rp = _edje_real_part_recursive_get(ed, part);
1478 if (!rp) return NULL;
1479 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1481 const char *t = _edje_entry_text_get(rp);
1482 return _edje_text_unescape(t);
1486 if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->text.text);
1487 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1489 const char *t = evas_object_textblock_text_markup_get(rp->object);
1490 return _edje_text_unescape(t);
1497 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
1502 ed = _edje_fetch(obj);
1503 if ((!ed) || (!part)) return NULL;
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)
1507 return _edje_entry_selection_get(rp);
1512 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
1517 ed = _edje_fetch(obj);
1518 if ((!ed) || (!part)) return;
1519 rp = _edje_real_part_recursive_get(ed, part);
1521 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1522 _edje_entry_select_none(rp);
1526 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
1531 ed = _edje_fetch(obj);
1532 if ((!ed) || (!part)) return;
1533 rp = _edje_real_part_recursive_get(ed, part);
1535 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1536 _edje_entry_select_all(rp);
1540 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
1545 ed = _edje_fetch(obj);
1546 if ((!ed) || (!part)) return;
1547 rp = _edje_real_part_recursive_get(ed, part);
1549 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1550 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
1551 _edje_entry_text_markup_insert(rp, text);
1552 rp->edje->dirty = 1;
1553 rp->edje->recalc_call = 1;
1554 rp->edje->recalc_hints = 1;
1555 #ifdef EDJE_CALC_CACHE
1558 _edje_recalc(rp->edje);
1559 if (rp->edje->text_change.func)
1560 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1564 edje_object_part_text_append(Evas_Object *obj, const char *part, const char *text)
1569 ed = _edje_fetch(obj);
1570 if ((!ed) || (!part)) return;
1571 rp = _edje_real_part_recursive_get(ed, part);
1573 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1574 _edje_object_part_text_raw_append(obj, rp, part, text);
1575 rp->edje->dirty = 1;
1576 rp->edje->recalc_call = 1;
1577 rp->edje->recalc_hints = 1;
1578 #ifdef EDJE_CALC_CACHE
1581 _edje_recalc(rp->edje);
1582 if (rp->edje->text_change.func)
1583 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1586 EAPI const Eina_List *
1587 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
1592 ed = _edje_fetch(obj);
1593 if ((!ed) || (!part)) return NULL;
1594 rp = _edje_real_part_recursive_get(ed, part);
1595 if (!rp) return NULL;
1596 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1597 return _edje_entry_anchors_list(rp);
1601 EAPI const Eina_List *
1602 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
1607 ed = _edje_fetch(obj);
1608 if ((!ed) || (!part)) return NULL;
1609 rp = _edje_real_part_recursive_get(ed, part);
1610 if (!rp) return NULL;
1611 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1612 return _edje_entry_anchor_geometry_get(rp, anchor);
1616 EAPI const Eina_List *
1617 edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part)
1622 ed = _edje_fetch(obj);
1623 if ((!ed) || (!part)) return NULL;
1624 rp = _edje_real_part_recursive_get(ed, part);
1625 if (!rp) return NULL;
1626 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1627 return _edje_entry_items_list(rp);
1632 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)
1637 ed = _edje_fetch(obj);
1638 if ((!ed) || (!part)) return EINA_FALSE;
1639 rp = _edje_real_part_recursive_get(ed, part);
1640 if (!rp) return EINA_FALSE;
1641 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1642 return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch);
1647 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)
1652 ed = _edje_fetch(obj);
1657 if ((!ed) || (!part)) return;
1658 rp = _edje_real_part_recursive_get(ed, part);
1660 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1662 _edje_entry_cursor_geometry_get(rp, x, y, w, h);
1663 if (x) *x -= rp->edje->x;
1664 if (y) *y -= rp->edje->y;
1669 edje_object_part_text_user_insert(const Evas_Object *obj, const char *part, const char *text)
1674 ed = _edje_fetch(obj);
1675 if ((!ed) || (!part)) return;
1676 rp = _edje_real_part_recursive_get(ed, part);
1678 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1679 _edje_entry_user_insert(rp, text);
1683 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
1688 ed = _edje_fetch(obj);
1689 if ((!ed) || (!part)) return;
1690 rp = _edje_real_part_recursive_get(ed, part);
1692 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1693 _edje_entry_select_allow_set(rp, allow);
1697 edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
1702 ed = _edje_fetch(obj);
1703 if ((!ed) || (!part)) return;
1704 rp = _edje_real_part_recursive_get(ed, part);
1706 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1707 _edje_entry_select_abort(rp);
1711 edje_object_part_text_select_begin(const Evas_Object *obj, const char *part)
1716 ed = _edje_fetch(obj);
1717 if ((!ed) || (!part)) return;
1718 rp = _edje_real_part_recursive_get(ed, part);
1720 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1721 _edje_entry_select_begin(rp);
1725 edje_object_part_text_select_extend(const Evas_Object *obj, const char *part)
1730 ed = _edje_fetch(obj);
1731 if ((!ed) || (!part)) return;
1732 rp = _edje_real_part_recursive_get(ed, part);
1734 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1735 _edje_entry_select_extend(rp);
1739 edje_object_part_text_imf_context_get(const Evas_Object *obj, const char *part)
1744 ed = _edje_fetch(obj);
1745 if ((!ed) || (!part)) return NULL;
1747 rp = _edje_real_part_recursive_get(ed, (char *)part);
1748 if (!rp) return NULL;
1750 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1751 return _edje_entry_imf_context_get(rp);
1757 edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, Edje_Cursor cur)
1762 ed = _edje_fetch(obj);
1763 if ((!ed) || (!part)) return EINA_FALSE;
1764 rp = _edje_real_part_recursive_get(ed, part);
1765 if (!rp) return EINA_FALSE;
1766 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1768 return _edje_entry_cursor_next(rp, cur);
1774 edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, Edje_Cursor cur)
1779 ed = _edje_fetch(obj);
1780 if ((!ed) || (!part)) return EINA_FALSE;
1781 rp = _edje_real_part_recursive_get(ed, part);
1782 if (!rp) return EINA_FALSE;
1783 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1785 return _edje_entry_cursor_prev(rp, cur);
1791 edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, Edje_Cursor cur)
1796 ed = _edje_fetch(obj);
1797 if ((!ed) || (!part)) return EINA_FALSE;
1798 rp = _edje_real_part_recursive_get(ed, part);
1799 if (!rp) return EINA_FALSE;
1800 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1802 return _edje_entry_cursor_up(rp, cur);
1808 edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, Edje_Cursor cur)
1813 ed = _edje_fetch(obj);
1814 if ((!ed) || (!part)) return EINA_FALSE;
1815 rp = _edje_real_part_recursive_get(ed, part);
1816 if (!rp) return EINA_FALSE;
1817 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1819 return _edje_entry_cursor_down(rp, cur);
1825 edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1830 ed = _edje_fetch(obj);
1831 if ((!ed) || (!part)) return;
1832 rp = _edje_real_part_recursive_get(ed, part);
1834 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1836 _edje_entry_cursor_begin(rp, cur);
1841 edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1846 ed = _edje_fetch(obj);
1847 if ((!ed) || (!part)) return;
1848 rp = _edje_real_part_recursive_get(ed, part);
1850 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1852 _edje_entry_cursor_end(rp, cur);
1857 edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
1862 ed = _edje_fetch(obj);
1863 if ((!ed) || (!part)) return;
1864 rp = _edje_real_part_recursive_get(ed, part);
1866 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1868 _edje_entry_cursor_copy(rp, src, dst);
1873 edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1878 ed = _edje_fetch(obj);
1879 if ((!ed) || (!part)) return;
1880 rp = _edje_real_part_recursive_get(ed, part);
1882 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1884 _edje_entry_cursor_line_begin(rp, cur);
1889 edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1894 ed = _edje_fetch(obj);
1895 if ((!ed) || (!part)) return;
1896 rp = _edje_real_part_recursive_get(ed, part);
1898 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1900 _edje_entry_cursor_line_end(rp, cur);
1905 edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char *part,
1906 Edje_Cursor cur, Evas_Coord x, Evas_Coord y)
1911 ed = _edje_fetch(obj);
1912 if ((!ed) || (!part)) return EINA_FALSE;
1913 rp = _edje_real_part_recursive_get(ed, part);
1914 if (!rp) return EINA_FALSE;
1915 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1917 return _edje_entry_cursor_coord_set(rp, cur, x, y);
1923 edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1928 ed = _edje_fetch(obj);
1929 if ((!ed) || (!part)) return EINA_FALSE;
1930 rp = _edje_real_part_recursive_get(ed, part);
1931 if (!rp) return EINA_FALSE;
1932 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1934 return _edje_entry_cursor_is_format_get(rp, cur);
1940 edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1945 ed = _edje_fetch(obj);
1946 if ((!ed) || (!part)) return 0;
1947 rp = _edje_real_part_recursive_get(ed, part);
1949 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1951 return _edje_entry_cursor_is_visible_format_get(rp, cur);
1957 edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1962 ed = _edje_fetch(obj);
1963 if ((!ed) || (!part)) return NULL;
1964 rp = _edje_real_part_recursive_get(ed, part);
1965 if (!rp) return NULL;
1966 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1968 return _edje_entry_cursor_content_get(rp, cur);
1974 edje_object_part_text_cursor_pos_set(Evas_Object *obj, const char *part, Edje_Cursor cur, int pos)
1979 ed = _edje_fetch(obj);
1980 if ((!ed) || (!part)) return;
1981 rp = _edje_real_part_recursive_get(ed, part);
1983 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1985 _edje_entry_cursor_pos_set(rp, cur, pos);
1990 edje_object_part_text_cursor_pos_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1995 ed = _edje_fetch(obj);
1996 if ((!ed) || (!part)) return 0;
1997 rp = _edje_real_part_recursive_get(ed, part);
1999 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2001 return _edje_entry_cursor_pos_get(rp, cur);
2007 edje_object_part_text_imf_context_reset(const Evas_Object *obj, const char *part)
2012 ed = _edje_fetch(obj);
2013 if ((!ed) || (!part)) return;
2014 rp = _edje_real_part_recursive_get(ed, part);
2016 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2018 _edje_entry_imf_context_reset(rp);
2023 edje_object_part_text_input_panel_layout_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Layout layout)
2028 ed = _edje_fetch(obj);
2029 if ((!ed) || (!part)) return;
2030 rp = _edje_real_part_recursive_get(ed, part);
2032 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2034 _edje_entry_input_panel_layout_set(rp, layout);
2038 EAPI Edje_Input_Panel_Layout
2039 edje_object_part_text_input_panel_layout_get(const Evas_Object *obj, const char *part)
2044 ed = _edje_fetch(obj);
2045 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2046 rp = _edje_real_part_recursive_get(ed, part);
2047 if (!rp) return EINA_FALSE;
2048 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2050 return _edje_entry_input_panel_layout_get(rp);
2052 return EDJE_INPUT_PANEL_LAYOUT_INVALID;
2056 edje_object_part_text_autocapital_type_set(Evas_Object *obj, const char *part, Edje_Text_Autocapital_Type autocapital_type)
2061 ed = _edje_fetch(obj);
2062 if ((!ed) || (!part)) return;
2063 rp = _edje_real_part_recursive_get(ed, part);
2065 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2067 _edje_entry_autocapital_type_set(rp, autocapital_type);
2071 EAPI Edje_Text_Autocapital_Type
2072 edje_object_part_text_autocapital_type_get(const Evas_Object *obj, const char *part)
2077 ed = _edje_fetch(obj);
2078 if ((!ed) || (!part)) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2079 rp = _edje_real_part_recursive_get(ed, part);
2080 if (!rp) return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2081 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2083 return _edje_entry_autocapital_type_get(rp);
2085 return EDJE_TEXT_AUTOCAPITAL_TYPE_NONE;
2089 edje_object_part_text_prediction_allow_set(Evas_Object *obj, const char *part, Eina_Bool prediction)
2094 ed = _edje_fetch(obj);
2095 if ((!ed) || (!part)) return;
2096 rp = _edje_real_part_recursive_get(ed, part);
2098 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2100 _edje_entry_prediction_allow_set(rp, prediction);
2105 edje_object_part_text_prediction_allow_get(const Evas_Object *obj, const char *part)
2110 ed = _edje_fetch(obj);
2111 if ((!ed) || (!part)) return EINA_FALSE;
2112 rp = _edje_real_part_recursive_get(ed, part);
2113 if (!rp) return EINA_FALSE;
2114 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2116 return _edje_entry_prediction_allow_get(rp);
2122 edje_object_part_text_input_panel_enabled_set(Evas_Object *obj, const char *part, Eina_Bool enabled)
2127 ed = _edje_fetch(obj);
2128 if ((!ed) || (!part)) return;
2129 rp = _edje_real_part_recursive_get(ed, part);
2131 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2133 _edje_entry_input_panel_enabled_set(rp, enabled);
2138 edje_object_part_text_input_panel_enabled_get(const Evas_Object *obj, const char *part)
2143 ed = _edje_fetch(obj);
2144 if ((!ed) || (!part)) return EINA_FALSE;
2145 rp = _edje_real_part_recursive_get(ed, part);
2146 if (!rp) return EINA_FALSE;
2147 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2149 return _edje_entry_input_panel_enabled_get(rp);
2155 edje_object_part_text_input_panel_show(const Evas_Object *obj, const char *part)
2160 ed = _edje_fetch(obj);
2161 if ((!ed) || (!part)) return;
2162 rp = _edje_real_part_recursive_get(ed, part);
2164 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2165 _edje_entry_input_panel_show(rp);
2169 edje_object_part_text_input_panel_hide(const Evas_Object *obj, const char *part)
2174 ed = _edje_fetch(obj);
2175 if ((!ed) || (!part)) return;
2176 rp = _edje_real_part_recursive_get(ed, part);
2178 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2179 _edje_entry_input_panel_hide(rp);
2183 edje_object_part_text_input_panel_language_set(Evas_Object *obj, const char *part, Edje_Input_Panel_Lang lang)
2188 ed = _edje_fetch(obj);
2189 if ((!ed) || (!part)) return;
2190 rp = _edje_real_part_recursive_get(ed, part);
2192 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2194 _edje_entry_input_panel_language_set(rp, lang);
2198 EAPI Edje_Input_Panel_Lang
2199 edje_object_part_text_input_panel_language_get(const Evas_Object *obj, const char *part)
2204 ed = _edje_fetch(obj);
2205 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2206 rp = _edje_real_part_recursive_get(ed, part);
2207 if (!rp) return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2208 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2210 return _edje_entry_input_panel_language_get(rp);
2212 return EDJE_INPUT_PANEL_LANG_AUTOMATIC;
2216 edje_object_part_text_input_panel_imdata_set(Evas_Object *obj, const char *part, const void *data, int len)
2221 ed = _edje_fetch(obj);
2222 if ((!ed) || (!part)) return;
2223 rp = _edje_real_part_recursive_get(ed, part);
2225 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2227 _edje_entry_input_panel_imdata_set(rp, data, len);
2232 edje_object_part_text_input_panel_imdata_get(const Evas_Object *obj, const char *part, void *data, int *len)
2237 ed = _edje_fetch(obj);
2238 if ((!ed) || (!part)) return;
2239 rp = _edje_real_part_recursive_get(ed, part);
2241 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2243 _edje_entry_input_panel_imdata_get(rp, data, len);
2248 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)
2253 ed = _edje_fetch(obj);
2254 if ((!ed) || (!part)) return;
2255 rp = _edje_real_part_recursive_get(ed, part);
2257 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2259 _edje_entry_input_panel_return_key_type_set(rp, return_key_type);
2263 EAPI Edje_Input_Panel_Return_Key_Type
2264 edje_object_part_text_input_panel_return_key_type_get(const Evas_Object *obj, const char *part)
2269 ed = _edje_fetch(obj);
2270 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2271 rp = _edje_real_part_recursive_get(ed, part);
2272 if (!rp) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2273 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2275 return _edje_entry_input_panel_return_key_type_get(rp);
2277 return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
2281 edje_object_part_text_input_panel_return_key_disabled_set(Evas_Object *obj, const char *part, Eina_Bool disabled)
2286 ed = _edje_fetch(obj);
2287 if ((!ed) || (!part)) return;
2288 rp = _edje_real_part_recursive_get(ed, part);
2290 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2292 _edje_entry_input_panel_return_key_disabled_set(rp, disabled);
2297 edje_object_part_text_input_panel_return_key_disabled_get(const Evas_Object *obj, const char *part)
2302 ed = _edje_fetch(obj);
2303 if ((!ed) || (!part)) return EINA_FALSE;
2304 rp = _edje_real_part_recursive_get(ed, part);
2305 if (!rp) return EINA_FALSE;
2306 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
2308 return _edje_entry_input_panel_return_key_disabled_get(rp);
2314 edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2317 Edje_Text_Insert_Filter_Callback *cb;
2319 ed = _edje_fetch(obj);
2320 if ((!ed) || (!part)) return;
2321 cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
2322 cb->part = eina_stringshare_add(part);
2324 cb->data = (void *)data;
2325 ed->text_insert_filter_callbacks =
2326 eina_list_append(ed->text_insert_filter_callbacks, cb);
2330 edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
2333 Edje_Text_Insert_Filter_Callback *cb;
2336 ed = _edje_fetch(obj);
2337 if ((!ed) || (!part)) return NULL;
2338 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2340 if ((!strcmp(cb->part, part)) && (cb->func == func))
2342 void *data = cb->data;
2343 ed->text_insert_filter_callbacks =
2344 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2345 eina_stringshare_del(cb->part);
2354 edje_object_text_insert_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
2357 Edje_Text_Insert_Filter_Callback *cb;
2360 ed = _edje_fetch(obj);
2361 if ((!ed) || (!part)) return NULL;
2362 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
2364 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2367 void *tmp = cb->data;
2368 ed->text_insert_filter_callbacks =
2369 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
2370 eina_stringshare_del(cb->part);
2379 edje_object_text_markup_filter_callback_add(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2382 Edje_Markup_Filter_Callback *cb;
2384 ed = _edje_fetch(obj);
2385 if ((!ed) || (!part)) return;
2386 cb = calloc(1, sizeof(Edje_Markup_Filter_Callback));
2387 cb->part = eina_stringshare_add(part);
2389 cb->data = (void *)data;
2390 ed->markup_filter_callbacks =
2391 eina_list_append(ed->markup_filter_callbacks, cb);
2395 edje_object_text_markup_filter_callback_del(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func)
2398 Edje_Markup_Filter_Callback *cb;
2401 ed = _edje_fetch(obj);
2402 if ((!ed) || (!part)) return NULL;
2403 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2405 if ((!strcmp(cb->part, part)) && (cb->func == func))
2407 void *data = cb->data;
2408 ed->markup_filter_callbacks =
2409 eina_list_remove_list(ed->markup_filter_callbacks, l);
2410 eina_stringshare_del(cb->part);
2419 edje_object_text_markup_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data)
2422 Edje_Markup_Filter_Callback *cb;
2425 ed = _edje_fetch(obj);
2426 if ((!ed) || (!part)) return NULL;
2427 EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
2429 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
2432 void *tmp = cb->data;
2433 ed->markup_filter_callbacks =
2434 eina_list_remove_list(ed->markup_filter_callbacks, l);
2435 eina_stringshare_del(cb->part);
2444 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
2448 Edje_User_Defined *eud = NULL;
2450 ed = _edje_fetch(obj);
2451 if ((!ed) || (!part)) return EINA_FALSE;
2453 /* Need to recalc before providing the object. */
2454 // XXX: I guess this is not required, removing for testing purposes
2455 // XXX: uncomment if you see glitches in e17 or others.
2456 // XXX: by Gustavo, January 21th 2009.
2457 // XXX: I got a backtrace with over 30000 calls without this,
2458 // XXX: only with 32px shelves. The problem is probably somewhere else,
2459 // XXX: but until it's found, leave this here.
2460 // XXX: by Sachiel, January 21th 2009, 19:30 UTC
2461 _edje_recalc_do(ed);
2463 rp = evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2466 /* The object is already swallowed somewhere, unswallow it first */
2467 edje_object_part_unswallow(rp->edje->obj, obj_swallow);
2470 rp = _edje_real_part_recursive_get(ed, part);
2473 DBG("cannot swallow part %s: part not exist!", part);
2476 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2478 ERR("cannot swallow part %s: not swallow type!", rp->part->name);
2481 _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE);
2483 if (rp->swallowed_object)
2487 eud = _edje_user_definition_new(EDJE_USER_SWALLOW, part, ed);
2488 evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
2490 else ed->user_defined = eina_list_append(ed->user_defined, eud);
2494 eud->u.swallow.child = obj_swallow;
2502 _recalc_extern_parent(Evas_Object *obj)
2504 Evas_Object *parent;
2507 parent = evas_object_smart_parent_get(obj);
2508 ed = _edje_fetch(parent);
2511 ed->recalc_call = 1; // ZZZ: ???
2516 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
2520 evas_object_size_hint_min_set(obj, minw, minh);
2521 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2524 rp->swallow_params.min.w = minw;
2525 rp->swallow_params.min.h = minh;
2527 _recalc_extern_parent(obj);
2532 edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
2536 evas_object_size_hint_max_set(obj, maxw, maxh);
2537 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2540 rp->swallow_params.max.w = maxw;
2541 rp->swallow_params.max.h = maxh;
2543 _recalc_extern_parent(obj);
2548 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
2551 Evas_Aspect_Control asp;
2553 asp = EVAS_ASPECT_CONTROL_NONE;
2556 case EDJE_ASPECT_CONTROL_NONE: asp = EVAS_ASPECT_CONTROL_NONE; break;
2557 case EDJE_ASPECT_CONTROL_NEITHER: asp = EVAS_ASPECT_CONTROL_NEITHER; break;
2558 case EDJE_ASPECT_CONTROL_HORIZONTAL: asp = EVAS_ASPECT_CONTROL_HORIZONTAL; break;
2559 case EDJE_ASPECT_CONTROL_VERTICAL: asp = EVAS_ASPECT_CONTROL_VERTICAL; break;
2560 case EDJE_ASPECT_CONTROL_BOTH: asp = EVAS_ASPECT_CONTROL_BOTH; break;
2565 evas_object_size_hint_aspect_set(obj, asp, aw, ah);
2566 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
2569 rp->swallow_params.aspect.mode = aspect;
2570 rp->swallow_params.aspect.w = aw;
2571 rp->swallow_params.aspect.h = ah;
2572 _recalc_extern_parent(obj);
2576 struct edje_box_layout_builtin {
2578 Evas_Object_Box_Layout cb;
2581 static Evas_Object_Box_Layout
2582 _edje_box_layout_builtin_find(const char *name)
2584 const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
2585 {"horizontal", evas_object_box_layout_horizontal},
2586 {"horizontal_flow", evas_object_box_layout_flow_horizontal},
2587 {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
2588 {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
2589 {"stack", evas_object_box_layout_stack},
2590 {"vertical", evas_object_box_layout_vertical},
2591 {"vertical_flow", evas_object_box_layout_flow_vertical},
2592 {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
2593 {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
2596 const struct edje_box_layout_builtin *base;
2601 base = _edje_box_layout_builtin + 0;
2604 base = _edje_box_layout_builtin + 4;
2607 base = _edje_box_layout_builtin + 5;
2613 for (; (base->name) && (base->name[0] == name[0]); base++)
2614 if (strcmp(base->name, name) == 0)
2620 static Eina_Rbtree_Direction
2621 _edje_box_layout_external_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right, __UNUSED__ void *data)
2623 Edje_Box_Layout *l = (Edje_Box_Layout *)left;
2624 Edje_Box_Layout *r = (Edje_Box_Layout *)right;
2626 if (strcmp(l->name, r->name) < 0)
2627 return EINA_RBTREE_RIGHT;
2629 return EINA_RBTREE_LEFT;
2633 _edje_box_layout_external_find_cmp(const Eina_Rbtree *node, const void *key, __UNUSED__ int length, __UNUSED__ void *data)
2635 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2636 return strcmp(key, l->name);
2639 static Edje_Box_Layout *
2640 _edje_box_layout_external_find(const char *name)
2642 return (Edje_Box_Layout *)eina_rbtree_inline_lookup
2643 (_edje_box_layout_registry, name, 0, _edje_box_layout_external_find_cmp,
2648 _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void (**free_data)(void *data))
2650 const Edje_Box_Layout *l;
2652 if (!name) return EINA_FALSE;
2654 *cb = _edje_box_layout_builtin_find(name);
2662 l = _edje_box_layout_external_find(name);
2663 if (!l) return EINA_FALSE;
2666 *free_data = l->layout_data_free;
2667 if (l->layout_data_get)
2668 *data = l->layout_data_get(l->data);
2676 _edje_box_layout_external_free(Eina_Rbtree *node, __UNUSED__ void *data)
2678 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2680 if (l->data && l->free_data)
2681 l->free_data(l->data);
2685 static Edje_Box_Layout *
2686 _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)
2691 name_len = strlen(name) + 1;
2692 l = malloc(sizeof(Edje_Box_Layout) + name_len);
2693 if (!l) return NULL;
2696 l->layout_data_get = layout_data_get;
2697 l->layout_data_free = layout_data_free;
2698 l->free_data = free_data;
2701 memcpy(l->name, name, name_len);
2707 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)
2713 if (_edje_box_layout_builtin_find(name))
2715 ERR("Cannot register layout '%s': would override builtin!",
2718 if (data && free_data) free_data(data);
2722 l = _edje_box_layout_external_find(name);
2727 if (data && free_data) free_data(data);
2731 l = _edje_box_layout_external_new
2732 (name, func, layout_data_get, layout_data_free, free_data, data);
2736 _edje_box_layout_registry = eina_rbtree_inline_insert
2737 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2738 _edje_box_layout_external_node_cmp, NULL);
2744 if (l->data && l->free_data) l->free_data(l->data);
2747 l->layout_data_get = layout_data_get;
2748 l->layout_data_free = layout_data_free;
2749 l->free_data = free_data;
2754 if (data && free_data) free_data(data);
2756 _edje_box_layout_registry = eina_rbtree_inline_remove
2757 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2758 _edje_box_layout_external_node_cmp, NULL);
2759 _edje_box_layout_external_free((Eina_Rbtree *)l, NULL);
2765 edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
2769 if (!obj_swallow) return;
2771 rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2774 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2776 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
2780 if (rp->swallowed_object == obj_swallow)
2782 Edje_User_Defined *eud;
2789 ed = _edje_fetch(obj);
2792 ERR("edje_object_part_unswallow called on a non Edje object ('%s').",
2793 evas_object_type_get(obj));
2797 EINA_LIST_FOREACH(ed->user_defined, l, eud)
2798 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj_swallow)
2800 _edje_user_definition_free(eud);
2806 _edje_real_part_swallow_clear(rp);
2807 rp->swallowed_object = NULL;
2808 rp->swallow_params.min.w = 0;
2809 rp->swallow_params.min.h = 0;
2810 rp->swallow_params.max.w = 0;
2811 rp->swallow_params.max.h = 0;
2812 rp->edje->dirty = 1;
2813 rp->edje->recalc_call = 1;
2814 #ifdef EDJE_CALC_CACHE
2817 _edje_recalc_do(rp->edje);
2823 edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
2828 ed = _edje_fetch(obj);
2829 if ((!ed) || (!part)) return NULL;
2831 /* Need to recalc before providing the object. */
2832 _edje_recalc_do(ed);
2834 rp = _edje_real_part_recursive_get(ed, part);
2835 if (!rp) return NULL;
2836 return rp->swallowed_object;
2840 edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2844 ed = _edje_fetch(obj);
2845 if ((!ed) || (!ed->collection))
2847 if (minw) *minw = 0;
2848 if (minh) *minh = 0;
2851 if (minw) *minw = ed->collection->prop.min.w;
2852 if (minh) *minh = ed->collection->prop.min.h;
2856 edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
2860 ed = _edje_fetch(obj);
2861 if ((!ed) || (!ed->collection))
2863 if (maxw) *maxw = 0;
2864 if (maxh) *maxh = 0;
2868 /* Need to recalc before providing the object. */
2869 _edje_recalc_do(ed);
2871 if (ed->collection->prop.max.w == 0)
2873 /* XXX TODO: convert maxw to 0, fix things that break. */
2874 if (maxw) *maxw = EDJE_INF_MAX_W;
2878 if (maxw) *maxw = ed->collection->prop.max.w;
2880 if (ed->collection->prop.max.h == 0)
2882 /* XXX TODO: convert maxh to 0, fix things that break. */
2883 if (maxh) *maxh = EDJE_INF_MAX_H;
2887 if (maxh) *maxh = ed->collection->prop.max.h;
2892 edje_object_calc_force(Evas_Object *obj)
2897 ed = _edje_fetch(obj);
2900 #ifdef EDJE_CALC_CACHE
2901 ed->all_part_change = 1;
2904 pf2 = _edje_freeze_val;
2907 _edje_freeze_val = 0;
2910 _edje_recalc_do(ed);
2913 _edje_freeze_val = pf2;
2917 edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2919 edje_object_size_min_restricted_calc(obj, minw, minh, 0, 0);
2923 edje_object_parts_extends_calc(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
2926 Evas_Coord xx1 = INT_MAX, yy1 = INT_MAX;
2927 Evas_Coord xx2 = 0, yy2 = 0;
2930 ed = _edje_fetch(obj);
2942 /* Need to recalc before providing the object. */
2944 _edje_recalc_do(ed);
2946 for (i = 0; i < ed->table_parts_size; i++)
2949 Evas_Coord rpx1, rpy1;
2950 Evas_Coord rpx2, rpy2;
2952 rp = ed->table_parts[i];
2956 rpx2 = rpx1 + rp->w;
2957 rpy2 = rpy1 + rp->h;
2959 if (xx1 > rpx1) xx1 = rpx1;
2960 if (yy1 > rpy1) yy1 = rpy1;
2961 if (xx2 < rpx2) xx2 = rpx2;
2962 if (yy2 < rpy2) yy2 = rpy2;
2969 if (w) *w = xx2 - xx1;
2970 if (h) *h = yy2 - yy1;
2976 edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh, Evas_Coord restrictedw, Evas_Coord restrictedh)
2983 Edje_Real_Part *pep = NULL;
2984 Eina_Bool has_non_fixed_tb = EINA_FALSE;
2986 ed = _edje_fetch(obj);
2987 if ((!ed) || (!ed->collection))
2989 if (minw) *minw = restrictedw;
2990 if (minh) *minh = restrictedh;
2999 ed->w = restrictedw;
3000 ed->h = restrictedh;
3011 #ifdef EDJE_CALC_CACHE
3012 ed->all_part_change = 1;
3014 _edje_recalc_do(ed);
3021 has_non_fixed_tb = EINA_FALSE;
3022 for (i = 0; i < ed->table_parts_size; i++)
3028 ep = ed->table_parts[i];
3029 w = ep->w - ep->req.w;
3030 h = ep->h - ep->req.h;
3032 if (ep->chosen_description)
3034 if (!ep->chosen_description->fixed.w)
3036 if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
3039 evas_object_textblock_size_formatted_get(ep->object,
3046 has_non_fixed_tb = EINA_TRUE;
3056 if (!ep->chosen_description->fixed.h)
3058 if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
3059 (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
3070 if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
3072 has_non_fixed_tb = EINA_TRUE;
3080 if (ed->w < restrictedw) ed->w = restrictedw;
3085 if (ed->h < restrictedh) ed->h = restrictedh;
3087 if ((ed->w > 4000) || (ed->h > 4000))
3089 /* Only print it if we have a non-fixed textblock.
3090 * We should possibly avoid all of this if in this case, but in
3091 * the meanwhile, just doing this. */
3092 if (!has_non_fixed_tb)
3095 ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
3096 ed->path, ed->group, pep->part->name);
3098 ERR("file %s, group %s overflowed 4000x4000 with minimum size of %dx%d. Continuing discarding faulty parts.",
3099 ed->path, ed->group, ed->w, ed->h);
3113 if (minw) *minw = ed->min.w;
3114 if (minh) *minh = ed->min.h;
3119 #ifdef EDJE_CALC_CACHE
3120 ed->all_part_change = 1;
3126 /* FIXME: Correctly return other states */
3128 edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val_ret)
3133 ed = _edje_fetch(obj);
3134 if ((!ed) || (!part))
3136 if (val_ret) *val_ret = 0;
3140 /* Need to recalc before providing the object. */
3141 _edje_recalc_do(ed);
3143 rp = _edje_real_part_recursive_get(ed, part);
3146 if (val_ret) *val_ret = 0;
3147 INF("part not found");
3150 if (rp->chosen_description)
3152 if (val_ret) *val_ret = rp->chosen_description->state.value;
3153 if (rp->chosen_description->state.name)
3154 return rp->chosen_description->state.name;
3159 if (rp->param1.description)
3161 if (val_ret) *val_ret = rp->param1.description->state.value;
3162 if (rp->param1.description->state.name)
3163 return rp->param1.description->state.name;
3167 if (val_ret) *val_ret = 0;
3172 edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
3177 ed = _edje_fetch(obj);
3178 if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
3180 /* Need to recalc before providing the object. */
3181 _edje_recalc_do(ed);
3183 rp = _edje_real_part_recursive_get(ed, part);
3184 if (!rp) return EDJE_DRAG_DIR_NONE;
3185 if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
3186 else if (rp->part->dragable.x) return EDJE_DRAG_DIR_X;
3187 else if (rp->part->dragable.y) return EDJE_DRAG_DIR_Y;
3188 return EDJE_DRAG_DIR_NONE;
3192 edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
3196 Edje_User_Defined *eud;
3199 ed = _edje_fetch(obj);
3200 if ((!ed) || (!part)) return EINA_FALSE;
3201 rp = _edje_real_part_recursive_get(ed, part);
3202 if (!rp) return EINA_FALSE;
3203 if (!rp->drag) return EINA_FALSE;
3204 if (rp->drag->down.count > 0) return EINA_FALSE;
3206 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3207 if (eud->type == EDJE_USER_DRAG_VALUE && !strcmp(part, eud->part))
3209 eud->u.drag_position.x = dx;
3210 eud->u.drag_position.y = dy;
3215 eud = _edje_user_definition_new(EDJE_USER_DRAG_VALUE, part, ed);
3218 eud->u.drag_position.x = dx;
3219 eud->u.drag_position.y = dy;
3223 if (rp->part->dragable.confine_id != -1)
3225 dx = CLAMP(dx, 0.0, 1.0);
3226 dy = CLAMP(dy, 0.0, 1.0);
3228 if (rp->part->dragable.x < 0) dx = 1.0 - dx;
3229 if (rp->part->dragable.y < 0) dy = 1.0 - dy;
3230 if ((rp->drag->val.x == FROM_DOUBLE(dx)) && (rp->drag->val.y == FROM_DOUBLE(dy))) return EINA_TRUE;
3231 rp->drag->val.x = FROM_DOUBLE(dx);
3232 rp->drag->val.y = FROM_DOUBLE(dy);
3233 #ifdef EDJE_CALC_CACHE
3236 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3237 _edje_emit(rp->edje, "drag,set", rp->part->name);
3241 /* FIXME: Should this be x and y instead of dx/dy? */
3243 edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3249 ed = _edje_fetch(obj);
3250 if ((!ed) || (!part))
3257 /* Need to recalc before providing the object. */
3258 _edje_recalc_do(ed);
3260 rp = _edje_real_part_recursive_get(ed, part);
3261 if (!rp || !rp->drag)
3267 ddx = TO_DOUBLE(rp->drag->val.x);
3268 ddy = TO_DOUBLE(rp->drag->val.y);
3269 if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
3270 if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
3277 edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
3281 Edje_User_Defined *eud;
3284 ed = _edje_fetch(obj);
3285 if ((!ed) || (!part)) return EINA_FALSE;
3286 rp = _edje_real_part_recursive_get(ed, part);
3287 if (!rp) return EINA_FALSE;
3288 if (!rp->drag) return EINA_FALSE;
3290 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3291 if (eud->type == EDJE_USER_DRAG_SIZE && !strcmp(part, eud->part))
3293 eud->u.drag_size.w = dw;
3294 eud->u.drag_size.h = dh;
3299 eud = _edje_user_definition_new(EDJE_USER_DRAG_SIZE, part, ed);
3302 eud->u.drag_size.w = dw;
3303 eud->u.drag_size.h = dh;
3307 if (dw < 0.0) dw = 0.0;
3308 else if (dw > 1.0) dw = 1.0;
3309 if (dh < 0.0) dh = 0.0;
3310 else if (dh > 1.0) dh = 1.0;
3311 if ((rp->drag->size.x == FROM_DOUBLE(dw)) && (rp->drag->size.y == FROM_DOUBLE(dh))) return EINA_TRUE;
3312 rp->drag->size.x = FROM_DOUBLE(dw);
3313 rp->drag->size.y = FROM_DOUBLE(dh);
3314 rp->edje->dirty = 1;
3315 rp->edje->recalc_call = 1;
3316 #ifdef EDJE_CALC_CACHE
3319 _edje_recalc(rp->edje);
3324 edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double *dw, double *dh)
3329 ed = _edje_fetch(obj);
3330 if ((!ed) || (!part))
3337 /* Need to recalc before providing the object. */
3338 _edje_recalc_do(ed);
3340 rp = _edje_real_part_recursive_get(ed, part);
3341 if (!rp || !rp->drag)
3347 if (dw) *dw = TO_DOUBLE(rp->drag->size.x);
3348 if (dh) *dh = TO_DOUBLE(rp->drag->size.y);
3353 edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
3357 Edje_User_Defined *eud;
3360 ed = _edje_fetch(obj);
3361 if ((!ed) || (!part)) return EINA_FALSE;
3362 rp = _edje_real_part_recursive_get(ed, part);
3363 if (!rp) return EINA_FALSE;
3364 if (!rp->drag) return EINA_FALSE;
3366 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3367 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3369 eud->u.drag_position.x = dx;
3370 eud->u.drag_position.y = dy;
3375 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3378 eud->u.drag_position.x = dx;
3379 eud->u.drag_position.y = dy;
3383 if (dx < 0.0) dx = 0.0;
3384 else if (dx > 1.0) dx = 1.0;
3385 if (dy < 0.0) dy = 0.0;
3386 else if (dy > 1.0) dy = 1.0;
3387 rp->drag->step.x = FROM_DOUBLE(dx);
3388 rp->drag->step.y = FROM_DOUBLE(dy);
3389 #ifdef EDJE_CALC_CACHE
3396 edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3401 ed = _edje_fetch(obj);
3402 if ((!ed) || (!part))
3409 /* Need to recalc before providing the object. */
3410 _edje_recalc_do(ed);
3412 rp = _edje_real_part_recursive_get(ed, part);
3413 if (!rp || !rp->drag)
3419 if (dx) *dx = TO_DOUBLE(rp->drag->step.x);
3420 if (dy) *dy = TO_DOUBLE(rp->drag->step.y);
3425 edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
3429 Edje_User_Defined *eud;
3432 ed = _edje_fetch(obj);
3433 if ((!ed) || (!part)) return EINA_FALSE;
3434 rp = _edje_real_part_recursive_get(ed, part);
3435 if (!rp) return EINA_FALSE;
3436 if (!rp->drag) return EINA_FALSE;
3438 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3439 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3441 eud->u.drag_position.x = dx;
3442 eud->u.drag_position.y = dy;
3447 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3450 eud->u.drag_position.x = dx;
3451 eud->u.drag_position.y = dy;
3455 if (dx < 0.0) dx = 0.0;
3456 else if (dx > 1.0) dx = 1.0;
3457 if (dy < 0.0) dy = 0.0;
3458 else if (dy > 1.0) dy = 1.0;
3459 rp->drag->page.x = FROM_DOUBLE(dx);
3460 rp->drag->page.y = FROM_DOUBLE(dy);
3461 #ifdef EDJE_CALC_CACHE
3468 edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
3473 ed = _edje_fetch(obj);
3474 if ((!ed) || (!part))
3481 /* Need to recalc before providing the object. */
3482 _edje_recalc_do(ed);
3484 rp = _edje_real_part_recursive_get(ed, part);
3485 if (!rp || !rp->drag)
3491 if (dx) *dx = TO_DOUBLE(rp->drag->page.x);
3492 if (dy) *dy = TO_DOUBLE(rp->drag->page.y);
3497 edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double dy)
3502 Edje_User_Defined *eud;
3505 ed = _edje_fetch(obj);
3506 if ((!ed) || (!part)) return EINA_FALSE;
3507 rp = _edje_real_part_recursive_get(ed, part);
3508 if (!rp) return EINA_FALSE;
3509 if (!rp->drag) return EINA_FALSE;
3510 if (rp->drag->down.count > 0) return EINA_FALSE;
3512 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3513 if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part))
3515 eud->u.drag_position.x = dx;
3516 eud->u.drag_position.y = dy;
3521 eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed);
3524 eud->u.drag_position.x = dx;
3525 eud->u.drag_position.y = dy;
3529 px = rp->drag->val.x;
3530 py = rp->drag->val.y;
3531 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx),
3532 MUL(rp->drag->step.x, rp->part->dragable.x)));
3533 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy),
3534 MUL(rp->drag->step.y, rp->part->dragable.y)));
3535 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3536 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3537 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3538 #ifdef EDJE_CALC_CACHE
3541 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3542 _edje_emit(rp->edje, "drag,step", rp->part->name);
3547 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
3552 Edje_User_Defined *eud;
3555 ed = _edje_fetch(obj);
3556 if ((!ed) || (!part)) return EINA_FALSE;
3557 rp = _edje_real_part_recursive_get(ed, part);
3558 if (!rp) return EINA_FALSE;
3559 if (!rp->drag) return EINA_FALSE;
3560 if (rp->drag->down.count > 0) return EINA_FALSE;
3562 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3563 if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part))
3565 eud->u.drag_position.x = dx;
3566 eud->u.drag_position.y = dy;
3571 eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed);
3574 eud->u.drag_position.x = dx;
3575 eud->u.drag_position.y = dy;
3579 px = rp->drag->val.x;
3580 py = rp->drag->val.y;
3581 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x)));
3582 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy), MUL(rp->drag->page.y, rp->part->dragable.y)));
3583 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
3584 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
3585 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
3586 #ifdef EDJE_CALC_CACHE
3589 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
3590 _edje_emit(rp->edje, "drag,page", rp->part->name);
3595 _edje_box_init(void)
3601 _edje_box_shutdown(void)
3603 if (!_edje_box_layout_registry)
3607 (_edje_box_layout_registry, _edje_box_layout_external_free, NULL);
3608 _edje_box_layout_registry = NULL;
3612 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
3618 ed = _edje_fetch(obj);
3619 if ((!ed) || (!part) || (!child)) return EINA_FALSE;
3621 rp = _edje_real_part_recursive_get(ed, part);
3622 if (!rp) return EINA_FALSE;
3623 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3625 r = _edje_real_part_box_append(rp, child);
3629 Edje_User_Defined *eud;
3631 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3633 eud->u.box.child = child;
3634 eud->u.box.index = -1;
3636 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3642 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
3648 ed = _edje_fetch(obj);
3649 if ((!ed) || (!part)) return EINA_FALSE;
3651 rp = _edje_real_part_recursive_get(ed, part);
3652 if (!rp) return EINA_FALSE;
3653 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3655 r = _edje_real_part_box_prepend(rp, child);
3659 Edje_User_Defined *eud;
3661 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3663 eud->u.box.child = child;
3665 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3671 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
3677 ed = _edje_fetch(obj);
3678 if ((!ed) || (!part)) return EINA_FALSE;
3680 rp = _edje_real_part_recursive_get(ed, part);
3681 if (!rp) return EINA_FALSE;
3682 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3684 r = _edje_real_part_box_insert_before(rp, child, reference);
3688 Edje_User_Defined *eud;
3690 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3692 eud->u.box.child = child;
3694 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3700 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
3706 ed = _edje_fetch(obj);
3707 if ((!ed) || (!part)) return EINA_FALSE;
3709 rp = _edje_real_part_recursive_get(ed, part);
3710 if (!rp) return EINA_FALSE;
3711 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3713 r = _edje_real_part_box_insert_at(rp, child, pos);
3717 Edje_User_Defined *eud;
3719 eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed);
3721 eud->u.box.child = child;
3723 evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
3729 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
3735 ed = _edje_fetch(obj);
3736 if ((!ed) || (!part)) return NULL;
3738 rp = _edje_real_part_recursive_get(ed, part);
3739 if (!rp) return NULL;
3740 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3742 r = _edje_real_part_box_remove(rp, child);
3746 Edje_User_Defined *eud;
3749 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3750 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == child && !strcmp(eud->part, part))
3752 _edje_user_definition_free(eud);
3760 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
3766 ed = _edje_fetch(obj);
3767 if ((!ed) || (!part)) return NULL;
3769 rp = _edje_real_part_recursive_get(ed, part);
3770 if (!rp) return NULL;
3771 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
3773 r = _edje_real_part_box_remove_at(rp, pos);
3777 Edje_User_Defined *eud;
3780 EINA_LIST_FOREACH(ed->user_defined, l, eud)
3781 if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == r && !strcmp(eud->part, part))
3783 _edje_user_definition_free(eud);
3791 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
3797 ed = _edje_fetch(obj);
3798 if ((!ed) || (!part)) return EINA_FALSE;
3800 rp = _edje_real_part_recursive_get(ed, part);
3801 if (!rp) return EINA_FALSE;
3802 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
3804 r = _edje_real_part_box_remove_all(rp, clear);
3807 Edje_User_Defined *eud;
3810 EINA_LIST_FOREACH_SAFE(ed->user_defined, l, ll, eud)
3811 if (eud->type == EDJE_USER_BOX_PACK && !strcmp(eud->part, part))
3813 _edje_user_definition_free(eud);
3821 edje_object_access_part_list_get(const Evas_Object *obj)
3824 Eina_List *access_parts = NULL;
3826 ed = _edje_fetch(obj);
3827 if ((!ed)) return NULL;
3830 for (i = 0; i < ed->table_parts_size; i++)
3833 rp = ed->table_parts[i];
3834 if (rp->part->access)
3835 access_parts = eina_list_append(access_parts, rp->part->name);
3838 return access_parts;
3842 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
3844 Edje_Real_Part *rp = data;
3846 rp->edje->dirty = 1;
3847 rp->edje->recalc_call = 1;
3848 #ifdef EDJE_CALC_CACHE
3851 _edje_recalc(rp->edje);
3855 _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
3857 evas_object_event_callback_add
3858 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3860 rp->edje->dirty = 1;
3861 rp->edje->recalc_call = 1;
3862 #ifdef EDJE_CALC_CACHE
3865 _edje_recalc(rp->edje);
3869 _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
3871 evas_object_event_callback_del_full
3872 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
3874 rp->edje->dirty = 1;
3875 rp->edje->recalc_call = 1;
3876 #ifdef EDJE_CALC_CACHE
3879 _edje_recalc(rp->edje);
3883 _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj)
3885 Evas_Object_Box_Option *opt;
3887 opt = evas_object_box_append(rp->object, child_obj);
3888 if (!opt) return EINA_FALSE;
3890 if (!_edje_box_layout_add_child(rp, child_obj))
3892 evas_object_box_remove(rp->object, child_obj);
3896 _edje_box_child_add(rp, child_obj);
3902 _edje_real_part_box_prepend(Edje_Real_Part *rp, Evas_Object *child_obj)
3904 Evas_Object_Box_Option *opt;
3906 opt = evas_object_box_prepend(rp->object, child_obj);
3907 if (!opt) return EINA_FALSE;
3909 if (!_edje_box_layout_add_child(rp, child_obj))
3911 evas_object_box_remove(rp->object, child_obj);
3915 _edje_box_child_add(rp, child_obj);
3921 _edje_real_part_box_insert_before(Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref)
3923 Evas_Object_Box_Option *opt;
3925 opt = evas_object_box_insert_before(rp->object, child_obj, ref);
3926 if (!opt) return EINA_FALSE;
3928 if (!_edje_box_layout_add_child(rp, child_obj))
3930 evas_object_box_remove(rp->object, child_obj);
3934 _edje_box_child_add(rp, child_obj);
3940 _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned int pos)
3942 Evas_Object_Box_Option *opt;
3944 opt = evas_object_box_insert_at(rp->object, child_obj, pos);
3945 if (!opt) return EINA_FALSE;
3947 if (!_edje_box_layout_add_child(rp, child_obj))
3949 evas_object_box_remove(rp->object, child_obj);
3953 _edje_box_child_add(rp, child_obj);
3959 _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj)
3961 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
3962 if (!evas_object_box_remove(rp->object, child_obj)) return NULL;
3963 _edje_box_layout_remove_child(rp, child_obj);
3964 _edje_box_child_remove(rp, child_obj);
3969 _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
3971 Evas_Object_Box_Option *opt;
3972 Evas_Object_Box_Data *priv;
3973 Evas_Object *child_obj;
3975 priv = evas_object_smart_data_get(rp->object);
3976 opt = eina_list_nth(priv->children, pos);
3977 if (!opt) return NULL;
3978 child_obj = opt->obj;
3979 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
3980 if (!evas_object_box_remove_at(rp->object, pos)) return NULL;
3981 _edje_box_layout_remove_child(rp, child_obj);
3982 _edje_box_child_remove(rp, child_obj);
3987 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
3989 Eina_List *children;
3992 children = evas_object_box_children_get(rp->object);
3995 Evas_Object *child_obj = children->data;
3996 if (evas_object_data_get(child_obj, "\377 edje.box_item"))
4000 _edje_box_layout_remove_child(rp, child_obj);
4001 _edje_box_child_remove(rp, child_obj);
4002 if (!evas_object_box_remove_at(rp->object, i))
4005 evas_object_del(child_obj);
4007 children = eina_list_remove_list(children, children);
4013 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child, void *einfo __UNUSED__)
4015 Edje_User_Defined *eud;
4017 Edje_Real_Part *rp = data;
4019 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4020 if (rp->part->type == EDJE_PART_TYPE_BOX)
4022 if (eud->type == EDJE_USER_BOX_PACK &&
4023 eud->u.box.child == child &&
4024 !strcmp(rp->part->name, eud->part))
4026 _edje_user_definition_free(eud);
4030 else if (rp->part->type == EDJE_PART_TYPE_TABLE)
4032 if (eud->type == EDJE_USER_TABLE_PACK &&
4033 eud->u.table.child == child &&
4034 !strcmp(rp->part->name, eud->part))
4036 _edje_user_definition_free(eud);
4041 rp->edje->dirty = 1;
4042 rp->edje->recalc_call = 1;
4043 #ifdef EDJE_CALC_CACHE
4046 _edje_recalc(rp->edje);
4050 _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
4052 evas_object_event_callback_add
4053 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4055 rp->edje->dirty = 1;
4056 rp->edje->recalc_call = 1;
4057 #ifdef EDJE_CALC_CACHE
4060 _edje_recalc(rp->edje);
4064 _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
4066 evas_object_event_callback_del_full
4067 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
4069 rp->edje->dirty = 1;
4070 rp->edje->recalc_call = 1;
4071 #ifdef EDJE_CALC_CACHE
4074 _edje_recalc(rp->edje);
4078 edje_object_part_table_child_get(const Evas_Object *obj, const char *part, unsigned int col, unsigned int row)
4083 ed = _edje_fetch(obj);
4084 if ((!ed) || (!part)) return NULL;
4086 rp = _edje_real_part_recursive_get(ed, part);
4087 if (!rp) return NULL;
4088 if (rp->part->type != EDJE_PART_TYPE_TABLE) return NULL;
4090 return evas_object_table_child_get(rp->object, col, row);
4094 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)
4098 Edje_User_Defined *eud;
4101 ed = _edje_fetch(obj);
4102 if ((!ed) || (!part)) return EINA_FALSE;
4104 rp = _edje_real_part_recursive_get(ed, part);
4105 if (!rp) return EINA_FALSE;
4106 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4108 r = _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
4111 eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed);
4114 eud->u.table.child = child_obj;
4115 eud->u.table.col = col;
4116 eud->u.table.row = row;
4117 eud->u.table.colspan = colspan;
4118 eud->u.table.rowspan = rowspan;
4120 evas_object_event_callback_add(child_obj, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
4126 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
4132 ed = _edje_fetch(obj);
4133 if ((!ed) || (!part)) return EINA_FALSE;
4135 rp = _edje_real_part_recursive_get(ed, part);
4136 if (!rp) return EINA_FALSE;
4137 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4139 r = _edje_real_part_table_unpack(rp, child_obj);
4143 Edje_User_Defined *eud;
4146 EINA_LIST_FOREACH(ed->user_defined, l, eud)
4147 if (eud->type == EDJE_USER_TABLE_PACK &&
4148 eud->u.table.child == child_obj &&
4149 !strcmp(part, eud->part))
4151 _edje_user_definition_free(eud);
4160 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
4165 ed = _edje_fetch(obj);
4166 if ((!ed) || (!part)) return EINA_FALSE;
4168 rp = _edje_real_part_recursive_get(ed, part);
4169 if (!rp) return EINA_FALSE;
4170 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4172 evas_object_table_col_row_size_get(rp->object, cols, rows);
4177 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
4182 ed = _edje_fetch(obj);
4183 if ((!ed) || (!part)) return EINA_FALSE;
4185 rp = _edje_real_part_recursive_get(ed, part);
4186 if (!rp) return EINA_FALSE;
4187 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
4189 _edje_real_part_table_clear(rp, clear);
4194 _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
4196 Edje_Perspective *ps = data;
4199 EINA_LIST_FREE(ps->users, o)
4203 ed = evas_object_smart_data_get(o);
4207 ed->recalc_call = 1;
4208 _edje_recalc_do(ed);
4213 EAPI Edje_Perspective *
4214 edje_perspective_new(Evas *e)
4216 Edje_Perspective *ps;
4217 Evas_Coord vx, vy, vw, vh;
4219 if (!e) return NULL;
4220 ps = calloc(1, sizeof(Edje_Perspective));
4221 ps->obj = evas_object_rectangle_add(e);
4222 evas_object_data_set(ps->obj, "_edje_perspective", ps);
4223 evas_object_event_callback_add(ps->obj, EVAS_CALLBACK_DEL, _edje_perspective_obj_del, ps);
4224 evas_output_viewport_get(e, &vx, &vy, &vw, &vh);
4226 ps->px = vx + (vw / 2);
4227 ps->py = vy + (vh / 2);
4234 edje_perspective_free(Edje_Perspective *ps)
4237 evas_object_del(ps->obj);
4241 edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
4247 if ((ps->px == px) && (ps->py == py) && (ps->z0 == z0) && (ps->foc == foc)) return;
4252 EINA_LIST_FOREACH(ps->users, l, o)
4256 ed = evas_object_smart_data_get(o);
4261 ed->recalc_call = 1;
4262 _edje_recalc_do(ed);
4267 EINA_LIST_FOREACH(_edje_edjes, l, o)
4271 ed = evas_object_smart_data_get(o);
4276 ed->recalc_call = 1;
4277 _edje_recalc_do(ed);
4284 edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
4290 if (ps->global == global) return;
4293 o = evas_object_name_find(evas_object_evas_get(ps->obj),
4294 "_edje_perspective");
4295 if (o) evas_object_name_set(o, NULL);
4296 evas_object_name_set(ps->obj, "_edje_perspective");
4299 evas_object_name_set(ps->obj, NULL);
4300 ps->global = global;
4301 EINA_LIST_FOREACH(_edje_edjes, l, o)
4305 ed = evas_object_smart_data_get(o);
4310 ed->recalc_call = 1;
4311 _edje_recalc_do(ed);
4317 edje_perspective_global_get(const Edje_Perspective *ps)
4319 if (!ps) return EINA_FALSE;
4323 EAPI const Edje_Perspective *
4324 edje_evas_global_perspective_get(const Evas *e)
4328 if (!e) return NULL;
4329 obj = evas_object_name_find(e, "_edje_perspective");
4330 if (!obj) return NULL;
4331 return evas_object_data_get(obj, "_edje_perspective");
4335 edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
4339 ed = evas_object_smart_data_get(obj);
4341 if (ed->persp == ps) return;
4342 if (ed->persp != ps)
4345 ed->persp->users = eina_list_remove(ed->persp->users, obj);
4348 if (ps) ps->users = eina_list_append(ps->users, obj);
4350 ed->recalc_call = 1;
4351 _edje_recalc_do(ed);
4354 EAPI const Edje_Perspective *
4355 edje_object_perspective_get(const Evas_Object *obj)
4359 ed = evas_object_smart_data_get(obj);
4360 if (!ed) return NULL;
4364 #define EDJE_PRELOAD_EMISSION "preload,done"
4365 #define EDJE_PRELOAD_SOURCE NULL
4368 edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
4374 ed = _edje_fetch(obj);
4375 if (!ed) return EINA_FALSE;
4377 _edje_recalc_do(ed);
4379 for (i = 0, count = 0; i < ed->table_parts_size; i++)
4384 rp = ed->table_parts[i];
4387 if (ep->type == EDJE_PART_TYPE_IMAGE ||
4388 (ep->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object))
4392 ed->preload_count = count;
4396 for (i = 0; i < ed->table_parts_size; i++)
4401 rp = ed->table_parts[i];
4404 if (ep->type == EDJE_PART_TYPE_IMAGE)
4406 const char *file = NULL;
4407 const char *key = NULL;
4409 evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4411 evas_object_image_file_get(rp->object, &file, &key);
4414 ed->preload_count--;
4418 evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4419 evas_object_image_preload(rp->object, cancel);
4423 else if (ep->type == EDJE_PART_TYPE_GROUP)
4425 if (rp->swallowed_object) {
4430 tmp = alloca(strlen(rp->part->name) + 2);
4431 sprintf(tmp, "%s:", rp->part->name);
4433 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb);
4434 edje_object_signal_callback_add(obj, EDJE_PRELOAD_EMISSION, tmp, _edje_object_signal_preload_cb, ed);
4435 edje_object_preload(rp->swallowed_object, cancel);
4439 ed->preload_count--;
4449 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
4456 edje_object_update_hints_set(Evas_Object *obj, Eina_Bool update)
4460 ed = _edje_fetch(obj);
4462 if (ed->update_hints == !!update) return ;
4464 ed->update_hints = !!update;
4467 ed->recalc_hints = 1;
4473 edje_object_update_hints_get(Evas_Object *obj)
4477 ed = _edje_fetch(obj);
4478 if (!ed) return EINA_FALSE;
4480 return ed->update_hints;
4484 _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)
4487 evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
4489 _edje_table_child_add(rp, child_obj);
4495 _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
4497 Eina_Bool ret = evas_object_table_unpack(rp->object, child_obj);
4500 _edje_table_child_remove(rp, child_obj);
4506 _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
4508 Eina_List *children;
4510 children = evas_object_table_children_get(rp->object);
4513 Evas_Object *child_obj = children->data;
4515 _edje_table_child_remove(rp, child_obj);
4516 if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
4518 evas_object_table_unpack(rp->object, child_obj);
4520 evas_object_del(child_obj);
4522 children = eina_list_remove_list(children, children);
4527 _edje_real_part_recursive_get(const Edje *ed, const char *part)
4532 path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
4533 if (!path) return NULL;
4535 rp = _edje_real_part_recursive_get_helper(ed, path);
4543 _edje_children_get(Edje_Real_Part *rp, const char *partid)
4550 if (!partid) return NULL;
4552 switch (rp->part->type)
4554 case EDJE_PART_TYPE_EXTERNAL:
4555 return _edje_external_content_get(rp->swallowed_object, partid);
4556 case EDJE_PART_TYPE_BOX:
4557 l = evas_object_box_children_get(rp->object);
4559 case EDJE_PART_TYPE_TABLE:
4560 l = evas_object_table_children_get(rp->object);
4566 v = strtol(partid, &p, 10);
4567 if ((*p == '\0') && (v >= 0))
4569 child = eina_list_nth(l, v);
4575 EINA_LIST_FREE(l, cur)
4577 const char *name = evas_object_name_get(cur);
4578 if ((name) && (!strcmp(name, partid)))
4590 /* rebuild alternative path */
4592 _edje_merge_path(const char *alias, char * const *path)
4595 unsigned int length = 1;
4596 unsigned int alias_length;
4599 if (!alias) return NULL;
4601 alias_length = strlen(alias);
4603 for (i = 0; path[i]; i++)
4604 length += strlen(path[i]) + 1;
4606 tmp = malloc(sizeof (char) * (length + alias_length + 2));
4607 memcpy(tmp, alias, alias_length);
4608 tmp[alias_length] = '\0';
4610 for (i = 0; path[i]; i++)
4612 strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
4613 strcat(tmp, path[i]);
4621 _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
4630 if (ed->collection && ed->collection->alias)
4634 alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
4636 rp = _edje_real_part_recursive_get(ed, alias);
4642 //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
4643 idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
4648 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
4657 rp = _edje_real_part_get(ed, path[0]);
4658 if (!path[1] && !idx) return rp;
4659 if (!rp) return NULL;
4661 switch (rp->part->type)
4663 case EDJE_PART_TYPE_GROUP:
4664 if (!rp->swallowed_object) return NULL;
4665 ed = _edje_fetch(rp->swallowed_object);
4666 if (!ed) return NULL;
4668 return _edje_real_part_recursive_get_helper(ed, path);
4669 case EDJE_PART_TYPE_BOX:
4670 case EDJE_PART_TYPE_TABLE:
4671 case EDJE_PART_TYPE_EXTERNAL:
4672 if (!idx) return rp;
4675 child = _edje_children_get(rp, idx);
4677 ed = _edje_fetch(child);
4679 if (!ed) return NULL;
4680 return _edje_real_part_recursive_get_helper(ed, path);
4686 /* Private Routines */
4688 _edje_real_part_get(const Edje *ed, const char *part)
4692 if (!part) return NULL;
4694 for (i = 0; i < ed->table_parts_size; i++)
4698 rp = ed->table_parts[i];
4699 if ((rp->part->name) && (!strcmp(rp->part->name, part))) return rp;
4705 _edje_color_class_find(Edje *ed, const char *color_class)
4707 Edje_Color_Class *cc = NULL;
4709 if ((!ed) || (!color_class)) return NULL;
4711 /* first look through the object scope */
4712 cc = eina_hash_find(ed->color_classes, color_class);
4715 /* next look through the global scope */
4716 cc = eina_hash_find(_edje_color_class_hash, color_class);
4719 /* finally, look through the file scope */
4720 cc = eina_hash_find(ed->file->color_hash, color_class);
4727 _edje_color_class_member_add(Edje *ed, const char *color_class)
4729 _edje_class_member_add(ed, &ed->members.color_class, &_edje_color_class_member_hash, color_class);
4733 _edje_color_class_member_direct_del(const char *color_class, void *l)
4735 _edje_class_member_direct_del(color_class, l, _edje_color_class_member_hash);
4739 _edje_color_class_member_del(Edje *ed, const char *color_class)
4741 if ((!ed) || (!color_class)) return;
4743 _edje_class_member_del(&ed->members.color_class, &_edje_color_class_member_hash, color_class);
4747 _edje_color_class_members_free(void)
4749 if (!_edje_color_class_member_hash) return;
4750 eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
4751 eina_hash_free(_edje_color_class_member_hash);
4752 _edje_color_class_member_hash = NULL;
4756 color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4758 Edje_Color_Class *cc;
4761 if (cc->name) eina_stringshare_del(cc->name);
4767 _edje_color_class_hash_free(void)
4769 if (!_edje_color_class_hash) return;
4770 eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
4771 eina_hash_free(_edje_color_class_hash);
4772 _edje_color_class_hash = NULL;
4776 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
4780 if ((ep->default_desc) && (ep->default_desc->color_class))
4781 _edje_color_class_member_del(ed, ep->default_desc->color_class);
4783 for (i = 0; i < ep->other.desc_count; ++i)
4784 if (ep->other.desc[i]->color_class)
4785 _edje_color_class_member_del(ed, ep->other.desc[i]->color_class);
4789 _edje_text_class_find(Edje *ed, const char *text_class)
4792 Edje_Text_Class *tc;
4794 if ((!ed) || (!text_class)) return NULL;
4795 EINA_LIST_FOREACH(ed->text_classes, l, tc)
4796 if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
4797 return eina_hash_find(_edje_text_class_hash, text_class);
4801 _edje_text_class_member_direct_del(const char *text_class,
4804 _edje_class_member_direct_del(text_class, l, _edje_text_class_member_hash);
4808 _edje_text_class_member_add(Edje *ed, const char *text_class)
4810 _edje_class_member_add(ed, &ed->members.text_class, &_edje_text_class_member_hash, text_class);
4814 _edje_text_class_member_del(Edje *ed, const char *text_class)
4816 if ((!ed) || (!text_class)) return;
4818 _edje_class_member_del(&ed->members.text_class, &_edje_text_class_member_hash, text_class);
4822 _edje_text_class_members_free(void)
4824 _edje_class_members_free(&_edje_text_class_member_hash);
4828 text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
4830 Edje_Text_Class *tc;
4833 if (tc->name) eina_stringshare_del(tc->name);
4834 if (tc->font) eina_stringshare_del(tc->font);
4840 _edje_text_class_hash_free(void)
4842 if (!_edje_text_class_hash) return;
4843 eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
4844 eina_hash_free(_edje_text_class_hash);
4845 _edje_text_class_hash = NULL;
4849 _edje_fetch(const Evas_Object *obj)
4853 if (!evas_object_smart_type_check(obj, "edje"))
4855 ed = evas_object_smart_data_get(obj);
4856 if ((ed) && (ed->delete_me)) return NULL;
4861 _edje_freeze(Edje *ed)
4864 // printf("FREEZE %i\n", ed->freeze);
4869 _edje_thaw(Edje *ed)
4874 // printf("-------------########### OVER THAW\n");
4877 if ((ed->freeze == 0) && (ed->recalc))
4879 // printf("thaw recalc\n");
4886 _edje_block(Edje *ed)
4894 _edje_unblock(Edje *ed)
4898 if (!ed) return ret;
4901 if (ed->block == 0) ed->block_break = 0;
4908 _edje_block_break(Edje *ed)
4910 if (ed->block_break) return 1;
4915 _edje_block_violate(Edje *ed)
4917 if (ed->block > 0) ed->block_break = 1;
4921 _edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
4924 Edje_User_Defined *eud;
4929 EINA_LIST_FOREACH(rp->edje->user_defined, l, eud)
4930 if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj)
4932 _edje_user_definition_free(eud);
4940 _edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
4944 type = evas_object_type_get(rp->swallowed_object);
4946 rp->swallow_params.min.w = 0;
4947 rp->swallow_params.min.h = 0;
4948 rp->swallow_params.max.w = -1;
4949 rp->swallow_params.max.h = -1;
4950 if ((type) && (!strcmp(type, "edje")))
4955 edje_object_size_min_get(rp->swallowed_object, &w, &h);
4956 rp->swallow_params.min.w = w;
4957 rp->swallow_params.min.h = h;
4959 edje_object_size_max_get(rp->swallowed_object, &w, &h);
4960 rp->swallow_params.max.w = w;
4961 rp->swallow_params.max.h = h;
4963 else if ((type) && ((!strcmp(type, "text")) || (!strcmp(type, "polygon")) ||
4964 (!strcmp(type, "line"))))
4968 evas_object_geometry_get(rp->swallowed_object, NULL, NULL, &w, &h);
4970 rp->swallow_params.min.w = w;
4971 rp->swallow_params.min.h = h;
4973 rp->swallow_params.max.w = w;
4974 rp->swallow_params.max.h = h;
4977 Evas_Coord w1, h1, w2, h2, aw, ah;
4978 Evas_Aspect_Control am;
4980 evas_object_size_hint_min_get(rp->swallowed_object, &w1, &h1);
4981 evas_object_size_hint_max_get(rp->swallowed_object, &w2, &h2);
4982 evas_object_size_hint_aspect_get(rp->swallowed_object, &am, &aw, &ah);
4983 rp->swallow_params.min.w = w1;
4984 rp->swallow_params.min.h = h1;
4985 if (w2 > 0) rp->swallow_params.max.w = w2;
4986 if (h2 > 0) rp->swallow_params.max.h = h2;
4989 case EVAS_ASPECT_CONTROL_NONE:
4990 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE;
4992 case EVAS_ASPECT_CONTROL_NEITHER:
4993 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER;
4995 case EVAS_ASPECT_CONTROL_HORIZONTAL:
4996 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL;
4998 case EVAS_ASPECT_CONTROL_VERTICAL:
4999 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
5001 case EVAS_ASPECT_CONTROL_BOTH:
5002 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH;
5007 rp->swallow_params.aspect.w = aw;
5008 rp->swallow_params.aspect.h = ah;
5009 evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp);
5012 #ifdef EDJE_CALC_CACHE
5018 _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
5023 _edje_real_part_swallow_hints_update(rp);
5024 rp->edje->dirty = 1;
5025 rp->edje->recalc_call = 1;
5026 _edje_recalc(rp->edje);
5031 _edje_real_part_swallow(Edje_Real_Part *rp,
5032 Evas_Object *obj_swallow,
5033 Eina_Bool hints_update)
5035 if (rp->swallowed_object)
5037 if (rp->swallowed_object != obj_swallow)
5039 edje_object_part_unswallow(rp->edje->obj, rp->swallowed_object);
5044 _edje_real_part_swallow_hints_update(rp);
5045 rp->edje->dirty = 1;
5046 rp->edje->recalc_call = 1;
5047 rp->edje->recalc_hints = 1;
5048 _edje_recalc(rp->edje);
5052 #ifdef EDJE_CALC_CACHE
5055 if (!obj_swallow) return;
5056 rp->swallowed_object = obj_swallow;
5057 evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
5059 evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
5060 else evas_object_clip_set(rp->swallowed_object, rp->edje->base.clipper);
5061 evas_object_stack_above(rp->swallowed_object, rp->object);
5062 evas_object_event_callback_add(rp->swallowed_object,
5064 _edje_object_part_swallow_free_cb,
5066 evas_object_event_callback_add(rp->swallowed_object,
5067 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5068 _edje_object_part_swallow_changed_hints_cb,
5072 _edje_real_part_swallow_hints_update(rp);
5074 if (rp->part->mouse_events)
5076 _edje_callbacks_add(obj_swallow, rp->edje, rp);
5077 if (rp->part->repeat_events)
5078 evas_object_repeat_events_set(obj_swallow, 1);
5079 if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB)
5080 evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode);
5081 evas_object_pass_events_set(obj_swallow, 0);
5084 evas_object_pass_events_set(obj_swallow, 1);
5085 _edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp);
5087 if (rp->part->precise_is_inside)
5088 evas_object_precise_is_inside_set(obj_swallow, 1);
5090 rp->edje->dirty = 1;
5091 rp->edje->recalc_call = 1;
5092 rp->edje->recalc_hints = 1;
5093 _edje_recalc(rp->edje);
5097 _edje_real_part_swallow_clear(Edje_Real_Part *rp)
5099 evas_object_smart_member_del(rp->swallowed_object);
5100 evas_object_event_callback_del_full(rp->swallowed_object,
5102 _edje_object_part_swallow_free_cb,
5104 evas_object_event_callback_del_full(rp->swallowed_object,
5105 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
5106 _edje_object_part_swallow_changed_hints_cb,
5108 evas_object_clip_unset(rp->swallowed_object);
5109 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
5110 if (rp->part->mouse_events)
5111 _edje_callbacks_del(rp->swallowed_object, rp->edje);
5112 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
5113 rp->swallowed_object = NULL;
5117 _edje_object_preload(Edje *ed)
5119 ed->preload_count--;
5120 if (!ed->preload_count)
5121 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
5125 _edje_object_image_preload_cb(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5129 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
5130 _edje_object_preload(ed);
5134 _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const char *emission, __UNUSED__ const char *source)
5138 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
5139 _edje_object_preload(ed);
5148 _edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
5150 Edje_Program ***array;
5151 unsigned int *count;
5154 if (!p->signal && !p->source)
5156 array = &edc->programs.nocmp;
5157 count = &edc->programs.nocmp_count;
5159 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5160 && p->source && !strpbrk(p->source, "*?[\\"))
5162 array = &edc->programs.strcmp;
5163 count = &edc->programs.strcmp_count;
5165 else if (p->signal && edje_program_is_strncmp(p->signal)
5166 && p->source && edje_program_is_strncmp(p->source))
5168 array = &edc->programs.strncmp;
5169 count = &edc->programs.strncmp_count;
5171 else if (p->signal && edje_program_is_strrncmp(p->signal)
5172 && p->source && edje_program_is_strrncmp(p->source))
5174 array = &edc->programs.strrncmp;
5175 count = &edc->programs.strrncmp_count;
5179 array = &edc->programs.fnmatch;
5180 count = &edc->programs.fnmatch_count;
5183 for (i = 0; i < *count; ++i)
5184 if ((*array)[i] == p)
5186 memmove(*array + i, *array + i + 1, sizeof (Edje_Program *) * (*count - i -1));
5198 _edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
5200 Edje_Program ***array;
5201 unsigned int *count;
5203 if (!p->signal && !p->source)
5205 array = &edc->programs.nocmp;
5206 count = &edc->programs.nocmp_count;
5208 else if (p->signal && !strpbrk(p->signal, "*?[\\")
5209 && p->source && !strpbrk(p->source, "*?[\\"))
5211 array = &edc->programs.strcmp;
5212 count = &edc->programs.strcmp_count;
5214 else if (p->signal && edje_program_is_strncmp(p->signal)
5215 && p->source && edje_program_is_strncmp(p->source))
5217 array = &edc->programs.strncmp;
5218 count = &edc->programs.strncmp_count;
5220 else if (p->signal && edje_program_is_strrncmp(p->signal)
5221 && p->source && edje_program_is_strrncmp(p->source))
5223 array = &edc->programs.strrncmp;
5224 count = &edc->programs.strrncmp_count;
5228 array = &edc->programs.fnmatch;
5229 count = &edc->programs.fnmatch_count;
5232 *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));
5233 (*array)[(*count)++] = p;
5237 edje_string_get(const Edje_String *es)
5239 /* FIXME: Handle localization here */
5240 if (!es) return NULL;
5245 edje_string_id_get(const Edje_String *es)
5247 /* FIXME: Handle localization here */
5248 if (!es) return NULL;
5253 _cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
5256 _edje_subobj_unregister(ed, obj);
5260 _edje_subobj_register(Edje *ed, Evas_Object *ob)
5262 ed->subobjs = eina_list_append(ed->subobjs, ob);
5263 evas_object_event_callback_add(ob, EVAS_CALLBACK_DEL,
5264 _cb_subobj_del, ed);
5268 _edje_subobj_unregister(Edje *ed, Evas_Object *obj)
5270 ed->subobjs = eina_list_remove(ed->subobjs, obj);
5271 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
5272 _cb_subobj_del, ed);
5275 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/