diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index e79f8b8692c..a2b04444243 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -3161,12 +3161,38 @@ LRESULT CShellBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHa LRESULT CShellBrowser::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { - HMENU theMenu; + HMENU theMenu; + LPARAM menuIndex = lParam; theMenu = reinterpret_cast(wParam); - if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW)) + + if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_FILE)) + { + menuIndex = 0; + } + else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_EDIT)) + { + menuIndex = 1; + } + else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW)) + { UpdateViewMenu(theMenu); - return RelayMsgToShellView(uMsg, wParam, lParam, bHandled); + menuIndex = 2; + } + else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_FAVORITES)) + { + menuIndex = 3; + } + else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_TOOLS)) + { + menuIndex = 4; + } + else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_HELP)) + { + menuIndex = 5; + } + + return RelayMsgToShellView(uMsg, wParam, menuIndex, bHandled); } LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) diff --git a/dll/win32/shell32/shlview.cpp b/dll/win32/shell32/shlview.cpp index 1f3a5f70b34..c2a55334bed 100644 --- a/dll/win32/shell32/shlview.cpp +++ b/dll/win32/shell32/shlview.cpp @@ -243,6 +243,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 +295,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) @@ -1050,17 +1052,36 @@ void CDefView::MergeFileMenu(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+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); + 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); + TRACE("--\n"); } @@ -1071,21 +1092,57 @@ void CDefView::MergeViewMenu(HMENU hSubMenu) { TRACE("(%p)->(submenu=%p)\n", this, hSubMenu); - if (hSubMenu) + if (!hSubMenu) + return; + + __debugbreak(); + + DWORD item; + item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_BIGICON, FALSE); + item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_SMALLICON, FALSE); + item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_LISTVIEW, FALSE); + item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_REPORTVIEW, FALSE); + + if (item == -1) { - /*add a separator at the correct position in the menu*/ - MENUITEMINFOW mii; - static WCHAR view[] = L"View"; + HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_001"); _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++) + { + MENUITEMINFOW mii = { 0 }; + WCHAR label[128]; - 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); + 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); + } + + DbgPrint("View mode is %d\n", m_FolderSettings.ViewMode); + + if (m_FolderSettings.ViewMode >= FVM_FIRST && m_FolderSettings.ViewMode <= FVM_LAST) + { + UINT iItem = FCIDM_SHVIEW_BIGICON + m_FolderSettings.ViewMode - FVM_FIRST; + DbgPrint("Checking item %d ...\n", iItem); + item = SHCheckMenuItem(hSubMenu, iItem, TRUE); + DbgPrint("SHCheckMenuItem returned %d\n", item); + if (item == -1) + { + DbgPrint("GetLastError returned %d\n", GetLastError()); + } } } @@ -1357,9 +1414,6 @@ void CDefView::OnDeactivate() void CDefView::DoActivate(UINT uState) { - 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,71 +1422,24 @@ void CDefView::DoActivate(UINT uState) return; } - OnDeactivate(); - - /*only do This if we are active */ - if(uState != SVUIA_DEACTIVATE) + if (uState == SVUIA_DEACTIVATE) + { + OnDeactivate(); + } + else { - // FIXME: windows does not do this. - - // temporary solution (HACK): wipe the contents and refill - { - OLEMENUGROUPWIDTHS omw = { { 0 } }; - - INT mic = GetMenuItemCount(m_hMenu); - for (int i = 0; i < mic; i++) - { - DeleteMenu(m_hMenu, 0, MF_BYPOSITION); - } - - m_pShellBrowser->InsertMenusSB(m_hMenu, &omw); - } - - /*merge the menus */ - if(m_hMenu) { - /*build the top level menu get the menu item's text*/ - strcpy(szText, "dummy 31"); - - 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(); - - /*get the view menu so we can merge with it*/ - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_SUBMENU; - - if (GetMenuItemInfoA(m_hMenu, FCIDM_MENU_VIEW, FALSE, &mii)) - { - MergeViewMenu(mii.hSubMenu); - } - - /*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)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_SUBMENU; - - if (GetMenuItemInfoA(m_hMenu, FCIDM_MENU_FILE, FALSE, &mii)) - { - MergeFileMenu(mii.hSubMenu); - } - - ::SetFocus(m_hWndList); - } - 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"); } @@ -1869,6 +1876,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: + MergeFileMenu(hSubmenu); + break; + case FCIDM_MENU_EDIT: + //MergeEditMenu(hSubmenu); + break; + case FCIDM_MENU_VIEW: + MergeViewMenu(hSubmenu); + break; + } + + return FALSE; +} + /********************************************************** * *