repackaging - elementary_1.0.0+svn.61256slp2+build99 REL_F_I9500_20111130_1
authorChunEon Park <chuneon.park@samsung.com>
Tue, 29 Nov 2011 07:18:22 +0000 (16:18 +0900)
committerChunEon Park <chuneon.park@samsung.com>
Tue, 29 Nov 2011 07:18:22 +0000 (16:18 +0900)
revert navigationbar, navigationbar_ex, slidingdrawer.

they would be removed on this Thursday(12/1)

debian/changelog
src/lib/Elementary.h.in
src/lib/Makefile.am
src/lib/elc_navigationbar.c [new file with mode: 0644]
src/lib/elc_navigationbar_ex.c [new file with mode: 0644]
src/lib/elm_slidingdrawer.c [new file with mode: 0644]

index 67fe425..3cefbe1 100644 (file)
@@ -1,3 +1,11 @@
+elementary (1.0.0+svn.61256slp2+build99) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/elementary
+  * Tag: elementary_1.0.0+svn.61256slp2+build99
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Tue, 29 Nov 2011 16:17:39 +0900
+
 elementary (1.0.0+svn.61256slp2+build98) unstable; urgency=low
 
   * Package Upload
index a59ec0f..43419fb 100644 (file)
@@ -28906,6 +28906,84 @@ extern "C" {
    EAPI void         elm_popup_orient_set(Evas_Object *obj, Elm_Popup_Orient orient);
    EAPI int          elm_popup_run(Evas_Object *obj);
 
+   /* NavigationBar */
+   #define NAVIBAR_TITLEOBJ_INSTANT_HIDE "elm,state,hide,noanimate,title", "elm"
+   #define NAVIBAR_TITLEOBJ_INSTANT_SHOW "elm,state,show,noanimate,title", "elm"
+
+   typedef enum
+     {
+        ELM_NAVIGATIONBAR_FUNCTION_BUTTON1,
+        ELM_NAVIGATIONBAR_FUNCTION_BUTTON2,
+        ELM_NAVIGATIONBAR_FUNCTION_BUTTON3,
+        ELM_NAVIGATIONBAR_BACK_BUTTON
+     } Elm_Navi_Button_Type;
+
+   EINA_DEPRECATED EAPI Evas_Object *elm_navigationbar_add(Evas_Object *parent);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_push(Evas_Object *obj, const char *title, Evas_Object *fn_btn1, Evas_Object *fn_btn2, Evas_Object *fn_btn3, Evas_Object *content);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_pop(Evas_Object *obj);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_to_content_pop(Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_title_label_set(Evas_Object *obj, Evas_Object *content, const char *title);
+   EINA_DEPRECATED    EAPI const char  *elm_navigationbar_title_label_get(Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_title_object_add(Evas_Object *obj, Evas_Object *content, Evas_Object *title_obj);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_title_object_get(Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED    EAPI Eina_List   *elm_navigationbar_title_object_list_get(Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_content_top_get(Evas_Object *obj);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_content_bottom_get(Evas_Object *obj);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_hidden_set(Evas_Object *obj, Eina_Bool hidden);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_title_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button, Elm_Navi_Button_Type button_type);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_title_button_get(Evas_Object *obj, Evas_Object *content, Elm_Navi_Button_Type button_type);
+   EINA_DEPRECATED    EAPI const char  *elm_navigationbar_subtitle_label_get(Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_subtitle_label_set(Evas_Object *obj, Evas_Object *content, const char *subtitle);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_title_object_list_unset(Evas_Object *obj, Evas_Object *content, Eina_List **list);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_animation_disabled_set(Evas_Object *obj, Eina_Bool disable);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_title_object_visible_set(Evas_Object *obj, Evas_Object *content, Eina_Bool visible);
+   EINA_DEPRECATED    Eina_Bool         elm_navigationbar_title_object_visible_get(Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_title_icon_set(Evas_Object *obj, Evas_Object *content, Evas_Object *icon);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_title_icon_get(Evas_Object *obj, Evas_Object *content);
+
+   /* NavigationBar */
+   #define NAVIBAR_EX_TITLEOBJ_INSTANT_HIDE "elm,state,hide,noanimate,title", "elm"
+   #define NAVIBAR_EX_TITLEOBJ_INSTANT_SHOW "elm,state,show,noanimate,title", "elm"
+
+   typedef enum
+     {
+        ELM_NAVIGATIONBAR_EX_BACK_BUTTON,
+        ELM_NAVIGATIONBAR_EX_FUNCTION_BUTTON1,
+        ELM_NAVIGATIONBAR_EX_FUNCTION_BUTTON2,
+        ELM_NAVIGATIONBAR_EX_FUNCTION_BUTTON3,
+        ELM_NAVIGATIONBAR_EX_MAX
+     } Elm_Navi_ex_Button_Type;
+   typedef struct _Elm_Navigationbar_ex_Item Elm_Navigationbar_ex_Item;
+
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_add(Evas_Object *parent);
+   EINA_DEPRECATED    EAPI Elm_Navigationbar_ex_Item *elm_navigationbar_ex_item_push(Evas_Object *obj, Evas_Object *content, const char *item_style);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_pop(Evas_Object *obj);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_promote(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_to_item_pop(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_title_label_set(Elm_Navigationbar_ex_Item *item, const char *title);
+   EINA_DEPRECATED    EAPI const char  *elm_navigationbar_ex_item_title_label_get(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI Elm_Navigationbar_ex_Item *elm_navigationbar_ex_item_top_get(const Evas_Object *obj);
+   EINA_DEPRECATED    EAPI Elm_Navigationbar_ex_Item *elm_navigationbar_ex_item_bottom_get(const Evas_Object *obj);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_title_button_set(Elm_Navigationbar_ex_Item* item, char *btn_label, Evas_Object *icon, int button_type, Evas_Smart_Cb func, const void *data);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_title_button_get(Elm_Navigationbar_ex_Item* item, int button_type);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_title_object_set(Elm_Navigationbar_ex_Item* item, Evas_Object *title_obj);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_title_object_unset(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_title_hidden_set(Elm_Navigationbar_ex_Item* item, Eina_Bool hidden);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_title_object_get(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI const char  *elm_navigationbar_ex_item_subtitle_label_get(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_subtitle_label_set( Elm_Navigationbar_ex_Item* item, const char *subtitle);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_style_set(Elm_Navigationbar_ex_Item* item, const char* item_style);
+   EINA_DEPRECATED    EAPI const char  *elm_navigationbar_ex_item_style_get(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_content_unset(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_content_get(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_delete_on_pop_set(Evas_Object *obj, Eina_Bool del_on_pop);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_icon_get(Elm_Navigationbar_ex_Item* item);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_item_icon_set(Elm_Navigationbar_ex_Item* item, Evas_Object *icon);
+   EINA_DEPRECATED    EAPI Evas_Object *elm_navigationbar_ex_item_title_button_unset(Elm_Navigationbar_ex_Item* item, int button_type);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_animation_disable_set(Evas_Object *obj, Eina_Bool disable);
+   EINA_DEPRECATED    EAPI void         elm_navigationbar_ex_title_object_visible_set(Elm_Navigationbar_ex_Item* item, Eina_Bool visible);
+   EINA_DEPRECATED    Eina_Bool         elm_navigationbar_ex_title_object_visible_get(Elm_Navigationbar_ex_Item* item);
+
    /**
     * @defgroup Naviframe Naviframe
     * @ingroup Elementary
@@ -30009,6 +30087,28 @@ extern "C" {
     * @{
     */
 
+   /* Sliding Drawer */
+   typedef enum _Elm_SlidingDrawer_Pos
+     {
+        ELM_SLIDINGDRAWER_BOTTOM,
+        ELM_SLIDINGDRAWER_LEFT,
+        ELM_SLIDINGDRAWER_RIGHT,
+        ELM_SLIDINGDRAWER_TOP
+     } Elm_SlidingDrawer_Pos;
+
+   typedef struct _Elm_SlidingDrawer_Drag_Value
+     {
+        double x, y;
+     } Elm_SlidingDrawer_Drag_Value;
+
+   EINA_DEPRECATED EAPI Evas_Object *elm_slidingdrawer_add(Evas_Object *parent);
+   EINA_DEPRECATED EAPI void         elm_slidingdrawer_content_set (Evas_Object *obj, Evas_Object *content);
+   EINA_DEPRECATED EAPI Evas_Object *elm_slidingdrawer_content_unset(Evas_Object *obj);
+   EINA_DEPRECATED EAPI void         elm_slidingdrawer_pos_set(Evas_Object *obj, Elm_SlidingDrawer_Pos pos);
+   EINA_DEPRECATED EAPI void         elm_slidingdrawer_max_drag_value_set(Evas_Object *obj, double dw,  double dh);
+   EINA_DEPRECATED EAPI void         elm_slidingdrawer_drag_value_set(Evas_Object *obj, double dx, double dy);
+
+   /* multibuttonentry */
    typedef struct _Multibuttonentry_Item Elm_Multibuttonentry_Item;
    typedef Eina_Bool (*Elm_Multibuttonentry_Item_Verify_Callback) (Evas_Object *obj, const char *item_label, void *item_data, void *data);
 
index e3770d0..04f6cdc 100644 (file)
@@ -49,6 +49,8 @@ elc_fileselector.c \
 elc_fileselector_entry.c \
 elc_hoversel.c \
 elc_naviframe.c \
+elc_navigationbar.c \
+elc_navigationbar_ex.c\
 elc_multibuttonentry.c \
 elc_player.c \
 elc_scrolled_entry.c \
@@ -116,6 +118,7 @@ elm_segment_control.c \
 elm_separator.c \
 elm_slider.c \
 elm_slideshow.c \
+elm_slidingdrawer.c \
 elm_spinner.c \
 elm_stackedicon.c \
 elm_store.c \
diff --git a/src/lib/elc_navigationbar.c b/src/lib/elc_navigationbar.c
new file mode 100644 (file)
index 0000000..8a33a0f
--- /dev/null
@@ -0,0 +1,1491 @@
+#include <Elementary.h>
+#include "elm_priv.h"
+
+/**
+ * @defgroup NavigationBar NavigationBar
+ * @ingroup Elementary
+ *
+ * The Navigationbar is an object that allows flipping (with animation) between 1 or
+ * more of objects, much like a stack of windows within the window. It also displays title
+ * area above all the pages consisting of title,function buttons.
+ *
+ * Objects can be pushed or popped from the stack.
+ * Pushes and pops will animate (and a pop will delete the object once the
+ * animation is finished). Objects are pushed to the top with
+ * elm_navigationbar_push() and when the top item is no longer
+ * wanted, simply pop it with elm_navigationbar_pop() and it will also be
+ * deleted. You can query which objects are the top and bottom with
+ * elm_navigationbar_content_bottom_get() and elm_navigationbar_content_top_get().
+ */
+
+#define _ELM_NAVIBAR_PREV_BTN_DEFAULT_LABEL "Previous"
+
+typedef struct _Widget_Data Widget_Data;
+typedef struct _Elm_Navigationbar_Item Elm_Navigationbar_Item;
+typedef struct _Transit_Cb_Data Transit_Cb_Data;
+
+static const char _navigationbar_key[] = "_elm_navigationbar";
+
+//TODO: Remove!
+typedef enum
+  {
+     ELM_NAVIGATIONBAR_PREV_BUTTON = ELM_NAVIGATIONBAR_FUNCTION_BUTTON1,
+     ELM_NAVIGATIONBAR_NEXT_BUTTON = ELM_NAVIGATIONBAR_FUNCTION_BUTTON2,
+     ELM_NAVIGATIONBAR_TITLE_BTN_CNT = 2
+  } Elm_Navigationbar_Button_Type;
+
+struct _Widget_Data
+{
+   Eina_List *stack;
+   Evas_Object *rect;
+   Evas_Object *base;
+   Evas_Object *pager;
+   Eina_Bool title_visible : 1;
+   Eina_Bool popping: 1;
+ };
+
+struct _Elm_Navigationbar_Item
+{
+   Elm_Widget_Item base;
+   const char *title;
+   const char *subtitle;
+   Eina_List *title_obj_list;   //TODO: Remove!
+   Evas_Object *title_obj;
+   Evas_Object *title_btns[ELM_NAVIGATIONBAR_TITLE_BTN_CNT];
+   Evas_Object *content;
+   Evas_Object *icon;
+   Eina_Bool titleobj_visible :1;
+   Eina_Bool back_btn :1;
+};
+
+//TODO: Remove!
+struct _Transit_Cb_Data
+{
+   Elm_Navigationbar_Item* prev_it;
+   Elm_Navigationbar_Item* it;
+   Evas_Object *navibar;
+   Eina_Bool pop : 1;
+   Eina_Bool first_page : 1;
+};
+
+static const char *widtype = NULL;
+
+static void _del_hook(Evas_Object *obj);
+static void _theme_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _item_sizing_eval(Elm_Navigationbar_Item *it);
+static void _item_del(Elm_Navigationbar_Item *it);
+static void _back_button_clicked(void *data, Evas_Object *obj, void *event_info);
+static void _button_size_set(Evas_Object *obj);
+static Eina_Bool _button_set(Evas_Object *obj, Evas_Object *prev_btn, Evas_Object *new_btn, Eina_Bool back_btn);
+static void _transition_complete_cb(void *data);
+static void _elm_navigationbar_prev_btn_set(Evas_Object *obj,
+                                            Evas_Object *content,
+                                            Evas_Object *new_btn,
+                                            Elm_Navigationbar_Item *it);
+static void _elm_navigationbar_next_btn_set(Evas_Object *obj,
+                                            Evas_Object *content,
+                                            Evas_Object *new_btn,
+                                            Elm_Navigationbar_Item *it);
+static void _title_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _titleobj_switching(Evas_Object *obj, Elm_Navigationbar_Item *it);
+static void _emit_hook(Evas_Object *obj, const char *emission, const char *source);
+
+static const char SIG_HIDE_FINISHED[] = "hide,finished";
+static const char SIG_TITLE_OBJ_VISIBLE_CHANGED[] = "titleobj,visible,changed";
+static const char SIG_TITLE_CLICKED[] = "title,clicked";
+
+static const Evas_Smart_Cb_Description _signals[] = {
+       {SIG_HIDE_FINISHED, ""},
+       {SIG_TITLE_OBJ_VISIBLE_CHANGED, ""},
+       {SIG_TITLE_CLICKED, ""},
+       {NULL, NULL}
+};
+
+static void
+_content_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Navigationbar_Item *it = data;
+   evas_object_data_del(obj, _navigationbar_key);
+   it->content = NULL;
+   //TODO: it will be better remove this page?
+}
+
+static void
+_title_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Navigationbar_Item *it = data;
+   Eina_List *l = NULL;
+   elm_navigationbar_title_object_list_unset(it->base.widget, it->content, &l);
+   if (!l) return;
+   evas_object_del(eina_list_data_get(l));
+   eina_list_free(l);
+}
+
+static void
+_title_icon_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Navigationbar_Item *it = data;
+   it->icon = NULL;
+}
+
+static void
+_title_btn_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Elm_Navigationbar_Item *it = data;
+
+   if (it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON] == obj)
+     it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON] = NULL;
+   else if (it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON] == obj)
+     it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON] = NULL;
+}
+
+static Eina_Bool
+_title_btn_set(Elm_Navigationbar_Item *it, Evas_Object *btn, int title_btn_idx, Eina_Bool back_btn)
+{
+   Eina_Bool changed;
+
+   if(it->title_btns[title_btn_idx] == btn) return EINA_FALSE;
+
+   changed = _button_set(it->base.widget, it->title_btns[title_btn_idx], btn, back_btn);
+   it->title_btns[title_btn_idx] = btn;
+
+   if ((!changed) || (!btn)) return EINA_FALSE;
+
+   it->back_btn = back_btn;
+
+   evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, _title_btn_del, it);
+
+   return EINA_TRUE;
+}
+
+static Evas_Object *
+_create_back_btn(Evas_Object *parent, const char *title, void *data)
+{
+   Evas_Object *btn = elm_button_add(parent);
+   if (!btn) return NULL;
+   elm_object_text_set(btn, title);
+   evas_object_smart_callback_priority_add(btn, "clicked", EVAS_CALLBACK_PRIORITY_AFTER, _back_button_clicked, data);
+   return btn;
+}
+
+static void
+_del_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *list;
+   Elm_Navigationbar_Item *it;
+
+   EINA_LIST_FOREACH(wd->stack, list, it)
+     _item_del(it);
+   eina_list_free(wd->stack);
+   free(wd);
+}
+
+void
+_emit_hook(Evas_Object *obj, const char *emission, const char *source)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+
+   Widget_Data *wd;
+   Eina_List *last;
+   Elm_Navigationbar_Item *it;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   last = eina_list_last(wd->stack);
+   if (!last) return;
+
+   it = eina_list_data_get(last);
+   if ((!it) || (!it->title_obj)) return;
+
+   //FIXME: I know this is really bullshit.
+   //We don't need to keep the titleobj_visible but return the status in edc.
+   if (!strcmp(source, "elm"))
+     {
+        if (!strcmp(emission, "elm,state,hide,noanimate,title"))
+          it->titleobj_visible = EINA_FALSE;
+        else if (!strcmp(emission, "elm,state,show,noanimate,title"))
+          it->titleobj_visible = EINA_TRUE;
+     }
+
+   edje_object_signal_emit(wd->base, emission, source);
+}
+
+static void
+_theme_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *list = NULL;
+   Elm_Navigationbar_Item *it = NULL;
+
+   if (!wd) return;
+   _elm_theme_object_set(obj, wd->base, "navigationbar", "base", elm_widget_style_get(obj));
+
+   list = eina_list_last(wd->stack);
+   if (list)
+     {
+        it = eina_list_data_get(list);
+        if (it)
+          {
+             //buttons
+             if (it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON])
+               edje_object_part_swallow(wd->base, "elm.swallow.prev_btn", it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+             if (it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON])
+               edje_object_part_swallow(wd->base, "elm.swallow.next_btn", it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+
+             //icon
+             if (it->icon)
+               {
+                  edje_object_part_swallow(wd->base, "elm.swallow.icon", it->icon);
+                  edje_object_signal_emit(wd->base, "elm,state,icon,visible", "elm");
+               }
+
+             //title text
+             if (it->title)
+               edje_object_part_text_set(wd->base, "elm.text", it->title);
+
+             //title object
+             if (it->title_obj)
+               {
+                  edje_object_part_swallow(wd->base, "elm.swallow.title", it->title_obj);
+
+                  if (it->titleobj_visible)
+                    edje_object_signal_emit(wd->base, "elm,state,show,noanimate,title", "elm");
+                  else
+                    edje_object_signal_emit(wd->base, "elm,state,hide,noanimate,title", "elm"); //elm,state,title,hide
+
+                  if (it->title)
+                    edje_object_signal_emit(wd->base, "elm,state,show,extended", "elm");
+               }
+            }
+     }
+
+   if (!wd->title_visible)
+     edje_object_signal_emit(wd->base, "elm,state,item,moveup", "elm");
+
+   edje_object_message_signal_process(wd->base);
+   _sizing_eval(obj);
+}
+
+static void
+_item_del(Elm_Navigationbar_Item *it)
+{
+   //TODO: So hard to manage.
+   //TODO: Just prepare one layout for title objects.
+   //TODO: then remove the layout only.
+   Widget_Data *wd;
+   int idx;
+
+   if (!it) return;
+
+   wd = elm_widget_data_get(it->base.widget);
+   if (!wd) return;
+
+   //Remove Function Buttons
+   for (idx = 0; idx < ELM_NAVIGATIONBAR_TITLE_BTN_CNT; idx++)
+     {
+        if (!it->title_btns[idx]) continue;
+        if (!it->back_btn) elm_object_unfocus(it->title_btns[idx]);
+        evas_object_event_callback_del(it->title_btns[idx], EVAS_CALLBACK_DEL, _title_btn_del);
+        evas_object_del(it->title_btns[idx]);
+     }
+   if (it->icon)
+     {
+        evas_object_event_callback_del(it->icon, EVAS_CALLBACK_DEL, _title_icon_del);
+        evas_object_del(it->icon);
+     }
+   if (it->title_obj)
+     {
+        evas_object_event_callback_del(it->title_obj, EVAS_CALLBACK_DEL, _title_obj_del);
+        evas_object_del(it->title_obj);
+        eina_list_free(it->title_obj_list);
+     }
+   if (it->title) eina_stringshare_del(it->title);
+   if (it->subtitle) eina_stringshare_del(it->subtitle);
+
+   if (it->content)
+     {
+        evas_object_data_del(it->content, _navigationbar_key);
+        evas_object_event_callback_del(it->content, EVAS_CALLBACK_DEL, _content_del);
+     }
+
+   free(it);
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+   Widget_Data *wd;
+   Eina_List *list;
+
+   wd  = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   list = eina_list_last(wd->stack);
+   if (!list) return;
+
+   _item_sizing_eval(list->data);
+}
+
+static void
+_item_sizing_eval(Elm_Navigationbar_Item *it)
+{
+   if (!it) return;
+   Widget_Data *wd = elm_widget_data_get(it->base.widget);
+   Evas_Coord minw;
+
+   if (!wd) return;
+
+   edje_object_size_min_calc(wd->base, &minw, NULL);
+
+   //TODO: Even the below code for size calculation is redundant and should be removed.
+   //TODO: Item_sizing_eval function has to be totally refactored/removed.
+   _button_size_set(it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+   _button_size_set(it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+}
+
+static void
+_resize(void *data __UNUSED__, Evas *e  __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   Evas_Coord w, h;
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_resize(wd->rect, w, h);
+
+   _sizing_eval(obj);
+}
+
+static void
+_hide(void *data __UNUSED__, Evas *e  __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   evas_object_hide(wd->rect);
+}
+
+static void
+_move(void *data __UNUSED__, Evas *e  __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   Evas_Coord x, y;
+   evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+   evas_object_move(wd->rect, x, y);
+}
+
+static void
+_titleobj_switching(Evas_Object *obj, Elm_Navigationbar_Item *it)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   if (!it->title_obj) return;
+
+   if (elm_navigationbar_content_top_get(it->base.widget) != it->content)
+     return;
+
+   if (it->titleobj_visible)
+     edje_object_signal_emit(wd->base, "elm,state,show,title", "elm"); //elm,state,title,show
+   else
+     edje_object_signal_emit(wd->base, "elm,state,hide,title", "elm"); //elm,state,title,hide
+
+   _item_sizing_eval(it);
+}
+
+static void
+_title_clicked(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Evas_Object *navibar = data;
+   Widget_Data *wd;
+   Eina_List *last;
+   Elm_Navigationbar_Item *it;
+
+   wd = elm_widget_data_get(navibar);
+   if (!wd) return;
+
+   last = eina_list_last(wd->stack);
+   if (!last) return;
+
+   it = eina_list_data_get(last);
+   if ((!it) || (!it->title_obj)) return;
+
+   if (!it->titleobj_visible)
+     {
+        it->titleobj_visible = EINA_TRUE;
+        evas_object_smart_callback_call(it->base.widget, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_TRUE);
+     }
+   else
+     {
+        it->titleobj_visible = EINA_FALSE;
+        evas_object_smart_callback_call(it->base.widget, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_FALSE);
+     }
+
+   evas_object_smart_callback_call(navibar, SIG_TITLE_CLICKED, NULL);
+
+   _titleobj_switching(navibar, it);
+}
+
+//TODO: should be renamed.
+static void
+_transition_complete_cb(void *data)
+{
+   Evas_Object *navi_bar;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *prev_it;
+   Elm_Navigationbar_Item *it;
+   Eina_List *ll;
+
+   Transit_Cb_Data *cb = data;
+   if (!cb) return;
+
+   navi_bar = cb->navibar;
+   if (!navi_bar) return;
+
+   wd = elm_widget_data_get(navi_bar);
+   if (!wd) return;
+
+   prev_it = cb->prev_it;
+   it = cb->it;
+
+   if (cb->pop && prev_it)
+     {
+        ll = eina_list_last(wd->stack);
+        if (ll->data == prev_it)
+          {
+             _item_del(prev_it);
+             wd->stack = eina_list_remove_list(wd->stack, ll);
+          }
+     }
+   else if (prev_it)
+     {
+        if (prev_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON])
+           evas_object_hide(prev_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+        if (prev_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON])
+          evas_object_hide(prev_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+        if (prev_it->title_obj)
+          evas_object_hide(prev_it->title_obj);
+        if (prev_it->icon)
+          evas_object_hide(prev_it->icon);
+     }
+   if ((it) && (wd->title_visible))
+     {
+        edje_object_part_text_set(wd->base, "elm.text", it->title);
+
+        if (!cb->first_page)
+          {
+             if (cb->pop)
+               edje_object_signal_emit(wd->base, "elm,action,pop", "elm");
+             else
+               edje_object_signal_emit(wd->base, "elm,action,push", "elm");
+             evas_object_pass_events_set(wd->base, EINA_TRUE);
+             evas_object_show(wd->rect);
+          }
+        if (it->title_obj)
+          {
+             edje_object_part_swallow(wd->base, "elm.swallow.title", it->title_obj);
+          }
+        if (it->subtitle)
+          edje_object_part_text_set(wd->base, "elm.text.sub", it->subtitle);
+        else
+          edje_object_part_text_set(wd->base, "elm.text.sub", NULL);
+
+        if (it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON])
+          edje_object_part_swallow(wd->base, "elm.swallow.prev_btn", it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+        if (it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON])
+          edje_object_part_swallow(wd->base, "elm.swallow.next_btn", it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+
+        if(it->icon)
+          {
+             edje_object_part_swallow(wd->base, "elm.swallow.icon", it->icon);
+             edje_object_signal_emit(wd->base, "elm,state,icon,visible", "elm");
+          }
+        else
+          edje_object_signal_emit(wd->base, "elm,state,icon,hidden", "elm");
+
+        if ((it->title_obj) && (it->title))
+          {
+             edje_object_signal_emit(wd->base, "elm,state,show,extended", "elm");
+             if(it->titleobj_visible)
+               {
+                 //TODO: remove the dependency on these signals as related to nbeat, try to make it totally theme dependent
+                 edje_object_signal_emit(wd->base, "elm,state,show,noanimate,title", "elm");
+               }
+             else
+               //TODO: remove the dependency on these signals as related to nbeat, try to make it totally theme dependent
+               edje_object_signal_emit(wd->base, "elm,state,hide,noanimate,title", "elm");
+          }
+        else
+          {
+             edje_object_signal_emit(wd->base, "elm,state,hide,extended", "elm");
+             //TODO: remove the dependency on these signals as related to nbeat, try to make it totally theme dependent
+             edje_object_signal_emit(wd->base, "elm,state,hide,noanimate,title", "elm");
+             it->titleobj_visible = EINA_FALSE;
+          }
+     }
+}
+
+static void
+_back_button_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Navigationbar_Item *it = data;
+   elm_navigationbar_pop(it->base.widget);
+}
+
+static void
+_hide_finished(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Evas_Object *navi_bar = data;
+   Widget_Data *wd =  elm_widget_data_get(navi_bar);
+   wd->popping = EINA_FALSE;
+   evas_object_smart_callback_call(navi_bar, SIG_HIDE_FINISHED, event_info);
+   evas_object_pass_events_set(wd->base, EINA_FALSE);
+   evas_object_hide(wd->rect);
+}
+
+static void
+_button_size_set(Evas_Object *obj)
+{
+   if (!obj) return;
+   Evas_Coord minw = -1, minh = -1, maxw= -1, maxh = -1;
+   Evas_Coord w = 0, h = 0;
+
+   evas_object_size_hint_min_get(obj, &minw, &minh);
+   evas_object_size_hint_max_get(obj, &maxw, &maxh);
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   if (w < minw) w = minw;
+   if (h < minh) h = minh;
+   if ((maxw >= 0) && (w > maxw)) w = maxw;
+   if ((maxh >= 0) && (h > maxh)) h = maxh;
+   evas_object_resize(obj, w, h);
+}
+
+static void
+_elm_navigationbar_prev_btn_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it)
+{
+   Widget_Data *wd;
+   Evas_Object *prev_btn;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   if (!_title_btn_set(it, new_btn, ELM_NAVIGATIONBAR_PREV_BUTTON, EINA_FALSE))
+     return;
+
+   //update if the content is the top item
+   if (elm_navigationbar_content_top_get(obj) != content)
+     return;
+
+   prev_btn = edje_object_part_swallow_get(wd->base, "elm.swallow.prev_btn");
+   if (prev_btn) evas_object_del(prev_btn);
+   edje_object_part_swallow(wd->base, "elm.swallow.prev_btn", new_btn);
+}
+
+//TODO: looks make this  _elm_navigationbar_function_button1_set  same.
+static void
+_elm_navigationbar_next_btn_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it)
+{
+   Widget_Data *wd;
+   Evas_Object *prev_btn;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   if (!_title_btn_set(it, new_btn, ELM_NAVIGATIONBAR_NEXT_BUTTON, EINA_FALSE))
+     return;
+
+   //update if the content is the top item
+   if (elm_navigationbar_content_top_get(obj) != content)
+     return;
+
+   prev_btn = edje_object_part_swallow_get(wd->base, "elm.swallow.next_btn");
+   if (prev_btn) evas_object_del(prev_btn);
+   edje_object_part_swallow(wd->base, "elm.swallow.next_btn", new_btn);
+}
+
+static Eina_Bool
+_button_set(Evas_Object *obj, Evas_Object *prev_btn, Evas_Object *new_btn, Eina_Bool back_btn)
+{
+   char buf[4096];   //TODO: How to guarantee this buffer size?
+   Eina_Bool changed = EINA_FALSE;
+
+   if (prev_btn)
+     {
+        changed = EINA_TRUE;
+        evas_object_del(prev_btn);
+     }
+   if (!new_btn) return changed;
+
+   if (back_btn)
+     {
+        snprintf(buf, sizeof(buf), "navigationbar_prev_btn/%s", elm_widget_style_get(obj));
+        elm_object_style_set(new_btn, buf);
+     }
+   else
+     {
+        if (!strcmp("default", elm_object_style_get(new_btn)))
+          {
+             snprintf(buf, sizeof(buf), "navigationbar_next_btn/%s", elm_widget_style_get(obj));
+             elm_object_style_set(new_btn, buf);
+          }
+     }
+
+   elm_widget_sub_object_add(obj, new_btn);
+   changed = EINA_TRUE;
+
+   return changed;
+}
+
+/**
+ * Add a new navigationbar to the parent
+ *
+ * @param[in] parent The parent object
+ * @return The new object or NULL if it cannot be created
+ *
+ * @ingroup NavigationBar
+ */
+EAPI Evas_Object *
+elm_navigationbar_add(Evas_Object *parent)
+{
+   Evas_Object *obj;
+   Evas *e;
+   Widget_Data *wd;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
+
+   wd = ELM_NEW(Widget_Data);
+   e = evas_object_evas_get(parent);
+   obj = elm_widget_add(e);
+   ELM_SET_WIDTYPE(widtype, "navigationbar");
+   elm_widget_type_set(obj, "navigationbar");
+   elm_widget_sub_object_add(parent, obj);
+   elm_widget_data_set(obj, wd);
+   elm_widget_del_hook_set(obj, _del_hook);
+   elm_widget_theme_hook_set(obj, _theme_hook);
+   elm_widget_signal_emit_hook_set(obj, _emit_hook);
+
+   wd->base = edje_object_add(e);
+   _elm_theme_object_set(obj, wd->base, "navigationbar", "base", "default");
+   elm_widget_resize_object_set(obj, wd->base);
+   //TODO: elm,action,title,clicked
+   edje_object_signal_callback_add(wd->base, "elm,action,clicked", "elm",
+                                            _title_clicked, obj);
+
+   //TODO: How about making the pager as a base?
+   //TODO: Swallow title and content as one content into the pager.
+   wd->pager = elm_pager_add(obj);
+   elm_object_style_set(wd->pager, "navigationbar");
+   elm_widget_sub_object_add(obj, wd->pager);
+   edje_object_part_swallow(wd->base, "elm.swallow.content", wd->pager);
+   evas_object_smart_callback_add(wd->pager, "hide,finished", _hide_finished, obj);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, NULL);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, NULL);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _hide, NULL);
+
+   wd->title_visible = EINA_TRUE;
+
+   evas_object_smart_callbacks_descriptions_set(obj, _signals);
+
+   //Rect
+   wd->rect = evas_object_rectangle_add(e);
+   evas_object_color_set(wd->rect, 0, 0, 0, 0);
+   elm_widget_sub_object_add(obj, wd->rect);
+
+   //TODO: apply elm_object_disabled_set
+
+   return obj;
+}
+
+/**
+ * Push an object to the top of the NavigationBar stack (and show it)
+ * The object pushed becomes a child of the navigationbar and will be controlled
+ * it is deleted when the navigationbar is deleted or when the content is popped.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] title The title string
+ * @param[in] prev_btn The previous button
+ * @param[in] next_btn The next button
+ * @param[in] unused Unused.
+ * @param[in] content The object to push
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_push(Evas_Object *obj, const char *title, Evas_Object *prev_btn, Evas_Object *next_btn, Evas_Object *unused __UNUSED__, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+   Elm_Navigationbar_Item *top_it;
+
+   if (!content) return;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   if (evas_object_data_get(content, _navigationbar_key)) return;
+
+   it = elm_widget_item_new(obj, Elm_Navigationbar_Item);
+   if (!it) return;
+
+   top_it = eina_list_data_get(eina_list_last(wd->stack));
+
+   _title_btn_set(it, prev_btn, ELM_NAVIGATIONBAR_PREV_BUTTON, EINA_FALSE);
+   _title_btn_set(it, next_btn, ELM_NAVIGATIONBAR_NEXT_BUTTON, EINA_FALSE);
+
+   it->content = content;
+   evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _content_del, it);
+   evas_object_data_set(content, _navigationbar_key, it);
+
+   //Add a prev-button automatically.
+   if ((!prev_btn) && (top_it))
+   {
+      if (top_it->title)
+        _title_btn_set(it, _create_back_btn(obj, top_it->title, it), ELM_NAVIGATIONBAR_PREV_BUTTON, EINA_TRUE);
+      else
+        _title_btn_set(it, _create_back_btn(obj, _ELM_NAVIBAR_PREV_BTN_DEFAULT_LABEL, it), ELM_NAVIGATIONBAR_PREV_BUTTON, EINA_TRUE);
+   }
+
+   eina_stringshare_replace(&it->title, title);
+   edje_object_part_text_set(wd->base, "elm.text", title);
+   _item_sizing_eval(it);
+
+   Transit_Cb_Data *cb = ELM_NEW(Transit_Cb_Data);
+   // unswallow items and start transition
+   // TODO: For what? why does it need to unswallow?
+   if (top_it)
+     {
+        cb->prev_it = top_it;
+        cb->first_page = EINA_FALSE;
+        if (top_it->title_obj) edje_object_part_unswallow(wd->base, top_it->title_obj);
+        if (top_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON])
+          edje_object_part_unswallow(wd->base, top_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+        if (top_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON])
+          edje_object_part_unswallow(wd->base, top_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+        if (top_it->icon)
+          edje_object_part_unswallow(wd->base, top_it->icon);
+     }
+   //If page is the first, then do not run the transition... but if user want.. ?
+   else
+     {
+        cb->prev_it = NULL;
+        cb->first_page = EINA_TRUE;
+     }
+   cb->navibar = obj;
+   cb->it = it;
+   cb->pop = EINA_FALSE;
+
+   _transition_complete_cb(cb);
+   free(cb);
+   elm_pager_content_push(wd->pager, it->content);
+
+   wd->stack = eina_list_append(wd->stack, it);
+   _sizing_eval(obj);
+}
+
+/**
+ * This pops the object that is on top (visible) in the navigationbar, makes it disappear, then deletes the object.
+ * The object that was underneath it, on the stack will become visible.
+ *
+ * @param[in] obj The NavigationBar object
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_pop(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *ll;
+   Transit_Cb_Data *cb;
+   Elm_Navigationbar_Item *it = NULL;
+   Elm_Navigationbar_Item *prev_it = NULL;
+
+   //TODO: It's impossible to pop while popping?
+   if (wd->popping) return;
+   if (!wd->stack) return;
+
+   //find item to be popped and to be shown
+   //TODO: hmm.. i think it's hard to manager separated list from elm_pager internal list. but how about use evas_object_data_set to each content??
+   ll = eina_list_last(wd->stack);
+   if (ll)
+     {
+        prev_it = ll->data;
+        ll = ll->prev;
+        if (ll)
+          it = ll->data;
+     }
+   //unswallow items and start trasition
+   cb = ELM_NEW(Transit_Cb_Data);
+
+   //Previous page is exist.
+   if (prev_it)
+     {
+        if (it)
+          {
+             cb->prev_it = prev_it;
+             cb->it = it;
+             cb->pop = EINA_TRUE;
+             if (prev_it->title_obj)
+               edje_object_part_unswallow(wd->base, prev_it->title_obj);
+             if (prev_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON])
+               edje_object_part_unswallow(wd->base, prev_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+             if (prev_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON])
+               edje_object_part_unswallow(wd->base, prev_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+             if (prev_it->icon)
+               edje_object_part_unswallow(wd->base, prev_it->icon);
+             _item_sizing_eval(it);
+          }
+        else
+          {
+             cb->prev_it = prev_it;
+             cb->it = NULL;
+             cb->pop = EINA_TRUE;
+             //TODO: seems that flag is inverted.
+             cb->first_page = EINA_FALSE;
+          }
+
+        if (prev_it->content)
+          elm_object_tree_unfocusable_set(prev_it->content, EINA_TRUE);
+     }
+
+   cb->navibar = obj;
+   _transition_complete_cb(cb);
+   wd->popping = EINA_TRUE;
+
+   elm_pager_content_pop(wd->pager);
+
+   if ((prev_it) && (!it))
+     edje_object_part_text_set(wd->base, "elm.text", NULL);
+
+   free(cb);
+}
+
+/**
+ * This Pops to the given content object (and update it) by deleting rest of the objects in between.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content the object to show
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_to_content_pop(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+
+   Widget_Data *wd;
+   Eina_List *ll;
+   Elm_Navigationbar_Item *it;
+   Elm_Navigationbar_Item *prev_it;
+   Transit_Cb_Data *cb;
+
+   wd = elm_widget_data_get(obj);
+   if ((!wd) || (!content) || (!wd->stack)) return;
+
+   //find item to be popped and to be shown
+   it = prev_it = NULL;
+   ll = eina_list_last(wd->stack);
+
+   if (elm_navigationbar_content_top_get(obj) == content) return;
+
+   if (ll)
+     {
+        prev_it = ll->data;
+        ll =  ll->prev;
+     }
+   while (ll)
+     {
+        it = ll->data;
+        if ((it->base.widget) && (it->content != content))
+          {
+             _item_del(ll->data);
+             wd->stack = eina_list_remove_list(wd->stack, ll);
+             it = NULL;
+           }
+         else
+           break;
+         ll =  ll->prev;
+      }
+   if (prev_it && it)
+     {
+        //unswallow items and start trasition
+        cb = ELM_NEW(Transit_Cb_Data);
+        cb->prev_it = prev_it;
+        cb->it = it;
+        cb->pop = EINA_TRUE;
+        cb->first_page = EINA_FALSE;
+        cb->navibar = obj;
+
+        //TODO: make one call.
+        if (prev_it->title_obj)
+          edje_object_part_unswallow(wd->base, prev_it->title_obj);
+        if (prev_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON])
+          edje_object_part_unswallow(wd->base, prev_it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON]);
+        if (prev_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON])
+          edje_object_part_unswallow(wd->base, prev_it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON]);
+
+        _item_sizing_eval(it);
+        _transition_complete_cb(cb);
+
+        elm_pager_to_content_pop(wd->pager, content);
+
+        free(cb);
+     }
+}
+
+/**
+ * Set the title string for the pushed content
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @param[in] title The title string
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_title_label_set(Evas_Object *obj, Evas_Object *content, const char *title)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return;
+
+   eina_stringshare_replace(&it->title, title);
+   edje_object_part_text_set(wd->base, "elm.text", title);
+   _item_sizing_eval(it);
+}
+
+/**
+ * Return the title string of the pushed content
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @return The title string or NULL if none
+ *
+ * @ingroup NavigationBar
+ */
+EAPI const char *
+elm_navigationbar_title_label_get(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return NULL;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return NULL;
+   return it->title;
+}
+
+/**
+ * Set the title icon for the pushed content
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @param[in] icon The icon object
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_title_icon_set(Evas_Object *obj, Evas_Object *content, Evas_Object *icon)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+   Evas_Object *swallow;
+
+   if (!content) return;
+
+    wd = elm_widget_data_get(obj);
+    if (!wd) return;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return;
+
+   if (it->icon == icon) return;
+   if (it->icon) evas_object_del(it->icon);
+   it->icon = icon;
+
+   if (!icon) return;
+
+   elm_widget_sub_object_add(obj, icon);
+   evas_object_event_callback_add(icon, EVAS_CALLBACK_DEL, _title_icon_del, it);
+   _item_sizing_eval(it);
+   //update if the content is the top item
+   if (elm_navigationbar_content_top_get(obj) != content)
+     return;
+
+   swallow = edje_object_part_swallow_get(wd->base, "elm.swallow.icon");
+   if (swallow)
+     {
+        edje_object_signal_emit(wd->base, "elm,state,icon,hidden", "elm");
+        edje_object_part_unswallow(wd->base, swallow);
+        evas_object_hide(swallow);
+     }
+   if (wd->title_visible)
+     {
+        edje_object_part_swallow(wd->base, "elm.swallow.icon", icon);
+        edje_object_signal_emit(wd->base, "elm,state,icon,visible", "elm");
+        edje_object_message_signal_process(wd->base);
+     }
+   else
+      edje_object_signal_emit(wd->base, "elm,state,icon,hidden", "elm");
+}
+
+/**
+ * Get the title icon for the pushed content
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @return The icon object or NULL if none
+ *
+ * @ingroup NavigationBar
+ */
+EAPI Evas_Object *
+elm_navigationbar_title_icon_get(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype)NULL;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return NULL;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return NULL;
+
+   return it->icon;
+}
+
+/**
+ * Add a title object for the content.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object pushed
+ * @param[in] title_obj a title object (normally button or segment_control)
+ *
+ * @ingroup NavigationBar
+ */
+//TODO: elm_navigationbar_title_object_set ( .... )
+EAPI void
+elm_navigationbar_title_object_add(Evas_Object *obj, Evas_Object *content, Evas_Object *title_obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if ((!title_obj) || (!content)) return;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return;
+
+   if (it->title_obj)
+     {
+       evas_object_event_callback_del(it->title_obj, EVAS_CALLBACK_DEL, _title_obj_del);
+       evas_object_del(it->title_obj);
+     }
+
+   it->title_obj = title_obj;
+   elm_widget_sub_object_add(obj, title_obj);
+   evas_object_event_callback_add(title_obj, EVAS_CALLBACK_DEL, _title_obj_del, it);
+
+   //TODO: Conserve this line for a while the object list get API is alive.
+   eina_list_free(it->title_obj_list);
+   it->title_obj_list = eina_list_append(NULL, title_obj);
+
+   if (elm_navigationbar_content_top_get(obj) != content)
+     return;
+
+   edje_object_part_swallow(wd->base, "elm.swallow.title", title_obj);
+
+   //TODO: Looks something incorrect.
+   if (wd->title_visible)
+     {
+       if (it->title)
+         {
+            edje_object_signal_emit(wd->base, "elm,state,show,extended", "elm");
+            //TODO: for before nbeat?
+            edje_object_signal_emit(wd->base, "elm,state,show,noanimate,title", "elm");
+            it->titleobj_visible = EINA_TRUE;
+         }
+     }
+   _item_sizing_eval(it);
+}
+
+/**
+ * Unset the list of title objects corresponding to given content and returns it to
+ * the application.
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The content object pushed
+ * @param[out] list updates the list with title objects list, this list has to be freed and the
+ * objects have to be deleted by application.
+ * @ingroup NavigationBar
+ */
+//TODO: remove!
+EAPI void
+elm_navigationbar_title_object_list_unset(Evas_Object *obj, Evas_Object *content, Eina_List **list)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+   Evas_Object *swallow;
+
+   if ((!list) || (!content)) return;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return;
+
+   *list = eina_list_append(*list, it->title_obj);
+   it->title_obj = NULL;
+
+   if (elm_navigationbar_content_top_get(obj) != content)
+     return;
+
+   //In this case, the content is in the last of the stack
+   swallow = edje_object_part_swallow_get(wd->base, "elm.swallow.title");
+   if (!swallow) return;
+
+   if (wd->title_visible)
+    {
+      if(it->titleobj_visible)
+        {
+          //TODO: remove the dependency on these signals as related to nbeat?
+          edje_object_signal_emit(wd->base, "elm,state,hide,noanimate,title", "elm");
+          it->titleobj_visible = EINA_FALSE;
+        }
+       edje_object_signal_emit(wd->base, "elm,state,hide,extended", "elm");
+   }
+   _item_sizing_eval(it);
+}
+
+EAPI Evas_Object *
+elm_navigationbar_title_object_get(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return NULL;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return NULL;
+
+   return it->title_obj;
+}
+
+/**
+ * Return the list of title objects of the pushed content.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @return The list of title objects
+ *
+ * @ingroup NavigationBar
+ */
+//TODO: Remove!!
+EAPI Eina_List *
+elm_navigationbar_title_object_list_get(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return NULL;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return NULL;
+
+   return it->title_obj_list;
+}
+
+/**
+ * Return the content object at the top of the NavigationBar stack
+ *
+ * @param[in] obj The NavigationBar object
+ * @return The top content object or NULL if none
+ *
+ * @ingroup NavigationBar
+ */
+EAPI Evas_Object *
+elm_navigationbar_content_top_get(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   return elm_pager_content_top_get(wd->pager);
+}
+
+/**
+ * Return the content object at the bottom of the NavigationBar stack
+ *
+ * @param[in] obj The NavigationBar object
+ * @return The bottom content object or NULL if none
+ *
+ * @ingroup NavigationBar
+ */
+EAPI Evas_Object *
+elm_navigationbar_content_bottom_get(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype)NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   return elm_pager_content_bottom_get(wd->pager);
+}
+
+/**
+ * This hides the title area of navigationbar.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] hidden if EINA_TRUE the title area is hidden.
+ *
+ * @ingroup NavigationBar
+ */
+//TODO: does not provide hidden get ?
+EAPI void
+elm_navigationbar_hidden_set(Evas_Object *obj,
+                        Eina_Bool hidden)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   if (hidden)
+     edje_object_signal_emit(wd->base, "elm,state,item,moveup", "elm");
+   else
+     edje_object_signal_emit(wd->base, "elm,state,item,movedown", "elm");
+
+   wd->title_visible = !hidden;
+}
+
+/**
+ * Set the button object of the pushed content.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @param[in] button The button
+ * @param[in] button_type Indicates the position
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_title_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button, Elm_Navi_Button_Type button_type)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return;
+
+   switch(button_type)
+     {
+      case ELM_NAVIGATIONBAR_PREV_BUTTON:
+        _elm_navigationbar_prev_btn_set(obj, content, button, it);
+        break;
+      case ELM_NAVIGATIONBAR_NEXT_BUTTON:
+        _elm_navigationbar_next_btn_set(obj, content, button, it);
+        break;
+      default:
+        _elm_navigationbar_prev_btn_set(obj, content, button, it);
+        break;
+     }
+   _sizing_eval(obj);
+}
+
+/**
+ * Return the button object of the pushed content
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @param[in] button_type Indicates the position
+ * @return The button object or NULL if none
+ *
+ * @ingroup NavigationBar
+ */
+EAPI Evas_Object *
+elm_navigationbar_title_button_get(Evas_Object *obj, Evas_Object *content, Elm_Navi_Button_Type button_type)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   if (!content) return NULL;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return NULL;
+
+   switch(button_type)
+     {
+        case ELM_NAVIGATIONBAR_PREV_BUTTON:
+           return it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON];
+        case ELM_NAVIGATIONBAR_NEXT_BUTTON:
+           return it->title_btns[ELM_NAVIGATIONBAR_NEXT_BUTTON];
+        default:
+           return it->title_btns[ELM_NAVIGATIONBAR_PREV_BUTTON];
+     }
+   return NULL;
+}
+
+/**
+ * Set the sub title string for the pushed content.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @param[in] subtitle The subtitle string
+ *
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_subtitle_label_set(Evas_Object *obj, Evas_Object *content, const char *subtitle)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return;
+
+   eina_stringshare_replace(&it->subtitle, subtitle);
+   edje_object_part_text_set(wd->base, "elm.text.sub", subtitle);
+   _item_sizing_eval(it);
+}
+
+/**
+ * Return the subtitle string of the pushed content.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content The object to push or pushed
+ * @return The subtitle string or NULL if none
+ *
+ * @ingroup NavigationBar
+ */
+EAPI const char *
+elm_navigationbar_subtitle_label_get(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd;
+   Elm_Navigationbar_Item *it;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return NULL;
+   return it->subtitle;
+}
+
+/**
+ * This disables content area animation on push/pop.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] disable  if EINA_TRUE animation is disabled.
+ *
+ * @ingroup NavigationBar
+ */
+//TODO: Let's check to remove this API.
+EAPI void
+elm_navigationbar_animation_disabled_set(Evas_Object *obj, Eina_Bool disable)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   elm_pager_animation_disabled_set(wd->pager, disable);
+}
+
+/**
+ * This shows/hides title object area.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] show  if EINA_TRUE title object is shown else its hidden.
+ * @param[in] content  The content object packed in navigationbar.
+ * @ingroup NavigationBar
+ */
+EAPI void
+elm_navigationbar_title_object_visible_set(Evas_Object *obj, Evas_Object *content, Eina_Bool visible)
+{
+    ELM_CHECK_WIDTYPE(obj, widtype);
+    Elm_Navigationbar_Item *it;
+    Widget_Data *wd;
+
+    if (!content) return;
+
+    wd = elm_widget_data_get(obj);
+    if (!wd) return;
+
+    it = evas_object_data_get(content, _navigationbar_key);
+    if (!it) return;
+    if (it->titleobj_visible == visible) return;
+    it->titleobj_visible = visible;
+    _titleobj_switching(obj, it);
+}
+
+/**
+ * This gets the status whether title object is shown/hidden.
+ *
+ * @param[in] obj The NavigationBar object
+ * @param[in] content  The content object packed in navigationbar.
+ * @return The status whether title object is shown/hidden.
+ * @ingroup NavigationBar
+ */
+Eina_Bool
+elm_navigationbar_title_object_visible_get(Evas_Object *obj, Evas_Object *content)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   Elm_Navigationbar_Item *it;
+   Widget_Data *wd;
+
+   if (!content) return EINA_FALSE;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return EINA_FALSE;
+
+   it = evas_object_data_get(content, _navigationbar_key);
+   if (!it) return EINA_FALSE;
+
+   return it->titleobj_visible;
+}
diff --git a/src/lib/elc_navigationbar_ex.c b/src/lib/elc_navigationbar_ex.c
new file mode 100644 (file)
index 0000000..69b2b60
--- /dev/null
@@ -0,0 +1,1211 @@
+#include <Elementary.h>
+#include "elm_priv.h"
+
+/**
+ * @defgroup Navigationbar_ex Navigationbar_ex
+ * @ingroup Elementary
+ *
+ * The NavigationBar_ex is an object that allows flipping (with animation) between 1 or
+ * more pages of objects, much like a stack of windows within the window as well display
+ * the title area for the page consisting of buttons, title, titleobjects etc:-.
+ *
+ * Objects can be pushed or popped from the stack or deleted as normal.
+ * Pushes and pops will animate and a pop will delete the object once the
+ * animation is finished if delete_on_pop is set else the content is unset and the
+ * content pointer is sent as event information in the hide,finished signal.
+ * Any object in the Navigationbar_ex can be promoted to the top
+ * (from its current stacking position) as well. Objects are pushed to the
+ * top with elm_navigationbar_ex_item_push() and when the top item is no longer
+ * wanted, simply pop it with elm_navigationbar_ex_item_pop() and it will also be
+ * deleted/unset depending on delete_on_pop variable.
+ * Any object you wish to promote to the top that is already in the
+ * navigationbar, simply use elm_navigationbar_ex_item_promote(). If an object is no longer
+ * needed and is not the top item, just delete it as normal. You can query
+ * which objects are the top and bottom with elm_navigationbar_ex_item_bottom_get()
+ * and elm_navigationbar_ex_item_top_get().
+ */
+
+typedef struct _Widget_Data Widget_Data;
+typedef struct _function_button fn_button;
+
+struct _Widget_Data
+{
+   Eina_List *stack, *to_delete;
+   Elm_Navigationbar_ex_Item *top, *oldtop;
+   Evas_Object *rect, *clip;
+   Eina_Bool del_on_pop : 1;
+   Eina_Bool disable_animation: 1;
+};
+
+struct _Elm_Navigationbar_ex_Item
+{
+   Evas_Object *obj, *base, *content;
+   Evas_Object *ct_base;
+   Evas_Coord minw, minh;
+   const char *title;
+   const char *subtitle;
+   const char *item_style;
+   Eina_List *fnbtn_list;
+   Evas_Object *title_obj;
+   Evas_Object *icon;
+   Eina_Bool popme : 1;
+   Eina_Bool titleobj_visible:1;
+};
+
+struct _function_button
+{
+   Evas_Object *btn;
+   int btn_id;
+};
+
+static const char *widtype = NULL;
+static void _del_hook(Evas_Object *obj);
+static void _theme_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _sub_del(void *data, Evas_Object *obj, void *event_info);
+
+static const char SIG_HIDE_FINISHED[] = "hide,finished";
+static const char SIG_TITLE_OBJ_VISIBLE_CHANGED[] = "titleobj,visible,changed";
+
+static const Evas_Smart_Cb_Description _signals[] = {
+       {SIG_HIDE_FINISHED, ""},
+       {SIG_TITLE_OBJ_VISIBLE_CHANGED, ""},
+       {NULL, NULL}
+};
+
+static void
+_del_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   free(wd);
+}
+
+static Evas_Object*
+_content_unset(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   Evas_Object *content = NULL;
+   if (!item->content) return NULL;
+   content = item->content;
+   elm_widget_sub_object_del(item->obj,item->content);
+   edje_object_part_unswallow(item->ct_base,item->content);
+   item->content = NULL;
+   evas_object_hide(content);
+   return content;
+}
+
+static void
+_theme_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *l;
+   char buf_fn[1024];
+   char buf[1024];
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   EINA_LIST_FOREACH(wd->stack, l, it)
+     {
+        Eina_List *bl;
+        fn_button *btn_det;
+        edje_object_scale_set(it->base, elm_widget_scale_get(obj) *
+                              _elm_config->scale);
+        strncpy(buf, "item/", sizeof(buf));
+        strncat(buf, it->item_style, sizeof(buf) - strlen(buf));
+        _elm_theme_object_set(obj, it->base,  "navigationbar_ex", buf, elm_widget_style_get(obj));
+        _elm_theme_object_set(obj, it->ct_base,  "navigationbar_ex", "content", elm_widget_style_get(obj));
+        if (it->title)
+          edje_object_part_text_set(it->base, "elm.text", it->title);
+        if (it->subtitle)
+          edje_object_part_text_set(it->base, "elm.text.sub", it->subtitle);
+        if (it->title_obj)
+          {
+             edje_object_part_swallow(it->base, "elm.swallow.title", it->title_obj);
+             if (it->titleobj_visible)
+               edje_object_signal_emit(it->base, "elm,state,show,title", "elm");
+             else
+               edje_object_signal_emit(it->base, "elm,state,hide,title", "elm");
+          }
+        if (it->icon)
+          edje_object_part_swallow(it->base, "elm.swallow.icon", it->icon);
+        EINA_LIST_FOREACH(it->fnbtn_list, bl, btn_det)
+          {
+             if (btn_det->btn_id == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)
+               {
+                  snprintf(buf_fn, sizeof(buf_fn), "navigationbar_backbutton/%s", elm_widget_style_get(obj));
+                  snprintf(buf, sizeof(buf), "elm.swallow.back");
+               }
+             else
+               {
+                  snprintf(buf_fn, sizeof(buf_fn), "navigationbar_functionbutton/%s", elm_widget_style_get(obj));
+                  snprintf(buf, sizeof(buf), "elm.swallow.btn%d", btn_det->btn_id);
+               }
+             elm_object_style_set(btn_det->btn, buf_fn);
+             edje_object_part_swallow(it->base, buf, btn_det->btn);
+          }
+     }
+   _sizing_eval(obj);
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Coord minw = -1, minh = -1;
+   Eina_List *l;
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   EINA_LIST_FOREACH(wd->stack, l, it)
+     {
+        if (it->minw > minw) minw = it->minw;
+        if (it->minh > minh) minh = it->minh;
+     }
+   evas_object_size_hint_min_set(obj, minw, minh);
+   evas_object_size_hint_max_set(obj, -1, -1);
+}
+
+static void
+_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Navigationbar_ex_Item *it = data;
+   Evas_Coord minw = -1, minh = -1;
+   evas_object_size_hint_min_get(it->content, &minw, &minh);
+   // FIXME: why is this needed? how does edje get this unswallowed or
+   // lose its callbacks to edje
+   edje_object_part_swallow(it->ct_base, "elm.swallow.content", it->content);
+   edje_object_size_min_calc(it->base, &it->minw, &it->minh);
+   _sizing_eval(it->obj);
+}
+
+static void
+_eval_top(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_Bool animate = EINA_TRUE;
+   Elm_Navigationbar_ex_Item *ittop = NULL;
+   if (!wd) return;
+   if (!wd->stack) return;
+   ittop = eina_list_last(wd->stack)->data;
+   if (ittop != wd->top)
+     {
+        Evas_Object *o1, *o2;
+        const char *onshow, *onhide;
+
+        if (wd->top)
+          {
+             o1 = wd->top->ct_base;
+             o2 = wd->top->base;/*make use of the signals sent for animation*/
+
+             /*issue to fix, hide signal does not come for t_base, increasing time helps
+              in getting correct events in pop*/
+             if (wd->disable_animation)
+               {
+                  edje_object_signal_emit(o2, "elm,action,hide,noanimate", "elm");
+                  edje_object_signal_emit(o1, "elm,action,hide,noanimate", "elm");
+               }
+             else if (wd->top->popme)
+               {
+                  edje_object_signal_emit(o2, "elm,action,pop", "elm");
+                  edje_object_signal_emit(o1, "elm,action,pop", "elm");
+               }
+             else
+               {
+                  edje_object_signal_emit(o2, "elm,action,hide", "elm");
+                  edje_object_signal_emit(o1, "elm,action,hide", "elm");
+               }
+             onhide = edje_object_data_get(o1, "onhide");
+             if (onhide)
+               {
+                  if (!strcmp(onhide, "raise")) {
+                     evas_object_raise(o2);
+                     evas_object_raise(o1);
+                  }
+                  else if (!strcmp(onhide, "lower")) {
+                       evas_object_lower(o2);
+                       evas_object_lower(o1);
+                  }
+               }
+          }
+        else
+          {
+             animate = EINA_FALSE;
+          }
+        wd->oldtop = wd->top;
+        wd->top = ittop;
+        o1 = wd->top->ct_base;
+        o2 = wd->top->base;
+        evas_object_show(o2);
+        evas_object_show(o1);
+
+        if ((!animate)||(wd->disable_animation))
+          {
+             edje_object_signal_emit(o2, "elm,action,show,noanimate", "elm");
+             edje_object_signal_emit(o1, "elm,action,show,noanimate", "elm");
+          }
+        else if (wd->oldtop)
+          {
+             if (elm_object_focus_get(wd->oldtop->content))
+               elm_widget_focused_object_clear(wd->oldtop->content);
+             if (wd->oldtop->popme)
+               {
+                  edje_object_signal_emit(o2, "elm,action,show", "elm");
+                  edje_object_signal_emit(o1, "elm,action,show", "elm");
+               }
+             else
+               {
+                  edje_object_signal_emit(o2, "elm,action,push", "elm");
+                  edje_object_signal_emit(o1, "elm,action,push", "elm");
+               }
+          }
+        else
+          {
+             edje_object_signal_emit(o2, "elm,action,push", "elm");
+             edje_object_signal_emit(o1, "elm,action,push", "elm");
+          }
+        onshow = edje_object_data_get(o1, "onshow");
+        if (onshow)
+          {
+             if (!strcmp(onshow, "raise")) {
+                evas_object_raise(o2);
+                evas_object_raise(o1);
+             }
+             else if (!strcmp(onshow, "lower")) {
+                evas_object_lower(o2);
+                evas_object_lower(o1);
+             }
+          }
+     }
+}
+
+static void
+_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_Coord x, y;
+   Eina_List *l;
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+   EINA_LIST_FOREACH(wd->stack, l, it)
+     evas_object_move(it->base, x, y);
+}
+
+static void
+_sub_del(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_Object *sub = event_info;
+   Eina_List *l,*list;
+   fn_button *btn_data;
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   EINA_LIST_FOREACH(wd->stack, l, it)
+     {
+        if (it->content == sub)
+          {
+             wd->stack = eina_list_remove_list(wd->stack, l);
+             evas_object_event_callback_del_full
+               (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it);
+             if (it->title) eina_stringshare_del(it->title);
+             if (it->subtitle) eina_stringshare_del(it->subtitle);
+             EINA_LIST_FOREACH(it->fnbtn_list, list, btn_data)
+               {
+                  evas_object_del(btn_data->btn);
+                  free(btn_data);
+                  btn_data = NULL;
+               }
+             if (it->item_style) eina_stringshare_del(it->item_style);
+             if (it->title_obj) evas_object_del(it->title_obj);
+             if (it->icon) evas_object_del(it->icon);
+             evas_object_del(it->ct_base);
+             evas_object_del(it->base);
+             _eval_top(it->obj);
+             free(it);
+             return;
+          }
+     }
+}
+
+static void
+_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_Coord w, h;
+   Eina_List *l;
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   EINA_LIST_FOREACH(wd->stack, l, it) evas_object_resize(it->base, w, h);
+}
+
+static void
+_signal_hide_finished(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Elm_Navigationbar_ex_Item *it = data;
+   Evas_Object *obj2 = it->obj;
+   Widget_Data *wd = elm_widget_data_get(it->obj);
+   evas_object_hide(it->ct_base);
+   evas_object_hide(it->base);
+   edje_object_signal_emit(it->base, "elm,action,reset", "elm");
+   edje_object_signal_emit(it->ct_base, "elm,action,reset", "elm");
+   evas_object_smart_callback_call(obj2, SIG_HIDE_FINISHED, it->content);
+   edje_object_message_signal_process(it->base);
+   edje_object_message_signal_process(it->ct_base);
+   if (it->popme)
+     {
+        if (wd->del_on_pop)
+          {
+             evas_object_del(it->content);
+          }
+        else
+          {
+             _content_unset(it);
+          }
+     }
+   _sizing_eval(obj2);
+}
+
+static void
+_item_promote(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   Eina_List *l;
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   EINA_LIST_FOREACH(wd->stack, l, it)
+     {
+        if (it == item)
+          {
+             wd->stack = eina_list_remove_list(wd->stack, l);
+             wd->stack = eina_list_append(wd->stack, it);
+             _eval_top(it->obj);
+             return;
+          }
+     }
+}
+
+static void
+_process_deletions(Widget_Data *wd)
+{
+   if (!wd) return;
+   Elm_Navigationbar_ex_Item *it;
+   fn_button *btn_data;
+   Eina_List *list;
+   EINA_LIST_FREE(wd->to_delete, it)
+     {
+        evas_object_event_callback_del_full
+          (it->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it);
+        if (it->title) eina_stringshare_del(it->title);
+        if (it->subtitle) eina_stringshare_del(it->subtitle);
+        if (it->item_style) eina_stringshare_del(it->item_style);
+        EINA_LIST_FOREACH(it->fnbtn_list, list, btn_data)
+          {
+             evas_object_del(btn_data->btn);
+             free(btn_data);
+             btn_data = NULL;
+          }
+        if (it->title_obj) evas_object_del(it->title_obj);
+        if (it->content)  evas_object_del(it->content);
+        if (it->icon) evas_object_del(it->icon);
+        evas_object_del(it->ct_base);
+        evas_object_del(it->base);
+        _eval_top(it->obj);
+        free(it);
+        it = NULL;
+     }
+}
+
+static void
+_switch_titleobj_visibility(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Elm_Navigationbar_ex_Item *item = (Elm_Navigationbar_ex_Item *)data;
+   if(!item) return;
+   if(!item->title_obj) return;
+   if(!item->titleobj_visible)
+     {
+        edje_object_signal_emit(item->base, "elm,state,show,title", "elm");
+        evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_TRUE);
+        item->titleobj_visible = EINA_TRUE;
+     }
+   else
+     {
+        edje_object_signal_emit(item->base, "elm,state,hide,title", "elm");
+        evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_FALSE);
+        item->titleobj_visible = EINA_FALSE;
+     }
+}
+
+static void
+_emit_hook(Evas_Object *obj, const char *emission, const char *source)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+
+   Widget_Data *wd;
+   Eina_List *last;
+   Elm_Navigationbar_ex_Item *it;
+
+   wd = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   last = eina_list_last(wd->stack);
+   if (!last) return;
+
+   it = eina_list_data_get(last);
+   if ((!it) || (!it->title_obj)) return;
+
+   if (!strcmp(source, "elm"))
+     {
+        if (!strcmp(emission, "elm,state,hide,noanimate,title"))
+          it->titleobj_visible = EINA_FALSE;
+        else if (!strcmp(emission, "elm,state,show,noanimate,title"))
+          it->titleobj_visible = EINA_TRUE;
+     }
+   /*sending signal to top most item of the stack*/
+   edje_object_signal_emit(it->base, emission, source);
+}
+
+/**
+ * Add a new navigationbar_ex to the parent
+ *
+ * @param[in] parent The parent object
+ * @return The new object or NULL if it cannot be created
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object *
+elm_navigationbar_ex_add(Evas_Object *parent)
+{
+   Evas_Object *obj;
+   Evas *e;
+   Widget_Data *wd;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
+
+   wd = ELM_NEW(Widget_Data);
+   e = evas_object_evas_get(parent);
+   obj = elm_widget_add(e);
+   ELM_SET_WIDTYPE(widtype, "navigationbar_ex");
+   elm_widget_type_set(obj, "navigationbar_ex");
+   elm_widget_sub_object_add(parent, obj);
+   elm_widget_data_set(obj, wd);
+   elm_widget_del_hook_set(obj, _del_hook);
+   elm_widget_theme_hook_set(obj, _theme_hook);
+   elm_widget_can_focus_set(obj, EINA_FALSE);
+   elm_widget_signal_emit_hook_set(obj, _emit_hook);
+   wd->clip = evas_object_rectangle_add(e);
+   elm_widget_resize_object_set(obj, wd->clip);
+   elm_widget_sub_object_add(obj, wd->clip);
+
+   wd->rect = evas_object_rectangle_add(e);
+   elm_widget_sub_object_add(obj, wd->rect);
+   evas_object_color_set(wd->rect, 255, 255, 255, 0);
+   evas_object_clip_set(wd->rect, wd->clip);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
+
+   evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
+   wd->del_on_pop = EINA_TRUE;
+   _sizing_eval(obj);
+   return obj;
+}
+
+/**
+ * Push an object along with its style to the top of the Navigationbar_ex stack (and show it)
+ *
+ * The object pushed becomes a child of the Navigationbar_ex and will be controlled
+ * it will be deleted when the Navigationbar_ex is deleted or when content is popped(depending on del_
+ * on_pop variable).
+ *
+ * @param[in] obj The Navigationbar_ex object
+ * @param[in] content The object to push
+ * @param[in] item_style The style of the page
+ * @return The Navigationbar_ex Item or NULL
+ * @ingroup Navigationbar_ex
+ */
+EAPI Elm_Navigationbar_ex_Item*
+elm_navigationbar_ex_item_push(Evas_Object *obj, Evas_Object *content, const char* item_style)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype)NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Elm_Navigationbar_ex_Item *it;
+   Evas_Coord x, y, w, h;
+   char buf[1024];
+   if (!wd) return NULL;
+   if (!content) return NULL;
+   if (!item_style) return NULL;
+   it = ELM_NEW(Elm_Navigationbar_ex_Item);
+   if (!it) return NULL;
+   it->obj = obj;
+   it->content = content;
+   it->base = edje_object_add(evas_object_evas_get(obj));
+   it->ct_base = edje_object_add(evas_object_evas_get(obj));
+   it->titleobj_visible = EINA_TRUE;
+
+   evas_object_smart_member_add(it->base, obj);
+   evas_object_smart_member_add(it->ct_base, obj);
+
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   evas_object_move(it->base, x, y);
+   evas_object_resize(it->base, w, h);
+   evas_object_clip_set(it->base, wd->clip);
+
+   elm_widget_sub_object_add(obj, it->base);
+   elm_widget_sub_object_add(obj, it->ct_base);
+
+   elm_widget_sub_object_add(obj, it->content);
+
+   _elm_theme_object_set(obj, it->ct_base,  "navigationbar_ex", "content", elm_widget_style_get(obj));
+
+   strncpy(buf, "item/", sizeof(buf));
+   strncat(buf, item_style, sizeof(buf) - strlen(buf));
+   eina_stringshare_replace(&it->item_style, item_style);
+   _elm_theme_object_set(obj, it->base,  "navigationbar_ex", buf, elm_widget_style_get(obj));
+
+
+   edje_object_part_swallow(it->base, "elm.swallow.content", it->ct_base);
+
+   edje_object_signal_callback_add(it->ct_base, "elm,action,hide,finished", "",
+                                   _signal_hide_finished, it);
+   evas_object_event_callback_add(it->content,
+                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                  _changed_size_hints, it);
+   edje_object_part_swallow(it->ct_base, "elm.swallow.content", it->content);
+   edje_object_size_min_calc(it->base, &it->minw, &it->minh);
+   evas_object_data_set(it->base, "_elm_leaveme", obj);
+   evas_object_show(it->content);
+   wd->stack = eina_list_append(wd->stack, it);
+   _eval_top(obj);
+   _sizing_eval(obj);
+   return it;
+}
+
+/**
+ * Set the title string for the pushed Item.
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] title The title string
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_title_label_set( Elm_Navigationbar_ex_Item* item, const char *title)
+{
+   if (!item) return;
+   if (!eina_stringshare_replace(&item->title, title)) return;
+   if (item->base)
+     {
+        edje_object_part_text_set(item->base, "elm.text", item->title);
+     }
+}
+
+/**
+ * Return the title string of the pushed item.
+ *
+ * @param[in]  item The Navigationbar_ex Item
+ * @return The title string or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI const char *
+elm_navigationbar_ex_item_title_label_get(Elm_Navigationbar_ex_Item* item)
+{
+   if(!item) return NULL;
+   return item->title;
+}
+
+/**
+ * Set the sub title string for the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] subtitle The subtitle string
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_subtitle_label_set( Elm_Navigationbar_ex_Item* item, const char *subtitle)
+{
+   if (!item) return;
+   if (!eina_stringshare_replace(&item->subtitle, subtitle)) return;
+   if (item->base)
+     edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);
+}
+
+/**
+ * Return the subtitle string of the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The subtitle string or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI const char *
+elm_navigationbar_ex_item_subtitle_label_get(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   return item->subtitle;
+}
+
+/**
+ * Set's the icon object of the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] The icon object or NULL if none
+ *
+ *@ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_icon_set(Elm_Navigationbar_ex_Item* item, Evas_Object *icon)
+{
+   if (!item) return;
+   if (item->icon == icon) return;
+   if (item->icon) evas_object_del(item->icon);
+   item->icon = icon;
+   if(icon)
+     {
+        edje_object_part_swallow(item->base, "elm.swallow.icon", icon);
+        elm_widget_sub_object_add(item->obj, icon);
+        edje_object_signal_emit(item->base, "elm,state,icon,visible", "elm");
+        edje_object_message_signal_process(item->base);
+     }
+   else
+     edje_object_signal_emit(item->base, "elm,state,icon,hidden", "elm");
+}
+
+/**
+ * Return the icon object of the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The icon object or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object *
+elm_navigationbar_ex_item_icon_get(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   return item->icon;
+}
+
+
+/**
+ * Set the button object of the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] btn_label The button label
+ * @param[in] icon The button icon
+ * @param[in] button_type Indicates the position[use macros of type Elm_Navi_ex_Button_Type
+ * if more function buttons are required you can use values ELM_NAVIGATIONBAR_EX_MAX and more]
+ * @param[in] func Callback function called when button is clicked.
+ * @param[in] data Callback data that would be sent when button is clicked.
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_title_button_set(Elm_Navigationbar_ex_Item* item, char *btn_label, Evas_Object *icon, int button_type, Evas_Smart_Cb func, const void *data)
+{
+   if (!item) return;
+   Eina_List *bl;
+   Evas_Object *btn;
+   char buf[1024],theme[1024];
+   fn_button *btn_det = NULL;
+   EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
+     {
+        if (btn_det->btn_id == button_type)
+          {
+             evas_object_del(btn_det->btn);
+             free(btn_det);
+             btn_det = NULL;
+             item->fnbtn_list = eina_list_remove_list(item->fnbtn_list, bl);
+          }
+     }
+   btn = elm_button_add(item->obj);
+   btn_det = ELM_NEW(btn_det);
+   if (!btn_det) return;
+   if (button_type == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)
+     {
+        snprintf(theme, sizeof(theme), "navigationbar_backbutton/%s", elm_widget_style_get(item->obj));
+        elm_object_style_set(btn, theme);
+        snprintf(buf, sizeof(buf), "elm.swallow.back");
+     }
+   else
+     {
+        snprintf(theme, sizeof(theme), "navigationbar_functionbutton/%s", elm_widget_style_get(item->obj));
+        elm_object_style_set(btn, theme);
+        snprintf(buf, sizeof(buf), "elm.swallow.btn%d", button_type);
+     }
+   if (btn_label)
+     elm_object_text_set(btn, btn_label);
+   if (icon)
+     elm_object_content_set(btn, icon);
+   elm_object_focus_allow_set(btn, EINA_FALSE);
+   evas_object_smart_callback_add(btn, "clicked", func, data);
+   edje_object_part_swallow(item->base, buf, btn);
+   elm_widget_sub_object_add(item->obj, btn);
+   btn_det->btn = btn;
+   btn_det->btn_id = button_type;
+   item->fnbtn_list = eina_list_append(item->fnbtn_list, btn_det);
+}
+
+/**
+ * Return the button object of the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] button_type Indicates the position
+ * @return The button object or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object *
+elm_navigationbar_ex_item_title_button_get(Elm_Navigationbar_ex_Item* item, int button_type)
+{
+   if (!item) return NULL;
+   fn_button *btn_det;
+   Eina_List *bl;
+   EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
+     {
+        if (btn_det->btn_id == button_type)
+          return btn_det->btn;
+     }
+   return NULL;
+}
+
+/**
+ * Unset the button object of the pushed content
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] button_type Indicates the position
+ * @return The button object or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object *
+elm_navigationbar_ex_item_title_button_unset(Elm_Navigationbar_ex_Item* item, int button_type)
+{
+   if (!item) return NULL;
+   fn_button *btn_det;
+   Eina_List *bl;
+   Evas_Object *btn_ret;
+   EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
+     {
+        if (btn_det->btn_id == button_type)
+          {
+             btn_ret = btn_det->btn;
+             elm_widget_sub_object_del(item->obj,btn_det->btn);
+             edje_object_part_unswallow(item->base,btn_det->btn);
+             item->fnbtn_list = eina_list_remove_list(item->fnbtn_list, bl);
+             btn_det->btn = NULL;
+             return btn_ret;
+          }
+     }
+   return NULL;
+}
+
+/**
+ * Sets a title object for the Item
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] title_obj Title object (normally segment_control/searchbar)
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_title_object_set(Elm_Navigationbar_ex_Item* item, Evas_Object *title_obj)
+{
+   if (!item) return;
+   if (item->title_obj) evas_object_del(item->title_obj);
+   item->title_obj = title_obj;
+   if (title_obj)
+     {
+        elm_widget_sub_object_add(item->obj,title_obj);
+        edje_object_part_swallow(item->base, "elm.swallow.title", title_obj);
+        edje_object_signal_callback_add(item->base, "elm,action,clicked", "elm",
+                                        _switch_titleobj_visibility, item);
+     }
+   _sizing_eval(item->obj);
+}
+
+/**
+ * Hides the title area of the item.
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] hidden if EINA_TRUE the title area is hidden else its shown.
+ *
+ * @ingroup Navigationbar_ex
+ */
+
+EAPI void
+elm_navigationbar_ex_item_title_hidden_set(Elm_Navigationbar_ex_Item* item, Eina_Bool hidden)
+{
+   if (!item) return;
+   if (hidden) edje_object_signal_emit(item->base, "elm,state,item,moveup", "elm");
+   else edje_object_signal_emit(item->base, "elm,state,item,movedown", "elm");
+   _sizing_eval(item->obj);
+}
+
+/**
+ * Unsets a title object for the item, the return object has to be deleted
+ * by application if not added again in to navigationbar.
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The title object or NULL if none is set
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object*
+elm_navigationbar_ex_item_title_object_unset(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   Evas_Object *title_obj=NULL;
+   if (!item->title_obj) return NULL;
+   title_obj = item->title_obj;
+   edje_object_signal_callback_del(item->base, "elm,action,clicked", "elm",
+                                   _switch_titleobj_visibility);
+   elm_widget_sub_object_del(item->obj,item->title_obj);
+   edje_object_part_unswallow(item->base,item->title_obj);
+   item->title_obj = NULL;
+   return title_obj;
+}
+
+/**
+ * Returns the title object of the pushed content.
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The title object or NULL if none is set
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object*
+elm_navigationbar_ex_item_title_object_get(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   return item->title_obj;
+}
+
+
+/**
+ * Unsets the content of the item, the return object has to be deleted
+ * by application if not added again in to navigationbar, when the content
+ * is unset the corresponding item would be deleted, when this content is pushed again
+ * a new item would be created again.
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The content object or NULL if none is set
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object *
+elm_navigationbar_ex_item_content_unset(Elm_Navigationbar_ex_Item* item)
+{
+ if (!item) return NULL;
+   Evas_Object *content = _content_unset(item);
+   return content;
+}
+
+/**
+ * Returns the content of the item.
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The content object or NULL if none is set
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Evas_Object *
+elm_navigationbar_ex_item_content_get(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   return item->content;
+}
+
+/**
+ * Set whether the content pushed has to be deleted on pop.
+ * if false the item is not deleted but only removed from the stack
+ * the pointer of the content is sent along with hide,finished signal.
+ *
+ * @param[in] obj The Navigationbar_ex object.
+ * @param[in] del_on_pop if set the content is deleted on pop else unset, by default the value is EINA_TRUE.
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_delete_on_pop_set(Evas_Object *obj, Eina_Bool del_on_pop)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   wd->del_on_pop = del_on_pop;
+}
+
+/**
+ * Sets the style of the navigationbar item.
+ * @param[in] item The Navigationbar_ex Item
+ * @param[in] item_style Navigationbar Item style, this can be used when the style of the item has to be dynamically set.
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_style_set(Elm_Navigationbar_ex_Item* item, const char* item_style)
+{
+   if (!item) return;
+   if(!item_style) return;
+   char buf[1024];
+   char buf_fn[1024];
+   Eina_List *bl;
+   fn_button *btn_det;
+   strncpy(buf, "item/", sizeof(buf));
+   strncat(buf, item_style, sizeof(buf) - strlen(buf));
+   if (!eina_stringshare_replace(&item->item_style, item_style)) return;
+   _elm_theme_object_set(item->obj, item->base,  "navigationbar_ex", buf, elm_widget_style_get(item->obj));
+   if (item->title)
+     edje_object_part_text_set(item->base, "elm.text", item->title);
+   if (item->subtitle)
+     edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);
+   if (item->fnbtn_list)
+     {
+        EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
+          {
+             if (btn_det->btn_id == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)
+               {
+                  snprintf(buf_fn, sizeof(buf_fn), "navigationbar_backbutton/%s", elm_widget_style_get(item->obj));
+                  elm_object_style_set(btn_det->btn, buf_fn);
+               }
+             else
+               {
+                  snprintf(buf_fn, sizeof(buf_fn), "navigationbar_functionbutton/%s", elm_widget_style_get(item->obj));
+                  elm_object_style_set(btn_det->btn, buf_fn);
+               }
+          }
+     }
+}
+
+/**
+ * Returns the style of the item.
+ *
+ * @param[in] item The Navigationbar_ex Item
+ * @return The item style.
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI const char*
+elm_navigationbar_ex_item_style_get(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return NULL;
+   return item->item_style;
+}
+
+
+/**
+ * Promote an object already in the stack to the top of the stack
+ *
+ * This will take the indicated object and promote it to the top of the stack
+ * as if it had been pushed there. The object must already be inside the
+ * Navigationbar_ex stack to work.
+ *
+ * @param[in] item The Navigationbar_ex item to promote.
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_promote(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return;
+   _item_promote(item);
+}
+
+/**
+ * Pop to the inputted Navigationbar_ex item
+ * the rest of the items are deleted.
+ *
+ * @param[in] item The Navigationbar_ex item
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_to_item_pop(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return;
+   Widget_Data *wd = elm_widget_data_get(item->obj);
+   Elm_Navigationbar_ex_Item *it = NULL;
+   Eina_List *list;
+   if (!wd) return;
+   if (!wd->stack) return;
+   it = eina_list_last(wd->stack)->data;
+   it->popme = EINA_TRUE;
+   list = eina_list_last(wd->stack);
+   if (list)
+     {
+        while (list)
+          {
+             it = list->data;
+             if (it != item)
+               {
+                  wd->to_delete = eina_list_append(wd->to_delete, it);
+                  wd->stack = eina_list_remove_list(wd->stack, list);
+               }
+             else
+               break;
+
+             list = list->prev;
+          }
+     }
+   _eval_top(it->obj);
+   if (wd->to_delete)
+     _process_deletions(wd);
+}
+
+/**
+ * Pop the object that is on top of the Navigationbar_ex stack
+ * This pops the object that is on top (visible) in the navigationbar, makes it disappear, then deletes/unsets the object
+ * based on del_on_pop variable.
+ * The object that was underneath it on the stack will become visible.
+ *
+ * @param[in] obj The Navigationbar_ex object
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_item_pop(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *ll;
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return;
+   if (!wd->stack) return;
+   it = eina_list_last(wd->stack)->data;
+   it->popme = EINA_TRUE;
+   ll = eina_list_last(wd->stack);
+   if (ll)
+     {
+        ll = ll->prev;
+        if (!ll)
+          {
+
+             Evas_Object *o, *o2;
+             const char *onhide;
+
+             wd->top = it;
+             o = wd->top->ct_base;
+             o2 = wd->top->base;
+
+             edje_object_signal_emit(o2, "elm,action,pop", "elm");
+             edje_object_signal_emit(o, "elm,action,pop", "elm");
+             onhide = edje_object_data_get(o, "onhide");
+             if (onhide)
+               {
+                  if (!strcmp(onhide, "raise"))
+                    {
+                       evas_object_raise(o2);
+                       evas_object_raise(o);
+                    }
+                  else if (!strcmp(onhide, "lower"))
+                    {
+                       evas_object_lower(o2);
+                       evas_object_lower(o);
+                    }
+               }
+             wd->top = NULL;
+          }
+        else
+          {
+             it = ll->data;
+             _item_promote(it);
+          }
+     }
+}
+
+
+/**
+ * Return the item at the bottom of the Navigationbar_ex stack
+ *
+ * @param[in] obj The Navigationbar_ex object
+ * @return The bottom item or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Elm_Navigationbar_ex_Item*
+elm_navigationbar_ex_item_bottom_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return NULL;
+   if (!wd->stack) return NULL;
+   it = wd->stack->data;
+   return it;
+}
+
+/**
+ * Return the item at the top of the Navigationbar_ex stack
+ *
+ * @param[in] obj The Navigationbar_ex object
+ * @return The top object or NULL if none
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI Elm_Navigationbar_ex_Item*
+elm_navigationbar_ex_item_top_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Elm_Navigationbar_ex_Item *it;
+   if (!wd) return NULL;
+   if (!wd->stack) return NULL;
+   it = eina_list_last(wd->stack)->data;
+   return it;
+}
+
+/**
+ * This disables content animation on push/pop.
+ *
+ * @param obj The navigationbar_ex object
+ * @param disable  if EINA_TRUE animation is disabled.
+ *
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_animation_disable_set(Evas_Object *obj, Eina_Bool disable)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   wd->disable_animation = disable;
+}
+
+/**
+ * This shows/hides title object area.
+ *
+ * @param[in] item The Navigationbar_ex item
+ * @param[in] visible  if EINA_TRUE title object is shown else its hidden.
+ * @ingroup Navigationbar_ex
+ */
+EAPI void
+elm_navigationbar_ex_title_object_visible_set(Elm_Navigationbar_ex_Item* item, Eina_Bool visible)
+{
+   if(!item) return;
+   if(!item->title_obj) return;
+   if(visible)
+     {
+        edje_object_signal_emit(item->base, "elm,state,show,title", "elm");
+        evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_TRUE);
+     }
+   else
+     {
+        edje_object_signal_emit(item->base, "elm,state,hide,title", "elm");
+        evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_FALSE);
+     }
+   item->titleobj_visible = visible;
+}
+
+/**
+ * This gets the status whether title object is shown/hidden.
+ *
+ * @param[in] item The Navigationbar_ex item
+ * @return The status whether title object is shown/hidden.
+ * @ingroup Navigationbar_ex
+ */
+Eina_Bool
+elm_navigationbar_ex_title_object_visible_get(Elm_Navigationbar_ex_Item* item)
+{
+   if (!item) return EINA_FALSE;
+   return item->titleobj_visible;
+}
+
+
+
diff --git a/src/lib/elm_slidingdrawer.c b/src/lib/elm_slidingdrawer.c
new file mode 100644 (file)
index 0000000..dd71d0d
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * @defgroup SlidingDrawer SlidingDrawer
+ * @ingroup Elementary
+ *
+ * This is a slidingdrawer.
+ */
+
+#include <Elementary.h>
+#include "elm_priv.h"
+
+typedef struct _Widget_Data Widget_Data;
+
+struct _Widget_Data
+{
+   Evas_Object *parent;
+   Evas_Object *base;
+   Evas_Object *handler;
+   Evas_Object *dragable_rect;
+   Elm_SlidingDrawer_Pos pos;
+   double max_drag_w;
+   double max_drag_h;
+   Elm_SlidingDrawer_Drag_Value value;
+};
+
+static const char *widtype = NULL;
+
+static void _del_hook(Evas_Object *obj);
+
+static void _theme_hook(Evas_Object *obj);
+
+static void _sizing_eval(Evas_Object *obj);
+
+static void _parent_resize(void *data, Evas * e, Evas_Object *obj, void *event_info);
+static void _drag_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _up_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _down_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+
+static void
+_del_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = (Widget_Data *) elm_widget_data_get(obj);
+
+   evas_object_event_callback_del(wd->parent, EVAS_CALLBACK_RESIZE, _parent_resize);
+   free(wd);
+}
+
+static void \r
+_theme_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = (Widget_Data *) elm_widget_data_get(obj);
+
+   elm_slidingdrawer_pos_set(obj, wd->pos);
+}
+
+static void
+_parent_resize(void *data, Evas * e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   _sizing_eval(data);
+}
+
+static void
+_drag_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+
+   edje_object_part_drag_value_get(wd->base, "elm.dragable.handler", &wd->value.x, &wd->value.y);
+   evas_object_smart_callback_call(data, "mouse,move", (void *)&wd->value);
+}
+
+static void
+_up_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+
+   edje_object_part_drag_value_get(wd->base, "elm.dragable.handler", &wd->value.x, &wd->value.y);
+   evas_object_smart_callback_call(data, "mouse,up", (void *)&wd->value);
+}
+
+static void
+_down_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+
+   edje_object_part_drag_value_get(wd->base, "elm.dragable.handler", &wd->value.x, &wd->value.y);
+   evas_object_smart_callback_call(data, "mouse,down", (void *)&wd->value);
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+   Widget_Data *wd;
+
+   Evas_Coord x, y, w, h;
+
+   const Evas_Object *part;
+
+   wd = elm_widget_data_get(obj);
+
+   evas_object_geometry_get(wd->parent, &x, &y, &w, &h);
+   evas_object_move(obj, x, y);
+   evas_object_resize(obj, w, h);
+
+   evas_object_size_hint_max_set(wd->dragable_rect, ((double)w) * wd->max_drag_w, ((double)h) * wd->max_drag_h);
+
+   part = edje_object_part_object_get(wd->base, "elm.dragable.handler");
+
+   if ((wd->pos == ELM_SLIDINGDRAWER_TOP)
+       || (wd->pos == ELM_SLIDINGDRAWER_BOTTOM))
+     edje_object_size_min_get(part, NULL, &h);
+   else
+     edje_object_size_min_get(part, &w, NULL);
+
+   evas_object_size_hint_min_set(wd->handler, w, h);
+}
+
+/**
+ * Unswallow the user content
+ *
+ * @param[in] obj              SlidingDrawer object
+ * @return             The unswallowed contents
+ *
+ * @ingroup SlidingDrawer
+ */
+EAPI Evas_Object *
+elm_slidingdrawer_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd;
+   Evas_Object *content;
+   wd = elm_widget_data_get(obj);
+   content = edje_object_part_swallow_get(wd->base, "elm.swallow.content");
+   if (!content)
+      return NULL;
+   edje_object_part_unswallow(wd->base, content);
+   elm_widget_sub_object_del(obj, content);
+   return content;
+}
+
+/**
+ * Swallow the user contents
+ *
+ * @param[in] obj               SlidingDrawer object
+ * @param[in] content           Content to be swallowed.
+ *
+ * @ingroup SlidingDrawer
+ */
+EAPI void
+elm_slidingdrawer_content_set(Evas_Object *obj, Evas_Object *content){
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+   Evas_Object *prev_content;
+   if (!content) return;
+   wd = elm_widget_data_get(obj);
+   elm_widget_sub_object_add(obj, content);
+   prev_content = edje_object_part_swallow_get(wd->base, "elm.swallow.content");
+   if (prev_content)
+     {
+        edje_object_part_unswallow(wd->base, prev_content);
+        elm_widget_sub_object_del(obj, prev_content);
+        evas_object_del(prev_content);
+     }
+   edje_object_part_swallow(wd->base, "elm.swallow.content", content);
+}
+
+/**
+ * Set the position of SlidingDrawer
+ *
+ * @param[in] obj               SlidingDrawer object
+ * @param[in] pos               Position of drawer's handle
+ *
+ * @ingroup SlidingDrawer
+ */
+EAPI void
+elm_slidingdrawer_pos_set(Evas_Object *obj, Elm_SlidingDrawer_Pos pos)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+
+   Widget_Data *wd = elm_widget_data_get(obj);
+
+   switch (pos)
+     {
+      case ELM_SLIDINGDRAWER_BOTTOM:
+         _elm_theme_object_set(obj, wd->base, "slidingdrawer", "bottom", elm_widget_style_get(obj));
+         break;
+      case ELM_SLIDINGDRAWER_LEFT:
+         _elm_theme_object_set(obj, wd->base, "slidingdrawer", "left", elm_widget_style_get(obj));
+         break;
+      case ELM_SLIDINGDRAWER_RIGHT:
+         _elm_theme_object_set(obj, wd->base, "slidingdrawer", "right", elm_widget_style_get(obj));
+         break;
+      case ELM_SLIDINGDRAWER_TOP:
+         _elm_theme_object_set(obj, wd->base, "slidingdrawer", "top", elm_widget_style_get(obj));
+         break;
+     }
+
+   edje_object_part_drag_value_set(wd->base, "elm.dragable.handler", 0, 0);
+   wd->pos = pos;
+   _sizing_eval(obj);
+}
+
+/**
+ * Set the current dragable value.
+ *
+ * @param[in] obj              SlidingDrawer object
+ * @param[in] dx               The x value (range: 0 ~ 1)
+ * @param[in] dy            The y value (range: 0 ~ 1)
+ *
+ * @ingroup SlidingDrawer
+ */
+EAPI void
+elm_slidingdrawer_drag_value_set(Evas_Object *obj, double dx, double dy)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+
+   wd = elm_widget_data_get(obj);
+   edje_object_part_drag_value_set(wd->base, "elm.dragable.handler", dx, dy);
+}
+
+/**
+ * Set the dragable max value.
+ *
+ * @param[in] obj              SlidingDrawer object
+ * @param[in] dw               The maximum width value (range: 0 ~ 1)
+ * @param[in] dh                The maximum height value (range: 0 ~ 1)
+ *
+ * @ingroup SlidingDrawer
+ */
+EAPI void
+elm_slidingdrawer_max_drag_value_set(Evas_Object *obj, double dw, double dh)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd;
+
+   wd = elm_widget_data_get(obj);
+   wd->max_drag_w = dw;
+   wd->max_drag_h = dh;
+   _sizing_eval(obj);
+
+}
+
+/**
+ * Add a new slidingdrawer object to the parent.
+ *
+ * @param[in] parent   Parent object
+ * @return             New object or NULL if it cannot be created
+ *
+ * @ingroup SlidingDrawer
+ */
+EAPI Evas_Object *
+elm_slidingdrawer_add(Evas_Object *parent)
+{
+   Evas_Object *obj;
+   Evas *e;
+   Widget_Data *wd;
+
+   ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
+
+   wd->parent = parent;
+   ELM_SET_WIDTYPE(widtype, "slidingdrawer");
+   elm_widget_type_set(obj, "slidingdrawer");
+   elm_widget_can_focus_set(obj, EINA_FALSE);
+   elm_widget_sub_object_add(parent, obj);
+   elm_widget_data_set(obj, wd);
+   elm_widget_del_hook_set(obj, _del_hook);
+   elm_widget_theme_hook_set(obj, _theme_hook);
+
+   //base
+   wd->base = edje_object_add(e);
+   _elm_theme_object_set(obj, wd->base, "slidingdrawer", "bottom", "default");
+   edje_object_signal_callback_add(wd->base, "drag", "*", _drag_cb, obj);
+   edje_object_signal_callback_add(wd->base, "mouse,up,*", "*", _up_cb, obj);
+   edje_object_signal_callback_add(wd->base, "mouse,down,*", "*", _down_cb, obj);
+   elm_widget_sub_object_add(obj, wd->base);
+   elm_widget_resize_object_set(obj, wd->base);
+
+   //dragable_rect
+   wd->dragable_rect = evas_object_rectangle_add(e);
+   elm_widget_sub_object_add(obj, wd->dragable_rect);
+   edje_object_part_swallow(wd->base, "elm.swallow.dragable_rect", wd->dragable_rect);
+   wd->max_drag_w = 1;
+   wd->max_drag_h = 1;
+
+   //handler
+   wd->handler = evas_object_rectangle_add(e);
+   elm_widget_sub_object_add(obj, wd->handler);
+   evas_object_color_set(wd->handler, 0, 0, 0, 0);
+   edje_object_part_swallow(wd->base, "elm.dragable.handler", wd->handler);
+
+   evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE, _parent_resize, obj);
+
+   _sizing_eval(obj);
+
+   return obj;
+}