elementary/map - map supports language,changed
[framework/uifw/elementary.git] / src / lib / elm_box.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3 #include "els_box.h"
4 #include "elm_widget_box.h"
5
6 EAPI const char ELM_BOX_SMART_NAME[] = "elm_box";
7
8 EVAS_SMART_SUBCLASS_NEW
9   (ELM_BOX_SMART_NAME, _elm_box, Elm_Box_Smart_Class,
10   Elm_Widget_Smart_Class, elm_widget_smart_class_get, NULL);
11
12 static const char SIG_CHILD_ADDED[] = "child,added";
13 static const char SIG_CHILD_REMOVED[] = "child,removed";
14 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
15    {SIG_CHILD_ADDED, ""},
16    {SIG_CHILD_REMOVED, ""},
17    {NULL, NULL}
18 };
19
20 static void *
21 _elm_box_list_data_get(const Eina_List *list)
22 {
23    Evas_Object_Box_Option *opt = eina_list_data_get(list);
24    return opt->obj;
25 }
26
27 static void
28 _child_added_cb_proxy(void *data,
29                       Evas_Object *o __UNUSED__,
30                       void *event_info)
31 {
32    Evas_Object *box = data;
33    Evas_Object_Box_Option *opt = event_info;
34    evas_object_smart_callback_call(box, SIG_CHILD_ADDED, opt->obj);
35 }
36
37 static void
38 _child_removed_cb_proxy(void *data,
39                         Evas_Object *o __UNUSED__,
40                         void *event_info)
41 {
42    Evas_Object *box = data;
43    Evas_Object *child = event_info;
44    evas_object_smart_callback_call(box, SIG_CHILD_REMOVED, child);
45 }
46
47 static Eina_Bool
48 _elm_box_smart_focus_next(const Evas_Object *obj,
49                           Elm_Focus_Direction dir,
50                           Evas_Object **next)
51 {
52    const Eina_List *items;
53    void *(*list_data_get)(const Eina_List *list);
54
55    ELM_BOX_DATA_GET(obj, sd);
56
57    /* Focus chain */
58    /* TODO: Change this to use other chain */
59    if ((items = elm_widget_focus_custom_chain_get(obj)))
60      list_data_get = eina_list_data_get;
61    else
62      {
63         Evas_Object_Box_Data *bd =
64           evas_object_smart_data_get(ELM_WIDGET_DATA(sd)->resize_obj);
65
66         items = bd->children;
67         list_data_get = _elm_box_list_data_get;
68
69         if (!items) return EINA_FALSE;
70      }
71
72    return elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
73 }
74
75 static Eina_Bool
76 _elm_box_smart_focus_direction(const Evas_Object *obj,
77                                const Evas_Object *base,
78                                double degree,
79                                Evas_Object **direction,
80                                double *weight)
81 {
82    const Eina_List *items;
83    void *(*list_data_get)(const Eina_List *list);
84
85    ELM_BOX_DATA_GET(obj, sd);
86
87    if ((items = elm_widget_focus_custom_chain_get(obj)))
88      list_data_get = eina_list_data_get;
89    else
90      {
91         Evas_Object_Box_Data *bd =
92           evas_object_smart_data_get(ELM_WIDGET_DATA(sd)->resize_obj);
93
94         items = bd->children;
95         list_data_get = _elm_box_list_data_get;
96
97         if (!items) return EINA_FALSE;
98      }
99    return elm_widget_focus_list_direction_get
100             (obj, base, items, list_data_get, degree, direction, weight);
101 }
102
103 static Eina_Bool
104 _elm_box_smart_theme(Evas_Object *obj)
105 {
106    ELM_BOX_DATA_GET(obj, sd);
107
108    if (!_elm_box_parent_sc->theme(obj)) return EINA_FALSE;
109
110    evas_object_smart_calculate(ELM_WIDGET_DATA(sd)->resize_obj);
111
112    return EINA_TRUE;
113 }
114
115 static void
116 _sizing_eval(Evas_Object *obj)
117 {
118    Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
119    Evas_Coord w, h;
120
121    ELM_BOX_DATA_GET(obj, sd);
122
123    if (sd->on_deletion)
124      return;
125
126    evas_object_size_hint_min_get
127      (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
128    evas_object_size_hint_max_get
129      (ELM_WIDGET_DATA(sd)->resize_obj, &maxw, &maxh);
130    evas_object_size_hint_min_set(obj, minw, minh);
131    evas_object_size_hint_max_set(obj, maxw, maxh);
132
133    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
134    if (w < minw) w = minw;
135    if (h < minh) h = minh;
136    if ((maxw >= 0) && (w > maxw)) w = maxw;
137    if ((maxh >= 0) && (h > maxh)) h = maxh;
138    evas_object_resize(obj, w, h);
139 }
140
141 static void
142 _on_size_hints_changed(void *data,
143                        Evas *e __UNUSED__,
144                        Evas_Object *obj __UNUSED__,
145                        void *event_info __UNUSED__)
146 {
147    _sizing_eval(data);
148 }
149
150 static Eina_Bool
151 _elm_box_smart_sub_object_del(Evas_Object *obj,
152                               Evas_Object *child)
153 {
154    if (!_elm_box_parent_sc->sub_object_del(obj, child)) return EINA_FALSE;
155
156    _sizing_eval(obj);
157
158    return EINA_TRUE;
159 }
160
161 static void
162 _elm_box_custom_layout(Evas_Object *o,
163                        Evas_Object_Box_Data *priv,
164                        void *data)
165 {
166    ELM_BOX_DATA_GET(data, sd);
167
168    _els_box_layout(o, priv, sd->horizontal, sd->homogeneous,
169                    elm_widget_mirrored_get(data));
170 }
171
172 static Eina_Bool
173 _transition_animation(void *data)
174 {
175    evas_object_smart_changed(data);
176
177    return ECORE_CALLBACK_RENEW;
178 }
179
180 static void
181 _transition_layout_child_added(void *data,
182                                Evas_Object *obj __UNUSED__,
183                                void *event_info)
184 {
185    Transition_Animation_Data *tad;
186    Evas_Object_Box_Option *opt = event_info;
187    Elm_Box_Transition *layout_data = data;
188
189    tad = calloc(1, sizeof(Transition_Animation_Data));
190    if (!tad) return;
191
192    tad->obj = opt->obj;
193    layout_data->objs = eina_list_append(layout_data->objs, tad);
194    layout_data->recalculate = EINA_TRUE;
195 }
196
197 static void
198 _transition_layout_child_removed(void *data,
199                                  Evas_Object *obj __UNUSED__,
200                                  void *event_info)
201 {
202    Eina_List *l;
203    Transition_Animation_Data *tad;
204    Elm_Box_Transition *layout_data = data;
205
206    EINA_LIST_FOREACH(layout_data->objs, l, tad)
207      {
208         if (tad->obj == event_info)
209           {
210              free(eina_list_data_get(l));
211              layout_data->objs = eina_list_remove_list(layout_data->objs, l);
212              layout_data->recalculate = EINA_TRUE;
213              break;
214           }
215      }
216 }
217
218 static void
219 _transition_layout_obj_resize_cb(void *data,
220                                  Evas *e __UNUSED__,
221                                  Evas_Object *obj __UNUSED__,
222                                  void *event_info __UNUSED__)
223 {
224    Elm_Box_Transition *layout_data = data;
225
226    layout_data->recalculate = EINA_TRUE;
227 }
228
229 static void
230 _transition_layout_calculate_coords(Evas_Object *obj,
231                                     Evas_Object_Box_Data *priv,
232                                     Elm_Box_Transition *layout_data)
233 {
234    Eina_List *l;
235    Evas_Coord x, y, w, h;
236    Transition_Animation_Data *tad;
237    const double curtime = ecore_loop_time_get();
238
239    layout_data->duration =
240      layout_data->duration - (curtime - layout_data->initial_time);
241    layout_data->initial_time = curtime;
242
243    evas_object_geometry_get(obj, &x, &y, &w, &h);
244    EINA_LIST_FOREACH(layout_data->objs, l, tad)
245      {
246         evas_object_geometry_get(tad->obj, &tad->start.x, &tad->start.y,
247                                  &tad->start.w, &tad->start.h);
248         tad->start.x = tad->start.x - x;
249         tad->start.y = tad->start.y - y;
250      }
251    layout_data->end.layout(obj, priv, layout_data->end.data);
252    EINA_LIST_FOREACH(layout_data->objs, l, tad)
253      {
254         evas_object_geometry_get(tad->obj, &tad->end.x, &tad->end.y,
255                                  &tad->end.w, &tad->end.h);
256         tad->end.x = tad->end.x - x;
257         tad->end.y = tad->end.y - y;
258      }
259 }
260
261 static Eina_Bool
262 _transition_layout_load_children_list(Evas_Object_Box_Data *priv,
263                                       Elm_Box_Transition *layout_data)
264 {
265    Eina_List *l;
266    Evas_Object_Box_Option *opt;
267    Transition_Animation_Data *tad;
268
269    EINA_LIST_FREE (layout_data->objs, tad)
270      free(tad);
271
272    EINA_LIST_FOREACH(priv->children, l, opt)
273      {
274         tad = calloc(1, sizeof(Transition_Animation_Data));
275         if (!tad)
276           {
277              EINA_LIST_FREE (layout_data->objs, tad)
278                free(tad);
279              layout_data->objs = NULL;
280              return EINA_FALSE;
281           }
282         tad->obj = opt->obj;
283         layout_data->objs = eina_list_append(layout_data->objs, tad);
284      }
285    return EINA_TRUE;
286 }
287
288 static Eina_Bool
289 _transition_layout_animation_start(Evas_Object *obj,
290                                    Evas_Object_Box_Data *priv,
291                                    Elm_Box_Transition *layout_data,
292                                    Eina_Bool (*transition_animation_cb)
293                                    (void *data))
294 {
295    layout_data->start.layout(obj, priv, layout_data->start.data);
296    layout_data->box = obj;
297    layout_data->initial_time = ecore_loop_time_get();
298
299    if (!_transition_layout_load_children_list(priv, layout_data))
300      return EINA_FALSE;
301
302    _transition_layout_calculate_coords(obj, priv, layout_data);
303
304    evas_object_event_callback_add
305      (obj, EVAS_CALLBACK_RESIZE, _transition_layout_obj_resize_cb,
306      layout_data);
307    evas_object_smart_callback_add
308      (obj, SIG_CHILD_ADDED, _transition_layout_child_added, layout_data);
309    evas_object_smart_callback_add
310      (obj, SIG_CHILD_REMOVED, _transition_layout_child_removed, layout_data);
311
312    if (!layout_data->animator)
313      layout_data->animator = ecore_animator_add(transition_animation_cb, obj);
314
315    layout_data->animation_ended = EINA_FALSE;
316
317    return EINA_TRUE;
318 }
319
320 static void
321 _transition_layout_animation_stop(Elm_Box_Transition *layout_data)
322 {
323    layout_data->animation_ended = EINA_TRUE;
324
325    if (layout_data->animator)
326      {
327         ecore_animator_del(layout_data->animator);
328         layout_data->animator = NULL;
329      }
330
331    if (layout_data->transition_end_cb)
332      layout_data->transition_end_cb(layout_data->transition_end_data);
333 }
334
335 static void
336 _transition_layout_animation_exec(Evas_Object *obj,
337                                   Evas_Object_Box_Data *priv __UNUSED__,
338                                   Elm_Box_Transition *layout_data,
339                                   const double curtime)
340 {
341    Eina_List *l;
342    double progress = 0.0;
343    Evas_Coord x, y, w, h;
344    Transition_Animation_Data *tad;
345    Evas_Coord cur_x, cur_y, cur_w, cur_h;
346
347    progress = (curtime - layout_data->initial_time) / layout_data->duration;
348    evas_object_geometry_get(obj, &x, &y, &w, &h);
349
350    EINA_LIST_FOREACH(layout_data->objs, l, tad)
351      {
352         cur_x = x + tad->start.x + ((tad->end.x - tad->start.x) * progress);
353         cur_y = y + tad->start.y + ((tad->end.y - tad->start.y) * progress);
354         cur_w = tad->start.w + ((tad->end.w - tad->start.w) * progress);
355         cur_h = tad->start.h + ((tad->end.h - tad->start.h) * progress);
356         evas_object_move(tad->obj, cur_x, cur_y);
357         evas_object_resize(tad->obj, cur_w, cur_h);
358      }
359 }
360
361 static void
362 _elm_box_smart_add(Evas_Object *obj)
363 {
364    EVAS_SMART_DATA_ALLOC(obj, Elm_Box_Smart_Data);
365
366    ELM_WIDGET_DATA(priv)->resize_obj =
367      evas_object_box_add(evas_object_evas_get(obj));
368    evas_object_box_layout_set
369      (ELM_WIDGET_DATA(priv)->resize_obj, _elm_box_custom_layout, obj, NULL);
370
371    evas_object_event_callback_add
372      (ELM_WIDGET_DATA(priv)->resize_obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
373      _on_size_hints_changed, obj);
374
375    _elm_box_parent_sc->base.add(obj);
376
377    evas_object_smart_callback_add
378      (ELM_WIDGET_DATA(priv)->resize_obj, SIG_CHILD_ADDED,
379      _child_added_cb_proxy, obj);
380    evas_object_smart_callback_add
381      (ELM_WIDGET_DATA(priv)->resize_obj, SIG_CHILD_REMOVED,
382      _child_removed_cb_proxy, obj);
383
384    elm_widget_can_focus_set(obj, EINA_FALSE);
385    elm_widget_highlight_ignore_set(obj, EINA_TRUE);
386 }
387
388 static void
389 _elm_box_smart_del(Evas_Object *obj)
390 {
391    Eina_List *l;
392    Evas_Object *child;
393
394    ELM_BOX_DATA_GET(obj, sd);
395
396    sd->on_deletion = EINA_TRUE;
397
398    evas_object_event_callback_del_full
399      (ELM_WIDGET_DATA(sd)->resize_obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
400      _on_size_hints_changed, obj);
401
402    /* let's make our box object the *last* to be processed, since it
403     * may (smart) parent other sub objects here */
404    EINA_LIST_FOREACH(ELM_WIDGET_DATA(sd)->subobjs, l, child)
405      {
406         if (child == ELM_WIDGET_DATA(sd)->resize_obj)
407           {
408              ELM_WIDGET_DATA(sd)->subobjs =
409                eina_list_demote_list(ELM_WIDGET_DATA(sd)->subobjs, l);
410              break;
411           }
412      }
413
414    _elm_box_parent_sc->base.del(obj);
415 }
416
417 static void
418 _elm_box_smart_set_user(Elm_Box_Smart_Class *sc)
419 {
420    ELM_WIDGET_CLASS(sc)->base.add = _elm_box_smart_add;
421    ELM_WIDGET_CLASS(sc)->base.del = _elm_box_smart_del;
422
423    ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_box_smart_sub_object_del;
424    ELM_WIDGET_CLASS(sc)->theme = _elm_box_smart_theme;
425    ELM_WIDGET_CLASS(sc)->focus_next = _elm_box_smart_focus_next;
426    ELM_WIDGET_CLASS(sc)->focus_direction = _elm_box_smart_focus_direction;
427 }
428
429 EAPI const Elm_Box_Smart_Class *
430 elm_box_smart_class_get(void)
431 {
432    static Elm_Box_Smart_Class _sc =
433      ELM_BOX_SMART_CLASS_INIT_NAME_VERSION(ELM_BOX_SMART_NAME);
434    static const Elm_Box_Smart_Class *class = NULL;
435    Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
436
437    if (class) return class;
438
439    _elm_box_smart_set(&_sc);
440    esc->callbacks = _smart_callbacks;
441    class = &_sc;
442
443    return class;
444 }
445
446 EAPI Evas_Object *
447 elm_box_add(Evas_Object *parent)
448 {
449    Evas_Object *obj;
450
451    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
452
453    obj = elm_widget_add(_elm_box_smart_class_new(), parent);
454    if (!obj) return NULL;
455
456    if (!elm_widget_sub_object_add(parent, obj))
457      ERR("could not add %p as sub object of %p", obj, parent);
458
459    return obj;
460 }
461
462 EAPI void
463 elm_box_horizontal_set(Evas_Object *obj,
464                        Eina_Bool horizontal)
465 {
466    ELM_BOX_CHECK(obj);
467    ELM_BOX_DATA_GET(obj, sd);
468
469    sd->horizontal = !!horizontal;
470    evas_object_smart_calculate(ELM_WIDGET_DATA(sd)->resize_obj);
471 }
472
473 EAPI Eina_Bool
474 elm_box_horizontal_get(const Evas_Object *obj)
475 {
476    ELM_BOX_CHECK(obj) EINA_FALSE;
477    ELM_BOX_DATA_GET(obj, sd);
478
479    return sd->horizontal;
480 }
481
482 EAPI void
483 elm_box_homogeneous_set(Evas_Object *obj,
484                         Eina_Bool homogeneous)
485 {
486    ELM_BOX_CHECK(obj);
487    ELM_BOX_DATA_GET(obj, sd);
488
489    sd->homogeneous = !!homogeneous;
490    evas_object_smart_calculate(ELM_WIDGET_DATA(sd)->resize_obj);
491 }
492
493 EAPI Eina_Bool
494 elm_box_homogeneous_get(const Evas_Object *obj)
495 {
496    ELM_BOX_CHECK(obj) EINA_FALSE;
497    ELM_BOX_DATA_GET(obj, sd);
498
499    return sd->homogeneous;
500 }
501
502 EAPI void
503 elm_box_pack_start(Evas_Object *obj,
504                    Evas_Object *subobj)
505 {
506    ELM_BOX_CHECK(obj);
507    ELM_BOX_DATA_GET(obj, sd);
508
509    elm_widget_sub_object_add(obj, subobj);
510    evas_object_box_prepend(ELM_WIDGET_DATA(sd)->resize_obj, subobj);
511 }
512
513 EAPI void
514 elm_box_pack_end(Evas_Object *obj,
515                  Evas_Object *subobj)
516 {
517    ELM_BOX_CHECK(obj);
518    ELM_BOX_DATA_GET(obj, sd);
519
520    elm_widget_sub_object_add(obj, subobj);
521    evas_object_box_append(ELM_WIDGET_DATA(sd)->resize_obj, subobj);
522 }
523
524 EAPI void
525 elm_box_pack_before(Evas_Object *obj,
526                     Evas_Object *subobj,
527                     Evas_Object *before)
528 {
529    ELM_BOX_CHECK(obj);
530    ELM_BOX_DATA_GET(obj, sd);
531
532    elm_widget_sub_object_add(obj, subobj);
533    evas_object_box_insert_before
534      (ELM_WIDGET_DATA(sd)->resize_obj, subobj, before);
535 }
536
537 EAPI void
538 elm_box_pack_after(Evas_Object *obj,
539                    Evas_Object *subobj,
540                    Evas_Object *after)
541 {
542    ELM_BOX_CHECK(obj);
543    ELM_BOX_DATA_GET(obj, sd);
544
545    elm_widget_sub_object_add(obj, subobj);
546    evas_object_box_insert_after
547      (ELM_WIDGET_DATA(sd)->resize_obj, subobj, after);
548 }
549
550 EAPI void
551 elm_box_clear(Evas_Object *obj)
552 {
553    ELM_BOX_CHECK(obj);
554    ELM_BOX_DATA_GET(obj, sd);
555
556    /* EINA_TRUE means to delete objects as well */
557    evas_object_box_remove_all(ELM_WIDGET_DATA(sd)->resize_obj, EINA_TRUE);
558 }
559
560 EAPI void
561 elm_box_unpack(Evas_Object *obj,
562                Evas_Object *subobj)
563 {
564    ELM_BOX_CHECK(obj);
565    ELM_BOX_DATA_GET(obj, sd);
566
567    if (evas_object_box_remove(ELM_WIDGET_DATA(sd)->resize_obj, subobj))
568      elm_widget_sub_object_del(obj, subobj);
569 }
570
571 EAPI void
572 elm_box_unpack_all(Evas_Object *obj)
573 {
574    Evas_Object_Box_Data *bd;
575    Evas_Object_Box_Option *opt;
576    Eina_List *l;
577
578    ELM_BOX_CHECK(obj);
579    ELM_BOX_DATA_GET(obj, sd);
580
581    bd = evas_object_smart_data_get(ELM_WIDGET_DATA(sd)->resize_obj);
582    EINA_LIST_FOREACH(bd->children, l, opt)
583      elm_widget_sub_object_del(obj, opt->obj);
584
585    /* EINA_FALSE means to delete objects as well */
586    evas_object_box_remove_all(ELM_WIDGET_DATA(sd)->resize_obj, EINA_FALSE);
587 }
588
589 EAPI void
590 elm_box_layout_set(Evas_Object *obj,
591                    Evas_Object_Box_Layout cb,
592                    const void *data,
593                    Ecore_Cb free_data)
594 {
595    ELM_BOX_CHECK(obj);
596    ELM_BOX_DATA_GET(obj, sd);
597
598    if (cb)
599      evas_object_box_layout_set
600        (ELM_WIDGET_DATA(sd)->resize_obj, cb, data, free_data);
601    else
602      evas_object_box_layout_set
603        (ELM_WIDGET_DATA(sd)->resize_obj, _elm_box_custom_layout, obj, NULL);
604 }
605
606 EAPI void
607 elm_box_layout_transition(Evas_Object *obj,
608                           Evas_Object_Box_Data *priv,
609                           void *data)
610 {
611    Elm_Box_Transition *box_data = data;
612    const double curtime = ecore_loop_time_get();
613
614    if (box_data->animation_ended)
615      {
616         box_data->end.layout(obj, priv, box_data->end.data);
617         return;
618      }
619
620    if (!box_data->animator)
621      {
622         if (!_transition_layout_animation_start(obj, priv, box_data,
623                                                 _transition_animation))
624           return;
625      }
626    else
627      {
628         if (box_data->recalculate)
629           {
630              _transition_layout_calculate_coords(obj, priv, box_data);
631              box_data->recalculate = EINA_FALSE;
632           }
633      }
634
635    if ((curtime >= box_data->duration + box_data->initial_time))
636      _transition_layout_animation_stop(box_data);
637    else
638      _transition_layout_animation_exec(obj, priv, box_data, curtime);
639 }
640
641 EAPI Elm_Box_Transition *
642 elm_box_transition_new(const double duration,
643                        Evas_Object_Box_Layout start_layout,
644                        void *start_layout_data,
645                        Ecore_Cb start_layout_free_data,
646                        Evas_Object_Box_Layout end_layout,
647                        void *end_layout_data,
648                        Ecore_Cb end_layout_free_data,
649                        Ecore_Cb transition_end_cb,
650                        void *transition_end_data)
651 {
652    Elm_Box_Transition *box_data;
653
654    EINA_SAFETY_ON_NULL_RETURN_VAL(start_layout, NULL);
655    EINA_SAFETY_ON_NULL_RETURN_VAL(end_layout, NULL);
656
657    box_data = calloc(1, sizeof(Elm_Box_Transition));
658    if (!box_data) return NULL;
659
660    box_data->start.layout = start_layout;
661    box_data->start.data = start_layout_data;
662    box_data->start.free_data = start_layout_free_data;
663    box_data->end.layout = end_layout;
664    box_data->end.data = end_layout_data;
665    box_data->end.free_data = end_layout_free_data;
666    box_data->duration = duration;
667    box_data->transition_end_cb = transition_end_cb;
668    box_data->transition_end_data = transition_end_data;
669
670    return box_data;
671 }
672
673 EAPI void
674 elm_box_transition_free(void *data)
675 {
676    EINA_SAFETY_ON_NULL_RETURN(data);
677
678    Transition_Animation_Data *tad;
679    Elm_Box_Transition *box_data = data;
680    if ((box_data->start.free_data) && (box_data->start.data))
681      box_data->start.free_data(box_data->start.data);
682    if ((box_data->end.free_data) && (box_data->end.data))
683      box_data->end.free_data(box_data->end.data);
684    EINA_LIST_FREE (box_data->objs, tad)
685      free(tad);
686
687    evas_object_event_callback_del
688      (box_data->box, EVAS_CALLBACK_RESIZE, _transition_layout_obj_resize_cb);
689    evas_object_smart_callback_del
690      (box_data->box, SIG_CHILD_ADDED, _transition_layout_child_added);
691    evas_object_smart_callback_del
692      (box_data->box, SIG_CHILD_REMOVED, _transition_layout_child_removed);
693    if (box_data->animator)
694      {
695         ecore_animator_del(box_data->animator);
696         box_data->animator = NULL;
697      }
698
699    free(data);
700 }
701
702 EAPI Eina_List *
703 elm_box_children_get(const Evas_Object *obj)
704 {
705    ELM_BOX_CHECK(obj) NULL;
706    ELM_BOX_DATA_GET(obj, sd);
707
708    return evas_object_box_children_get(ELM_WIDGET_DATA(sd)->resize_obj);
709 }
710
711 EAPI void
712 elm_box_padding_set(Evas_Object *obj,
713                     Evas_Coord horizontal,
714                     Evas_Coord vertical)
715 {
716    ELM_BOX_CHECK(obj);
717    ELM_BOX_DATA_GET(obj, sd);
718
719    evas_object_box_padding_set
720      (ELM_WIDGET_DATA(sd)->resize_obj, horizontal, vertical);
721 }
722
723 EAPI void
724 elm_box_padding_get(const Evas_Object *obj,
725                     Evas_Coord *horizontal,
726                     Evas_Coord *vertical)
727 {
728    ELM_BOX_CHECK(obj);
729    ELM_BOX_DATA_GET(obj, sd);
730
731    evas_object_box_padding_get
732      (ELM_WIDGET_DATA(sd)->resize_obj, horizontal, vertical);
733 }
734
735 EAPI void
736 elm_box_align_set(Evas_Object *obj,
737                   double horizontal,
738                   double vertical)
739 {
740    ELM_BOX_CHECK(obj);
741    ELM_BOX_DATA_GET(obj, sd);
742
743    evas_object_size_hint_align_set
744      (ELM_WIDGET_DATA(sd)->resize_obj, horizontal, vertical);
745 }
746
747 EAPI void
748 elm_box_align_get(const Evas_Object *obj,
749                   double *horizontal,
750                   double *vertical)
751 {
752    ELM_BOX_CHECK(obj);
753    ELM_BOX_DATA_GET(obj, sd);
754
755    evas_object_size_hint_align_get
756      (ELM_WIDGET_DATA(sd)->resize_obj, horizontal, vertical);
757 }
758
759 EAPI void
760 elm_box_recalculate(Evas_Object *obj)
761 {
762    ELM_BOX_CHECK(obj);
763    ELM_BOX_DATA_GET(obj, sd);
764
765    if (sd->recalc) return;
766
767    evas_object_smart_need_recalculate_set
768      (ELM_WIDGET_DATA(sd)->resize_obj, EINA_TRUE);
769    sd->recalc++;
770    evas_object_smart_calculate(ELM_WIDGET_DATA(sd)->resize_obj);
771    sd->recalc--;
772 }