Apply Modified Listeners 24/34724/2 accepted/tizen/tv/20150202.064041 submit/tizen_tv/20150202.061801
authorKim Tae Soo <taesoo46.kim@samsung.com>
Mon, 2 Feb 2015 02:33:58 +0000 (11:33 +0900)
committerKim Tae Soo <taesoo46.kim@samsung.com>
Mon, 2 Feb 2015 05:48:55 +0000 (14:48 +0900)
Change-Id: I7b216d149b2b5658852c33edd3b18dc6f4daa977
Signed-off-by: Kim Tae Soo <taesoo46.kim@samsung.com>
include/base-view.h
include/folder-layout.h
src/main.cpp
src/views/base-view.cpp
src/views/folder-layout.cpp

index ecd0738..52f7985 100644 (file)
 #define __MUSIC_BASE_VIEW_H__
 
 
-struct _arg_list {
+struct SArgList {
        char *album_id;
        char *uri;
        char *source;
 };
 
 
-class CMusicBaseView : public CBaseView, public CListenerMgr, public IKeyDownListener, public IKeyUpListener,
-       IMusicControllerListener
+class CMusicBaseView : public CBaseView, public CListenerMgr,
+       public IKeyDownListener, public IKeyUpListener,
+       public IMouseMoveListener, public IMouseClickedListener,
+       public IMusicControllerListener
 {
 private:
        struct SMusicBaseView* m;
@@ -35,22 +37,27 @@ private:
        static void sm_CbHandleEmptyStatus(void *cookie, bool emptyStatus);
        void m_OnHandleEmptyStatus(bool emptyStatus);
 
+       static void sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev);
+       void m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev);
+
+       static void sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei);
+       void m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
+
 private:
        void m_UpdateFocusSequence(void);
        void m_UpdateEmptyFocusSequence(void);
 
-       static void sm_CbClickedGroupBtn(void *cookie, Evas_Object *obj);
-       void m_OnClickedGroupBtn(Evas_Object *obj);
-
-       static void sm_CbClickedCtxBtn(void *cookie, Evas_Object *obj);
-       void m_OnClickedCtxBtn(Evas_Object *obj);
-
        void m_ShowCurrentLayout(void);
+       void m_GotoPlayback(void);
 
+       static bool sm_FindIndex(const char **arr, int arrsize, const char *text, int *index);
 
-       void m_DestroyPopup(void);
+       void m_CreateCtxPopup(int btnType);
        void m_DestroyCtxPopup(void);
+
        Evas_Object *m_CreateLoadingPopup(void);
+       void m_DestroyPopup(void);
+
        void m_UpdatePlaysongLabel(void);
        void m_AddPlaysongLabel(void);
        void m_CreateTopSection(void);
@@ -66,7 +73,13 @@ protected:
        virtual void t_OnUpdate(void* data);
 
 public:
-       CMusicBaseView(const char *pViewId) : CBaseView(pViewId), IKeyDownListener(this), IKeyUpListener(this), m(0) {}
+       CMusicBaseView(const char *pViewId) :
+               CBaseView(pViewId),
+               IKeyDownListener(this),
+               IKeyUpListener(this),
+               IMouseMoveListener(this),
+               IMouseClickedListener(this),
+               m(0) {}
        virtual ~CMusicBaseView() {}
 
        virtual bool Create(void *data);
@@ -75,12 +88,13 @@ public:
        virtual Evas_Object* Base(void);
 
 public:
-
        virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
        virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev);
+       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
+       virtual void OnMouseClicked(int id, Evas_Object *obj);
 
-protected:
 
+protected:
        virtual void t_OnComplete(void);
        virtual void t_OnError(void);
        virtual void t_OnUsbConnected(void);
index 7d842bc..6b33728 100644 (file)
 struct SFolderItemInfo;
 struct folder_info;
 
-class CFolderLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener {
+class CFolderLayout : public CExtBaseLayout, public CListenerMgr,
+       public IMouseMoveListener, public IMouseClickedListener,
+       public IRealizedListener, public IUnrealizedListener,
+       public IKeyDownListener {
 private:
        struct SFolderLayout *m;
 
 private:
-       static Eina_Bool sm_CbFocusIdler(void *dt);
-       static void sm_CbGoToContextView(void *cookie, SContentInfo *contextInfo);
-       static void sm_CbUpdateGrid(void *cookie);
-       static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId);
-
        static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part);
        static char *sm_CbGetGridSongItemText(void *data, Evas_Object *obj, const char *part);
        static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part);
        static Evas_Object *sm_CbGetGridSongItemContent(void *data, Evas_Object *obj, const char *part);
        static void sm_CbRemoveGridItem(void *data, Evas_Object *obj);
 
-private:
+       static Eina_Bool sm_CbFocusIdler(void *dt);
        void m_OnFocusIdler(void);
-       void m_OnGotoPlaybackView(char *mediaId);
-       void m_OnGotoContextView(SContentInfo *contextInfo);
-       void m_OnCbUpdateGrid(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, Elm_Object_Item *it, const char *emission, const char *source);
+       void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source);
 
 private:
+       SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item);
        inline int m_ConvertToMin(int milsec);
        void m_RemoveFocusIdler(void);
        void m_GotoPlayback(int mode, char *id);
-       SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item);
        Elm_Object_Item *m_FindItemByInfo(Eina_List *list, folder_info *finfo);
        void m_SortFolderGrid(void);
        void m_CreateFolderGrid(void);
@@ -59,7 +63,14 @@ protected:
        virtual void t_OnShow(void);
 
 public:
-       CFolderLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {}
+       CFolderLayout(const char *pLayoutId) :
+               CExtBaseLayout(pLayoutId),
+               IMouseMoveListener(this),
+               IMouseClickedListener(this),
+               IRealizedListener(this),
+               IUnrealizedListener(this),
+               IKeyDownListener(this),
+               m(0) {}
        virtual ~CFolderLayout() {}
 
        bool Create(CLayoutMgr *mgr);
@@ -68,6 +79,10 @@ public:
        virtual void Update(bool focusFlag);
 
 public:
+       virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev);
+       virtual void OnMouseClicked(int id, Evas_Object *obj);
+       virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item);
+       virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item);
        virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev);
 };
 
index ee893de..ba357f7 100644 (file)
@@ -39,7 +39,7 @@ private:
 
        struct _appdata {
                Evas_Object *win;
-               struct _arg_list *arglist;
+               SArgList *arglist;
        } ad;
 
        CMusicBaseView *m_cBaseView;
@@ -147,7 +147,7 @@ public:
 
                elm_win_activate(ad.win);
                t_RemoveArglist();              
-               ad.arglist = (_arg_list *)calloc(1, sizeof(struct _arg_list));
+               ad.arglist = (SArgList *)calloc(1, sizeof(SArgList));
                if (!ad.arglist)
                        goto error;
                _DBG("");
index 07749fe..e6033e4 100644 (file)
@@ -123,6 +123,20 @@ Evas_Object *s_AddButton(Evas_Object *box)
 }
 
 
+enum EObjectType {
+       BASE_VIEW,
+       BASE_VIEW_PLAY_BUTTON,
+       BASE_VIEW_SOURCE_BUTTON,
+       BASE_VIEW_SORT_BUTTON,
+       BASE_VIEW_GROUP_SONG,
+       BASE_VIEW_GROUP_ALBUM,
+       BASE_VIEW_GROUP_ARTIST,
+       BASE_VIEW_GROUP_GENRE,
+       BASE_VIEW_GROUP_FOLDER,
+       BASE_VIEW_GROUP_PLAYLIST,
+};
+
+
 struct SMusicBaseView {
        Evas_Object *win;
        Evas_Object *base;
@@ -138,7 +152,7 @@ struct SMusicBaseView {
        Evas_Object *c_grpbtn;
        CMusicController *mhandle;
        CLayoutMgr *lmgr;
-       struct _arg_list *arglist;
+       SArgList *arglist;
        int btntype;
        bool fresh_view;
 
@@ -154,369 +168,12 @@ struct SMusicBaseView {
        CMusicBaseView *parent;
        CHandleVolume *pHandleVolume;
 
-       class CHandlerBtn : public CListenerMgr, public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener {
-       public:
-               SMusicBaseView *m;
-               void(*m_cbClicked)(void* cookie, Evas_Object *obj);
-               void *m_cookie;
-
-       public:
-               CHandlerBtn(SMusicBaseView *ins) : IKeyDownListener(this), IMouseMoveListener(this), IMouseClickedListener(this) { m = ins; }
-
-               void SetCallback(void(*clicked)(void* cookie, Evas_Object *obj), void* cookie) {
-                       m_cbClicked = clicked;
-                       m_cookie = cookie;
-               }
-
-               virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
-                       if (!elm_object_focus_get(obj))
-                               elm_object_focus_set(obj, EINA_TRUE);
-               }
-       };
-
-       class CHandlerBtnGroup : public CHandlerBtn {
-       public:
-               CHandlerBtnGroup(SMusicBaseView *ins) : CHandlerBtn(ins) {}
-
-               virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
-                       if (!strcmp(ev->keyname, KEY_BACK)) {
-                               m->mhandle->Stop();
-                               elm_exit();
-                       }
-               }
-
-               virtual void OnMouseClicked(int id, Evas_Object *obj) {
-                       if (m->c_grpbtn == obj)
-                               return;
-
-                       elm_object_signal_emit(m->c_grpbtn,
-                               MUSIC_SIGNAL_GROUP_UNSELECTED, MUSIC_BASE_VIEW);
-                       m->c_grpbtn = obj;
-                       elm_object_signal_emit(m->c_grpbtn,
-                               MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW);
-
-                       if (obj == m->group_btn[GRP_FOLDER])
-                               elm_object_text_set(m->sortbtn, _(g_sortTextFolder[0]));
-                       else if (obj == m->group_btn[GRP_PLAYLISTS])
-                               elm_object_text_set(m->sortbtn, _(g_sortTextPlaylists[0]));
-                       else if (obj == m->group_btn[GRP_ALBUM])
-                               elm_object_text_set(m->sortbtn, _(g_sortTextAlbum[0]));
-                       else if (obj == m->group_btn[GRP_ARTIST])
-                               elm_object_text_set(m->sortbtn, _(g_sortTextArtist[0]));
-                       else if (obj == m->group_btn[GRP_GENRE])
-                               elm_object_text_set(m->sortbtn, _(g_sortTextGenre[0]));
-                       else
-                               elm_object_text_set(m->sortbtn, _(g_sortText[0]));
-
-                       m->mhandle->SetSortType(0);
-
-                       if (m_cbClicked)
-                               m_cbClicked(m_cookie, obj);
-               }
-       }  *pHandlerBtnGroup[TOTAL_GROUP_BTNS];
-
-       class CHandlerBtnPlayback : public CHandlerBtn {
-       private:
-               void m_GotoPlayback(void)
-               {
-                       if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL))
-                               _ERR(" viewmgr  push view  MUSIC_PLAYBACK_VIEW failed ");
-               }
-
-       public:
-               CHandlerBtnPlayback(SMusicBaseView *ins) : CHandlerBtn(ins) {}
-
-               virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
-                       if (!strcmp(ev->keyname, KEY_BACK))
-                               elm_object_focus_set(m->c_grpbtn, EINA_TRUE);
-               }
-
-               virtual void OnMouseClicked(int id, Evas_Object *obj) {
-                       Eina_List *list = NULL;
-                       bool r;
-                       int state;
-
-                       state = m->mhandle->PlayState();
-
-                       if (state != PLAY_STATUS_INITIAL) {
-                               if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL))
-                                       _ERR(" viewmgr  push view failed ");
-
-                               return;
-                       }
-
-                       r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &list);
-                       if (r == false || eina_list_count(list) == 0) {
-                               _ERR(" No songs ");
-                               return;
-                       }
-
-                       m->mhandle->Stop();
-                       m->mhandle->UpdatePlaylist(list, ADD_TYPE_FRESH);
-                       eina_list_free(list);
-
-                       m_GotoPlayback();
-               }
-       }  *pHandlerBtnPlayback;
-
-       class CHandlerBtnCtxpopup : public CHandlerBtn {
-       private:
-               ETopBtnType m_type;
-
-       public:
-               CHandlerBtnCtxpopup(SMusicBaseView *ins, ETopBtnType type) : CHandlerBtn(ins) { m_type = type; }
-
-       private:
-               static void sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev)
-               {
-                       CHandlerBtnCtxpopup *root = (CHandlerBtnCtxpopup*)dt;
-                       if (root)
-                               root->m_CbCtxPopupBtnClicked(obj, ev);
-               }
-
-               void m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev)
-               {
-                       const char *text = NULL;
-                       const char *layout_id = NULL;
-                       int size = 0;
-                       int type = 0;
-
-                       text = elm_object_text_get(obj);
-
-                       if (m->btntype == TOP_BTN_TYPE_SOURCE) {
-                               size = ARRAY_SIZE(g_sourceText);
-                               st_FindIndex(g_sourceText, size, text, &type);
-                               DestroyCtxPopup();
-                               if (type == m->mhandle->SourceType())
-                                       return;
-
-                               m->mhandle->SetSourceType(type);
-                               elm_object_text_set(m->srcbtn, _(text));
-                       }
-                       else {
-                               layout_id = m->lmgr->Layout()->LayoutId();
-                               if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) {
-                                       size = ARRAY_SIZE(g_sortTextFolder);
-                                       st_FindIndex(g_sortTextFolder, size, text, &type);
-                               }
-                               else if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) {
-                                       size = ARRAY_SIZE(g_sortTextAlbum);
-                                       st_FindIndex(g_sortTextAlbum, size, text, &type);
-                               }
-                               else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) {
-                                       size = ARRAY_SIZE(g_sortTextPlaylists);
-                                       st_FindIndex(g_sortTextPlaylists, size, text, &type);
-                               }
-                               else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) {
-                                       size = ARRAY_SIZE(g_sortTextArtist);
-                                       st_FindIndex(g_sortTextArtist, size, text, &type);
-                               }
-                               else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) {
-                                       size = ARRAY_SIZE(g_sortTextGenre);
-                                       st_FindIndex(g_sortTextGenre, size, text, &type);
-                               }
-                               else {
-                                       size = ARRAY_SIZE(g_sortText);
-                                       st_FindIndex(g_sortText, size, text, &type);
-                               }
-                               DestroyCtxPopup();
-                               if (type == m->mhandle->SortType())
-                                       return;
-
-                               m->mhandle->SetSortType(type);
-                               elm_object_text_set(m->sortbtn, _(text));
-                       }
-
-                       if (m_cbClicked)
-                               m_cbClicked(m_cookie, obj);
-               }
-
-               static void sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei)
-               {
-                       CHandlerBtnCtxpopup *root = (CHandlerBtnCtxpopup*)dt;
-                       if (root)
-                               root->m_OnCtxPopupBtnKeyPressed(e, obj, (Evas_Event_Key_Down*)ei);
-               }
-
-               void m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
-               {
-                       if (strcmp(ev->keyname, KEY_BACK) == 0)
-                               DestroyCtxPopup();
-               }
-
-       protected:
-               static bool st_FindIndex(const char **arr, int arrsize, const char *text, int *index)
-               {
-                       int i;
-
-                       if (!arr || !arrsize || !text)
-                               return false;
-
-                       for (i = 0; i < arrsize; i++) {
-                               if (arr[i] && !strcmp(arr[i], text)) {
-                                       *index = i;
-                                       return true;
-                               }
-                       }
-
-                       return false;
-               }
-
-               void t_CreateCtxPopup(int btnType)
-               {
-                       Evas_Object *ctxpopup = NULL, *box = NULL, *btn = NULL;
-                       Evas_Object *firstbtn = NULL;
-                       int i, size, selected_index;
-                       const char **arr;
-                       const char *layout_id = NULL;
-                       const char *part = NULL;
-
-                       if (!m->base)
-                               return;
-
-                       ctxpopup = elm_ctxpopup_add(m->base);
-                       if (!ctxpopup)
-                               return;
-
-                       box = elm_box_add(ctxpopup);
-                       if (!box) {
-                               evas_object_del(ctxpopup);
-                               return;
-                       }
-                       evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
-                       evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
-
-                       if (btnType == TOP_BTN_TYPE_SOURCE) {
-                               arr = g_sourceText;
-                               size = ARRAY_SIZE(g_sourceText);
-                               selected_index = m->mhandle->SourceType();
-                               m->btntype = btnType;
-                               part = MUSIC_PART_SOURCE_POPUP;
-                       }
-                       else if (btnType == TOP_BTN_TYPE_SORT) {
-                               arr = g_sortText;
-                               size = ARRAY_SIZE(g_sortText);
-                               layout_id = m->lmgr->Layout()->LayoutId();
-                               if (layout_id) {
-                                       if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) {
-                                               arr = g_sortTextAlbum;
-                                               size = ARRAY_SIZE(g_sortTextAlbum);
-                                       }
-                                       else if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) {
-                                               arr = g_sortTextFolder;
-                                               size = ARRAY_SIZE(g_sortTextFolder);
-                                       }
-                                       else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) {
-                                               arr = g_sortTextPlaylists;
-                                               size = ARRAY_SIZE(g_sortTextPlaylists);
-                                       }
-                                       else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) {
-                                               arr = g_sortTextArtist;
-                                               size = ARRAY_SIZE(g_sortTextArtist);
-                                       }
-                                       else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) {
-                                               arr = g_sortTextGenre;
-                                               size = ARRAY_SIZE(g_sortTextGenre);
-                                       }
-                               }
-                               part = MUSIC_PART_SORT_POPUP;
-                               selected_index = m->mhandle->SortType();
-                               m->btntype = btnType;
-                       }
-                       else {
-                               evas_object_del(ctxpopup);
-                               return;
-                       }
-
-                       for (i = 0; i < size; i++) {
-                               if (btnType == TOP_BTN_TYPE_SOURCE && i == SOURCE_TYPE_USB &&
-                                       !m->mhandle->CheckUsb())
-                                       continue;
-
-                               btn = s_AddButton(box);
-                               if (!btn) {
-                                       evas_object_del(ctxpopup);
-                                       return;
-                               }
-                               elm_object_style_set(btn, MUSIC_STYLE_HOVER_ENTRY);
-                               elm_object_text_set(btn, _(arr[i]));
-                               elm_box_pack_end(box, btn);
-
-                               if (i == 0)
-                                       firstbtn = btn; /* to set focus later */
-
-                               if (i == selected_index)
-                                       elm_object_signal_emit(btn,
-                                       "elm,action,highlight", "elm");
-
-                               if (i == size - 1) {
-                                       elm_object_signal_emit(btn,
-                                               "elm,action,hideline", "elm");
-                                       _ERR("hiding last line");
-                               }
-
-                               evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbCtxPopupBtnClicked, this);
-                               evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m);
-                               evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbCtxPopupBtnKeyPressed, this);
-                       }
-
-                       elm_object_content_set(ctxpopup, box);
-                       elm_object_style_set(ctxpopup, MUSIC_STYLE_HOVER_CTXPOPUP);
-                       elm_ctxpopup_direction_priority_set(ctxpopup,
-                               ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN);
-                       elm_object_part_content_set(m->base, part, ctxpopup);
-
-                       m->ctxpopup = ctxpopup;
-
-                       if (firstbtn && btn) {
-                               elm_object_focus_set(firstbtn, EINA_TRUE);
-                               elm_object_focus_next_object_set(firstbtn,
-                                       btn, ELM_FOCUS_UP);
-                               elm_object_focus_next_object_set(btn,
-                                       firstbtn, ELM_FOCUS_DOWN);
-                       }
-               }
-       public:
-               void DestroyCtxPopup(void)
-               {
-                       if (!m->ctxpopup)
-                               return;
-
-                       evas_object_hide(m->ctxpopup);
-                       evas_object_del(m->ctxpopup);
-                       m->ctxpopup = NULL;
-               }
-
-       public:
-               virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
-                       if (!strcmp(ev->keyname, KEY_BACK))
-                               elm_object_focus_set(m->c_grpbtn, EINA_TRUE);
-               }
-
-               virtual void OnMouseClicked(int id, Evas_Object *obj) {
-                       t_CreateCtxPopup(m_type);
-               }
-       }  *pHandlerBtnSource, *pHandlerBtnSort;
-
-
        SMusicBaseView() {
                memset(this, 0, sizeof(SMusicBaseView));
-               for (int a = 0; a < TOTAL_GROUP_BTNS; a++)
-                       pHandlerBtnGroup[a] = new CHandlerBtnGroup(this);
-
-               pHandlerBtnPlayback = new CHandlerBtnPlayback(this);
-               pHandlerBtnSource = new CHandlerBtnCtxpopup(this, TOP_BTN_TYPE_SOURCE);
-               pHandlerBtnSort = new CHandlerBtnCtxpopup(this, TOP_BTN_TYPE_SORT);
                pHandleVolume = new CHandleVolume;
        }
        ~SMusicBaseView() {
                delete pHandleVolume;
-               delete pHandlerBtnSort;
-               delete pHandlerBtnSource;
-               delete pHandlerBtnPlayback;
-
-               for (int a = 0; a < TOTAL_GROUP_BTNS; a++)
-                       delete pHandlerBtnGroup[a];
        }
 };
 
@@ -525,9 +182,6 @@ struct SBtnInfo {
        const char *part;
        const char *style;
        const char *icon_path;
-
-       SMusicBaseView::CHandlerBtn *handler;
-       //Evas_Smart_Cb cb;
 };
 
 
@@ -586,39 +240,6 @@ void CMusicBaseView::m_UpdateEmptyFocusSequence(void)
 }
 
 
-void CMusicBaseView::sm_CbClickedGroupBtn(void *cookie, Evas_Object *obj)
-{
-       CMusicBaseView *root = (CMusicBaseView*)cookie;
-       if (root)
-               root->m_OnClickedGroupBtn(obj);
-}
-
-
-void CMusicBaseView::m_OnClickedGroupBtn(Evas_Object *obj)
-{
-       m_ShowCurrentLayout();
-}
-
-
-void CMusicBaseView::sm_CbClickedCtxBtn(void *cookie, Evas_Object *obj)
-{
-       CMusicBaseView *root = (CMusicBaseView*)cookie;
-       if (root)
-               root->m_OnClickedCtxBtn(obj);
-}
-
-
-void CMusicBaseView::m_OnClickedCtxBtn(Evas_Object *obj)
-{
-       if (m->btntype == TOP_BTN_TYPE_SOURCE) {
-               if (m->c_grpbtn != m->group_btn[GRP_PLAYLISTS])
-                       m_ShowCurrentLayout();
-       }
-       else
-               m_UpdateCurrentLayout(false);
-}
-
-
 void CMusicBaseView::m_ShowCurrentLayout(void)
 {
        const char *layoutId = NULL;
@@ -663,24 +284,241 @@ void CMusicBaseView::m_ShowCurrentLayout(void)
 }
 
 
-void CMusicBaseView::m_DestroyPopup(void)
+void CMusicBaseView::m_GotoPlayback(void)
 {
-       if (!m->popup)
+       if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL))
+               _ERR(" viewmgr  push view  MUSIC_PLAYBACK_VIEW failed ");
+}
+
+
+bool CMusicBaseView::sm_FindIndex(const char **arr, int arrsize, const char *text, int *index)
+{
+       int i;
+
+       if (!arr || !arrsize || !text)
+               return false;
+
+       for (i = 0; i < arrsize; i++) {
+               if (arr[i] && !strcmp(arr[i], text)) {
+                       *index = i;
+                       return true;
+               }
+       }
+
+       return false;
+}
+
+
+void CMusicBaseView::m_CreateCtxPopup(int btnType)
+{
+       Evas_Object *ctxpopup = NULL, *box = NULL, *btn = NULL;
+       Evas_Object *firstbtn = NULL;
+       int i, size, selected_index;
+       const char **arr;
+       const char *layout_id = NULL;
+       const char *part = NULL;
+
+       if (!m->base)
                return;
 
-       if (m->transit) {
-               elm_transit_del(m->transit);
-               m->transit = NULL;
+       ctxpopup = elm_ctxpopup_add(m->base);
+       if (!ctxpopup)
+               return;
+
+       box = elm_box_add(ctxpopup);
+       if (!box) {
+               evas_object_del(ctxpopup);
+               return;
+       }
+       evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0);
+       evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
+
+       if (btnType == TOP_BTN_TYPE_SOURCE) {
+               arr = g_sourceText;
+               size = ARRAY_SIZE(g_sourceText);
+               selected_index = m->mhandle->SourceType();
+               m->btntype = btnType;
+               part = MUSIC_PART_SOURCE_POPUP;
+       }
+       else if (btnType == TOP_BTN_TYPE_SORT) {
+               arr = g_sortText;
+               size = ARRAY_SIZE(g_sortText);
+               layout_id = m->lmgr->Layout()->LayoutId();
+               if (layout_id) {
+                       if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) {
+                               arr = g_sortTextAlbum;
+                               size = ARRAY_SIZE(g_sortTextAlbum);
+                       }
+                       else if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) {
+                               arr = g_sortTextFolder;
+                               size = ARRAY_SIZE(g_sortTextFolder);
+                       }
+                       else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) {
+                               arr = g_sortTextPlaylists;
+                               size = ARRAY_SIZE(g_sortTextPlaylists);
+                       }
+                       else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) {
+                               arr = g_sortTextArtist;
+                               size = ARRAY_SIZE(g_sortTextArtist);
+                       }
+                       else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) {
+                               arr = g_sortTextGenre;
+                               size = ARRAY_SIZE(g_sortTextGenre);
+                       }
+               }
+               part = MUSIC_PART_SORT_POPUP;
+               selected_index = m->mhandle->SortType();
+               m->btntype = btnType;
+       }
+       else {
+               evas_object_del(ctxpopup);
+               return;
+       }
+
+       for (i = 0; i < size; i++) {
+               if (btnType == TOP_BTN_TYPE_SOURCE && i == SOURCE_TYPE_USB &&
+                       !m->mhandle->CheckUsb())
+                       continue;
+
+               btn = s_AddButton(box);
+               if (!btn) {
+                       evas_object_del(ctxpopup);
+                       return;
+               }
+               elm_object_style_set(btn, MUSIC_STYLE_HOVER_ENTRY);
+               elm_object_text_set(btn, _(arr[i]));
+               elm_box_pack_end(box, btn);
+
+               if (i == 0)
+                       firstbtn = btn; /* to set focus later */
+
+               if (i == selected_index)
+                       elm_object_signal_emit(btn,
+                       "elm,action,highlight", "elm");
+
+               if (i == size - 1) {
+                       elm_object_signal_emit(btn,
+                               "elm,action,hideline", "elm");
+                       _ERR("hiding last line");
+               }
+
+               evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbCtxPopupBtnClicked, this);
+               evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m);
+               evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbCtxPopupBtnKeyPressed, this);
+       }
+
+       elm_object_content_set(ctxpopup, box);
+       elm_object_style_set(ctxpopup, MUSIC_STYLE_HOVER_CTXPOPUP);
+       elm_ctxpopup_direction_priority_set(ctxpopup,
+               ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN);
+       elm_object_part_content_set(m->base, part, ctxpopup);
+
+       m->ctxpopup = ctxpopup;
+
+       if (firstbtn && btn) {
+               elm_object_focus_set(firstbtn, EINA_TRUE);
+               elm_object_focus_next_object_set(firstbtn,
+                       btn, ELM_FOCUS_UP);
+               elm_object_focus_next_object_set(btn,
+                       firstbtn, ELM_FOCUS_DOWN);
        }
-       evas_object_del(m->popup);
-       m->popup = NULL;
 }
 
 
 void CMusicBaseView::m_DestroyCtxPopup(void)
 {
-       m->pHandlerBtnSource->DestroyCtxPopup();
-       m->pHandlerBtnSort->DestroyCtxPopup();
+       if (!m->ctxpopup)
+               return;
+
+       evas_object_hide(m->ctxpopup);
+       evas_object_del(m->ctxpopup);
+       m->ctxpopup = NULL;
+}
+
+
+void CMusicBaseView::sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev)
+{
+       CMusicBaseView *root = (CMusicBaseView*)dt;
+       if (root)
+               root->m_CbCtxPopupBtnClicked(obj, ev);
+}
+
+
+void CMusicBaseView::m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev)
+{
+       const char *text = NULL;
+       const char *layout_id = NULL;
+       int size = 0;
+       int type = 0;
+
+       text = elm_object_text_get(obj);
+
+       if (m->btntype == TOP_BTN_TYPE_SOURCE) {
+               size = ARRAY_SIZE(g_sourceText);
+               sm_FindIndex(g_sourceText, size, text, &type);
+               m_DestroyCtxPopup();
+               if (type == m->mhandle->SourceType())
+                       return;
+
+               m->mhandle->SetSourceType(type);
+               elm_object_text_set(m->srcbtn, _(text));
+       }
+       else {
+               layout_id = m->lmgr->Layout()->LayoutId();
+               if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) {
+                       size = ARRAY_SIZE(g_sortTextFolder);
+                       sm_FindIndex(g_sortTextFolder, size, text, &type);
+               }
+               else if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) {
+                       size = ARRAY_SIZE(g_sortTextAlbum);
+                       sm_FindIndex(g_sortTextAlbum, size, text, &type);
+               }
+               else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) {
+                       size = ARRAY_SIZE(g_sortTextPlaylists);
+                       sm_FindIndex(g_sortTextPlaylists, size, text, &type);
+               }
+               else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) {
+                       size = ARRAY_SIZE(g_sortTextArtist);
+                       sm_FindIndex(g_sortTextArtist, size, text, &type);
+               }
+               else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) {
+                       size = ARRAY_SIZE(g_sortTextGenre);
+                       sm_FindIndex(g_sortTextGenre, size, text, &type);
+               }
+               else {
+                       size = ARRAY_SIZE(g_sortText);
+                       sm_FindIndex(g_sortText, size, text, &type);
+               }
+               m_DestroyCtxPopup();
+               if (type == m->mhandle->SortType())
+                       return;
+
+               m->mhandle->SetSortType(type);
+               elm_object_text_set(m->sortbtn, _(text));
+       }
+
+       if (m->btntype == TOP_BTN_TYPE_SOURCE) {
+               if (m->c_grpbtn != m->group_btn[GRP_PLAYLISTS])
+                       m_ShowCurrentLayout();
+       }
+       else {
+               m_UpdateCurrentLayout(false);
+       }
+}
+
+
+void CMusicBaseView::sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei)
+{
+       CMusicBaseView *root = (CMusicBaseView*)dt;
+       if (root)
+               root->m_OnCtxPopupBtnKeyPressed(e, obj, (Evas_Event_Key_Down*)ei);
+}
+
+
+void CMusicBaseView::m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
+{
+       if (strcmp(ev->keyname, KEY_BACK) == 0)
+               m_DestroyCtxPopup();
 }
 
 
@@ -740,6 +578,20 @@ Evas_Object *CMusicBaseView::m_CreateLoadingPopup(void)
 }
 
 
+void CMusicBaseView::m_DestroyPopup(void)
+{
+       if (!m->popup)
+               return;
+
+       if (m->transit) {
+               elm_transit_del(m->transit);
+               m->transit = NULL;
+       }
+       evas_object_del(m->popup);
+       m->popup = NULL;
+}
+
+
 void CMusicBaseView::m_UpdatePlaysongLabel(void)
 {
        SSongInfo *sinfo = NULL;
@@ -796,19 +648,16 @@ void CMusicBaseView::m_CreateTopSection(void)
        int type;
        int i;
        Evas_Object *btn = NULL;
-       static struct SBtnInfo btninfo[TOTAL_TOP_BTNS];
+       SBtnInfo btninfo[TOTAL_TOP_BTNS];
 
        btninfo[TOP_BTN_TYPE_PLAYBACK].part = MUSIC_PART_PLAYBACK_BTN;
        btninfo[TOP_BTN_TYPE_PLAYBACK].style = MUSIC_STYLE_PLAYBACK_BTN;
-       btninfo[TOP_BTN_TYPE_PLAYBACK].handler = m->pHandlerBtnPlayback;// cb = sm_CbPlaybackBtnClicked;
 
        btninfo[TOP_BTN_TYPE_SOURCE].part = MUSIC_PART_SOURCE_HOVERSEL;
        btninfo[TOP_BTN_TYPE_SOURCE].style = MUSIC_STYLE_SOURCE_BTN;
-       btninfo[TOP_BTN_TYPE_SOURCE].handler = m->pHandlerBtnSource;// cb = sm_CbSourceBtnClicked;
 
        btninfo[TOP_BTN_TYPE_SORT].part = MUSIC_PART_SORT_HOVERSEL;
        btninfo[TOP_BTN_TYPE_SORT].style = MUSIC_STYLE_SORT_BTN;
-       btninfo[TOP_BTN_TYPE_SORT].handler = m->pHandlerBtnSort;// cb = sm_CbSortBtnClicked;
 
        elm_object_part_text_set(m->base, MUSIC_PART_TITLE,
                _(MUSIC_TEXT_TITLE));
@@ -825,10 +674,7 @@ void CMusicBaseView::m_CreateTopSection(void)
                elm_object_style_set(btn, btninfo[i].style);
                elm_object_part_content_set(m->base, btninfo[i].part, btn);
 
-               btninfo[i].handler->Connect(btn);
-               //evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m);
-               ////evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbTopBtnKeyPressed, m);
-               //evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m);
+               Connect(btn, BASE_VIEW_PLAY_BUTTON + i, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED);
 
                if (i == TOP_BTN_TYPE_PLAYBACK)
                        m->plbackbtn = btn;
@@ -886,8 +732,7 @@ void CMusicBaseView::m_CreateLeftSection(void)
                elm_object_style_set(m->group_btn[i], MUSIC_STYLE_GROUPBTN);
                elm_object_text_set(m->group_btn[i], _(btninfo[i].txt));
 
-               m->pHandlerBtnGroup[i]->Connect(m->group_btn[i]);
-               m->pHandlerBtnGroup[i]->SetCallback(sm_CbClickedGroupBtn, this);
+               Connect(m->group_btn[i], BASE_VIEW_GROUP_SONG + i, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED);
 
                ic = elm_image_add(m->group_btn[i]);
                if (ic) {
@@ -1000,7 +845,7 @@ bool CMusicBaseView::Create(void *data)
        m->mhandle = mhandle;
        m->lmgr = lmgr;
        m->fresh_view = true;
-       m->arglist = (_arg_list *)data;
+       m->arglist = (SArgList *)data;
        m->parent = this;
 
        m->layoutSong = new CSongLayout(MUSIC_SONG_LAYOUT);
@@ -1044,18 +889,9 @@ bool CMusicBaseView::Create(void *data)
        m->pHandleVolume->Create(m->base);
        m_UpdateFocusSequence();
 
-       Connect(m->base);
-
-       for (int i = 0; i < TOTAL_GROUP_BTNS; i++) {
-               m->pHandlerBtnGroup[i]->SetCallback(sm_CbClickedGroupBtn, this);
-       }
-       m->pHandlerBtnSort->SetCallback(sm_CbClickedCtxBtn, this);
-       m->pHandlerBtnSource->SetCallback(sm_CbClickedCtxBtn, this);
+       Connect(m->base, BASE_VIEW, TYPE_KEY_DOWN | TYPE_KEY_UP);
 
        mhandle->AddListener(this);
-       //m->cbinfo[E_SONG_COMPLETE] = mhandle->AddCallback(E_SONG_COMPLETE, sm_CbUpdatePlaysongLabel, this);
-       //m->cbinfo[E_CONTENT_UPDATE] = mhandle->AddCallback(E_CONTENT_UPDATE, sm_CbContentUpdate, this);
-       //m->cbinfo[E_USB_CONNECT] = mhandle->AddCallback(E_USB_CONNECT, sm_CbUsbConnect, this);
 
        return true;
 }
@@ -1066,9 +902,6 @@ void CMusicBaseView::Destroy(void)
        ASSERT(m);
 
        m->mhandle->RemoveListener(this);
-       //m->mhandle->RemoveCallback(m->cbinfo[E_SONG_COMPLETE]);
-       //m->mhandle->RemoveCallback(m->cbinfo[E_CONTENT_UPDATE]);
-       //m->mhandle->RemoveCallback(m->cbinfo[E_USB_CONNECT]);
 
        m->pHandleVolume->Destroy();
 
@@ -1191,46 +1024,182 @@ void CMusicBaseView::t_OnHide(void)
 
 void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
 {
-       if (!strcmp(ev->keyname, KEY_EXIT)) {
-               m->mhandle->Stop();
-               elm_exit();
+       switch (id) {
+       case BASE_VIEW:
+               if (!strcmp(ev->keyname, KEY_EXIT)) {
+                       m->mhandle->Stop();
+                       elm_exit();
+               }
+               else if (!strcmp(ev->keyname, KEY_ENTER)) {
+                       if (elm_object_focus_get(m->c_grpbtn)) {
+                               m_UpdateCurrentLayout(true);
+                       }
+               }
+               else if (!strcmp(ev->keyname, KEY_VOLUMEUP))
+                       m->pHandleVolume->Up();
+               else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN))
+                       m->pHandleVolume->Down();
+               else if (!strcmp(ev->keyname, KEY_MUTE))
+                       m->pHandleVolume->Mute();
+               else if (!strcmp(ev->keyname, KEY_NEXT) ||
+                       !strcmp(ev->keyname, KEY_PREVIOUS) ||
+                       !strcmp(ev->keyname, KEY_PLAY) ||
+                       !strcmp(ev->keyname, KEY_PAUSE)) {
+                       SParcel parcel;
+                       parcel.ctxtInfo = NULL;
+                       parcel.updateType = E_KEY_PRESS;
+                       parcel.layoutId = NULL;
+                       parcel.keyEvent = ev->keyname;
+                       CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel);
+               }
+               break;
+
+       case BASE_VIEW_PLAY_BUTTON:
+       case BASE_VIEW_SORT_BUTTON:
+       case BASE_VIEW_SOURCE_BUTTON:
+               if (!strcmp(ev->keyname, KEY_BACK))
+                       elm_object_focus_set(m->c_grpbtn, EINA_TRUE);
+               break;
+
+       case BASE_VIEW_GROUP_SONG:
+       case BASE_VIEW_GROUP_ALBUM:
+       case BASE_VIEW_GROUP_ARTIST:
+       case BASE_VIEW_GROUP_GENRE:
+       case BASE_VIEW_GROUP_FOLDER:
+       case BASE_VIEW_GROUP_PLAYLIST:
+               if (!strcmp(ev->keyname, KEY_BACK)) {
+                       m->mhandle->Stop();
+                       elm_exit();
+               }
+               break;
+
+       default:
+               break;
        }
-       else if (!strcmp(ev->keyname, KEY_ENTER)) {
-               if (elm_object_focus_get(m->c_grpbtn)) {
-                       m_UpdateCurrentLayout(true);
+}
+
+
+void CMusicBaseView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
+{
+       switch (id) {
+       case BASE_VIEW:
+               if (!strcmp(ev->keyname, KEY_NEXT) ||
+                       !strcmp(ev->keyname, KEY_PREVIOUS)) {
+                       SParcel parcel;
+                       parcel.ctxtInfo = NULL;
+                       parcel.updateType = E_KEY_RELEASE;
+                       parcel.layoutId = NULL;
+                       parcel.keyEvent = ev->keyname;
+                       CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel);
+                       m_UpdatePlaysongLabel();
                }
+               break;
+
+       default:
+               break;
        }
-       else if (!strcmp(ev->keyname, KEY_VOLUMEUP))
-               m->pHandleVolume->Up(); //m_HandleVolumeKey(SOUND_UP);
-       else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN))
-               m->pHandleVolume->Down();// m_HandleVolumeKey(SOUND_DOWN);
-       else if (!strcmp(ev->keyname, KEY_MUTE))
-               m->pHandleVolume->Mute();// m_HandleVolumeKey(SOUND_MUTE);
-       else if (!strcmp(ev->keyname, KEY_NEXT) ||
-               !strcmp(ev->keyname, KEY_PREVIOUS) ||
-               !strcmp(ev->keyname, KEY_PLAY) ||
-               !strcmp(ev->keyname, KEY_PAUSE)) {
-               SParcel parcel;
-               parcel.ctxtInfo = NULL;
-               parcel.updateType = E_KEY_PRESS;
-               parcel.layoutId = NULL;
-               parcel.keyEvent = ev->keyname;
-               CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel);
+}
+
+
+void CMusicBaseView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+{
+       switch (id) {
+       case BASE_VIEW_PLAY_BUTTON:
+       case BASE_VIEW_SORT_BUTTON:
+       case BASE_VIEW_SOURCE_BUTTON:
+       case BASE_VIEW_GROUP_SONG:
+       case BASE_VIEW_GROUP_ALBUM:
+       case BASE_VIEW_GROUP_ARTIST:
+       case BASE_VIEW_GROUP_GENRE:
+       case BASE_VIEW_GROUP_FOLDER:
+       case BASE_VIEW_GROUP_PLAYLIST:
+               if (!elm_object_focus_get(obj))
+                       elm_object_focus_set(obj, EINA_TRUE);
+               break;
+
+       default:
+               break;
        }
 }
 
 
-void CMusicBaseView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
+void CMusicBaseView::OnMouseClicked(int id, Evas_Object *obj)
 {
-       if (!strcmp(ev->keyname, KEY_NEXT) ||
-               !strcmp(ev->keyname, KEY_PREVIOUS)) {
-               SParcel parcel;
-               parcel.ctxtInfo = NULL;
-               parcel.updateType = E_KEY_RELEASE;
-               parcel.layoutId = NULL;
-               parcel.keyEvent = ev->keyname;
-               CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel);
-               m_UpdatePlaysongLabel();
+       switch (id) {
+       case BASE_VIEW_PLAY_BUTTON:
+               {
+                       Eina_List *list = NULL;
+                       bool r;
+                       int state;
+
+                       state = m->mhandle->PlayState();
+
+                       if (state != PLAY_STATUS_INITIAL) {
+                               if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL))
+                                       _ERR(" viewmgr  push view failed ");
+
+                               return;
+                       }
+
+                       r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &list);
+                       if (r == false || eina_list_count(list) == 0) {
+                               _ERR(" No songs ");
+                               return;
+                       }
+
+                       m->mhandle->Stop();
+                       m->mhandle->UpdatePlaylist(list, ADD_TYPE_FRESH);
+                       eina_list_free(list);
+
+                       m_GotoPlayback();
+               }
+               break;
+
+       case BASE_VIEW_SOURCE_BUTTON:
+               m_CreateCtxPopup(TOP_BTN_TYPE_SOURCE);
+               break;
+
+       case BASE_VIEW_SORT_BUTTON:
+               m_CreateCtxPopup(TOP_BTN_TYPE_SORT);
+               break;
+
+       case BASE_VIEW_GROUP_SONG:
+       case BASE_VIEW_GROUP_ALBUM:
+       case BASE_VIEW_GROUP_ARTIST:
+       case BASE_VIEW_GROUP_GENRE:
+       case BASE_VIEW_GROUP_FOLDER:
+       case BASE_VIEW_GROUP_PLAYLIST:
+               {
+                       if (m->c_grpbtn == obj)
+                       return;
+
+                       elm_object_signal_emit(m->c_grpbtn,
+                               MUSIC_SIGNAL_GROUP_UNSELECTED, MUSIC_BASE_VIEW);
+                       m->c_grpbtn = obj;
+                       elm_object_signal_emit(m->c_grpbtn,
+                               MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW);
+
+                       if (obj == m->group_btn[GRP_FOLDER])
+                               elm_object_text_set(m->sortbtn, _(g_sortTextFolder[0]));
+                       else if (obj == m->group_btn[GRP_PLAYLISTS])
+                               elm_object_text_set(m->sortbtn, _(g_sortTextPlaylists[0]));
+                       else if (obj == m->group_btn[GRP_ALBUM])
+                               elm_object_text_set(m->sortbtn, _(g_sortTextAlbum[0]));
+                       else if (obj == m->group_btn[GRP_ARTIST])
+                               elm_object_text_set(m->sortbtn, _(g_sortTextArtist[0]));
+                       else if (obj == m->group_btn[GRP_GENRE])
+                               elm_object_text_set(m->sortbtn, _(g_sortTextGenre[0]));
+                       else
+                               elm_object_text_set(m->sortbtn, _(g_sortText[0]));
+
+                       m->mhandle->SetSortType(0);
+
+                       m_ShowCurrentLayout();
+               }
+               break;
+
+       default:
+               break;
        }
 }
 
index e350d0c..fadc726 100644 (file)
 #define GENGRID_ITEM_SIZE_W (263+20)
 #define GENGRID_ITEM_SIZE_H (359+20)
 
+
+enum EObjectType {
+       FOLDER_LAYOUT_PLAY_BUTTON,
+       FOLDER_LAYOUT_NEXT_BUTTON,
+       FOLDER_LAYOUT_LAST_BUTTON,
+       FOLDER_LAYOUT,
+       FOLDER_LAYOUT_GENGRID,
+};
+
 struct SFolderItemInfo {
        folder_info *finfo;
        SSongInfo *sinfo;
@@ -52,12 +61,6 @@ const char *g_sourceTexts[] = {
        N_("USB")         // SOURCE_TYPE_USB
 };
 
-enum EBtnType {
-       ABTN_PLAY,
-       ABTN_NEXT,
-       ABTN_LAST
-};
-
 enum EDepthType {
        E_DEPTH_NONE,
        E_DEPTH_FOLDER,
@@ -91,321 +94,11 @@ struct SFolderLayout {
        CFolderLayout *parent;
        int depth;
 
-       class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener {
-       public:
-               struct SCallback {
-                       void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId);
-                       void* cookie;
-               };
-
-       private:
-               SFolderLayout *m;
-
-       protected:
-               SCallback m_callback;
-
-       public:
-               CHandlerButton(SFolderLayout *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 CHandlerGrid : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener, public IRealizedListener, public IUnrealizedListener {
-       public:
-               struct SCallback {
-                       void(*goToPlaybackView)(void *cookie, int mode, char *mediaId);
-                       void(*goToContextView)(void *cookie, SContentInfo *contextInfo);
-                       void(*updateGrid)(void *cookie);
-                       void* cookie;
-               };
-
-       private:
-               SFolderLayout *m;
-               SCallback m_callback;
-
-       private:
-               SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item)
-               {
-                       Eina_List *l = NULL;
-                       SFolderItemInfo *itinfo = NULL;
-                       void *obj = NULL;
-
-                       if (!list || !item)
-                               return NULL;
-
-                       EINA_LIST_FOREACH(list, l, obj) {
-                               itinfo = (SFolderItemInfo *)obj;
-                               if (itinfo->item == item)
-                                       return itinfo;
-                       }
-
-                       return NULL;
-               }
-
-               static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
-               {
-                       CHandlerGrid *root = (CHandlerGrid *)dt;
-                       if (root) {
-                               root->m_OnCtxtUpdate(type, lid);
-                       }
-               }
-
-               void m_OnCtxtUpdate(EActionType type, int lid)
-               {
-                       Eina_List *list = NULL;
-                       SSongInfo *sinfo = NULL;
-                       EAddType mode;
-
-                       if (!m->ctxtinfo || !m->ctxtinfo->context)
-                               return;
-
-                       if (type == ACTION_TYPE_ADDNEXT)
-                               mode = ADD_TYPE_NEXT;
-                       else
-                               mode = ADD_TYPE_END;
-
-                       if (m->depth == E_DEPTH_SONG) {
-                               sinfo = (SSongInfo *)m->ctxtinfo->context;
-                               list = eina_list_append(list, sinfo);
-                       }
-                       else {
-                               m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG,
-                                       m->ctxtinfo->context, &list);
-                               sinfo = (SSongInfo *)eina_list_data_get(list);
-                       }
-
-                       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(sinfo));
-                       }
-
-                       _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
-               }
-
-               static void sm_CbCtxtClose(void *dt)
-               {
-                       CHandlerGrid *root = (CHandlerGrid *)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, Elm_Object_Item *it, const char *emission, const char *source)
-               {
-                       CHandlerGrid *root = (CHandlerGrid *)data;
-                       if (root)
-                               root->m_OnItemSelect(it, emission, source);
-               }
-
-               void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source)
-               {
-                       SFolderItemInfo *itinfo = NULL;
-                       char *id = NULL;
-
-                       if (!m)
-                               return;
-
-                       itinfo = m_FindItemInfo(m->it_infolist, it);
-                       if (!itinfo) {
-                               _ERR(" no item info found ");
-                               return;
-                       }
-
-                       if (m->depth == E_DEPTH_SONG) {
-                               if (m->c_sinfo) {
-                                       song_info_destroy(m->c_sinfo);
-                                       m->c_sinfo = NULL;
-                               }
-                               m->c_sinfo = song_info_duplicate(itinfo->sinfo);
-                       }
-                       else {
-                               if (m->c_finfo) {
-                                       folder_info_destroy(m->c_finfo);
-                                       m->c_finfo = NULL;
-                               }
-                               m->c_finfo = folder_info_duplicate(itinfo->finfo);
-                       }
-
-                       if (m->depth == E_DEPTH_SONG) {
-                               id = song_info_get_media_id(m->c_sinfo);
-                               elm_gengrid_item_selected_set(it, EINA_FALSE);
-                               // Goto Playback View with id
-                               if (m_callback.goToPlaybackView)
-                                       m_callback.goToPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, id);
-                       }
-                       else {
-                               m->depth = E_DEPTH_SONG;
-                               // Update folder grid and add idler
-                               if (m_callback.updateGrid)
-                                       m_callback.updateGrid(m_callback.cookie);
-                       }
-               }
-
-       public:
-               CHandlerGrid(SFolderLayout *ins) :
-                       IMouseMoveListener(this),
-                       IKeyDownListener(this),
-                       IRealizedListener(this),
-                       IUnrealizedListener(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)
-               {
-                       Elm_Object_Item *item;
-
-                       item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
-                               ev->cur.canvas.y, NULL, NULL);
-                       if (!item)
-                               return;
-
-                       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;
-                       SFolderItemInfo *itinfo = NULL;
-
-                       if (!obj)
-                               return;
-
-                       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_FindItemInfo(m->it_infolist, it);
-                       if (!itinfo) {
-                               free(ctxtinfo);
-                               return;
-                       }
-
-                       ctxtinfo->cbdata = this;
-                       ctxtinfo->update = sm_CbCtxtUpdate;
-                       ctxtinfo->close = sm_CbCtxtClose;
-                       if (m->depth == E_DEPTH_SONG) {
-                               ctxtinfo->type = CONTEXT_TYPE_SONG;
-                               ctxtinfo->context = itinfo->sinfo;
-                       }
-                       else {
-                               ctxtinfo->type = CONTEXT_TYPE_FOLDER;
-                               ctxtinfo->context = itinfo->finfo;
-                       }
-
-                       m->ctxtinfo = ctxtinfo;
-
-                       // Go to the context view with ctxtinfo
-                       if (m_callback.goToContextView)
-                               m_callback.goToContextView(m_callback.cookie, ctxtinfo);
-               }
-
-               virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
-               {
-                       elm_object_item_signal_callback_add(item,
-                               MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
-                               sm_CbItemSelect, this);
-               }
-
-               virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
-               {
-                       elm_object_item_signal_callback_del((Elm_Object_Item *)item,
-                               MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
-                               sm_CbItemSelect);
-               }
-       } *pHandlerGrid;
-
        SFolderLayout() {
                memset(this, 0, sizeof(SFolderLayout));
-               pHandlerGrid = new CHandlerGrid(this);
-               pHandlerButton = new CHandlerButton(this);
        }
 
        ~SFolderLayout() {
-               delete pHandlerGrid;
-               delete pHandlerButton;
        }
 };
 
@@ -558,43 +251,140 @@ void CFolderLayout::m_OnFocusIdler(void)
 }
 
 
-void CFolderLayout::sm_CbGoToContextView(void *cookie, SContentInfo *contextInfo)
+void CFolderLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
 {
-       CFolderLayout *root = (CFolderLayout *)cookie;
+       CFolderLayout *root = (CFolderLayout *)dt;
+       if (root) {
+               root->m_OnCtxtUpdate(type, lid);
+       }
+}
+
+void CFolderLayout::m_OnCtxtUpdate(EActionType type, int lid)
+{
+       Eina_List *list = NULL;
+       SSongInfo *sinfo = NULL;
+       EAddType mode;
+
+       if (!m->ctxtinfo || !m->ctxtinfo->context)
+               return;
+
+       if (type == ACTION_TYPE_ADDNEXT)
+               mode = ADD_TYPE_NEXT;
+       else
+               mode = ADD_TYPE_END;
+
+       if (m->depth == E_DEPTH_SONG) {
+               sinfo = (SSongInfo *)m->ctxtinfo->context;
+               list = eina_list_append(list, sinfo);
+       }
+       else {
+               m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG,
+                       m->ctxtinfo->context, &list);
+               sinfo = (SSongInfo *)eina_list_data_get(list);
+       }
+
+       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(sinfo));
+       }
+
+       _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
+}
+
+void CFolderLayout::sm_CbCtxtClose(void *dt)
+{
+       CFolderLayout *root = (CFolderLayout *)dt;
        if (root)
-               root->m_OnGotoContextView(contextInfo);
+               root->m_OnCtxtClose();
 }
 
 
-void CFolderLayout::m_OnGotoContextView(SContentInfo *contextInfo)
+void CFolderLayout::m_OnCtxtClose(void)
 {
-       SParcel parcel;
-       parcel.ctxtInfo = contextInfo;
-       if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
-               _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
+       m->vmgr->PopView();
+       m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
+       elm_object_item_focus_set(m->focused_item, EINA_TRUE);
 }
 
 
-void CFolderLayout::sm_CbUpdateGrid(void *cookie)
+void CFolderLayout::sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source)
 {
-       CFolderLayout *root = (CFolderLayout *)cookie;
+       CFolderLayout *root = (CFolderLayout *)data;
        if (root)
-               root->m_OnCbUpdateGrid();
+               root->m_OnItemSelect(it, emission, source);
 }
 
 
-void CFolderLayout::m_OnCbUpdateGrid(void)
+void CFolderLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source)
 {
-       m_UpdateFolderGrid(false);
-       m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this);
+       SFolderItemInfo *itinfo = NULL;
+       char *id = NULL;
+
+       if (!m)
+               return;
+
+       itinfo = m_FindItemInfo(m->it_infolist, it);
+       if (!itinfo) {
+               _ERR(" no item info found ");
+               return;
+       }
+
+       if (m->depth == E_DEPTH_SONG) {
+               if (m->c_sinfo) {
+                       song_info_destroy(m->c_sinfo);
+                       m->c_sinfo = NULL;
+               }
+               m->c_sinfo = song_info_duplicate(itinfo->sinfo);
+       }
+       else {
+               if (m->c_finfo) {
+                       folder_info_destroy(m->c_finfo);
+                       m->c_finfo = NULL;
+               }
+               m->c_finfo = folder_info_duplicate(itinfo->finfo);
+       }
+
+       if (m->depth == E_DEPTH_SONG) {
+               id = song_info_get_media_id(m->c_sinfo);
+               elm_gengrid_item_selected_set(it, EINA_FALSE);
+               m_GotoPlayback(ADD_TYPE_FRESH, id);
+       }
+       else {
+               m->depth = E_DEPTH_SONG;
+               m_UpdateFolderGrid(false);
+               m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this);
+       }
 }
 
 
-void CFolderLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId)
+SFolderItemInfo *CFolderLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item)
 {
-       CFolderLayout *root = (CFolderLayout *)cookie;
-       if (root)
-               root->m_GotoPlayback(mode, mediaId);
+       Eina_List *l = NULL;
+       SFolderItemInfo *itinfo = NULL;
+       void *obj = NULL;
+
+       if (!list || !item)
+               return NULL;
+
+       EINA_LIST_FOREACH(list, l, obj) {
+               itinfo = (SFolderItemInfo *)obj;
+               if (itinfo->item == item)
+                       return itinfo;
+       }
+
+       return NULL;
 }
 
 
@@ -712,7 +502,9 @@ void CFolderLayout::m_CreateFolderGrid(void)
                EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        elm_gengrid_align_set(grid, 0, 0);
        elm_object_part_content_set(Layout(), MUSIC_PART_FOLDER_GRID, grid);
-       m->pHandlerGrid->Connect(grid);
+       Connect(grid, FOLDER_LAYOUT_GENGRID,
+               TYPE_MOUSE_MOVE | TYPE_KEY_DOWN |
+               TYPE_REALIZED | TYPE_UNREALIZED);
        elm_gengrid_item_size_set(grid,
                elm_config_scale_get() * GENGRID_ITEM_SIZE_W,
                elm_config_scale_get() * GENGRID_ITEM_SIZE_H);
@@ -867,20 +659,20 @@ void CFolderLayout::m_CreateTopsection(void)
        Evas_Object *img;
        SBtnInfo btninfo[TOTAL_ADD_BTNS];
 
-       btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY;
-       btninfo[ABTN_PLAY].part = MUSIC_PART_FOLDER_PLAYBTN;
-       btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN;
-       btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY;
+       btninfo[FOLDER_LAYOUT_PLAY_BUTTON].name = MUSIC_STR_PLAY;
+       btninfo[FOLDER_LAYOUT_PLAY_BUTTON].part = MUSIC_PART_FOLDER_PLAYBTN;
+       btninfo[FOLDER_LAYOUT_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN;
+       btninfo[FOLDER_LAYOUT_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY;
 
-       btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT;
-       btninfo[ABTN_NEXT].part = MUSIC_PART_FOLDER_NEXTBTN;
-       btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN;
-       btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT;
+       btninfo[FOLDER_LAYOUT_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT;
+       btninfo[FOLDER_LAYOUT_NEXT_BUTTON].part = MUSIC_PART_FOLDER_NEXTBTN;
+       btninfo[FOLDER_LAYOUT_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN;
+       btninfo[FOLDER_LAYOUT_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT;
 
-       btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST;
-       btninfo[ABTN_LAST].part = MUSIC_PART_FOLDER_LASTBTN;
-       btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN;
-       btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST;
+       btninfo[FOLDER_LAYOUT_LAST_BUTTON].name = MUSIC_STR_ADDLAST;
+       btninfo[FOLDER_LAYOUT_LAST_BUTTON].part = MUSIC_PART_FOLDER_LASTBTN;
+       btninfo[FOLDER_LAYOUT_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN;
+       btninfo[FOLDER_LAYOUT_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST;
 
        for (i = 0; i < TOTAL_ADD_BTNS; i++) {
                btn = elm_button_add(Layout());
@@ -892,7 +684,7 @@ void CFolderLayout::m_CreateTopsection(void)
                elm_object_text_set(btn, _(btninfo[i].name));
                elm_object_style_set(btn, btninfo[i].style);
 
-               m->pHandlerButton->Connect(btn, i);
+               Connect(btn, i, TYPE_MOUSE_MOVE | TYPE_CLICKED);
 
                img = elm_image_add(btn);
                if (img) {
@@ -986,19 +778,7 @@ bool CFolderLayout::Create(CLayoutMgr *mgr)
        m_CreateTopsection();
        m_CreateFolderGrid();
 
-       Connect(layout);
-
-       SFolderLayout::CHandlerGrid::SCallback cb;
-       cb.goToPlaybackView = &sm_CbGoToPlaybackView;
-       cb.goToContextView = &sm_CbGoToContextView;
-       cb.updateGrid = &sm_CbUpdateGrid;
-       cb.cookie = this;
-       m->pHandlerGrid->SetCallback(&cb);
-
-       SFolderLayout::CHandlerButton::SCallback btnCb;
-       btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView;
-       btnCb.cookie = this;
-       m->pHandlerButton->SetCallback(&btnCb);
+       Connect(layout, FOLDER_LAYOUT, TYPE_KEY_DOWN);
 
        SParcel parcel;
        parcel.ctxtInfo = NULL;
@@ -1050,22 +830,169 @@ void CFolderLayout::Update(bool focusFlag)
 }
 
 
+void CFolderLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+{
+       switch (id) {
+       case FOLDER_LAYOUT_GENGRID:
+               {
+                       Elm_Object_Item *item;
+
+                       item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
+                               ev->cur.canvas.y, NULL, NULL);
+                       if (!item)
+                                 return;
+
+                       if (!elm_object_item_focus_get(item))
+                               elm_object_item_focus_set(item, EINA_TRUE);
+               }
+               break;
+
+       case FOLDER_LAYOUT_PLAY_BUTTON:
+       case FOLDER_LAYOUT_NEXT_BUTTON:
+       case FOLDER_LAYOUT_LAST_BUTTON:
+               {
+                       if (!elm_object_focus_get(obj))
+                               elm_object_focus_set(obj, EINA_TRUE);
+               }
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CFolderLayout::OnMouseClicked(int id, Evas_Object *obj)
+{
+       switch (id) {
+       case FOLDER_LAYOUT_PLAY_BUTTON:
+               m_GotoPlayback(ADD_TYPE_FRESH, NULL);
+               break;
+
+       case FOLDER_LAYOUT_NEXT_BUTTON:
+               m_GotoPlayback(ADD_TYPE_NEXT, NULL);
+               break;
+
+       case FOLDER_LAYOUT_LAST_BUTTON:
+               m_GotoPlayback(ADD_TYPE_END, NULL);
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CFolderLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
+{
+       switch (id) {
+       case FOLDER_LAYOUT_GENGRID:
+               elm_object_item_signal_callback_add(item,
+                       MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
+                       sm_CbItemSelect, this);
+               break;
+
+       default:
+               break;
+       }
+}
+
+
+void CFolderLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
+{
+       switch (id) {
+       case FOLDER_LAYOUT_GENGRID:
+               elm_object_item_signal_callback_del((Elm_Object_Item *)item,
+                       MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
+                       sm_CbItemSelect);
+               break;
+
+       default:
+               break;
+       }
+}
+
+
 void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
 {
-       if (!strcmp(ev->keyname, KEY_BACK)) {
-               if (m->depth == E_DEPTH_SONG) {
-                       m->depth = E_DEPTH_FOLDER;
-                       m_UpdateFolderGrid(false);
-                       m_RemoveFocusIdler();
-                       m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this);
+       switch (id) {
+       case FOLDER_LAYOUT:
+               {
+                       if (!strcmp(ev->keyname, KEY_BACK)) {
+                               if (m->depth == E_DEPTH_SONG) {
+                                       m->depth = E_DEPTH_FOLDER;
+                                       m_UpdateFolderGrid(false);
+                                       m_RemoveFocusIdler();
+                                       m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this);
+                               }
+                               else {
+                                       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);
+                               }
+                       }
                }
-               else {
+               break;
+
+       case FOLDER_LAYOUT_GENGRID:
+               {
+                       Elm_Object_Item *it = NULL;
+                       SContentInfo *ctxtinfo = NULL;
+                       SFolderItemInfo *itinfo = NULL;
+
+                       if (!obj)
+                               return;
+
+                       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_FindItemInfo(m->it_infolist, it);
+                       if (!itinfo) {
+                               free(ctxtinfo);
+                               return;
+                       }
+
+                       ctxtinfo->cbdata = this;
+                       ctxtinfo->update = sm_CbCtxtUpdate;
+                       ctxtinfo->close = sm_CbCtxtClose;
+                       if (m->depth == E_DEPTH_SONG) {
+                               ctxtinfo->type = CONTEXT_TYPE_SONG;
+                               ctxtinfo->context = itinfo->sinfo;
+                       }
+                       else {
+                               ctxtinfo->type = CONTEXT_TYPE_FOLDER;
+                               ctxtinfo->context = itinfo->finfo;
+                       }
+
+                       m->ctxtinfo = ctxtinfo;
+
                        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);
+                       parcel.ctxtInfo = ctxtinfo;
+                       if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
+                               _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
                }
+               break;
+
+       default:
+               break;
        }
 }
\ No newline at end of file