make all widgets use a standard setup macro. cuts code down and
[framework/uifw/elementary.git] / src / lib / elm_diskselector.c
1 /**
2  * @defgroup Diskselector
3  *
4  * A diskselector is a kind of list widget. It scrolls horizontally,
5  * and can contain label and icon objects. Three items are displayed
6  * with the selected on the middle.
7  *
8  * It can act like a circular list with round mode and labels can be
9  * reduced for a defined lenght for side items.
10  *
11  * Signal emitted by this widget:
12  * "selected" - when item is selected (scroller stops)
13  */
14
15 #include <Elementary.h>
16 #include "elm_priv.h"
17
18 #ifndef MAX
19 # define MAX(a, b) (((a) > (b)) ? (a) : (b))
20 #endif
21
22 typedef struct _Widget_Data Widget_Data;
23
24 struct _Widget_Data
25 {
26    Evas_Object *self;
27    Evas_Object *scroller;
28    Evas_Object *main_box;
29    Evas_Object *left_blank;
30    Evas_Object *right_blank;
31    Elm_Diskselector_Item *selected_item;
32    Elm_Diskselector_Item *first;
33    Elm_Diskselector_Item *second;
34    Elm_Diskselector_Item *s_last;
35    Elm_Diskselector_Item *last;
36    Eina_List *items;
37    Eina_List *r_items;
38    int item_count, len_threshold, len_side;
39    Ecore_Idler *idler;
40    Ecore_Idler *check_idler;
41    Eina_Bool init:1;
42    Eina_Bool round:1;
43 };
44
45 struct _Elm_Diskselector_Item
46 {
47    Elm_Widget_Item base;
48    Eina_List *node;
49    Evas_Object *icon;
50    const char *label;
51    Evas_Smart_Cb func;
52 };
53
54 static const char *widtype = NULL;
55
56 #define ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, ...)                    \
57    ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
58    ELM_CHECK_WIDTYPE(it->base.widget, widtype) __VA_ARGS__;
59
60 static Eina_Bool _move_scroller(void *data);
61 static void _del_hook(Evas_Object * obj);
62 static void _del_pre_hook(Evas_Object * obj);
63 static void _sizing_eval(Evas_Object * obj);
64 static void _theme_hook(Evas_Object * obj);
65 static void _on_focus_hook(void *data, Evas_Object *obj);
66 static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info);
67 static void _sub_del(void *data, Evas_Object * obj, void *event_info);
68 static void _round_items_del(Widget_Data *wd);
69 static void _scroller_move_cb(void *data, Evas_Object *obj, void *event_info);
70
71 static const char SIG_SELECTED[] = "selected";
72 static const Evas_Smart_Cb_Description _signals[] = {
73        {SIG_SELECTED, ""},
74        {NULL, NULL}
75 };
76
77 static void
78 _diskselector_object_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
79 {
80    Widget_Data *wd;
81    Evas_Coord w, h, minw = -1, minh = -1;
82
83    wd = elm_widget_data_get(data);
84    if (!wd) return;
85
86    elm_coords_finger_size_adjust(6, &minw, 1, &minh);
87    edje_object_size_min_restricted_calc(elm_smart_scroller_edje_object_get(
88          wd->scroller), &minw, &minh, minw, minh);
89    evas_object_size_hint_min_set(obj, minw, minh);
90    evas_object_size_hint_max_set(obj, -1, -1);
91
92    evas_object_geometry_get(wd->scroller, NULL, NULL, &w, &h);
93    if (wd->round)
94      evas_object_resize(wd->main_box, w / 3 * (wd->item_count + 4), h);
95    else
96      evas_object_resize(wd->main_box, w / 3 * (wd->item_count + 2), h);
97
98    elm_smart_scroller_paging_set(wd->scroller, 0, 0,
99                                  (int)(w / 3), 0);
100
101    if (!wd->idler)
102      wd->idler = ecore_idler_add(_move_scroller, data);
103 }
104
105 static Elm_Diskselector_Item *
106 _item_new(Evas_Object *obj, Evas_Object *icon, const char *label, Evas_Smart_Cb func, const void *data)
107 {
108    Elm_Diskselector_Item *it;
109    const char *style = elm_widget_style_get(obj);
110
111    it = elm_widget_item_new(obj, Elm_Diskselector_Item);
112    if (!it) return NULL;
113
114    it->label = eina_stringshare_add(label);
115    it->icon = icon;
116    it->func = func;
117    it->base.data = data;
118    it->base.view = edje_object_add(evas_object_evas_get(obj));
119    _elm_theme_object_set(obj, it->base.view, "diskselector", "item", style);
120    evas_object_size_hint_weight_set(it->base.view, EVAS_HINT_EXPAND,
121                                     EVAS_HINT_EXPAND);
122    evas_object_size_hint_align_set(it->base.view, EVAS_HINT_FILL,
123                                    EVAS_HINT_FILL);
124    evas_object_show(it->base.view);
125
126    if (it->label)
127         edje_object_part_text_set(it->base.view, "elm.text", it->label);
128    if (it->icon)
129      {
130         evas_object_size_hint_min_set(it->icon, 24, 24);
131         evas_object_size_hint_max_set(it->icon, 40, 40);
132         edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
133         evas_object_show(it->icon);
134         elm_widget_sub_object_add(obj, it->icon);
135      }
136    return it;
137 }
138
139 static void
140 _item_del(Elm_Diskselector_Item *item)
141 {
142    if (!item) return;
143    eina_stringshare_del(item->label);
144    if (item->icon)
145      evas_object_del(item->icon);
146    elm_widget_item_del(item);
147 }
148
149 static void
150 _theme_data_get(Widget_Data *wd)
151 {
152    const char* str;
153    str = edje_object_data_get(wd->right_blank, "len_threshold");
154    if (str) wd->len_threshold = atoi(str);
155    else wd->len_threshold = 0;
156 }
157
158 static void
159 _del_hook(Evas_Object * obj)
160 {
161    Widget_Data *wd = elm_widget_data_get(obj);
162    if (!wd) return;
163    free(wd);
164 }
165
166 static void
167 _del_pre_hook(Evas_Object * obj)
168 {
169    Elm_Diskselector_Item *it;
170    Widget_Data *wd = elm_widget_data_get(obj);
171    if (!wd) return;
172
173    if (wd->left_blank)
174      evas_object_del(wd->left_blank);
175    if (wd->right_blank)
176      evas_object_del(wd->right_blank);
177    if (wd->last)
178      {
179         eina_stringshare_del(wd->last->label);
180         evas_object_del(wd->last->base.view);
181         free(wd->last);
182      }
183    if (wd->s_last)
184      {
185         eina_stringshare_del(wd->s_last->label);
186         evas_object_del(wd->s_last->base.view);
187         free(wd->s_last);
188      }
189    if (wd->second)
190      {
191         eina_stringshare_del(wd->second->label);
192         evas_object_del(wd->second->base.view);
193         free(wd->second);
194      }
195    if (wd->first)
196      {
197         eina_stringshare_del(wd->first->label);
198         evas_object_del(wd->first->base.view);
199         free(wd->first);
200      }
201
202    EINA_LIST_FREE(wd->items, it) _item_del(it);
203    eina_list_free(wd->r_items);
204 }
205
206 static void
207 _sizing_eval(Evas_Object * obj)
208 {
209    Widget_Data *wd = elm_widget_data_get(obj);
210    if (!wd) return;
211    _diskselector_object_resize(obj, NULL, obj, NULL);
212 }
213
214 static void
215 _theme_hook(Evas_Object * obj)
216 {
217    Eina_List *l;
218    Elm_Diskselector_Item *it;
219    Widget_Data *wd = elm_widget_data_get(obj);
220    if (!wd) return;
221
222    if (wd->scroller)
223      elm_smart_scroller_object_theme_set(obj, wd->scroller, "diskselector",
224                                          "base", elm_widget_style_get(obj));
225    if (wd->round)
226      {
227         EINA_LIST_FOREACH(wd->r_items, l, it)
228           {
229              _elm_theme_object_set(obj, it->base.view, "diskselector", "item",
230                                    elm_widget_style_get(obj));
231           }
232      }
233    else
234      {
235         EINA_LIST_FOREACH(wd->items, l, it)
236           {
237              _elm_theme_object_set(obj, it->base.view, "diskselector", "item",
238                                    elm_widget_style_get(obj));
239           }
240      }
241    _theme_data_get(wd);
242    _sizing_eval(obj);
243 }
244
245 static void
246 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
247 {
248    Widget_Data *wd = elm_widget_data_get(obj);
249    Evas_Object *sub = event_info;
250    Elm_Diskselector_Item *it;
251    const Eina_List *l;
252
253    if (!wd) return;
254    if (!sub) abort();
255    if (sub == wd->scroller)
256      wd->scroller = NULL;
257    else
258      {
259         EINA_LIST_FOREACH(wd->items, l, it)
260           {
261              if (sub == it->icon)
262                {
263                   it->icon = NULL;
264                   _sizing_eval(obj);
265                   break;
266                }
267           }
268      }
269 }
270
271 static void
272 _select_item(Elm_Diskselector_Item *it)
273 {
274    if (!it) return;
275    Widget_Data *wd = elm_widget_data_get(it->base.widget);
276    wd->selected_item = it;
277    if (it->func) it->func((void *)it->base.data, it->base.widget, it);
278    evas_object_smart_callback_call(it->base.widget, SIG_SELECTED, it);
279 }
280
281 static void
282 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
283 {
284    Widget_Data *wd = elm_widget_data_get(obj);
285    if (!wd)
286      return;
287
288    if (elm_widget_focus_get(obj))
289      {
290         edje_object_signal_emit(wd->self, "elm,action,focus", "elm");
291         evas_object_focus_set(wd->self, EINA_TRUE);
292      }
293    else
294      {
295         edje_object_signal_emit(wd->self, "elm,action,unfocus", "elm");
296         evas_object_focus_set(wd->self, EINA_FALSE);
297      }
298 }
299
300 static Eina_Bool
301 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
302 {
303    if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
304    Evas_Event_Key_Down *ev = event_info;
305    Widget_Data *wd = elm_widget_data_get(obj);
306    if (!wd) return EINA_FALSE;
307    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
308    if (elm_widget_disabled_get(obj)) return EINA_FALSE;
309
310    Elm_Diskselector_Item *it = NULL;
311    Eina_List *l;
312
313    if (!wd->selected_item) {
314         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
315         return EINA_TRUE;
316    }
317
318    if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")) ||
319        (!strcmp(ev->keyname, "Up"))  || (!strcmp(ev->keyname, "KP_Up")))
320      {
321         l = wd->selected_item->node->prev;
322         if ((!l) && (wd->round))
323           l = eina_list_last(wd->items);
324      }
325    else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")) ||
326             (!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
327      {
328         l = wd->selected_item->node->next;
329         if ((!l) && (wd->round))
330           l = wd->items;
331      }
332    else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
333      l = wd->items;
334    else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
335      l = eina_list_last(wd->items);
336    else return EINA_FALSE;
337
338    if (l)
339      it = eina_list_data_get(l);
340
341    if (it)
342      {
343         wd->selected_item = it;
344         if (!wd->idler)
345           wd->idler = ecore_idler_add(_move_scroller, obj);
346      }
347
348    ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
349    return EINA_TRUE;
350 }
351
352 static int
353 _check_letter(const char *str, int length)
354 {
355    int code = str[length];
356
357    if (code == '\0')
358      return length;             // null string
359    else if (((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122)))
360      return length;             // alphabet
361    else if ((48 <= code) && (code < 58))
362      return length;             // number
363    else if (((33 <= code) && (code < 47)) || ((58 <= code) && (code < 64))
364             || ((91 <= code) && (code < 96)) || ((123 <= code) && (code < 126)))
365      return length;             // special letter
366    return length - 1;
367 }
368
369 static Eina_Bool
370 _check_string(void *data)
371 {
372    int mid, steps, length, diff;
373    Elm_Diskselector_Item *it;
374    Eina_List *list, *l;
375    Evas_Coord ox, ow;
376    char buf[1024];
377    Widget_Data *wd = data;
378
379    evas_object_geometry_get(wd->scroller, &ox, NULL, &ow, NULL);
380    if (ow <= 0)
381      return EINA_FALSE;
382    if (!wd->init)
383      return EINA_FALSE;
384    if (!wd->round)
385      list = wd->items;
386    else
387      list = wd->r_items;
388
389    EINA_LIST_FOREACH(list, l, it)
390      {
391         Evas_Coord x, w;
392         int len;
393         evas_object_geometry_get(it->base.view, &x, NULL, &w, NULL);
394         /* item not visible */
395         if ((x + w <= ox) || (x >= ox + ow))
396           continue;
397
398         len = eina_stringshare_strlen(it->label);
399
400         if (x <= ox + 5)
401              edje_object_signal_emit(it->base.view, "elm,state,left_side",
402                                      "elm");
403         else if (x + w >= ox + ow - 5)
404              edje_object_signal_emit(it->base.view, "elm,state,right_side",
405                                      "elm");
406         else
407           {
408              if ((wd->len_threshold) && (len > wd->len_threshold))
409                edje_object_signal_emit(it->base.view, "elm,state,center_small",
410                                        "elm");
411              else
412                edje_object_signal_emit(it->base.view, "elm,state,center",
413                                        "elm");
414           }
415
416         if (len <= wd->len_side)
417           continue;
418
419         steps = len - wd->len_side + 1;
420         mid = x + w / 2;
421         if (mid <= ox + ow / 2)
422           diff = (ox + ow / 2) - mid;
423         else
424           diff = mid - (ox + ow / 2);
425
426         length = len - (int)(diff * steps / (ow / 3));
427         length = MAX(length, wd->len_side);
428         length = _check_letter(it->label, length);
429         strncpy(buf, it->label, length);
430         buf[length] = '\0';
431         edje_object_part_text_set(it->base.view, "elm.text", buf);
432      }
433
434    if (wd->check_idler)
435      ecore_idler_del(wd->check_idler);
436    wd->check_idler = NULL;
437    return EINA_FALSE;
438 }
439
440 static void
441 _scroller_move_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
442 {
443    Evas_Coord x, y, w, h, bw;
444    Widget_Data *wd = data;
445
446    _check_string(wd);
447    elm_smart_scroller_child_pos_get(obj, &x, &y);
448    elm_smart_scroller_child_viewport_size_get(obj, &w, &h);
449    if (wd->round)
450      {
451         evas_object_geometry_get(wd->main_box, NULL, NULL, &bw, NULL);
452         if (x > w / 3 * (wd->item_count + 1))
453           elm_smart_scroller_child_region_show(wd->scroller,
454                                                x - w / 3 * wd->item_count,
455                                                y, w, h);
456         else if (x < 0)
457           elm_smart_scroller_child_region_show(wd->scroller,
458                                                x + w / 3 * wd->item_count,
459                                                y, w, h);
460      }
461 }
462
463 static void
464 _scroller_stop_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
465 {
466    Elm_Diskselector_Item *it;
467    Widget_Data *wd = data;
468    Evas_Coord x, w, ow;
469    Eina_List *l, *list;
470
471    if (wd->idler)
472      return;
473
474    if (!wd->round)
475      list = wd->items;
476    else
477      list = wd->r_items;
478
479    evas_object_geometry_get(wd->scroller, NULL, NULL, &ow, NULL);
480    EINA_LIST_FOREACH(list, l, it)
481      {
482         evas_object_geometry_get(it->base.view, &x, NULL, &w, NULL);
483         if (abs((int)(ow / 2 - (int)(x + w / 2))) < 10)
484           break;
485      }
486
487    if (!it)
488      return;
489
490    _select_item(it);
491 }
492
493 static Eina_Bool
494 _move_scroller(void *data)
495 {
496    Evas_Object *obj = data;
497    Widget_Data *wd;
498    Eina_List *l;
499    Elm_Diskselector_Item *dit;
500    Evas_Coord y, w, h;
501    int i;
502
503    wd = elm_widget_data_get(obj);
504    if (!wd) return EINA_FALSE;
505
506    if (wd->round)
507      i = 1;
508    else
509      i = 0;
510
511    EINA_LIST_FOREACH(wd->items, l, dit)
512      {
513         if (wd->selected_item == dit)
514           break;
515         i++;
516      }
517    if (!dit)
518      {
519         wd->selected_item =
520            (Elm_Diskselector_Item *) eina_list_nth(wd->items, 0);
521         return EINA_FALSE;
522      }
523
524    evas_object_geometry_get(wd->scroller, NULL, &y, &w, &h);
525    elm_smart_scroller_child_region_show(wd->scroller, w / 3 * i, y, w, h);
526    _select_item(dit);
527    if (wd->idler)
528      {
529         ecore_idler_del(wd->idler);
530         wd->idler = NULL;
531      }
532    wd->init = EINA_TRUE;
533    _check_string(wd);
534
535    return EINA_TRUE;
536 }
537
538 static void
539 _round_item_del(Widget_Data *wd, Elm_Diskselector_Item *it)
540 {
541    if (!it) return;
542    elm_box_unpack(wd->main_box, it->base.view);
543    wd->r_items = eina_list_remove(wd->r_items, it);
544    eina_stringshare_del(it->label);
545    evas_object_del(it->base.view);
546    free(it);
547 }
548
549 static void
550 _round_items_del(Widget_Data *wd)
551 {
552    _round_item_del(wd, wd->last);
553    wd->last = NULL;
554    _round_item_del(wd, wd->s_last);
555    wd->s_last = NULL;
556    _round_item_del(wd, wd->second);
557    wd->second = NULL;
558    _round_item_del(wd, wd->first);
559    wd->first = NULL;
560 }
561
562 static void
563 _round_items_add(Widget_Data *wd)
564 {
565    Elm_Diskselector_Item *dit;
566    Elm_Diskselector_Item *it;
567
568    dit = it = eina_list_nth(wd->items, 0);
569    if (!dit) return;
570
571    if (!wd->first)
572      {
573         wd->first = _item_new(it->base.widget, it->icon, it->label, it->func,
574                               it->base.data);
575         wd->first->node = it->node;
576         wd->r_items = eina_list_append(wd->r_items, wd->first);
577      }
578
579    it = eina_list_nth(wd->items, 1);
580    if (!it)
581      it = dit;
582    if (!wd->second)
583      {
584         wd->second = _item_new(it->base.widget, it->icon, it->label, it->func,
585                                it->base.data);
586         wd->second->node = it->node;
587         wd->r_items = eina_list_append(wd->r_items, wd->second);
588      }
589
590    it = eina_list_nth(wd->items, wd->item_count - 1);
591    if (!it)
592      it = dit;
593    if (!wd->last)
594      {
595         wd->last = _item_new(it->base.widget, it->icon, it->label, it->func,
596                              it->base.data);
597         wd->last->node = it->node;
598         wd->r_items = eina_list_prepend(wd->r_items, wd->last);
599      }
600
601    it = eina_list_nth(wd->items, wd->item_count - 2);
602    if (!it)
603      it = dit;
604    if (!wd->s_last)
605      {
606         wd->s_last = _item_new(it->base.widget, it->icon, it->label, it->func,
607                                it->base.data);
608         wd->s_last->node = it->node;
609         wd->r_items = eina_list_prepend(wd->r_items, wd->s_last);
610      }
611 }
612
613 /**
614  * Add a new diskselector object
615  *
616  * @param parent The parent object
617  * @return The new object or NULL if it cannot be created
618  *
619  * @ingroup Diskselector
620  */
621 EAPI Evas_Object *
622 elm_diskselector_add(Evas_Object *parent)
623 {
624    Evas *e;
625    Evas_Object *obj;
626    Widget_Data *wd;
627
628    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
629    
630    ELM_SET_WIDTYPE(widtype, "diskselector");
631    elm_widget_type_set(obj, "diskselector");
632    elm_widget_sub_object_add(parent, obj);
633    elm_widget_data_set(obj, wd);
634    elm_widget_del_hook_set(obj, _del_hook);
635    elm_widget_del_pre_hook_set(obj, _del_pre_hook);
636    elm_widget_theme_hook_set(obj, _theme_hook);
637    elm_widget_can_focus_set(obj, EINA_TRUE);
638    elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
639    elm_widget_event_hook_set(obj, _event_hook);
640
641    wd->self = obj;
642    wd->item_count = 0;
643    wd->round = EINA_FALSE;
644    wd->init = EINA_FALSE;
645    wd->len_side = 3;
646
647    wd->scroller = elm_smart_scroller_add(e);
648    elm_smart_scroller_widget_set(wd->scroller, obj);
649    _theme_hook(obj);
650    elm_widget_resize_object_set(obj, wd->scroller);
651    elm_smart_scroller_policy_set(wd->scroller, ELM_SMART_SCROLLER_POLICY_OFF,
652                            ELM_SMART_SCROLLER_POLICY_OFF);
653    elm_smart_scroller_bounce_allow_set(wd->scroller, EINA_TRUE, EINA_FALSE);
654    evas_object_smart_callback_add(wd->scroller, "scroll", _scroller_move_cb,
655                                   wd);
656    evas_object_smart_callback_add(wd->scroller, "animate,stop",
657                                   _scroller_stop_cb, wd);
658    _elm_theme_object_set(obj, wd->scroller, "diskselector", "base",
659                          "default");
660    evas_object_event_callback_add(wd->scroller, EVAS_CALLBACK_RESIZE,
661                                   _diskselector_object_resize, obj);
662
663    wd->main_box = elm_box_add(parent);
664    elm_box_horizontal_set(wd->main_box, EINA_TRUE);
665    elm_box_homogenous_set(wd->main_box, EINA_TRUE);
666    evas_object_size_hint_weight_set(wd->main_box, EVAS_HINT_EXPAND,
667                                     EVAS_HINT_EXPAND);
668    evas_object_size_hint_align_set(wd->main_box, EVAS_HINT_FILL,
669                                    EVAS_HINT_FILL);
670    _elm_theme_object_set(obj, wd->main_box, "diskselector", "base",
671                          "default");
672    elm_widget_sub_object_add(obj, wd->main_box);
673
674    elm_smart_scroller_child_set(wd->scroller, wd->main_box);
675
676    wd->left_blank = edje_object_add(evas_object_evas_get(obj));
677    _elm_theme_object_set(obj, wd->left_blank, "diskselector", "item",
678                          "default");
679    evas_object_size_hint_weight_set(wd->left_blank, EVAS_HINT_EXPAND,
680                                     EVAS_HINT_EXPAND);
681    evas_object_size_hint_align_set(wd->left_blank, EVAS_HINT_FILL,
682                                    EVAS_HINT_FILL);
683    elm_box_pack_end(wd->main_box, wd->left_blank);
684    evas_object_show(wd->left_blank);
685
686    wd->right_blank = edje_object_add(evas_object_evas_get(obj));
687    _elm_theme_object_set(obj, wd->right_blank, "diskselector", "item",
688                          "default");
689    evas_object_size_hint_weight_set(wd->right_blank, EVAS_HINT_EXPAND,
690                                     EVAS_HINT_EXPAND);
691    evas_object_size_hint_align_set(wd->right_blank, EVAS_HINT_FILL,
692                                    EVAS_HINT_FILL);
693    elm_box_pack_end(wd->main_box, wd->right_blank);
694    evas_object_show(wd->right_blank);
695
696    _theme_data_get(wd);
697
698    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
699    evas_object_smart_callbacks_descriptions_set(obj, _signals);
700    _sizing_eval(obj);
701    return obj;
702 }
703
704 /**
705  * Get round mode
706  *
707  * If round mode is activated the items list will work like a circle list,
708  * so when the user reaches the last item, the first one will popup.
709  *
710  * @param obj The diskselector object
711  * @return if or not set round mode or false if not a valid diskselector
712  *
713  * @ingroup Diskselector
714  */
715 EAPI Eina_Bool
716 elm_diskselector_round_get(const Evas_Object *obj)
717 {
718    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
719    Widget_Data *wd = elm_widget_data_get(obj);
720    if (!wd) return EINA_FALSE;
721    return wd->round;
722 }
723
724 /**
725  * Set round mode
726  *
727  * If round mode is activated the items list will work like a circle list,
728  * so when the user reaches the last item, the first one will popup.
729  *
730  * @param it The item of diskselector
731  * @param if or not set round mode
732  *
733  * @ingroup Diskselector
734  */
735 EAPI void
736 elm_diskselector_round_set(Evas_Object * obj, Eina_Bool round)
737 {
738    ELM_CHECK_WIDTYPE(obj, widtype);
739    Widget_Data *wd = elm_widget_data_get(obj);
740    if (!wd) return;
741
742    if (wd->round == round)
743      return;
744
745    wd->round = round;
746    if (round)
747      {
748         wd->r_items = eina_list_clone(wd->items);
749         elm_box_unpack(wd->main_box, wd->left_blank);
750         evas_object_hide(wd->left_blank);
751         elm_box_unpack(wd->main_box, wd->right_blank);
752         evas_object_hide(wd->right_blank);
753         if (!wd->items)
754           return;
755
756         _round_items_add(wd);
757
758         if (wd->last)
759           elm_box_pack_start(wd->main_box, wd->last->base.view);
760         if (wd->s_last)
761           elm_box_pack_start(wd->main_box, wd->s_last->base.view);
762         if (wd->first)
763           elm_box_pack_end(wd->main_box, wd->first->base.view);
764         if (wd->second)
765           elm_box_pack_end(wd->main_box, wd->second->base.view);
766      }
767    else
768      {
769         _round_items_del(wd);
770         elm_box_pack_start(wd->main_box, wd->left_blank);
771         elm_box_pack_end(wd->main_box, wd->right_blank);
772         eina_list_free(wd->r_items);
773         wd->r_items = NULL;
774      }
775    _sizing_eval(obj);
776 }
777
778 /**
779  * Get the side labels max lenght
780  *
781  * @param obj The diskselector object
782  * @return The max lenght defined for side labels, or 0 if not a valid
783  * diskselector
784  *
785  * @ingroup Diskselector
786  */
787 EAPI int
788 elm_diskselector_side_label_lenght_get(const Evas_Object *obj)
789 {
790    ELM_CHECK_WIDTYPE(obj, widtype) 0;
791    Widget_Data *wd = elm_widget_data_get(obj);
792    if (!wd) return 0;
793    return wd->len_side;
794 }
795
796 /**
797  * Set the side labels max lenght
798  *
799  * @param obj The diskselector object
800  * @param len The max lenght defined for side labels
801  *
802  * @ingroup Diskselector
803  */
804 EAPI void
805 elm_diskselector_side_label_lenght_set(Evas_Object *obj, int len)
806 {
807    ELM_CHECK_WIDTYPE(obj, widtype);
808    Widget_Data *wd = elm_widget_data_get(obj);
809    if (!wd) return;
810    wd->len_side = len;
811 }
812
813 /**
814  * Set bounce mode
815  *
816  * This will enable or disable the scroller bounce mode for the diskselector.
817  * See elm_scroller_bounce_set() for details. Horizontal bounce is enabled by
818  * default.
819  *
820  * @param obj The diskselector object
821  * @param h_bounce Allow bounce horizontally
822  * @param v_bounce Allow bounce vertically
823  *
824  * @ingroup Diskselector
825  */
826 EAPI void
827 elm_diskselector_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce)
828 {
829    ELM_CHECK_WIDTYPE(obj, widtype);
830    Widget_Data *wd = elm_widget_data_get(obj);
831    if (!wd) return;
832    if (wd->scroller)
833      elm_smart_scroller_bounce_allow_set(wd->scroller, h_bounce, v_bounce);
834 }
835
836 /**
837  * Get the bounce mode
838  *
839  * @param obj The Diskselector object
840  * @param h_bounce Allow bounce horizontally
841  * @param v_bounce Allow bounce vertically
842  *
843  * @ingroup Diskselector
844  */
845 EAPI void
846 elm_diskselector_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce)
847 {
848    ELM_CHECK_WIDTYPE(obj, widtype);
849    Widget_Data *wd = elm_widget_data_get(obj);
850    if (!wd) return;
851    elm_smart_scroller_bounce_allow_get(wd->scroller, h_bounce, v_bounce);
852 }
853
854 /**
855  * Get the scrollbar policy
856  *
857  * This sets the scrollbar visibility policy for the given scroller.
858  * ELM_SMART_SCROLLER_POLICY_AUTO means the scrollber is made visible if it
859  * is needed, and otherwise kept hidden. ELM_SMART_SCROLLER_POLICY_ON turns
860  * it on all the time, and ELM_SMART_SCROLLER_POLICY_OFF always keeps it off.
861  * This applies respectively for the horizontal and vertical scrollbars.
862  * The both are disabled by default.
863  *
864  * @param obj The diskselector object
865  * @param policy_h Horizontal scrollbar policy
866  * @param policy_v Vertical scrollbar policy
867  *
868  * @ingroup Diskselector
869  */
870
871 EAPI void
872 elm_diskselector_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v)
873 {
874    ELM_CHECK_WIDTYPE(obj, widtype);
875    Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
876    Widget_Data *wd = elm_widget_data_get(obj);
877    if ((!wd) || (!wd->scroller)) return;
878    elm_smart_scroller_policy_get(wd->scroller, &s_policy_h, &s_policy_v);
879    *policy_h = (Elm_Scroller_Policy) s_policy_h;
880    *policy_v = (Elm_Scroller_Policy) s_policy_v;
881 }
882
883
884 /**
885  * Set the scrollbar policy
886  *
887  * This sets the scrollbar visibility policy for the given scroller.
888  * ELM_SMART_SCROLLER_POLICY_AUTO means the scrollber is made visible if it
889  * is needed, and otherwise kept hidden. ELM_SMART_SCROLLER_POLICY_ON turns
890  * it on all the time, and ELM_SMART_SCROLLER_POLICY_OFF always keeps it off.
891  * This applies respectively for the horizontal and vertical scrollbars.
892  * The both are disabled by default.
893  *
894  * @param obj The diskselector object
895  * @param policy_h Horizontal scrollbar policy
896  * @param policy_v Vertical scrollbar policy
897  *
898  * @ingroup Diskselector
899  */
900 EAPI void
901 elm_diskselector_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v)
902 {
903    ELM_CHECK_WIDTYPE(obj, widtype);
904    Widget_Data *wd = elm_widget_data_get(obj);
905    if (!wd) return;
906    if ((policy_h >= 3) || (policy_v >= 3)) return;
907    if (wd->scroller)
908      elm_smart_scroller_policy_set(wd->scroller, policy_h, policy_v);
909 }
910
911 /**
912  * Clears a diskselector of all items.
913  *
914  * @param obj The diskselector object
915  *
916  * @ingroup Diskselector
917  */
918 EAPI void
919 elm_diskselector_clear(Evas_Object *obj)
920 {
921    ELM_CHECK_WIDTYPE(obj, widtype);
922    Widget_Data *wd = elm_widget_data_get(obj);
923    Elm_Diskselector_Item *it;
924
925    if (!wd) return;
926    if (!wd->items) return;
927
928    wd->selected_item = NULL;
929    EINA_LIST_FREE(wd->items, it) _item_del(it);
930    _round_items_del(wd);
931    _sizing_eval(obj);
932 }
933
934 /**
935  * Returns a list of all the diskselector items.
936  *
937  * @param obj The diskselector object
938  * @return An Eina_List* of the diskselector items, or NULL on failure
939  *
940  * @ingroup Diskselector
941  */
942 EAPI const Eina_List *
943 elm_diskselector_items_get(const Evas_Object *obj)
944 {
945    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
946    Widget_Data *wd = elm_widget_data_get(obj);
947    if (!wd) return NULL;
948    return wd->items;
949 }
950
951 /**
952  * Appends an item to the diskselector object.
953  *
954  * @param obj The diskselector object
955  * @param label The label of the diskselector item
956  * @param icon The icon object to use for the left side of the item
957  * @param func The function to call when the item is selected
958  * @param data The data to associate with the item for related callbacks
959  *
960  * @return The created item or NULL upon failure
961  *
962  * @ingroup Diskselector
963  */
964 EAPI Elm_Diskselector_Item *
965 elm_diskselector_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Smart_Cb func, const void *data)
966 {
967    Elm_Diskselector_Item *it;
968    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
969    Widget_Data *wd = elm_widget_data_get(obj);
970    if (!wd) return NULL;
971
972    it = _item_new(obj, icon, label, func, data);
973    wd->items = eina_list_append(wd->items, it);
974    it->node = eina_list_last(wd->items);
975    wd->item_count++;
976    if (wd->round)
977      {
978         _round_items_del(wd);
979         wd->r_items = eina_list_append(wd->r_items, it);
980         _round_items_add(wd);
981         if (wd->last)
982           elm_box_pack_start(wd->main_box, wd->last->base.view);
983         if (wd->s_last)
984           elm_box_pack_start(wd->main_box, wd->s_last->base.view);
985         elm_box_pack_end(wd->main_box, it->base.view);
986         if (wd->first)
987           elm_box_pack_end(wd->main_box, wd->first->base.view);
988         if (wd->second)
989           elm_box_pack_end(wd->main_box, wd->second->base.view);
990      }
991    else
992      {
993         elm_box_unpack(wd->main_box, wd->right_blank);
994         elm_box_pack_end(wd->main_box, it->base.view);
995         elm_box_pack_end(wd->main_box, wd->right_blank);
996      }
997    if (!wd->selected_item)
998      wd->selected_item = it;
999    if (!wd->idler)
1000      wd->idler = ecore_idler_add(_move_scroller, obj);
1001    _sizing_eval(obj);
1002    return it;
1003 }
1004
1005 /**
1006  * Delete the item
1007  *
1008  * @param it The item of diskselector
1009  *
1010  * @ingroup Diskselector
1011  */
1012 EAPI void
1013 elm_diskselector_item_del(Elm_Diskselector_Item * it)
1014 {
1015    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it);
1016    Elm_Diskselector_Item *dit;
1017    Widget_Data *wd = elm_widget_data_get(it->base.widget);
1018    if (!wd) return;
1019
1020    elm_box_unpack(wd->main_box, it->base.view);
1021
1022    if (wd->round)
1023      wd->r_items = eina_list_remove(wd->r_items, it);
1024
1025    wd->items = eina_list_remove(wd->items, it);
1026
1027    if (wd->selected_item == it)
1028      {
1029         dit = (Elm_Diskselector_Item *) eina_list_nth(wd->items, 0);
1030         if (dit != it)
1031           wd->selected_item = dit;
1032         else
1033           wd->selected_item = eina_list_nth(wd->items, 1);
1034      }
1035
1036    _item_del(it);
1037    wd->item_count -= 1;
1038
1039    if (wd->round)
1040      {
1041         if (!wd->item_count)
1042           {
1043              evas_object_hide(wd->first->base.view);
1044              evas_object_hide(wd->second->base.view);
1045              evas_object_hide(wd->last->base.view);
1046              evas_object_hide(wd->s_last->base.view);
1047           }
1048         else
1049           {
1050              dit = eina_list_nth(wd->items, 0);
1051              if (dit)
1052                {
1053                   eina_stringshare_replace(&wd->first->label, dit->label);
1054                   edje_object_part_text_set(wd->first->base.view, "elm.text",
1055                                             wd->first->label);
1056                }
1057              dit = eina_list_nth(wd->items, 1);
1058              if (dit)
1059                {
1060                   eina_stringshare_replace(&wd->second->label, dit->label);
1061                   edje_object_part_text_set(wd->second->base.view, "elm.text",
1062                                             wd->second->label);
1063                }
1064              dit = eina_list_nth(wd->items, eina_list_count(wd->items) - 1);
1065              if (dit)
1066                {
1067                   eina_stringshare_replace(&wd->last->label, dit->label);
1068                   edje_object_part_text_set(wd->last->base.view, "elm.text",
1069                                             wd->last->label);
1070                }
1071              dit = eina_list_nth(wd->items, eina_list_count(wd->items) - 2);
1072              if (dit)
1073                {
1074                   eina_stringshare_replace(&wd->s_last->label, dit->label);
1075                   edje_object_part_text_set(wd->s_last->base.view, "elm.text",
1076                                             wd->s_last->label);
1077                }
1078           }
1079      }
1080    wd->check_idler = ecore_idler_add(_check_string, wd);
1081    _sizing_eval(wd->self);
1082 }
1083
1084 /**
1085  * Get the label of item
1086  *
1087  * @param it The item of diskselector
1088  * @return The label of item
1089  *
1090  * @ingroup Diskselector
1091  */
1092 EAPI const char *
1093 elm_diskselector_item_label_get(const Elm_Diskselector_Item * it)
1094 {
1095    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, NULL);
1096    return it->label;
1097 }
1098
1099 /**
1100  * Set the label of item
1101  *
1102  * @param it The item of diskselector
1103  * @param label The label of item
1104  *
1105  * @ingroup Diskselector
1106  */
1107 EAPI void
1108 elm_diskselector_item_label_set(Elm_Diskselector_Item * it, const char *label)
1109 {
1110    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it);
1111    eina_stringshare_replace(&it->label, label);
1112    edje_object_part_text_set(it->base.view, "elm.text", it->label);
1113 }
1114
1115 /**
1116  * Get the selected item
1117  *
1118  * @param obj The diskselector object
1119  * @return The selected diskselector item
1120  *
1121  * @ingroup Diskselector
1122  */
1123 EAPI Elm_Diskselector_Item *
1124 elm_diskselector_selected_item_get(const Evas_Object *obj)
1125 {
1126    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1127    Widget_Data *wd = elm_widget_data_get(obj);
1128    if (!wd) return NULL;
1129    return wd->selected_item;
1130 }
1131
1132 /**
1133  * Set the selected state of an item
1134  *
1135  * This sets the selected state (EINA_TRUE selected, EINA_FALSE not selected)
1136  * of the given item @p it.
1137  * If a new item is selected the previosly selected will be unselected.
1138  * If the item @p it is unselected, the first item will be selected.
1139  *
1140  * @param it The diskselector item
1141  * @param selected The selected state
1142  *
1143  * @ingroup Diskselector
1144  */
1145 EAPI void
1146 elm_diskselector_item_selected_set(Elm_Diskselector_Item *it, Eina_Bool selected)
1147 {
1148    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it);
1149    Widget_Data *wd;
1150    wd = elm_widget_data_get(it->base.widget);
1151    if (!wd) return;
1152
1153    if ((wd->selected_item == it) && (selected))
1154      return;
1155
1156    if ((wd->selected_item == it) && (!selected))
1157      wd->selected_item = eina_list_data_get(wd->items);
1158    else
1159      wd->selected_item = it;
1160
1161    if (!wd->idler)
1162      ecore_idler_add(_move_scroller, it->base.widget);
1163 }
1164
1165 /*
1166  * Get the selected state of @p item.
1167  *
1168  * @param it The diskselector item
1169  * @return If true, the item is selected
1170  *
1171  * @ingroup Diskselector
1172  */
1173 EAPI Eina_Bool
1174 elm_diskselector_item_selected_get(const Elm_Diskselector_Item *it)
1175 {
1176    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1177    Widget_Data *wd;
1178
1179    wd = elm_widget_data_get(it->base.widget);
1180    if (!wd) return EINA_FALSE;
1181    return (wd->selected_item == it);
1182 }
1183
1184 /**
1185  * Set the function called when a diskselector item is freed.
1186  *
1187  * @param it The item to set the callback on
1188  * @param func The function called
1189  *
1190  * @ingroup Diskselector
1191  */
1192 EAPI void
1193 elm_diskselector_item_del_cb_set(Elm_Diskselector_Item *it, Evas_Smart_Cb func)
1194 {
1195    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it);
1196    elm_widget_item_del_cb_set(it, func);
1197 }
1198
1199 /**
1200  * Returns the data associated with the item.
1201  *
1202  * @param it The diskselector item
1203  * @return The data associated with @p it
1204  *
1205  * @ingroup Diskselector
1206  */
1207 EAPI void *
1208 elm_diskselector_item_data_get(const Elm_Diskselector_Item *it)
1209 {
1210    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, NULL);
1211    return elm_widget_item_data_get(it);
1212 }
1213
1214 /**
1215  * Returns the icon associated with the item.
1216  *
1217  * @param it The diskselector item
1218  * @return The icon associated with @p it
1219  *
1220  * @ingroup Diskselector
1221  */
1222 EAPI Evas_Object *
1223 elm_diskselector_item_icon_get(const Elm_Diskselector_Item *it)
1224 {
1225    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, NULL);
1226    return it->icon;
1227 }
1228
1229 /**
1230  * Sets the icon associated with the item.
1231  *
1232  * Once the icon object is set, a previously set one will be deleted.
1233  * You probably don't want, then, to have the <b>same</b> icon object set
1234  * for more than one item of the diskselector.
1235  *
1236  * @param it The diskselector item
1237  * @param icon The icon object to associate with @p it
1238  *
1239  * @ingroup Diskselector
1240  */
1241 EAPI void
1242 elm_diskselector_item_icon_set(Elm_Diskselector_Item *it, Evas_Object *icon)
1243 {
1244    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it);
1245    if (it->icon == icon) return;
1246    if (it->icon)
1247      evas_object_del(it->icon);
1248    it->icon = icon;
1249    if (it->base.view)
1250      edje_object_part_swallow(it->base.view, "elm.swallow.icon", icon);
1251 }
1252
1253 /**
1254  * Gets the item before @p it in the list.
1255  *
1256  * @param it The diskselector item
1257  * @return The item before @p it, or NULL on failure
1258  *
1259  * @ingroup Diskselector
1260  */
1261 EAPI Elm_Diskselector_Item *
1262 elm_diskselector_item_prev_get(const Elm_Diskselector_Item *it)
1263 {
1264    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, NULL);
1265    if (it->node->prev) return it->node->prev->data;
1266    else return NULL;
1267 }
1268
1269 /**
1270  * Gets the item after @p it in the list.
1271  *
1272  * @param it The diskselector item
1273  * @return The item after @p it, or NULL on failure
1274  *
1275  * @ingroup Diskselector
1276  */
1277 EAPI Elm_Diskselector_Item *
1278 elm_diskselector_item_next_get(const Elm_Diskselector_Item *it)
1279 {
1280    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, NULL);
1281    if (it->node->next) return it->node->next->data;
1282    else return NULL;
1283 }
1284
1285 /**
1286  * Get the first item in the diskselector
1287  *
1288  * @param obj The diskselector object
1289  * @return The first item, or NULL if none
1290  *
1291  * @ingroup Diskselector
1292  */
1293 EAPI Elm_Diskselector_Item *
1294 elm_diskselector_first_item_get(const Evas_Object *obj)
1295 {
1296    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1297    Widget_Data *wd;
1298
1299    wd = elm_widget_data_get(obj);
1300    if (!wd || !wd->items)
1301      return NULL;
1302
1303    return eina_list_data_get(wd->items);
1304 }
1305
1306 /**
1307  * Get the last item in the diskselector
1308  *
1309  * @param obj The diskselector object
1310  * @return The last item, or NULL if none
1311  *
1312  * @ingroup Diskselector
1313  */
1314 EAPI Elm_Diskselector_Item *
1315 elm_diskselector_last_item_get(const Evas_Object *obj)
1316 {
1317    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1318
1319    Widget_Data *wd;
1320    wd = elm_widget_data_get(obj);
1321    if (!wd || !wd->items)
1322      return NULL;
1323
1324    return eina_list_data_get(eina_list_last(wd->items));
1325 }
1326
1327 /**
1328  * Set the text to be shown in the diskselector item.
1329  *
1330  * @param item Target item
1331  * @param text The text to set in the content
1332  *
1333  * Setup the text as tooltip to object. The item can have only one tooltip,
1334  * so any previous tooltip data is removed.
1335  *
1336  * @ingroup Diskselector
1337  */
1338 EAPI void
1339 elm_diskselector_item_tooltip_text_set(Elm_Diskselector_Item *item, const char *text)
1340 {
1341    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1342    elm_widget_item_tooltip_text_set(item, text);
1343 }
1344
1345 /**
1346  * Set the content to be shown in the tooltip item
1347  *
1348  * Setup the tooltip to item. The item can have only one tooltip,
1349  * so any previous tooltip data is removed. @p func(with @p data) will
1350  * be called every time that need show the tooltip and it should
1351  * return a valid Evas_Object. This object is then managed fully by
1352  * tooltip system and is deleted when the tooltip is gone.
1353  *
1354  * @param item the diskselector item being attached a tooltip.
1355  * @param func the function used to create the tooltip contents.
1356  * @param data what to provide to @a func as callback data/context.
1357  * @param del_cb called when data is not needed anymore, either when
1358  *        another callback replaces @func, the tooltip is unset with
1359  *        elm_diskselector_item_tooltip_unset() or the owner @a item
1360  *        dies. This callback receives as the first parameter the
1361  *        given @a data, and @c event_info is the item.
1362  *
1363  * @ingroup Diskselector
1364  */
1365 EAPI void
1366 elm_diskselector_item_tooltip_content_cb_set(Elm_Diskselector_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb)
1367 {
1368    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1369    elm_widget_item_tooltip_content_cb_set(item, func, data, del_cb);
1370 }
1371
1372 /**
1373  * Unset tooltip from item
1374  *
1375  * @param item diskselector item to remove previously set tooltip.
1376  *
1377  * Remove tooltip from item. The callback provided as del_cb to
1378  * elm_diskselector_item_tooltip_content_cb_set() will be called to notify
1379  * it is not used anymore.
1380  *
1381  * @see elm_diskselector_item_tooltip_content_cb_set()
1382  *
1383  * @ingroup Diskselector
1384  */
1385 EAPI void
1386 elm_diskselector_item_tooltip_unset(Elm_Diskselector_Item *item)
1387 {
1388    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1389    elm_widget_item_tooltip_unset(item);
1390 }
1391
1392 /**
1393  * Sets a different style for this item tooltip.
1394  *
1395  * @note before you set a style you should define a tooltip with
1396  *       elm_diskselector_item_tooltip_content_cb_set() or
1397  *       elm_diskselector_item_tooltip_text_set()
1398  *
1399  * @param item diskselector item with tooltip already set.
1400  * @param style the theme style to use (default, transparent, ...)
1401  *
1402  * @ingroup Diskselector
1403  */
1404 EAPI void
1405 elm_diskselector_item_tooltip_style_set(Elm_Diskselector_Item *item, const char *style)
1406 {
1407    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1408    elm_widget_item_tooltip_style_set(item, style);
1409 }
1410
1411 /**
1412  * Get the style for this item tooltip.
1413  *
1414  * @param item diskselector item with tooltip already set.
1415  * @return style the theme style in use, defaults to "default". If the
1416  *         object does not have a tooltip set, then NULL is returned.
1417  *
1418  * @ingroup Diskselector
1419  */
1420 EAPI const char *
1421 elm_diskselector_item_tooltip_style_get(const Elm_Diskselector_Item *item)
1422 {
1423    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item, NULL);
1424    return elm_widget_item_tooltip_style_get(item);
1425 }
1426
1427 /**
1428  * Set the cursor to be shown when mouse is over the diskselector item
1429  *
1430  * @param item Target item
1431  * @param cursor the cursor name to be used.
1432  *
1433  * @see elm_object_cursor_set()
1434  * @ingroup Diskselector
1435  */
1436 EAPI void
1437 elm_diskselector_item_cursor_set(Elm_Diskselector_Item *item, const char *cursor)
1438 {
1439    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1440    elm_widget_item_cursor_set(item, cursor);
1441 }
1442
1443 /**
1444  * Get the cursor to be shown when mouse is over the diskselector item
1445  *
1446  * @param item diskselector item with cursor already set.
1447  * @return the cursor name.
1448  *
1449  * @ingroup Diskselector
1450  */
1451 EAPI const char *
1452 elm_diskselector_item_cursor_get(const Elm_Diskselector_Item *item)
1453 {
1454    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item, NULL);
1455    return elm_widget_item_cursor_get(item);
1456 }
1457
1458 /**
1459  * Unset the cursor to be shown when mouse is over the diskselector item
1460  *
1461  * @param item Target item
1462  *
1463  * @see elm_object_cursor_unset()
1464  * @ingroup Diskselector
1465  */
1466 EAPI void
1467 elm_diskselector_item_cursor_unset(Elm_Diskselector_Item *item)
1468 {
1469    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1470    elm_widget_item_cursor_unset(item);
1471 }
1472
1473 /**
1474  * Sets a different style for this item cursor.
1475  *
1476  * @note before you set a style you should define a cursor with
1477  *       elm_diskselector_item_cursor_set()
1478  *
1479  * @param item diskselector item with cursor already set.
1480  * @param style the theme style to use (default, transparent, ...)
1481  *
1482  * @ingroup Diskselector
1483  */
1484 EAPI void
1485 elm_diskselector_item_cursor_style_set(Elm_Diskselector_Item *item, const char *style)
1486 {
1487    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1488    elm_widget_item_cursor_style_set(item, style);
1489 }
1490
1491 /**
1492  * Get the style for this item cursor.
1493  *
1494  * @param item diskselector item with cursor already set.
1495  * @return style the theme style in use, defaults to "default". If the
1496  *         object does not have a cursor set, then NULL is returned.
1497  *
1498  * @ingroup Diskselector
1499  */
1500 EAPI const char *
1501 elm_diskselector_item_cursor_style_get(const Elm_Diskselector_Item *item)
1502 {
1503    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item, NULL);
1504    return elm_widget_item_cursor_style_get(item);
1505 }
1506
1507 /**
1508  * Set if the cursor set should be searched on the theme or should use
1509  * the provided by the engine, only.
1510  *
1511  * @note before you set if should look on theme you should define a cursor
1512  * with elm_object_cursor_set(). By default it will only look for cursors
1513  * provided by the engine.
1514  *
1515  * @param item widget item with cursor already set.
1516  * @param engine_only boolean to define it cursors should be looked only
1517  * between the provided by the engine or searched on widget's theme as well.
1518  *
1519  * @ingroup Diskselector
1520  */
1521 EAPI void
1522 elm_diskselector_item_cursor_engine_only_set(Elm_Diskselector_Item *item, Eina_Bool engine_only)
1523 {
1524    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item);
1525    elm_widget_item_cursor_engine_only_set(item, engine_only);
1526 }
1527
1528 /**
1529  * Get the cursor engine only usage for this item cursor.
1530  *
1531  * @param item widget item with cursor already set.
1532  * @return engine_only boolean to define it cursors should be looked only
1533  * between the provided by the engine or searched on widget's theme as well. If
1534  *         the object does not have a cursor set, then EINA_FALSE is returned.
1535  *
1536  * @ingroup Diskselector
1537  */
1538 EAPI Eina_Bool
1539 elm_diskselector_item_cursor_engine_only_get(const Elm_Diskselector_Item *item)
1540 {
1541    ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
1542    return elm_widget_item_cursor_engine_only_get(item);
1543 }