elementary/dayselector - oooops crazy hermet
[framework/uifw/elementary.git] / src / lib / elc_dayselector.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 typedef struct _Widget_Data Widget_Data;
5 typedef struct _Elm_Dayselector_Item Elm_Dayselector_Item;
6
7 /* signals to edc */
8 #define ITEM_TYPE_WEEKDAY_DEFAULT    "elm,type,weekday,default"
9 #define ITEM_TYPE_WEEKDAY_STYLE1     "elm,type,weekday,style1"
10 #define ITEM_TYPE_WEEKEND_DEFAULT    "elm,type,weekend,default"
11 #define ITEM_TYPE_WEEKEND_STYLE1     "elm,type,weekend,style1"
12 #define ITEM_POS_LEFT                "elm,pos,check,left"
13 #define ITEM_POS_RIGHT               "elm,pos,check,right"
14 #define ITEM_POS_MIDDLE              "elm,pos,check,middle"
15
16 struct _Widget_Data
17 {
18    Evas_Object *base;
19    Eina_List *items;
20    Elm_Dayselector_Day week_start;
21    Elm_Dayselector_Day weekend_start;
22    unsigned int weekend_len;
23 };
24
25 struct _Elm_Dayselector_Item
26 {
27    ELM_WIDGET_ITEM;
28    Elm_Dayselector_Day day;
29    const char *day_style;
30 };
31
32 static const char *widtype = NULL;
33 static void _del_hook(Evas_Object *obj);
34 static void _sizing_eval(Evas_Object* obj);
35 static void _dayselector_resize(void *data, Evas *e __UNUSED__,
36             Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
37 static void _disable_hook(Evas_Object *obj);
38 static Eina_Bool _focus_next_hook(const Evas_Object *obj,
39                  Elm_Focus_Direction dir __UNUSED__, Evas_Object **next __UNUSED__);
40 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
41 static void _translate_hook(Evas_Object *obj);
42 static void _theme_hook(Evas_Object *obj);
43 static void _item_text_set_hook(Evas_Object *obj, const char *item, const char *label);
44 static const char *_item_text_get_hook(const Evas_Object *obj, const char *item);
45 static void _content_set_hook(Evas_Object *obj, const char *item, Evas_Object *content);
46 static Evas_Object *_content_get_hook(const Evas_Object *obj, const char *item);
47 static Evas_Object *_content_unset_hook(Evas_Object *obj, const char *item);
48 static void _signal_emit_cb(void *data, Evas_Object *obj, const char *emission,
49             const char *source __UNUSED__);
50 static void _item_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__);
51 static Elm_Dayselector_Item * _item_find(const Evas_Object *obj, Elm_Dayselector_Day day);
52 static void _items_style_set(Evas_Object *obj);
53 static void _update_items(Evas_Object *obj);
54 static void _create_items(Evas_Object *obj);
55
56 static const char SIG_CHANGED[] = "dayselector,changed";
57 static const char SIG_LANG_CHANGED[] = "language,changed";
58 static const Evas_Smart_Cb_Description _signals[] = {
59        {SIG_CHANGED, ""},
60        {SIG_LANG_CHANGED, ""},
61        {NULL, NULL}
62 };
63
64 static void
65 _del_hook(Evas_Object *obj)
66 {
67    Elm_Dayselector_Item *it;
68    Widget_Data *wd = elm_widget_data_get(obj);
69    if (!wd) return;
70
71    EINA_LIST_FREE(wd->items, it)
72      {
73         wd->items = eina_list_remove(wd->items, it);
74         eina_stringshare_del(it->day_style);
75         elm_widget_item_free(it);
76      }
77
78    free(wd);
79 }
80
81 static void
82 _sizing_eval(Evas_Object* obj)
83 {
84    Evas_Coord min_w = -1, min_h = -1;
85    Widget_Data *wd = elm_widget_data_get(obj);
86    if (!wd) return;
87
88    elm_coords_finger_size_adjust(ELM_DAYSELECTOR_MAX, &min_w, 1, &min_h);
89    edje_object_size_min_restricted_calc(wd->base, &min_w, &min_h, min_w, min_h);
90    elm_coords_finger_size_adjust(ELM_DAYSELECTOR_MAX, &min_w, 1, &min_h);
91    evas_object_size_hint_min_set(obj, min_w, min_h);
92 }
93
94 static void
95 _dayselector_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
96                     void *event_info __UNUSED__)
97 {
98    _sizing_eval(data);
99 }
100
101 static void
102 _disable_hook(Evas_Object *obj)
103 {
104    Widget_Data* wd = elm_widget_data_get(obj);
105    if (!wd) return;
106
107    if (elm_widget_disabled_get(obj))
108      edje_object_signal_emit(wd->base, "elm,state,disabled", "elm");
109    else
110      edje_object_signal_emit(wd->base, "elm,state,enabled", "elm");
111 }
112
113 static Eina_Bool
114 _focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir __UNUSED__,
115                  Evas_Object **next __UNUSED__)
116 {
117    Widget_Data *wd = elm_widget_data_get(obj);
118    if (!wd) return EINA_FALSE;
119
120    /* TODO: Focus switch support to Elm_widget_Item is not supported yet.*/
121    return EINA_FALSE;
122 }
123
124 static void
125 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
126 {
127    Widget_Data *wd = elm_widget_data_get(obj);
128    if (!wd) return;
129
130    edje_object_mirrored_set(wd->base, rtl);
131 }
132
133 static void
134 _translate_hook(Evas_Object *obj)
135 {
136    Eina_List *l;
137    Elm_Dayselector_Item *it;
138    struct tm time_daysel;
139    time_t t;
140    char buf[1024];
141    Widget_Data *wd = elm_widget_data_get(obj);
142    if (!wd) return;
143
144    t = time(NULL);
145    localtime_r(&t, &time_daysel);
146    EINA_LIST_FOREACH(wd->items, l, it)
147      {
148         time_daysel.tm_wday = it->day;
149         strftime(buf, sizeof(buf), "%a", &time_daysel);
150         elm_object_text_set(VIEW(it), buf);
151      }
152    evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
153 }
154
155 static void
156 _theme_hook(Evas_Object *obj)
157 {
158    Eina_List *l;
159    Elm_Dayselector_Item *it;
160    char buf[1024];
161    unsigned int loc;
162    Widget_Data* wd = elm_widget_data_get(obj);
163    if (!wd) return;
164
165    _elm_widget_mirrored_reload(obj);
166    _mirrored_set(obj, elm_widget_mirrored_get(obj));
167    _elm_theme_object_set(obj, wd->base, "dayselector", "base", elm_widget_style_get(obj));
168
169    EINA_LIST_FOREACH(wd->items, l, it)
170      {
171         snprintf(buf, sizeof(buf), "dayselector/%s", elm_object_style_get(obj));
172         elm_object_style_set(VIEW(it), buf);
173         loc = (ELM_DAYSELECTOR_MAX - wd->week_start + it->day) % ELM_DAYSELECTOR_MAX;
174         snprintf(buf, sizeof(buf), "day%d,visible", loc);
175         edje_object_signal_emit(wd->base, buf, "elm");
176         snprintf(buf, sizeof(buf), "day%d", loc);
177         edje_object_part_swallow(wd->base, buf, VIEW(it));
178      }
179    _update_items(obj);
180    _sizing_eval(obj);
181 }
182
183 static void
184 _item_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj,
185              void *event_info __UNUSED__)
186 {
187    ELM_CHECK_WIDTYPE(data, widtype);
188    Eina_List *l;
189    Elm_Dayselector_Item *it;
190    char buf[1024];
191    unsigned int loc = 0;
192    Widget_Data *wd = elm_widget_data_get(data);
193    if (!wd) return;
194
195    EINA_LIST_FOREACH(wd->items, l, it)
196      {
197         if (obj == VIEW(it))
198           {
199              wd->items = eina_list_remove(wd->items, it);
200              eina_stringshare_del(it->day_style);
201              evas_object_smart_callback_del(VIEW(it), "changed", _item_clicked_cb);
202              evas_object_event_callback_del(VIEW(it), EVAS_CALLBACK_DEL, _item_del_cb);
203              edje_object_part_unswallow(wd->base, VIEW(it));
204              loc = (ELM_DAYSELECTOR_MAX - wd->week_start + it->day) % ELM_DAYSELECTOR_MAX;
205              snprintf(buf, sizeof(buf), "day%d,default", loc);
206              edje_object_signal_emit(wd->base, buf, "elm");
207              elm_widget_item_free(it);
208              _sizing_eval(obj);
209              break;
210           }
211      }
212 }
213
214 static void
215 _signal_emit_cb(void *data, Evas_Object *obj, const char *emission, const char *source __UNUSED__)
216 {
217    Eina_List *l;
218    Elm_Dayselector_Item *it;
219    Widget_Data *wd = elm_widget_data_get(data);
220    if (!wd) return;
221
222    EINA_LIST_FOREACH(wd->items, l, it)
223      {
224         if (obj == VIEW(it))
225           {
226              eina_stringshare_replace(&it->day_style, emission);
227              return ;
228           }
229      }
230 }
231
232 static void
233 _item_text_set_hook(Evas_Object *obj, const char *item, const char *label)
234 {
235    ELM_CHECK_WIDTYPE(obj, widtype);
236    Eina_List *l;
237    Elm_Dayselector_Item *it;
238    char buf[1024];
239    Widget_Data *wd = elm_widget_data_get(obj);
240    if (item && !strcmp(item, "default")) return;
241    if (!wd) return;
242
243    EINA_LIST_FOREACH(wd->items, l, it)
244      {
245         snprintf(buf, sizeof(buf), "day%d", it->day);
246         if (!strncmp(buf, item, sizeof(buf)))
247           {
248              elm_object_text_set(VIEW(it), label);
249              _sizing_eval(obj);
250              break;
251           }
252      }
253 }
254
255 static const char *
256 _item_text_get_hook(const Evas_Object *obj, const char *item)
257 {
258    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
259    Eina_List *l;
260    Elm_Dayselector_Item *it;
261    char buf[1024];
262    Widget_Data *wd = elm_widget_data_get(obj);
263    if (item && !strcmp(item, "default")) return NULL;
264    if (!wd) return NULL;
265
266    EINA_LIST_FOREACH(wd->items, l, it)
267      {
268         snprintf(buf, sizeof(buf), "day%d", it->day);
269         if (!strncmp(buf, item, sizeof(buf)))
270           return elm_object_text_get(VIEW(it));
271      }
272    return NULL;
273 }
274
275 static void
276 _content_set_hook(Evas_Object *obj, const char *item, Evas_Object *content)
277 {
278    ELM_CHECK_WIDTYPE(obj, widtype);
279    Eina_List *l;
280    Elm_Dayselector_Item *it;
281    char buf[1024];
282    unsigned int idx, loc;
283    Widget_Data *wd = elm_widget_data_get(obj);
284    if (!wd || !content) return;
285    if (item && !strcmp(item, "default")) return;
286    if(strcmp(elm_object_widget_type_get(content), "check")) return;
287
288    EINA_LIST_FOREACH(wd->items, l, it)
289      {
290         snprintf(buf, sizeof(buf), "day%d", it->day);
291         if (!strncmp(buf, item, sizeof(buf)))
292           {
293              if (VIEW(it)) evas_object_del(VIEW(it));
294              break;
295           }
296      }
297    for (idx = 0; idx < ELM_DAYSELECTOR_MAX; idx++)
298      {
299         snprintf(buf, sizeof(buf), "day%d", idx);
300         if (!strncmp(buf, item, sizeof(buf)))
301           {
302              it = elm_widget_item_new(obj, Elm_Dayselector_Item);
303              if (!it) continue;
304              VIEW(it) = content;
305              it->day = idx;
306              wd->items = eina_list_append(wd->items, it);
307              elm_widget_sub_object_add(obj, content);
308              loc = (ELM_DAYSELECTOR_MAX - wd->week_start + idx) % ELM_DAYSELECTOR_MAX;
309              snprintf(buf, sizeof(buf), "day%d", loc);
310              edje_object_part_swallow(wd->base, buf, VIEW(it));
311              snprintf(buf, sizeof(buf), "day%d,visible", loc);
312              edje_object_signal_emit(wd->base, buf, "elm");
313              evas_object_smart_callback_add(VIEW(it), "changed", _item_clicked_cb, obj);
314              evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_DEL, _item_del_cb, obj);
315              elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKDAY_DEFAULT, "", _signal_emit_cb, obj);
316              elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKDAY_STYLE1, "", _signal_emit_cb, obj);
317              elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKEND_DEFAULT, "", _signal_emit_cb, obj);
318              elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKEND_STYLE1, "", _signal_emit_cb, obj);
319              _sizing_eval(obj);
320              _update_items(obj);
321              break;
322           }
323      }
324 }
325
326 static Evas_Object *
327 _content_get_hook(const Evas_Object *obj, const char *item)
328 {
329    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
330    Eina_List *l;
331    Elm_Dayselector_Item *it;
332    char buf[1024];
333    Widget_Data *wd = elm_widget_data_get(obj);
334    if (!wd) return NULL;
335    if (item && !strcmp(item, "default")) return NULL;
336
337    EINA_LIST_FOREACH(wd->items, l, it)
338      {
339         snprintf(buf, sizeof(buf), "day%d", it->day);
340         if (!strncmp(buf, item, sizeof(buf))) return VIEW(it);
341      }
342    return NULL;
343 }
344
345 static Evas_Object *
346 _content_unset_hook(Evas_Object *obj, const char *item)
347 {
348    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
349    Eina_List *l;
350    Elm_Dayselector_Item *it;
351    Evas_Object *content;
352    char buf[1024];
353    unsigned int loc;
354    Widget_Data *wd = elm_widget_data_get(obj);
355    if (!wd) return NULL;
356    if (item && !strcmp(item, "default")) return NULL;
357
358    EINA_LIST_FOREACH(wd->items, l, it)
359      {
360         snprintf(buf, sizeof(buf), "day%d", it->day);
361         if (!strncmp(buf, item, sizeof(buf)))
362           {
363              content = VIEW(it);
364              wd->items = eina_list_remove(wd->items, it);
365              evas_object_smart_callback_del(VIEW(it), "changed", _item_clicked_cb);
366              evas_object_event_callback_del(VIEW(it), EVAS_CALLBACK_DEL, _item_del_cb);
367              edje_object_part_unswallow(wd->base, VIEW(it));
368              loc = (ELM_DAYSELECTOR_MAX - wd->week_start + it->day) % ELM_DAYSELECTOR_MAX;
369              snprintf(buf, sizeof(buf), "day%d,default", loc);
370              edje_object_signal_emit(wd->base, buf, "elm");
371              _sizing_eval(obj);
372              return content;
373           }
374      }
375    return NULL;
376 }
377
378 static void
379 _item_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
380 {
381    Eina_List *l;
382    Elm_Dayselector_Item *it;
383    Widget_Data *wd = elm_widget_data_get(data);
384    if (!wd) return;
385
386    EINA_LIST_FOREACH(wd->items, l, it)
387      {
388         if (obj == VIEW(it))
389           {
390              evas_object_smart_callback_call(data, SIG_CHANGED, (void *)it->day);
391              return ;
392           }
393      }
394 }
395
396 static Elm_Dayselector_Item *
397 _item_find(const Evas_Object *obj, Elm_Dayselector_Day day)
398 {
399    Eina_List *l;
400    Elm_Dayselector_Item *it;
401    Widget_Data* wd = elm_widget_data_get(obj);
402    if (!wd) return NULL;
403
404    EINA_LIST_FOREACH(wd->items, l, it)
405      if (day == it->day) return it;
406
407    return NULL;
408 }
409
410 static void
411 _items_style_set(Evas_Object *obj)
412 {
413    ELM_CHECK_WIDTYPE(obj, widtype);
414    Eina_List *l;
415    Elm_Dayselector_Item *it;
416    unsigned int weekend_last;
417    Widget_Data* wd = elm_widget_data_get(obj);
418    if (!wd) return;
419
420    weekend_last = wd->weekend_start + wd->weekend_len - 1;
421    if (weekend_last >= ELM_DAYSELECTOR_MAX)
422      weekend_last = weekend_last % ELM_DAYSELECTOR_MAX;
423
424    EINA_LIST_FOREACH(wd->items, l, it)
425      {
426         if (weekend_last >= wd->weekend_start)
427           {
428              if ((it->day >= wd->weekend_start) && (it->day <= weekend_last))
429                eina_stringshare_replace(&it->day_style, ITEM_TYPE_WEEKEND_DEFAULT);
430              else
431                eina_stringshare_replace(&it->day_style, ITEM_TYPE_WEEKDAY_DEFAULT);
432           }
433         else
434           {
435              if ((it->day >= wd->weekend_start) || (it->day <= weekend_last))
436                eina_stringshare_replace(&it->day_style, ITEM_TYPE_WEEKEND_DEFAULT);
437              else
438                eina_stringshare_replace(&it->day_style, ITEM_TYPE_WEEKDAY_DEFAULT);
439           }
440      }
441 }
442
443 static void
444 _update_items(Evas_Object *obj)
445 {
446    Eina_List *l;
447    Elm_Dayselector_Item *it;
448    unsigned int last_day;
449    Eina_Bool rtl;
450    Widget_Data* wd = elm_widget_data_get(obj);
451    if (!wd) return;
452
453    last_day = wd->week_start + ELM_DAYSELECTOR_MAX - 1;
454    if (last_day >= ELM_DAYSELECTOR_MAX)
455      last_day = last_day % ELM_DAYSELECTOR_MAX;
456
457    rtl = elm_widget_mirrored_get(obj);
458    EINA_LIST_FOREACH(wd->items, l, it)
459      {
460         elm_object_signal_emit(VIEW(it), it->day_style, "");
461         if (it->day == wd->week_start)
462           {
463              if (rtl) elm_object_signal_emit(VIEW(it), ITEM_POS_RIGHT, "elm");
464              else elm_object_signal_emit(VIEW(it), ITEM_POS_LEFT, "elm");
465           }
466         else if (it->day == last_day)
467           {
468              if (rtl) elm_object_signal_emit(VIEW(it), ITEM_POS_LEFT, "elm");
469              else elm_object_signal_emit(VIEW(it), ITEM_POS_RIGHT, "elm");
470           }
471         else
472           elm_object_signal_emit(VIEW(it), ITEM_POS_MIDDLE, "elm");
473      }
474 }
475
476 static void
477 _create_items(Evas_Object *obj)
478 {
479    Elm_Dayselector_Item *it;
480    struct tm time_daysel;
481    time_t t;
482    char buf[1024];
483    unsigned int idx, loc;
484    Widget_Data* wd = elm_widget_data_get(obj);
485    if (!wd) return;
486
487    t = time(NULL);
488    localtime_r(&t, &time_daysel);
489    for (idx = 0; idx < ELM_DAYSELECTOR_MAX; idx++)
490      {
491         it = elm_widget_item_new(obj, Elm_Dayselector_Item);
492         if (!it) continue;
493         VIEW(it) = elm_check_add(wd->base);
494         elm_widget_sub_object_add(obj, VIEW(it));
495         wd->items = eina_list_append(wd->items, it);
496         elm_object_style_set(VIEW(it), "dayselector/default");
497         time_daysel.tm_wday = idx;
498         strftime(buf, sizeof(buf), "%a", &time_daysel);
499         elm_object_text_set(VIEW(it), buf);
500         it->day = idx;
501         loc = (ELM_DAYSELECTOR_MAX - wd->week_start + idx) % ELM_DAYSELECTOR_MAX;
502         snprintf(buf, sizeof(buf), "day%d", loc);
503         edje_object_part_swallow(wd->base, buf, VIEW(it));
504         snprintf(buf, sizeof(buf), "day%d,visible", idx);
505         edje_object_signal_emit(wd->base, buf, "elm");
506         evas_object_smart_callback_add(VIEW(it), "changed", _item_clicked_cb, obj);
507         evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_DEL, _item_del_cb, obj);
508         elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKDAY_DEFAULT, "", _signal_emit_cb, obj);
509         elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKDAY_STYLE1, "", _signal_emit_cb, obj);
510         elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKEND_DEFAULT, "", _signal_emit_cb, obj);
511         elm_object_signal_callback_add(VIEW(it), ITEM_TYPE_WEEKEND_STYLE1, "", _signal_emit_cb, obj);
512      }
513    _items_style_set(obj);
514    _update_items(obj);
515 }
516
517 EAPI Evas_Object *
518 elm_dayselector_add(Evas_Object *parent)
519 {
520    Evas_Object *obj;
521    Evas *e;
522    Widget_Data *wd;
523
524    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
525
526    ELM_SET_WIDTYPE(widtype, "dayselector");
527    elm_widget_type_set(obj, widtype);
528    elm_widget_sub_object_add(parent, obj);
529    elm_widget_data_set(obj, wd);
530    elm_widget_del_hook_set(obj, _del_hook);
531    elm_widget_theme_hook_set(obj, _theme_hook);
532    elm_widget_disable_hook_set(obj, _disable_hook);
533    elm_widget_focus_next_hook_set(obj, _focus_next_hook);
534    elm_widget_translate_hook_set(obj, _translate_hook);
535    elm_widget_text_set_hook_set(obj, _item_text_set_hook);
536    elm_widget_text_get_hook_set(obj, _item_text_get_hook);
537    elm_widget_content_set_hook_set(obj, _content_set_hook);
538    elm_widget_content_get_hook_set(obj, _content_get_hook);
539    elm_widget_content_unset_hook_set(obj, _content_unset_hook);
540    wd->base = edje_object_add(e);
541    _elm_theme_object_set(obj, wd->base, "dayselector", "base", "default");
542    elm_object_style_set(wd->base, "dayselector");
543    elm_widget_resize_object_set(obj, wd->base);
544
545    wd->week_start = _elm_config->week_start;
546    wd->weekend_start = _elm_config->weekend_start;
547    wd->weekend_len = _elm_config->weekend_len;
548    _create_items(obj);
549
550    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _dayselector_resize, obj);
551    evas_object_smart_callbacks_descriptions_set(obj, _signals);
552    _mirrored_set(obj, elm_widget_mirrored_get(obj));
553    _sizing_eval(obj);
554    return obj;
555 }
556
557 EAPI void
558 elm_dayselector_day_selected_set(Evas_Object *obj, Elm_Dayselector_Day day, Eina_Bool selected)
559 {
560    ELM_CHECK_WIDTYPE(obj, widtype);
561    Widget_Data* wd = elm_widget_data_get(obj);
562    if (!wd) return;
563
564    elm_check_state_set(VIEW(_item_find(obj, day)), selected);
565 }
566
567 EAPI Eina_Bool
568 elm_dayselector_day_selected_get(const Evas_Object *obj, Elm_Dayselector_Day day)
569 {
570    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
571    Widget_Data* wd = elm_widget_data_get(obj);
572    if (!wd) return EINA_FALSE;
573
574    return elm_check_state_get(VIEW(_item_find(obj, day)));
575 }
576
577 EAPI void
578 elm_dayselector_week_start_set(Evas_Object *obj, Elm_Dayselector_Day day)
579 {
580    ELM_CHECK_WIDTYPE(obj, widtype);
581    Eina_List *l;
582    Elm_Dayselector_Item *it;
583    char buf[1024];
584    unsigned int loc;
585    Widget_Data* wd = elm_widget_data_get(obj);
586    if (!wd) return;
587
588    wd->week_start = day;
589    EINA_LIST_FOREACH(wd->items, l, it)
590      {
591         loc = (ELM_DAYSELECTOR_MAX - wd->week_start + it->day) % ELM_DAYSELECTOR_MAX;
592         snprintf(buf, sizeof(buf), "day%d", loc);
593         edje_object_part_swallow(wd->base, buf, VIEW(it));
594      }
595    _update_items(obj);
596 }
597
598 EAPI Elm_Dayselector_Day
599 elm_dayselector_week_start_get(const Evas_Object *obj)
600 {
601    ELM_CHECK_WIDTYPE(obj, widtype) ELM_DAYSELECTOR_MAX;
602    Widget_Data* wd = elm_widget_data_get(obj);
603    if (!wd) return ELM_DAYSELECTOR_MAX;
604
605    return wd->week_start;
606 }
607
608 EAPI void
609 elm_dayselector_weekend_start_set(Evas_Object *obj, Elm_Dayselector_Day day)
610 {
611    ELM_CHECK_WIDTYPE(obj, widtype);
612    Widget_Data* wd = elm_widget_data_get(obj);
613    if (!wd) return;
614
615    wd->weekend_start = day;
616    _items_style_set(obj);
617    _update_items(obj);
618 }
619
620 EAPI Elm_Dayselector_Day
621 elm_dayselector_weekend_start_get(const Evas_Object *obj)
622 {
623    ELM_CHECK_WIDTYPE(obj, widtype) ELM_DAYSELECTOR_MAX;
624    Widget_Data* wd = elm_widget_data_get(obj);
625    if (!wd) return ELM_DAYSELECTOR_MAX;
626
627    return wd->weekend_start;
628 }
629
630 EAPI void
631 elm_dayselector_weekend_length_set(Evas_Object *obj, unsigned int length)
632 {
633    ELM_CHECK_WIDTYPE(obj, widtype);
634    Widget_Data* wd = elm_widget_data_get(obj);
635    if (!wd) return;
636
637    wd->weekend_len = length;
638    _items_style_set(obj);
639    _update_items(obj);
640 }
641
642 EAPI unsigned int
643 elm_dayselector_weekend_length_get(const Evas_Object *obj)
644 {
645    ELM_CHECK_WIDTYPE(obj, widtype) 0;
646    Widget_Data* wd = elm_widget_data_get(obj);
647    if (!wd) return 0;
648
649    return wd->weekend_len;
650 }