added new widget elm_navigationbar_ex.c
authorshilpa singh <shilpa.singh@samsung.com>
Tue, 21 Sep 2010 17:10:27 +0000 (02:10 +0900)
committershilpa singh <shilpa.singh@samsung.com>
Tue, 21 Sep 2010 17:10:27 +0000 (02:10 +0900)
src/lib/Elementary.h.in [changed mode: 0755->0644]
src/lib/Makefile.am
src/lib/elm_navigationbar_ex.c [new file with mode: 0644]

old mode 100755 (executable)
new mode 100644 (file)
index b5d21ff..30a469a
@@ -2232,6 +2232,40 @@ extern "C" {
    EAPI const char * elm_navigationbar_subtitle_label_get(Evas_Object *obj, Evas_Object *content);
    EAPI void elm_navigationbar_subtitle_label_set(Evas_Object *obj, Evas_Object *content, const char *subtitle);
    EAPI void elm_navigationbar_title_object_list_unset(Evas_Object *obj, Evas_Object *content, Eina_List **list);
+
+     /* NavigationBar */
+   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;
+
+   EAPI Evas_Object *elm_navigationbar_ex_add(Evas_Object *parent);
+   EAPI Elm_Navigationbar_ex_Item *elm_navigationbar_ex_item_push(Evas_Object *obj, Evas_Object *content, const char *item_style);
+   EAPI void         elm_navigationbar_ex_item_pop(Evas_Object *obj);
+   EAPI void            elm_navigationbar_ex_item_promote(Elm_Navigationbar_ex_Item* item);
+   EAPI void         elm_navigationbar_ex_title_label_set(Elm_Navigationbar_ex_Item *item, const char *title);
+   EAPI const char   *elm_navigationbar_ex_title_label_get(Elm_Navigationbar_ex_Item* item);
+   EAPI Elm_Navigationbar_ex_Item *elm_navigationbar_ex_item_top_get(const Evas_Object *obj);
+   EAPI Elm_Navigationbar_ex_Item *elm_navigationbar_ex_item_bottom_get(const Evas_Object *obj);
+   EAPI void           elm_navigationbar_ex_title_button_set(Elm_Navigationbar_ex_Item* item, char *btn_label, Evas_Object *icon, int button_type, Evas_Smart_Cb func, const void *data);
+   EAPI void           elm_navigationbar_ex_title_object_set(Elm_Navigationbar_ex_Item* item, Evas_Object *title_obj);
+   EAPI const char *elm_navigationbar_ex_subtitle_label_get(Elm_Navigationbar_ex_Item* item);
+   EAPI void           elm_navigationbar_ex_subtitle_label_set( Elm_Navigationbar_ex_Item* item, const char *subtitle);
+   EAPI Evas_Object* elm_navigationbar_ex_title_object_unset(Elm_Navigationbar_ex_Item* item);
+   EAPI void           elm_navigationbar_ex_item_style_set(Elm_Navigationbar_ex_Item* item, const char* item_style);
+   EAPI const char* elm_navigationbar_ex_item_style_get(Elm_Navigationbar_ex_Item* item);
+   EAPI void           elm_navigationbar_ex_title_hidden_set(Elm_Navigationbar_ex_Item* item, Eina_Bool hidden);
+   EAPI void           elm_navigationbar_ex_to_item_pop(Elm_Navigationbar_ex_Item* item);
+   EAPI Evas_Object *elm_navigationbar_ex_title_button_get(Elm_Navigationbar_ex_Item* item, int button_type);
+   EAPI Evas_Object *elm_navigationbar_ex_content_unset(Elm_Navigationbar_ex_Item* item);
+   EAPI Evas_Object *elm_navigationbar_ex_content_get(Elm_Navigationbar_ex_Item* item);
+   EAPI void elm_navigationbar_ex_delete_on_pop_set(Evas_Object *obj, Eina_Bool del_on_pop);
+   
    
    /* Tab Bar */
    #define TAB_BAR_SYSTEM_ICON_CONTACT "elm/icon/tabbar_contact/default" 
index 4ea873f..82c07ed 100755 (executable)
@@ -96,6 +96,7 @@ elm_popup.c \
 elm_diskcontroller.c \
 elm_tab.c \
 elm_navigationbar.c \
+elm_navigationbar_ex.c\
 elm_tabbar.c \
 elm_transit.c \
 elm_animator.c \
diff --git a/src/lib/elm_navigationbar_ex.c b/src/lib/elm_navigationbar_ex.c
new file mode 100644 (file)
index 0000000..b4fbecf
--- /dev/null
@@ -0,0 +1,858 @@
+#include <Elementary.h>\r
+#include "elm_priv.h"\r
+\r
+/**\r
+ * @defgroup Navigationbar_ex Navigationbar_ex\r
+ * @ingroup Elementary\r
+ *\r
+ * The NavigationBar_ex is an object that allows flipping (with animation) between 1 or\r
+ * more pages of objects, much like a stack of windows within the window as well display\r
+ * the title area for the page consisting of buttons, title, titleobjects etc:-.\r
+ *\r
+ * Objects can be pushed or popped from the stack or deleted as normal.\r
+ * Pushes and pops will animate and a pop will delete the object once the\r
+ * animation is finished if delete_on_pop is set else the content is unset and the \r
+ * content pointer is sent as event information in the hide,finished signal.  \r
+ * Any object in the Navigationbar_ex can be promoted to the top\r
+ * (from its current stacking position) as well. Objects are pushed to the\r
+ * top with elm_navigationbar_ex_item_push() and when the top item is no longer\r
+ * wanted, simply pop it with elm_navigationbar_ex_item_pop() and it will also be\r
+ * deleted/unset depending on delete_on_pop variable. \r
+ * Any object you wish to promote to the top that is already in the\r
+ * navigationbar, simply use elm_navigationbar_ex_item_promote(). If an object is no longer\r
+ * needed and is not the top item, just delete it as normal. You can query\r
+ * which objects are the top and bottom with elm_navigationbar_ex_item_bottom_get()\r
+ * and elm_navigationbar_ex_item_top_get().\r
+ */\r
+\r
+typedef struct _Widget_Data Widget_Data;\r
+typedef struct _function_button fn_button;\r
+\r
+\r
+\r
+struct _Widget_Data\r
+{\r
+   Eina_List *stack, *to_delete;\r
+   Elm_Navigationbar_ex_Item *top;\r
+   Evas_Object *rect, *clip;\r
+   Eina_Bool del_on_pop : 1;\r
+};\r
+\r
+struct _Elm_Navigationbar_ex_Item\r
+{\r
+   Evas_Object *obj, *base, *content;\r
+   Evas_Coord minw, minh;\r
+   const char *title;\r
+   const char *subtitle;\r
+   const char *item_style;\r
+   Eina_List *fnbtn_list;\r
+   Evas_Object *title_obj;\r
+   Eina_Bool popme : 1;\r
+};\r
+\r
+struct _function_button\r
+{\r
+       Evas_Object *btn;\r
+       int btn_id;\r
+};\r
+\r
+static const char *widtype = NULL;\r
+static void _del_hook(Evas_Object *obj);\r
+static void _theme_hook(Evas_Object *obj);\r
+static void _sizing_eval(Evas_Object *obj);\r
+static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
+static void _sub_del(void *data, Evas_Object *obj, void *event_info);\r
+\r
+\r
+static void\r
+_del_hook(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return;\r
+       free(wd);\r
+}\r
+\r
+\r
+static Evas_Object*\r
+_content_unset(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       if(!item) return NULL;\r
+       Evas_Object *content = NULL;\r
+       if(!item->content) return NULL; \r
+       content = item->content;\r
+       elm_widget_sub_object_del(item->obj,item->content);\r
+       edje_object_part_unswallow(item->base,item->content);   \r
+       item->content = NULL;\r
+       evas_object_hide(content);\r
+       return content;\r
+}\r
+\r
+static void\r
+_theme_hook(Evas_Object *obj)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Eina_List *l;\r
+   char buf_fn[1024];\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   EINA_LIST_FOREACH(wd->stack, l, it)\r
+       {\r
+       Eina_List *bl;\r
+       fn_button *btn;\r
+     edje_object_scale_set(it->base, elm_widget_scale_get(obj) * \r
+                           _elm_config->scale);\r
+        EINA_LIST_FOREACH(it->fnbtn_list, bl, btn)\r
+               {\r
+                       if(btn->btn_id == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)\r
+                               {\r
+                                       snprintf(buf_fn, sizeof(buf_fn), "navigationbar_backbutton/%s", elm_widget_style_get(obj));\r
+                                       elm_object_style_set(btn->btn, buf_fn);\r
+                               }\r
+                       else\r
+                               {\r
+                                       snprintf(buf_fn, sizeof(buf_fn), "navigationbar_functionbutton/%s", elm_widget_style_get(obj));\r
+                                       elm_object_style_set(btn->btn, buf_fn);\r
+                               }\r
+               }\r
+       }\r
+   _sizing_eval(obj);\r
+}\r
+\r
+static void\r
+_sizing_eval(Evas_Object *obj)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Evas_Coord minw = -1, minh = -1;\r
+   Eina_List *l;\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   EINA_LIST_FOREACH(wd->stack, l, it)\r
+     {\r
+       if (it->minw > minw) minw = it->minw;\r
+       if (it->minh > minh) minh = it->minh;\r
+     }\r
+   evas_object_size_hint_min_set(obj, minw, minh);\r
+   evas_object_size_hint_max_set(obj, -1, -1);\r
+}\r
+\r
+static void\r
+_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
+{\r
+   Elm_Navigationbar_ex_Item *it = data;\r
+   Evas_Coord minw = -1, minh = -1;\r
+   evas_object_size_hint_min_get(it->content, &minw, &minh);\r
+   // FIXME: why is this needed? how does edje get this unswallowed or\r
+   // lose its callbacks to edje\r
+   edje_object_part_swallow(it->base, "elm.swallow.content", it->content);\r
+   edje_object_size_min_calc(it->base, &it->minw, &it->minh);\r
+   _sizing_eval(it->obj);\r
+}\r
+\r
+static void\r
+_eval_top(Evas_Object *obj, Eina_Bool push)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Eina_Bool animate=EINA_TRUE;\r
+   Elm_Navigationbar_ex_Item *ittop;\r
+   if (!wd) return;\r
+   if (!wd->stack) return;\r
+   ittop = eina_list_last(wd->stack)->data;\r
+   if (ittop != wd->top)\r
+     {\r
+       Evas_Object *o;\r
+       const char *onshow, *onhide;\r
+\r
+       if (wd->top)\r
+         {\r
+            o = wd->top->base;\r
+            edje_object_signal_emit(o, "elm,action,hide", "elm");\r
+            onhide = edje_object_data_get(o, "onhide");\r
+            if (onhide)\r
+              {\r
+                 if (!strcmp(onhide, "raise")) evas_object_raise(o);\r
+                 else if (!strcmp(onhide, "lower")) evas_object_lower(o);\r
+              }\r
+         }\r
+       else\r
+         {\r
+            animate = EINA_FALSE;\r
+         }\r
+       wd->top = ittop;\r
+       o = wd->top->base;\r
+       evas_object_show(o);\r
+       if(animate)\r
+               {\r
+               if(push)\r
+         edje_object_signal_emit(o, "elm,action,show,push", "elm");\r
+               else\r
+         edje_object_signal_emit(o, "elm,action,show,pop", "elm");\r
+               }\r
+       else\r
+         edje_object_signal_emit(o, "elm,action,show,noanimate", "elm");\r
+       onshow = edje_object_data_get(o, "onshow");\r
+       if (onshow)\r
+         {\r
+            if (!strcmp(onshow, "raise")) evas_object_raise(o);\r
+            else if (!strcmp(onshow, "lower")) evas_object_lower(o);            \r
+         }\r
+     }\r
+}\r
+\r
+static void\r
+_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(data);\r
+   Evas_Coord x, y;\r
+   Eina_List *l;\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   evas_object_geometry_get(obj, &x, &y, NULL, NULL);\r
+   EINA_LIST_FOREACH(wd->stack, l, it)\r
+     evas_object_move(it->base, x, y);\r
+}\r
+\r
+static void\r
+_sub_del(void *data, Evas_Object *obj __UNUSED__, void *event_info)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(data);\r
+   Evas_Object *sub = event_info;\r
+   Eina_List *l,*list;\r
+   fn_button *btn_data;\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   EINA_LIST_FOREACH(wd->stack, l, it)\r
+     {\r
+       if (it->content == sub)\r
+         {\r
+           wd->stack = eina_list_remove_list(wd->stack, l);\r
+           evas_object_event_callback_del_full\r
+               (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it);\r
+               if (it->title) eina_stringshare_del(it->title);\r
+               if (it->subtitle) eina_stringshare_del(it->subtitle);\r
+               EINA_LIST_FOREACH(it->fnbtn_list, list, btn_data)\r
+                       {\r
+                               evas_object_del(btn_data->btn);\r
+                               free(btn_data);\r
+                               btn_data = NULL;\r
+                       }\r
+               if(it->item_style) eina_stringshare_del(it->item_style);\r
+               if(it->title_obj) evas_object_del(it->title_obj);\r
+            evas_object_del(it->base);\r
+            _eval_top(it->obj, EINA_FALSE);\r
+            free(it);\r
+            return;\r
+         }\r
+     }\r
+}\r
+\r
+static void\r
+_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)\r
+{   \r
+   Widget_Data *wd = elm_widget_data_get(data);\r
+   Evas_Coord w, h;\r
+   Eina_List *l;\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);\r
+   EINA_LIST_FOREACH(wd->stack, l, it) evas_object_resize(it->base, w, h);\r
+}\r
+\r
+static void\r
+_signal_hide_finished(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)\r
+{\r
+   Elm_Navigationbar_ex_Item *it = data;\r
+   Evas_Object *obj2 = it->obj;\r
+   Widget_Data *wd = elm_widget_data_get(it->obj);\r
+   evas_object_hide(it->base);\r
+   edje_object_signal_emit(it->base, "elm,action,reset", "elm");\r
+   evas_object_smart_callback_call(obj2, "hide,finished", it->content);\r
+   edje_object_message_signal_process(it->base);\r
+   if(it->popme)\r
+       {\r
+               if(wd->del_on_pop)\r
+                       {\r
+                               evas_object_del(it->content);\r
+                       }\r
+               else\r
+                       {\r
+                               _content_unset(it);\r
+                       }\r
+       }\r
+   _sizing_eval(obj2);\r
+}\r
+\r
+static void _item_promote(Elm_Navigationbar_ex_Item* item)\r
+{\r
+   if(!item) return;\r
+   Widget_Data *wd = elm_widget_data_get(item->obj);\r
+   Eina_List *l;\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   EINA_LIST_FOREACH(wd->stack, l, it)\r
+     {\r
+       if (it == item)\r
+         {\r
+            wd->stack = eina_list_remove_list(wd->stack, l);\r
+            wd->stack = eina_list_append(wd->stack, it);\r
+            _eval_top(it->obj, EINA_FALSE);\r
+            return;\r
+         }\r
+     }\r
+}\r
+\r
+static void\r
+_process_deletions(Widget_Data *wd)\r
+{\r
+       if (!wd) return;        \r
+       Elm_Navigationbar_ex_Item *it;  \r
+       fn_button *btn_data;\r
+       Eina_List *list;\r
+       EINA_LIST_FREE(wd->to_delete, it)\r
+               {\r
+                       evas_object_event_callback_del_full\r
+                                                 (it->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it);\r
+                       if (it->title) eina_stringshare_del(it->title);\r
+                       if (it->subtitle) eina_stringshare_del(it->subtitle);\r
+                       if(it->item_style) eina_stringshare_del(it->item_style);\r
+                       EINA_LIST_FOREACH(it->fnbtn_list, list, btn_data)\r
+                               {\r
+                                       evas_object_del(btn_data->btn);\r
+                                       free(btn_data);\r
+                                       btn_data = NULL;\r
+                               }\r
+                       if(it->title_obj) evas_object_del(it->title_obj);               \r
+                       if(it->content)  evas_object_del(it->content);\r
+                       evas_object_del(it->base);\r
+                       _eval_top(it->obj, EINA_FALSE);\r
+                       free(it);\r
+                       it = NULL;\r
+               }       \r
+}\r
+\r
+/**\r
+ * Add a new navigationbar_ex to the parent\r
+ *\r
+ * @param parent The parent object\r
+ * @return The new object or NULL if it cannot be created\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Evas_Object *\r
+elm_navigationbar_ex_add(Evas_Object *parent)\r
+{\r
+   Evas_Object *obj;\r
+   Evas *e;\r
+   Widget_Data *wd;\r
+\r
+   wd = ELM_NEW(Widget_Data);\r
+   e = evas_object_evas_get(parent);\r
+   obj = elm_widget_add(e);\r
+   ELM_SET_WIDTYPE(widtype, "navigationbar_ex");\r
+   elm_widget_type_set(obj, "navigationbar_ex");\r
+   elm_widget_sub_object_add(parent, obj);\r
+   elm_widget_data_set(obj, wd);\r
+   elm_widget_del_hook_set(obj, _del_hook);\r
+   elm_widget_theme_hook_set(obj, _theme_hook);\r
+\r
+   wd->clip = evas_object_rectangle_add(e);\r
+   elm_widget_resize_object_set(obj, wd->clip);\r
+   elm_widget_sub_object_add(obj, wd->clip);\r
+\r
+   wd->rect = evas_object_rectangle_add(e);\r
+   elm_widget_sub_object_add(obj, wd->rect);\r
+   evas_object_color_set(wd->rect, 255, 255, 255, 0); \r
+   evas_object_clip_set(wd->rect, wd->clip);\r
+\r
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);\r
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);\r
+\r
+   evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);\r
+   wd->del_on_pop = EINA_TRUE;\r
+   _sizing_eval(obj);\r
+   return obj;\r
+}\r
+\r
+/**\r
+ * Push an object along with its style to the top of the Navigationbar_ex stack (and show it)\r
+ *\r
+ * The object pushed becomes a child of the Navigationbar_ex and will be controlled\r
+ * it will be deleted when the Navigationbar_ex is deleted.\r
+ *\r
+ * @param[in] obj The Navigationbar_ex object\r
+ * @param[in] content The object to push\r
+ * @param[in] item_style The style of the page\r
+ * @return The Navigationbar_ex Item or NULL\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Elm_Navigationbar_ex_Item*\r
+elm_navigationbar_ex_item_push(Evas_Object *obj, Evas_Object *content, const char* item_style)\r
+{\r
+   ELM_CHECK_WIDTYPE(obj, widtype)NULL;\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Elm_Navigationbar_ex_Item *it = ELM_NEW(Elm_Navigationbar_ex_Item);\r
+   Evas_Coord x, y, w, h;\r
+   char buf[1024];\r
+   if (!wd) return NULL;\r
+   if (!content) return NULL;\r
+   if (!item_style) return NULL;\r
+   if (!it) return NULL;\r
+   it->obj = obj;\r
+   it->content = content;\r
+   it->base = edje_object_add(evas_object_evas_get(obj));\r
+   evas_object_smart_member_add(it->base, obj);\r
+   evas_object_geometry_get(obj, &x, &y, &w, &h);\r
+   evas_object_move(it->base, x, y);\r
+   evas_object_resize(it->base, w, h);\r
+   evas_object_clip_set(it->base, wd->clip);\r
+   elm_widget_sub_object_add(obj, it->base);\r
+   elm_widget_sub_object_add(obj, it->content);\r
+   strncpy(buf, "item/", sizeof(buf));\r
+   strncat(buf, item_style, sizeof(buf) - strlen(buf));\r
+   if (!eina_stringshare_replace(&it->item_style, item_style)) return NULL;\r
+   \r
+   _elm_theme_object_set(obj, it->base,  "navigationbar_ex", buf, elm_widget_style_get(obj));\r
+   edje_object_signal_callback_add(it->base, "elm,action,hide,finished", "", \r
+                                   _signal_hide_finished, it);\r
+   evas_object_event_callback_add(it->content,\r
+                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,\r
+                                 _changed_size_hints, it);\r
+   edje_object_part_swallow(it->base, "elm.swallow.content", it->content);\r
+   edje_object_size_min_calc(it->base, &it->minw, &it->minh);\r
+   evas_object_show(it->content);\r
+   wd->stack = eina_list_append(wd->stack, it);\r
+   _eval_top(obj, EINA_TRUE);\r
+   _sizing_eval(obj);\r
+   return it;\r
+}\r
+\r
+/**\r
+ * Set the title string for the pushed Item.\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] title The title string\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void\r
+elm_navigationbar_ex_title_label_set( Elm_Navigationbar_ex_Item* item, \r
+                                                       const char *title)\r
+{\r
+       if(!item) return;\r
+       if (!eina_stringshare_replace(&item->title, title)) return;\r
+       if (item->base)\r
+     edje_object_part_text_set(item->base, "elm.text", item->title);   \r
+}\r
+\r
+/**\r
+ * Return the title string of the pushed item.\r
+ *\r
+ * @param[in]  item The Navigationbar_ex Item\r
+ * @return The title string or NULL if none\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI const char *\r
+elm_navigationbar_ex_title_label_get(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       if(!item) return NULL;\r
+       return item->title;\r
+}\r
+\r
+/**\r
+ * Set the sub title string for the pushed content\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] subtitle The subtitle string\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void \r
+elm_navigationbar_ex_subtitle_label_set( Elm_Navigationbar_ex_Item* item, \r
+                                                       const char *subtitle)\r
+{\r
+       if(!item) return;\r
+       if (!eina_stringshare_replace(&item->subtitle, subtitle)) return;\r
+       if (item->base)\r
+     edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);    \r
+}\r
+\r
+/**\r
+ * Return the subtitle string of the pushed content\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item\r
+ * @return The subtitle string or NULL if none\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI const char *\r
+elm_navigationbar_ex_subtitle_label_get(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       if(!item) return NULL;\r
+       return item->subtitle;\r
+}\r
+\r
+/**\r
+ * Set the button object of the pushed content\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] btn_label The button label\r
+ * @param[in] icon The button icon\r
+ * @param[in] button_type Indicates the position[use macros of type Elm_Navi_ex_Button_Type\r
+ * if more function buttons are required you can use values ELM_NAVIGATIONBAR_EX_MAX and more]\r
+ * @param[in] func Callback function called when button is clicked.\r
+ * @param[in] data Callback data that would be sent when button is clicked.\r
+ * @ingroup Navigationbar_ex\r
+ */ \r
+ EAPI void\r
+elm_navigationbar_ex_title_button_set(Elm_Navigationbar_ex_Item* item, char *btn_label, Evas_Object *icon, int button_type, Evas_Smart_Cb func, const void *data)\r
+{\r
+       if(!item) return;\r
+       Evas_Object *btn;\r
+       char buf[1024],theme[1024];\r
+       fn_button *btn_det;\r
+       btn = elm_button_add(item->obj);\r
+       btn_det = ELM_NEW(btn_det);\r
+       if(button_type == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)\r
+               {\r
+                       snprintf(theme, sizeof(theme), "navigationbar_backbutton/%s", elm_widget_style_get(item->obj));\r
+                       elm_object_style_set(btn, theme);\r
+                       snprintf(buf, sizeof(buf), "elm.swallow.back");\r
+               }\r
+       else\r
+               {\r
+                       snprintf(theme, sizeof(theme), "navigationbar_functionbutton/%s", elm_widget_style_get(item->obj));\r
+                       elm_object_style_set(btn, theme);                                       \r
+                       snprintf(buf, sizeof(buf), "elm.swallow.btn%d", button_type);\r
+               }\r
+       if(btn_label)\r
+               elm_button_label_set(btn, btn_label);\r
+       if(icon)\r
+               elm_button_icon_set(btn, icon);\r
+       elm_object_focus_allow_set(btn, EINA_FALSE); \r
+       evas_object_smart_callback_add(btn, "clicked", func, data);\r
+       edje_object_part_swallow(item->base, buf, btn);\r
+       elm_widget_sub_object_add(item->obj, btn);\r
+       btn_det->btn = btn;\r
+       btn_det->btn_id = button_type;\r
+       item->fnbtn_list = eina_list_append(item->fnbtn_list, btn_det);\r
+}\r
+\r
+/**\r
+ * Return the button object of the pushed content\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] button_type Indicates the position\r
+ * @return The button object or NULL if none\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Evas_Object *\r
+elm_navigationbar_ex_title_button_get(Elm_Navigationbar_ex_Item* item, int button_type)\r
+       {\r
+               fn_button *btn_det;\r
+               Eina_List *bl;\r
+               EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)\r
+               {\r
+                       if(btn_det->btn_id == button_type)\r
+                               return btn_det->btn;\r
+               }\r
+               return NULL;\r
+               \r
+       }\r
+\r
+/**\r
+ * Sets a title object for the Item \r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] title_obj Title object (normally segment_control/searchbar)\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void\r
+elm_navigationbar_ex_title_object_set(Elm_Navigationbar_ex_Item* item,\r
+                                                                       Evas_Object *title_obj)\r
+{\r
+       if(!item) return;\r
+       if(item->title_obj) evas_object_del(item->title_obj);\r
+       item->title_obj = title_obj;\r
+       if(title_obj)\r
+               {\r
+                       elm_widget_sub_object_add(item->obj,title_obj);\r
+                       edje_object_part_swallow(item->base, "elm.swallow.title", title_obj);\r
+               }\r
+       _sizing_eval(item->obj);\r
+}\r
+\r
+/**\r
+ * Hides the title area of the item.\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] hidden if EINA_TRUE the title area is hidden else its shown.\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+\r
+EAPI void\r
+elm_navigationbar_ex_title_hidden_set(Elm_Navigationbar_ex_Item* item,\r
+                                                                       Eina_Bool hidden)\r
+{\r
+       if(!item) return;\r
+\r
+       if (hidden) edje_object_signal_emit(item->base, "elm,state,item,moveup", "elm");\r
+       else edje_object_signal_emit(item->base, "elm,state,item,movedown", "elm");\r
+       _sizing_eval(item->obj);\r
+}\r
+\r
+/**\r
+ * unsets a title object for the item, the return object has to be deleted\r
+ * by application if not added again in to navigationbar.\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @return The title object or NULL if none is set\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Evas_Object*\r
+elm_navigationbar_ex_title_object_unset(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       if(!item) return NULL;\r
+       Evas_Object *title_obj=NULL;\r
+       if(!item->title_obj) return NULL; \r
+       title_obj = item->title_obj;\r
+       elm_widget_sub_object_del(item->obj,item->title_obj);\r
+       edje_object_part_unswallow(item->base,item->title_obj); \r
+       item->title_obj = NULL;\r
+       return title_obj;\r
+}\r
+\r
+/**\r
+ * unsets the content of the item, the return object has to be deleted\r
+ * by application if not added again in to navigationbar, when the content \r
+ * is unset the corresponding item would be deleted, when this content is pushed again \r
+ * a new item would be created again.\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @return The title object or NULL if none is set\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Evas_Object *elm_navigationbar_ex_content_unset(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       Evas_Object *content = _content_unset(item);\r
+       return content;\r
+}\r
+\r
+\r
+/**\r
+ * returns the content of the item.\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @return The title object or NULL if none is set\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Evas_Object *elm_navigationbar_ex_content_get(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       if(!item) return NULL;\r
+       return item->content;\r
+}\r
+\r
+/**\r
+ * set whether the content pushed has to be deleted on pop.\r
+ * if false the item is not deleted but only removed from the stack\r
+ * the pointer of the content is sent along with hide,finished signal.\r
+ *\r
+ * @param[in] obj The Navigationbar_ex object. \r
+ * @param[in] del_on_pop if set the content is deleted on pop else unset, by default the value is EINA_TRUE.\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void elm_navigationbar_ex_delete_on_pop_set(Evas_Object *obj, Eina_Bool del_on_pop)\r
+{\r
+       ELM_CHECK_WIDTYPE(obj, widtype);\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return;\r
+       wd->del_on_pop = del_on_pop;    \r
+}\r
+\r
+/**\r
+ * Sets the style of the navigationbar item. \r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @param[in] item_style Navigationbar Item style, this can be used when the style of the item has to be dynamically set.\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void\r
+elm_navigationbar_ex_item_style_set(Elm_Navigationbar_ex_Item* item, const char* item_style)\r
+{\r
+       if(!item) return;\r
+       char buf[1024];\r
+       strncpy(buf, "item/", sizeof(buf));\r
+       strncat(buf, item_style, sizeof(buf) - strlen(buf));\r
+       if (!eina_stringshare_replace(&item->item_style, item_style)) return;\r
+       _elm_theme_object_set(item->obj, item->base,  "navigationbar2", buf, elm_widget_style_get(item->obj));\r
+       if(item->title)\r
+               edje_object_part_text_set(item->base, "elm.text", item->title);\r
+       if(item->subtitle)\r
+               edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);\r
+}\r
+\r
+/**\r
+ * returns the style of the item.\r
+ *\r
+ * @param[in] item The Navigationbar_ex Item \r
+ * @return The item style.\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI const char* elm_navigationbar_ex_item_style_get(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       if(!item) return NULL;\r
+       return item->item_style;\r
+}\r
+\r
+\r
+/**\r
+ * Promote an object already in the stack to the top of the stack\r
+ *\r
+ * This will take the indicated object and promote it to the top of the stack\r
+ * as if it had been pushed there. The object must already be inside the\r
+ * Navigationbar_ex stack to work.\r
+ *\r
+ * @param item The Navigationbar_ex item to promote.\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void\r
+elm_navigationbar_ex_item_promote(Elm_Navigationbar_ex_Item* item)\r
+{\r
+       _item_promote(item);  \r
+}\r
+\r
+/**\r
+ * Pop to the inputted Navigationbar_ex item\r
+ * the rest of the items are deleted.\r
+ *\r
+ * @param[in] item The Navigationbar_ex item\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void elm_navigationbar_ex_to_item_pop(Elm_Navigationbar_ex_Item* item)\r
+{\r
+   if(!item) return;\r
+   Widget_Data *wd = elm_widget_data_get(item->obj);\r
+   Elm_Navigationbar_ex_Item *it = NULL;\r
+   Eina_List *list;\r
+   if (!wd) return;\r
+   if (!wd->stack) return;\r
+   list = eina_list_last(wd->stack);\r
+   if(list)\r
+       {\r
+               while(list)\r
+                       {\r
+                               it = list->data;\r
+                               if(it != item)\r
+                                       {\r
+                                               wd->to_delete = eina_list_append(wd->to_delete, it);\r
+                                               wd->stack = eina_list_remove_list(wd->stack, list);\r
+                                       }\r
+                               else\r
+                                       break;\r
+                               \r
+                               list = list->prev;\r
+                       }\r
+       }  \r
+    _eval_top(it->obj, EINA_FALSE);\r
+       if(wd->to_delete)\r
+               _process_deletions(wd);\r
+}\r
+\r
+/**\r
+ * Pop the object that is on top of the Navigationbar_ex stack \r
+ * This pops the object that is on top (visible) in the navigationbar, makes it disappear, then deletes/unsets the object\r
+ * based on del_on_pop variable. \r
+ * The object that was underneath it on the stack will become visible.\r
+ *\r
+ * @param[in] obj The Navigationbar_ex object\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void\r
+elm_navigationbar_ex_item_pop(Evas_Object *obj)\r
+{\r
+   ELM_CHECK_WIDTYPE(obj, widtype);\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Eina_List *ll;\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return;\r
+   if (!wd->stack) return;\r
+   it = eina_list_last(wd->stack)->data;\r
+   it->popme = EINA_TRUE;\r
+   ll = eina_list_last(wd->stack);\r
+   if (ll)\r
+     {\r
+       ll = ll->prev;\r
+       if (!ll)\r
+         {\r
+               \r
+            Evas_Object *o;\r
+            const char *onhide;\r
+\r
+            wd->top = it;\r
+            o = wd->top->base;\r
+                \r
+            edje_object_signal_emit(o, "elm,action,hide", "elm");\r
+            onhide = edje_object_data_get(o, "onhide");\r
+            if (onhide)\r
+              {\r
+                 if (!strcmp(onhide, "raise")) evas_object_raise(o);\r
+                 else if (!strcmp(onhide, "lower")) evas_object_lower(o);\r
+              }\r
+            wd->top = NULL;\r
+         }\r
+       else\r
+         {\r
+            it = ll->data;\r
+            _item_promote(it);\r
+         }\r
+     }\r
+}\r
+\r
+\r
+/**\r
+ * Return the item at the bottom of the Navigationbar_ex stack\r
+ *\r
+ * @param obj The Navigationbar_ex object\r
+ * @return The bottom item or NULL if none\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Elm_Navigationbar_ex_Item*\r
+elm_navigationbar_ex_item_bottom_get(const Evas_Object *obj)\r
+{\r
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return NULL;\r
+   if (!wd->stack) return NULL;\r
+   it = wd->stack->data;\r
+   return it;\r
+}\r
+\r
+/**\r
+ * Return the item at the top of the Navigationbar_ex stack\r
+ *\r
+ * @param obj The Navigationbar_ex object\r
+ * @return The top object or NULL if none\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI Elm_Navigationbar_ex_Item*\r
+elm_navigationbar_ex_item_top_get(const Evas_Object *obj)\r
+{\r
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   Elm_Navigationbar_ex_Item *it;\r
+   if (!wd) return NULL;\r
+   if (!wd->stack) return NULL;\r
+   it = eina_list_last(wd->stack)->data;\r
+   return it;\r
+}\r
+\r
+\r