From cd35aef5ab3b110323edaf19bd1b1394f5f27514 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Wed, 12 Nov 2014 17:13:05 +0000 Subject: [PATCH] [BROWSEUI] * Remove the unwanted "(Empty)" item from the static menu, the SF menu will add its own if needed. [RSHELL] * Load the "(Empty)" string from shell32 resources. [SHELL32] * Add the string resource for empty menus. svn path=/branches/shell-experiments/; revision=65389 --- base/shell/explorer-new/traywnd.cpp | 3 +- base/shell/rshell/CMenuBand.cpp | 2 +- base/shell/rshell/CMenuToolbars.cpp | 18 ++++++++++-- dll/win32/browseui/internettoolbar.cpp | 39 +++++++++++++++++--------- dll/win32/browseui/shellbrowser.cpp | 11 ++++++++ dll/win32/shell32/lang/en-US.rc | 2 ++ dll/win32/shell32/shresdef.h | 2 ++ 7 files changed, 58 insertions(+), 19 deletions(-) diff --git a/base/shell/explorer-new/traywnd.cpp b/base/shell/explorer-new/traywnd.cpp index 1c143fb0ac6..322c62e46e5 100644 --- a/base/shell/explorer-new/traywnd.cpp +++ b/base/shell/explorer-new/traywnd.cpp @@ -1345,8 +1345,7 @@ DefSize: /* Make sure the height is at least the size of a caption icon. */ if (hIconStart != NULL) Size.cx += SmallIcon.cx + 4; - Size.cy = max(Size.cy, - SmallIcon.cy); + Size.cy = max(Size.cy, SmallIcon.cy); /* Create the bitmap */ hbmp = CreateCompatibleBitmap(hDCScreen, diff --git a/base/shell/rshell/CMenuBand.cpp b/base/shell/rshell/CMenuBand.cpp index 160df00eee9..e010637f6ab 100644 --- a/base/shell/rshell/CMenuBand.cpp +++ b/base/shell/rshell/CMenuBand.cpp @@ -132,7 +132,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetMenu( BOOL created = FALSE; - if (m_hmenu) + if (m_hmenu && m_hmenu != hmenu) { DestroyMenu(m_hmenu); m_hmenu = NULL; diff --git a/base/shell/rshell/CMenuToolbars.cpp b/base/shell/rshell/CMenuToolbars.cpp index 3985ab60582..11f6de4aa14 100644 --- a/base/shell/rshell/CMenuToolbars.cpp +++ b/base/shell/rshell/CMenuToolbars.cpp @@ -25,6 +25,8 @@ #include "CMenuBand.h" #include "CMenuToolbars.h" +#define IDS_MENU_EMPTY 34561 + #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) @@ -425,14 +427,19 @@ HRESULT CMenuToolbarBase::GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegr if (m_hasSizes) return S_OK; + TRACE("Sizes out of date, recalculating.\n"); + if (!m_hWnd) + { return S_OK; + } // Obtain the ideal size, to be used as min and max - AutoSize(); GetMaxSize(&m_idealSize); GetIdealSize((m_initFlags & SMINIT_VERTICAL) != 0, &m_idealSize); + TRACE("Ideal Size: (%d, %d) for %d buttons\n", m_idealSize, GetButtonCount()); + // Obtain the button size, to be used as the integral size DWORD size = GetButtonSize(); m_itemSize.cx = GET_X_LPARAM(size); @@ -1004,7 +1011,9 @@ HRESULT CMenuToolbarBase::AddSeparator(BOOL last) HRESULT CMenuToolbarBase::AddPlaceholder() { TBBUTTON tbb = { 0 }; - PCWSTR MenuString = L"(Empty)"; // FIXME: Make localizable + WCHAR MenuString[128]; + + LoadStringW(GetModuleHandle(L"shell32.dll"), IDS_MENU_EMPTY, MenuString, _countof(MenuString)); tbb.fsState = 0; tbb.fsStyle = 0; @@ -1131,6 +1140,8 @@ HRESULT CMenuStaticToolbar::SetMenu( m_hwndMenu = hwnd; m_dwMenuFlags = dwFlags; + ClearToolbar(); + return S_OK; } @@ -1340,6 +1351,9 @@ HRESULT CMenuSFToolbar::SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFold m_idList = ILClone(pidlFolder); m_hKey = hKey; m_dwMenuFlags = dwFlags; + + ClearToolbar(); + return S_OK; } diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp index b7803c7c8e3..e536baaf450 100644 --- a/dll/win32/browseui/internettoolbar.cpp +++ b/dll/win32/browseui/internettoolbar.cpp @@ -547,18 +547,19 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, v if (psmd->uId != FCIDM_MENU_FAVORITES) return E_FAIL; + // create favorites menu + hResult = psmd->punk->QueryInterface(IID_PPV_ARG(IShellMenu, &parentMenu)); + if (FAILED_UNEXPECTEDLY(hResult)) + return hResult; + hResult = parentMenu->GetMenu(&parentHMenu, &ownerWindow, NULL); + if (FAILED_UNEXPECTEDLY(hResult)) + return hResult; + favoritesHMenu = GetSubMenu(parentHMenu, 3); + if (favoritesHMenu == NULL) + return E_FAIL; + if (fFavoritesMenu.p == NULL) { - // create favorites menu - hResult = psmd->punk->QueryInterface(IID_PPV_ARG(IShellMenu, &parentMenu)); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; - hResult = parentMenu->GetMenu(&parentHMenu, &ownerWindow, NULL); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; - favoritesHMenu = GetSubMenu(parentHMenu, 3); - if (favoritesHMenu == NULL) - return E_FAIL; #if USE_CUSTOM_MENUBAND if (!hRShell) { @@ -586,9 +587,6 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, v if (FAILED_UNEXPECTEDLY(hResult)) return hResult; hResult = newMenu->Initialize(this, FCIDM_MENU_FAVORITES, -1, SMINIT_VERTICAL | SMINIT_CACHED); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; - hResult = newMenu->SetMenu(favoritesHMenu, ownerWindow, SMSET_TOP | SMSET_DONTOWN); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; @@ -609,6 +607,10 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, v fFavoritesMenu = newMenu; } + hResult = fFavoritesMenu->SetMenu(favoritesHMenu, ownerWindow, SMSET_TOP | SMSET_DONTOWN); + if (FAILED_UNEXPECTEDLY(hResult)) + return hResult; + return fFavoritesMenu->QueryInterface(riid, ppvObject); } @@ -794,7 +796,16 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **pMenuBar) if (FAILED_UNEXPECTEDLY(hResult)) return hResult; - hResult = menubar->SetMenu((HMENU) V_INTREF(&menuOut), ownerWindow, SMSET_DONTOWN); + HMENU hMenuBar = (HMENU) V_INTREF(&menuOut); + + // FIXME: Figure out the proper way to do this. + HMENU hMenuFavs = GetSubMenu(hMenuBar, 3); + if (hMenuFavs) + { + DeleteMenu(hMenuFavs, IDM_FAVORITES_EMPTY, MF_BYCOMMAND); + } + + hResult = menubar->SetMenu(hMenuBar, ownerWindow, SMSET_DONTOWN); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; } diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index 22efd2984ce..59691cc0bb6 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -1874,6 +1874,17 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU h hResult = GetMenuBand(IID_PPV_ARG(IShellMenu, &shellMenu)); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; + + if (hmenuShared) + { + // FIXME: Figure out the proper way to do this. + HMENU hMenuFavs = GetSubMenu(hmenuShared, 3); + if (hMenuFavs) + { + DeleteMenu(hMenuFavs, IDM_FAVORITES_EMPTY, MF_BYCOMMAND); + } + } + hResult = shellMenu->SetMenu(hmenuShared, m_hWnd, SMSET_DONTOWN); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index 2ab2a253e23..c5c3143ecf9 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -798,4 +798,6 @@ BEGIN IDS_BYTES_FORMAT "bytes" IDS_UNKNOWN_APP "Unknown application" IDS_EXE_DESCRIPTION "Description:" + + IDS_MENU_EMPTY "(Empty)" END diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index 4fecf9badf7..0e9b0c85910 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -202,6 +202,8 @@ #define IDS_DESCRIPTION 331 #define IDS_COPY_OF 332 +#define IDS_MENU_EMPTY 34561 + /* Note: those strings are referenced from the registry */ #define IDS_RECYCLEBIN_FOLDER_NAME 8964 #define IDS_ADMINISTRATIVETOOLS 22982 -- 2.17.1