[SegmentControl] Clean Up
[framework/uifw/elementary.git] / src / lib / elm_segment_control.c
index 622e2c0..04e155a 100644 (file)
@@ -6,8 +6,8 @@
  * @ingroup Elementary
  *
  * SegmentControl object is a horizontal control made of multiple segments,
- * each segment functioning as a discrete button. A segmented control affords a compact means to group together a number of controls.
- * A segmented control can display a title or an image. The UISegmentedControl object automatically resizes segments to fit proportionally
+ * each segment item functioning as a discrete button. A segmented control affords a compact means to group together a number of controls.
+ * A segmented control can display a title or an image. The UISegmentedControl object automatically resizes segment items to fit proportionally
  * within their superview unless they have a specific width set. When you add and remove segments,
  * you can request that the action be animated with sliding and fading effects.
  */
@@ -17,18 +17,20 @@ struct _Widget_Data
    Evas_Object *box;
    Evas_Object *base;
    Eina_List *seg_ctrl;
-   Eina_List *queue;
+   Elm_Segment_Item *ani_it;
+   Ecore_Animator *ani;
+   void *data;
    int width, height;
    int id;
    int item_width;
-
-   Elm_Segment_Item *ani_it;
-   Ecore_Animator *ani;
+   int cur_fontsize;
+   int max_height, w_pad, h_pad;
    unsigned int count;
    unsigned int insert_index;
    unsigned int del_index;
    unsigned int cur_seg_id;
    double scale_factor;
+   Eina_Bool selected : 1;
 };
 
 struct _Elm_Segment_Item
@@ -36,17 +38,22 @@ struct _Elm_Segment_Item
    Evas_Object *obj;
    Evas_Object *base;
    Evas_Object *icon;
+   Evas_Object *label_wd;
    const char *label;
-       Eina_Bool delete_me : 1;
    int segment_id;
+   Eina_Bool delete_me : 1;
 };
 
-static void _signal_segment_on(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
+static void _mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _signal_segment_on(void *data);
+static void _signal_segment_off(void *data);
 static void _theme_hook(Evas_Object *obj);
 static void _item_free(Evas_Object *obj, Elm_Segment_Item *it);
 static void _del_hook(Evas_Object *obj);
 static void _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
-static Elm_Segment_Item * _item_find(Evas_Object *obj, unsigned int index);
+static void _segment_resizing(void *data);
+static void _object_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void _update_list(Evas_Object *obj);
 static void _refresh_segment_ids(Evas_Object *obj);
 static void _state_value_set(Evas_Object *obj);
@@ -62,57 +69,99 @@ _on_focus_hook(void *data, Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-       Elm_Segment_Item *it;
-       Eina_List *l;
 
    if (elm_widget_focus_get(obj))
+     evas_object_focus_set((Evas_Object *)wd->seg_ctrl, 1);
+   else
+     evas_object_focus_set((Evas_Object *)wd->seg_ctrl, 0);
+}
+
+static void
+_signal_segment_off(void *data)
+{
+    Elm_Segment_Item *item = (Elm_Segment_Item *) data;
+    Widget_Data *wd = elm_widget_data_get(item->obj);
+    if (!wd) return;
+    
+    edje_object_signal_emit(item->base, "elm,action,unfocus", "elm");
+    edje_object_signal_emit(item->base, "elm,state,segment,off", "elm");
+    if(!item->label_wd)
+      {
+         edje_object_signal_emit(item->base, "elm,state,text,visible", "elm");
+      }
+    if(item->label_wd)
+      {
+         elm_label_text_color_set(item->label_wd, 0xff,0xff, 0xff, 0xff);
+      }
+
+    return;
+}
+   
+static void
+_signal_segment_on(void *data)
+{
+   Elm_Segment_Item *item = (Elm_Segment_Item *) data;
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   if (!wd) return;
+
+   wd->selected = EINA_TRUE;
+
+   edje_object_signal_emit(item->base, "elm,state,segment,on", "elm");
+   edje_object_signal_emit(item->base, "elm,action,focus", "elm");
+   if(!item->label_wd)
+     edje_object_signal_emit(item->base, "elm,state,text,change", "elm");
+
+   if (item->segment_id == wd->cur_seg_id) return;
+
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
      {
-          edje_object_signal_emit((Evas_Object *)wd->seg_ctrl, "elm,action,focus", "elm");
-          evas_object_focus_set((Evas_Object *)wd->seg_ctrl, 1);
+        if (it->segment_id == wd->cur_seg_id)
+         {
+             _signal_segment_off (it);
+            break;
+         }
      }
-   else
+   wd->cur_seg_id = item->segment_id;
+   evas_object_smart_callback_call(item->obj, "changed", (void*)wd->cur_seg_id);
+
+   return;
+}
+
+static void
+_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Elm_Segment_Item *item = (Elm_Segment_Item *) data;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   if (!wd) return;
+   Evas_Coord wrap_width = 0, wrap_height = 0, w = 0, h = 0;
+
+   if (item->segment_id == wd->cur_seg_id)
      {
-          edje_object_signal_emit((Evas_Object *)wd->seg_ctrl, "elm,action,unfocus", "elm");
-          evas_object_focus_set((Evas_Object *)wd->seg_ctrl, 0);
-               EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-               {
-                       if (it->segment_id == wd->cur_seg_id) {
-                               edje_object_signal_emit(it->base, "elm,state,segment,off", "elm");
-                               edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
-                                break;
-                       }
-               }
+       wd->selected = EINA_TRUE;
+       return;
      }
+    _signal_segment_on(item);
+    if(item->label_wd)
+       elm_label_text_color_set(item->label_wd, 0x00,0x00, 0x00, 0xff);
+
+     wd->selected = EINA_FALSE;
+     return;
+
 }
 
 static void
-_signal_segment_on(void *data, Evas_Object *obj, const char *emission, const char *source)
+_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
 {
-       Elm_Segment_Item *item = (Elm_Segment_Item *) data;
-       Widget_Data *wd = elm_widget_data_get(item->obj);
+   Elm_Segment_Item *item = (Elm_Segment_Item *) data;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
 
-       if (!wd)
-               return;
+   if (!wd) return;
+   
+   edje_object_signal_emit(item->base, "elm,action,focus", "elm");
 
-       edje_object_signal_emit(item->base, "elm,state,segment,on", "elm");
-       edje_object_signal_emit(item->base, "elm,state,text,change", "elm");
-       Elm_Segment_Item *it;
-       Eina_List *l;
-       if (item->segment_id == wd->cur_seg_id)
-       {
-               wd->cur_seg_id = item->segment_id;
-               return;
-       }
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               if (it->segment_id == wd->cur_seg_id) {
-                       edje_object_signal_emit(it->base, "elm,state,segment,off", "elm");
-                       edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
-                        break;
-               }
-       }
-       wd->cur_seg_id = item->segment_id;
-   evas_object_smart_callback_call(item->obj, "changed", (void*)wd->cur_seg_id);
 }
 
 static void
@@ -130,16 +179,25 @@ _item_free(Evas_Object *obj, Elm_Segment_Item *it)
    if (!wd) return;
 
    if(wd->seg_ctrl)
-       wd->seg_ctrl = eina_list_remove(wd->seg_ctrl, it);
+     wd->seg_ctrl = eina_list_remove(wd->seg_ctrl, it);
 
    if(it->icon) evas_object_del(it->icon);
+   if(it->label_wd) 
+     {
+        evas_object_del(it->label_wd);
+       it->label_wd = NULL;
+       if (edje_object_part_swallow_get(it->base, "elm.swallow.label.content") == NULL) 
+          {
+             edje_object_part_unswallow(it->base, it->label_wd);
+         }
+     }
    if(it->base) evas_object_del(it->base);
    if(it->label) eina_stringshare_del(it->label);
 
    if(it)
-       free(it);
+     free(it);
    it = NULL;
-       return;
+   return;
 }
 
 static void
@@ -152,8 +210,7 @@ _del_hook(Evas_Object *obj)
    EINA_LIST_FOREACH(wd->seg_ctrl, l, it) clear = eina_list_append(clear, it);
    EINA_LIST_FREE(clear, it) _item_free(obj, it);
 
-   if(wd)
-       free(wd);
+   if(wd) free(wd);
    wd = NULL;
 
    return;
@@ -173,428 +230,497 @@ _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
 static void
 _segment_resizing(void *data)
 {
-       Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
-       if (!wd) return;
-       Evas_Coord w = 0, h = 0;
-
-       evas_object_geometry_get(wd->base, NULL, NULL, &w, &h);
+   Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
+   if (!wd) return;
+   Evas_Coord w = 0, h = 0;
 
-       wd->item_width = wd->width = w;
-       wd->height = h;
+   evas_object_geometry_get(wd->base, NULL, NULL, &w, &h);
+   wd->item_width = wd->width = w;
+   wd->height = h;
 
-       _state_value_set((Evas_Object *)data);
+   _state_value_set((Evas_Object *)data);
 }
 
-static void _object_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
+static void 
+_object_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
-       Widget_Data *wd;
-       if(!data) return;
-       wd = elm_widget_data_get((Evas_Object *)data);
-       if(!wd) return;
+   Widget_Data *wd;
+   if(!data) return;
+   wd = elm_widget_data_get((Evas_Object *)data);
+   if(!wd) return;
 
-       ecore_job_add(_segment_resizing, (Evas_Object *)data);
+   ecore_job_add(_segment_resizing, (Evas_Object *)data);
 }
 
-/**
- * Add a new segmentcontrol to the parent
- * @param parent The parent object
- * @return The new object or NULL if it cannot be created
- *
- * @ingroup SegmentControl SegmentControl
- */
-EAPI Evas_Object *
-elm_segment_control_add(Evas_Object *parent)
+static void
+_segment_item_resizing(void *data)
 {
-       Evas_Object *obj;
-       Evas *e;
-       Widget_Data *wd;
-
-       wd = ELM_NEW(Widget_Data);
-       e = evas_object_evas_get(parent);
-       obj = elm_widget_add(e);
-       elm_widget_type_set(obj, "segmented-control");
-       elm_widget_sub_object_add(parent, obj);
-       elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
-       elm_widget_data_set(obj, wd);
-       elm_widget_del_hook_set(obj, _del_hook);
-       elm_widget_theme_hook_set(obj, _theme_hook);
+   Widget_Data *wd;
+   Elm_Segment_Item *it = (Elm_Segment_Item *)data; 
+   wd = elm_widget_data_get(it->obj);
 
-       wd->base = edje_object_add(e);
-       _elm_theme_object_set(obj, wd->base, "segmented-control", "base", "default");
-       elm_widget_resize_object_set(obj, wd->base);
+   if(!wd) return;
+   Evas_Coord w = 0, h = 0;
+   
+   _update_list(it->obj);
+   evas_object_geometry_get(it->base, NULL, NULL, &w, &h);
 
-       wd->box = evas_object_box_add(e);
-       evas_object_box_layout_set(wd->box, _layout, wd, NULL);
-       elm_widget_sub_object_add(obj, wd->box);
-       edje_object_part_swallow(wd->base, "elm.swallow.content", wd->box);
-       evas_object_show(wd->box);
+   if(wd->max_height == 1) wd->max_height = h;
 
-       evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _object_resize, obj);
-       wd->id = 0;
-       wd->del_index = 0;
-       wd->insert_index = 0;
-       wd->cur_seg_id = -1;
+   if(it->label_wd) 
+     {
+       elm_label_wrap_width_set(it->label_wd, w-wd->w_pad);
+       elm_label_wrap_height_set(it->label_wd, wd->max_height-wd->h_pad);
+        if (it->segment_id == wd->cur_seg_id)
+          {
+            elm_label_text_color_set(it->label_wd, 0x00,0x00, 0x00, 0xff);
+          }
+        else
+           elm_label_text_color_set(it->label_wd, 0xFF,0xFF, 0xFF, 0xff);
+       if (edje_object_part_swallow_get(it->base, "elm.swallow.label.content") == NULL)
+         {
+            edje_object_part_unswallow(it->base, it->label_wd);
+         }
+       edje_object_part_swallow(it->base, "elm.swallow.label.content", it->label_wd);
+       edje_object_signal_emit(it->base, "elm,state,label,visible", "elm");
+        if (it->segment_id == wd->cur_seg_id)
+          {
+            elm_label_text_color_set(it->label_wd, 0x00,0x00, 0x00, 0xff);
+          }
+        else
+           elm_label_text_color_set(it->label_wd, 0xFF,0xFF, 0xFF, 0xff);
+     }
+}
 
-       return obj;
+static void 
+_object_item_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   ecore_job_add(_segment_item_resizing, (Evas_Object *)data);
 }
 
 static Elm_Segment_Item*
 _item_new(Evas_Object *obj, const char *label, Evas_Object *icon)
 {
+   Elm_Segment_Item *it; 
+   Evas_Coord mw, mh; 
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return NULL;
 
-   Elm_Segment_Item *it;
    it = calloc(1, sizeof(   Elm_Segment_Item));
    if (!it) return NULL;
 
    if(obj) it->obj = obj;
    it->delete_me = EINA_FALSE;
    it->segment_id = wd->id;
+   it->label_wd = NULL;
 
    it->base = edje_object_add(evas_object_evas_get(obj));
-   _elm_theme_object_set(obj, it->base, "segment", "base", elm_object_style_get(it->base));
+   _elm_theme_object_set(obj, it->obj, "segment", "base/default", elm_object_style_get(it->obj));
 
    if (it->label) eina_stringshare_del(it->label);
    if (label)
-        {
-                       it->label = eina_stringshare_add(label);
-        }
-   else
-        {
-                       it->label = NULL;
-        }
+     {
+        it->label = eina_stringshare_add(label);
+     }
 
    if ((it->icon != icon) && (it->icon))
-        elm_widget_sub_object_del(obj, it->icon);
+      elm_widget_sub_object_del(obj, it->icon);
    it->icon = icon;
-   if (icon)
-        {
-               elm_widget_sub_object_add(obj, icon);
-               Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
-
-               elm_coords_finger_size_adjust(1, &minw, 1, &minh);
-               elm_coords_finger_size_adjust(1, &minw, 1, &minh);
-
-               evas_object_size_hint_weight_set(it->base, 1.0, -1.0);
-               evas_object_size_hint_align_set(it->base, 1.0, -1.0);
-               evas_object_size_hint_min_set(it->base, -1, -1);
-               evas_object_size_hint_max_set(it->base, maxw, maxh);
-        }
+   if (it->icon)
+     {
+        elm_widget_sub_object_add(obj, icon);
+       Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
+       elm_coords_finger_size_adjust(1, &minw, 1, &minh);
+       elm_coords_finger_size_adjust(1, &minw, 1, &minh);
+
+       evas_object_size_hint_weight_set(it->base, 1.0, -1.0);
+       evas_object_size_hint_align_set(it->base, 1.0, -1.0);
+       evas_object_size_hint_min_set(it->base, -1, -1);
+       evas_object_size_hint_max_set(it->base, maxw, maxh);
+     }
+
+   edje_object_size_min_restricted_calc(obj, &mw, &mh, 0, 0);
+   evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
-          return it;
+   return it;
 }
 
 
-static void _update_list(Evas_Object *obj)
+static void 
+_update_list(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   int i = 0;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
 
-       Elm_Segment_Item *it;
-       Eina_List *l;
-       int i = 0;
-       wd->count = eina_list_count(wd->seg_ctrl);
+   wd->count = eina_list_count(wd->seg_ctrl);
+   if(wd->count == 1)
+     {
+        it = _item_find(obj, 0);
+       _elm_theme_object_set(obj, it->base, "segment", "base/single", elm_object_style_get(it->obj));\r
+       edje_object_signal_emit(it->base, "elm,state,segment,on", "elm");
+       if(!it->label_wd)
+         {
+            edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
+            edje_object_signal_emit(it->base, "elm,state,text,change", "elm");
+         }
+
+       if(it->label)
+          edje_object_part_text_set(it->base, "elm.text", it->label);
+        if (it->icon && edje_object_part_swallow_get(it->base, "elm.swallow.content") == NULL)
+          {
+       edje_object_part_swallow(it->base, "elm.swallow.content", it->icon);
+       edje_object_signal_emit(it->base, "elm,state,icon,visible", "elm");
+          }
+       edje_object_message_signal_process(it->base);
 
-       if(wd->count == 1)
-       {
-               it = _item_find(obj, 0);
-               _elm_theme_object_set(obj, it->base, "segment", "base", "single");
-               edje_object_signal_emit(it->base, "elm,state,segment,on", "elm");
-               edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
-               edje_object_signal_emit(it->base, "elm,state,text,change", "elm");
-               edje_object_message_signal_process(it->base);
-
-               edje_object_part_text_set(it->base, "elm.text", it->label);
-
-               edje_object_part_swallow(it->base, "elm.swallow.content", it->icon);
-               edje_object_signal_emit(it->base, "elm,state,icon,visible", "elm");
-               return;
-       }
+       return;
+     }
 
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               if(i==0)
-               {
-                       _elm_theme_object_set(obj, it->base, "segment", "base", "first");
-               }
-               else if(i==wd->count-1)
-               {
-                       _elm_theme_object_set(obj, it->base, "segment", "base", "last");
-               }
-               else
-               {
-                       _elm_theme_object_set(obj, it->base, "segment", "base", "default");
-               }
-
-               edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
-               edje_object_message_signal_process(it->base);
-
-               edje_object_part_text_set(it->base, "elm.text", it->label);
-
-               edje_object_part_swallow(it->base, "elm.swallow.content", it->icon);
-               edje_object_signal_emit(it->base, "elm,state,icon,visible", "elm");
-
-               i++;
-       }
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+        if(i==0)
+          {
+             _elm_theme_object_set(obj, it->base, "segment", "base/first", elm_object_style_get(it->obj));
+         }
+       else if(i==wd->count-1)
+          {
+            _elm_theme_object_set(obj, it->base, "segment", "base/last", elm_object_style_get(it->obj));
+         }
+       else
+         {
+            _elm_theme_object_set(obj, it->base, "segment", "base/default", elm_object_style_get(it->obj));
+
+         }
+         
+       if(!it->label_wd)
+         {
+            edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
+         }
+
+       if(it->label)
+          edje_object_part_text_set(it->base, "elm.text", it->label);
+
+        if (it->icon && edje_object_part_swallow_get(it->base, "elm.swallow.content") == NULL)
+          {
+       edje_object_part_swallow(it->base, "elm.swallow.content", it->icon);
+       edje_object_signal_emit(it->base, "elm,state,icon,visible", "elm");
+          }
+       edje_object_message_signal_process(it->base);
+
+       i++;
+     }
+   if(wd->data && wd->selected)
+     {
+        _signal_segment_on(wd->data);
+        wd->selected = EINA_FALSE;
+     }
 }
 
 
-static void _refresh_segment_ids(Evas_Object *obj)
+static void 
+_refresh_segment_ids(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
-
-       Elm_Segment_Item *it;
-       Eina_List *l;
-
-       if (wd->insert_index && wd->cur_seg_id >= wd->insert_index)
-       {
-               ++wd->cur_seg_id;
-               wd->insert_index = 0;
-       }
-       if (wd->del_index)
-       {
-               if (wd->cur_seg_id >= wd->del_index)
-                       --wd->cur_seg_id;
-               wd->del_index =0;
-       }
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   int i = 0;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   if (wd->insert_index && wd->cur_seg_id >= wd->insert_index)
+     {
+        ++wd->cur_seg_id;
+       wd->insert_index = 0;
+     }
+   if (wd->del_index)
+     {
+        if (wd->cur_seg_id >= wd->del_index)
+          --wd->cur_seg_id;
+        wd->del_index =0;
+     }
 
-       int i = 0;
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               it->segment_id = i;
-               i++;
-       }
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+        it->segment_id = i;
+       i++;
+     }
 }
 
-static void _state_value_set(Evas_Object *obj)
+static void 
+_state_value_set(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
-
-       Elm_Segment_Item *it;
-       Eina_List *l;
+   Elm_Segment_Item *it;
+   Eina_List *l;
    Evas_Coord mw, mh, x, y;
-   int w1=0, w2;
-
 
-       unsigned int count = eina_list_count(wd->seg_ctrl);
-
-       if(count > 0)
-               wd->item_width = wd->width/count;
-
-       if(wd->ani_it)
-       {
-               evas_object_geometry_get(wd->ani_it->base, &x, &y, &w1, NULL);
-               if(wd->ani_it->delete_me)
-               {
-                       w1-=(wd->item_width/15);
-                       if( w1< 0) w1 = 0;
-               }
-               else
-               {
-                       w1+=(wd->item_width/15);
-                       if( w1 > wd->item_width )
-                                       w1 = wd->item_width;
-               }
-
-                       w2 = (wd->width-w1)/(count -1);
-       }
+   int w1=0, w2, i=0;
+   unsigned int count ;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   
+   count = eina_list_count(wd->seg_ctrl);
+   if (count > 0)
+     wd->item_width = wd->width/count;
+   if (wd->ani_it)
+     {
+        evas_object_geometry_get(wd->ani_it->base, &x, &y, &w1, NULL);
+       if (wd->ani_it->delete_me)
+         {
+            w1-=(wd->item_width/5);
+            if( w1< 0) w1 = 0;
+         }
        else
-                       w2 = wd->item_width;
-
-       int i=0;
-
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
        {
-               edje_object_size_min_restricted_calc(it->base, &mw, &mh, 0, 0);
-               evas_object_size_hint_weight_set(it->base, 1.0, 1.0);
-               evas_object_size_hint_align_set(it->base, -1.0, -1.0);
-
-               if(wd->ani_it  && it == wd->ani_it)
-               {
-                       evas_object_resize(it->base, w1, wd->height);
-                       evas_object_size_hint_min_set(it->base, w1, wd->height);
-                       evas_object_size_hint_max_set(it->base, w1, wd->height);
-               }
-               else
-               {
-                       evas_object_resize(it->base, w2, wd->height);
-                       evas_object_size_hint_min_set(it->base, w2, wd->height);
-                       evas_object_size_hint_max_set(it->base, w2, wd->height);
-               }
-
-               ++i;
+           w1+=(wd->item_width/5);
+          if( w1 > wd->item_width )
+              w1 = wd->item_width;
        }
+       w2 = (wd->width-w1)/(count -1);
+     }
+   else
+      w2 = wd->item_width;
+         
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+    {
+       edje_object_size_min_restricted_calc(it->base, &mw, &mh, 0, 0);
+       evas_object_size_hint_weight_set(it->base, 1.0, 1.0);
+       evas_object_size_hint_align_set(it->base, -1.0, -1.0);
+       
+               
+       if(wd->ani_it  && it == wd->ani_it)
+         {
+            evas_object_resize(it->base, w1, wd->height);
+           evas_object_size_hint_min_set(it->base, w1, wd->height);
+           evas_object_size_hint_max_set(it->base, w1, wd->height);
+        }
+       else
+         {
+           evas_object_resize(it->base, w2, wd->height);
+           evas_object_size_hint_min_set(it->base, w2, wd->height);
+           evas_object_size_hint_max_set(it->base, w2, wd->height);
+       }
+       ++i;
+    }
 
-       return;
+    return;
 }
 
 
 static int *
 _animator_animate_add_cb(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
-
-       int w;
-       evas_object_geometry_get(wd->ani_it->base, NULL, NULL, &w, NULL);
+   int w;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return 0;
 
-       if( w <  wd->item_width )
-       {
-        _state_value_set(obj);
+   evas_object_geometry_get(wd->ani_it->base, NULL, NULL, &w, NULL);
+   if( w <  wd->item_width )
+     {
+         _state_value_set(obj);
         evas_object_geometry_get(wd->ani_it->base, NULL, NULL, &w, NULL);
-                       return ECORE_CALLBACK_RENEW;
-       }
-       else
-        {
-                ecore_animator_del(wd->ani);
-                wd->ani = NULL;
-                wd->ani_it = NULL;
-                       return ECORE_CALLBACK_CANCEL;
-        }
+        return (int*) ECORE_CALLBACK_RENEW;
+     }
+   else
+     {
+        ecore_animator_del(wd->ani);
+       wd->ani = NULL;
+       wd->ani_it = NULL;
+       return (int*) ECORE_CALLBACK_CANCEL;
+     }
 }
 
 
 static int *
 _animator_animate_del_cb(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
+   int w;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return 0;\r
 
-       int w;
+   evas_object_geometry_get(wd->ani_it->base, NULL, NULL, &w, NULL);
+   if( w >  0 )
+     {
+        _state_value_set(obj);
        evas_object_geometry_get(wd->ani_it->base, NULL, NULL, &w, NULL);
-       if( w >  0 )
-       {
-        _state_value_set(obj);
-        evas_object_geometry_get(wd->ani_it->base, NULL, NULL, &w, NULL);
-                       return ECORE_CALLBACK_RENEW;
+       return (int*) ECORE_CALLBACK_RENEW;
+     }
+   else
+     {
+        _item_free(obj, wd->ani_it );
+       _refresh_segment_ids(obj);
+       ecore_animator_del(wd->ani);
+       wd->ani = NULL;
+       wd->ani_it = NULL;
+       _update_list(obj);
+       wd->id = eina_list_count(wd->seg_ctrl);
+       return (int*) ECORE_CALLBACK_CANCEL;
+     }
+}
+
+static Elm_Segment_Item *
+_item_find(Evas_Object *obj, unsigned int index)
+{
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   int i = 0;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+        if (i == index) return it;
+       i++;
+     }
+     return NULL;
+}
+
+
+static Elm_Segment_Item *
+_item_search(Evas_Object *obj, Elm_Segment_Item *item)
+{
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd)
+   return NULL;
+
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+        if (it == item) {
+          return it;
        }
-       else
-        {
-               _item_free(obj, wd->ani_it );
-               _refresh_segment_ids(obj);
-                ecore_animator_del(wd->ani);
-                wd->ani = NULL;
-                wd->ani_it = NULL;
-               _update_list(obj);
-               wd->id = eina_list_count(wd->seg_ctrl);
-                       return ECORE_CALLBACK_CANCEL;
-        }
+     }
+   return NULL;
 }
 
+
 /**
- * Add a new segment to segmentcontrol
- * @param obj The SegmentControl object
- * @param icon The icon object for added segment
- * @param label The label for added segment
- * @param animate If 1 the action be animated with sliding effects default 0.
- * @return The new segment or NULL if it cannot be created
+ * Add a new segmentcontrol to the parent
+ * @param parent The parent object
+ * @return The new object or NULL if it cannot be created
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI Evas_Object *
+elm_segment_control_add(Evas_Object *parent)
+{
+   Evas_Object *obj;
+   Evas *e;
+   Widget_Data *wd;
+
+   const char *deffont, *maxheight, *wpad, *hpad;
+
+   wd = ELM_NEW(Widget_Data);
+   e = evas_object_evas_get(parent);
+   if(!e) return NULL;
+   obj = elm_widget_add(e);
+   elm_widget_type_set(obj, "segmented-control");
+   elm_widget_sub_object_add(parent, obj);
+   elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
+   elm_widget_data_set(obj, wd);
+   elm_widget_del_hook_set(obj, _del_hook);
+   elm_widget_theme_hook_set(obj, _theme_hook);
+
+   wd->base = edje_object_add(e);
+   _elm_theme_object_set(obj, wd->base, "segmented-control", "base", "default");
+   elm_widget_resize_object_set(obj, wd->base);
+   wd->box = evas_object_box_add(e);
+   evas_object_box_layout_set(wd->box, _layout, wd, NULL);
+   elm_widget_sub_object_add(obj, wd->box);
+   edje_object_part_swallow(wd->base, "elm.swallow.content", wd->box);
+   evas_object_show(wd->box);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _object_resize, obj);
+   wd->id = 0;
+   wd->del_index = 0;
+   wd->insert_index = 0;
+   wd->cur_seg_id = -1;
+   wd->selected = EINA_FALSE;
+
+   deffont = edje_object_data_get(wd->base, "default_font_size");
+   if (deffont) wd->cur_fontsize = atoi(deffont);
+   else wd->cur_fontsize = 1;
+
+   maxheight = edje_object_data_get(wd->base, "max_height");
+   if (maxheight) wd->max_height = atoi(maxheight);
+   else wd->max_height = 1;
+
+   wpad = edje_object_data_get(wd->base, "w_pad");
+   if (wpad) wd->w_pad = atoi(wpad);
+   else wd->w_pad = 1;
+
+   hpad = edje_object_data_get(wd->base, "h_pad");
+   if (hpad) wd->h_pad = atoi(hpad);
+   else wd->h_pad = 1;
+
+   return obj;
+}
 
 EAPI Elm_Segment_Item *
-elm_segment_control_add_segment(Evas_Object *obj, Evas_Object *icon, const char *label, Eina_Bool animate)
+elm_segment_control_item_add(Evas_Object *obj, Evas_Object *icon, const char *label, Eina_Bool animate)
 {
+   Elm_Segment_Item *it;
    Widget_Data *wd = elm_widget_data_get(obj);
    if(!wd) return NULL;
 
-   Evas_Object *seg;
-   Elm_Segment_Item *it;
-
    it = _item_new(obj, label, icon);
-       if(!it)
-               return NULL;
+   if(!it) return NULL;
 
-       wd->seg_ctrl = eina_list_append(wd->seg_ctrl, it);
-       wd->id = eina_list_count(wd->seg_ctrl);
+   wd->seg_ctrl = eina_list_append(wd->seg_ctrl, it);
+   wd->id = eina_list_count(wd->seg_ctrl);
+   //_update_list(obj);
+   evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, it);
+   evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _mouse_up, it);
+   evas_object_event_callback_add(it->base, EVAS_CALLBACK_RESIZE, _object_item_resize, it);
+   wd->insert_index = 0;
+   wd->del_index = 0;
+   _refresh_segment_ids(obj);
 
-       _update_list(obj);
+   if(animate && it->segment_id && wd->ani_it == NULL)
+     {
+        evas_object_resize(it->base, 1, wd->height);
+       wd->ani_it = it;
+       wd->ani = ecore_animator_add( _animator_animate_add_cb, obj );
+     }
+   else
+      _state_value_set(obj);
+   evas_object_show( it->base);
 
-         edje_object_signal_callback_add(it->base, "elm,action,segment,click", "elm", _signal_segment_on, it);
-//             ++wd->id;
-         wd->insert_index = 0;
-         wd->del_index = 0;
-          _refresh_segment_ids(obj);
-
-       if(animate && it->segment_id && wd->ani_it == NULL)
-          {
-                               evas_object_resize(it->base, 1, wd->height);
-                               wd->ani_it = it;
-                               wd->ani = ecore_animator_add( _animator_animate_add_cb, obj );
-          }
-          else
-             _state_value_set(obj);
-       evas_object_show( it->base);
-
-       evas_object_box_append(wd->box, it->base);
-       evas_object_smart_calculate(wd->box);
+   evas_object_box_append(wd->box, it->base);
+   evas_object_smart_calculate(wd->box);
 
    return it;
 }
 
-
-static Elm_Segment_Item *
-_item_find(Evas_Object *obj, unsigned int index)
-{
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd)
-               return NULL;
-
-       Elm_Segment_Item *it;
-       Eina_List *l;
-
-       int i = 0;
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               if (i == index) {
-                       return it;
-               }
-               i++;
-       }
-       return NULL;
-}
-
-
-static Elm_Segment_Item *
-_item_search(Evas_Object *obj, Elm_Segment_Item *item)
-{
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd)
-               return NULL;
-
-       Elm_Segment_Item *it;
-       Eina_List *l;
-
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               if (it == item) {
-                       return it;
-               }
-       }
-       return NULL;
-}
-
 /**
- * Insert a new segment to segmentcontrol
+ * Add a new segment item to segmentcontrol
  * @param obj The SegmentControl object
- * @param icon The icon object for added segment
- * @param label The label for added segment
- * @param index The position at which segment to be inserted
+ * @param icon The icon object for added segment item
+ * @param label The label for added segment item
  * @param animate If 1 the action be animated with sliding effects default 0.
- * @return The new segment or NULL if it cannot be created
+ * @return The new segment item or NULL if it cannot be created
  *
  * @ingroup SegmentControl SegmentControl
  */
-EAPI void
-elm_segment_control_insert_segment_at(Evas_Object *obj, Evas_Object *icon, const char *label, unsigned int index, Eina_Bool animate)
+EAPI Elm_Segment_Item *
+elm_segment_control_add_segment(Evas_Object *obj, Evas_Object *icon, const char *label, Eina_Bool animate)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if(!wd) return;
+   Elm_Segment_Item * it;
+   it = elm_segment_control_item_add(obj, icon, label, animate);
+\r
+    return it;\r
+}
 
+EAPI Elm_Segment_Item *
+elm_segment_control_item_insert_at(Evas_Object *obj, Evas_Object *icon, const char *label, unsigned int index, Eina_Bool animate)
+{
    Elm_Segment_Item *it, *it_rel;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if(!wd) return NULL;
 
    it = _item_new(obj, label, icon);
    it_rel = _item_find(obj, index);
@@ -603,225 +729,260 @@ elm_segment_control_insert_segment_at(Evas_Object *obj, Evas_Object *icon, const
       wd->seg_ctrl = eina_list_append(wd->seg_ctrl, it);
      }
    else
-   {
-      if (!it) return;
-               wd->seg_ctrl = eina_list_prepend_relative(wd->seg_ctrl, it, it_rel);
-   }
-       edje_object_signal_callback_add(it->base, "elm,action,segment,click", "elm", _signal_segment_on, it);
+     {
+        if (!it) return NULL;
+       wd->seg_ctrl = eina_list_prepend_relative(wd->seg_ctrl, it, it_rel);
+     }
+   evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, it);
+   evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _mouse_up, it);
+   evas_object_event_callback_add(it->base, EVAS_CALLBACK_RESIZE, _object_item_resize, it);
    wd->insert_index = index;
-//     ++wd->id;
    wd->id = eina_list_count(wd->seg_ctrl);
    _refresh_segment_ids(obj);
 
-       _update_list(obj);
-
-
-       if(animate && it->segment_id && wd->ani_it == NULL)
-   {
-                       wd->ani_it = it;
-                       evas_object_resize(it->base, 1, wd->height);
-                       wd->ani = ecore_animator_add( _animator_animate_add_cb, obj );
-   }
+   //_update_list(obj);
+   if(animate && it->segment_id && wd->ani_it == NULL)
+     {
+        wd->ani_it = it;
+       evas_object_resize(it->base, 1, wd->height);
+       wd->ani = ecore_animator_add( _animator_animate_add_cb, obj );
+     }
    else
       _state_value_set(obj);
 
-       evas_object_show( it->base);
+   evas_object_show( it->base);
 
-        if(index >= wd->id-1)
-          {
-               evas_object_box_append(wd->box,  it->base);
-          }
-          else
-          {
-               evas_object_box_insert_at(wd->box,  it->base, index);
-          }
+   if(index >= wd->id-1)
+     {
+        evas_object_box_append(wd->box,  it->base);
+     }
+   else
+     {
+        evas_object_box_insert_at(wd->box,  it->base, index);
+     }
 
-               evas_object_smart_calculate(wd->box);
+   evas_object_smart_calculate(wd->box);
 
-   return;
+   return it ;
 }
-
 /**
- * Delete a segment to segmentcontrol
+ * Insert a new segment item to segmentcontrol
  * @param obj The SegmentControl object
- * @param item The Segment to be deleted
+ * @param icon The icon object for added segment item
+ * @param label The label for added segment item
+ * @param index The position at which segment item to be inserted
  * @param animate If 1 the action be animated with sliding effects default 0.
+ * @return The new segment item or NULL if it cannot be created
  *
  * @ingroup SegmentControl SegmentControl
  */
 EAPI void
-elm_segment_control_delete_segment(Evas_Object *obj, Elm_Segment_Item *item, Eina_Bool animate)
+elm_segment_control_insert_segment_at(Evas_Object *obj, Evas_Object *icon, const char *label, unsigned int index, Eina_Bool animate)
+{
+   Elm_Segment_Item *it;
+   it = elm_segment_control_item_insert_at(obj, icon, label, index, animate);
+
+   return;
+}
+
+EAPI void
+elm_segment_control_item_del(Evas_Object *obj, Elm_Segment_Item *item, Eina_Bool animate)
 {
+   Elm_Segment_Item *it;
    Widget_Data *wd = elm_widget_data_get(obj);
    if(!wd) return;
 
-   if(!item) return;
 
-   Elm_Segment_Item *it;
-   it = _item_search(obj, item);
+//   it = _item_search(obj, item);
+   it = item;
+   if(!it) return;
 
-   if(!it)
-       return;
    wd->del_index = it->segment_id;
+   if(animate && it->segment_id && wd->ani_it == NULL)
+     {
+        it->delete_me = EINA_TRUE;
+       wd->ani_it = it;
+       wd->ani = ecore_animator_add( _animator_animate_del_cb, obj );
+     }
+   else
+     {
+        evas_object_box_remove(wd->box, it->base);
+       evas_object_smart_calculate(wd->box);
 
-       if(animate && it->segment_id && wd->ani_it == NULL)
-       {
-                       it->delete_me = EINA_TRUE;
-                       wd->ani_it = it;
-                       wd->ani = ecore_animator_add( _animator_animate_del_cb, obj );
-       }
-       else
-       {
-               evas_object_box_remove(wd->box, it->base);
-               evas_object_smart_calculate(wd->box);
-               _item_free(obj, it);
-          _refresh_segment_ids(obj);
-               _state_value_set(obj);
-               _update_list(obj);
-       }
-//     --wd->id;
-       wd->id = eina_list_count(wd->seg_ctrl);
+       _item_free(obj, it);
+       _refresh_segment_ids(obj);
+       _state_value_set(obj);
+       //_update_list(obj);
+     }
+   wd->id = eina_list_count(wd->seg_ctrl);
    return;
 }
 
 /**
- * Delete a segment to segmentcontrol
+ * Delete a segment item to segmentcontrol
  * @param obj The SegmentControl object
- * @param index The position at which segment to be deleted
+ * @param index The position at which segment item to be deleted
  * @param animate If 1 the action be animated with sliding effects default 0.
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI void
+elm_segment_control_delete_segment(Evas_Object *obj, Elm_Segment_Item *item, Eina_Bool animate)
+{
+   elm_segment_control_item_del(obj, item, animate);
+
+   return;
+}
 
 EAPI void
-elm_segment_control_delete_segment_at(Evas_Object *obj,  unsigned int index, Eina_Bool animate)
+elm_segment_control_item_del_at(Evas_Object *obj,  unsigned int index, Eina_Bool animate)
 {
+   Elm_Segment_Item *it;
    Widget_Data *wd = elm_widget_data_get(obj);
    if(!wd) return;
-   Elm_Segment_Item *it, *it_rel;
 
    it = _item_find(obj, index);
 
-   if(!it)
-       return;
+   if(!it) return;
 
    wd->del_index = index;
-
-       if(animate && it->segment_id)
-               {
-                       if(wd->ani_it == NULL)
-                       {
-                               wd->ani_it = it;
-                               it->delete_me = EINA_TRUE;
-                               wd->ani = ecore_animator_add( _animator_animate_del_cb, obj );
-                       }
-                       else
-                       {
-                               wd->queue = eina_list_append(wd->queue, it);
-                       }
-               }
-               else
-               {
-                       evas_object_box_remove(wd->box, it->base);
-                       evas_object_smart_calculate(wd->box);
-                       _item_free(obj, it);
-                  _refresh_segment_ids(obj);
-                       _state_value_set(obj);
-                       _update_list(obj);
-               }
-
-//     --wd->id;
-       wd->id = eina_list_count(wd->seg_ctrl);
+   if(animate && it->segment_id)
+     {
+        if(wd->ani_it == NULL)
+       {
+          wd->ani_it = it;
+          it->delete_me = EINA_TRUE;
+          wd->ani = ecore_animator_add( _animator_animate_del_cb, obj );
+       }
+     }
+   else
+     {
+        evas_object_box_remove(wd->box, it->base);
+       evas_object_smart_calculate(wd->box);
+       _item_free(obj, it);
+       _refresh_segment_ids(obj);
+       _state_value_set(obj);
+       //_update_list(obj);
+     }
+   wd->id = eina_list_count(wd->seg_ctrl);
    return;
 }
 
 /**
- * Get the label of a segment of segmentcontrol
+ * Delete a segment item of given index to segmentcontrol
  * @param obj The SegmentControl object
- * @param index The index of the segment
- * @return The label
+ * @param index The position at which segment item to be deleted
+ * @param animate If 1 the action be animated with sliding effects default 0.
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI void
+elm_segment_control_delete_segment_at(Evas_Object *obj,  unsigned int index, Eina_Bool animate)
+{
+   elm_segment_control_item_del_at( obj, index, animate);
+
+   return;
+}
+
 
 EAPI const char *
-elm_segment_control_get_segment_label_at(Evas_Object *obj, unsigned int index)
+elm_segment_control_item_label_get(Evas_Object *obj, unsigned int index)
 {
-       Elm_Segment_Item *it_rel;
+   Elm_Segment_Item *it_rel;
    Widget_Data *wd = elm_widget_data_get(obj);
    if(!wd) return NULL;
 
    it_rel = _item_find(obj, index);
 
-   if(it_rel)
-      return it_rel->label;
+   if(it_rel) return it_rel->label;
 
    return NULL;
 }
 
 /**
- * Get the icon of a segment of segmentcontrol
+ * Get the label of a segment item of segmentcontrol
  * @param obj The SegmentControl object
- * @param index The index of the segment
- * @return The icon object
+ * @param index The index of the segment item
+ * @return The label of the segment item
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI const char *
+elm_segment_control_get_segment_label_at(Evas_Object *obj, unsigned int index)
+{
+   char *label;
+   label = elm_segment_control_item_label_get( obj, index);
+  
+   return label;
+}
 
 EAPI Evas_Object *
-elm_segment_control_get_segment_icon_at(Evas_Object *obj, unsigned int index)
+elm_segment_control_item_icon_get(Evas_Object *obj, unsigned int index)
 {
-       Elm_Segment_Item *seg_rel;
+   Elm_Segment_Item *seg_rel;
    Widget_Data *wd = elm_widget_data_get(obj);
    if(!wd) return NULL;
 
    seg_rel = _item_find(obj, index);
 
-   if(seg_rel)
-       return seg_rel->icon;
+   if(seg_rel) return seg_rel->icon;
 
    return NULL;
 }
 
 /**
- * Get the currently selected segment of segmentcontrol
+ * Get the icon of a segment item of segmentcontrol
  * @param obj The SegmentControl object
- * @param value The current segment id
- * @return The selected Segment
+ * @param index The index of the segment item
+ * @return The icon object or NULL if it is not found.
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI Evas_Object *
+elm_segment_control_get_segment_icon_at(Evas_Object *obj, unsigned int index)
+{
+   Evas_Object *icon;
+   icon = elm_segment_control_item_icon_get( obj, index);
+
+   return icon;
+}
 
 EAPI Elm_Segment_Item *
-elm_segment_control_selected_segment_get(const Evas_Object *obj, int *value)
+elm_segment_control_item_selected_get(const Evas_Object *obj)
 {
+   Elm_Segment_Item *it;
+   Eina_List *l;
    Widget_Data *wd = elm_widget_data_get(obj);
-       if(!wd || !wd->seg_ctrl) return NULL;
-
-       Elm_Segment_Item *it;
-       Eina_List *l;
+   if(!wd || !wd->seg_ctrl) return NULL;
 
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               if(it->segment_id == wd->cur_seg_id)
-                       {
-                               * value = wd->cur_seg_id;
-                               return it;
-                       }
-       }
-       return NULL;
-}
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+       if(it->segment_id == wd->cur_seg_id)
+       return it;
+      }
+    return NULL;
+ }
 
 /**
- * Get the count of segments of segmentcontrol
+ * Get the currently selected segment item of segmentcontrol
  * @param obj The SegmentControl object
- * @return The count of Segments
+ * @return The selected Segment item
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI Elm_Segment_Item *
+elm_segment_control_selected_segment_get(const Evas_Object *obj, int *value)
+{
+   Elm_Segment_Item *it;
+   it = elm_segment_control_item_selected_get( obj);
+   *value = it->segment_id;
+   \r
+    return it;
+ }
+
 
 EAPI int
-elm_segment_control_get_segment_count(Evas_Object *obj)
+elm_segment_control_item_count_get(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    if(!wd) return 0;
@@ -830,27 +991,130 @@ elm_segment_control_get_segment_count(Evas_Object *obj)
 }
 
 /**
- * set the size of segmentcontrol
+ * Get the count of segments of segmentcontrol
  * @param obj The SegmentControl object
- * @param width width of segment control
- * @param height height of segment control
+ * @return The count of Segment items
  *
  * @ingroup SegmentControl SegmentControl
  */
+EAPI int
+elm_segment_control_get_segment_count(Evas_Object *obj)
+{
+   int id;
+   id = elm_segment_control_item_count_get( obj);
+
+   return id;
+}
+
+/**
+ * Get the base object of segment item in segmentcontrol
+ * @param obj The Segment item
+ * @return obj The base object of the segment item
+ *
+ * @ingroup SegmentControl SegmentControl
+ */
+EAPI Evas_Object *
+elm_segment_control_item_object_get(Elm_Segment_Item *it)
+{
+   if (!it) return NULL;
+   
+   return it->base;
+}
 
+/**
+ * Select/unselect a particular segment item of segmentcontrol
+ * @param item The Segment item that is to be selected or unselected.
+ * @param select If 1 the segment item is selected and if 0 it will be unselected.
+ *
+ * @ingroup SegmentControl SegmentControl
+ */
 EAPI void
-elm_segment_control_set_size(Evas_Object *obj, int width, int height)
+elm_segment_control_item_selected_set( Elm_Segment_Item *item, Eina_Bool select)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if(!wd) return 0;
+   if(!item) return;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   if(!wd) return;
+
+   if(select)
+     {
+      if(item->segment_id == wd->cur_seg_id) return;
+      wd->selected = EINA_TRUE;
+      if(wd->data)
+        {      
+           evas_object_del((Evas_Object *)wd->data);
+           wd->data = NULL;
+       }
+      wd->data = item;
 
-   wd->scale_factor = elm_scale_get();
-       if ( wd->scale_factor == 0.0 ) {
-                       wd->scale_factor = 1.0;
-       }
+      }
+   else if(item->segment_id == wd->cur_seg_id)
+      {
+       wd->selected = EINA_FALSE;
+       wd->cur_seg_id = -1;
+       _signal_segment_off(item); 
+      } 
 
-   wd->item_width = wd->width = width*wd->scale_factor;
-   wd->height = height*wd->scale_factor;
+   return;
 
-   return 0;
 }
+
+/**
+ * Get a particular indexed segment item of segmentcontrol
+ * @param obj The Segment control object.
+ * @param index The index of the segment item.
+ * @return The corresponding Segment item.
+ *
+ * @ingroup SegmentControl SegmentControl
+ */
+EAPI Elm_Segment_Item *
+elm_segment_control_item_get_at(Evas_Object *obj, unsigned int index)
+{
+   Elm_Segment_Item *it;
+   it = _item_find(obj, index);
+
+   return it;
+}
+\r
+/**
+ * Get the index of a Segment item of Segmentcontrol
+ * @param item The Segment item.
+ * @return The corresponding index of the Segment item.
+ *
+ * @ingroup SegmentControl SegmentControl
+ */
+EAPI int
+elm_segment_control_item_index_get(Elm_Segment_Item *item)
+{
+   if(!item) return -1;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   if(!wd) return -1;
+
+   return item->segment_id;
+}
+
+/**
+ * Set The Label widget to a Segment item of Segmentcontrol
+ * @param item The Segment item.
+ * @param label The Label.
+ * @return Evas_Object The Label widget.
+ *
+ * @ingroup SegmentControl SegmentControl
+ */
+EAPI Evas_Object *
+elm_segment_control_item_label_object_set(Elm_Segment_Item *item, char *label)
+{
+   if(!item) return NULL;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   if(!wd) return NULL;
+   if(!label) return NULL;
+
+   item->label_wd = elm_label_add(item->obj);  
+   elm_label_label_set(item->label_wd, label);
+   elm_label_text_align_set(item->label_wd, "middle");
+   elm_label_ellipsis_set(item->label_wd, 1);
+   elm_label_line_wrap_set(item->label_wd, 1);
+   eina_stringshare_replace(&item->label, label);
+
+   return item->label_wd;
+}
+