Fix typos in documentation #7
[framework/uifw/elementary.git] / src / lib / elm_layout.h
1 /**
2  * @defgroup Layout Layout
3  *
4  * @image html img/widget/layout/preview-00.png
5  * @image latex img/widget/layout/preview-00.eps width=\textwidth
6  *
7  * @image html img/layout-predefined.png
8  * @image latex img/layout-predefined.eps width=\textwidth
9  *
10  * This is a container widget that takes a standard Edje design file and
11  * wraps it very thinly in a widget.
12  *
13  * An Edje design (theme) file has a very wide range of possibilities to
14  * describe the behavior of elements added to the Layout. Check out the Edje
15  * documentation and the EDC reference to get more information about what can
16  * be done with Edje.
17  *
18  * Just like @ref List, @ref Box, and other container widgets, any
19  * object added to the Layout will become its child, meaning that it will be
20  * deleted if the Layout is deleted, move if the Layout is moved, and so on.
21  *
22  * The Layout widget can contain as many Contents, Boxes or Tables as
23  * described in its theme file. For instance, objects can be added to
24  * different Tables by specifying the respective Table part names. The same
25  * is valid for Content and Box.
26  *
27  * The objects added as child of the Layout will behave as described in the
28  * part description where they were added. There are 3 possible types of
29  * parts where a child can be added:
30  *
31  * @section secContent Content (SWALLOW part)
32  *
33  * Only one object can be added to the @c SWALLOW part (but you still can
34  * have many @c SWALLOW parts and one object on each of them). Use the @c
35  * elm_object_content_set/get/unset functions to set, retrieve and unset
36  * objects as content of the @c SWALLOW. After being set to this part, the
37  * object size, position, visibility, clipping and other description
38  * properties will be totally controlled by the description of the given part
39  * (inside the Edje theme file).
40  *
41  * One can use @c evas_object_size_hint_* functions on the child to have some
42  * kind of control over its behavior, but the resulting behavior will still
43  * depend heavily on the @c SWALLOW part description.
44  *
45  * The Edje theme also can change the part description, based on signals or
46  * scripts running inside the theme. This change can also be animated. All of
47  * this will affect the child object set as content accordingly. The object
48  * size will be changed if the part size is changed, it will animate move if
49  * the part is moving, and so on.
50  *
51  * The following picture demonstrates a Layout widget with a child object
52  * added to its @c SWALLOW:
53  *
54  * @image html layout_swallow.png
55  * @image latex layout_swallow.eps width=\textwidth
56  *
57  * @section secBox Box (BOX part)
58  *
59  * An Edje @c BOX part is very similar to the Elementary @ref Box widget. It
60  * allows one to add objects to the box and have them distributed along its
61  * area, accordingly to the specified @a layout property (now by @a layout we
62  * mean the chosen layouting design of the Box, not the Layout widget
63  * itself).
64  *
65  * A similar effect for having a box with its position, size and other things
66  * controlled by the Layout theme would be to create an Elementary @ref Box
67  * widget and add it as a Content in the @c SWALLOW part.
68  *
69  * The main difference of using the Layout Box is that its behavior, the box
70  * properties like layouting format, padding, align, etc. will be all
71  * controlled by the theme. This means, for example, that a signal could be
72  * sent to the Layout theme (with elm_object_signal_emit()) and the theme
73  * handled the signal by changing the box padding, or align, or both. Using
74  * the Elementary @ref Box widget is not necessarily harder or easier, it
75  * just depends on the circumstances and requirements.
76  *
77  * The Layout Box can be used through the @c elm_layout_box_* set of
78  * functions.
79  *
80  * The following picture demonstrates a Layout widget with many child objects
81  * added to its @c BOX part:
82  *
83  * @image html layout_box.png
84  * @image latex layout_box.eps width=\textwidth
85  *
86  * @section secTable Table (TABLE part)
87  *
88  * Just like the @ref secBox, the Layout Table is very similar to the
89  * Elementary @ref Table widget. It allows one to add objects to the Table
90  * specifying the row and column where the object should be added, and any
91  * column or row span if necessary.
92  *
93  * Again, we could have this design by adding a @ref Table widget to the @c
94  * SWALLOW part using elm_object_part_content_set(). The same difference happens
95  * here when choosing to use the Layout Table (a @c TABLE part) instead of
96  * the @ref Table plus @c SWALLOW part. It's just a matter of convenience.
97  *
98  * The Layout Table can be used through the @c elm_layout_table_* set of
99  * functions.
100  *
101  * The following picture demonstrates a Layout widget with many child objects
102  * added to its @c TABLE part:
103  *
104  * @image html layout_table.png
105  * @image latex layout_table.eps width=\textwidth
106  *
107  * @section secPredef Predefined Layouts
108  *
109  * Another interesting thing about the Layout widget is that it offers some
110  * predefined themes that come with the default Elementary theme. These
111  * themes can be set by the call elm_layout_theme_set(), and provide some
112  * basic functionality depending on the theme used.
113  *
114  * Most of them already send some signals, some already provide a toolbar or
115  * back and next buttons.
116  *
117  * These are available predefined theme layouts. All of them have class = @c
118  * layout, group = @c application, and style = one of the following options:
119  *
120  * @li @c toolbar-content - application with toolbar and main content area
121  * @li @c toolbar-content-back - application with toolbar and main content
122  * area with a back button and title area
123  * @li @c toolbar-content-back-next - application with toolbar and main
124  * content area with a back and next buttons and title area
125  * @li @c content-back - application with a main content area with a back
126  * button and title area
127  * @li @c content-back-next - application with a main content area with a
128  * back and next buttons and title area
129  * @li @c toolbar-vbox - application with toolbar and main content area as a
130  * vertical box
131  * @li @c toolbar-table - application with toolbar and main content area as a
132  * table
133  *
134  * Supported elm_object common APIs.
135  * @li elm_object_signal_emit
136  * @li elm_object_signal_callback_add
137  * @li elm_object_signal_callback_del
138  * @li elm_object_part_text_set
139  * @li elm_object_part_text_get
140  * @li elm_object_part_content_set
141  * @li elm_object_part_content_get
142  * @li elm_object_part_content_unset
143  *
144  * @section secExamples Examples
145  *
146  * Some examples of the Layout widget can be found here:
147  * @li @ref layout_example_01
148  * @li @ref layout_example_02
149  * @li @ref layout_example_03
150  * @li @ref layout_example_edc
151  *
152  */
153
154 /**
155  * Add a new layout to the parent
156  *
157  * @param parent The parent object
158  * @return The new object or NULL if it cannot be created
159  *
160  * @see elm_layout_file_set()
161  * @see elm_layout_theme_set()
162  *
163  * @ingroup Layout
164  */
165 EAPI Evas_Object                 *elm_layout_add(Evas_Object *parent);
166
167 /**
168  * Set the file that will be used as layout
169  *
170  * @param obj The layout object
171  * @param file The path to file (edj) that will be used as layout
172  * @param group The group that the layout belongs in edje file
173  *
174  * @return (1 = success, 0 = error)
175  *
176  * @ingroup Layout
177  */
178 EAPI Eina_Bool                    elm_layout_file_set(Evas_Object *obj, const char *file, const char *group);
179
180 /**
181  * Set the edje group from the elementary theme that will be used as layout
182  *
183  * @param obj The layout object
184  * @param clas the class of the group
185  * @param group the group
186  * @param style the style to used
187  *
188  * @return (1 = success, 0 = error)
189  *
190  * @ingroup Layout
191  */
192 EAPI Eina_Bool                    elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, const char *style);
193
194 /**
195  * Append child to layout box part.
196  *
197  * @param obj the layout object
198  * @param part the box part to which the object will be appended.
199  * @param child the child object to append to box.
200  *
201  * Once the object is appended, it will become child of the layout. Its
202  * lifetime will be bound to the layout, whenever the layout dies the child
203  * will be deleted automatically. One should use elm_layout_box_remove() to
204  * make this layout forget about the object.
205  *
206  * @see elm_layout_box_prepend()
207  * @see elm_layout_box_insert_before()
208  * @see elm_layout_box_insert_at()
209  * @see elm_layout_box_remove()
210  *
211  * @ingroup Layout
212  */
213 EAPI void                         elm_layout_box_append(Evas_Object *obj, const char *part, Evas_Object *child);
214
215 /**
216  * Prepend child to layout box part.
217  *
218  * @param obj the layout object
219  * @param part the box part to prepend.
220  * @param child the child object to prepend to box.
221  *
222  * Once the object is prepended, it will become child of the layout. Its
223  * lifetime will be bound to the layout, whenever the layout dies the child
224  * will be deleted automatically. One should use elm_layout_box_remove() to
225  * make this layout forget about the object.
226  *
227  * @see elm_layout_box_append()
228  * @see elm_layout_box_insert_before()
229  * @see elm_layout_box_insert_at()
230  * @see elm_layout_box_remove()
231  *
232  * @ingroup Layout
233  */
234 EAPI void                         elm_layout_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child);
235
236 /**
237  * Insert child to layout box part before a reference object.
238  *
239  * @param obj the layout object
240  * @param part the box part to insert.
241  * @param child the child object to insert into box.
242  * @param reference another reference object to insert before in box.
243  *
244  * Once the object is inserted, it will become child of the layout. Its
245  * lifetime will be bound to the layout, whenever the layout dies the child
246  * will be deleted automatically. One should use elm_layout_box_remove() to
247  * make this layout forget about the object.
248  *
249  * @see elm_layout_box_append()
250  * @see elm_layout_box_prepend()
251  * @see elm_layout_box_insert_before()
252  * @see elm_layout_box_remove()
253  *
254  * @ingroup Layout
255  */
256 EAPI void                         elm_layout_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference);
257
258 /**
259  * Insert child to layout box part at a given position.
260  *
261  * @param obj the layout object
262  * @param part the box part to insert.
263  * @param child the child object to insert into box.
264  * @param pos the numeric position >=0 to insert the child.
265  *
266  * Once the object is inserted, it will become child of the layout. Its
267  * lifetime will be bound to the layout, whenever the layout dies the child
268  * will be deleted automatically. One should use elm_layout_box_remove() to
269  * make this layout forget about the object.
270  *
271  * @see elm_layout_box_append()
272  * @see elm_layout_box_prepend()
273  * @see elm_layout_box_insert_before()
274  * @see elm_layout_box_remove()
275  *
276  * @ingroup Layout
277  */
278 EAPI void                         elm_layout_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos);
279
280 /**
281  * Remove a child of the given part box.
282  *
283  * @param obj The layout object
284  * @param part The box part name to remove child.
285  * @param child The object to remove from box.
286  * @return The object that was being used, or NULL if not found.
287  *
288  * The object will be removed from the box part and its lifetime will
289  * not be handled by the layout anymore. This is equivalent to
290  * elm_object_part_content_unset() for box.
291  *
292  * @see elm_layout_box_append()
293  * @see elm_layout_box_remove_all()
294  *
295  * @ingroup Layout
296  */
297 EAPI Evas_Object                 *elm_layout_box_remove(Evas_Object *obj, const char *part, Evas_Object *child);
298
299 /**
300  * Remove all children of the given part box.
301  *
302  * @param obj The layout object
303  * @param part The box part name to remove child.
304  * @param clear If EINA_TRUE, then all objects will be deleted as
305  *        well, otherwise they will just be removed and will be
306  *        dangling on the canvas.
307  *
308  * The objects will be removed from the box part and their lifetime will
309  * not be handled by the layout anymore. This is equivalent to
310  * elm_layout_box_remove() for all box children.
311  *
312  * @see elm_layout_box_append()
313  * @see elm_layout_box_remove()
314  *
315  * @ingroup Layout
316  */
317 EAPI void                         elm_layout_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear);
318
319 /**
320  * Insert child to layout table part.
321  *
322  * @param obj the layout object
323  * @param part the box part to pack child.
324  * @param child_obj the child object to pack into table.
325  * @param col the column to which the child should be added. (>= 0)
326  * @param row the row to which the child should be added. (>= 0)
327  * @param colspan how many columns should be used to store this object. (>=
328  *        1)
329  * @param rowspan how many rows should be used to store this object. (>= 1)
330  *
331  * Once the object is inserted, it will become child of the table. Its
332  * lifetime will be bound to the layout, and whenever the layout dies the
333  * child will be deleted automatically. One should use
334  * elm_layout_table_remove() to make this layout forget about the object.
335  *
336  * If @p colspan or @p rowspan are bigger than 1, that object will occupy
337  * more space than a single cell. For instance, the following code:
338  * @code
339  * elm_layout_table_pack(layout, "table_part", child, 0, 1, 3, 1);
340  * @endcode
341  *
342  * Would result in an object being added like the following picture:
343  *
344  * @image html layout_colspan.png
345  * @image latex layout_colspan.eps width=\textwidth
346  *
347  * @see elm_layout_table_unpack()
348  * @see elm_layout_table_clear()
349  *
350  * @ingroup Layout
351  */
352 EAPI void                         elm_layout_table_pack(Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan);
353
354 /**
355  * Unpack (remove) a child of the given part table.
356  *
357  * @param obj The layout object
358  * @param part The table part name to remove child.
359  * @param child_obj The object to remove from table.
360  * @return The object that was being used, or NULL if not found.
361  *
362  * The object will be unpacked from the table part and its lifetime
363  * will not be handled by the layout anymore. This is equivalent to
364  * elm_object_part_content_unset() for table.
365  *
366  * @see elm_layout_table_pack()
367  * @see elm_layout_table_clear()
368  *
369  * @ingroup Layout
370  */
371 EAPI Evas_Object                 *elm_layout_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj);
372
373 /**
374  * Remove all the child objects of the given part table.
375  *
376  * @param obj The layout object
377  * @param part The table part name to remove child.
378  * @param clear If EINA_TRUE, then all objects will be deleted as
379  *        well, otherwise they will just be removed and will be
380  *        dangling on the canvas.
381  *
382  * The objects will be removed from the table part and their lifetime will
383  * not be handled by the layout anymore. This is equivalent to
384  * elm_layout_table_unpack() for all table children.
385  *
386  * @see elm_layout_table_pack()
387  * @see elm_layout_table_unpack()
388  *
389  * @ingroup Layout
390  */
391 EAPI void                         elm_layout_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear);
392
393 /**
394  * Get the edje layout
395  *
396  * @param obj The layout object
397  *
398  * @return A Evas_Object with the edje layout settings loaded
399  * with function elm_layout_file_set
400  *
401  * This returns the edje object. It is not expected to be used to then
402  * swallow objects via edje_object_part_swallow() for example. Use
403  * elm_object_part_content_set() instead so child object handling and sizing is
404  * done properly.
405  *
406  * @note This function should only be used if you really need to call some
407  * low level Edje function on this edje object. All the common stuff (setting
408  * text, emitting signals, hooking callbacks to signals, etc.) can be done
409  * with proper elementary functions.
410  *
411  * @see elm_object_signal_callback_add()
412  * @see elm_object_signal_emit()
413  * @see elm_object_part_text_set()
414  * @see elm_object_part_content_set()
415  * @see elm_layout_box_append()
416  * @see elm_layout_table_pack()
417  * @see elm_layout_data_get()
418  *
419  * @ingroup Layout
420  */
421 EAPI Evas_Object                 *elm_layout_edje_get(const Evas_Object *obj);
422
423 /**
424  * Get the edje data from the given layout
425  *
426  * @param obj The layout object
427  * @param key The data key
428  *
429  * @return The edje data string
430  *
431  * This function fetches data specified inside the edje theme of this layout.
432  * This function return NULL if data is not found.
433  *
434  * In EDC this comes from a data block within the group block that @p
435  * obj was loaded from. E.g.
436  *
437  * @code
438  * collections {
439  *   group {
440  *     name: "a_group";
441  *     data {
442  *       item: "key1" "value1";
443  *       item: "key2" "value2";
444  *     }
445  *   }
446  * }
447  * @endcode
448  *
449  * @ingroup Layout
450  */
451 EAPI const char                  *elm_layout_data_get(const Evas_Object *obj, const char *key);
452
453 /**
454  * Eval sizing
455  *
456  * @param obj The layout object
457  *
458  * Manually forces a sizing re-evaluation. This is useful when the minimum
459  * size required by the edje theme of this layout has changed. The change on
460  * the minimum size required by the edje theme is not immediately reported to
461  * the elementary layout, so one needs to call this function in order to tell
462  * the widget (layout) that it needs to reevaluate its own size.
463  *
464  * The minimum size of the theme is calculated based on minimum size of
465  * parts, the size of elements inside containers like box and table, etc. All
466  * of this can change due to state changes, and that's when this function
467  * should be called.
468  *
469  * Also note that a standard signal of "size,eval" "elm" emitted from the
470  * edje object will cause this to happen too.
471  *
472  * @ingroup Layout
473  */
474 EAPI void                         elm_layout_sizing_eval(Evas_Object *obj);
475
476 /**
477  * Sets a specific cursor for an edje part.
478  *
479  * @param obj The layout object.
480  * @param part_name a part from loaded edje group.
481  * @param cursor cursor name to use, see Elementary_Cursor.h
482  *
483  * @return EINA_TRUE on success or EINA_FALSE on failure, that may be
484  *         part not exists or it has "mouse_events: 0".
485  *
486  * @ingroup Layout
487  */
488 EAPI Eina_Bool                    elm_layout_part_cursor_set(Evas_Object *obj, const char *part_name, const char *cursor);
489
490 /**
491  * Get the cursor to be shown when mouse is over an edje part
492  *
493  * @param obj The layout object.
494  * @param part_name a part from loaded edje group.
495  * @return the cursor name.
496  *
497  * @ingroup Layout
498  */
499 EAPI const char                  *elm_layout_part_cursor_get(const Evas_Object *obj, const char *part_name);
500
501 /**
502  * Unsets a cursor previously set with elm_layout_part_cursor_set().
503  *
504  * @param obj The layout object.
505  * @param part_name a part from loaded edje group, that had a cursor set
506  *        with elm_layout_part_cursor_set().
507  *
508  * @ingroup Layout
509  */
510 EAPI void                         elm_layout_part_cursor_unset(Evas_Object *obj, const char *part_name);
511
512 /**
513  * Sets a specific cursor style for an edje part.
514  *
515  * @param obj The layout object.
516  * @param part_name a part from loaded edje group.
517  * @param style the theme style to use (default, transparent, ...)
518  *
519  * @return EINA_TRUE on success or EINA_FALSE on failure, that may be
520  *         part not exists or it did not had a cursor set.
521  *
522  * @ingroup Layout
523  */
524 EAPI Eina_Bool                    elm_layout_part_cursor_style_set(Evas_Object *obj, const char *part_name, const char *style);
525
526 /**
527  * Gets a specific cursor style for an edje part.
528  *
529  * @param obj The layout object.
530  * @param part_name a part from loaded edje group.
531  *
532  * @return the theme style in use, defaults to "default". If the
533  *         object does not have a cursor set, then NULL is returned.
534  *
535  * @ingroup Layout
536  */
537 EAPI const char                  *elm_layout_part_cursor_style_get(const Evas_Object *obj, const char *part_name);
538
539 /**
540  * Sets if the cursor set should be searched on the theme or should use
541  * the provided by the engine, only.
542  *
543  * @note before you set if should look on theme you should define a
544  * cursor with elm_layout_part_cursor_set(). By default it will only
545  * look for cursors provided by the engine.
546  *
547  * @param obj The layout object.
548  * @param part_name a part from loaded edje group.
549  * @param engine_only if cursors should be just provided by the engine (EINA_TRUE)
550  *        or should also search on widget's theme as well (EINA_FALSE)
551  *
552  * @return EINA_TRUE on success or EINA_FALSE on failure, that may be
553  *         part not exists or it did not had a cursor set.
554  *
555  * @ingroup Layout
556  */
557 EAPI Eina_Bool                    elm_layout_part_cursor_engine_only_set(Evas_Object *obj, const char *part_name, Eina_Bool engine_only);
558
559 /**
560  * Gets a specific cursor engine_only for an edje part.
561  *
562  * @param obj The layout object.
563  * @param part_name a part from loaded edje group.
564  *
565  * @return whenever the cursor is just provided by engine or also from theme.
566  *
567  * @ingroup Layout
568  */
569 EAPI Eina_Bool                    elm_layout_part_cursor_engine_only_get(const Evas_Object *obj, const char *part_name);
570
571 /**
572  * @def elm_layout_icon_set
573  * Convenience macro to set the icon object in a layout that follows the
574  * Elementary naming convention for its parts.
575  *
576  * @ingroup Layout
577  */
578 #define elm_layout_icon_set(_ly, _obj)                                 \
579   do {                                                                 \
580        const char *sig;                                                \
581        elm_object_part_content_set((_ly), "elm.swallow.icon", (_obj)); \
582        if ((_obj)) sig = "elm,state,icon,visible";                     \
583        else sig = "elm,state,icon,hidden";                             \
584        elm_object_signal_emit((_ly), sig, "elm");                      \
585     } while (0)
586
587 /**
588  * @def elm_layout_icon_get
589  * Convenience macro to get the icon object from a layout that follows the
590  * Elementary naming convention for its parts.
591  *
592  * @ingroup Layout
593  */
594 #define elm_layout_icon_get(_ly) \
595   elm_object_part_content_get((_ly), "elm.swallow.icon")
596
597 /**
598  * @def elm_layout_end_set
599  * Convenience macro to set the end object in a layout that follows the
600  * Elementary naming convention for its parts.
601  *
602  * @ingroup Layout
603  */
604 #define elm_layout_end_set(_ly, _obj)                                 \
605   do {                                                                \
606        const char *sig;                                               \
607        elm_object_part_content_set((_ly), "elm.swallow.end", (_obj)); \
608        if ((_obj)) sig = "elm,state,end,visible";                     \
609        else sig = "elm,state,end,hidden";                             \
610        elm_object_signal_emit((_ly), sig, "elm");                     \
611     } while (0)
612
613 /**
614  * @def elm_layout_end_get
615  * Convenience macro to get the end object in a layout that follows the
616  * Elementary naming convention for its parts.
617  *
618  * @ingroup Layout
619  */
620 #define elm_layout_end_get(_ly) \
621   elm_object_part_content_get((_ly), "elm.swallow.end")
622
623 /* smart callbacks called:
624  * "theme,changed" - when elm theme is changed.
625  */
626
627 /**
628  * @}
629  */