[BROWSEUI]
[reactos.git] / dll / win32 / shell32 / shlview.cpp
index c96706f..ee3dd03 100644 (file)
@@ -87,6 +87,7 @@ class CDefView :
         HWND                      m_hWndParent;
         FOLDERSETTINGS            m_FolderSettings;
         HMENU                     m_hMenu;
+        BOOL                      m_menusLoaded;
         UINT                      m_uState;
         UINT                      m_cidl;
         LPITEMIDLIST              *m_apidl;
@@ -104,6 +105,8 @@ class CDefView :
         POINT                     m_ptLastMousePos;        /* Mouse position at last DragOver call */
         //
         CComPtr<IContextMenu>     m_pCM;
+
+        BOOL                      m_isEditing;
     public:
         CDefView();
         ~CDefView();
@@ -125,8 +128,8 @@ class CDefView :
         static INT CALLBACK fill_list(LPVOID ptr, LPVOID arg);
         HRESULT FillList();
         HMENU BuildFileMenu();
-        void MergeFileMenu(HMENU hSubMenu);
-        void MergeViewMenu(HMENU hSubMenu);
+        void PrepareShowFileMenu(HMENU hSubMenu);
+        void PrepareShowViewMenu(HMENU hSubMenu);
         UINT GetSelections();
         HRESULT OpenSelectedItems();
         void OnDeactivate();
@@ -165,14 +168,13 @@ class CDefView :
         virtual HRESULT STDMETHODCALLTYPE GetDefaultSpacing(POINT *ppt);
         virtual HRESULT STDMETHODCALLTYPE GetAutoArrange();
         virtual HRESULT STDMETHODCALLTYPE SelectItem(int iItem, DWORD dwFlags);
-        virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags);
+        virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags);
 
         // *** IShellFolderView methods ***
         virtual HRESULT STDMETHODCALLTYPE Rearrange(LPARAM sort);
         virtual HRESULT STDMETHODCALLTYPE GetArrangeParam(LPARAM *sort);
         virtual HRESULT STDMETHODCALLTYPE ArrangeGrid();
         virtual HRESULT STDMETHODCALLTYPE AutoArrange();
-        virtual HRESULT STDMETHODCALLTYPE IShellFolderView_GetAutoArrange();
         virtual HRESULT STDMETHODCALLTYPE AddObject(PITEMID_CHILD pidl, UINT *item);
         virtual HRESULT STDMETHODCALLTYPE GetObject(PITEMID_CHILD *pidl, UINT item);
         virtual HRESULT STDMETHODCALLTYPE RemoveObject(PITEMID_CHILD pidl, UINT *item);
@@ -243,6 +245,7 @@ class CDefView :
         LRESULT OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+        LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
 
         static ATL::CWndClassInfo& GetWndClassInfo()
         {
@@ -294,6 +297,7 @@ class CDefView :
         MESSAGE_HANDLER(WM_SYSCOLORCHANGE, OnSysColorChange)
         MESSAGE_HANDLER(CWM_GETISHELLBROWSER, OnGetShellBrowser)
         MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
+        MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
         END_MSG_MAP()
 
         BEGIN_COM_MAP(CDefView)
@@ -358,6 +362,7 @@ CDefView::CDefView()
     m_FolderSettings.fFlags = 0;
     m_FolderSettings.ViewMode = 0;
     m_hMenu = NULL;
+    m_menusLoaded = FALSE;
     m_uState = 0;
     m_cidl = 0;
     m_apidl = NULL;
@@ -372,6 +377,7 @@ CDefView::CDefView()
     m_cScrollDelay = 0;
     m_ptLastMousePos.x = 0;
     m_ptLastMousePos.y = 0;
+    m_isEditing = FALSE;
 }
 
 CDefView::~CDefView()
@@ -493,7 +499,7 @@ BOOL CDefView::CreateList()
     if (m_FolderSettings.fFlags & FWF_DESKTOP)
         dwStyle |= LVS_ALIGNLEFT;
     else
-        dwStyle |= LVS_ALIGNTOP;
+        dwStyle |= LVS_ALIGNTOP | LVS_SHOWSELALWAYS;
 
     switch (m_FolderSettings.ViewMode)
     {
@@ -848,7 +854,7 @@ BOOLEAN CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew)
 INT CALLBACK CDefView::fill_list( LPVOID ptr, LPVOID arg )
 {
     LPITEMIDLIST pidl = (LPITEMIDLIST)ptr;
-    CDefView *pThis = (CDefView *)arg;
+    CDefView *pThis = static_cast<CDefView *>(arg);
     /* in a commdlg This works as a filemask*/
     if (pThis->IncludeObject(pidl) == S_OK)
         pThis->LV_AddItem(pidl);
@@ -922,6 +928,8 @@ LRESULT CDefView::OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bH
 
 LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 {
+    if (m_hMenu)
+        DestroyMenu(m_hMenu);
     RevokeDragDrop(m_hWnd);
     SHChangeNotifyDeregister(m_hNotify);
     bHandled = FALSE;
@@ -995,90 +1003,110 @@ LRESULT CDefView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
  *    #### Handling of the menus ####
  */
 
-/**********************************************************
-* ShellView_BuildFileMenu()
-*/
 HMENU CDefView::BuildFileMenu()
-{   WCHAR    szText[MAX_PATH];
-    MENUITEMINFOW    mii;
-    int    nTools, i;
-    HMENU    hSubMenu;
+{
+    HRESULT hr;
+    CComPtr<IContextMenu> cm;
 
-    TRACE("(%p)\n", this);
+    GetSelections();
 
-    hSubMenu = CreatePopupMenu();
-    if (hSubMenu)
-    {
-        /*get the number of items in our global array*/
-        for(nTools = 0; Tools[nTools].idCommand != -1; nTools++) {}
+    LPCITEMIDLIST * apidl = (LPCITEMIDLIST *)m_apidl;
 
-        /*add the menu items*/
-        for(i = 0; i < nTools; i++)
-        {
-            LoadStringW(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
+    hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, apidl, IID_NULL_PPV_ARG(IContextMenu, &cm));
+    if (FAILED(hr))
+        return NULL;
 
-            ZeroMemory(&mii, sizeof(mii));
-            mii.cbSize = sizeof(mii);
-            mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
+    HMENU hmenu = CreatePopupMenu();
 
-            if(BTNS_SEP != Tools[i].bStyle) /* no separator*/
-            {
-                mii.fType = MFT_STRING;
-                mii.fState = MFS_ENABLED;
-                mii.dwTypeData = szText;
-                mii.wID = Tools[i].idCommand;
-            }
-            else
-            {
-                mii.fType = MFT_SEPARATOR;
-            }
-            /* tack This item onto the end of the menu */
-            InsertMenuItemW(hSubMenu, (UINT) - 1, TRUE, &mii);
-        }
-    }
+    //FIXME: get proper numbers ?
+    const UINT first = 0x7800;
+    const UINT last  = 0x7A00;
+    hr = cm->QueryContextMenu(hmenu, 0, first, last, 0);
+    if (FAILED(hr))
+        return NULL;
 
-    TRACE("-- return (menu=%p)\n", hSubMenu);
-    return hSubMenu;
+    // TODO: filter or something
+
+    return hmenu;
 }
 
-/**********************************************************
-* ShellView_MergeFileMenu()
-*/
-void CDefView::MergeFileMenu(HMENU hSubMenu)
+void CDefView::PrepareShowFileMenu(HMENU hSubMenu)
 {
     TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu);
 
-    if (hSubMenu)
-    {   /*insert This item at the beginning of the menu */
-        _InsertMenuItemW(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
-        _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, L"dummy45", MFS_ENABLED);
+    if (!hSubMenu)
+        return;
+
+    /* Cleanup the items added previously */
+    for (int i = 0; i < GetMenuItemCount(hSubMenu); )
+    {
+        MENUITEMINFOW mii;
+        mii.cbSize = sizeof(mii);
+        mii.fMask = MIIM_ID;
+        GetMenuItemInfoW(hSubMenu, i, TRUE, &mii);
+
+        if (mii.wID < 0x8000)
+        {
+            DeleteMenu(hSubMenu, i, MF_BYPOSITION);
+        }
+        else
+        {
+            i++;
+        }
     }
 
+    /* Insert This item at the beginning of the menu. */
+    _InsertMenuItemW(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+    _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 4, MFT_STRING, L"Properties", MFS_DISABLED);
+    _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 3, MFT_STRING, L"Rename", MFS_DISABLED);
+    _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 2, MFT_STRING, L"Delete", MFS_DISABLED);
+    _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 1, MFT_STRING, L"Create Shortcut", MFS_DISABLED);
+    _InsertMenuItemW(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+    _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, L"New", MFS_ENABLED);
+
+    HMENU menubase = BuildFileMenu();
+    if (menubase)
+    {
+        int count = ::GetMenuItemCount(menubase);
+
+        for (int i = 0; i < count; i++)
+        {
+            WCHAR label[128];
+
+            MENUITEMINFOW mii = { 0 };
+            mii.cbSize = sizeof(mii);
+            mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+            mii.dwTypeData = label;
+            mii.cch = _countof(label);
+            ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
+
+            DbgPrint("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+            mii.fType |= MFT_RADIOCHECK;
+
+            ::InsertMenuItemW(hSubMenu, IDM_MYFILEITEM, FALSE, &mii);
+        }
+
+        _InsertMenuItemW(hSubMenu, IDM_MYFILEITEM, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+
+        ::DestroyMenu(menubase);
+    }
     TRACE("--\n");
 }
 
-/**********************************************************
-* ShellView_MergeViewMenu()
-*/
-void CDefView::MergeViewMenu(HMENU hSubMenu)
+void CDefView::PrepareShowViewMenu(HMENU hSubMenu)
 {
     TRACE("(%p)->(submenu=%p)\n", this, hSubMenu);
 
-    if (hSubMenu)
-    {
-        /*add a separator at the correct position in the menu*/
-        MENUITEMINFOW mii;
-        static WCHAR view[] = L"View";
-
-        _InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+    if (!hSubMenu)
+        return;
 
-        ZeroMemory(&mii, sizeof(mii));
-        mii.cbSize = sizeof(mii);
-        mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;
-        mii.fType = MFT_STRING;
-        mii.dwTypeData = view;
-        mii.hSubMenu = LoadMenuW(shell32_hInstance, L"MENU_001");
-        InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+    if (m_FolderSettings.ViewMode >= FVM_FIRST && m_FolderSettings.ViewMode <= FVM_LAST)
+    {
+        UINT iItemFirst = FCIDM_SHVIEW_BIGICON;
+        UINT iItemLast = iItemFirst + FVM_LAST - FVM_FIRST;
+        UINT iItem = iItemFirst + m_FolderSettings.ViewMode - FVM_FIRST;
+        CheckMenuRadioItem(hSubMenu, iItemFirst, iItemLast, iItem, MF_BYCOMMAND);
     }
 }
 
@@ -1342,13 +1370,7 @@ void CDefView::OnDeactivate()
 
     if (m_uState != SVUIA_DEACTIVATE)
     {
-        if (m_hMenu)
-        {
-            m_pShellBrowser->SetMenuSB(0, 0, 0);
-            m_pShellBrowser->RemoveMenusSB(m_hMenu);
-            DestroyMenu(m_hMenu);
-            m_hMenu = 0;
-        }
+        // TODO: cleanup menu after deactivation
 
         m_uState = SVUIA_DEACTIVATE;
     }
@@ -1356,10 +1378,6 @@ void CDefView::OnDeactivate()
 
 void CDefView::DoActivate(UINT uState)
 {
-    OLEMENUGROUPWIDTHS                    omw = { {0, 0, 0, 0, 0, 0} };
-    MENUITEMINFOA                        mii;
-    CHAR                                szText[MAX_PATH];
-
     TRACE("%p uState=%x\n", this, uState);
 
     /*don't do anything if the state isn't really changing */
@@ -1368,64 +1386,96 @@ void CDefView::DoActivate(UINT uState)
         return;
     }
 
-    OnDeactivate();
-
-    /*only do This if we are active */
-    if(uState != SVUIA_DEACTIVATE)
+    if (uState == SVUIA_DEACTIVATE)
+    {
+        OnDeactivate();
+    }
+    else
     {
-        /*merge the menus */
-        m_hMenu = CreateMenu();
-
         if(m_hMenu)
         {
-            m_pShellBrowser->InsertMenusSB(m_hMenu, &omw);
-            TRACE("-- after fnInsertMenusSB\n");
+            if (!m_menusLoaded)
+            {
+                MENUITEMINFOW mii = { 0 };
 
-            /*build the top level menu get the menu item's text*/
-            strcpy(szText, "dummy 31");
+                /* initialize EDIT menu */
+                mii.cbSize = sizeof(mii);
+                mii.fMask = MIIM_SUBMENU;
+                if (::GetMenuItemInfoW(m_hMenu, FCIDM_MENU_EDIT, FALSE, &mii))
+                {
+                    HMENU hSubMenu = mii.hSubMenu;
 
-            ZeroMemory(&mii, sizeof(mii));
-            mii.cbSize = sizeof(mii);
-            mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
-            mii.fType = MFT_STRING;
-            mii.fState = MFS_ENABLED;
-            mii.dwTypeData = szText;
-            mii.hSubMenu = BuildFileMenu();
-
-            /*insert our menu into the menu bar*/
-            if (mii.hSubMenu)
-            {
-                InsertMenuItemA(m_hMenu, FCIDM_MENU_HELP, FALSE, &mii);
-            }
+                    HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_003");
 
-            /*get the view menu so we can merge with it*/
-            ZeroMemory(&mii, sizeof(mii));
-            mii.cbSize = sizeof(mii);
-            mii.fMask = MIIM_SUBMENU;
+                    int count = ::GetMenuItemCount(menubase);
+                    for (int i = 0; i < count; i++)
+                    {
+                        WCHAR label[128];
 
-            if (GetMenuItemInfoA(m_hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
-            {
-                MergeViewMenu(mii.hSubMenu);
-            }
+                        ZeroMemory(&mii, sizeof(mii));
+                        mii.cbSize = sizeof(mii);
+                        mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+                        mii.dwTypeData = label;
+                        mii.cch = _countof(label);
+                        ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
 
-            /*add the items that should only be added if we have the focus*/
-            if (SVUIA_ACTIVATE_FOCUS == uState)
-            {
-                /*get the file menu so we can merge with it */
-                ZeroMemory(&mii, sizeof(mii));
+                        DbgPrint("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+                        mii.fType |= MFT_RADIOCHECK;
+
+                        ::InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+                    }
+
+                    ::DestroyMenu(menubase);
+                }
+
+                /* initialize VIEW menu */
                 mii.cbSize = sizeof(mii);
                 mii.fMask = MIIM_SUBMENU;
-
-                if (GetMenuItemInfoA(m_hMenu, FCIDM_MENU_FILE, FALSE, &mii))
+                if (::GetMenuItemInfoW(m_hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
                 {
-                    MergeFileMenu(mii.hSubMenu);
+                    HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_001");
+
+                    HMENU hSubMenu = mii.hSubMenu;
+
+                    _InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+
+                    int count = ::GetMenuItemCount(menubase);
+                    for (int i = 0; i < count; i++)
+                    {
+                        WCHAR label[128];
+
+                        ZeroMemory(&mii, sizeof(mii));
+                        mii.cbSize = sizeof(mii);
+                        mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+                        mii.dwTypeData = label;
+                        mii.cch = _countof(label);
+                        ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
+
+                        DbgPrint("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+                        mii.fType |= MFT_RADIOCHECK;
+
+                        ::InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+                    }
+
+                    ::DestroyMenu(menubase);
                 }
+
+
+                TRACE("-- before fnSetMenuSB\n");
+                m_pShellBrowser->SetMenuSB(m_hMenu, 0, m_hWnd);
+
+                m_menusLoaded = TRUE;
             }
+        }
 
-            TRACE("-- before fnSetMenuSB\n");
-            m_pShellBrowser->SetMenuSB(m_hMenu, 0, m_hWnd);
+        if (SVUIA_ACTIVATE_FOCUS == uState)
+        {
+            ::SetFocus(m_hWndList);
         }
     }
+
     m_uState = uState;
     TRACE("--\n");
 }
@@ -1709,7 +1759,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
                 DWORD dwAttributes = SFGAO_CANLINK;
                 DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
 
-                if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_IDataObject, 0, (LPVOID *)&pda)))
+                if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
                 {
                     IDropSource * pds = (IDropSource *)this;    /* own DropSource interface */
 
@@ -1747,6 +1797,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
             m_pSFParent->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &dwAttr);
             if (SFGAO_CANRENAME & dwAttr)
             {
+                m_isEditing = TRUE;
                 return FALSE;
             }
             return TRUE;
@@ -1755,6 +1806,9 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
         case LVN_ENDLABELEDITW:
         {
             TRACE("-- LVN_ENDLABELEDITW %p\n", this);
+
+            m_isEditing = FALSE;
+
             if (lpdi->item.pszText)
             {
                 HRESULT hr;
@@ -1783,25 +1837,6 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
             return FALSE;
         }
 
-        case LVN_KEYDOWN:
-        {
-            LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
-
-            /* initiate a rename of the selected file or directory */
-            if (plvKeyDown->wVKey == VK_BACK)
-            {
-                LPSHELLBROWSER lpSb;
-                if ((lpSb = (LPSHELLBROWSER)SendMessageW(m_hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
-                {
-                    lpSb->BrowseObject(NULL, SBSP_PARENT);
-                }
-            }
-           
-            else
-                FIXME("LVN_KEYDOWN key=0x%08x\n", plvKeyDown->wVKey);
-        }
-        break;
-
         default:
             TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh->code);
             break;
@@ -1839,9 +1874,13 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
             break;
 
         case SHCNE_UPDATEITEM:
+            LV_RenameItem(Pidls[0], Pidls[0]);
             break;
-    }
 
+        case SHCNE_UPDATEDIR:
+            Refresh();
+            break;
+    }
     return TRUE;
 }
 
@@ -1877,6 +1916,51 @@ LRESULT CDefView::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
     return S_OK;
 }
 
+/**********************************************************
+*  CDefView::OnInitMenuPopup
+*/
+LRESULT CDefView::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+    MENUITEMINFOW mii = { 0 };
+    HMENU hSubmenu = (HMENU) wParam;
+
+    DbgPrint("OnInitMenuPopup lParam=%d\n", lParam);
+    
+    mii.cbSize = sizeof(mii);
+    mii.fMask = MIIM_ID | MIIM_SUBMENU;
+
+    if (!GetMenuItemInfoW(this->m_hMenu, lParam, TRUE, &mii))
+    {
+        DbgPrint("OnInitMenuPopup GetMenuItemInfoW failed!\n");
+        return FALSE;
+    }
+
+    UINT  menuItemId = mii.wID;
+
+    if (mii.hSubMenu != hSubmenu)
+    {
+        DbgPrint("OnInitMenuPopup submenu does not match!!!!\n");
+        return FALSE;
+    }
+
+    DbgPrint("OnInitMenuPopup id=%d\n", menuItemId);
+
+    switch (menuItemId)
+    {
+    case FCIDM_MENU_FILE:
+        PrepareShowFileMenu(hSubmenu);
+        break;
+    case FCIDM_MENU_EDIT:
+        //PrepareShowEditMenu(hSubmenu);
+        break;
+    case FCIDM_MENU_VIEW:
+        PrepareShowViewMenu(hSubmenu);
+        break;
+    }
+
+    return FALSE;
+}
+
 /**********************************************************
 *
 *
@@ -1913,17 +1997,18 @@ HRESULT WINAPI CDefView::ContextSensitiveHelp(BOOL fEnterMode)
 */
 HRESULT WINAPI CDefView::TranslateAccelerator(LPMSG lpmsg)
 {
+    if (m_isEditing)
+        return S_FALSE;
+
     if (lpmsg->message >= WM_KEYFIRST && lpmsg->message <= WM_KEYLAST)
     {
         if (::TranslateAcceleratorW(m_hWnd, m_hAccel, lpmsg) != 0)
             return S_OK;
 
-        /* FIXME: should call TranslateAcceleratorSB */
-
         TRACE("-- key=0x04%lx\n", lpmsg->wParam) ;
     }
 
-    return S_FALSE; /* not handled */
+    return m_pShellBrowser->TranslateAcceleratorSB(lpmsg, 0);
 }
 
 HRESULT WINAPI CDefView::EnableModeless(BOOL fEnable)
@@ -1984,6 +2069,8 @@ HRESULT WINAPI CDefView::Refresh()
 
 HRESULT WINAPI CDefView::CreateViewWindow(IShellView *lpPrevView, LPCFOLDERSETTINGS lpfs, IShellBrowser *psb, RECT *prcView, HWND *phWnd)
 {
+    OLEMENUGROUPWIDTHS                    omw = { { 0, 0, 0, 0, 0, 0 } };
+
     *phWnd = 0;
 
     TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView, lpfs, psb, prcView, phWnd);
@@ -2025,6 +2112,13 @@ HRESULT WINAPI CDefView::CreateViewWindow(IShellView *lpPrevView, LPCFOLDERSETTI
     SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
     UpdateWindow();
 
+    if (!m_hMenu)
+    {
+        m_hMenu = CreateMenu();
+        m_pShellBrowser->InsertMenusSB(m_hMenu, &omw);
+        TRACE("-- after fnInsertMenusSB\n");
+    }
+
     return S_OK;
 }
 
@@ -2337,7 +2431,7 @@ HRESULT STDMETHODCALLTYPE CDefView::SelectItem(int iItem, DWORD dwFlags)
     return S_OK;
 }
 
-HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags)
+HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags)
 {
     return E_NOTIMPL;
 }
@@ -2369,12 +2463,6 @@ HRESULT STDMETHODCALLTYPE CDefView::AutoArrange()
     return E_NOTIMPL;
 }
 
-HRESULT STDMETHODCALLTYPE CDefView::IShellFolderView_GetAutoArrange()
-{
-    TRACE("(%p)\n", this);
-    return GetAutoArrange();
-}
-
 HRESULT STDMETHODCALLTYPE CDefView::AddObject(PITEMID_CHILD pidl, UINT *item)
 {
     FIXME("(%p)->(%p %p) stub\n", this, pidl, item);
@@ -2675,8 +2763,7 @@ HRESULT CDefView::drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEf
         SendMessageW(m_hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
 
         /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
-        hr = m_pSFParent->GetUIObjectOf(m_hWndList, 1,
-                                      (LPCITEMIDLIST*)&lvItem.lParam, IID_IDropTarget, NULL, (LPVOID*)&m_pCurDropTarget);
+        hr = m_pSFParent->GetUIObjectOf(m_hWndList, 1, (LPCITEMIDLIST*)&lvItem.lParam, IID_NULL_PPV_ARG(IDropTarget, &m_pCurDropTarget));
     }
 
     /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
@@ -2725,12 +2812,10 @@ HRESULT WINAPI CDefView::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINT
     {
         m_pCurDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
         m_pCurDropTarget.Release();
-
-        this->Refresh();
     }
 
-    m_pCurDataObject.Release();    m_iDragOverItem = 0;
-
+    m_pCurDataObject.Release();    
+    m_iDragOverItem = 0;
     return S_OK;
 }