elementary/listmerged with opensource (Revision: 60124)Fixed for potential duplicated...
authorChunEon Park <chuneon.park@samsung.com>
Fri, 10 Jun 2011 02:19:32 +0000 (11:19 +0900)
committerChunEon Park <chuneon.park@samsung.com>
Fri, 10 Jun 2011 02:49:14 +0000 (11:49 +0900)
src/lib/elm_list.c

index f801889..0334808 100644 (file)
@@ -96,6 +96,27 @@ static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src,
                              Evas_Callback_Type type, void *event_info);
 static Eina_Bool _deselect_all_items(Widget_Data *wd);
 
+static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
+static const char SIG_SELECTED[] = "selected";
+static const char SIG_UNSELECTED[] = "unselected";
+static const char SIG_LONGPRESSED[] = "longpressed";
+static const char SIG_SCROLL_EDGE_TOP[] = "scroll,edge,top";
+static const char SIG_SCROLL_EDGE_BOTTOM[] = "scroll,edge,bottom";
+static const char SIG_SCROLL_EDGE_LEFT[] = "scroll,edge,left";
+static const char SIG_SCROLL_EDGE_RIGHT[] = "scroll,edge,right";
+
+static const Evas_Smart_Cb_Description _signals[] = {
+   {SIG_CLICKED_DOUBLE, ""},
+   {SIG_SELECTED, ""},
+   {SIG_UNSELECTED, ""},
+   {SIG_LONGPRESSED, ""},
+   {SIG_SCROLL_EDGE_TOP, ""},
+   {SIG_SCROLL_EDGE_BOTTOM, ""},
+   {SIG_SCROLL_EDGE_LEFT, ""},
+   {SIG_SCROLL_EDGE_RIGHT, ""},
+   {NULL, NULL}
+};
+
 #define ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ...)                      \
    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, __VA_ARGS__);             \
 if (it->deleted)                                                         \
@@ -425,21 +446,18 @@ _elm_list_unwalk(Widget_Data *wd)
      }
 }
 
-// FIXME : This function might be unnecessary, fix self deletion bug then remove this function.
 static void
 _del_pre_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
 
-   if (wd->scr)
-     evas_object_event_callback_del_full
-                     (wd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints,
-                      obj);
-   if (wd->box)
-     evas_object_event_callback_del_full
-                     (wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints,
-                      obj);
+   evas_object_event_callback_del(wd->scr,
+                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                  _changed_size_hints);
+   evas_object_event_callback_del(wd->box,
+                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                  _changed_size_hints);
 }
 
 static void
@@ -654,28 +672,25 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
 
    if (!wd) return;
    if (!sub) abort();
-   if (sub == wd->scr)
-     wd->scr = NULL;
-   else
+   if ((sub == wd->box) || (sub == wd->scr)) return;
+
+   EINA_LIST_FOREACH(wd->items, l, it)
      {
-        EINA_LIST_FOREACH(wd->items, l, it)
+        if ((sub == it->icon) || (sub == it->end))
           {
-             if ((sub == it->icon) || (sub == it->end))
+             if (it->icon == sub) it->icon = NULL;
+             if (it->end == sub) it->end = NULL;
+             evas_object_event_callback_del_full
+             (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints,
+              obj);
+             if (!wd->walking)
                {
-                  if (it->icon == sub) it->icon = NULL;
-                  if (it->end == sub) it->end = NULL;
-                  evas_object_event_callback_del_full
-                     (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints,
-                      obj);
-                  if (!wd->walking)
-                    {
-                       _fix_items(obj);
-                       _sizing_eval(obj);
-                    }
-                  else
-                    wd->fix_pending = EINA_TRUE;
-                  break;
+                  _fix_items(obj);
+                  _sizing_eval(obj);
                }
+             else
+               wd->fix_pending = EINA_TRUE;
+             break;
           }
      }
 }
@@ -725,7 +740,7 @@ call:
    _elm_list_walk(wd);
 
    if (it->func) it->func((void *)it->base.data, it->base.widget, it);
-   evas_object_smart_callback_call(obj, "selected", it);
+   evas_object_smart_callback_call(obj, SIG_SELECTED, it);
    it->wd->last_selected_item = it;
 
    _elm_list_unwalk(wd);
@@ -759,7 +774,7 @@ _item_unselect(Elm_List_Item *it)
      {
         it->selected = EINA_FALSE;
         wd->selected = eina_list_remove(wd->selected, it);
-        evas_object_smart_callback_call(it->base.widget, "unselected", it);
+        evas_object_smart_callback_call(it->base.widget, SIG_UNSELECTED, it);
      }
 
    _elm_list_unwalk(wd);
@@ -826,28 +841,28 @@ static void
 _scroll_edge_left(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
 {
    Evas_Object *obj = data;
-   evas_object_smart_callback_call(obj, "scroll,edge,left", NULL);
+   evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_LEFT, NULL);
 }
 
 static void
 _scroll_edge_right(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
 {
    Evas_Object *obj = data;
-   evas_object_smart_callback_call(obj, "scroll,edge,right", NULL);
+   evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_RIGHT, NULL);
 }
 
 static void
 _scroll_edge_top(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
 {
    Evas_Object *obj = data;
-   evas_object_smart_callback_call(obj, "scroll,edge,top", NULL);
+   evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_TOP, NULL);
 }
 
 static void
 _scroll_edge_bottom(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
 {
    Evas_Object *obj = data;
-   evas_object_smart_callback_call(obj, "scroll,edge,bottom", NULL);
+   evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_BOTTOM, NULL);
 }
 
 static Eina_Bool
@@ -864,7 +879,7 @@ _long_press(void *data)
    if (it->disabled) goto end;
 
    wd->longpressed = EINA_TRUE;
-   evas_object_smart_callback_call(it->base.widget, "longpressed", it);
+   evas_object_smart_callback_call(it->base.widget, SIG_LONGPRESSED, it);
 
 end:
    return ECORE_CALLBACK_CANCEL;
@@ -917,7 +932,9 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void
    it->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
    /* Always call the callbacks last - the user may delete our context! */
    if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
-     evas_object_smart_callback_call(it->base.widget, "clicked,double", it);
+     {
+        evas_object_smart_callback_call(it->base.widget, SIG_CLICKED_DOUBLE, it);
+     }
    wd->swipe = EINA_FALSE;
    wd->movements = 0;
 
@@ -1357,6 +1374,8 @@ elm_list_add(Evas_Object *parent)
    evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
    evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
 
+   evas_object_smart_callbacks_descriptions_set(obj, _signals);
+
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
    _sizing_eval(obj);
    return obj;