[access] support back gesture
[framework/uifw/elementary.git] / src / lib / elc_naviframe.c
index e16a662..3a58150 100644 (file)
@@ -8,6 +8,9 @@ static const char CONTENT_PART[] = "elm.swallow.content";
 static const char PREV_BTN_PART[] = "elm.swallow.prev_btn";
 static const char NEXT_BTN_PART[] = "elm.swallow.next_btn";
 static const char ICON_PART[] = "elm.swallow.icon";
+static const char TITLE_PART[] = "elm.text.title";
+static const char SUBTITLE_PART[] = "elm.text.subtitle";
+static const char TITLE_ACCESS_PART[] = "access.title";
 
 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
 static const char SIG_TITLE_CLICKED[] = "title,clicked";
@@ -21,6 +24,8 @@ EVAS_SMART_SUBCLASS_NEW
   (ELM_NAVIFRAME_SMART_NAME, _elm_naviframe, Elm_Naviframe_Smart_Class,
   Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
 
+static const char SIG_CLICKED[] = "clicked";
+
 static void
 _item_content_del_cb(void *data,
                      Evas *e __UNUSED__,
@@ -30,7 +35,7 @@ _item_content_del_cb(void *data,
    Elm_Naviframe_Item *it = data;
 
    it->content = NULL;
-   edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
+   elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
 }
 
 static void
@@ -42,7 +47,7 @@ _item_title_prev_btn_del_cb(void *data,
    Elm_Naviframe_Item *it = data;
 
    it->title_prev_btn = NULL;
-   edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
+   elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
 }
 
 static void
@@ -54,7 +59,7 @@ _item_title_next_btn_del_cb(void *data,
    Elm_Naviframe_Item *it = data;
 
    it->title_next_btn = NULL;
-   edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
+   elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
 }
 
 static void
@@ -66,7 +71,7 @@ _item_title_icon_del_cb(void *data,
    Elm_Naviframe_Item *it = data;
 
    it->title_icon = NULL;
-   edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
+   elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
 }
 
 static void
@@ -79,7 +84,7 @@ _title_content_del(void *data,
    Elm_Naviframe_Content_Item_Pair *pair = data;
    Elm_Naviframe_Item *it = pair->it;
    snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
-   edje_object_signal_emit(VIEW(it), buf, "elm");
+   elm_object_signal_emit(VIEW(it), buf, "elm");
    it->content_list = eina_inlist_remove(it->content_list,
                                          EINA_INLIST_GET(pair));
    eina_stringshare_del(pair->part);
@@ -99,10 +104,6 @@ _item_free(Elm_Naviframe_Item *it)
    eina_stringshare_del(it->title_label);
    eina_stringshare_del(it->subtitle_label);
 
-   if (it->title_prev_btn) evas_object_del(it->title_prev_btn);
-   if (it->title_next_btn) evas_object_del(it->title_next_btn);
-   if (it->title_icon) evas_object_del(it->title_icon);
-
    EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
      {
         if (content_pair->content)
@@ -127,12 +128,10 @@ _item_free(Elm_Naviframe_Item *it)
           {
              /* so that elm does not delete the contents with the item's
               * view after the del_pre_hook */
-             edje_object_part_unswallow(VIEW(it), it->content);
+             elm_object_part_content_unset(VIEW(it), CONTENT_PART);
              evas_object_event_callback_del
                 (it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
           }
-        else
-          evas_object_del(it->content);
      }
 }
 
@@ -143,26 +142,26 @@ _item_content_signals_emit(Elm_Naviframe_Item *it)
    char buf[1024];
    //content
    if (it->content)
-     edje_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
    else
-     edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
 
    //prev button
    if (it->title_prev_btn)
-     edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
    else
-     edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
 
    //next button
    if (it->title_next_btn)
-     edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
    else
-     edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
 
    if (it->title_icon)
-     edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
    else
-     edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
 
    EINA_INLIST_FOREACH(it->content_list, content_pair)
      {
@@ -170,7 +169,7 @@ _item_content_signals_emit(Elm_Naviframe_Item *it)
           snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
         else
           snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
-        edje_object_signal_emit(VIEW(it), buf, "elm");
+        elm_object_signal_emit(VIEW(it), buf, "elm");
      }
 }
 
@@ -181,22 +180,22 @@ _item_text_signals_emit(Elm_Naviframe_Item *it)
    char buf[1024];
 
    if ((it->title_label) && (it->title_label[0]))
-     edje_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
    else
-     edje_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
 
    if ((it->subtitle_label) && (it->subtitle_label[0]))
-     edje_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
    else
-     edje_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
+     elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
 
    EINA_INLIST_FOREACH(it->text_list, text_pair)
      {
-        if (edje_object_part_text_get(VIEW(it), text_pair->part))
+        if (elm_object_part_text_get(VIEW(it), text_pair->part))
           snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
         else
           snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
-        edje_object_signal_emit(VIEW(it), buf, "elm");
+        elm_object_signal_emit(VIEW(it), buf, "elm");
      }
 }
 
@@ -205,9 +204,8 @@ _access_object_get(Elm_Naviframe_Item *it, const char* part)
 {
    Evas_Object *po, *ao;
 
-   if (!edje_object_part_text_get(VIEW(it), part)) return NULL;
-
-   po = (Evas_Object *)edje_object_part_object_get(VIEW(it), part);
+   po = (Evas_Object *)edje_object_part_object_get
+          (elm_layout_edje_get(VIEW(it)), part);
    ao = evas_object_data_get(po, "_part_access_obj");
 
    return ao;
@@ -224,7 +222,7 @@ _access_focus_set(Elm_Naviframe_Item *it)
         return;
      }
 
-   ao =_access_object_get(it, "elm.text.title");
+   ao =_access_object_get(it, TITLE_ACCESS_PART);
    if (ao) elm_object_focus_set(ao, EINA_TRUE);
    else if ((it->title_icon) &&
             (elm_widget_can_focus_get(it->title_icon) ||
@@ -260,8 +258,8 @@ _item_style_set(Elm_Naviframe_Item *it,
         eina_stringshare_replace(&it->style, item_style);
      }
 
-   elm_widget_theme_object_set
-     (WIDGET(it), VIEW(it), "naviframe", buf, elm_widget_style_get(WIDGET(it)));
+   elm_layout_theme_set(VIEW(it), "naviframe", buf,
+                        elm_widget_style_get(WIDGET(it)));
 
    if (sd->freeze_events)
      evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
@@ -274,27 +272,34 @@ _item_title_visible_update(Elm_Naviframe_Item *nit)
    if (_elm_config->access_mode) _access_focus_set(nit);
 
    if (nit->title_visible)
-     edje_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
+     elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
    else
-     edje_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
-   edje_object_message_signal_process(VIEW(nit));
+     elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
 }
 
 static Eina_Bool
 _elm_naviframe_smart_theme(Evas_Object *obj)
 {
    Elm_Naviframe_Item *it;
+   const char *style, *sstyle;
 
    ELM_NAVIFRAME_DATA_GET(obj, sd);
 
-   if (!ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->theme(obj))
-     return EINA_FALSE;
+   style = elm_widget_style_get(obj);
 
    EINA_INLIST_FOREACH(sd->stack, it)
      {
-        _item_style_set(it, it->style);
-        _item_signals_emit(it);
-        _item_title_visible_update(it);
+        /* FIXME: Need to merge with opensource later. smart_theme() is called
+           multiple timese since the elm_widget.c is inefficient. If the
+           elm_widget is merged with the latest opensouce, it's ok to sync with
+           opensource here also */
+        sstyle = elm_widget_style_get(VIEW(it));
+        if ((style && sstyle) && strcmp(style, sstyle))
+          {
+             _item_style_set(it, it->style);
+             _item_signals_emit(it);
+             _item_title_visible_update(it);
+          }
      }
 
    elm_layout_sizing_eval(obj);
@@ -302,54 +307,63 @@ _elm_naviframe_smart_theme(Evas_Object *obj)
    return EINA_TRUE;
 }
 
+static char *
+_access_info_cb(void *data, Evas_Object *obj __UNUSED__)
+{
+   Evas_Object *layout;
+   Eina_Strbuf *buf;
+   const char *info;
+   char *ret;
+
+   layout = (Evas_Object *)data;
+   info = elm_object_part_text_get(layout, TITLE_PART);
+   if (!info) return NULL;
+
+   buf = eina_strbuf_new();
+   eina_strbuf_append(buf, info);
+
+   info = elm_object_part_text_get(layout, SUBTITLE_PART);
+   if (!info) goto end;
+
+   eina_strbuf_append_printf(buf, ", %s", info);
+
+end:
+   ret = eina_strbuf_string_steal(buf);
+   eina_strbuf_free(buf);
+   return ret;
+}
+
 static void
 _access_obj_process(Elm_Naviframe_Item *it, Eina_Bool is_access)
 {
-   Evas_Object *ao;
-   Elm_Naviframe_Text_Item_Pair *pair;
+   Evas_Object *ao, *eo;
 
    if (is_access)
      {
-        if (!_access_object_get(it, "elm.text.title"))
+        if (!_access_object_get(it, TITLE_ACCESS_PART))
           {
-             ao =_elm_access_edje_object_part_object_register
-                     (WIDGET(it), VIEW(it), "elm.text.title");
+             eo = elm_layout_edje_get(VIEW(it));
+             ao =_elm_access_edje_object_part_object_register(WIDGET(it), eo,
+                                                              TITLE_ACCESS_PART);
             _elm_access_text_set(_elm_access_object_get(ao),
                                 ELM_ACCESS_TYPE, E_("title"));
-         }
+            _elm_access_callback_set(_elm_access_object_get(ao),
+                                     ELM_ACCESS_INFO, _access_info_cb, VIEW(it));
 
-        if (!_access_object_get(it, "elm.text.subtitle"))
-          {
-             ao =_elm_access_edje_object_part_object_register
-                  (WIDGET(it), VIEW(it), "elm.text.subtitle");
-             _elm_access_text_set(_elm_access_object_get(ao),
-                             ELM_ACCESS_TYPE, E_("sub title"));
-          }
-
-        EINA_INLIST_FOREACH(it->text_list, pair)
-          {
-             if (!_access_object_get(it, pair->part))
-               {
-                  ao = _elm_access_edje_object_part_object_register
-                                 (WIDGET(it), VIEW(it), pair->part);
-                  _elm_access_text_set(_elm_access_object_get(ao),
-                                   ELM_ACCESS_TYPE, E_(pair->part));
-               }
-          }
+            /* to access title access object, any idea? */
+            ((Elm_Widget_Item *)it)->access_obj = ao;
+         }
      }
    else
      {
         if (it->title_label)
           _elm_access_edje_object_part_object_unregister
-                (WIDGET(it), VIEW(it), "elm.text.title");
-
-        if (it->subtitle_label)
-          _elm_access_edje_object_part_object_unregister
-             (WIDGET(it), VIEW(it), "elm.text.subtitle");
+                (WIDGET(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
 
-        EINA_INLIST_FOREACH(it->text_list, pair)
-          _elm_access_edje_object_part_object_unregister
-            (WIDGET(it), VIEW(it), pair->part);
+        /* to access title access object, any idea? */
+        ao = ((Elm_Widget_Item *)it)->access_obj;
+        if (!ao) return;
+        evas_object_del(ao);
      }
 }
 
@@ -363,31 +377,28 @@ _item_text_set_hook(Elm_Object_Item *it,
    char buf[1024];
 
    if ((!part) || (!strcmp(part, "default")) ||
-       (!strcmp(part, "elm.text.title")))
+       (!strcmp(part, TITLE_PART)))
      {
         eina_stringshare_replace(&nit->title_label, label);
-        snprintf(buf, sizeof(buf), "elm.text.title");
         if (label)
-          edje_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
+          elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
         else
-          edje_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
-        edje_object_part_text_set(VIEW(it), buf, label);
+          elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
+        elm_object_part_text_set(VIEW(it), TITLE_PART, label);
      }
    else if (!strcmp("subtitle", part))
      {
         eina_stringshare_replace(&nit->subtitle_label, label);
-        snprintf(buf, sizeof(buf), "elm.text.subtitle");
         if (label)
-          edje_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
+          elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
         else
-          edje_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
-        edje_object_part_text_set(VIEW(it), buf, label);
+          elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
+        elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
      }
    else
      {
-        snprintf(buf, sizeof(buf), "%s", part);
         EINA_INLIST_FOREACH(nit->text_list, pair)
-          if (!strcmp(buf, pair->part)) break;
+          if (!strcmp(part, pair->part)) break;
 
         if (!pair)
           {
@@ -398,7 +409,7 @@ _item_text_set_hook(Elm_Object_Item *it,
                   WIDGET(it));
                   return;
                }
-             eina_stringshare_replace(&pair->part, buf);
+             eina_stringshare_replace(&pair->part, part);
              nit->text_list = eina_inlist_append(nit->text_list,
                                                  EINA_INLIST_GET(pair));
           }
@@ -406,8 +417,8 @@ _item_text_set_hook(Elm_Object_Item *it,
           snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
         else
           snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
-        edje_object_signal_emit(VIEW(it), buf, "elm");
-        edje_object_part_text_set(VIEW(it), part, label);
+        elm_object_signal_emit(VIEW(it), buf, "elm");
+        elm_object_part_text_set(VIEW(it), part, label);
      }
 
    /* access */
@@ -424,13 +435,13 @@ _item_text_get_hook(const Elm_Object_Item *it,
    char buf[1024];
 
    if (!part || !strcmp(part, "default"))
-     snprintf(buf, sizeof(buf), "elm.text.title");
+     snprintf(buf, sizeof(buf), TITLE_PART);
    else if (!strcmp("subtitle", part))
-     snprintf(buf, sizeof(buf), "elm.text.subtitle");
+     snprintf(buf, sizeof(buf), SUBTITLE_PART);
    else
      snprintf(buf, sizeof(buf), "%s", part);
 
-   return edje_object_part_text_get(VIEW(it), buf);
+   return elm_object_part_text_get(VIEW(it), buf);
 }
 
 static Eina_Bool
@@ -442,20 +453,16 @@ _item_del_pre_hook(Elm_Object_Item *it)
    nit = (Elm_Naviframe_Item *)it;
    ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
 
-   if (it == sd->compress_it)
-     sd->compress_it = NULL;
-
    if (nit->animator) ecore_animator_del(nit->animator);
 
    top = (it == elm_naviframe_top_item_get(WIDGET(nit)));
    if (evas_object_data_get(VIEW(nit), "out_of_list"))
      goto end;
 
-   if (nit->content && !sd->on_deletion)
+   if (!sd->on_deletion)
      {
-        nit->content_unfocusable =
-          elm_widget_tree_unfocusable_get(nit->content);
-        elm_widget_tree_unfocusable_set(nit->content, EINA_TRUE);
+        nit->unfocusable = elm_widget_tree_unfocusable_get(VIEW(nit));
+        elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
      }
 
    if (sd->stack->last->prev)
@@ -477,8 +484,7 @@ _item_del_pre_hook(Elm_Object_Item *it)
         evas_object_show(VIEW(prev_it));
         evas_object_raise(VIEW(prev_it));
 
-        edje_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
-        edje_object_message_signal_process(VIEW(prev_it));
+        elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
      }
 
 end:
@@ -499,12 +505,11 @@ _item_content_set(Elm_Naviframe_Item *it,
 
    if (!content) return;
 
-   edje_object_part_swallow(VIEW(it), CONTENT_PART, content);
-   edje_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
+   elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
+   elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
 
    evas_object_event_callback_add
      (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
-   elm_widget_sub_object_add(WIDGET(it), content);
 }
 
 static void
@@ -516,8 +521,8 @@ _item_title_prev_btn_set(Elm_Naviframe_Item *it,
    it->title_prev_btn = btn;
    if (!btn) return;
 
-   edje_object_part_swallow(VIEW(it), PREV_BTN_PART, btn);
-   edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
+   elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
+   elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
    evas_object_event_callback_add
      (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
 }
@@ -531,8 +536,8 @@ _item_title_next_btn_set(Elm_Naviframe_Item *it,
    it->title_next_btn = btn;
    if (!btn) return;
 
-   edje_object_part_swallow(VIEW(it), NEXT_BTN_PART, btn);
-   edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
+   elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
+   elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
 
    evas_object_event_callback_add
      (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
@@ -547,8 +552,8 @@ _item_title_icon_set(Elm_Naviframe_Item *it,
    it->title_icon = icon;
    if (!icon) return;
 
-   edje_object_part_swallow(VIEW(it), ICON_PART, icon);
-   edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
+   elm_object_part_content_set(VIEW(it), ICON_PART, icon);
+   elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
 
    evas_object_event_callback_add
      (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
@@ -561,12 +566,12 @@ _item_content_unset(Elm_Naviframe_Item *it)
 
    if (!content) return NULL;
 
-   edje_object_part_unswallow(VIEW(it), content);
-   edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
+   elm_object_part_content_unset(VIEW(it), CONTENT_PART);
+   elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
 
    evas_object_event_callback_del
      (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
-   elm_widget_sub_object_del(WIDGET(it), content);
+
    it->content = NULL;
    return content;
 }
@@ -578,8 +583,8 @@ _item_title_prev_btn_unset(Elm_Naviframe_Item *it)
 
    if (!content) return NULL;
 
-   edje_object_part_unswallow(VIEW(it), it->title_prev_btn);
-   edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
+   elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
+   elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
 
    evas_object_event_callback_del
      (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
@@ -595,8 +600,8 @@ _item_title_next_btn_unset(Elm_Naviframe_Item *it)
 
    if (!content) return NULL;
 
-   edje_object_part_unswallow(VIEW(it), it->title_next_btn);
-   edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
+   elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
+   elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
 
    evas_object_event_callback_del
      (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
@@ -612,8 +617,8 @@ _item_title_icon_unset(Elm_Naviframe_Item *it)
 
    if (!content) return NULL;
 
-   edje_object_part_unswallow(VIEW(it), it->title_icon);
-   edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
+   elm_object_part_content_unset(VIEW(it), ICON_PART);
+   elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
 
    evas_object_event_callback_del
      (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
@@ -650,14 +655,11 @@ _title_content_set(Elm_Naviframe_Item *it,
    if (pair)
      {
         if (pair->content == content) return;
-        if (content) edje_object_part_swallow(VIEW(it), part, content);
         if (pair->content)
-          {
-             evas_object_event_callback_del(pair->content,
-                                            EVAS_CALLBACK_DEL,
-                                            _title_content_del);
-             evas_object_del(pair->content);
-          }
+          evas_object_event_callback_del(pair->content,
+                                         EVAS_CALLBACK_DEL,
+                                         _title_content_del);
+       if (content) elm_object_part_content_set(VIEW(it), part, content);
      }
    else
      {
@@ -691,15 +693,19 @@ _title_content_set(Elm_Naviframe_Item *it,
         eina_stringshare_replace(&pair->part, part);
         it->content_list = eina_inlist_append(it->content_list,
                                               EINA_INLIST_GET(pair));
-        edje_object_part_swallow(VIEW(it), part, content);
+        elm_object_part_content_set(VIEW(it), part, content);
         snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
-        edje_object_signal_emit(VIEW(it), buf, "elm");
+        elm_object_signal_emit(VIEW(it), buf, "elm");
      }
    pair->content = content;
    evas_object_event_callback_add(content,
                                   EVAS_CALLBACK_DEL,
                                   _title_content_del,
                                   pair);
+
+   /* access */
+   if (_elm_config->access_mode)
+     _access_obj_process(it, EINA_TRUE);
 }
 
 static void
@@ -745,7 +751,7 @@ _item_content_get_hook(const Elm_Object_Item *it,
      return nit->title_icon;
 
    //common parts
-   return edje_object_part_swallow_get(VIEW(nit), part);
+   return elm_object_part_content_get(VIEW(nit), part);
 }
 
 static Evas_Object *
@@ -770,9 +776,9 @@ _title_content_unset(Elm_Naviframe_Item *it, const char *part)
 
    if (!content) return NULL;
 
-   edje_object_part_unswallow(VIEW(it), content);
+   elm_object_part_content_unset(VIEW(it), part);
    snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
-   edje_object_signal_emit(VIEW(it), buf, "elm");
+   elm_object_signal_emit(VIEW(it), buf, "elm");
    evas_object_event_callback_del(content,
                                   EVAS_CALLBACK_DEL,
                                   _title_content_del);
@@ -810,7 +816,7 @@ _item_signal_emit_hook(Elm_Object_Item *it,
                        const char *emission,
                        const char *source)
 {
-   edje_object_signal_emit(VIEW(it), emission, source);
+   elm_object_signal_emit(VIEW(it), emission, source);
 }
 
 static void
@@ -829,7 +835,8 @@ _elm_naviframe_smart_sizing_eval(Evas_Object *obj)
      {
         evas_object_move(VIEW(it), x, y);
         evas_object_resize(VIEW(it), w, h);
-        edje_object_size_min_calc(VIEW(it), &it->minw, &it->minh);
+        edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
+                                  &it->minw, &it->minh);
         if (it->minw > minw) minw = it->minw;
         if (it->minh > minh) minh = it->minh;
      }
@@ -847,7 +854,7 @@ _on_item_back_btn_clicked(void *data,
       multiple times on some heavy environment. This callback del will
       prevent those scenario and guarantee only one clicked for it's own
       page. */
-   evas_object_smart_callback_del(obj, "clicked", _on_item_back_btn_clicked);
+   evas_object_smart_callback_del(obj, SIG_CLICKED, _on_item_back_btn_clicked);
    elm_naviframe_item_pop(data);
 }
 
@@ -861,7 +868,7 @@ _back_btn_new(Evas_Object *obj, const char *title_label)
 
    if (!btn) return NULL;
    evas_object_smart_callback_add
-     (btn, "clicked", _on_item_back_btn_clicked, obj);
+     (btn, SIG_CLICKED, _on_item_back_btn_clicked, obj);
    snprintf
      (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
    elm_object_style_set(btn, buf);
@@ -881,17 +888,37 @@ _back_btn_new(Evas_Object *obj, const char *title_label)
     * set an icon.
     */
    ed = elm_layout_edje_get(btn);
-   if (edje_object_part_exists(ed, "elm.swallow.content"))
+   if (edje_object_part_exists(ed, CONTENT_PART))
      {
         Evas_Object *ico = elm_icon_add(btn);
         elm_icon_standard_set(ico, "arrow_left");
-        elm_layout_content_set(btn, "elm.swallow.content", ico);
+        elm_layout_content_set(btn, CONTENT_PART, ico);
      }
 
    return btn;
 }
 
 static void
+_elm_naviframe_smart_signal_callback_add(Evas_Object *obj,
+                                  const char *emission,
+                                  const char *source,
+                                  Edje_Signal_Cb func_cb,
+                                  void *data)
+{
+   ELM_NAVIFRAME_DATA_GET(obj, sd);
+   Elm_Object_Item *it;
+
+   if (!sd->stack) return;
+
+   _elm_naviframe_parent_sc->callback_add(obj, emission, source, func_cb, data);
+
+   it = elm_naviframe_top_item_get(obj);
+   if (!it) return EINA_FALSE;
+
+   elm_object_signal_callback_add(VIEW(it), emission, source, func_cb, data);
+}
+
+static void
 _elm_naviframe_smart_signal(Evas_Object *obj,
                             const char *emission,
                             const char *source)
@@ -997,8 +1024,7 @@ _on_item_push_finished(void *data,
 
    evas_object_hide(VIEW(it));
 
-   if (it->content)
-     elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
+   elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
 
    if (sd->freeze_events)
      evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
@@ -1016,8 +1042,8 @@ _on_item_pop_finished(void *data,
 
    ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
 
-   if (sd->preserve && it->content)
-     elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
+   if (sd->preserve)
+     elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
    sd->popping = eina_list_remove(sd->popping, it);
 
    elm_widget_item_del(data);
@@ -1033,13 +1059,20 @@ _on_item_show_finished(void *data,
                        const char *source __UNUSED__)
 {
    Elm_Naviframe_Item *it = data;
+   unsigned int order = 0;
+   Evas_Object *newest;
 
    ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
 
-   edje_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
-   edje_object_message_signal_process(VIEW(it));
+   elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
+
+   elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
 
-   elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
+   newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE);
+   if (newest)
+     elm_object_focus_set(newest, EINA_TRUE);
+   else
+     elm_object_focus_set(VIEW(it), EINA_TRUE);
 
    if (sd->freeze_events)
      evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
@@ -1056,6 +1089,22 @@ _on_item_size_hints_changed(void *data,
    elm_layout_sizing_eval(data);
 }
 
+static void
+_item_dispmode_set(Elm_Naviframe_Item *it, Evas_Display_Mode dispmode)
+{
+   if (it->dispmode == dispmode) return;
+   switch (dispmode)
+     {
+      case EVAS_DISPLAY_MODE_COMPRESS:
+         elm_object_signal_emit(VIEW(it), "display,mode,compress", "");
+         break;
+      default:
+         elm_object_signal_emit(VIEW(it), "display,mode,default", "");
+         break;
+     }
+   it->dispmode = dispmode;
+}
+
 static Elm_Naviframe_Item *
 _item_new(Evas_Object *obj,
           const Elm_Naviframe_Item *prev_it,
@@ -1085,25 +1134,26 @@ _item_new(Evas_Object *obj,
    elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
 
    //item base layout
-   VIEW(it) = edje_object_add(evas_object_evas_get(obj));
+   VIEW(it) = elm_layout_add(obj);
    evas_object_smart_member_add(VIEW(it), obj);
 
    evas_object_event_callback_add
      (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
      _on_item_size_hints_changed, obj);
-   edje_object_signal_callback_add
+
+   elm_object_signal_callback_add
      (VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
-   edje_object_signal_callback_add
+   elm_object_signal_callback_add
      (VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
-   edje_object_signal_callback_add
+   elm_object_signal_callback_add
      (VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
-   edje_object_signal_callback_add
+   elm_object_signal_callback_add
      (VIEW(it), "elm,action,title,clicked", "", _on_item_title_clicked, it);
 
    _item_style_set(it, item_style);
 
    if (title_label)
-     _item_text_set_hook((Elm_Object_Item *)it, "elm.text.title", title_label);
+     _item_text_set_hook((Elm_Object_Item *)it, TITLE_PART, title_label);
 
    //title buttons
    if ((!prev_btn) && sd->auto_pushed && prev_it)
@@ -1113,12 +1163,26 @@ _item_new(Evas_Object *obj,
      }
 
    if (prev_btn)
-     _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
+     {
+        _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
+
+        if (!elm_layout_text_get(prev_btn, NULL))
+          _elm_access_text_set
+            (_elm_access_object_get(prev_btn), ELM_ACCESS_INFO, E_("Back"));
+     }
 
    if (next_btn)
-     _item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
+     {
+        _item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
+
+        if (!elm_layout_text_get(next_btn, NULL))
+          _elm_access_text_set
+            (_elm_access_object_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
+     }
 
    _item_content_set(it, content);
+   _item_dispmode_set(it, sd->dispmode);
+
    it->title_visible = EINA_TRUE;
 
    return it;
@@ -1128,28 +1192,18 @@ static void
 _on_obj_size_hints_changed(void *data __UNUSED__, Evas *e __UNUSED__,
                            Evas_Object *obj, void *event_info __UNUSED__)
 {
-   Elm_Object_Item *it;
+   Elm_Naviframe_Item *it;
    Evas_Display_Mode dispmode;
 
    ELM_NAVIFRAME_DATA_GET(obj, sd);
 
-   it = elm_naviframe_top_item_get(obj);
-   if (!it) return;
-
    dispmode = evas_object_size_hint_display_mode_get(obj);
+   if (sd->dispmode == dispmode) return;
+
    sd->dispmode = dispmode;
 
-   switch (dispmode)
-     {
-      case EVAS_DISPLAY_MODE_COMPRESS:
-        edje_object_signal_emit(VIEW(it), "display,mode,compress", "");
-        sd->compress_it = it;
-        break;
-      default:
-        if (sd->compress_it)
-          edje_object_signal_emit(VIEW(sd->compress_it), "display,mode,default", "");
-        break;
-     }
+   EINA_INLIST_FOREACH(sd->stack, it)
+     _item_dispmode_set(it, dispmode);
 }
 
 static Eina_Bool
@@ -1161,58 +1215,48 @@ _elm_naviframe_smart_focus_next(const Evas_Object *obj,
    Eina_Bool ret;
    Eina_List *l = NULL;
    Elm_Naviframe_Item *top_it;
-   Elm_Naviframe_Content_Item_Pair *content_pair = NULL;
-   Elm_Naviframe_Text_Item_Pair *text_pair = NULL;
    void *(*list_data_get)(const Eina_List *list);
 
    top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
    if (!top_it) return EINA_FALSE;
 
-   if (!top_it->title_visible)
-     {
-        return elm_widget_focus_next_get(top_it->content, dir, next);
-     }
-
    list_data_get = eina_list_data_get;
 
+   l = eina_list_append(l, VIEW(top_it));
+
    /* access */
    if (_elm_config->access_mode)
      {
-        ao = _access_object_get(top_it, "elm.text.title");
+        ao = _access_object_get(top_it, TITLE_ACCESS_PART);
         if (ao) l = eina_list_append(l, ao);
+     }
 
-        ao = _access_object_get(top_it, "elm.text.subtitle");
-        if (ao) l = eina_list_append(l, ao);
+   ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
+   eina_list_free(l);
 
+   return ret;
+}
 
-        EINA_INLIST_FOREACH(top_it->text_list, text_pair)
-          {
-             ao = _access_object_get(top_it, text_pair->part);
-             if (ao) l = eina_list_append(l, ao);
-          }
-     }
+static Eina_Bool
+_elm_naviframe_smart_focus_direction(const Evas_Object *obj,
+                                     const Evas_Object *base,
+                                     double degree,
+                                     Evas_Object **direction,
+                                     double *weight)
+{
+   Eina_Bool ret;
+   Eina_List *l = NULL;
+   Elm_Naviframe_Item *top_it;
+   void *(*list_data_get)(const Eina_List *list);
 
-   /* icon would be able to have an widget. ex: segment control */
-   if ((top_it->title_icon) &&
-       (elm_widget_can_focus_get(top_it->title_icon) ||
-        elm_widget_child_can_focus_get(top_it->title_icon)))
-     l = eina_list_append(l, top_it->title_icon);
-
-   if (top_it->title_prev_btn)
-     l = eina_list_append(l, top_it->title_prev_btn);
-   if (top_it->title_next_btn)
-     l = eina_list_append(l, top_it->title_next_btn);
-   if (top_it->content)
-     l = eina_list_append(l, top_it->content);
-   EINA_INLIST_FOREACH(top_it->content_list, content_pair)
-     {
-        if (edje_object_part_swallow_get(VIEW(top_it), content_pair->part))
-          l = eina_list_append(l, edje_object_part_swallow_get(VIEW(top_it),
-                                                               content_pair->part));
-     }
-   l = eina_list_append(l, VIEW(top_it));
+   top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
+   if (!top_it) return EINA_FALSE;
 
-   ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
+   list_data_get = eina_list_data_get;
+
+   l = eina_list_append(l, VIEW(top_it));
+   ret = elm_widget_focus_list_direction_get
+      (obj, base, l, list_data_get, degree, direction, weight);
    eina_list_free(l);
 
    return ret;
@@ -1231,7 +1275,7 @@ _elm_naviframe_smart_add(Evas_Object *obj)
 
    evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                   _on_obj_size_hints_changed, obj);
-   elm_widget_can_focus_set(obj, EINA_FALSE);
+   elm_widget_can_focus_set(obj, EINA_TRUE);
 }
 
 static Eina_Bool
@@ -1245,16 +1289,17 @@ _pop_transition_cb(void *data)
    prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it));
    if (prev_it)
      {
-        edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred", "elm");
+        elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred",
+                               "elm");
         //FIXME: Remove the below line once edje_object_message_signal_process is fixed.
         //This API crashes when in the midst of this API processing if edje object passed here is deleted.
-        //edje_object_message_signal_process(VIEW(prev_it));
+        //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
      }
-   edje_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
+   elm_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
 
    //FIXME: Remove the below line once edje_object_message_signal_process is fixed.
    //This API crashes when in the midst of this API processing if edje object passed here is deleted.
-   //edje_object_message_signal_process(VIEW(it));
+   //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
 
    return ECORE_CALLBACK_CANCEL;
 }
@@ -1263,7 +1308,6 @@ static void
 _elm_naviframe_smart_del(Evas_Object *obj)
 {
    Elm_Naviframe_Item *it;
-   Eina_List *l;
 
    ELM_NAVIFRAME_DATA_GET(obj, sd);
 
@@ -1276,7 +1320,7 @@ _elm_naviframe_smart_del(Evas_Object *obj)
      }
 
    //All popping items which are not called yet by animator.
-   EINA_LIST_FOREACH(sd->popping, l, it)
+   EINA_LIST_FREE(sd->popping, it)
      {
         if (it->animator) ecore_animator_del(it->animator);
         elm_widget_item_del(it);
@@ -1300,6 +1344,50 @@ _elm_naviframe_smart_access(Evas_Object *obj, Eina_Bool is_access)
      _access_obj_process(it, is_access);
 }
 
+static Eina_Bool
+_elm_naviframe_smart_event(Evas_Object *obj,
+                           Evas_Object *src __UNUSED__,
+                           Evas_Callback_Type type,
+                           void *event_info)
+{
+   Elm_Naviframe_Item *it;
+   Evas_Event_Key_Down *ev = event_info;
+
+   if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+   if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
+
+//Tizen Only: Need to customize the "Escape" Key
+   if (strcmp(ev->keyname, "Escape")) return EINA_FALSE;
+
+   it = elm_naviframe_top_item_get(obj);
+   if (!it) return EINA_FALSE;
+
+   if (it->title_prev_btn)
+     evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
+
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_elm_naviframe_smart_activate(Evas_Object *obj, Elm_Activate act)
+{
+   Elm_Naviframe_Item *it;
+
+   if (act != ELM_ACTIVATE_BACK) return EINA_FALSE;
+   if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+
+   it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
+   if (!it) return EINA_FALSE;
+
+   if (it->title_prev_btn)
+     evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
+
+   return EINA_TRUE;
+}
+
 static void
 _elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
 {
@@ -1308,13 +1396,17 @@ _elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
 
    ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
    ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
+   ELM_WIDGET_CLASS(sc)->focus_direction = _elm_naviframe_smart_focus_direction;
    ELM_WIDGET_CLASS(sc)->access = _elm_naviframe_smart_access;
+   ELM_WIDGET_CLASS(sc)->event = _elm_naviframe_smart_event;
+   ELM_WIDGET_CLASS(sc)->activate = _elm_naviframe_smart_activate;
 
    ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
    ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
    ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
 
    ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
+   ELM_LAYOUT_CLASS(sc)->callback_add = _elm_naviframe_smart_signal_callback_add;
    ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
    ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
    ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
@@ -1333,12 +1425,12 @@ _push_transition_cb(void *data)
      {
         prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
                                             Elm_Naviframe_Item);
-        edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
+        elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
                                 "elm");
-        edje_object_message_signal_process(VIEW(prev_it));
+        edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
      }
-   edje_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
-   edje_object_message_signal_process(VIEW(it));
+   elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
+   edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
 
    return ECORE_CALLBACK_CANCEL;
 }
@@ -1375,6 +1467,8 @@ elm_naviframe_add(Evas_Object *parent)
    if (!elm_widget_sub_object_add(parent, obj))
      ERR("could not add %p as sub object of %p", obj, parent);
 
+   _elm_widget_orient_signal_emit(obj);
+
    return obj;
 }
 
@@ -1399,6 +1493,8 @@ elm_naviframe_item_push(Evas_Object *obj,
 
    evas_object_show(VIEW(it));
    elm_widget_resize_object_set(obj, VIEW(it));
+   if (prev_it)
+     elm_widget_sub_object_add(obj, VIEW(prev_it));
    evas_object_smart_member_add(sd->dummy_edje, obj);
 
    if (prev_it)
@@ -1412,22 +1508,18 @@ elm_naviframe_item_push(Evas_Object *obj,
              evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
           }
 
-        edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
-        edje_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
+        elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
+        elm_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
+        edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
+        edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
 
-        /* animate previous */
-        edje_object_message_signal_process(VIEW(prev_it));
-        if (prev_it->content)
-          {
-             prev_it->content_unfocusable =
-               elm_widget_tree_unfocusable_get(prev_it->content);
-             elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
-          }
+        prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
+        elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
 
-        /* animate new one */
-        edje_object_message_signal_process(VIEW(it));
         it->animator = ecore_animator_add(_push_transition_cb, it);
      }
+   else
+     elm_object_focus_set(VIEW(it), EINA_TRUE);
 
    sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
    evas_object_raise(VIEW(it));
@@ -1501,9 +1593,11 @@ elm_naviframe_item_insert_after(Evas_Object *obj,
    if (top_inserted)
      {
         elm_widget_resize_object_set(obj, VIEW(it));
+        elm_widget_sub_object_add(obj, VIEW(after));
         evas_object_smart_member_add(sd->dummy_edje, obj);
         evas_object_show(VIEW(it));
         evas_object_hide(VIEW(after));
+        elm_object_focus_set(VIEW(it), EINA_TRUE);
      }
 
    /* access */
@@ -1526,16 +1620,15 @@ elm_naviframe_item_pop(Evas_Object *obj)
    it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
    if (!it) return NULL;
 
+   if (it->pop_cb) it->pop_cb(it->pop_data, (Elm_Object_Item *)it);
+
    if (sd->preserve)
      content = it->content;
 
    evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
 
-   if (it->content)
-     {
-        it->content_unfocusable = elm_widget_tree_unfocusable_get(it->content);
-        elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
-     }
+   it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(it));
+   elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
 
    if (sd->stack->last->prev)
      prev_it = EINA_INLIST_CONTAINER_GET
@@ -1560,12 +1653,12 @@ elm_naviframe_item_pop(Evas_Object *obj)
         if (_elm_config->access_mode) _access_focus_set(prev_it);
 
         /* these 2 signals MUST take place simultaneously */
-        edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
+        elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
         evas_object_show(VIEW(prev_it));
-        edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
+        elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
 
-        edje_object_message_signal_process(VIEW(it));
-        edje_object_message_signal_process(VIEW(prev_it));
+        edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
+        edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
 
         if (it->animator) ecore_animator_del(it->animator);
         it->animator = ecore_animator_add(_pop_transition_cb, it);
@@ -1617,6 +1710,7 @@ elm_naviframe_item_pop_to(Elm_Object_Item *it)
 EAPI void
 elm_naviframe_item_promote(Elm_Object_Item *it)
 {
+   Elm_Object_Item *prev_top;
    Elm_Naviframe_Item *nit;
    Elm_Naviframe_Item *prev_it;
 
@@ -1625,12 +1719,14 @@ elm_naviframe_item_promote(Elm_Object_Item *it)
    nit = (Elm_Naviframe_Item *)it;
    ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
 
-   if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
+   prev_top = elm_naviframe_top_item_get(WIDGET(nit));
+   if (it == prev_top) return;
 
    /* remember, last is 1st on the naviframe, push it to last pos. */
    sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
 
    elm_widget_resize_object_set(WIDGET(it), VIEW(nit));
+   elm_widget_sub_object_add(WIDGET(it), VIEW(prev_top));
    evas_object_smart_member_add(sd->dummy_edje, WIDGET(it));
 
    /* this was the previous top one */
@@ -1640,12 +1736,8 @@ elm_naviframe_item_promote(Elm_Object_Item *it)
    /* re-add as smart member */
    evas_object_smart_member_add(VIEW(prev_it), WIDGET(it));
 
-   if (prev_it->content)
-     {
-        prev_it->content_unfocusable =
-          elm_widget_tree_unfocusable_get(prev_it->content);
-        elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
-     }
+   prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
+   elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
 
    if (sd->freeze_events)
      {
@@ -1653,15 +1745,15 @@ elm_naviframe_item_promote(Elm_Object_Item *it)
         evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
      }
 
-   edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
+   elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
 
    evas_object_show(VIEW(nit));
    evas_object_raise(VIEW(nit));
 
-   edje_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
+   elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
 
-   edje_object_message_signal_process(VIEW(prev_it));
-   edje_object_message_signal_process(VIEW(nit));
+   edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
+   edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
    if (nit->animator) ecore_animator_del(nit->animator);
    nit->animator = ecore_animator_add(_push_transition_cb, nit);
 
@@ -1783,6 +1875,17 @@ elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
 }
 
 EAPI void
+elm_naviframe_item_pop_cb_set(Elm_Object_Item *it, Elm_Naviframe_Item_Pop_Cb func, void *data)
+{
+   Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
+
+   ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
+
+   nit->pop_cb = func;
+   nit->pop_data = data;
+}
+
+EAPI void
 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
                                        Eina_Bool auto_pushed)
 {