6f755b9b55df80a7e29c724bda1c999dd22c76ef
[framework/uifw/elementary.git] / src / lib / elm_segment_control.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 typedef struct _Widget_Data Widget_Data;
5 typedef struct _Elm_Segment_Item Elm_Segment_Item;
6
7 struct _Widget_Data
8 {
9    Evas_Object *obj;
10    Evas_Object *base;
11    Eina_List *seg_items;
12    int item_count;
13    Elm_Segment_Item *selected_item;
14    int item_width;
15 };
16
17 struct _Elm_Segment_Item
18 {
19    ELM_WIDGET_ITEM;
20    Evas_Object *icon;
21    const char *label;
22    int seg_index;
23 };
24
25 static const char *widtype = NULL;
26 static void _sizing_eval(Evas_Object *obj);
27 static void _del_hook(Evas_Object *obj);
28 static void _theme_hook(Evas_Object *obj);
29 static void _disable_hook(Evas_Object *obj);
30 static void _item_free(Elm_Segment_Item *it);
31 static void _segment_off(Elm_Segment_Item *it);
32 static void _segment_on(Elm_Segment_Item *it);
33 static void _position_items(Widget_Data *wd);
34 static void _on_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj
35                             __UNUSED__, void *event_info __UNUSED__);
36 static void _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj
37                       __UNUSED__, void *event_info __UNUSED__);
38 static void _mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj
39                         __UNUSED__, void *event_info __UNUSED__);
40 static void _swallow_item_objects(Elm_Segment_Item *it);
41 static void _update_list(Widget_Data *wd);
42 static Elm_Segment_Item * _item_find(const Evas_Object *obj, int index);
43 static Elm_Segment_Item* _item_new(Evas_Object *obj, Evas_Object *icon,
44                                    const char *label);
45
46 static const char SIG_CHANGED[] = "changed";
47
48 static const Evas_Smart_Cb_Description _signals[] = {
49    {SIG_CHANGED, ""},
50    {NULL, NULL}
51 };
52
53 static void
54 _sizing_eval(Evas_Object *obj)
55 {
56    Widget_Data *wd;
57    Evas_Coord minw = -1, minh = -1;
58    Evas_Coord w, h;
59
60    wd = elm_widget_data_get(obj);
61    if (!wd) return;
62
63    elm_coords_finger_size_adjust(wd->item_count, &minw, 1, &minh);
64    edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh);
65    elm_coords_finger_size_adjust(wd->item_count, &minw, 1, &minh);
66
67    evas_object_size_hint_min_get(obj, &w, &h);
68    if (w > minw) minw = w;
69    if (h > minh) minh = h;
70    evas_object_size_hint_min_set(obj, minw, minh);
71 }
72
73 static void
74 _del_hook(Evas_Object *obj)
75 {
76    Elm_Segment_Item *it;
77    Widget_Data *wd;
78
79    wd = elm_widget_data_get(obj);
80    if (!wd) return;
81
82    EINA_LIST_FREE(wd->seg_items, it)
83      {
84         _item_free(it);
85         elm_widget_item_free(it);
86      }
87
88    free(wd);
89 }
90
91 static void
92 _theme_hook(Evas_Object *obj)
93 {
94    Eina_List *l;
95    Eina_Bool rtl;
96    Elm_Segment_Item *it;
97    Widget_Data *wd;
98
99    wd = elm_widget_data_get(obj);
100    if (!wd) return;
101
102    _elm_widget_mirrored_reload(obj);
103    rtl = elm_widget_mirrored_get(obj);
104    edje_object_mirrored_set(wd->base, rtl);
105
106    _elm_theme_object_set(obj, wd->base, "segment_control", "base",
107                          elm_widget_style_get(obj));
108    edje_object_scale_set(wd->base, elm_widget_scale_get(wd->base)
109                          *_elm_config->scale);
110
111    EINA_LIST_FOREACH(wd->seg_items, l, it)
112      {
113         _elm_theme_object_set(obj, VIEW(it), "segment_control",
114                               "item", elm_widget_style_get(obj));
115         edje_object_scale_set(VIEW(it), elm_widget_scale_get(VIEW(it))
116                               *_elm_config->scale);
117         edje_object_mirrored_set(VIEW(it), rtl);
118      }
119
120    _update_list(wd);
121 }
122
123 static void
124 _disable_hook(Evas_Object *obj)
125 {
126    Widget_Data *wd;
127
128    wd = elm_widget_data_get(obj);
129    if (!wd) return;
130    _update_list(wd);
131 }
132
133 // TODO:  Elm_widget elm_widget_focus_list_next_get  supports only Elm_widget list,
134 // Not the Elm_Widget_item. Focus switching with in widget not supported until
135 // it is supported in elm_widget
136 #if 0
137 static void *
138 _elm_list_data_get(const Eina_List *list)
139 {
140    Elm_Segment_Item *it = eina_list_data_get(list);
141
142    if (it) return NULL;
143
144    edje_object_signal_emit(VIEW(it), "elm,state,segment,selected", "elm");
145    return VIEW(it);
146 }
147
148 static Eina_Bool
149 _focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir,
150                  Evas_Object **next)
151 {
152    static int count=0;
153    Widget_Data *;
154    const Eina_List *items;
155    void *(*list_data_get) (const Eina_List *list);
156
157    wd = elm_widget_data_get(obj);
158    if ((!wd)) return EINA_FALSE;
159
160    /* Focus chain */
161    /* TODO: Change this to use other chain */
162    if ((items = elm_widget_focus_custom_chain_get(obj)))
163      list_data_get = eina_list_data_get;
164    else
165      {
166         items = wd->seg_items;
167         list_data_get = _elm_list_data_get;
168         if (!items) return EINA_FALSE;
169      }
170    return elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
171 }
172 #endif
173
174 static void
175 _item_free(Elm_Segment_Item *it)
176 {
177    Widget_Data *wd;
178
179    if (!it) return;
180
181    wd = elm_widget_item_data_get(it);
182    if (!wd) return;
183
184    if (wd->selected_item == it) wd->selected_item = NULL;
185    if (wd->seg_items) wd->seg_items = eina_list_remove(wd->seg_items, it);
186
187    if (it->icon) evas_object_del(it->icon);
188    if (it->label) eina_stringshare_del(it->label);
189 }
190
191 static void
192 _segment_off(Elm_Segment_Item *it)
193 {
194    Widget_Data *wd;
195
196    if (!it) return;
197
198    wd = elm_widget_item_data_get(it);
199    if (!wd) return;
200
201    edje_object_signal_emit(VIEW(it), "elm,state,segment,normal", "elm");
202
203    if (wd->selected_item == it) wd->selected_item = NULL;
204 }
205
206 static void
207 _segment_on(Elm_Segment_Item *it)
208 {
209    Widget_Data *wd;
210
211    if (!it) return;
212
213    wd = elm_widget_item_data_get(it);
214    if (!wd) return;
215    if (it == wd->selected_item) return;
216
217    if (wd->selected_item) _segment_off(wd->selected_item);
218
219    edje_object_signal_emit(VIEW(it), "elm,state,segment,selected", "elm");
220
221    wd->selected_item = it;
222    evas_object_smart_callback_call(wd->obj, SIG_CHANGED, it);
223 }
224
225 static void
226 _position_items(Widget_Data *wd)
227 {
228    Eina_List *l;
229    Elm_Segment_Item *it;
230    Eina_Bool rtl;
231    int bx, by, bw, bh, pos;
232
233    wd->item_count = eina_list_count(wd->seg_items);
234    if (wd->item_count <= 0) return;
235
236    evas_object_geometry_get(wd->base, &bx, &by, &bw, &bh);
237    wd->item_width = bw / wd->item_count;
238    rtl = elm_widget_mirrored_get(wd->obj);
239
240    if (rtl)
241      pos = bx + bw - wd->item_width;
242    else
243      pos = bx;
244
245    EINA_LIST_FOREACH(wd->seg_items, l, it)
246      {
247         evas_object_move(VIEW(it), pos, by);
248         evas_object_resize(VIEW(it), wd->item_width, bh);
249         if (rtl)
250           pos -= wd->item_width;
251         else
252           pos += wd->item_width;
253      }
254    _sizing_eval(wd->obj);
255 }
256
257 static void
258 _on_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
259                 void *event_info __UNUSED__)
260 {
261    Widget_Data *wd;
262
263    wd = elm_widget_data_get(data);
264    if (!wd) return;
265
266    _position_items(wd);
267
268 }
269
270 static void
271 _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
272           void *event_info)
273 {
274    Widget_Data *wd;
275    Elm_Segment_Item *it;
276    Evas_Event_Mouse_Up *ev;
277    Evas_Coord x, y, w, h;
278
279    it = data;
280    if (!it) return;
281
282    wd = elm_widget_item_data_get(it);
283    if (!wd) return;
284
285    if (elm_widget_disabled_get(wd->obj)) return;
286
287    if (it == wd->selected_item) return;
288
289    ev = event_info;
290    evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
291
292    if ((ev->canvas.x >= x) && (ev->output.x <= (x + w)) && (ev->canvas.y >= y)
293        && (ev->canvas.y <= (y + h)))
294      _segment_on(it);
295    else
296      edje_object_signal_emit(VIEW(it), "elm,state,segment,normal", "elm");
297 }
298
299 static void
300 _mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
301             void *event_info __UNUSED__)
302 {
303    Widget_Data *wd;
304    Elm_Segment_Item *it;
305
306    it = data;
307    if (!it) return;
308
309    wd = elm_widget_item_data_get(it);
310    if (!wd) return;
311
312    if (elm_widget_disabled_get(wd->obj)) return;
313
314    if (it == wd->selected_item) return;
315
316    edje_object_signal_emit(VIEW(it), "elm,state,segment,pressed", "elm");
317 }
318
319 static void
320 _swallow_item_objects(Elm_Segment_Item *it)
321 {
322    if (!it) return;
323
324    if (it->icon)
325      {
326         edje_object_part_swallow(VIEW(it), "elm.swallow.icon", it->icon);
327         edje_object_signal_emit(VIEW(it), "elm,state,icon,visible", "elm");
328      }
329    else
330      edje_object_signal_emit(VIEW(it), "elm,state,icon,hidden", "elm");
331
332    if (it->label)
333      {
334         edje_object_part_text_set(VIEW(it), "elm.text", it->label);
335         edje_object_signal_emit(VIEW(it), "elm,state,text,visible", "elm");
336      }
337    else
338      edje_object_signal_emit(VIEW(it), "elm,state,text,hidden", "elm");
339    edje_object_message_signal_process(VIEW(it));
340 }
341
342 static void
343 _update_list(Widget_Data *wd)
344 {
345    Eina_List *l;
346    Elm_Segment_Item *it;
347    Eina_Bool rtl;
348    int idx = 0;
349
350    _position_items(wd);
351
352    if (wd->item_count == 1)
353      {
354         it = eina_list_nth(wd->seg_items, 0);
355         it->seg_index = 0;
356
357         //Set the segment type
358         edje_object_signal_emit(VIEW(it),
359                                 "elm,type,segment,single", "elm");
360
361         //Set the segment state
362         if (wd->selected_item == it)
363           edje_object_signal_emit(VIEW(it),
364                                   "elm,state,segment,selected", "elm");
365         else
366           edje_object_signal_emit(VIEW(it),
367                                   "elm,state,segment,normal", "elm");
368
369         if (elm_widget_disabled_get(wd->obj))
370           edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
371         else
372           edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
373
374         _swallow_item_objects(it);
375         return;
376      }
377
378    rtl = elm_widget_mirrored_get(wd->obj);
379    EINA_LIST_FOREACH(wd->seg_items, l, it)
380      {
381         it->seg_index = idx;
382
383         //Set the segment type
384         if (idx == 0)
385           {
386              if (rtl)
387                edje_object_signal_emit(VIEW(it),
388                                        "elm,type,segment,right", "elm");
389              else
390                edje_object_signal_emit(VIEW(it),
391                                        "elm,type,segment,left", "elm");
392           }
393         else if (idx == (wd->item_count - 1))
394           {
395              if (rtl)
396                edje_object_signal_emit(VIEW(it),
397                                        "elm,type,segment,left", "elm");
398              else
399                edje_object_signal_emit(VIEW(it),
400                                        "elm,type,segment,right", "elm");
401           }
402         else
403           edje_object_signal_emit(VIEW(it),
404                                   "elm,type,segment,middle", "elm");
405
406         //Set the segment state
407         if (wd->selected_item == it)
408           edje_object_signal_emit(VIEW(it),
409                                   "elm,state,segment,selected", "elm");
410         else
411           edje_object_signal_emit(VIEW(it),
412                                   "elm,state,segment,normal", "elm");
413
414         if (elm_widget_disabled_get(wd->obj))
415           edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
416         else
417           edje_object_signal_emit(VIEW(it), "elm,state,enabled", "elm");
418
419         _swallow_item_objects(it);
420         idx++;
421      }
422 }
423
424 static Elm_Segment_Item *
425 _item_find(const Evas_Object *obj, int idx)
426 {
427    Widget_Data *wd;
428    Elm_Segment_Item *it;
429
430    wd = elm_widget_data_get(obj);
431    if (!wd) return NULL;
432
433    it = eina_list_nth(wd->seg_items, idx);
434    return it;
435 }
436
437 static void
438 _item_text_set_hook(Elm_Object_Item *it, const char *part, const char *label)
439 {
440 <<<<<<< HEAD
441    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
442 =======
443 >>>>>>> remotes/origin/upstream
444    Widget_Data *wd;
445    Elm_Segment_Item *item;
446
447    if (part && strcmp(part, "default")) return;
448
449 <<<<<<< HEAD
450    item = (Elm_Segment_Item *) it;
451 =======
452    item = (Elm_Segment_Item *)it;
453 >>>>>>> remotes/origin/upstream
454    wd = elm_widget_item_data_get(item);
455    if (!wd) return;
456
457    eina_stringshare_replace(&item->label, label);
458    if (item->label)
459      edje_object_signal_emit(VIEW(item), "elm,state,text,visible", "elm");
460    else
461      edje_object_signal_emit(VIEW(item), "elm,state,text,hidden", "elm");
462    edje_object_message_signal_process(VIEW(item));
463    //label can be NULL also.
464    edje_object_part_text_set(VIEW(item), "elm.text", item->label);
465 }
466
467 static const char *
468 _item_text_get_hook(const Elm_Object_Item *it, const char *part)
469 {
470 <<<<<<< HEAD
471    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
472    if (part && strcmp(part, "default")) return NULL;
473    return ((Elm_Segment_Item *) it)->label;
474 =======
475    if (part && strcmp(part, "default")) return NULL;
476    return ((Elm_Segment_Item *)it)->label;
477 >>>>>>> remotes/origin/upstream
478 }
479
480 static void
481 _item_content_set_hook(Elm_Object_Item *it,
482                        const char *part,
483                        Evas_Object *content)
484 {
485 <<<<<<< HEAD
486    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
487 =======
488 >>>>>>> remotes/origin/upstream
489    Elm_Segment_Item *item;
490
491    if (part && strcmp(part, "icon")) return;
492
493 <<<<<<< HEAD
494    item = (Elm_Segment_Item *) it;
495 =======
496    item = (Elm_Segment_Item *)it;
497 >>>>>>> remotes/origin/upstream
498
499    //Remove the existing icon
500    if (item->icon)
501      {
502         edje_object_part_unswallow(VIEW(item), item->icon);
503         evas_object_del(item->icon);
504         item->icon = NULL;
505      }
506    item->icon = content;
507    if (item->icon)
508      {
509         elm_widget_sub_object_add(VIEW(item), item->icon);
510         edje_object_part_swallow(VIEW(item), "elm.swallow.icon", item->icon);
511         edje_object_signal_emit(VIEW(item), "elm,state,icon,visible", "elm");
512      }
513    else
514      edje_object_signal_emit(VIEW(item), "elm,state,icon,hidden", "elm");
515 }
516
517 static Evas_Object *
518 _item_content_get_hook(const Elm_Object_Item *it, const char *part)
519 {
520 <<<<<<< HEAD
521    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
522    if (part && strcmp(part, "icon")) return NULL;
523    return ((Elm_Segment_Item *) it)->icon;
524 =======
525    if (part && strcmp(part, "icon")) return NULL;
526    return ((Elm_Segment_Item *)it)->icon;
527 >>>>>>> remotes/origin/upstream
528 }
529
530 static Eina_Bool
531 _item_del_pre_hook(Elm_Object_Item *it)
532 {
533 <<<<<<< HEAD
534    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
535    Widget_Data *wd;
536    Elm_Segment_Item *item = (Elm_Segment_Item *) it;
537 =======
538    Widget_Data *wd;
539    Elm_Segment_Item *item = (Elm_Segment_Item *)it;
540 >>>>>>> remotes/origin/upstream
541
542    wd = elm_widget_item_data_get(item);
543    if (!wd) return EINA_FALSE;
544
545    _item_free(item);
546    _update_list(wd);
547
548    return EINA_TRUE;
549 }
550
551 static Elm_Segment_Item*
552 _item_new(Evas_Object *obj, Evas_Object *icon, const char *label)
553 {
554    Elm_Segment_Item *it;
555    Widget_Data *wd;
556
557    wd = elm_widget_data_get(obj);
558    if (!wd) return NULL;
559
560    it = elm_widget_item_new(obj, Elm_Segment_Item);
561    if (!it) return NULL;
562    elm_widget_item_data_set(it, wd);
563    elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
564    elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
565    elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
566    elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
567    elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
568
569    VIEW(it) = edje_object_add(evas_object_evas_get(obj));
570    edje_object_scale_set(VIEW(it), elm_widget_scale_get(VIEW(it))
571                          *_elm_config->scale);
572    evas_object_smart_member_add(VIEW(it), obj);
573    elm_widget_sub_object_add(obj, VIEW(it));
574    evas_object_clip_set(VIEW(it), evas_object_clip_get(obj));
575
576    _elm_theme_object_set(obj, VIEW(it), "segment_control", "item",
577                          elm_object_style_get(obj));
578    edje_object_mirrored_set(VIEW(it),
579                             elm_widget_mirrored_get(WIDGET(it)));
580
581    if (label)
582      eina_stringshare_replace(&it->label, label);
583    if (it->label)
584      edje_object_signal_emit(VIEW(it), "elm,state,text,visible", "elm");
585    else
586      edje_object_signal_emit(VIEW(it), "elm,state,text,hidden", "elm");
587    edje_object_message_signal_process(VIEW(it));
588    edje_object_part_text_set(VIEW(it), "elm.text", label);
589
590    it->icon = icon;
591    if (it->icon) elm_widget_sub_object_add(VIEW(it), it->icon);
592    evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
593                                   _mouse_down, it);
594    evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
595                                   _mouse_up, it);
596    evas_object_show(VIEW(it));
597
598    return it;
599 }
600
601 EAPI Evas_Object *
602 elm_segment_control_add(Evas_Object *parent)
603 {
604    Evas_Object *obj;
605    Evas *e;
606    Widget_Data *wd;
607
608    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
609
610    ELM_SET_WIDTYPE(widtype, "segment_control");
611    elm_widget_type_set(obj, "segment_control");
612    elm_widget_sub_object_add(parent, obj);
613    elm_widget_data_set(obj, wd);
614    elm_widget_del_hook_set(obj, _del_hook);
615    elm_widget_theme_hook_set(obj, _theme_hook);
616    elm_widget_disable_hook_set(obj, _disable_hook);
617
618    // TODO: Focus switch support to Elm_widget_Item not supported yet.
619 #if 0
620    elm_widget_focus_next_hook_set(obj, _focus_next_hook);
621 #endif
622
623    wd->obj = obj;
624
625    wd->base = edje_object_add(e);
626    edje_object_scale_set(wd->base, elm_widget_scale_get(wd->base)
627                          *_elm_config->scale);
628    _elm_theme_object_set(obj, wd->base, "segment_control", "base", "default");
629    elm_widget_resize_object_set(obj, wd->base);
630
631    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
632                                   _on_move_resize, obj);
633    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
634                                   _on_move_resize, obj);
635
636    evas_object_smart_callbacks_descriptions_set(obj, _signals);
637
638    return obj;
639 }
640
641 EAPI Elm_Object_Item *
642 elm_segment_control_item_add(Evas_Object *obj, Evas_Object *icon,
643                              const char *label)
644 {
645    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
646    Elm_Segment_Item *it;
647    Widget_Data *wd;
648
649    wd = elm_widget_data_get(obj);
650    if (!wd) return NULL;
651
652    it = _item_new(obj, icon, label);
653    if (!it) return NULL;
654
655    wd->seg_items = eina_list_append(wd->seg_items, it);
656    _update_list(wd);
657
658 <<<<<<< HEAD
659    return (Elm_Object_Item *) it;
660 =======
661    return (Elm_Object_Item *)it;
662 >>>>>>> remotes/origin/upstream
663 }
664
665 EAPI Elm_Object_Item *
666 elm_segment_control_item_insert_at(Evas_Object *obj, Evas_Object *icon,
667                                    const char *label, int idx)
668 {
669    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
670    Elm_Segment_Item *it, *it_rel;
671    Widget_Data *wd;
672
673    wd = elm_widget_data_get(obj);
674    if (!wd) return NULL;
675    if (idx < 0) idx = 0;
676
677    it = _item_new(obj, icon, label);
678    if (!it) return NULL;
679
680    it_rel = _item_find(obj, idx);
681    if (it_rel)
682      wd->seg_items = eina_list_prepend_relative(wd->seg_items, it, it_rel);
683    else
684      wd->seg_items = eina_list_append(wd->seg_items, it);
685
686    _update_list(wd);
687 <<<<<<< HEAD
688    return (Elm_Object_Item *) it;
689 =======
690    return (Elm_Object_Item *)it;
691 >>>>>>> remotes/origin/upstream
692 }
693
694 EAPI void
695 elm_segment_control_item_del(Elm_Object_Item *it)
696 {
697    elm_object_item_del(it);
698 }
699
700 EAPI void
701 elm_segment_control_item_del_at(Evas_Object *obj, int idx)
702 {
703    ELM_CHECK_WIDTYPE(obj, widtype);
704    Elm_Segment_Item *it;
705    Widget_Data *wd;
706
707    wd = elm_widget_data_get(obj);
708    if (!wd) return;
709
710    it = _item_find(obj, idx);
711    if (!it) return;
712 <<<<<<< HEAD
713    elm_object_item_del((Elm_Object_Item *) it);
714 =======
715    elm_object_item_del((Elm_Object_Item *)it);
716 >>>>>>> remotes/origin/upstream
717 }
718
719 EAPI const char*
720 elm_segment_control_item_label_get(const Evas_Object *obj, int idx)
721 {
722    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
723    Elm_Segment_Item *it = _item_find(obj, idx);
724    if (it) return it->label;
725    return NULL;
726 }
727
728 EAPI void
729 elm_segment_control_item_label_set(Elm_Object_Item* it, const char* label)
730 {
731    _item_text_set_hook(it, NULL, label);
732 }
733
734 EAPI Evas_Object *
735 elm_segment_control_item_icon_get(const Evas_Object *obj, int idx)
736 {
737    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
738    Elm_Segment_Item *it = _item_find(obj, idx);
739    if (it) return it->icon;
740    return NULL;
741 }
742
743 EAPI void
744 elm_segment_control_item_icon_set(Elm_Object_Item *it, Evas_Object *icon)
745 {
746    _item_content_set_hook(it, NULL, icon);
747 }
748
749 EAPI int
750 elm_segment_control_item_count_get(const Evas_Object *obj)
751 {
752    ELM_CHECK_WIDTYPE(obj, widtype) 0;
753    Widget_Data *wd;
754
755    wd = elm_widget_data_get(obj);
756    if (!wd) return 0;
757
758    return eina_list_count(wd->seg_items);
759 }
760
761 EAPI Evas_Object*
762 elm_segment_control_item_object_get(const Elm_Object_Item *it)
763 {
764    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
765    return VIEW(it);
766 }
767
768 EAPI Elm_Object_Item*
769 elm_segment_control_item_selected_get(const Evas_Object *obj)
770 {
771    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
772    Widget_Data *wd = elm_widget_data_get(obj);
773    if (!wd) return NULL;
774    return (Elm_Object_Item *) wd->selected_item;
775 }
776
777 EAPI void
778 elm_segment_control_item_selected_set(Elm_Object_Item *it, Eina_Bool selected)
779 {
780    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
781    Widget_Data *wd;
782 <<<<<<< HEAD
783    Elm_Segment_Item *item = (Elm_Segment_Item *) it;
784 =======
785    Elm_Segment_Item *item = (Elm_Segment_Item *)it;
786 >>>>>>> remotes/origin/upstream
787
788    wd = elm_widget_item_data_get(item);
789    if (!wd) return;
790
791    if (item == wd->selected_item)
792      {
793         //already in selected state.
794         if (selected) return;
795
796         //unselect case
797         _segment_off(item);
798      }
799    else if (selected)
800      _segment_on(item);
801
802    return;
803 }
804
805 EAPI Elm_Object_Item *
806 elm_segment_control_item_get(const Evas_Object *obj, int idx)
807 {
808    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
809    return (Elm_Object_Item *) _item_find(obj, idx);
810 }
811
812 EAPI int
813 elm_segment_control_item_index_get(const Elm_Object_Item *it)
814 {
815    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, -1);
816 <<<<<<< HEAD
817    return ((Elm_Segment_Item *) it)->seg_index;
818 =======
819    return ((Elm_Segment_Item *)it)->seg_index;
820 >>>>>>> remotes/origin/upstream
821 }