Apply Modified Listener 18/34718/2 submit/tizen_tv/20150202.020111
authorKim Tae Soo <taesoo46.kim@samsung.com>
Mon, 2 Feb 2015 01:32:39 +0000 (10:32 +0900)
committerKim Tae Soo <taesoo46.kim@samsung.com>
Mon, 2 Feb 2015 01:53:59 +0000 (10:53 +0900)
Change-Id: Id1c42a79f5f12494fbf85662fd5339b7de24933e
Signed-off-by: Kim Tae Soo <taesoo46.kim@samsung.com>
include/album-songs-layout.h
include/song-layout.h
src/views/album-songs-layout.cpp
src/views/song-layout.cpp

index 373852d..4db5a4f 100644 (file)
 #define __ALBUM_SONGS_LAYOUT_H__
 
 
-class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener {
+struct SAlbumSongsItemInfo;
+
+class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr,
+       public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener {
 private:
        struct SAlbumSongsLayout *m;
 
@@ -27,7 +30,19 @@ private:
        static void sm_CbRemoveListItem(void *data, Evas_Object *obj);
        static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId);
 
+       static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid);
+       void m_OnCtxtUpdate(EActionType type, int lid);
+
+       static void sm_CbCtxtClose(void *dt);
+       void m_OnCtxtClose(void);
+
+       static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info);
+       void m_OnItemSelect(Evas_Object *obj, void *event_info);
+
 private:
+       SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item);
+       void m_UpdateSongList(void);
+       void m_EmptySongList(void);
        inline int m_ConvertToMin(int milsec);
        void m_GotoPlayback(int mode, char *id);
        Evas_Object *m_AddAlbumCover(void);
@@ -38,7 +53,12 @@ protected:
        virtual void t_OnShow(void);
 
 public:
-       CAlbumSongsLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {}
+       CAlbumSongsLayout(const char *pLayoutId) :
+               CExtBaseLayout(pLayoutId),
+               IKeyDownListener(this),
+               IMouseMoveListener(this),
+               IMouseClickedListener(this),
+               m(0) {}
        virtual ~CAlbumSongsLayout() {}
 
        bool Create(CLayoutMgr *mgr);
@@ -46,6 +66,8 @@ public:
 
 public:
        virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
+       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
+       virtual void OnMouseClicked(int id, Evas_Object *obj);
 };
 
 
index fe1be2b..25e7d41 100644 (file)
 #define __SONG_LAYOUT_H__
 
 
-class CSongLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener {
+struct SSongItemInfo;
+
+class CSongLayout : public CExtBaseLayout, public CListenerMgr,
+       public IKeyDownListener, public IMouseMoveListener {
 private:
        struct SSongLayout *m;
 
@@ -28,10 +31,20 @@ private:
        static void sm_CbRemoveListItem(void *data, Evas_Object *obj);
        static void sm_CbGenlistKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei);
 
-       static void sm_CbSelectItem(void *cookie);
-       void m_OnSelectItem(void);
+       static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid);
+       void m_OnCtxtUpdate(EActionType type, int lid);
+
+       static void sm_CbCtxtClose(void *dt);
+       void m_OnCtxtClose(void);
+
+       static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info);
+       void m_OnItemSelect(Evas_Object *obj, void *event_info);
 
 private:
+       SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item);
+       void m_UpdateSongList(bool sort_flag);
+       void m_SortSongList(void);
+       void m_EmptySongList(bool sort_flag);
        void m_GotoPlayback(void);
        void m_GotoPlaybackUri(void);
        void m_CreateSongList(void);
@@ -40,7 +53,11 @@ protected:
        virtual void t_OnShow(void);
 
 public:
-       CSongLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {}
+       CSongLayout(const char *pLayoutId) :
+               CExtBaseLayout(pLayoutId),
+               IKeyDownListener(this),
+               IMouseMoveListener(this),
+               m(0) {}
        virtual ~CSongLayout() {}
 
        bool Create(CLayoutMgr *mgr, const char *uri);
@@ -50,6 +67,7 @@ public:
 
 public:
        virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
+       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
 };
 
 
index 1364485..cc87998 100644 (file)
 #define TOTAL_ADD_BTNS 3
 
 
-enum EBtnType {
-       ABTN_PLAY,
-       ABTN_NEXT,
-       ABTN_LAST
+enum EObjectType {
+       ALBUM_SONGS_PLAY_BUTTON,
+       ALBUM_SONGS_NEXT_BUTTON,
+       ALBUM_SONGS_LAST_BUTTON,
+       ALBUM_SONGS_LAYOUT,
+       ALBUM_SONGS_GENLIST,
 };
 
 struct SAlbumSongsItemInfo {
@@ -64,312 +66,11 @@ struct SAlbumSongsLayout {
        int total_duration;
        CAlbumSongsLayout *parent;
 
-       class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener {
-       public:
-               struct SCallback {
-                       void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId);
-                       void* cookie;
-               };
-
-       private:
-               SAlbumSongsLayout *m;
-
-       protected:
-               SCallback m_callback;
-
-       public:
-               CHandlerButton(SAlbumSongsLayout *ins) :
-                       IMouseMoveListener(this),
-                       IMouseClickedListener(this) {
-                       m = ins;
-               }
-
-               void SetCallback(const SCallback* cb) {
-                       m_callback = *cb;
-               }
-
-               virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
-               {
-                       if (!obj)
-                               return;
-
-                       if (!elm_object_focus_get(obj))
-                               elm_object_focus_set(obj, EINA_TRUE);
-               }
-
-               virtual void OnMouseClicked(int id, Evas_Object *obj) {
-                       EBtnType type = (EBtnType)id;
-
-                       switch (type)
-                       {
-                       case ABTN_PLAY:
-                               if (m_callback.gotoPlayBackView)
-                                       m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_FRESH, NULL);
-                               break;
-
-                       case ABTN_NEXT:
-                               if (m_callback.gotoPlayBackView)
-                                       m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_NEXT, NULL);
-                               break;
-
-                       case ABTN_LAST:
-                               if (m_callback.gotoPlayBackView)
-                                       m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_END, NULL);
-                               break;
-
-                       default:
-                               _ERR("Invalid Button Type");
-                               ASSERT(0);
-                               break;
-                       }
-               }
-       } *pHandlerButton;
-
-       class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener {
-       public:
-               struct SCallback {
-                       void(*gotoPlaybackView)(void* cookie, int mode, char *mediaId);
-                       void* cookie;
-               };
-
-       private:
-               SAlbumSongsLayout *m;
-               SCallback m_callback;
-
-       private:
-               SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
-               {
-                       Eina_List *l = NULL;
-                       SAlbumSongsItemInfo *itinfo = NULL;
-                       void *obj = NULL;
-
-                       EINA_LIST_FOREACH(list, l, obj) {
-                               itinfo = (SAlbumSongsItemInfo *)obj;
-                               if (itinfo->item == item)
-                                       return itinfo;
-                       }
-
-                       return NULL;
-               }
-
-               static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
-               {
-                       CHandlerGenlist *root = (CHandlerGenlist*)dt;
-
-                       if (root)
-                               root->m_OnCtxtUpdate(type, lid);
-               }
-
-               void m_OnCtxtUpdate(EActionType type, int lid)
-               {
-                       Eina_List *list = NULL;
-                       EAddType mode;
-
-                       if (!m->ctxtinfo || !m->ctxtinfo->context)
-                               return;
-
-                       if (type == ACTION_TYPE_ADDNEXT)
-                               mode = ADD_TYPE_NEXT;
-                       else
-                               mode = ADD_TYPE_END;
-
-                       list = eina_list_append(list, m->ctxtinfo->context);
-                       if (type ==  ACTION_TYPE_ADDTO) {
-                               if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
-                                       _ERR(" Adding songs to playlist failed ");
-                               else
-                                       _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG);
-
-                               return;
-                       }
-
-                       m->mhandle->UpdatePlaylist(list, mode);
-                       eina_list_free(list);
-
-                       if (type == ACTION_TYPE_PLAY) {
-                               m->mhandle->Stop();
-                               m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context));
-                       }
-
-                       _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
-               }
-
-               static void sm_CbCtxtClose(void *dt)
-               {
-                       CHandlerGenlist *root = (CHandlerGenlist*)dt;
-
-                       if (root)
-                               root->m_OnCtxtClose();
-               }
-
-               void m_OnCtxtClose(void)
-               {
-                       m->vmgr->PopView();
-                       m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
-                       elm_object_item_focus_set(m->focused_item, EINA_TRUE);
-               }
-
-               static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
-               {
-                       CHandlerGenlist *root = (CHandlerGenlist*)data;
-
-                       if (root)
-                               root->m_OnItemSelect(obj, event_info);
-               }
-
-               void m_OnItemSelect(Evas_Object *obj, void *event_info)
-               {
-                       SAlbumSongsItemInfo *itinfo = NULL;
-                       char *mediaId = NULL;
-
-                       itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info);
-                       if (!itinfo) {
-                               _ERR(" no item info found ");
-                               return;
-                       }
-
-                       mediaId = song_info_get_media_id(itinfo->sinfo);
-
-                       if (m_callback.gotoPlaybackView) {
-                               m_callback.gotoPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, mediaId);
-                       }
-               }
-
-       public:
-               CHandlerGenlist(SAlbumSongsLayout *ins) :
-                       IMouseMoveListener(this),
-                       IKeyDownListener(this) {
-                       m = ins;
-               }
-
-               virtual ~CHandlerGenlist() {
-                       EmptySongList();
-               }
-
-               void SetCallback(const SCallback* cb) {
-                       m_callback = *cb;
-               }
-
-               virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
-                       Elm_Object_Item *item;
-
-                       item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
-                               ev->cur.canvas.y, NULL);
-
-                       if (!elm_object_item_focus_get(item))
-                               elm_object_item_focus_set(item, EINA_TRUE);
-               }
-
-               virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
-                       Elm_Object_Item *it = NULL;
-                       SContentInfo *ctxtinfo = NULL;
-                       SAlbumSongsItemInfo *itinfo = NULL;
-
-                       if (strcmp(ev->keyname, KEY_MENU))
-                               return;
-
-                       it = elm_object_focused_item_get(obj);
-                       if (!it) {
-                               _ERR(" unable to get focused item ");
-                               return;
-                       }
-                       m->focused_item = it;
-
-                       if (m->ctxtinfo) {
-                               free(m->ctxtinfo);
-                               m->ctxtinfo = NULL;
-                       }
-
-                       ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
-                       if (!ctxtinfo)
-                               return;
-
-                       itinfo = m_FindItemInfoFromItem(m->it_infolist, it);
-                       if (!itinfo) {
-                               free(ctxtinfo);
-                               return;
-                       }
-
-                       ctxtinfo->type = CONTEXT_TYPE_SONG;
-                       ctxtinfo->context = itinfo->sinfo;
-                       ctxtinfo->cbdata = this;
-                       ctxtinfo->update = sm_CbCtxtUpdate;
-                       ctxtinfo->close = sm_CbCtxtClose;
-
-                       m->ctxtinfo = ctxtinfo;
-
-                       SParcel parcel;
-                       parcel.ctxtInfo = ctxtinfo;
-                       if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
-                               _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
-               }
-
-               void UpdateSongList(void)
-               {
-                       SSongInfo *sinfo = NULL;
-                       void *obj = NULL;
-                       Eina_List *l = NULL;
-                       SAlbumSongsItemInfo *itinfo = NULL;
-                       Elm_Object_Item *item = NULL;
-                       int dur = 0;
-                       album_info *alinfo = NULL;
-
-                       if (!m->songlist || !m->item_class)
-                               return;
-
-                       /* Remove existing songlist and prepare afresh */
-                       EmptySongList();
-
-                       alinfo = m->mhandle->CurrentAlbum();
-                       if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) {
-                               _ERR(" Fetching song list from media failed ");
-                               return;
-                       }
-
-                       EINA_LIST_FOREACH(m->slist, l, obj) {
-                               sinfo = (SSongInfo *)obj;
-                               itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo));
-                               if (!itinfo)
-                                       return;
-
-                               itinfo->sinfo = sinfo;
-                               item = elm_genlist_item_append(m->songlist, m->item_class,
-                                       itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this);
-                               itinfo->item = item;
-                               m->it_infolist = eina_list_append(m->it_infolist, itinfo);
-                               song_info_get_duration(sinfo, &dur);
-                               m->total_duration = m->total_duration + dur;
-                       }
-               }
-
-               void EmptySongList(void)
-               {
-                       if (m->songlist)
-                               elm_genlist_clear(m->songlist);
-
-                       if (m->slist) {
-                               eina_list_free(m->slist);
-                               m->slist = NULL;
-                       }
-
-                       if (m->it_infolist) {
-                               eina_list_free(m->it_infolist);
-                               m->it_infolist = NULL;
-                       }
-
-                       m->total_duration = 0;
-               }
-       } *pHandlerGenlist;
-
        SAlbumSongsLayout() {
                memset(this, 0, sizeof(SAlbumSongsLayout));
-               pHandlerGenlist = new CHandlerGenlist(this);
-               pHandlerButton = new CHandlerButton(this);
        }
 
        ~SAlbumSongsLayout() {
-               delete pHandlerGenlist;
-               delete pHandlerButton;
        }
 };
 
@@ -437,11 +138,158 @@ void CAlbumSongsLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj)
 }
 
 
-void CAlbumSongsLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId)
+void CAlbumSongsLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
 {
-       CAlbumSongsLayout *root = (CAlbumSongsLayout *)cookie;
+       CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt;
+
        if (root)
-               root->m_GotoPlayback(mode, mediaId);
+               root->m_OnCtxtUpdate(type, lid);
+}
+
+void CAlbumSongsLayout::m_OnCtxtUpdate(EActionType type, int lid)
+{
+       Eina_List *list = NULL;
+       EAddType mode;
+
+       if (!m->ctxtinfo || !m->ctxtinfo->context)
+               return;
+
+       if (type == ACTION_TYPE_ADDNEXT)
+               mode = ADD_TYPE_NEXT;
+       else
+               mode = ADD_TYPE_END;
+
+       list = eina_list_append(list, m->ctxtinfo->context);
+       if (type == ACTION_TYPE_ADDTO) {
+               if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
+                       _ERR(" Adding songs to playlist failed ");
+               else
+                       _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG);
+
+               return;
+       }
+
+       m->mhandle->UpdatePlaylist(list, mode);
+       eina_list_free(list);
+
+       if (type == ACTION_TYPE_PLAY) {
+               m->mhandle->Stop();
+               m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context));
+       }
+
+       _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
+}
+
+void CAlbumSongsLayout::sm_CbCtxtClose(void *dt)
+{
+       CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt;
+
+       if (root)
+               root->m_OnCtxtClose();
+}
+
+void CAlbumSongsLayout::m_OnCtxtClose(void)
+{
+       m->vmgr->PopView();
+       m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
+       elm_object_item_focus_set(m->focused_item, EINA_TRUE);
+}
+
+void CAlbumSongsLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
+{
+       CAlbumSongsLayout *root = (CAlbumSongsLayout*)data;
+
+       if (root)
+               root->m_OnItemSelect(obj, event_info);
+}
+
+void CAlbumSongsLayout::m_OnItemSelect(Evas_Object *obj, void *event_info)
+{
+       SAlbumSongsItemInfo *itinfo = NULL;
+       char *mediaId = NULL;
+
+       itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info);
+       if (!itinfo) {
+               _ERR(" no item info found ");
+               return;
+       }
+
+       mediaId = song_info_get_media_id(itinfo->sinfo);
+
+       m_GotoPlayback(ADD_TYPE_FRESH, mediaId);
+}
+
+
+SAlbumSongsItemInfo *CAlbumSongsLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
+{
+       Eina_List *l = NULL;
+       SAlbumSongsItemInfo *itinfo = NULL;
+       void *obj = NULL;
+
+       EINA_LIST_FOREACH(list, l, obj) {
+               itinfo = (SAlbumSongsItemInfo *)obj;
+               if (itinfo->item == item)
+                       return itinfo;
+       }
+
+       return NULL;
+}
+
+
+void  CAlbumSongsLayout::m_UpdateSongList(void)
+{
+       SSongInfo *sinfo = NULL;
+       void *obj = NULL;
+       Eina_List *l = NULL;
+       SAlbumSongsItemInfo *itinfo = NULL;
+       Elm_Object_Item *item = NULL;
+       int dur = 0;
+       album_info *alinfo = NULL;
+
+       if (!m->songlist || !m->item_class)
+               return;
+
+       /* Remove existing songlist and prepare afresh */
+       m_EmptySongList();
+
+       alinfo = m->mhandle->CurrentAlbum();
+       if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) {
+               _ERR(" Fetching song list from media failed ");
+               return;
+       }
+
+       EINA_LIST_FOREACH(m->slist, l, obj) {
+               sinfo = (SSongInfo *)obj;
+               itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo));
+               if (!itinfo)
+                       return;
+
+               itinfo->sinfo = sinfo;
+               item = elm_genlist_item_append(m->songlist, m->item_class,
+                       itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this);
+               itinfo->item = item;
+               m->it_infolist = eina_list_append(m->it_infolist, itinfo);
+               song_info_get_duration(sinfo, &dur);
+               m->total_duration = m->total_duration + dur;
+       }
+}
+
+void CAlbumSongsLayout::m_EmptySongList(void)
+{
+       if (m->songlist)
+               elm_genlist_clear(m->songlist);
+
+       if (m->slist) {
+               eina_list_free(m->slist);
+               m->slist = NULL;
+       }
+
+       if (m->it_infolist) {
+               eina_list_free(m->it_infolist);
+               m->it_infolist = NULL;
+       }
+
+       m->total_duration = 0;
 }
 
 
@@ -511,20 +359,20 @@ void CAlbumSongsLayout::m_CreateTopSection(void)
        SBtnInfo btninfo[TOTAL_ADD_BTNS];
        Evas_Object *layout = Layout();
 
-       btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY;
-       btninfo[ABTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN;
-       btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN;
-       btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY;
+       btninfo[ALBUM_SONGS_PLAY_BUTTON].name = MUSIC_STR_PLAY;
+       btninfo[ALBUM_SONGS_PLAY_BUTTON].part = MUSIC_PART_ALBUM_PLAYBTN;
+       btninfo[ALBUM_SONGS_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN;
+       btninfo[ALBUM_SONGS_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY;
 
-       btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT;
-       btninfo[ABTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN;
-       btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN;
-       btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT;
+       btninfo[ALBUM_SONGS_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT;
+       btninfo[ALBUM_SONGS_NEXT_BUTTON].part = MUSIC_PART_ALBUM_NEXTBTN;
+       btninfo[ALBUM_SONGS_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN;
+       btninfo[ALBUM_SONGS_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT;
 
-       btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST;
-       btninfo[ABTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN;
-       btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN;
-       btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST;
+       btninfo[ALBUM_SONGS_LAST_BUTTON].name = MUSIC_STR_ADDLAST;
+       btninfo[ALBUM_SONGS_LAST_BUTTON].part = MUSIC_PART_ALBUM_LASTBTN;
+       btninfo[ALBUM_SONGS_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN;
+       btninfo[ALBUM_SONGS_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST;
 
        thumb = m_AddAlbumCover();
        if (!thumb)
@@ -540,7 +388,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void)
                elm_object_text_set(btn[i], _(btninfo[i].name));
                elm_object_style_set(btn[i], btninfo[i].style);
 
-               m->pHandlerButton->Connect(btn[i], i);
+               Connect(btn[i], i, TYPE_MOUSE_MOVE | TYPE_CLICKED);
 
                img = elm_image_add(btn[i]);
                if (img) {
@@ -601,7 +449,7 @@ void CAlbumSongsLayout::m_CreateSongList(void)
        evas_object_size_hint_weight_set(genlist,
                EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        elm_object_part_content_set(layout, MUSIC_PART_SONGLIST, genlist);
-       m->pHandlerGenlist->Connect(genlist);
+       Connect(genlist, ALBUM_SONGS_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN);
        m->songlist = genlist;
 
        list_item = elm_genlist_item_class_new();
@@ -617,7 +465,7 @@ void CAlbumSongsLayout::m_CreateSongList(void)
        list_item->func.del = sm_CbRemoveListItem;
        m->item_class = list_item;
 
-       m->pHandlerGenlist->UpdateSongList();
+       m_UpdateSongList();
 }
 
 
@@ -696,17 +544,7 @@ bool CAlbumSongsLayout::Create(CLayoutMgr *mgr)
        m->mgr = mgr;
        m->parent = this;
 
-       Connect(layout);
-
-       SAlbumSongsLayout::CHandlerGenlist::SCallback listCb;
-       listCb.gotoPlaybackView = &sm_CbGoToPlaybackView;
-       listCb.cookie = this;
-       m->pHandlerGenlist->SetCallback(&listCb);
-
-       SAlbumSongsLayout::CHandlerButton::SCallback btnCb;
-       btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView;
-       btnCb.cookie = this;
-       m->pHandlerButton->SetCallback(&btnCb);
+       Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN);
  
        return true;
 }
@@ -715,7 +553,7 @@ void CAlbumSongsLayout::Destroy(void)
 {
        ASSERT(m);
 
-       m->pHandlerGenlist->EmptySongList();
+       m_EmptySongList();
        CExtBaseLayout::Destroy();
        evas_object_del(Layout());
 
@@ -729,7 +567,7 @@ void CAlbumSongsLayout::t_OnShow(void)
 {
        ASSERT(m);
 
-       m->pHandlerGenlist->EmptySongList();
+       m_EmptySongList();
 
        m_CreateSongList();
        m_CreateTopSection();
@@ -747,12 +585,118 @@ void CAlbumSongsLayout::t_OnShow(void)
 
 void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
 {
-       if (!strcmp(ev->keyname, KEY_BACK)) {
-               SParcel parcel;
-               parcel.ctxtInfo = NULL;
-               parcel.updateType = E_DEPTH_UPDATE;
-               parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT;
-               parcel.keyEvent = NULL;
-               m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
+       switch (id)
+       {
+       case ALBUM_SONGS_LAYOUT:
+               if (!strcmp(ev->keyname, KEY_BACK)) {
+                       SParcel parcel;
+                       parcel.ctxtInfo = NULL;
+                       parcel.updateType = E_DEPTH_UPDATE;
+                       parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT;
+                       parcel.keyEvent = NULL;
+                       m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
+               }
+               break;
+
+       case ALBUM_SONGS_GENLIST:
+               {
+                       Elm_Object_Item *it = NULL;
+                       SContentInfo *ctxtinfo = NULL;
+                       SAlbumSongsItemInfo *itinfo = NULL;
+
+                       if (strcmp(ev->keyname, KEY_MENU))
+                               return;
+
+                       it = elm_object_focused_item_get(obj);
+                       if (!it) {
+                               _ERR(" unable to get focused item ");
+                               return;
+                       }
+                       m->focused_item = it;
+
+                       if (m->ctxtinfo) {
+                               free(m->ctxtinfo);
+                               m->ctxtinfo = NULL;
+                       }
+
+                       ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
+                       if (!ctxtinfo)
+                               return;
+
+                       itinfo = m_FindItemInfoFromItem(m->it_infolist, it);
+                       if (!itinfo) {
+                               free(ctxtinfo);
+                               return;
+                       }
+
+                       ctxtinfo->type = CONTEXT_TYPE_SONG;
+                       ctxtinfo->context = itinfo->sinfo;
+                       ctxtinfo->cbdata = this;
+                       ctxtinfo->update = sm_CbCtxtUpdate;
+                       ctxtinfo->close = sm_CbCtxtClose;
+
+                       m->ctxtinfo = ctxtinfo;
+
+                       SParcel parcel;
+                       parcel.ctxtInfo = ctxtinfo;
+                       if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
+                               _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
+               }
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CAlbumSongsLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+{
+       switch (id) {
+       case ALBUM_SONGS_GENLIST:
+               {
+                       Elm_Object_Item *item;
+
+                       item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
+                               ev->cur.canvas.y, NULL);
+
+                       if (!elm_object_item_focus_get(item))
+                               elm_object_item_focus_set(item, EINA_TRUE);
+               }
+               break;
+
+       case ALBUM_SONGS_PLAY_BUTTON:
+       case ALBUM_SONGS_NEXT_BUTTON:
+       case ALBUM_SONGS_LAST_BUTTON:
+               {
+                       if (!elm_object_focus_get(obj))
+                               elm_object_focus_set(obj, EINA_TRUE);
+               }
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CAlbumSongsLayout::OnMouseClicked(int id, Evas_Object *obj)
+{
+       switch (id)
+       {
+       case ALBUM_SONGS_PLAY_BUTTON:
+               m_GotoPlayback(ADD_TYPE_FRESH, NULL);
+               break;
+
+       case ALBUM_SONGS_NEXT_BUTTON:
+               m_GotoPlayback(ADD_TYPE_NEXT, NULL);
+               break;
+
+       case ALBUM_SONGS_LAST_BUTTON:
+               m_GotoPlayback(ADD_TYPE_END, NULL);
+               break;
+
+       default:
+               break;
        }
 }
\ No newline at end of file
index db8e9c1..36f763d 100644 (file)
 #include "song-layout.h"
 #include "base-view.h"
 
+
+enum EObjectType {
+       SONG_LAYOUT,
+       SONG_LAYOUT_GENLIST,
+};
+
 struct SSongItemInfo {
        SSongInfo *sinfo;
        Elm_Object_Item *item;
@@ -53,268 +59,11 @@ struct SSongLayout {
        char *uri;
        CSongLayout *parent;
 
-       class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener {
-       public:
-               struct SCallback {
-                       void(*cb)(void* cookie);
-                       void* cookie;
-               };
-
-       private:
-               SSongLayout *m;
-               SCallback m_callback;
-
-       private:
-               SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
-               {
-                       Eina_List *l;
-                       SSongItemInfo *itinfo = NULL;
-                       void *obj = NULL;
-
-                       EINA_LIST_FOREACH(list, l, obj) {
-                               itinfo = (SSongItemInfo *)obj;
-                               if (itinfo->item == item)
-                                       return itinfo;
-                       }
-
-                       return NULL;
-               }
-
-               static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
-               {
-                       CHandlerGenlist *root = (CHandlerGenlist*)data;
-
-                       if (root)
-                               root->m_OnItemSelect(obj, event_info);
-               }
-
-               void m_OnItemSelect(Evas_Object *obj, void *event_info)
-               {
-                       SSongItemInfo *itinfo = NULL;
-                       char *mediaId = NULL;
-
-                       itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info);
-                       if (!itinfo) {
-                               _ERR(" no item info found ");
-                               return;
-                       }
-
-                       mediaId = song_info_get_media_id(itinfo->sinfo);
-
-                       m->mhandle->Stop();
-                       m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH);
-                       m->mhandle->SetCurrentSong(mediaId);
-
-                       if (m_callback.cb) {
-                               m_callback.cb(m_callback.cookie);
-                       }
-               }
-
-               static void sm_CbCtxtClose(void *dt)
-               {
-                       CHandlerGenlist *root = (CHandlerGenlist*)dt;
-
-                       if (root)
-                               root->m_OnCtxtClose();
-               }
-
-               void m_OnCtxtClose(void)
-               {
-                       m->vmgr->PopView();
-                       m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
-                       elm_object_item_focus_set(m->focused_item, EINA_TRUE);
-               }
-
-               static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
-               {
-                       CHandlerGenlist *root = (CHandlerGenlist*)dt;
-
-                       if (root)
-                               root->m_OnCtxtUpdate(type, lid);
-               }
-
-               void m_OnCtxtUpdate(EActionType type, int lid)
-               {
-                       Eina_List *list = NULL;
-                       EAddType mode;
-
-                       if (!m->ctxtinfo || !m->ctxtinfo->context)
-                               return;
-
-                       if (type == ACTION_TYPE_ADDNEXT)
-                               mode = ADD_TYPE_NEXT;
-                       else
-                               mode = ADD_TYPE_END;
-
-                       list = eina_list_append(list, m->ctxtinfo->context);
-                       if (type ==  ACTION_TYPE_ADDTO) {
-                               if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
-                                       _ERR(" Adding songs to playlist failed ");
-                               else
-                                       _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG);
-
-                               return;
-                       }
-
-                       m->mhandle->UpdatePlaylist(list, mode);
-                       eina_list_free(list);
-
-                       if (type == ACTION_TYPE_PLAY) {
-                               m->mhandle->Stop();
-                               m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context));
-                       }
-
-                       _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
-               }
-
-               void m_SortSongList(void)
-               {
-                       int sort_type;
-
-                       int(*_sort_fn[])(const void *d1, const void *d2) = {
-                               sortsongs_title_az,
-                               sortsongs_title_za,
-                               sortsongs_artist_az,
-                               sortsongs_artist_za,
-                               sortsongs_album_az,
-                               sortsongs_album_za
-                       };
-
-                       sort_type = m->mhandle->SortType();
-
-                       m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]);
-               }
-
-               void m_EmptySongList(bool sort_flag)
-               {
-                       if (m->songlist)
-                               elm_genlist_clear(m->songlist);
-
-                       if (!sort_flag) {
-                               eina_list_free(m->slist);
-                               m->slist = NULL;
-                       }
-
-                       eina_list_free(m->it_infolist);
-                       m->it_infolist = NULL;
-               }
-
-       public:
-               CHandlerGenlist(SSongLayout *ins) :
-                       IMouseMoveListener(this),
-                       IKeyDownListener(this) {
-                       m = ins;
-               }
-
-               virtual ~CHandlerGenlist() {
-                       m_EmptySongList(false);
-               }
-
-               void SetCallback(const SCallback* cb) {
-                       m_callback = *cb;
-               }
-
-               virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
-                       Elm_Object_Item *item;
-
-                       item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
-                               ev->cur.canvas.y, NULL);
-
-                       if (!elm_object_item_focus_get(item))
-                               elm_object_item_focus_set(item, EINA_TRUE);
-               }
-
-               virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
-                       Elm_Object_Item *it = NULL;
-                       SContentInfo *ctxtinfo = NULL;
-                       SSongItemInfo *itinfo = NULL;
-
-                       if (strcmp(ev->keyname, KEY_MENU))
-                               return;
-
-                       it = elm_object_focused_item_get(obj);
-                       if (!it) {
-                               _ERR(" unable to get focused item ");
-                               return;
-                       }
-                       m->focused_item = it;
-
-                       if (m->ctxtinfo) {
-                               free(m->ctxtinfo);
-                               m->ctxtinfo = NULL;
-                       }
-
-                       ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
-                       if (!ctxtinfo)
-                               return;
-
-                       itinfo = m_FindItemInfoFromItem(m->it_infolist, it);
-                       if (!itinfo) {
-                               free(ctxtinfo);
-                               return;
-                       }
-
-                       ctxtinfo->type = CONTEXT_TYPE_SONG;
-                       ctxtinfo->context = itinfo->sinfo;
-                       ctxtinfo->cbdata = this;
-                       ctxtinfo->update = sm_CbCtxtUpdate;
-                       ctxtinfo->close = sm_CbCtxtClose;
-
-                       m->ctxtinfo = ctxtinfo;
-
-                       SParcel parcel;
-                       parcel.ctxtInfo = ctxtinfo;
-                       if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
-                               _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
-               }
-
-               void UpdateSongList(bool sort_flag)
-               {
-                       bool r;
-                       struct SSongInfo *sinfo;
-                       void *obj;
-                       Eina_List *l;
-                       struct SSongItemInfo *itinfo;
-                       Elm_Object_Item *item;
-
-                       /* Remove existing songlist and prepare afresh */
-                       m_EmptySongList(sort_flag);
-
-                       if (!sort_flag) {
-                               r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist));
-                               if (r == false || eina_list_count(m->slist) == 0) {
-                                       _ERR(" Fetching song list from media failed ");
-
-                                       m->parent->SetEmptyStatus(true);
-                                       return;
-                               }
-                       }
-
-                       m_SortSongList();
-
-                       EINA_LIST_FOREACH(m->slist, l, obj) {
-                               sinfo = (SSongInfo *)obj;
-                               itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo));
-                               if (!itinfo)
-                                       return;
-
-                               itinfo->sinfo = sinfo;
-                               item = elm_genlist_item_append(m->songlist, m->item_class,
-                                       itinfo, NULL, ELM_GENLIST_ITEM_NONE,
-                                       sm_CbItemSelect, this);
-                               itinfo->item = item;
-                               m->it_infolist = eina_list_append(m->it_infolist, itinfo);
-                       }
-               }
-       } *pHandlerGenlist;
-
        SSongLayout() {
                memset(this, 0, sizeof(SSongLayout));
-               pHandlerGenlist = new CHandlerGenlist(this);
        }
 
        ~SSongLayout() {
-               delete pHandlerGenlist;
        }
 };
 
@@ -407,21 +156,184 @@ void CSongLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj)
 }
 
 
-void CSongLayout::sm_CbSelectItem(void *cookie)
+void CSongLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
 {
-       CSongLayout *root = (CSongLayout *)cookie;
+       CSongLayout *root = (CSongLayout *)dt;
 
        if (root)
-               root->m_OnSelectItem();
+               root->m_OnCtxtUpdate(type, lid);
 }
 
 
-void CSongLayout::m_OnSelectItem(void)
+void CSongLayout::m_OnCtxtUpdate(EActionType type, int lid)
 {
+       Eina_List *list = NULL;
+       EAddType mode;
+
+       if (!m->ctxtinfo || !m->ctxtinfo->context)
+               return;
+
+       if (type == ACTION_TYPE_ADDNEXT)
+               mode = ADD_TYPE_NEXT;
+       else
+               mode = ADD_TYPE_END;
+
+       list = eina_list_append(list, m->ctxtinfo->context);
+       if (type == ACTION_TYPE_ADDTO) {
+               if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
+                       _ERR(" Adding songs to playlist failed ");
+               else
+                       _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG);
+
+               return;
+       }
+
+       m->mhandle->UpdatePlaylist(list, mode);
+       eina_list_free(list);
+
+       if (type == ACTION_TYPE_PLAY) {
+               m->mhandle->Stop();
+               m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context));
+       }
+
+       _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
+}
+
+
+void CSongLayout::sm_CbCtxtClose(void *dt)
+{
+       CSongLayout *root = (CSongLayout *)dt;
+
+       if (root)
+               root->m_OnCtxtClose();
+}
+
+
+void CSongLayout::m_OnCtxtClose(void)
+{
+       m->vmgr->PopView();
+       m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
+       elm_object_item_focus_set(m->focused_item, EINA_TRUE);
+}
+
+
+void CSongLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
+{
+       CSongLayout *root = (CSongLayout*)data;
+
+       if (root)
+               root->m_OnItemSelect(obj, event_info);
+}
+
+void CSongLayout::m_OnItemSelect(Evas_Object *obj, void *event_info)
+{
+       SSongItemInfo *itinfo = NULL;
+       char *mediaId = NULL;
+
+       itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info);
+       if (!itinfo) {
+               _ERR(" no item info found ");
+               return;
+       }
+
+       mediaId = song_info_get_media_id(itinfo->sinfo);
+
+       m->mhandle->Stop();
+       m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH);
+       m->mhandle->SetCurrentSong(mediaId);
+
        m_GotoPlayback();
 }
 
 
+SSongItemInfo *CSongLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
+{
+       Eina_List *l;
+       SSongItemInfo *itinfo = NULL;
+       void *obj = NULL;
+
+       EINA_LIST_FOREACH(list, l, obj) {
+               itinfo = (SSongItemInfo *)obj;
+               if (itinfo->item == item)
+                       return itinfo;
+       }
+
+       return NULL;
+}
+
+
+void CSongLayout::m_UpdateSongList(bool sort_flag)
+{
+       bool r;
+       struct SSongInfo *sinfo;
+       void *obj;
+       Eina_List *l;
+       struct SSongItemInfo *itinfo;
+       Elm_Object_Item *item;
+
+       /* Remove existing songlist and prepare afresh */
+       m_EmptySongList(sort_flag);
+
+       if (!sort_flag) {
+               r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist));
+               if (r == false || eina_list_count(m->slist) == 0) {
+                       _ERR(" Fetching song list from media failed ");
+
+                       m->parent->SetEmptyStatus(true);
+                       return;
+               }
+       }
+
+       m_SortSongList();
+
+       EINA_LIST_FOREACH(m->slist, l, obj) {
+               sinfo = (SSongInfo *)obj;
+               itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo));
+               if (!itinfo)
+                       return;
+
+               itinfo->sinfo = sinfo;
+               item = elm_genlist_item_append(m->songlist, m->item_class,
+                       itinfo, NULL, ELM_GENLIST_ITEM_NONE,
+                       sm_CbItemSelect, this);
+               itinfo->item = item;
+               m->it_infolist = eina_list_append(m->it_infolist, itinfo);
+       }
+}
+
+void CSongLayout::m_SortSongList(void)
+{
+       int sort_type;
+
+       int(*_sort_fn[])(const void *d1, const void *d2) = {
+               sortsongs_title_az,
+               sortsongs_title_za,
+               sortsongs_artist_az,
+               sortsongs_artist_za,
+               sortsongs_album_az,
+               sortsongs_album_za
+       };
+
+       sort_type = m->mhandle->SortType();
+
+       m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]);
+}
+
+void CSongLayout::m_EmptySongList(bool sort_flag)
+{
+       if (m->songlist)
+               elm_genlist_clear(m->songlist);
+
+       if (!sort_flag) {
+               eina_list_free(m->slist);
+               m->slist = NULL;
+       }
+
+       eina_list_free(m->it_infolist);
+       m->it_infolist = NULL;
+}
+
+
 void CSongLayout::m_GotoPlayback(void)
 {
        if (!m->vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL))
@@ -463,7 +375,7 @@ void CSongLayout::m_CreateSongList(void)
        evas_object_size_hint_weight_set(genlist,
                EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        elm_object_part_content_set(Layout(), MUSIC_PART_SONGLIST, genlist);
-       m->pHandlerGenlist->Connect(genlist);
+       Connect(genlist, SONG_LAYOUT_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN);
        m->songlist = genlist;
 
        list_item = elm_genlist_item_class_new();
@@ -479,7 +391,7 @@ void CSongLayout::m_CreateSongList(void)
        list_item->func.del = sm_CbRemoveListItem;
        m->item_class = list_item;
 
-       m->pHandlerGenlist->UpdateSongList(false);
+       m_UpdateSongList(false);
 }
 
 
@@ -568,7 +480,7 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri)
 
        m_CreateSongList();
 
-       Connect(layout);
+       Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN);
 
        SParcel parcel;
        parcel.ctxtInfo = NULL;
@@ -577,11 +489,6 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri)
        parcel.keyEvent = NULL;
        m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
 
-       SSongLayout::CHandlerGenlist::SCallback cb;
-       cb.cb = &sm_CbSelectItem;
-       cb.cookie = this;
-       m->pHandlerGenlist->SetCallback(&cb);
-
        return true;
 }
 
@@ -619,7 +526,7 @@ void CSongLayout::Update(bool focusFlag)
        ASSERT(m);
 
        if (!focusFlag) {
-               m->pHandlerGenlist->UpdateSongList(true);
+               m_UpdateSongList(true);
                return;
        }
 
@@ -629,12 +536,88 @@ void CSongLayout::Update(bool focusFlag)
 
 void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
 {
-       if (!strcmp(ev->keyname, KEY_BACK)) {
-               SParcel parcel;
-               parcel.ctxtInfo = NULL;
-               parcel.updateType = E_FOCUS_UPDATE;
-               parcel.layoutId = NULL;
-               parcel.keyEvent = NULL;
-               m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
+       switch (id) {
+       case SONG_LAYOUT:
+               {
+                       if (!strcmp(ev->keyname, KEY_BACK)) {
+                               SParcel parcel;
+                               parcel.ctxtInfo = NULL;
+                               parcel.updateType = E_FOCUS_UPDATE;
+                               parcel.layoutId = NULL;
+                               parcel.keyEvent = NULL;
+                               m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
+                       }
+               }
+               break;
+
+       case SONG_LAYOUT_GENLIST:
+               {
+                       Elm_Object_Item *it = NULL;
+                       SContentInfo *ctxtinfo = NULL;
+                       SSongItemInfo *itinfo = NULL;
+
+                       if (strcmp(ev->keyname, KEY_MENU))
+                               return;
+
+                       it = elm_object_focused_item_get(obj);
+                       if (!it) {
+                               _ERR(" unable to get focused item ");
+                               return;
+                       }
+                       m->focused_item = it;
+
+                       if (m->ctxtinfo) {
+                               free(m->ctxtinfo);
+                               m->ctxtinfo = NULL;
+                       }
+
+                       ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
+                       if (!ctxtinfo)
+                               return;
+
+                       itinfo = m_FindItemInfoFromItem(m->it_infolist, it);
+                       if (!itinfo) {
+                               free(ctxtinfo);
+                               return;
+                       }
+
+                       ctxtinfo->type = CONTEXT_TYPE_SONG;
+                       ctxtinfo->context = itinfo->sinfo;
+                       ctxtinfo->cbdata = this;
+                       ctxtinfo->update = sm_CbCtxtUpdate;
+                       ctxtinfo->close = sm_CbCtxtClose;
+
+                       m->ctxtinfo = ctxtinfo;
+
+                       SParcel parcel;
+                       parcel.ctxtInfo = ctxtinfo;
+                       if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
+                               _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
+               }
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CSongLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+{
+       switch (id) {
+       case SONG_LAYOUT_GENLIST:
+               {
+                       Elm_Object_Item *item;
+
+                       item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
+                               ev->cur.canvas.y, NULL);
+
+                       if (!elm_object_item_focus_get(item))
+                               elm_object_item_focus_set(item, EINA_TRUE);
+               }
+               break;
+
+       default:
+               break;
        }
 }
\ No newline at end of file