Merge "[Copy&Paste] remove "Paste" button when CBHM has no item"
[framework/uifw/elementary.git] / src / edje_externals / elm_datefield.c
1 #include "private.h"
2
3 typedef struct _Elm_Params_Datefield
4 {
5    const char *layout;
6    const char *format;
7    Eina_Bool mode:1;
8    Eina_Bool mode_exists:1;
9    int year;
10    Eina_Bool year_exists:1;
11    int mon;
12    Eina_Bool mon_exists:1;
13    int day;
14    Eina_Bool day_exists:1;
15    int hour;
16    Eina_Bool hour_exists:1;
17    int min;
18    Eina_Bool min_exists:1;
19 } Elm_Params_Datefield;
20
21 static const char *datefield_layout_choices[] = {"time", "date", "dateandtime", NULL};
22
23 static Elm_Datefield_Layout
24 _datefield_layout_setting_get(const char *layout_str)
25 {
26    unsigned int i;
27
28    for (i = 0; i < sizeof(datefield_layout_choices)/sizeof(datefield_layout_choices[0]); i++)
29      {
30             if (!strcmp(layout_str, datefield_layout_choices[i]))
31             return i;
32      }
33    return ELM_DATEFIELD_LAYOUT_DATEANDTIME;
34 }
35
36 static void
37 external_datefield_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
38 {
39    const Elm_Params_Datefield *p;
40
41    if (to_params) p = to_params;
42    else if (from_params) p = from_params;
43    else return;
44
45    if (p->layout)
46      {
47         Elm_Datefield_Layout layout = _datefield_layout_setting_get(p->layout);
48         elm_datefield_layout_set(obj, layout);
49      }
50    if (p->format)
51      elm_datefield_date_format_set(obj, p->format);
52    if (p->mode_exists)
53      elm_datefield_time_mode_set(obj, p->mode);
54    if ((p->year_exists) || (p->mon_exists) || (p->day_exists) || (p->hour_exists) || (p->min_exists))
55      {
56         int year, mon, day, hour, min;
57          elm_datefield_date_get(obj, &year, &mon, &day, &hour, &min);
58
59          if (p->year_exists) year = p->year;
60          if (p->mon_exists) mon = p->mon;
61          if (p->day_exists) day = p->day;
62          if (p->hour_exists) hour = p->hour;
63          if (p->min_exists) min = p->min;
64          elm_datefield_date_set(obj, year, mon, day, hour, min);
65      }
66 }
67
68 static Eina_Bool
69 external_datefield_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
70 {
71    if (!strcmp(param->name, "layout"))
72      {
73         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
74           {
75              Elm_Datefield_Layout layout = _datefield_layout_setting_get(param->s);
76              elm_datefield_layout_set(obj, layout);
77              return EINA_TRUE;
78           }
79      }
80    else if (!strcmp(param->name, "date_format"))
81      {
82         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
83           {
84              elm_datefield_date_format_set(obj, param->s);
85              return EINA_TRUE;
86           }
87      }
88    else if (!strcmp(param->name, "time_mode"))
89      {
90         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
91           {
92              elm_datefield_time_mode_set(obj, param->i);
93              return EINA_TRUE;
94           }
95      }
96    else if (!strcmp(param->name, "years"))
97      {
98         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
99           {
100              int mon, day, hour, min;
101              elm_datefield_date_get(obj, NULL, &mon, &day, &hour, &min);
102              elm_datefield_date_set(obj, param->i, mon, day, hour, min);
103              return EINA_TRUE;
104           }
105      }
106    else if (!strcmp(param->name, "months"))
107      {
108         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
109           {
110              int year, day, hour, min;
111              elm_datefield_date_get(obj, &year, NULL, &day, &hour, &min);
112              elm_datefield_date_set(obj, year, param->i, day, hour, min);
113              return EINA_TRUE;
114           }
115      }
116    else if (!strcmp(param->name, "days"))
117      {
118         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
119           {
120              int year, mon, hour, min;
121              elm_datefield_date_get(obj, &year, &mon, NULL, &hour, &min);
122              elm_datefield_date_set(obj, year, mon, param->i, hour, min);
123              return EINA_TRUE;
124           }
125      }
126    else if (!strcmp(param->name, "hours"))
127      {
128         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
129           {
130              int year, mon, day, min;
131              elm_datefield_date_get(obj, &year, &mon, &day, NULL, &min);
132              elm_datefield_date_set(obj, year, mon, day, param->i, min);
133              return EINA_TRUE;
134           }
135      }
136    else if (!strcmp(param->name, "days"))
137      {
138         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
139           {
140              int year, mon, day, hour;
141              elm_datefield_date_get(obj, &year, &mon, &day, &hour, NULL);
142              elm_datefield_date_set(obj, year, mon, day, hour, param->i);
143              return EINA_TRUE;
144           }
145      }
146
147    ERR("unknown parameter '%s' of type '%s'",
148        param->name, edje_external_param_type_str(param->type));
149
150    return EINA_FALSE;
151 }
152
153 static Eina_Bool
154 external_datefield_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
155 {
156    if (!strcmp(param->name, "layout"))
157      {
158         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
159           {
160              Elm_Datefield_Layout layout = elm_datefield_layout_get(obj);
161              if (layout > ELM_DATEFIELD_LAYOUT_DATEANDTIME)
162                return EINA_FALSE;
163
164              param->s = datefield_layout_choices[layout];
165              return EINA_TRUE;
166           }
167      }
168    else if (!strcmp(param->name, "date_format"))
169      {
170        if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
171          {
172             param->s = elm_datefield_date_format_get(obj);
173              return EINA_TRUE;
174          }
175      }
176    else if (!strcmp(param->name, "time_mode"))
177      {
178        if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
179          {
180             param->i = elm_datefield_time_mode_get(obj);
181              return EINA_TRUE;
182          }
183      }
184    else if (!strcmp(param->name, "years"))
185      {
186         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
187           {
188              elm_datefield_date_get(obj, &(param->i), NULL, NULL, NULL, NULL);
189              return EINA_TRUE;
190           }
191      }
192    else if (!strcmp(param->name, "months"))
193      {
194         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
195           {
196              elm_datefield_date_get(obj, NULL, &(param->i), NULL, NULL, NULL);
197              return EINA_TRUE;
198           }
199      }
200    else if (!strcmp(param->name, "days"))
201      {
202         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
203           {
204              elm_datefield_date_get(obj, NULL, NULL, &(param->i),NULL, NULL);
205              return EINA_TRUE;
206           }
207      }
208    else if (!strcmp(param->name, "hours"))
209      {
210         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
211           {
212              elm_datefield_date_get(obj, NULL, NULL, NULL, &(param->i), NULL);
213              return EINA_TRUE;
214           }
215      }
216    else if (!strcmp(param->name, "minutes"))
217      {
218         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_INT)
219           {
220              elm_datefield_date_get(obj, NULL, NULL, NULL, NULL, &(param->i));
221              return EINA_TRUE;
222           }
223      }
224
225    ERR("unknown parameter '%s' of type '%s'",
226        param->name, edje_external_param_type_str(param->type));
227
228    return EINA_FALSE;
229 }
230
231 static void *
232 external_datefield_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
233 {
234    Elm_Params_Datefield *mem;
235    Edje_External_Param *param;
236    const Eina_List *l;
237
238    mem = calloc(1, sizeof(Elm_Params_Datefield));
239    if (!mem)
240      return NULL;
241
242    EINA_LIST_FOREACH(params, l, param)
243      {
244         if (!strcmp(param->name, "layout"))
245           mem->layout = eina_stringshare_add(param->s);
246         else if (!strcmp(param->name, "date_format"))
247           mem->format = eina_stringshare_add(param->s);
248         else if (!strcmp(param->name, "time_mode"))
249         {
250           mem->mode = !!param->i;
251           mem->mode_exists = EINA_TRUE;
252         }
253         else if (!strcmp(param->name, "years"))
254         {
255            mem->year = param->i;
256            mem->year_exists = EINA_TRUE;
257         }
258         else if (!strcmp(param->name, "months"))
259         {
260            mem->mon = param->i;
261            mem->mon_exists = EINA_TRUE;
262         }
263         else if (!strcmp(param->name, "days"))
264         {
265           mem->day = param->i;
266           mem->day_exists = EINA_TRUE;
267         }
268         else if (!strcmp(param->name, "hours"))
269         {
270            mem->hour = param->i;
271            mem->hour_exists = EINA_TRUE;
272         }
273         else if (!strcmp(param->name, "minutes"))
274         {
275            mem->min = param->i;
276            mem->min_exists = EINA_TRUE;
277         }
278      }
279
280    return mem;
281 }
282
283 static Evas_Object *external_datefield_content_get(void *data __UNUSED__,
284                 const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
285 {
286         ERR("so content");
287         return NULL;
288 }
289
290 static void
291 external_datefield_params_free(void *params)
292 {
293    Elm_Params_Datefield *mem = params;
294
295    if (mem->layout)
296      eina_stringshare_del(mem->layout);
297    if (mem->format)
298      eina_stringshare_del(mem->format);
299
300    free(mem);
301 }
302
303 static Edje_External_Param_Info external_datefield_params[] = {
304    EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("layout", "dateandtime", datefield_layout_choices),
305    EDJE_EXTERNAL_PARAM_INFO_STRING("date_format"),
306    EDJE_EXTERNAL_PARAM_INFO_BOOL("time_mode"),
307    EDJE_EXTERNAL_PARAM_INFO_INT_DEFAULT("years", 1900),
308    EDJE_EXTERNAL_PARAM_INFO_INT_DEFAULT("months", 1),
309    EDJE_EXTERNAL_PARAM_INFO_INT_DEFAULT("days", 1),
310    EDJE_EXTERNAL_PARAM_INFO_INT("hours"),
311    EDJE_EXTERNAL_PARAM_INFO_INT("minutes"),
312    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
313 };
314
315 DEFINE_EXTERNAL_ICON_ADD(datefield, "datefield");
316 DEFINE_EXTERNAL_TYPE_SIMPLE(datefield, "Datefield");
317