Merge branch 'master' of 165.213.180.234:/slp/pkgs/e/elementary
[framework/uifw/elementary.git] / src / lib / elm_segment_control.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 /**
5  * @defgroup SegmentControl SegmentControl
6  * @ingroup Elementary
7  *
8  * SegmentControl Widget is a horizontal control made of multiple segments, each segment item
9  * functioning similar to discrete two state button. A segmented control affords a compact means to group together a number of controls.
10  * Only one Segment item can be at selected state. A segmented control item can display combination of Text and any Evas_Object like layout or other widget.
11  */
12 typedef struct _Widget_Data Widget_Data;
13
14 struct _Widget_Data
15 {
16    Evas_Object *obj;
17    Evas_Object *base;
18    Eina_List *seg_items;
19    int item_count;
20    Elm_Segment_Item *selected_item;
21    int item_width;
22 };
23
24 struct _Elm_Segment_Item
25 {
26    Elm_Widget_Item base;
27    Evas_Object *icon;
28    Evas_Object *label;
29    int seg_index;
30 };
31
32 static const char *widtype = NULL;
33 static void _sizing_eval(Evas_Object *obj);
34 static void _del_hook(Evas_Object *obj);
35 static void _theme_hook(Evas_Object *obj);
36 static void _disable_hook(Evas_Object *obj);
37 static void _item_free(Elm_Segment_Item *it);
38 static void _segment_off(Elm_Segment_Item *it);
39 static void _segment_on(Elm_Segment_Item *it);
40 static void _position_items(Widget_Data *wd);
41 static void _on_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
42                 void *event_info __UNUSED__);
43 static void _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
44                 void *event_info __UNUSED__);
45 static void _mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
46                 void *event_info __UNUSED__);
47 static void _swallow_item_objects(Elm_Segment_Item *it);
48 static void _update_list(Widget_Data *wd);
49 static Elm_Segment_Item * _item_find(const Evas_Object *obj, int index);
50 static Elm_Segment_Item* _item_new(Evas_Object *obj, Evas_Object *icon, const char *label );
51
52 static void
53 _sizing_eval(Evas_Object *obj)
54 {
55    Widget_Data *wd;
56    Evas_Coord minw = -1, minh = -1;
57    Evas_Coord w, h;
58
59    wd = elm_widget_data_get(obj);
60    if (!wd) return;
61
62    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
63    edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh);
64    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
65
66    evas_object_size_hint_min_get(obj, &w, &h);
67    if (w > minw) minw = w;
68    if (h > minh) minh = h;
69    evas_object_size_hint_min_set(obj, minw, minh);
70 }
71
72 static void
73 _del_hook(Evas_Object *obj)
74 {
75    Elm_Segment_Item *it;
76    Widget_Data *wd;
77
78    wd = elm_widget_data_get(obj);
79    if (!wd) return;
80
81    EINA_LIST_FREE(wd->seg_items, it) _item_free(it);
82
83    free(wd);
84 }
85
86 static void
87 _theme_hook(Evas_Object *obj)
88 {
89    Eina_List *l;
90    Elm_Segment_Item *it;
91    Widget_Data *wd;
92
93    wd = elm_widget_data_get(obj);
94    if (!wd) return;
95
96    _elm_theme_object_set(obj, wd->base, "segment_control", "base", elm_widget_style_get(obj));
97    edje_object_scale_set(wd->base, elm_widget_scale_get(wd->base) *_elm_config->scale);
98
99    EINA_LIST_FOREACH(wd->seg_items, l, it)
100      {
101         _elm_theme_object_set(obj, it->base.view, "segment_control", "item", elm_widget_style_get(obj));
102         edje_object_scale_set(it->base.view, elm_widget_scale_get(it->base.view) *_elm_config->scale);
103      }
104
105    _update_list(wd);
106    _sizing_eval(obj);
107 }
108
109 static void
110 _disable_hook(Evas_Object *obj)
111 {
112    Widget_Data *wd;
113
114    wd = elm_widget_data_get(obj);
115    if (!wd) return;
116    _update_list(wd);
117 }
118
119 #if 0
120 static void *
121 _elm_list_data_get(const Eina_List *list)
122 {
123    Elm_Segment_Item *it = eina_list_data_get(list);
124
125    if (it) return NULL;
126
127    edje_object_signal_emit(it->base.view, "elm,state,segment,selected", "elm");
128    return it->base.view;
129 }
130
131 /* TODO Can focus stay on Evas_Object which is not a elm_widget ?? */
132 static Eina_Bool
133 _focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next)
134 {
135    static int count=0;
136    Widget_Data *;
137    const Eina_List *items;
138    void *(*list_data_get) (const Eina_List *list);
139
140    wd = elm_widget_data_get(obj)
141    if ((!wd)) return EINA_FALSE;
142
143    /* Focus chain */
144    /* TODO: Change this to use other chain */
145    if ((items = elm_widget_focus_custom_chain_get(obj)))
146      list_data_get = eina_list_data_get;
147    else
148      {
149         items = wd->seg_items;
150         list_data_get = _elm_list_data_get;
151         if (!items) return EINA_FALSE;
152      }
153    return elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
154 }
155 #endif
156
157 static void
158 _item_free(Elm_Segment_Item *it)
159 {
160    Widget_Data *wd;
161
162    if (!it) return;
163
164    wd = elm_widget_item_data_get(it);
165    if (!wd) return;
166
167    if(wd->selected_item == it) wd->selected_item = NULL;
168    if(wd->seg_items) wd->seg_items = eina_list_remove(wd->seg_items, it);
169
170    elm_widget_item_pre_notify_del(it);
171
172    if (it->icon) evas_object_del(it->icon);
173    if (it->label) evas_object_del(it->label);
174
175    elm_widget_item_del(it);
176 }
177
178 static void
179 _segment_off(Elm_Segment_Item *it)
180 {
181    Widget_Data *wd;
182    char buf[4096];
183
184    if (!it) return;
185
186    wd = elm_widget_item_data_get(it);
187    if (!wd) return;
188
189    edje_object_signal_emit(it->base.view, "elm,state,segment,normal", "elm");
190    if (it->label)
191      {
192         snprintf(buf, sizeof(buf), "%s/segment_normal", elm_widget_style_get(wd->obj));
193         elm_object_style_set(it->label, buf);
194      }
195
196    if (wd->selected_item == it) wd->selected_item = NULL;
197 }
198
199 static void
200 _segment_on(Elm_Segment_Item *it)
201 {
202    Widget_Data *wd;
203    char buf[4096];
204
205    if (!it) return;
206
207    wd = elm_widget_item_data_get(it);
208    if (!wd) return;
209    if (it == wd->selected_item) return;
210
211    if (wd->selected_item) _segment_off(wd->selected_item);
212
213    edje_object_signal_emit(it->base.view, "elm,state,segment,selected", "elm");
214    if (it->label)
215      {
216         snprintf(buf, sizeof(buf), "%s/segment_selected", elm_widget_style_get(wd->obj));
217         elm_object_style_set(it->label, buf);
218      }
219
220    wd->selected_item = it;
221    evas_object_smart_callback_call(wd->obj, "changed", (void*) it->seg_index);
222 }
223
224 static void
225 _position_items(Widget_Data *wd)
226 {
227    Eina_List *l;
228    Elm_Segment_Item *it;
229    int bx, by, bw, bh, position;
230
231    wd->item_count = eina_list_count(wd->seg_items);
232    if (wd->item_count <= 0) return;
233
234    evas_object_geometry_get(wd->base, &bx, &by, &bw, &bh);
235    wd->item_width = bw / wd->item_count;
236
237    position = bx;
238    EINA_LIST_FOREACH(wd->seg_items, l, it)
239      {
240         evas_object_move(it->base.view, bx, by );
241         evas_object_resize(it->base.view, wd->item_width, bh );
242         bx += wd->item_width;
243      }
244 }
245
246 static void
247 _on_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
248                 void *event_info __UNUSED__)
249 {
250    Widget_Data *wd;
251    Evas_Coord law = 0, lah = 0;
252    Eina_List *l;
253    Elm_Segment_Item *it = NULL;
254    const char *lbl_area;
255
256    wd = elm_widget_data_get(data);
257    if (!wd) return;
258
259    _position_items(wd);
260
261    EINA_LIST_FOREACH(wd->seg_items, l, it)
262      {
263         lbl_area = edje_object_data_get(it->base.view, "label.wrap.part");
264         if (it->label && lbl_area)
265           {
266              edje_object_part_geometry_get(it->base.view, lbl_area, NULL, NULL, &law, &lah);
267              elm_label_wrap_width_set(it->label, law);
268              elm_label_wrap_height_set(it->label, lah);
269           }
270      }
271 }
272
273 static void
274 _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
275           void *event_info)
276 {
277    Widget_Data *wd;
278    Elm_Segment_Item *it;
279    Evas_Event_Mouse_Up *ev;
280    Evas_Coord x, y, w, h;
281    char buf[4096];
282
283    it = data;
284    if (!it) return;
285
286    wd = elm_widget_item_data_get(it);
287    if (!wd) return;
288
289    if (elm_widget_disabled_get(wd->obj)) return;
290
291    if (it == wd->selected_item) return;
292
293    ev = event_info;
294    evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
295
296    if((ev->output.x > x) && (ev->output.x < (x+w)) && (ev->output.y > y) && (ev->output.y < (y+h)))
297      _segment_on(it);
298    else
299      {
300         edje_object_signal_emit(it->base.view, "elm,state,segment,normal", "elm");
301         if (it->label)
302           {
303              snprintf(buf, sizeof(buf), "%s/segment_normal", elm_widget_style_get(obj));
304              elm_object_style_set(it->label, buf);
305           }
306      }
307 }
308
309 static void
310 _mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
311             void *event_info __UNUSED__)
312 {
313    Widget_Data *wd;
314    Elm_Segment_Item *it;
315    char buf[4096];
316
317    it = data;
318    if (!it) return;
319
320    wd = elm_widget_item_data_get(it);
321    if (!wd) return;
322
323    if (elm_widget_disabled_get(wd->obj)) return;
324
325    if (it == wd->selected_item) return;
326
327    edje_object_signal_emit(it->base.view, "elm,state,segment,pressed", "elm");
328    if (it->label)
329      {
330         snprintf(buf, sizeof(buf), "%s/segment_pressed", elm_widget_style_get(wd->obj));
331         elm_object_style_set(it->label, buf);
332      }
333 }
334
335 static void
336 _swallow_item_objects(Elm_Segment_Item *it)
337 {
338    Evas_Coord law = 0, lah = 0;
339    const char *lbl_area;
340
341    if (!it) return;
342
343    if (it->icon)
344      {
345         edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
346         edje_object_signal_emit(it->base.view, "elm,state,icon,visible", "elm");
347      }
348    else
349      edje_object_signal_emit(it->base.view, "elm,state,icon,hidden", "elm");
350
351    if (it->label)
352      {
353         edje_object_part_swallow(it->base.view, "elm.swallow.label", it->label);
354         edje_object_signal_emit(it->base.view, "elm,state,text,visible", "elm");
355
356         lbl_area = edje_object_data_get(it->base.view, "label.wrap.part");
357         if (lbl_area)
358           {
359              edje_object_part_geometry_get(it->base.view, lbl_area, NULL, NULL, &law, &lah );
360              elm_label_wrap_width_set(it->label, law);
361              elm_label_wrap_height_set(it->label, lah);
362           }
363      }
364    else
365      edje_object_signal_emit(it->base.view, "elm,state,text,hidden", "elm");
366 }
367
368 static void
369 _update_list(Widget_Data *wd)
370 {
371    Eina_List *l;
372    Elm_Segment_Item *it = NULL;
373    int index = 0;
374    char buf[4096];
375
376    _position_items(wd);
377
378    if (wd->item_count == 1)
379      {
380         it = eina_list_nth(wd->seg_items, 0);
381         it->seg_index = 0;
382
383         //Set the segment type
384         edje_object_signal_emit(it->base.view, "elm,type,segment,single", "elm");
385
386         //Set the segment state
387         if (wd->selected_item == it)
388           {
389              edje_object_signal_emit(it->base.view, "elm,state,segment,selected", "elm");
390              if (it->label)
391                {
392                   snprintf(buf, sizeof(buf), "%s/segment_selected", elm_widget_style_get(wd->obj));
393                   elm_object_style_set(it->label, buf);
394                }
395           }
396         else
397           edje_object_signal_emit(it->base.view, "elm,state,segment,normal", "elm");
398
399         if (elm_widget_disabled_get(wd->obj))
400           {
401              edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
402              if (it->label)
403                {
404                   snprintf(buf, sizeof(buf), "%s/segment_disabled", elm_widget_style_get(wd->obj));
405                   elm_object_style_set(it->label, buf);
406                }
407           }
408
409         _swallow_item_objects(it);
410
411         return;
412      }
413
414    EINA_LIST_FOREACH(wd->seg_items, l, it)
415      {
416         it->seg_index = index;
417
418         //Set the segment type
419         if(index == 0)
420           edje_object_signal_emit(it->base.view, "elm,type,segment,left", "elm");
421         else if(index == wd->item_count-1)
422           edje_object_signal_emit(it->base.view, "elm,type,segment,right", "elm");
423         else
424           edje_object_signal_emit(it->base.view, "elm,type,segment,middle", "elm");
425
426         //Set the segment state
427         if (wd->selected_item == it)
428           {
429              edje_object_signal_emit(it->base.view, "elm,state,segment,selected", "elm");
430              if (it->label)
431                {
432                   snprintf(buf, sizeof(buf), "%s/segment_selected", elm_widget_style_get(wd->obj));
433                   elm_object_style_set(it->label, buf);
434                }
435           }
436         else
437           edje_object_signal_emit(it->base.view, "elm,state,segment,normal", "elm");
438
439         if (elm_widget_disabled_get(wd->obj))
440            {
441               edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
442               if (it->label)
443                 {
444                    snprintf(buf, sizeof(buf), "%s/segment_disabled", elm_widget_style_get(wd->obj));
445                    elm_object_style_set(it->label, buf);
446                 }
447            }
448
449         _swallow_item_objects(it);
450
451         index++;
452      }
453 }
454
455 static Elm_Segment_Item *
456 _item_find(const Evas_Object *obj, int index)
457 {
458    Widget_Data *wd;
459    Elm_Segment_Item *it;
460
461    wd = elm_widget_data_get(obj);
462    if (!wd) return NULL;
463
464    it = eina_list_nth(wd->seg_items, index);
465    return it;
466 }
467
468 static Elm_Segment_Item*
469 _item_new(Evas_Object *obj, Evas_Object *icon, const char *label )
470 {
471    Elm_Segment_Item *it;
472    Widget_Data *wd;
473    char buf[4096];
474
475    wd = elm_widget_data_get(obj);
476    if (!wd) return NULL;
477
478    it = elm_widget_item_new(obj, Elm_Segment_Item);
479    if (!it) return NULL;
480    elm_widget_item_data_set(it, wd);
481
482    it->base.view = edje_object_add(evas_object_evas_get(obj));
483    edje_object_scale_set(it->base.view, elm_widget_scale_get(it->base.view) *_elm_config->scale);
484    evas_object_smart_member_add(it->base.view, obj);
485    elm_widget_sub_object_add(obj, it->base.view);
486    _elm_theme_object_set(obj, it->base.view, "segment_control", "item", elm_object_style_get(obj));
487
488    if (label)
489      {
490         it->label = elm_label_add(obj);
491         elm_widget_sub_object_add(it->base.view, it->label);
492         snprintf(buf, sizeof(buf), "%s/segment_normal", elm_widget_style_get(obj));
493         elm_object_style_set(it->label, buf);
494         elm_label_label_set(it->label, label);
495         elm_label_ellipsis_set(it->label, EINA_TRUE);
496         evas_object_show(it->label);
497      }
498
499    it->icon = icon;
500    if (it->icon) elm_widget_sub_object_add(it->base.view, it->icon);
501    evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, it);
502    evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOUSE_UP, _mouse_up, it);
503    evas_object_show(it->base.view);
504
505    return it;
506 }
507
508 /**
509  * Create new SegmentControl.
510  * @param [in] parent The parent object
511  * @return The new object or NULL if it cannot be created
512  *
513  * @ingroup SegmentControl SegmentControl
514  */
515 EAPI Evas_Object *
516 elm_segment_control_add(Evas_Object *parent)
517 {
518    Evas_Object *obj;
519    Evas *e;
520    Widget_Data *wd;
521
522    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
523
524    wd = ELM_NEW(Widget_Data);
525    e = evas_object_evas_get(parent);
526    if (!e) return NULL;
527    obj = elm_widget_add(e);
528    ELM_SET_WIDTYPE(widtype, "segment_control");
529    elm_widget_type_set(obj, "segment_control");
530    elm_widget_sub_object_add(parent, obj);
531    elm_widget_data_set(obj, wd);
532    elm_widget_del_hook_set(obj, _del_hook);
533    elm_widget_theme_hook_set(obj, _theme_hook);
534    elm_widget_disable_hook_set(obj, _disable_hook);
535
536 #if 0
537    /* TODO Can focus stay on Evas_Object which is not a elm_widget ?? */
538    elm_widget_focus_next_hook_set(obj, _focus_next_hook);
539 #endif
540
541    wd->obj = obj;
542
543    wd->base = edje_object_add(e);
544    edje_object_scale_set(wd->base, elm_widget_scale_get(wd->base) *_elm_config->scale);
545    _elm_theme_object_set(obj, wd->base, "segment_control", "base", "default");
546    elm_widget_resize_object_set(obj, wd->base);
547
548    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _on_move_resize, obj);
549    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _on_move_resize, obj);
550    _sizing_eval(obj);
551
552    return obj;
553 }
554
555 /**
556  * Add new segment item to SegmentControl.
557  * @param [in] obj The SegmentControl object
558  * @param [in] icon Any Objects like icon, Label, layout etc
559  * @param [in] label The label for added segment item. Note that, NULL is different from empty string "".
560  * @return The new segment item or NULL if it cannot be created
561  *
562  * @ingroup SegmentControl SegmentControl
563  */
564 EAPI Elm_Segment_Item *
565 elm_segment_control_item_add(Evas_Object *obj, Evas_Object *icon,
566                              const char *label)
567 {
568    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
569    Elm_Segment_Item *it;
570    Widget_Data *wd;
571
572    wd = elm_widget_data_get(obj);
573    if (!wd) return NULL;
574
575    it = _item_new(obj, icon, label);
576    if (!it) return NULL;
577
578    wd->seg_items = eina_list_append(wd->seg_items, it);
579    _update_list(wd);
580
581    return it;
582 }
583
584 /**
585  * Insert a new segment item to SegmentControl.
586  * @param [in] obj The SegmentControl object
587  * @param [in] icon Any Objects like icon, Label, layout etc
588  * @param [in] label The label for added segment item. Note that, NULL is different from empty string "".
589  * @param [in] index Segment item location. Value should be between 0 and
590  *              Existing total item count( @see elm_segment_control_item_count_get() )
591  * @return The new segment item or NULL if it cannot be created
592  *
593  * @ingroup SegmentControl SegmentControl
594  */
595 EAPI Elm_Segment_Item *
596 elm_segment_control_item_insert_at(Evas_Object *obj, Evas_Object *icon,
597                                    const char *label, int index)
598 {
599    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
600    Elm_Segment_Item *it, *it_rel;
601    Widget_Data *wd;
602
603    wd = elm_widget_data_get(obj);
604    if (!wd) return NULL;
605    if (index < 0) index = 0;
606
607    it = _item_new(obj, icon, label);
608    if (!it) return NULL;
609
610    it_rel = _item_find(obj, index);
611    if (it_rel)
612      wd->seg_items = eina_list_prepend_relative(wd->seg_items, it, it_rel);
613    else
614      wd->seg_items = eina_list_append(wd->seg_items, it);
615
616    _update_list(wd);
617    return it;
618 }
619
620 /**
621  * Delete a segment item from SegmentControl
622  * @param [in] obj The SegmentControl object
623  * @param [in] it The segment item to be deleted
624  *
625  * @ingroup SegmentControl SegmentControl
626  */
627 EAPI void
628 elm_segment_control_item_del(Elm_Segment_Item *it)
629 {
630    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
631    Widget_Data *wd;
632
633    wd = elm_widget_item_data_get(it);
634    if(!wd) return;
635
636    _item_free(it);
637    _update_list(wd);
638 }
639
640 /**
641  * Delete a segment item of given index from SegmentControl
642  * @param [in] obj The SegmentControl object
643  * @param [in] index The position at which segment item to be deleted
644  *
645  * @ingroup SegmentControl SegmentControl
646  */
647 EAPI void
648 elm_segment_control_item_del_at(Evas_Object *obj, int index)
649 {
650    ELM_CHECK_WIDTYPE(obj, widtype);
651    Elm_Segment_Item *it;
652    Widget_Data *wd;
653
654    wd = elm_widget_data_get(obj);
655    if (!wd) return;
656
657    it = _item_find(obj, index);
658    if (!it) return;
659    _item_free(it);
660    _update_list(wd);
661 }
662
663 /**
664  * Get the label of a segment item.
665  * @param [in] obj The SegmentControl object
666  * @param [in] index The index of the segment item
667  * @return The label of the segment item
668  *
669  * @ingroup SegmentControl SegmentControl
670  */
671 EAPI const char*
672 elm_segment_control_item_label_get(Evas_Object *obj, int index)
673 {
674    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
675    Elm_Segment_Item *it;
676
677    it = _item_find(obj, index);
678    if (it && it->label) return elm_label_label_get(it->label);
679
680    return NULL;
681 }
682
683 /**
684  * Set the label of a segment item.
685  * @param [in] it The SegmentControl Item
686  * @param [in] label New label text.
687  *
688  * @ingroup SegmentControl SegmentControl
689  */
690 EAPI void
691 elm_segment_control_item_label_set(Elm_Segment_Item* it, const char* label)
692 {
693    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
694    Widget_Data *wd;
695    char buf[4096];
696
697    wd = elm_widget_item_data_get(it);
698    if (!wd) return;
699
700    if (!label && !it->label) return; //No label, return
701    if (label && !it->label) // Create Label Object
702      {
703         it->label = elm_label_add(it->base.view);
704         elm_widget_sub_object_add(it->base.view, it->label);
705         elm_label_label_set(it->label, label);
706         elm_label_ellipsis_set(it->label, EINA_TRUE);
707         evas_object_show(it->label);
708
709         if(wd->selected_item == it )
710           {
711              snprintf(buf, sizeof(buf), "%s/segment_selected", elm_widget_style_get(wd->obj));
712              elm_object_style_set(it->label, buf);
713           }
714         else
715           {
716              snprintf(buf, sizeof(buf), "%s/segment_normal", elm_widget_style_get(wd->obj));
717              elm_object_style_set(it->label, buf);
718           }
719      }
720    else if (!label && it->label) // Delete Label Object
721      {
722         evas_object_del(it->label);
723         it->label = NULL;
724      }
725    else // Update the text
726      elm_label_label_set(it->label, label);
727
728    _swallow_item_objects( it );
729 }
730
731 /**
732  * Get the icon of a segment item of SegmentControl
733  * @param [in] obj The SegmentControl object
734  * @param [in] index The index of the segment item
735  * @return The icon object.
736  *
737  * @ingroup SegmentControl SegmentControl
738  */
739 EAPI Evas_Object *
740 elm_segment_control_item_icon_get(const Evas_Object *obj, int index)
741 {
742    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
743    Elm_Segment_Item *it;
744
745    it = _item_find(obj, index);
746    if (it) return it->icon;
747
748    return NULL;
749 }
750
751 /**
752  * Set the Icon to the segment item
753  * @param [in] it The SegmentControl Item
754  * @param [in] icon Objects like Layout, Icon, Label etc...
755  *
756  * @ingroup SegmentControl SegmentControl
757  */
758 EAPI void
759 elm_segment_control_item_icon_set(Elm_Segment_Item *it, Evas_Object *icon)
760 {
761    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
762
763    //Remove the existing icon
764    if (it->icon)
765      {
766         edje_object_part_unswallow(it->base.view, it->icon);
767         evas_object_del(it->icon);
768         it->icon = NULL;
769      }
770
771    it->icon = icon;
772    if (it->icon) elm_widget_sub_object_add(it->base.view, it->icon);
773    _swallow_item_objects( it );
774 }
775
776 /**
777  * Get the Segment items count from SegmentControl
778  * @param [in] obj The SegmentControl object
779  * @return Segment items count.
780  *
781  * @ingroup SegmentControl SegmentControl
782  */
783 EAPI int
784 elm_segment_control_item_count_get(const Evas_Object *obj)
785 {
786    ELM_CHECK_WIDTYPE(obj, widtype) 0;
787    Widget_Data *wd;
788
789    wd = elm_widget_data_get(obj);
790    if (!wd) return 0;
791
792    return eina_list_count(wd->seg_items);
793 }
794
795 /**
796  * Get the base object of segment item.
797  * @param [in] it The Segment item
798  * @return obj The base object of the segment item.
799  *
800  * @ingroup SegmentControl SegmentControl
801  */
802 EAPI Evas_Object*
803 elm_segment_control_item_object_get(const Elm_Segment_Item *it)
804 {
805    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
806
807    return it->base.view;
808 }
809
810 /**
811  * Get the selected segment item in the SegmentControl
812  * @param [in] obj The SegmentControl object
813  * @return Selected Segment Item. NULL if none of segment item is selected.
814  *
815  * @ingroup SegmentControl SegmentControl
816  */
817 EAPI Elm_Segment_Item*
818 elm_segment_control_item_selected_get(const Evas_Object *obj)
819 {
820    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
821    Widget_Data *wd;
822
823    wd = elm_widget_data_get(obj);
824    if (!wd) return NULL;
825
826    return wd->selected_item;
827 }
828
829 /**
830  * Select/unselect a particular segment item of SegmentControl
831  * @param [in] it The Segment item that is to be selected or unselected.
832  * @param [in] select Passing EINA_TRUE will select the segment item and EINA_FALSE will unselect.
833  *
834  * @ingroup SegmentControl SegmentControl
835  */
836 EAPI void
837 elm_segment_control_item_selected_set(Elm_Segment_Item *it, Eina_Bool select)
838 {
839    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
840    Widget_Data *wd;
841
842    wd = elm_widget_item_data_get(it);
843    if (!wd) return;
844
845    if (it == wd->selected_item)
846      {
847         if (select) return;  //already in selected selected state.
848
849         //unselect case
850         _segment_off(it);
851      }
852    else
853      _segment_on(it);
854
855    return;
856 }
857
858 /**
859  * Get the Segment Item from the specified Index.
860  * @param [in] obj The Segment Control object.
861  * @param [in] index The index of the segment item.
862  * @return The Segment item.
863  *
864  * @ingroup SegmentControl SegmentControl
865  */
866 EAPI Elm_Segment_Item *
867 elm_segment_control_item_get(const Evas_Object *obj, int index)
868 {
869    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
870    Elm_Segment_Item *it;
871
872    it = _item_find(obj, index);
873
874    return it;
875 }
876
877 /**
878  * Get the index of a Segment item in the SegmentControl
879  * @param [in] it The Segment Item.
880  * @return Segment Item index.
881  *
882  * @ingroup SegmentControl SegmentControl
883  */
884 EAPI int
885 elm_segment_control_item_index_get(const Elm_Segment_Item *it)
886 {
887    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, -1);
888
889    return it->seg_index;
890 }
891
892 //////////////////////////////////  BEGIN  //////////////////////////////////////////////
893 /////////////////////////// OLD SLP APIs - TO BE DEPRECATED /////////////////////////////
894 /////////////////////////////////////////////////////////////////////////////////////////
895
896 EAPI int
897 elm_segment_control_get_segment_count(Evas_Object *obj)
898 {
899    fprintf(stderr, "=============================> Warning!!! <========================\n");
900    fprintf(stderr, "==> elm_segment_control_get_segment_count() is deprecated. <=======\n");
901    fprintf(stderr, "===> Please use elm_segment_control_item_count_get() instead. <====\n");
902    fprintf(stderr, "===================================================================\n");
903    return elm_segment_control_item_count_get(obj);
904 }
905
906 EAPI Elm_Segment_Item *
907 elm_segment_control_selected_segment_get(const Evas_Object *obj, int *value)
908 {
909    Elm_Segment_Item *it;
910    it = elm_segment_control_item_selected_get(obj);
911    if (!it) return NULL;
912    *value = it->seg_index;
913
914    fprintf(stderr, "=============================> Warning!!! <===========================\n");
915    fprintf(stderr, "==> elm_segment_control_selected_segment_get() is deprecated. <=======\n");
916    fprintf(stderr, "===> Please use elm_segment_control_item_selected_get() instead. <====\n");
917    fprintf(stderr, "======================================================================\n");
918    return it;
919 }
920
921 EAPI Evas_Object *
922 elm_segment_control_get_segment_icon_at(Evas_Object *obj, unsigned int index)
923 {
924    fprintf(stderr, "=============================> Warning!!! <==========================\n");
925    fprintf(stderr, "==> elm_segment_control_get_segment_icon_at() is deprecated. <=======\n");
926    fprintf(stderr, "=====> Please use elm_segment_control_item_icon_get() instead. <=====\n");
927    fprintf(stderr, "=====================================================================\n");
928    return elm_segment_control_item_icon_get(obj, index);
929 }
930
931 EAPI const char *
932 elm_segment_control_get_segment_label_at(Evas_Object *obj, unsigned int index)
933 {
934    fprintf(stderr, "=============================> Warning!!! <===========================\n");
935    fprintf(stderr, "==> elm_segment_control_get_segment_label_at() is deprecated. <=======\n");
936    fprintf(stderr, "=====> Please use elm_segment_control_item_label_get() instead. <=====\n");
937    fprintf(stderr, "======================================================================\n");
938    return elm_segment_control_item_label_get(obj, index);
939 }
940
941 EAPI void
942 elm_segment_control_delete_segment_at(Evas_Object *obj, unsigned int index,
943                                       Eina_Bool animate)
944 {
945    fprintf(stderr, "=============================> Warning!!! <========================\n");
946    fprintf(stderr, "==> elm_segment_control_delete_segment_at() is deprecated. <=======\n");
947    fprintf(stderr, "=====> Please use elm_segment_control_item_del_at() instead. <=====\n");
948    fprintf(stderr, "===================================================================\n");
949    elm_segment_control_item_del_at(obj, index);
950 }
951
952 EAPI void
953 elm_segment_control_delete_segment(Evas_Object *obj, Elm_Segment_Item *item,
954                                    Eina_Bool animate)
955 {
956    fprintf(stderr, "=============================> Warning!!! <=====================\n");
957    fprintf(stderr, "==> elm_segment_control_delete_segment() is deprecated. <=======\n");
958    fprintf(stderr, "=====> Please use elm_segment_control_item_del() instead. <=====\n");
959    fprintf(stderr, "================================================================\n");
960    elm_segment_control_item_del(item);
961 }
962
963 EAPI void
964 elm_segment_control_insert_segment_at(Evas_Object *obj, Evas_Object *icon,
965                                       const char *label, unsigned int index,
966                                       Eina_Bool animate)
967 {
968    fprintf(stderr, "=============================> Warning!!! <===========================\n");
969    fprintf(stderr, "==> elm_segment_control_insert_segment_at() is deprecated. <==========\n");
970    fprintf(stderr, "=====> Please use elm_segment_control_item_insert_at() instead. <=====\n");
971    fprintf(stderr, "======================================================================\n");
972    elm_segment_control_item_insert_at(obj, icon, label, index);
973 }
974
975 EAPI Elm_Segment_Item *
976 elm_segment_control_add_segment(Evas_Object *obj, Evas_Object *icon,
977                                 const char *label, Eina_Bool animate)
978 {
979    fprintf(stderr, "=============================> Warning!!! <=====================\n");
980    fprintf(stderr, "==> elm_segment_control_add_segment() is deprecated. <==========\n");
981    fprintf(stderr, "=====> Please use elm_segment_control_item_add() instead. <=====\n");
982    fprintf(stderr, "================================================================\n");
983    return elm_segment_control_item_add(obj, icon, label);
984 }
985
986 EAPI Evas_Object *
987 elm_segment_control_item_label_object_set(Elm_Segment_Item *item, char *label)
988 {
989    fprintf(stderr, "=============================> Warning!!! <===============================\n");
990    fprintf(stderr, "==> elm_segment_control_item_label_object_set() is deprecated. <==========\n");
991    fprintf(stderr, "=====> Please use elm_segment_control_item_label_set() instead. <=========\n");
992    fprintf(stderr, "==========================================================================\n");
993    elm_segment_control_item_label_set(item, label);
994    if (item) return item->label;
995    else return NULL;
996 }
997 /////////////////////////////////////////////////////////////////////////////////////////
998 /////////////////////////// OLD SLP APIs - TO BE DEPRECATED /////////////////////////////
999 ///////////////////////////////////  END ////////////////////////////////////////////////
1000