From 9e4da13034677eb873d3c7cf0ee22fe39ce90218 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Tue, 27 Jun 2017 10:05:59 +0000 Subject: [PATCH] [BROWSEUI] -CBandSite: Implement the context menu of the rebar. It queries the IContextMenu if the band and appends to it a static menu part that can show or hide the title and close the toolbar. Showing or hiding the title isn't implemented yet. svn path=/trunk/; revision=75216 --- reactos/dll/win32/browseui/lang/bg-BG.rc | 6 ++ reactos/dll/win32/browseui/lang/de-DE.rc | 6 ++ reactos/dll/win32/browseui/lang/en-US.rc | 6 ++ reactos/dll/win32/browseui/lang/es-ES.rc | 6 ++ reactos/dll/win32/browseui/lang/fr-FR.rc | 6 ++ reactos/dll/win32/browseui/lang/he-IL.rc | 6 ++ reactos/dll/win32/browseui/lang/it-IT.rc | 6 ++ reactos/dll/win32/browseui/lang/ja-JP.rc | 6 ++ reactos/dll/win32/browseui/lang/pl-PL.rc | 6 ++ reactos/dll/win32/browseui/lang/pt-BR.rc | 6 ++ reactos/dll/win32/browseui/lang/ro-RO.rc | 6 ++ reactos/dll/win32/browseui/lang/ru-RU.rc | 6 ++ reactos/dll/win32/browseui/lang/sq-AL.rc | 6 ++ reactos/dll/win32/browseui/lang/tr-TR.rc | 6 ++ reactos/dll/win32/browseui/lang/uk-UA.rc | 6 ++ reactos/dll/win32/browseui/lang/zh-CN.rc | 6 ++ reactos/dll/win32/browseui/lang/zh-TW.rc | 6 ++ reactos/dll/win32/browseui/resource.h | 4 + .../win32/browseui/shellbars/CBandSite.cpp | 86 +++++++++++++++++++ .../dll/win32/browseui/shellbars/CBandSite.h | 1 + .../dll/win32/browseui/shellbars/shellbars.h | 3 + 21 files changed, 196 insertions(+) diff --git a/reactos/dll/win32/browseui/lang/bg-BG.rc b/reactos/dll/win32/browseui/lang/bg-BG.rc index 11734eef567..6fe1f3c5bb5 100644 --- a/reactos/dll/win32/browseui/lang/bg-BG.rc +++ b/reactos/dll/win32/browseui/lang/bg-BG.rc @@ -87,6 +87,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/de-DE.rc b/reactos/dll/win32/browseui/lang/de-DE.rc index 75707d43f73..9bcbd8b9d7b 100644 --- a/reactos/dll/win32/browseui/lang/de-DE.rc +++ b/reactos/dll/win32/browseui/lang/de-DE.rc @@ -105,6 +105,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/en-US.rc b/reactos/dll/win32/browseui/lang/en-US.rc index 2d206dbc7d0..91bede91dba 100644 --- a/reactos/dll/win32/browseui/lang/en-US.rc +++ b/reactos/dll/win32/browseui/lang/en-US.rc @@ -105,6 +105,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/es-ES.rc b/reactos/dll/win32/browseui/lang/es-ES.rc index cf542bc9496..a27939bc3ea 100644 --- a/reactos/dll/win32/browseui/lang/es-ES.rc +++ b/reactos/dll/win32/browseui/lang/es-ES.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/fr-FR.rc b/reactos/dll/win32/browseui/lang/fr-FR.rc index 03aa6617b78..61a0930213c 100644 --- a/reactos/dll/win32/browseui/lang/fr-FR.rc +++ b/reactos/dll/win32/browseui/lang/fr-FR.rc @@ -105,6 +105,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/he-IL.rc b/reactos/dll/win32/browseui/lang/he-IL.rc index 90ea998a3c4..29ed7e52de9 100644 --- a/reactos/dll/win32/browseui/lang/he-IL.rc +++ b/reactos/dll/win32/browseui/lang/he-IL.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/it-IT.rc b/reactos/dll/win32/browseui/lang/it-IT.rc index 7744ecae0bd..6a5bf82fdff 100644 --- a/reactos/dll/win32/browseui/lang/it-IT.rc +++ b/reactos/dll/win32/browseui/lang/it-IT.rc @@ -87,6 +87,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/ja-JP.rc b/reactos/dll/win32/browseui/lang/ja-JP.rc index 9a9f609d7c4..4641cb8087f 100644 --- a/reactos/dll/win32/browseui/lang/ja-JP.rc +++ b/reactos/dll/win32/browseui/lang/ja-JP.rc @@ -105,6 +105,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/pl-PL.rc b/reactos/dll/win32/browseui/lang/pl-PL.rc index c72b83e0ebc..8c4a452d452 100644 --- a/reactos/dll/win32/browseui/lang/pl-PL.rc +++ b/reactos/dll/win32/browseui/lang/pl-PL.rc @@ -95,6 +95,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/pt-BR.rc b/reactos/dll/win32/browseui/lang/pt-BR.rc index 99ab81dce2f..7db17de7cd8 100644 --- a/reactos/dll/win32/browseui/lang/pt-BR.rc +++ b/reactos/dll/win32/browseui/lang/pt-BR.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/ro-RO.rc b/reactos/dll/win32/browseui/lang/ro-RO.rc index aade44f8e20..6836064b46c 100644 --- a/reactos/dll/win32/browseui/lang/ro-RO.rc +++ b/reactos/dll/win32/browseui/lang/ro-RO.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/ru-RU.rc b/reactos/dll/win32/browseui/lang/ru-RU.rc index a04675814f5..221c6058d71 100644 --- a/reactos/dll/win32/browseui/lang/ru-RU.rc +++ b/reactos/dll/win32/browseui/lang/ru-RU.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/sq-AL.rc b/reactos/dll/win32/browseui/lang/sq-AL.rc index 5677ba0ea08..d6d657f4147 100644 --- a/reactos/dll/win32/browseui/lang/sq-AL.rc +++ b/reactos/dll/win32/browseui/lang/sq-AL.rc @@ -106,6 +106,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/tr-TR.rc b/reactos/dll/win32/browseui/lang/tr-TR.rc index 56d18934019..a1856f10139 100644 --- a/reactos/dll/win32/browseui/lang/tr-TR.rc +++ b/reactos/dll/win32/browseui/lang/tr-TR.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/uk-UA.rc b/reactos/dll/win32/browseui/lang/uk-UA.rc index 34f8ba04d1a..ea8de8a3a9c 100644 --- a/reactos/dll/win32/browseui/lang/uk-UA.rc +++ b/reactos/dll/win32/browseui/lang/uk-UA.rc @@ -89,6 +89,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/zh-CN.rc b/reactos/dll/win32/browseui/lang/zh-CN.rc index 9d5c09813fe..622e665c1e5 100644 --- a/reactos/dll/win32/browseui/lang/zh-CN.rc +++ b/reactos/dll/win32/browseui/lang/zh-CN.rc @@ -107,6 +107,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/lang/zh-TW.rc b/reactos/dll/win32/browseui/lang/zh-TW.rc index 07ca95714fe..a658735e472 100644 --- a/reactos/dll/win32/browseui/lang/zh-TW.rc +++ b/reactos/dll/win32/browseui/lang/zh-TW.rc @@ -107,6 +107,12 @@ BEGIN END END +IDM_BAND_MENU MENUEX +BEGIN + MENUITEM "Sho&w title", IDM_BAND_TITLE + MENUITEM "&Close toolbar", IDM_BAND_CLOSE +END + /* Dialogs */ IDD_PROGRESS_DLG DIALOGEX 0, 0, 260, 85 diff --git a/reactos/dll/win32/browseui/resource.h b/reactos/dll/win32/browseui/resource.h index 731010016c2..31f32fec21d 100644 --- a/reactos/dll/win32/browseui/resource.h +++ b/reactos/dll/win32/browseui/resource.h @@ -60,6 +60,10 @@ #define IDM_TASKBAR_TOOLBARS_QUICKLAUNCH 4 #define IDM_TASKBAR_TOOLBARS_NEW 1 +#define IDM_BAND_MENU 269 +#define IDM_BAND_TITLE 0xA200 +#define IDM_BAND_CLOSE 0xA201 + /* Random id for band close button, feel free to change it */ #define IDM_BASEBAR_CLOSE 0xA200 diff --git a/reactos/dll/win32/browseui/shellbars/CBandSite.cpp b/reactos/dll/win32/browseui/shellbars/CBandSite.cpp index eddd7cbc42a..ff65a794472 100644 --- a/reactos/dll/win32/browseui/shellbars/CBandSite.cpp +++ b/reactos/dll/win32/browseui/shellbars/CBandSite.cpp @@ -221,6 +221,83 @@ HRESULT CBandSiteBase::UpdateBand(DWORD dwBandID) return UpdateSingleBand(Band); } +HRESULT CBandSiteBase::OnContextMenu(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult) +{ + /* Find the index fo the band that was clicked */ + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); + + RBHITTESTINFO htInfo = {{x, y}}; + ScreenToClient(fRebarWindow, &htInfo.pt); + int iBand = SendMessageW(fRebarWindow, RB_HITTEST, 0, (LPARAM)&htInfo); + if (iBand < 0) + { + /* FIXME: what to do here? */ + return S_OK; + } + + /* Now get the id of the band that was clicked */ + REBARBANDINFOW bandInfo = {sizeof(bandInfo), RBBIM_ID}; + SendMessageW(fRebarWindow, RB_GETBANDINFOW, htInfo.iBand, (LPARAM)&bandInfo); + + /* Finally get the band */ + DWORD dwBandID = bandInfo.wID; + struct BandObject *Band = GetBandByID(dwBandID); + if (Band == NULL) + return E_FAIL; + + HMENU hMenu = CreatePopupMenu(); + if (hMenu == NULL) + return E_OUTOFMEMORY; + + /* Try to load the menu of the band */ + UINT idBandLast = 0; + CComPtr pcm; + HRESULT hr = Band->DeskBand->QueryInterface(IID_PPV_ARG(IContextMenu, &pcm)); + if (SUCCEEDED(hr)) + { + hr = pcm->QueryContextMenu(hMenu, 0, 0, UINT_MAX, CMF_NORMAL); + if (SUCCEEDED(hr)) + { + idBandLast = HRESULT_CODE(hr); + } + } + + /* Load the static part of the menu */ + HMENU hMenuStatic = LoadMenuW(GetModuleHandleW(L"browseui.dll"), MAKEINTRESOURCEW(IDM_BAND_MENU)); + if (hMenuStatic) + Shell_MergeMenus(hMenu, hMenuStatic, UINT_MAX, 0, UINT_MAX, MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS); + + EnableMenuItem(hMenu, IDM_BAND_TITLE, MF_GRAYED); + /* TODO: Show IDM_BAND_TITLE as checked if the band title is shown */ + + /* TODO: Query the menu of our site */ + + UINT uCommand = ::TrackPopupMenuEx(hMenu, TPM_RETURNCMD, x, y, fRebarWindow, NULL); + if (uCommand < idBandLast) + { + CMINVOKECOMMANDINFO cmi = { sizeof(cmi), 0, fRebarWindow, MAKEINTRESOURCEA(uCommand)}; + hr = pcm->InvokeCommand(&cmi); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + } + else + { + if (uCommand == IDM_BAND_TITLE) + { + /* TODO: Implement showing or hiding the title */ + } + else if(uCommand == IDM_BAND_CLOSE) + { + hr = RemoveBand(dwBandID); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + } + } + + return S_OK; +} + struct CBandSiteBase::BandObject *CBandSiteBase::GetBandFromHwnd(HWND hwnd) { HRESULT hRet; @@ -567,6 +644,15 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM if (fRebarWindow == NULL) return E_FAIL; + if (uMsg == WM_CONTEXTMENU) + { + HRESULT hr = OnContextMenu(hWnd, uMsg, wParam, lParam, plrResult); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + return S_OK; + } + if (hWnd == fRebarWindow) { /* FIXME: Just send the message? */ diff --git a/reactos/dll/win32/browseui/shellbars/CBandSite.h b/reactos/dll/win32/browseui/shellbars/CBandSite.h index 2bef9ab98e6..c4c1b39df37 100644 --- a/reactos/dll/win32/browseui/shellbars/CBandSite.h +++ b/reactos/dll/win32/browseui/shellbars/CBandSite.h @@ -120,6 +120,7 @@ private: HRESULT UpdateAllBands(); HRESULT UpdateBand(DWORD dwBandID); struct BandObject *GetBandFromHwnd(HWND hwnd); + HRESULT OnContextMenu(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult); BEGIN_COM_MAP(CBandSiteBase) COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) diff --git a/reactos/dll/win32/browseui/shellbars/shellbars.h b/reactos/dll/win32/browseui/shellbars/shellbars.h index b85d98c314f..0c3b58b3de9 100644 --- a/reactos/dll/win32/browseui/shellbars/shellbars.h +++ b/reactos/dll/win32/browseui/shellbars/shellbars.h @@ -33,4 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(browseui); +#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) +#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) + #endif /* _BROWSEUI_PCH_ */