[SegmentControl] To support guideline version-0.4.
authorPrince Kumar Dubey <prince.dubey@samsung.com>
Mon, 26 Jul 2010 11:13:28 +0000 (16:43 +0530)
committerPrince Kumar Dubey <prince.dubey@samsung.com>
Mon, 26 Jul 2010 11:13:28 +0000 (16:43 +0530)
src/lib/elm_segment_control.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 9d312fd..751db29
@@ -29,6 +29,7 @@ struct _Widget_Data
    unsigned int del_index;
    unsigned int cur_seg_id;
    double scale_factor;
+   Eina_Bool longpressed : 1;
 };
 
 struct _Elm_Segment_Item
@@ -37,16 +38,18 @@ struct _Elm_Segment_Item
    Evas_Object *base;
    Evas_Object *icon;
    const char *label;
-       Eina_Bool delete_me : 1;
+   Eina_Bool delete_me : 1;
    int segment_id;
+   Ecore_Timer *long_timer;
 };
 
-static void _signal_segment_on(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _mouse_up(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _signal_segment_on(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 _update_list(Evas_Object *obj);
 static void _refresh_segment_ids(Evas_Object *obj);
 static void _state_value_set(Evas_Object *obj);
@@ -67,52 +70,101 @@ _on_focus_hook(void *data, Evas_Object *obj)
 
    if (elm_widget_focus_get(obj))
      {
-          edje_object_signal_emit((Evas_Object *)wd->seg_ctrl, "elm,action,focus", "elm");
-          evas_object_focus_set((Evas_Object *)wd->seg_ctrl, 1);
+        edje_object_signal_emit((Evas_Object *)wd->seg_ctrl, "elm,action,focus", "elm");
+       evas_object_focus_set((Evas_Object *)wd->seg_ctrl, 1);
      }
    else
      {
-          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;
-                       }
-               }
+       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,action,unfocus", "elm");
+               edje_object_signal_emit(it->base, "elm,state,segment,off", "elm");
+               edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
+               break;
+            }
+         }
      }
 }
 
 static void
-_signal_segment_on(void *data, Evas_Object *obj, const char *emission, const char *source)
+_mouse_up(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-       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,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;
+   if(wd->longpressed == EINA_FALSE)
+     {
+       edje_object_signal_emit(item->base, "elm,action,unfocus", "elm");
+       edje_object_signal_emit(item->base, "elm,state,text,visible", "elm");
+     }
+   if (item->long_timer)
+     {
+       ecore_timer_del(item->long_timer);
+       item->long_timer = NULL;
+     }
+
+}
+
+static void
+_signal_segment_on(void *data)
+{
+   Elm_Segment_Item *item = (Elm_Segment_Item *) data;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+
+   if (!wd) return;
+
+   if (item->long_timer)
+     {
+       ecore_timer_del(item->long_timer);
+       item->long_timer = NULL;
+     }
+   wd->longpressed = EINA_TRUE;
+   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;
+       evas_object_smart_callback_call(item->obj, "changed", (void*)wd->cur_seg_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,action,unfocus", "elm");
+            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);
+   return;
+}
+
+static void
+_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);
+
+   if (!wd) return;
+   wd->longpressed = EINA_FALSE;
+
+   edje_object_signal_emit(item->base, "elm,action,focus", "elm");
+   edje_object_signal_emit(item->base, "elm,state,text,visible", "elm");
+
+   if (item->long_timer) ecore_timer_del(item->long_timer);
+   item->long_timer = ecore_timer_add(0.5, _signal_segment_on, item);
 }
 
 static void
@@ -135,11 +187,12 @@ _item_free(Evas_Object *obj, Elm_Segment_Item *it)
    if(it->icon) evas_object_del(it->icon);
    if(it->base) evas_object_del(it->base);
    if(it->label) eina_stringshare_del(it->label);
+   if (it->long_timer) ecore_timer_del(it->long_timer);
 
    if(it)
-       free(it);
+      free(it);
    it = NULL;
-       return;
+   return;
 }
 
 static void
@@ -152,8 +205,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,26 +225,24 @@ _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);
-
-       wd->item_width = wd->width = w;
-       wd->height = h;
+   Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
+   if (!wd) return;
+   Evas_Coord w = 0, h = 0;
 
-       _state_value_set((Evas_Object *)data);
+   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);
 }
 
 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);
 }
 
 /**
@@ -205,37 +255,36 @@ static void _object_resize(void *data, Evas *e, Evas_Object *obj, void *event_in
 EAPI Evas_Object *
 elm_segment_control_add(Evas_Object *parent)
 {
-       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);
-
-       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;
-
-       return obj;
+   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);
+
+   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 = 0;
+
+   return obj;
 }
 
 static Elm_Segment_Item*
@@ -259,235 +308,221 @@ _item_new(Evas_Object *obj, const char *label, Evas_Object *icon)
 
    if (it->label) eina_stringshare_del(it->label);
    if (label)
-        {
-                       it->label = eina_stringshare_add(label);
-        }
+     {
+        it->label = eina_stringshare_add(label);
+     }
    else
-        {
-                       it->label = NULL;
-        }
+     { 
+        it->label = NULL;
+     }
 
    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);
-        }
+     {
+        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, 1.0, 1.0);
-       evas_object_size_hint_align_set(obj, -1.0, -1.0);
+   edje_object_size_min_restricted_calc(obj, &mw, &mh, 0, 0);
+   evas_object_size_hint_weight_set(obj, 1.0, 1.0);
+   evas_object_size_hint_align_set(obj, -1.0, -1.0);
 
-       return it;
+   return it;
 }
 
 
 static void _update_list(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
+   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);
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   int i = 0;
+   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");              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);
 
-       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;
-       }
+       edje_object_part_text_set(it->base, "elm.text", it->label);
 
-       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++;
-       }
-}
+       edje_object_part_swallow(it->base, "elm.swallow.content", it->icon);
+       edje_object_signal_emit(it->base, "elm,state,icon,visible", "elm");
+       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");
+         }
 
-static void _refresh_segment_ids(Evas_Object *obj)
-{
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
+       edje_object_signal_emit(it->base, "elm,state,text,visible", "elm");
+       edje_object_message_signal_process(it->base);
 
-       Elm_Segment_Item *it;
-       Eina_List *l;
+       edje_object_part_text_set(it->base, "elm.text", it->label);
 
-       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;
-       }
+       edje_object_part_swallow(it->base, "elm.swallow.content", it->icon);
+       edje_object_signal_emit(it->base, "elm,state,icon,visible", "elm");
 
-       int i = 0;
-       EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
-       {
-               it->segment_id = i;
-               i++;
-       }
+       i++;
+     }
 }
 
-static void _state_value_set(Evas_Object *obj)
+
+static void _refresh_segment_ids(Evas_Object *obj)
 {
-       Widget_Data *wd = elm_widget_data_get(obj);
-       if (!wd) return;
+   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;
+     }
+   int i = 0;
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+        it->segment_id = i;
+       i++;
+     }
+}
 
-       Elm_Segment_Item *it;
-       Eina_List *l;
+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;
    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);
-       }
+   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
-                       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/15);
+          if( w1 > wd->item_width )
+              w1 = wd->item_width;
        }
+       w2 = (wd->width-w1)/(count -1);
+     }
+   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;
+    }
 
-       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);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
 
-       if( w <  wd->item_width )
-       {
-        _state_value_set(obj);
+   int w;
+   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 ECORE_CALLBACK_RENEW;
+     }
+   else
+     {
+        ecore_animator_del(wd->ani);
+       wd->ani = NULL;
+       wd->ani_it = NULL;
+       return 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;
+   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;
-       }
-       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 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 ECORE_CALLBACK_CANCEL;
+     }
 }
 
 /**
@@ -511,32 +546,29 @@ elm_segment_control_add_segment(Evas_Object *obj, Evas_Object *icon, const char
    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);
-
-       _update_list(obj);
-
-         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);
+   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);
+   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);
 
    return it;
 }
@@ -545,42 +577,39 @@ elm_segment_control_add_segment(Evas_Object *obj, Evas_Object *icon, const char
 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++;
+   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;
        }
-       return NULL;
+       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;
+   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;
-               }
+   Elm_Segment_Item *it;
+   Eina_List *l;
+   EINA_LIST_FOREACH(wd->seg_ctrl, l, it)
+     {
+        if (it == item) {
+          return it;
        }
-       return NULL;
+     }
+   return NULL;
 }
 
 /**
@@ -609,41 +638,38 @@ 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;
+       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);
    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);
-
-        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_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);
+     }
+   
+   evas_object_smart_calculate(wd->box);
    return;
 }
 
@@ -666,27 +692,24 @@ elm_segment_control_delete_segment(Evas_Object *obj, Elm_Segment_Item *item, Ein
    Elm_Segment_Item *it;
    it = _item_search(obj, 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);
-               _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 && 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 = eina_list_count(wd->seg_ctrl);
    return;
 }
 
@@ -708,36 +731,32 @@ elm_segment_control_delete_segment_at(Evas_Object *obj,  unsigned int index, Ein
 
    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
+         {
+            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 = eina_list_count(wd->seg_ctrl);
    return;
 }
 
@@ -753,14 +772,13 @@ elm_segment_control_delete_segment_at(Evas_Object *obj,  unsigned int index, Ein
 EAPI const char *
 elm_segment_control_get_segment_label_at(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;
 }
@@ -777,14 +795,13 @@ elm_segment_control_get_segment_label_at(Evas_Object *obj, unsigned int index)
 EAPI Evas_Object *
 elm_segment_control_get_segment_icon_at(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;
 }
@@ -802,20 +819,20 @@ EAPI Elm_Segment_Item *
 elm_segment_control_selected_segment_get(const Evas_Object *obj, int *value)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-       if(!wd || !wd->seg_ctrl) return NULL;
+   if(!wd || !wd->seg_ctrl) return NULL;
 
-       Elm_Segment_Item *it;
-       Eina_List *l;
+   Elm_Segment_Item *it;
+   Eina_List *l;
 
-       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)
+         {
+            *value = wd->cur_seg_id;
+            return it;
+         }
+     }
+   return NULL;
 }
 
 /**
@@ -851,9 +868,9 @@ elm_segment_control_set_size(Evas_Object *obj, int width, int height)
    if(!wd) return 0;
 
    wd->scale_factor = elm_scale_get();
-       if ( wd->scale_factor == 0.0 ) {
-                       wd->scale_factor = 1.0;
-       }
+   if ( wd->scale_factor == 0.0 ) {
+      wd->scale_factor = 1.0;
+   }
 
    wd->item_width = wd->width = width*wd->scale_factor;
    wd->height = height*wd->scale_factor;