Rearrange structures to reduce padding
[platform/upstream/elementary.git] / src / lib / elm_widget_datetime.h
1 #ifndef ELM_WIDGET_DATETIME_H
2 #define ELM_WIDGET_DATETIME_H
3
4 #include "Elementary.h"
5
6 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR
7  * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT
8  * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK
9  * IT AT RUNTIME.
10  */
11
12 /**
13  * @internal
14  * @addtogroup Widget
15  * @{
16  *
17  * @section elm-datetime-class The Elementary Datetime Class
18  *
19  * Elementary, besides having the @ref Elm_Datetime widget, exposes its
20  * foundation -- the Elementary Datetime Class -- in order to create other
21  * widgets which are a datetime with some more logic on top.
22  */
23
24 /**
25  * Base layout smart data extended with datetime instance data.
26  */
27 typedef struct _Elm_Datetime_Module_Data Elm_Datetime_Module_Data;
28 typedef struct _Elm_Datetime_Data        Elm_Datetime_Data;
29 typedef struct _Datetime_Field           Datetime_Field;
30 typedef struct _Datetime_Mod_Api         Datetime_Mod_Api;
31 typedef struct _Format_Map               Format_Map;
32
33 #define ELM_DATETIME_TYPE_COUNT           6
34 #define ELM_DATETIME_MAX_FORMAT_LEN       64
35 #define ELM_DATETIME_MAX_FIELD_FORMAT_LEN 3
36
37 struct _Elm_Datetime_Module_Data
38 {
39    Evas_Object *base;
40    void         (*field_limit_get)(Evas_Object *obj,
41                                    Elm_Datetime_Field_Type field_type,
42                                    int *range_min,
43                                    int *range_max);
44    const char  *(*field_format_get)(Evas_Object * obj,
45                                     Elm_Datetime_Field_Type field_type);
46    //TIZEN_ONLY(20151218): Support Mobile UX
47    Eina_Bool    (*field_location_get)(Evas_Object *obj,
48                                       Elm_Datetime_Field_Type field_type,
49                                       int *loc);
50    Eina_List   *(*fields_sorted_get)(Evas_Object *obj);
51    //
52 };
53
54 struct _Datetime_Field
55 {
56    Evas_Object            *item_obj;
57    const char             *separator;
58    int                     location;  /* location of the field as per
59                                        * current format */
60    int                     min, max;
61    Elm_Datetime_Field_Type type;
62    char                    fmt[ELM_DATETIME_MAX_FIELD_FORMAT_LEN];
63    Eina_Bool               fmt_exist : 1;  /* whether field format is
64                                             * present or not */
65    Eina_Bool               visible : 1;  /* whether field can be
66                                           * visible or not */
67 };
68
69 struct _Datetime_Mod_Api
70 {
71    Elm_Datetime_Module_Data *(*obj_hook)(Evas_Object * obj);
72    void                      (*obj_unhook)(Elm_Datetime_Module_Data *mdata);
73    void                      (*obj_hide)(Elm_Datetime_Module_Data *mdata);
74    Evas_Object              *(*field_create)(Elm_Datetime_Module_Data * mdata,
75                                              Elm_Datetime_Field_Type ftype);
76    void                      (*field_value_display)(Elm_Datetime_Module_Data
77                                                     *mdata,
78                                                     Evas_Object *obj);
79    //TIZEN_ONLY(20151218): Support Mobile UX
80    void                      (*field_format_changed)(Elm_Datetime_Module_Data
81                                                      *mdata,
82                                                      Evas_Object *obj);
83    //
84 };
85
86 struct _Elm_Datetime_Data
87 {
88    /* fixed set of fields. */
89    Datetime_Field            field_list[ELM_DATETIME_TYPE_COUNT];
90    struct tm                 curr_time, min_limit, max_limit;
91    Elm_Datetime_Module_Data *mod_data;
92    Evas_Object              *access_obj;
93    int                       enabled_field_count;
94    char                      format[ELM_DATETIME_MAX_FORMAT_LEN];
95    Eina_Bool                 user_format : 1;  /* whether user set
96                                                 * format or default
97                                                 * format. */
98    Eina_Bool                 freeze_sizing : 1; /* freeze sizing_eval to
99                                                  * reduce unnecessary sizing */
100 };
101
102 struct _Format_Map
103 {
104    char *fmt_char;
105    int   def_min;
106    int   def_max;
107    char *ignore_sep;
108 };
109
110 /**
111  * @}
112  */
113
114 #define ELM_DATETIME_DATA_GET(o, sd) \
115   Elm_Datetime_Data * sd = eo_data_scope_get(o, ELM_DATETIME_CLASS)
116
117 #define ELM_DATETIME_DATA_GET_OR_RETURN(o, ptr)      \
118   ELM_DATETIME_DATA_GET(o, ptr);                     \
119   if (EINA_UNLIKELY(!ptr))                           \
120     {                                                \
121        CRI("No widget data for object %p (%s)",      \
122            o, evas_object_type_get(o));              \
123        return;                                       \
124     }
125
126 #define ELM_DATETIME_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
127   ELM_DATETIME_DATA_GET(o, ptr);                         \
128   if (EINA_UNLIKELY(!ptr))                               \
129     {                                                    \
130        CRI("No widget data for object %p (%s)",          \
131            o, evas_object_type_get(o));                  \
132        return val;                                       \
133     }
134
135 #define ELM_DATETIME_CHECK(obj)                              \
136   if (EINA_UNLIKELY(!eo_isa((obj), ELM_DATETIME_CLASS))) \
137     return
138
139 #endif