[access] use given object, if there is no highlight object in _access_highlight_next_...
[framework/uifw/elementary.git] / src / lib / elm_widget_box.h
1 #ifndef ELM_WIDGET_BOX_H
2 #define ELM_WIDGET_BOX_H
3
4 /**
5  * @addtogroup Widget
6  * @{
7  *
8  * @section elm-box-class The Elementary Box Class
9  *
10  * Elementary, besides having the @ref Box widget, exposes its
11  * foundation -- the Elementary Box Class -- in order to create
12  * other widgets which are a box with some more logic on top.
13  */
14
15 /**
16  * @def ELM_BOX_CLASS
17  *
18  * Use this macro to cast whichever subclass of
19  * #Elm_Box_Smart_Class into it, so to access its fields.
20  *
21  * @ingroup Widget
22  */
23 #define ELM_BOX_CLASS(x) ((Elm_Box_Smart_Class *) x)
24
25 /**
26  * @def ELM_BOX_DATA
27  *
28  * Use this macro to cast whichever subdata of
29  * #Elm_Box_Smart_Data into it, so to access its fields.
30  *
31  * @ingroup Widget
32  */
33 #define ELM_BOX_DATA(x) ((Elm_Box_Smart_Data *) x)
34
35 /**
36  * @def ELM_BOX_SMART_CLASS_VERSION
37  *
38  * Current version for Elementary box @b base smart class, a value
39  * which goes to _Elm_Box_Smart_Class::version.
40  *
41  * @ingroup Widget
42  */
43 #define ELM_BOX_SMART_CLASS_VERSION 1
44
45 /**
46  * @def ELM_BOX_SMART_CLASS_INIT
47  *
48  * Initializer for a whole #Elm_Box_Smart_Class structure, with
49  * @c NULL values on its specific fields.
50  *
51  * @param smart_class_init initializer to use for the "base" field
52  * (#Evas_Smart_Class).
53  *
54  * @see EVAS_SMART_CLASS_INIT_NULL
55  * @see EVAS_SMART_CLASS_INIT_NAME_VERSION
56  * @see ELM_BOX_SMART_CLASS_INIT_NULL
57  * @see ELM_BOX_SMART_CLASS_INIT_NAME_VERSION
58  *
59  * @ingroup Widget
60  */
61 #define ELM_BOX_SMART_CLASS_INIT(smart_class_init)                        \
62   {smart_class_init, ELM_BOX_SMART_CLASS_VERSION}
63
64 /**
65  * @def ELM_BOX_SMART_CLASS_INIT_NULL
66  *
67  * Initializer to zero out a whole #Elm_Box_Smart_Class structure.
68  *
69  * @see ELM_BOX_SMART_CLASS_INIT_NAME_VERSION
70  * @see ELM_BOX_SMART_CLASS_INIT
71  *
72  * @ingroup Widget
73  */
74 #define ELM_BOX_SMART_CLASS_INIT_NULL \
75   ELM_BOX_SMART_CLASS_INIT(EVAS_SMART_CLASS_INIT_NULL)
76
77 /**
78  * @def ELM_BOX_SMART_CLASS_INIT_NAME_VERSION
79  *
80  * Initializer to zero out a whole #Elm_Box_Smart_Class structure and
81  * set its name and version.
82  *
83  * This is similar to #ELM_BOX_SMART_CLASS_INIT_NULL, but it will
84  * also set the version field of #Elm_Box_Smart_Class (base field)
85  * to the latest #ELM_BOX_SMART_CLASS_VERSION and name it to the
86  * specific value.
87  *
88  * It will keep a reference to the name field as a <c>"const char *"</c>,
89  * i.e., the name must be available while the structure is
90  * used (hint: static or global variable!) and must not be modified.
91  *
92  * @see ELM_BOX_SMART_CLASS_INIT_NULL
93  * @see ELM_BOX_SMART_CLASS_INIT
94  *
95  * @ingroup Widget
96  */
97 #define ELM_BOX_SMART_CLASS_INIT_NAME_VERSION(name) \
98   ELM_BOX_SMART_CLASS_INIT(ELM_WIDGET_SMART_CLASS_INIT_NAME_VERSION(name))
99
100 /**
101  * Elementary box base smart class. This inherits directly from
102  * #Elm_Widget_Smart_Class and is meant to build widgets extending the
103  * behavior of a box.
104  *
105  * All of the functions listed on @ref Box namespace will work for
106  * objects deriving from #Elm_Box_Smart_Class.
107  */
108 typedef struct _Elm_Box_Smart_Class
109 {
110    Elm_Widget_Smart_Class base;
111
112    int                    version; /**< Version of this smart class definition */
113 } Elm_Box_Smart_Class;
114
115 /**
116  * Base widget smart data extended with box instance data.
117  */
118 typedef struct _Elm_Box_Smart_Data        Elm_Box_Smart_Data;
119 struct _Elm_Box_Smart_Data
120 {
121    Elm_Widget_Smart_Data base; /* base widget smart data as
122                                 * first member obligatory, as
123                                 * we're inheriting from it */
124
125    Eina_Bool             homogeneous : 1;
126    Eina_Bool             on_deletion : 1;
127    Eina_Bool             horizontal : 1;
128    Eina_Bool             recalc : 1;
129 };
130
131 struct _Elm_Box_Transition
132 {
133    double          initial_time;
134    double          duration;
135    Ecore_Animator *animator;
136
137    struct
138    {
139       Evas_Object_Box_Layout layout;
140       void                  *data;
141       void                   (*free_data)(void *data);
142    } start, end;
143
144    void            (*transition_end_cb)(void *data);
145    void           *transition_end_data;
146    void            (*transition_end_free_data)(void *data);
147    Eina_List      *objs;
148    Evas_Object    *box;
149
150    Eina_Bool       animation_ended : 1;
151    Eina_Bool       recalculate : 1;
152 };
153
154 typedef struct _Transition_Animation_Data Transition_Animation_Data;
155 struct _Transition_Animation_Data
156 {
157    Evas_Object *obj;
158    struct
159    {
160       Evas_Coord x, y, w, h;
161    } start, end;
162 };
163
164 /**
165  * @}
166  */
167
168 EAPI extern const char ELM_BOX_SMART_NAME[];
169 EAPI const Elm_Box_Smart_Class *elm_box_smart_class_get(void);
170
171 #define ELM_BOX_DATA_GET(o, sd) \
172   Elm_Box_Smart_Data * sd = evas_object_smart_data_get(o)
173
174 #define ELM_BOX_DATA_GET_OR_RETURN(o, ptr)           \
175   ELM_BOX_DATA_GET(o, ptr);                          \
176   if (!ptr)                                          \
177     {                                                \
178        CRITICAL("No widget data for object %p (%s)", \
179                 o, evas_object_type_get(o));         \
180        return;                                       \
181     }
182
183 #define ELM_BOX_DATA_GET_OR_RETURN_VAL(o, ptr, val)  \
184   ELM_BOX_DATA_GET(o, ptr);                          \
185   if (!ptr)                                          \
186     {                                                \
187        CRITICAL("No widget data for object %p (%s)", \
188                 o, evas_object_type_get(o));         \
189        return val;                                   \
190     }
191
192 #define ELM_BOX_CHECK(obj)                                                 \
193   if (!obj || !elm_widget_type_check((obj), ELM_BOX_SMART_NAME, __func__)) \
194     return
195
196 #endif