tizen 2.4 release
[framework/uifw/elementary.git] / src / lib / elm_panel.c
index ee0e67a..1cb6475 100644 (file)
@@ -1,27 +1,39 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
+#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
+
 #include <Elementary.h>
+
 #include "elm_priv.h"
 #include "elm_widget_panel.h"
 
-EAPI const char ELM_PANEL_SMART_NAME[] = "elm_panel";
+#include "els_box.h"
+
+#define MY_CLASS ELM_PANEL_CLASS
+
+#define MY_CLASS_NAME "Elm_Panel"
+#define MY_CLASS_NAME_LEGACY "elm_panel"
 
 static const char ACCESS_OUTLINE_PART[] = "access.outline";
 
 static const char SIG_SCROLL[] = "scroll";
 
-static const Evas_Smart_Cb_Description _smart_callbacks[] =
-{
-   {SIG_SCROLL, ""}
+static const Evas_Smart_Cb_Description _smart_callbacks[] = {
+   {SIG_SCROLL, ""},
+   {SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
+   {SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
+   {NULL, NULL}
 };
 
-static const Evas_Smart_Interface *_smart_interfaces[] =
-{
-   (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
-};
+static Eina_Bool _key_action_toggle(Evas_Object *obj, const char *params);
 
-EVAS_SMART_SUBCLASS_IFACE_NEW
-  (ELM_PANEL_SMART_NAME, _elm_panel, Elm_Panel_Smart_Class,
-   Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks,
-   _smart_interfaces);
+static const Elm_Action key_actions[] = {
+   {"toggle", _key_action_toggle},
+   {NULL, NULL}
+};
 
 static void
 _mirrored_set(Evas_Object *obj,
@@ -29,27 +41,28 @@ _mirrored_set(Evas_Object *obj,
 {
    ELM_PANEL_DATA_GET(obj, sd);
 
-   elm_widget_mirrored_set(sd->bx, rtl);
+   if ((sd->content) && (eo_isa(sd->content, ELM_WIDGET_CLASS)))
+     elm_widget_mirrored_set(sd->content, rtl);
    elm_panel_orient_set(obj, elm_panel_orient_get(obj));
 }
 
-static void
-_elm_panel_smart_sizing_eval(Evas_Object *obj)
+EOLIAN static void
+_elm_panel_elm_layout_sizing_eval(Eo *obj, Elm_Panel_Data *sd)
 {
    Evas_Coord mw = -1, mh = -1;
 
-   ELM_PANEL_DATA_GET(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
 
-   if (sd->on_deletion) return;
+   if (sd->delete_me) return;
 
    evas_object_smart_calculate(sd->bx);
-   edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &mw, &mh);
+   edje_object_size_min_calc(wd->resize_obj, &mw, &mh);
    evas_object_size_hint_min_set(obj, mw, mh);
    evas_object_size_hint_max_set(obj, -1, -1);
 }
 
 static char *
-_access_state_cb(void *data, Evas_Object *obj __UNUSED__)
+_access_state_cb(void *data, Evas_Object *obj EINA_UNUSED)
 {
    ELM_PANEL_DATA_GET(data, sd);
 
@@ -74,8 +87,8 @@ _access_object_get(const Evas_Object *obj, const char *part)
 
 static void
 _access_activate_cb(void *data,
-                    Evas_Object *part_obj __UNUSED__,
-                    Elm_Object_Item *item __UNUSED__)
+                    Evas_Object *part_obj EINA_UNUSED,
+                    Elm_Object_Item *item EINA_UNUSED)
 {
    elm_panel_hidden_set(data, EINA_TRUE);
 }
@@ -93,12 +106,12 @@ _access_obj_process(Evas_Object *obj, Eina_Bool is_access)
           {
              ao = _elm_access_edje_object_part_object_register
                 (obj, elm_layout_edje_get(sd->scr_ly), ACCESS_OUTLINE_PART);
-             _elm_access_text_set(_elm_access_object_get(ao),
-                                  ELM_ACCESS_TYPE, E_("A drawer is open"));
-             _elm_access_text_set(_elm_access_object_get(ao),
-                                  ELM_ACCESS_CONTEXT_INFO, E_("Double tap to close drawer menu"));
+             _elm_access_text_set(_elm_access_info_get(ao),
+                                  ELM_ACCESS_TYPE, E_("A panel is open"));
+             _elm_access_text_set(_elm_access_info_get(ao),
+                                  ELM_ACCESS_CONTEXT_INFO, E_("Double tap to close panel menu"));
              _elm_access_activate_callback_set
-                (_elm_access_object_get(ao), _access_activate_cb, obj);
+                (_elm_access_info_get(ao), _access_activate_cb, obj);
           }
      }
    else
@@ -112,34 +125,50 @@ static void
 _orient_set_do(Evas_Object *obj)
 {
    ELM_PANEL_DATA_GET(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
 
    switch (sd->orient)
      {
       case ELM_PANEL_ORIENT_TOP:
-        elm_layout_theme_set(obj, "panel", "top", elm_widget_style_get(obj));
+        if (!elm_layout_theme_set
+              (obj, "panel", "top", elm_widget_style_get(obj)))
+          ERR("Failed to set layout!");
         break;
 
       case ELM_PANEL_ORIENT_BOTTOM:
-        elm_layout_theme_set
-          (obj, "panel", "bottom", elm_widget_style_get(obj));
+        if (!elm_layout_theme_set
+              (obj, "panel", "bottom", elm_widget_style_get(obj)))
+          ERR("Failed to set layout!");
         break;
 
       case ELM_PANEL_ORIENT_LEFT:
         if (!elm_widget_mirrored_get(obj))
-          elm_layout_theme_set
-            (obj, "panel", "left", elm_widget_style_get(obj));
+          {
+             if (!elm_layout_theme_set
+                   (obj, "panel", "left", elm_widget_style_get(obj)))
+               ERR("Failed to set layout!");
+          }
         else
-          elm_layout_theme_set
-            (obj, "panel", "right", elm_widget_style_get(obj));
+          {
+             if (!elm_layout_theme_set
+                   (obj, "panel", "right", elm_widget_style_get(obj)))
+               ERR("Failed to set layout!");
+          }
         break;
 
       case ELM_PANEL_ORIENT_RIGHT:
         if (!elm_widget_mirrored_get(obj))
-          elm_layout_theme_set
-            (obj, "panel", "right", elm_widget_style_get(obj));
+          {
+             if (!elm_layout_theme_set
+                   (obj, "panel", "right", elm_widget_style_get(obj)))
+               ERR("Failed to set layout!");
+          }
         else
-          elm_layout_theme_set
-            (obj, "panel", "left", elm_widget_style_get(obj));
+          {
+             if (!elm_layout_theme_set
+                   (obj, "panel", "left", elm_widget_style_get(obj)))
+               ERR("Failed to set layout!");
+          }
         break;
      }
 
@@ -148,38 +177,38 @@ _orient_set_do(Evas_Object *obj)
      {
         Evas_Object *ao;
         ao = _elm_access_edje_object_part_object_register
-               (obj, ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
-        _elm_access_text_set(_elm_access_object_get(ao),
+            (obj, wd->resize_obj, "btn_icon");
+        _elm_access_text_set(_elm_access_info_get(ao),
                              ELM_ACCESS_TYPE, E_("panel button"));
         _elm_access_callback_set
-          (_elm_access_object_get(ao), ELM_ACCESS_STATE, _access_state_cb, obj);
+          (_elm_access_info_get(ao), ELM_ACCESS_STATE, _access_state_cb, obj);
      }
 }
 
 static void
-_scrollable_layout_theme_set(Evas_Object *obj, Elm_Panel_Smart_Data *sd)
+_scrollable_layout_theme_set(Eo *obj, Elm_Panel_Data *sd)
 {
    switch (sd->orient)
      {
       case ELM_PANEL_ORIENT_TOP:
          if (!elm_layout_theme_set(sd->scr_ly, "scroller", "panel/top",
                                    elm_widget_style_get(obj)))
-           CRITICAL("Failed to set layout!");
+           ERR("Failed to set layout!");
          break;
       case ELM_PANEL_ORIENT_BOTTOM:
          if (!elm_layout_theme_set(sd->scr_ly, "scroller", "panel/bottom",
                                    elm_widget_style_get(obj)))
-           CRITICAL("Failed to set layout!");
+           ERR("Failed to set layout!");
          break;
       case ELM_PANEL_ORIENT_LEFT:
          if (!elm_layout_theme_set(sd->scr_ly, "scroller", "panel/left",
                                    elm_widget_style_get(obj)))
-           CRITICAL("Failed to set layout!");
+           ERR("Failed to set layout!");
          break;
       case ELM_PANEL_ORIENT_RIGHT:
          if (!elm_layout_theme_set(sd->scr_ly, "scroller", "panel/right",
                                    elm_widget_style_get(obj)))
-           CRITICAL("Failed to set layout!");
+           ERR("Failed to set layout!");
          break;
      }
 
@@ -188,15 +217,18 @@ _scrollable_layout_theme_set(Evas_Object *obj, Elm_Panel_Smart_Data *sd)
      _access_obj_process(obj, EINA_TRUE);
 }
 
-static Eina_Bool
-_elm_panel_smart_theme(Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_panel_elm_widget_theme_apply(Eo *obj, Elm_Panel_Data *sd)
 {
    const char *str;
+   Evas_Coord minw = 0, minh = 0;
 
-   ELM_PANEL_DATA_GET(obj, sd);
+   Eina_Bool int_ret = EINA_FALSE;
 
-   if (!ELM_WIDGET_CLASS(_elm_panel_parent_sc)->theme(obj))
-     return EINA_FALSE;
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
+   if (!int_ret) return EINA_FALSE;
 
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
 
@@ -209,18 +241,26 @@ _elm_panel_smart_theme(Evas_Object *obj)
 
         handler_size = edje_object_data_get(sd->scr_edje, "handler_size");
         if (handler_size)
-          sd->handler_size = (Evas_Coord) (elm_object_scale_get(obj)) * (atoi(handler_size));
+          sd->handler_size = (int) (elm_object_scale_get(obj)) * (atoi(handler_size));
      }
    else
      {
         str = edje_object_data_get
-           (ELM_WIDGET_DATA(sd)->resize_obj, "focus_highlight");
+           (wd->resize_obj, "focus_highlight");
         if ((str) && (!strcmp(str, "on")))
           elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
         else
           elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
 
         _orient_set_do(obj);
+
+        evas_object_hide(sd->event);
+        elm_coords_finger_size_adjust(1, &minw, 1, &minh);
+        evas_object_size_hint_min_set(sd->event, minw, minh);
+
+        if (edje_object_part_exists
+            (wd->resize_obj, "elm.swallow.event"))
+          eo_do_super(obj, MY_CLASS, elm_obj_container_content_set("elm.swallow.event", sd->event));
      }
 
    elm_layout_sizing_eval(obj);
@@ -228,19 +268,22 @@ _elm_panel_smart_theme(Evas_Object *obj)
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_elm_panel_smart_focus_next(const Evas_Object *obj,
-                            Elm_Focus_Direction dir,
-                            Evas_Object **next)
+EOLIAN static Eina_Bool
+_elm_panel_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Panel_Data *_pd EINA_UNUSED)
+{
+   return EINA_TRUE;
+}
+
+EOLIAN static Eina_Bool
+_elm_panel_elm_widget_focus_next(Eo *obj, Elm_Panel_Data *sd, Elm_Focus_Direction dir, Evas_Object **next)
 {
    Evas_Object *cur;
    Eina_List *items = NULL;
    Eina_Bool ret = EINA_FALSE;
 
-   ELM_PANEL_DATA_GET(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
 
-   if (!sd->content)
-     return EINA_FALSE;
+   if (!sd->content) return EINA_FALSE;
 
    if (sd->scrollable)
      {
@@ -265,17 +308,16 @@ _elm_panel_smart_focus_next(const Evas_Object *obj,
    cur = sd->content;
 
    /* Try to Focus cycle in subitem */
-   if (!sd->hidden)
-     return elm_widget_focus_next_get(cur, dir, next);
+   if (!sd->hidden) return elm_widget_focus_next_get(cur, dir, next);
 
    /* access */
    if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
      {
         Evas_Object *ao, *po;
         po = (Evas_Object *)edje_object_part_object_get
-               (ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
+               (wd->resize_obj, "btn_icon");
         ao = evas_object_data_get(po, "_part_access_obj");
-        _elm_access_highlight_set(ao, EINA_FALSE);
+        _elm_access_highlight_set(ao);
      }
 
    /* Return */
@@ -286,7 +328,7 @@ _elm_panel_smart_focus_next(const Evas_Object *obj,
 static void
 _box_layout_cb(Evas_Object *o,
                Evas_Object_Box_Data *priv,
-               void *data __UNUSED__)
+               void *data EINA_UNUSED)
 {
    _els_box_layout(o, priv, EINA_TRUE, EINA_FALSE, EINA_FALSE);
 }
@@ -301,20 +343,20 @@ _handler_open(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
    switch (sd->orient)
      {
       case ELM_PANEL_ORIENT_TOP:
-         sd->s_iface->region_bring_in
-            (obj, 0, (h * sd->content_size_ratio) - sd->handler_size, w, h);
+         eo_do(obj, elm_interface_scrollable_region_bring_in
+               (0, (h * sd->content_size_ratio) - sd->handler_size, w, h));
          break;
       case ELM_PANEL_ORIENT_BOTTOM:
-         sd->s_iface->region_bring_in
-            (obj, 0, sd->handler_size, w, h);
+         eo_do(obj, elm_interface_scrollable_region_bring_in
+               (0, sd->handler_size, w, h));
          break;
       case ELM_PANEL_ORIENT_LEFT:
-         sd->s_iface->region_bring_in
-            (obj, (w * sd->content_size_ratio) - sd->handler_size, 0, w, h);
+         eo_do(obj, elm_interface_scrollable_region_bring_in
+               ((w * sd->content_size_ratio) - sd->handler_size, 0, w, h));
          break;
       case ELM_PANEL_ORIENT_RIGHT:
-         sd->s_iface->region_bring_in
-            (obj, sd->handler_size, 0, w, h);
+         eo_do(obj, elm_interface_scrollable_region_bring_in
+               (sd->handler_size, 0, w, h));
          break;
      }
 }
@@ -323,14 +365,14 @@ static void
 _drawer_open(Evas_Object *obj, Evas_Coord w, Evas_Coord h, Eina_Bool anim)
 {
    ELM_PANEL_DATA_GET(obj, sd);
-   Evas_Coord x = 0, y = 0;
+   int x = 0, y = 0;
 
    if (sd->freeze)
      {
-        sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+        eo_do(obj, elm_interface_scrollable_movement_block_set
+                               (ELM_SCROLLER_MOVEMENT_NO_BLOCK));
         sd->freeze = EINA_FALSE;
         elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-        elm_object_signal_emit(obj, "elm,state,unhold", "elm");
      }
 
    switch (sd->orient)
@@ -348,15 +390,19 @@ _drawer_open(Evas_Object *obj, Evas_Coord w, Evas_Coord h, Eina_Bool anim)
          break;
      }
 
-   if (anim) sd->s_iface->region_bring_in(obj, x, y, w, h);
-   else sd->s_iface->content_region_show(obj, x, y, w, h);
+   if (anim)
+     eo_do(obj, elm_interface_scrollable_region_bring_in
+           (x, y, w, h));
+   else
+     eo_do(obj, elm_interface_scrollable_content_region_show
+           (x, y, w, h));
 }
 
 static void
 _drawer_close(Evas_Object *obj, Evas_Coord w, Evas_Coord h, Eina_Bool anim)
 {
    ELM_PANEL_DATA_GET(obj, sd);
-   Evas_Coord x = 0, y = 0;
+   int x = 0, y = 0;
    Eina_Bool horizontal = EINA_FALSE;
 
    switch (sd->orient)
@@ -381,38 +427,39 @@ _drawer_close(Evas_Object *obj, Evas_Coord w, Evas_Coord h, Eina_Bool anim)
      {
         if (sd->freeze)
           {
-             sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+             eo_do(obj, elm_interface_scrollable_movement_block_set
+                   (ELM_SCROLLER_MOVEMENT_NO_BLOCK));
              sd->freeze = EINA_FALSE;
              elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-             elm_object_signal_emit(obj, "elm,state,unhold", "elm");
           }
-        sd->s_iface->region_bring_in(obj, x, y, w, h);
+        eo_do(obj, elm_interface_scrollable_region_bring_in(x, y, w, h));
      }
    else
      {
-        sd->s_iface->content_region_show(obj, x, y, w, h);
+        eo_do(obj, elm_interface_scrollable_content_region_show(x, y, w, h));
         if (!sd->freeze)
           {
              if (horizontal)
-               sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
+               eo_do(obj, elm_interface_scrollable_movement_block_set
+                     (ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL));
              else
-               sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
+               eo_do(obj, elm_interface_scrollable_movement_block_set
+                     (ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL));
              sd->freeze = EINA_TRUE;
              elm_layout_signal_emit(sd->scr_ly, "elm,state,content,hidden", "elm");
-             elm_object_signal_emit(obj, "elm,state,hold", "elm");
           }
      }
 }
 
 static void
-_panel_toggle(void *data __UNUSED__,
+_panel_toggle(void *data EINA_UNUSED,
               Evas_Object *obj,
-              const char *emission __UNUSED__,
-              const char *source __UNUSED__)
+              const char *emission EINA_UNUSED,
+              const char *source EINA_UNUSED)
 {
    ELM_PANEL_DATA_GET(obj, sd);
-
-   Evas_Coord w, h;
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+   int w, h;
 
    if (sd->scrollable)
      {
@@ -423,13 +470,11 @@ _panel_toggle(void *data __UNUSED__,
           {
              sd->hidden = EINA_FALSE;
              _drawer_open(obj, w, h, EINA_TRUE);
-             elm_object_signal_emit(obj, "elm,state,active", "elm");
           }
         else
           {
              sd->hidden = EINA_TRUE;
              _drawer_close(obj, w, h, EINA_TRUE);
-             elm_object_signal_emit(obj, "elm,state,inactive", "elm");
           }
      }
    else
@@ -445,14 +490,14 @@ _panel_toggle(void *data __UNUSED__,
              elm_layout_signal_emit(obj, "elm,action,hide", "elm");
              sd->hidden = EINA_TRUE;
              evas_object_repeat_events_set(obj, EINA_TRUE);
-             if (elm_widget_focus_get(sd->content))
+             if (sd->content && elm_widget_focus_get(sd->content))
                {
                   elm_widget_focused_object_clear(obj);
                   elm_widget_focus_steal(obj);
                }
           }
 
-        edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
+        edje_object_message_signal_process(wd->resize_obj);
      }
 }
 
@@ -469,7 +514,7 @@ _state_sync(Evas_Object *obj)
      {
       case ELM_PANEL_ORIENT_TOP:
          panel_size = h * sd->content_size_ratio;
-         sd->s_iface->content_pos_get(obj, NULL, &pos);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(NULL, &pos));
 
          if (pos == 0) open = EINA_TRUE;
          else if (pos == panel_size) open = EINA_FALSE;
@@ -478,7 +523,7 @@ _state_sync(Evas_Object *obj)
 
       case ELM_PANEL_ORIENT_BOTTOM:
          panel_size = h * sd->content_size_ratio;
-         sd->s_iface->content_pos_get(obj, NULL, &pos);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(NULL, &pos));
 
          if (pos == panel_size) open = EINA_TRUE;
          else if (pos == 0) open = EINA_FALSE;
@@ -487,7 +532,7 @@ _state_sync(Evas_Object *obj)
 
       case ELM_PANEL_ORIENT_LEFT:
          panel_size = w * sd->content_size_ratio;
-         sd->s_iface->content_pos_get(obj, &pos, NULL);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(&pos, NULL));
          horizontal = EINA_TRUE;
 
          if (pos == 0) open = EINA_TRUE;
@@ -497,7 +542,7 @@ _state_sync(Evas_Object *obj)
 
       case ELM_PANEL_ORIENT_RIGHT:
          panel_size = w * sd->content_size_ratio;
-         sd->s_iface->content_pos_get(obj, &pos, NULL);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(&pos, NULL));
          horizontal = EINA_TRUE;
 
          if (pos == panel_size) open = EINA_TRUE;
@@ -508,12 +553,9 @@ _state_sync(Evas_Object *obj)
 
    if (open)
      {
-        if (sd->hidden)
-          {
-             sd->hidden = EINA_FALSE;
-             elm_object_signal_emit(obj, "elm,state,active", "elm");
-          }
-        sd->s_iface->single_direction_set(obj, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
+        if (sd->hidden) sd->hidden = EINA_FALSE;
+        eo_do(obj, elm_interface_scrollable_single_direction_set
+              (ELM_SCROLLER_SINGLE_DIRECTION_HARD));
 
         //focus & access
         elm_object_tree_focus_allow_set(obj, EINA_TRUE);
@@ -521,27 +563,26 @@ _state_sync(Evas_Object *obj)
           {
              ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
              evas_object_show(ao);
-             _elm_access_highlight_set(ao, EINA_FALSE);
+             _elm_access_highlight_set(ao);
           }
         else
           elm_object_focus_set(obj, EINA_TRUE);
      }
    else
      {
-        if (!sd->hidden)
-          {
-             sd->hidden = EINA_TRUE;
-             elm_object_signal_emit(obj, "elm,state,inactive", "elm");
-          }
+        if (!sd->hidden) sd->hidden = EINA_TRUE;
+
         if (horizontal)
-          sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
+          eo_do(obj, elm_interface_scrollable_movement_block_set
+                (ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL));
         else
-          sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
+          eo_do(obj, elm_interface_scrollable_movement_block_set
+                (ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL));
         sd->freeze = EINA_TRUE;
         elm_layout_signal_emit(sd->scr_ly, "elm,state,content,hidden", "elm");
-        elm_object_signal_emit(obj, "elm,state,hold", "elm");
 
-        sd->s_iface->single_direction_set(obj, ELM_SCROLLER_SINGLE_DIRECTION_NONE);
+        eo_do(obj, elm_interface_scrollable_single_direction_set
+              (ELM_SCROLLER_SINGLE_DIRECTION_NONE));
 
         //focus & access
         elm_object_tree_focus_allow_set(obj, EINA_FALSE);
@@ -566,10 +607,10 @@ _timer_cb(void *data)
 
    if (sd->freeze)
      {
-        sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+        eo_do(obj, elm_interface_scrollable_movement_block_set
+              (ELM_SCROLLER_MOVEMENT_NO_BLOCK));
         sd->freeze = EINA_FALSE;
         elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-        elm_object_signal_emit(obj, "elm,state,unhold", "elm");
         evas_object_geometry_get(obj, NULL, NULL, &w, &h);
         _handler_open(obj, w, h);
      }
@@ -588,8 +629,8 @@ _event_mouse_up(void *data,
    Evas_Coord x, y, up_x, up_y, minw = 0, minh = 0;
    evas_object_geometry_get(data, &x, &y, NULL, NULL);
 
-   up_x = ev->output.x - x;
-   up_y = ev->output.y - y;
+   up_x = ev->canvas.x - x;
+   up_y = ev->canvas.y - y;
 
    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
 
@@ -603,51 +644,45 @@ _on_mouse_down(void *data,
                Evas_Object *obj,
                void *event_info)
 {
-   Elm_Panel_Smart_Data *sd = data;
+   Elm_Panel_Data *sd = data;
    Evas_Event_Mouse_Down *ev = event_info;
    Evas_Coord finger_size = elm_config_finger_size_get();
    Evas_Coord x, y, w, h;
    evas_object_geometry_get(obj, &x, &y, &w, &h);
-   const char *timer_duration;
-   double timer_duration_num;
 
-   sd->down_x = ev->output.x - x;
-   sd->down_y = ev->output.y - y;
+   sd->down_x = ev->canvas.x - x;
+   sd->down_y = ev->canvas.y - y;
 
    // if freeze state & mouse down on the edge
    // then set timer for un-freeze
-   timer_duration = edje_object_data_get(sd->scr_edje, "timer_duration");
-   if (timer_duration) timer_duration_num = atof(timer_duration);
-   else timer_duration_num = 0.2;
-
    switch (sd->orient)
      {
       case ELM_PANEL_ORIENT_TOP:
          if ((sd->freeze) && (sd->down_y >= 0) && (sd->down_y < finger_size))
            {
-              if (sd->timer) ecore_timer_del(sd->timer);
-              sd->timer = ecore_timer_add(timer_duration_num, _timer_cb, obj);
+              ecore_timer_del(sd->timer);
+              sd->timer = ecore_timer_add(0.2, _timer_cb, obj);
            }
          break;
       case ELM_PANEL_ORIENT_BOTTOM:
          if ((sd->freeze) && (sd->down_y <= h) && (sd->down_y > (h - finger_size)))
            {
-              if (sd->timer) ecore_timer_del(sd->timer);
-              sd->timer = ecore_timer_add(timer_duration_num, _timer_cb, obj);
+              ecore_timer_del(sd->timer);
+              sd->timer = ecore_timer_add(0.2, _timer_cb, obj);
            }
          break;
       case ELM_PANEL_ORIENT_LEFT:
          if ((sd->freeze) && (sd->down_x >= 0) && (sd->down_x < finger_size))
            {
-              if (sd->timer) ecore_timer_del(sd->timer);
-              sd->timer = ecore_timer_add(timer_duration_num, _timer_cb, obj);
+              ecore_timer_del(sd->timer);
+              sd->timer = ecore_timer_add(0.2, _timer_cb, obj);
            }
          break;
       case ELM_PANEL_ORIENT_RIGHT:
          if ((sd->freeze) && (sd->down_x <= w) && (sd->down_x > (w - finger_size)))
            {
-              if (sd->timer) ecore_timer_del(sd->timer);
-              sd->timer = ecore_timer_add(timer_duration_num, _timer_cb, obj);
+              ecore_timer_del(sd->timer);
+              sd->timer = ecore_timer_add(0.2, _timer_cb, obj);
            }
          break;
      }
@@ -659,7 +694,7 @@ _on_mouse_move(void *data,
                Evas_Object *obj,
                void *event_info)
 {
-   Elm_Panel_Smart_Data *sd = data;
+   Elm_Panel_Data *sd = data;
    Evas_Event_Mouse_Move *ev = event_info;
    Evas_Coord x, y, w, h, cur_x, cur_y, finger_size;
    evas_object_geometry_get(obj, &x, &y, &w, &h);
@@ -676,37 +711,33 @@ _on_mouse_move(void *data,
       case ELM_PANEL_ORIENT_TOP:
          if (sd->timer && ((cur_y - sd->down_y) > finger_size))
            {
-              sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+              eo_do(obj, elm_interface_scrollable_freeze_set(EINA_FALSE));
               sd->freeze = EINA_FALSE;
               elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-              elm_object_signal_emit(obj, "elm,state,unhold", "elm");
            }
          break;
       case ELM_PANEL_ORIENT_BOTTOM:
          if (sd->timer && ((sd->down_y - cur_y) > finger_size))
            {
-              sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+              eo_do(obj, elm_interface_scrollable_freeze_set(EINA_FALSE));
               sd->freeze = EINA_FALSE;
               elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-              elm_object_signal_emit(obj, "elm,state,unhold", "elm");
            }
          break;
       case ELM_PANEL_ORIENT_LEFT:
          if (sd->timer && ((cur_x - sd->down_x) > finger_size))
            {
-              sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+              eo_do(obj, elm_interface_scrollable_freeze_set(EINA_FALSE));
               sd->freeze = EINA_FALSE;
               elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-              elm_object_signal_emit(obj, "elm,state,unhold", "elm");
            }
          break;
       case ELM_PANEL_ORIENT_RIGHT:
          if (sd->timer && ((sd->down_x - cur_x) > finger_size))
            {
-              sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+              eo_do(obj, elm_interface_scrollable_freeze_set(EINA_FALSE));
               sd->freeze = EINA_FALSE;
               elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-              elm_object_signal_emit(obj, "elm,state,unhold", "elm");
            }
          break;
      }
@@ -721,7 +752,7 @@ _on_mouse_up(void *data,
              Evas_Object *obj,
              void *event_info)
 {
-   Elm_Panel_Smart_Data *sd = data;
+   Elm_Panel_Data *sd = data;
    Evas_Event_Mouse_Up *ev = event_info;
    Evas_Coord panel_size, threshold, pos, w, h;
 
@@ -736,7 +767,7 @@ _on_mouse_up(void *data,
       case ELM_PANEL_ORIENT_TOP:
          panel_size = h * sd->content_size_ratio;
          threshold = panel_size / 4;
-         sd->s_iface->content_pos_get(obj, NULL, &pos);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(NULL, &pos));
 
          if (sd->hidden)
            {
@@ -753,7 +784,7 @@ _on_mouse_up(void *data,
       case ELM_PANEL_ORIENT_BOTTOM:
          panel_size = h * sd->content_size_ratio;
          threshold = panel_size / 4;
-         sd->s_iface->content_pos_get(obj, NULL, &pos);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(NULL, &pos));
 
          if (sd->hidden)
            {
@@ -770,7 +801,7 @@ _on_mouse_up(void *data,
       case ELM_PANEL_ORIENT_LEFT:
          panel_size = w * sd->content_size_ratio;
          threshold = panel_size / 4;
-         sd->s_iface->content_pos_get(obj, &pos, NULL);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(&pos, NULL));
 
          if (sd->hidden)
            {
@@ -787,7 +818,7 @@ _on_mouse_up(void *data,
       case ELM_PANEL_ORIENT_RIGHT:
          panel_size = w * sd->content_size_ratio;
          threshold = panel_size / 4;
-         sd->s_iface->content_pos_get(obj, &pos, NULL);
+         eo_do(obj, elm_interface_scrollable_content_pos_get(&pos, NULL));
 
          if (sd->hidden)
            {
@@ -807,43 +838,45 @@ _on_mouse_up(void *data,
 }
 
 static Eina_Bool
-_elm_panel_smart_event(Evas_Object *obj,
-                       Evas_Object *src,
-                       Evas_Callback_Type type,
-                       void *event_info)
+_key_action_toggle(Evas_Object *obj, const char *params EINA_UNUSED)
 {
-   // TIZEN ONLY (2013.11.27): when panel is scrollable, ignore smart event
-   ELM_PANEL_DATA_GET(obj, sd);
-   if (sd->scrollable) return EINA_FALSE;
-   // TIZEN ONLY
+   _panel_toggle(NULL, obj, NULL, NULL);
+   return EINA_TRUE;
+}
 
+EOLIAN static Eina_Bool
+_elm_panel_elm_widget_event(Eo *obj, Elm_Panel_Data *_pd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info)
+{
    Evas_Event_Key_Down *ev = event_info;
-
-   if (elm_widget_disabled_get(obj)) return EINA_FALSE;
-   if ((src != obj) || (type != EVAS_CALLBACK_KEY_DOWN)) return EINA_FALSE;
+   if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
+   if (src != obj) return EINA_FALSE;
 
-   if ((strcmp(ev->keyname, "Return")) &&
-       (strcmp(ev->keyname, "KP_Enter")) &&
-       (strcmp(ev->keyname, "space")))
-     return EINA_FALSE;
-
-   _panel_toggle(NULL, obj, NULL, NULL);
+   if (!_elm_config_key_binding_call(obj, ev, key_actions)) return EINA_FALSE;
 
    ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_elm_panel_smart_content_set(Evas_Object *obj,
-                             const char *part,
-                             Evas_Object *content)
+EOLIAN static Eina_Bool
+_elm_panel_elm_container_content_set(Eo *obj, Elm_Panel_Data *sd, const char *part, Evas_Object *content)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   if (part && strcmp(part, "default"))
-     return ELM_CONTAINER_CLASS(_elm_panel_parent_sc)->content_set
-              (obj, part, content);
+   if (part)
+     {
+        // "elm.swallow.event" part is used for internal needs and should not be changed.
+        if (!strcmp(part, "elm.swallow.event"))
+          {
+             ERR("elm.swallow.event is being used for panel internally. Don't touch this part!");
+             return EINA_FALSE;
+          }
+        if (strcmp(part, "default"))
+          {
+             Eina_Bool int_ret = EINA_TRUE;
+             eo_do_super(obj, MY_CLASS,
+                         int_ret = elm_obj_container_content_set(part, content));
+             return int_ret;
+          }
+     }
 
    if (sd->content == content) return EINA_TRUE;
    if (sd->content)
@@ -860,92 +893,149 @@ _elm_panel_smart_content_set(Evas_Object *obj,
    return EINA_TRUE;
 }
 
-static Evas_Object *
-_elm_panel_smart_content_get(const Evas_Object *obj,
-                             const char *part)
+EOLIAN static Evas_Object*
+_elm_panel_elm_container_content_get(Eo *obj, Elm_Panel_Data *sd, const char *part)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   if (part && strcmp(part, "default"))
-     return ELM_CONTAINER_CLASS(_elm_panel_parent_sc)->content_get(obj, part);
+   if (part)
+     {
+        // "elm.swallow.event" part is used for internal needs and should not be changed.
+        if (!strcmp(part, "elm.swallow.event"))
+          {
+             ERR("elm.swallow.event is being used for panel internally. Don't touch this part!");
+             return NULL;
+          }
+        if (strcmp(part, "default"))
+          {
+             Evas_Object *ret = NULL;
+             eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_get(part));
+             return ret;
+          }
+     }
 
    return sd->content;
 }
 
-static Evas_Object *
-_elm_panel_smart_content_unset(Evas_Object *obj,
-                               const char *part)
+EOLIAN static Evas_Object*
+_elm_panel_elm_container_content_unset(Eo *obj, Elm_Panel_Data *sd, const char *part)
 {
-   Evas_Object *content;
-
-   ELM_PANEL_DATA_GET(obj, sd);
+   Evas_Object *ret = NULL;
 
-   if (part && strcmp(part, "default"))
-     return ELM_CONTAINER_CLASS
-              (_elm_panel_parent_sc)->content_unset(obj, part);
+   if (part)
+     {
+        // "elm.swallow.event" part is used for internal needs and should not be changed.
+        if (!strcmp(part, "elm.swallow.event"))
+          {
+             ERR("elm.swallow.event is being used for panel internally. Don't touch this part!");
+             return NULL;
+          }
+        if (strcmp(part, "default"))
+          {
+             eo_do_super(obj, MY_CLASS,
+                         ret = elm_obj_container_content_unset(part));
+             return ret;
+          }
+     }
 
    if (!sd->content) return NULL;
-   content = sd->content;
+   ret = sd->content;
 
    evas_object_box_remove_all(sd->bx, EINA_FALSE);
    sd->content = NULL;
 
-   return content;
+   return ret;
 }
 
-static void
-_elm_panel_smart_add(Evas_Object *obj)
+EOLIAN static void
+_elm_panel_evas_object_smart_add(Eo *obj, Elm_Panel_Data *priv)
 {
-   EVAS_SMART_DATA_ALLOC(obj, Elm_Panel_Smart_Data);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
+   elm_widget_sub_object_parent_add(obj);
+   elm_widget_can_focus_set(obj, EINA_TRUE);
+
+   priv->panel_edje = wd->resize_obj;
+
+   eo_do(obj, elm_obj_widget_theme_apply());
 
-   ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.add(obj);
+   priv->bx = evas_object_box_add(evas_object_evas_get(obj));
+   evas_object_box_layout_set(priv->bx, _box_layout_cb, priv, NULL);
+   evas_object_show(priv->bx);
+
+   elm_layout_signal_callback_add
+     (obj, "elm,action,panel,toggle", "*", _panel_toggle, obj);
+
+   _mirrored_set(obj, elm_widget_mirrored_get(obj));
+
+   priv->event = evas_object_rectangle_add(evas_object_evas_get(obj));
+   evas_object_color_set(priv->event, 0, 0, 0, 0);
+   evas_object_pass_events_set(priv->event, EINA_TRUE);
+   elm_widget_sub_object_add(obj, priv->event);
+
+   /* just to bootstrap and have theme hook to work */
+   if (!elm_layout_theme_set(obj, "panel", "top", elm_widget_style_get(obj)))
+     ERR("Failed to set layout!");
+   else
+     {
+        elm_layout_content_set(obj, "elm.swallow.content", priv->bx);
+
+        if (edje_object_part_exists
+            (wd->resize_obj, "elm.swallow.event"))
+          {
+             Evas_Coord minw = 0, minh = 0;
+
+             elm_coords_finger_size_adjust(1, &minw, 1, &minh);
+             evas_object_size_hint_min_set(priv->event, minw, minh);
+             eo_do_super(obj, MY_CLASS, elm_obj_container_content_set("elm.swallow.event", priv->event));
+          }
+     }
+
+   elm_layout_sizing_eval(obj);
 }
 
-static void
-_elm_panel_smart_del(Evas_Object *obj)
+EOLIAN static void
+_elm_panel_evas_object_smart_del(Eo *obj, Elm_Panel_Data *sd)
 {
    Evas_Object *child;
    Eina_List *l;
 
-   ELM_PANEL_DATA_GET(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
 
-   sd->on_deletion = EINA_TRUE;
+   sd->delete_me = EINA_TRUE;
 
    ELM_SAFE_FREE(sd->timer, ecore_timer_del);
-   ELM_SAFE_FREE(sd->animator, ecore_animator_del);
 
-   /* let's make our box object the *last* to be processed, since it
+   /* let's make our panel object the *last* to be processed, since it
     * may (smart) parent other sub objects here */
-   EINA_LIST_FOREACH(ELM_WIDGET_DATA(sd)->subobjs, l, child)
+   EINA_LIST_FOREACH(wd->subobjs, l, child)
      {
         if (child == sd->bx)
           {
-             ELM_WIDGET_DATA(sd)->subobjs =
-               eina_list_demote_list(ELM_WIDGET_DATA(sd)->subobjs, l);
+             wd->subobjs =
+               eina_list_demote_list(wd->subobjs, l);
              break;
           }
      }
 
-   ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.del(obj);
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
 }
 
-static void
-_elm_panel_smart_orientation_set(Evas_Object *obj, int rotation)
+// TIZEN_ONLY(20150128): Panel implementation merge into 2.4
+EOLIAN static void
+_elm_panel_elm_widget_orientation_set(Eo *obj, Elm_Panel_Data *sd EINA_UNUSED, int orient_mode)
 {
-    ELM_PANEL_DATA_GET(obj, sd);
-
-    if(rotation == 90 || rotation == 270)
-      sd->content_size_ratio = 0.45;
-    else
-      sd->content_size_ratio = 0.80;
+   eo_do_super(obj, MY_CLASS, elm_obj_widget_orientation_set(orient_mode));
+   if (orient_mode == 90 || orient_mode == 270)
+     elm_panel_scrollable_content_size_set(obj, 0.45);
+   else
+     elm_panel_scrollable_content_size_set(obj, 0.80);
 }
+////////////////////////////////////////////////////////////
 
-static void
-_elm_panel_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+EOLIAN static void
+_elm_panel_evas_object_smart_move(Eo *obj, Elm_Panel_Data *sd, Evas_Coord x, Evas_Coord y)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.move(obj, x, y);
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_move(x, y));
 
    evas_object_move(sd->hit_rect, x, y);
 }
@@ -962,20 +1052,18 @@ _elm_panel_anim_cb(void *data)
    if (sd->hidden) _drawer_close(obj, w, h, EINA_FALSE);
    else _drawer_open(obj, w, h, EINA_FALSE);
 
-   sd->animator = NULL;
-
    return ECORE_CALLBACK_CANCEL;
 }
 
-static void
-_elm_panel_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+EOLIAN static void
+_elm_panel_evas_object_smart_resize(Eo *obj, Elm_Panel_Data *sd, Evas_Coord w, Evas_Coord h)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-   ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.resize(obj, w, h);
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_resize(w, h));
 
    if (!sd->scrollable) return;
 
    evas_object_resize(sd->hit_rect, w, h);
+
    switch (sd->orient)
      {
       case ELM_PANEL_ORIENT_TOP:
@@ -994,27 +1082,23 @@ _elm_panel_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
          break;
      }
 
-   //Close/Open the drawer after sizing calculation is finished.
-   if (sd->animator) ecore_animator_del(sd->animator);
-   sd->animator = ecore_animator_add(_elm_panel_anim_cb, obj);
+   ecore_animator_add(_elm_panel_anim_cb, obj);
 }
 
-static void
-_elm_panel_smart_member_add(Evas_Object *obj, Evas_Object *member)
+EOLIAN static void
+_elm_panel_evas_object_smart_member_add(Eo *obj, Elm_Panel_Data *sd, Evas_Object *member)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-   ELM_WIDGET_CLASS(_elm_panel_parent_sc)->base.member_add(obj, member);
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_member_add(member));
 
    if (sd->hit_rect) evas_object_raise(sd->hit_rect);
 }
 
-static void
-_elm_panel_smart_access(Evas_Object *obj, Eina_Bool is_access)
+EOLIAN static void
+_elm_panel_elm_widget_access(Eo *obj, Elm_Panel_Data *_pd, Eina_Bool is_access)
 {
-   ELM_PANEL_CHECK(obj);
-   ELM_PANEL_DATA_GET(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+   Elm_Panel_Data *sd = _pd;
 
-   /* drawer access */
    if (sd->scrollable)
      {
         _access_obj_process(obj, is_access);
@@ -1023,80 +1107,103 @@ _elm_panel_smart_access(Evas_Object *obj, Eina_Bool is_access)
 
    if (is_access)
      _elm_access_edje_object_part_object_register
-       (obj, ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
+       (obj, wd->resize_obj, "btn_icon");
    else
      _elm_access_edje_object_part_object_unregister
-       (obj, ELM_WIDGET_DATA(sd)->resize_obj, "btn_icon");
+       (obj, wd->resize_obj, "btn_icon");
 }
 
-static Evas_Object *
-_elm_panel_smart_access_object_get(Evas_Object *obj, char *part)
+EAPI Evas_Object *
+elm_panel_add(Evas_Object *parent)
 {
-   ELM_PANEL_CHECK(obj) NULL;
-   ELM_PANEL_DATA_GET(obj, sd);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
+   Evas_Object *obj = eo_add(MY_CLASS, parent);
 
-   if (sd->scrollable && sd->scr_ly)
-     return _access_object_get(obj, part);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
+   wd->highlight_root = EINA_TRUE;
 
-   return NULL;
+   return obj;
 }
 
-static Eina_Bool
-_elm_panel_smart_disable(Evas_Object *obj)
+EOLIAN static void
+_elm_panel_eo_base_constructor(Eo *obj, Elm_Panel_Data *_pd EINA_UNUSED)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
+   eo_do_super(obj, MY_CLASS, eo_constructor());
+   eo_do(obj,
+         evas_obj_type_set(MY_CLASS_NAME_LEGACY),
+         evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
+         elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PANEL));
+}
 
-   if (sd->scrollable)
+EOLIAN static void
+_elm_panel_orient_set(Eo *obj, Elm_Panel_Data *sd, Elm_Panel_Orient orient)
+{
+   if (sd->orient == orient) return;
+   sd->orient = orient;
+
+   if (sd->scrollable) _scrollable_layout_theme_set(obj, sd);
+   else _orient_set_do(obj);
+
+   elm_layout_sizing_eval(obj);
+}
+
+EOLIAN static Elm_Panel_Orient
+_elm_panel_orient_get(Eo *obj EINA_UNUSED, Elm_Panel_Data *sd)
+{
+   return sd->orient;
+}
+
+EOLIAN static void
+_elm_panel_hidden_set(Eo *obj, Elm_Panel_Data *sd, Eina_Bool hidden)
+{
+   if (sd->hidden == !!hidden)
      {
-        if (elm_widget_disabled_get(obj))
+        if (sd->scrollable && sd->hidden && !sd->freeze)
           {
-             evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN,
-                                            _on_mouse_down);
-             evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE,
-                                            _on_mouse_move);
-             evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP,
-                                            _on_mouse_up);
-             evas_object_event_callback_del(sd->scr_event, EVAS_CALLBACK_MOUSE_UP,
-                                            _event_mouse_up);
-          }
-        else
-          {
-             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
-                                            _on_mouse_down, sd);
-             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
-                                            _on_mouse_move, sd);
-             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
-                                            _on_mouse_up, sd);
-             evas_object_event_callback_add(sd->scr_event, EVAS_CALLBACK_MOUSE_UP,
-                                            _event_mouse_up, obj);
+             Evas_Coord w, h;
+             evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+             _drawer_close(obj, w, h, EINA_TRUE);
           }
+        return;
      }
 
-   return EINA_TRUE;
+   _panel_toggle(NULL, obj, NULL, NULL);
 }
 
-static void
-_elm_panel_smart_set_user(Elm_Panel_Smart_Class *sc)
+EOLIAN static Eina_Bool
+_elm_panel_hidden_get(Eo *obj EINA_UNUSED, Elm_Panel_Data *sd)
 {
-   ELM_WIDGET_CLASS(sc)->base.add = _elm_panel_smart_add;
-   ELM_WIDGET_CLASS(sc)->base.del = _elm_panel_smart_del;
-   ELM_WIDGET_CLASS(sc)->base.move = _elm_panel_smart_move;
-   ELM_WIDGET_CLASS(sc)->base.resize = _elm_panel_smart_resize;
-   ELM_WIDGET_CLASS(sc)->base.member_add = _elm_panel_smart_member_add;
-
-   ELM_WIDGET_CLASS(sc)->focus_next = _elm_panel_smart_focus_next;
-   ELM_WIDGET_CLASS(sc)->theme = _elm_panel_smart_theme;
-   ELM_WIDGET_CLASS(sc)->event = _elm_panel_smart_event;
-   ELM_WIDGET_CLASS(sc)->access = _elm_panel_smart_access;
-   ELM_WIDGET_CLASS(sc)->access_object_get = _elm_panel_smart_access_object_get;
-   ELM_WIDGET_CLASS(sc)->disable = _elm_panel_smart_disable;
-   ELM_WIDGET_CLASS(sc)->orientation_set = _elm_panel_smart_orientation_set;
-
-   ELM_CONTAINER_CLASS(sc)->content_set = _elm_panel_smart_content_set;
-   ELM_CONTAINER_CLASS(sc)->content_get = _elm_panel_smart_content_get;
-   ELM_CONTAINER_CLASS(sc)->content_unset = _elm_panel_smart_content_unset;
-
-   ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_panel_smart_sizing_eval;
+   return sd->hidden;
+}
+
+EOLIAN static void
+_elm_panel_toggle(Eo *obj, Elm_Panel_Data *_pd EINA_UNUSED)
+{
+   _panel_toggle(NULL, obj, NULL, NULL);
+}
+
+EOLIAN static Eina_Bool
+_elm_panel_elm_widget_on_focus_region(Eo *obj,
+                                      Elm_Panel_Data *sd,
+                                      Evas_Coord *x,
+                                      Evas_Coord *y,
+                                      Evas_Coord *w,
+                                      Evas_Coord *h)
+{
+   eo_do(obj, elm_interface_scrollable_content_pos_get(x, y));
+   evas_object_geometry_get(obj, NULL, NULL, w, h);
+   switch (sd->orient)
+     {
+      case ELM_PANEL_ORIENT_TOP:
+      case ELM_PANEL_ORIENT_BOTTOM:
+         *h = *h * sd->content_size_ratio;
+         break;
+      case ELM_PANEL_ORIENT_LEFT:
+      case ELM_PANEL_ORIENT_RIGHT:
+         *w = *w * sd->content_size_ratio;
+         break;
+     }
+   return EINA_TRUE;
 }
 
 static void
@@ -1118,13 +1225,13 @@ _scroll_cb(Evas_Object *obj, void *data EINA_UNUSED)
    // freeze_set(FALSE) -> mouse_up -> freeze_set(TRUE) -> scroll
    if (sd->freeze)
      {
-        sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
+        eo_do(obj, elm_interface_scrollable_movement_block_set
+              (ELM_SCROLLER_MOVEMENT_NO_BLOCK));
         sd->freeze = EINA_FALSE;
         elm_layout_signal_emit(sd->scr_ly, "elm,state,content,visible", "elm");
-        elm_object_signal_emit(obj, "elm,state,unhold", "elm");
      }
 
-   sd->s_iface->content_pos_get(obj, &x, &y);
+   eo_do(obj, elm_interface_scrollable_content_pos_get(&x, &y));
    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
 
    switch (sd->orient)
@@ -1149,138 +1256,79 @@ _scroll_cb(Evas_Object *obj, void *data EINA_UNUSED)
    evas_object_smart_callback_call(obj, SIG_SCROLL, (void *) &event);
 }
 
-EAPI const Elm_Panel_Smart_Class *
-elm_panel_smart_class_get(void)
-{
-   static Elm_Panel_Smart_Class _sc =
-     ELM_PANEL_SMART_CLASS_INIT_NAME_VERSION(ELM_PANEL_SMART_NAME);
-   static const Elm_Panel_Smart_Class *class = NULL;
-
-   if (class) return class;
-
-   _elm_panel_smart_set(&_sc);
-   class = &_sc;
-
-   return class;
-}
-
-EAPI Evas_Object *
-elm_panel_add(Evas_Object *parent)
+EOLIAN static Eina_Bool
+_elm_panel_elm_widget_disable(Eo *obj, Elm_Panel_Data *sd)
 {
-   Evas_Object *obj;
-
-   EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
-
-   obj = elm_widget_add(_elm_panel_smart_class_new(), parent);
-   if (!obj) return NULL;
-
-   if (!elm_widget_sub_object_add(parent, obj))
-     ERR("could not add %p as sub object of %p", obj, parent);
-
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   elm_widget_can_focus_set(obj, EINA_TRUE);
-
-   /* just to bootstrap and have theme hook to work */
-   elm_layout_theme_set(obj, "panel", "top", elm_widget_style_get(obj));
+   Eina_Bool int_ret = EINA_FALSE;
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_disable());
+   if (!int_ret) return EINA_FALSE;
 
-   _elm_panel_smart_theme(obj);
-
-   elm_widget_can_focus_set(obj, EINA_TRUE);
-
-   sd->hidden = EINA_FALSE;
-
-   sd->bx = evas_object_box_add(evas_object_evas_get(obj));
-   evas_object_size_hint_align_set(sd->bx, 0.5, 0.5);
-   evas_object_box_layout_set(sd->bx, _box_layout_cb, sd, NULL);
-   elm_layout_content_set(obj, "elm.swallow.content", sd->bx);
-   evas_object_show(sd->bx);
-
-   elm_layout_signal_callback_add
-     (obj, "elm,action,panel,toggle", "*", _panel_toggle, obj);
-
-   _mirrored_set(obj, elm_widget_mirrored_get(obj));
-
-   elm_layout_sizing_eval(obj);
-
-   //Tizen Only: This should be removed when eo is applied.
-   ELM_WIDGET_DATA_GET(obj, wsd);
-   wsd->on_create = EINA_FALSE;
-   wsd->highlight_root = EINA_TRUE;
-
-   sd->panel_edje = wsd->resize_obj;
-
-   return obj;
-}
-
-EAPI void
-elm_panel_orient_set(Evas_Object *obj,
-                     Elm_Panel_Orient orient)
-{
-   ELM_PANEL_CHECK(obj);
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   if (sd->orient == orient) return;
-   sd->orient = orient;
-
-   if (sd->scrollable) _scrollable_layout_theme_set(obj, sd);
-   else _orient_set_do(obj);
-
-   elm_layout_sizing_eval(obj);
-}
-
-EAPI Elm_Panel_Orient
-elm_panel_orient_get(const Evas_Object *obj)
-{
-   ELM_PANEL_CHECK(obj) ELM_PANEL_ORIENT_LEFT;
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   return sd->orient;
-}
-
-EAPI void
-elm_panel_hidden_set(Evas_Object *obj,
-                     Eina_Bool hidden)
-{
-   ELM_PANEL_CHECK(obj);
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   if (sd->hidden == hidden)
+   if (sd->scrollable)
      {
-        if (sd->hidden && !sd->freeze)
+        if (elm_widget_disabled_get(obj))
           {
-             Evas_Coord w, h;
-             evas_object_geometry_get(obj, NULL, NULL, &w, &h);
-             _drawer_close(obj, w, h, EINA_TRUE);
+             evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN,
+                                            _on_mouse_down);
+             evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE,
+                                            _on_mouse_move);
+             evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP,
+                                            _on_mouse_up);
+             evas_object_event_callback_del(sd->scr_event, EVAS_CALLBACK_MOUSE_UP,
+                                            _event_mouse_up);
+          }
+        else
+          {
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
+                                            _on_mouse_down, sd);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
+                                            _on_mouse_move, sd);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
+                                            _on_mouse_up, sd);
+             evas_object_event_callback_add(sd->scr_event, EVAS_CALLBACK_MOUSE_UP,
+                                            _event_mouse_up, obj);
           }
-        return;
      }
 
-   _panel_toggle(NULL, obj, NULL, NULL);
+   return EINA_TRUE;
 }
 
-EAPI Eina_Bool
-elm_panel_hidden_get(const Evas_Object *obj)
+EOLIAN static void
+_elm_panel_scrollable_content_size_set(Eo *obj, Elm_Panel_Data *sd, double ratio)
 {
-   ELM_PANEL_CHECK(obj) EINA_FALSE;
-   ELM_PANEL_DATA_GET(obj, sd);
+   Evas_Coord w, h;
+   sd->content_size_ratio = ratio;
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
 
-   return sd->hidden;
+   switch (sd->orient)
+     {
+      case ELM_PANEL_ORIENT_TOP:
+      case ELM_PANEL_ORIENT_BOTTOM:
+         // vertical
+         evas_object_resize(sd->scr_ly, w, (1 + sd->content_size_ratio) * h);
+         evas_object_size_hint_min_set(sd->scr_panel, w, (sd->content_size_ratio * h));
+         evas_object_size_hint_min_set(sd->scr_event, w, h);
+         break;
+      case ELM_PANEL_ORIENT_LEFT:
+      case ELM_PANEL_ORIENT_RIGHT:
+         // horizontal
+         evas_object_resize(sd->scr_ly, (1 + sd->content_size_ratio) * w, h);
+         evas_object_size_hint_min_set(sd->scr_panel, (sd->content_size_ratio * w), h);
+         evas_object_size_hint_min_set(sd->scr_event, w, h);
+         break;
+     }
+
+   ecore_animator_add(_elm_panel_anim_cb, obj);
 }
 
-EAPI void
-elm_panel_toggle(Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_panel_scrollable_get(Eo *obj EINA_UNUSED, Elm_Panel_Data *sd)
 {
-   ELM_PANEL_CHECK(obj);
-
-   _panel_toggle(NULL, obj, NULL, NULL);
+   return sd->scrollable;
 }
 
-EAPI void
-elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
+EOLIAN static void
+_elm_panel_scrollable_set(Eo *obj, Elm_Panel_Data *sd, Eina_Bool scrollable)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-
    scrollable = !!scrollable;
    if (sd->scrollable == scrollable) return;
    sd->scrollable = scrollable;
@@ -1306,22 +1354,20 @@ elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
 
              handler_size = edje_object_data_get(sd->scr_edje, "handler_size");
              if (handler_size)
-               sd->handler_size = (Evas_Coord) (elm_object_scale_get(obj)) * (atoi(handler_size));
+               sd->handler_size = (int) (elm_object_scale_get(obj)) * (atoi(handler_size));
           }
 
         elm_widget_resize_object_set(obj, sd->scr_edje, EINA_TRUE);
 
-        //Temporary code: will be removed after elm_panel_scrollable_content_size_set is applied
+        // TIZEN_ONLY(20150128): Panel implementation merge into 2.4
         if (elm_win_rotation_get(elm_widget_top_get(obj)) == 90 || elm_win_rotation_get(elm_widget_top_get(obj)) == 270)
-          sd->content_size_ratio = 0.45;
+          elm_panel_scrollable_content_size_set(obj, 0.45);
         else
-          sd->content_size_ratio = 0.80;
+          elm_panel_scrollable_content_size_set(obj, 0.80);
+        ////////////////////////////////////////////////////////////
 
         if (!sd->hit_rect)
           {
-             sd->s_iface = evas_object_smart_interface_get
-                (obj, ELM_SCROLLABLE_IFACE_NAME);
-
              sd->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
              evas_object_smart_member_add(sd->hit_rect, obj);
              elm_widget_sub_object_add(obj, sd->hit_rect);
@@ -1329,9 +1375,10 @@ elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
              evas_object_show(sd->hit_rect);
              evas_object_repeat_events_set(sd->hit_rect, EINA_TRUE);
 
-             sd->s_iface->objects_set(obj, sd->scr_edje, sd->hit_rect);
-             sd->s_iface->animate_stop_cb_set(obj, _anim_stop_cb);
-             sd->s_iface->scroll_cb_set(obj, _scroll_cb);
+             eo_do(obj,
+                   elm_interface_scrollable_objects_set(sd->scr_edje, sd->hit_rect),
+                   elm_interface_scrollable_animate_stop_cb_set(_anim_stop_cb),
+                   elm_interface_scrollable_scroll_cb_set(_scroll_cb));
           }
 
         if (!sd->scr_ly)
@@ -1352,7 +1399,8 @@ elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
              elm_layout_content_set(sd->scr_ly, "event_area", sd->scr_event);
           }
 
-        sd->s_iface->content_set(obj, sd->scr_ly);
+        eo_do(obj,
+              elm_interface_scrollable_content_set(sd->scr_ly));
         sd->freeze = EINA_TRUE;
         elm_layout_content_set(sd->scr_ly, "elm.swallow.content", sd->bx);
 
@@ -1360,15 +1408,18 @@ elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
           {
            case ELM_PANEL_ORIENT_TOP:
            case ELM_PANEL_ORIENT_BOTTOM:
-              sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
+              eo_do(obj, elm_interface_scrollable_movement_block_set
+                    (ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL));
               break;
            case ELM_PANEL_ORIENT_LEFT:
            case ELM_PANEL_ORIENT_RIGHT:
-              sd->s_iface->movement_block_set(obj, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
+              eo_do(obj, elm_interface_scrollable_movement_block_set
+                    (ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL));
               break;
           }
 
-        sd->s_iface->single_direction_set(obj, ELM_SCROLLER_SINGLE_DIRECTION_NONE);
+        eo_do(obj, elm_interface_scrollable_single_direction_set
+              (ELM_SCROLLER_SINGLE_DIRECTION_NONE));
 
         if (!elm_widget_disabled_get(obj))
           {
@@ -1381,10 +1432,11 @@ elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
              evas_object_event_callback_add(sd->scr_event, EVAS_CALLBACK_MOUSE_UP,
                                             _event_mouse_up, obj);
           }
+
      }
    else
      {
-        sd->s_iface->content_set(obj, NULL);
+        eo_do(obj, elm_interface_scrollable_content_set(NULL));
 
         evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _on_mouse_down);
         evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _on_mouse_move);
@@ -1402,41 +1454,20 @@ elm_panel_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
      }
 }
 
-EAPI Eina_Bool
-elm_panel_scrollable_get(const Evas_Object *obj)
+static void
+_elm_panel_class_constructor(Eo_Class *klass)
 {
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   return sd->scrollable;
+   evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
 }
 
-EAPI void
-elm_panel_scrollable_content_size_set(Evas_Object *obj, double ratio)
+EOLIAN const Elm_Atspi_Action *
+_elm_panel_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Panel_Data *pd EINA_UNUSED)
 {
-   Evas_Coord w, h;
-   ELM_PANEL_DATA_GET(obj, sd);
-
-   sd->content_size_ratio = ratio;
-   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
-
-   switch (sd->orient)
-     {
-      case ELM_PANEL_ORIENT_TOP:
-      case ELM_PANEL_ORIENT_BOTTOM:
-         // vertical
-         evas_object_resize(sd->scr_ly, w, (1 + sd->content_size_ratio) * h);
-         evas_object_size_hint_min_set(sd->scr_panel, w, (sd->content_size_ratio * h));
-         evas_object_size_hint_min_set(sd->scr_event, w, h);
-         break;
-      case ELM_PANEL_ORIENT_LEFT:
-      case ELM_PANEL_ORIENT_RIGHT:
-         // horizontal
-         evas_object_resize(sd->scr_ly, (1 + sd->content_size_ratio) * w, h);
-         evas_object_size_hint_min_set(sd->scr_panel, (sd->content_size_ratio * w), h);
-         evas_object_size_hint_min_set(sd->scr_event, w, h);
-         break;
-     }
-
-   if (sd->animator) ecore_animator_del(sd->animator);
-   sd->animator = ecore_animator_add(_elm_panel_anim_cb, obj);
+   static Elm_Atspi_Action atspi_actions[] = {
+          { "toggle", "toggle", NULL, _key_action_toggle},
+          { NULL, NULL, NULL, NULL }
+   };
+   return &atspi_actions[0];
 }
+
+#include "elm_panel.eo.c"