Reactos

[SHELL32][BROWSEUI] Make externally available FCIDM WM_COMMANDs work correctly (#8150)

authored by

Whindmar Saksit and committed by
GitHub
38ad1ca3 02ad6b17

+119 -70
+43 -21
dll/win32/browseui/shellbrowser.cpp
··· 654 654 LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 655 655 LRESULT OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 656 656 LRESULT OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 657 + LRESULT OnToggleExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 657 658 LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 658 659 LRESULT OnCabinetStateChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 659 660 LRESULT OnSettingsChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); ··· 706 707 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible) 707 708 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels) 708 709 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize) 709 - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH, OnExplorerBar) 710 - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS, OnExplorerBar) 711 - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY, OnExplorerBar) 712 - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES, OnExplorerBar) 710 + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH, OnToggleExplorerBar) 711 + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS, OnToggleExplorerBar) 712 + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY, OnToggleExplorerBar) 713 + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES, OnToggleExplorerBar) 713 714 COMMAND_ID_HANDLER(IDM_BACKSPACE, OnBackspace) 714 715 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel) 715 716 COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM, IDM_EXPLORERBAND_ENDCUSTOM, OnExplorerBar) ··· 2857 2858 2858 2859 LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam) 2859 2860 { 2860 - return 0; 2861 + return SendMessage(WM_COMMAND, wParam, lParam); 2861 2862 } 2862 2863 2863 2864 HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy() ··· 3919 3920 3920 3921 LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 3921 3922 { 3923 + C_ASSERT(FCIDM_SHBROWSER_OPTIONS == IDM_TOOLS_FOLDEROPTIONS && FCIDM_SHBROWSER_OPTIONS == 0xA123); 3922 3924 HRESULT hResult = DoFolderOptions(); 3923 3925 if (FAILED(hResult)) 3924 3926 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult); ··· 4102 4104 4103 4105 LRESULT CShellBrowser::OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 4104 4106 { 4107 + C_ASSERT(FCIDM_CABINET_REFRESH == IDM_VIEW_REFRESH && FCIDM_CABINET_REFRESH == 0xA220); 4105 4108 if (fCurrentShellView) 4106 4109 fCurrentShellView->Refresh(); 4107 4110 return 0; ··· 4125 4128 bHandled = TRUE; 4126 4129 return 1; 4127 4130 } 4131 + return 0; 4132 + } 4133 + 4134 + LRESULT CShellBrowser::OnToggleExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 4135 + { 4136 + UINT sbci = 0; 4128 4137 switch (wID) 4129 4138 { 4130 - case IDM_EXPLORERBAR_SEARCH: 4131 - ShowBand(CLSID_FileSearchBand, true); 4132 - break; 4133 - case IDM_EXPLORERBAR_FOLDERS: 4134 - ShowBand(CLSID_ExplorerBand, true); 4135 - break; 4136 - case IDM_EXPLORERBAR_HISTORY: 4137 - ShowBand(CLSID_SH_HistBand, true); 4138 - break; 4139 - case IDM_EXPLORERBAR_FAVORITES: 4140 - ShowBand(CLSID_SH_FavBand, true); 4141 - break; 4142 - default: 4143 - WARN("Unknown id %x\n", wID); 4139 + case IDM_EXPLORERBAR_SEARCH: sbci = 0x1c; break; 4140 + case IDM_EXPLORERBAR_FAVORITES: sbci = 0x1e; break; 4141 + case IDM_EXPLORERBAR_HISTORY: sbci = 0x1d; break; 4142 + case IDM_EXPLORERBAR_FOLDERS: sbci = SBCMDID_EXPLORERBARFOLDERS; break; 4143 + default: WARN("Unknown id %x\n", wID); 4144 4144 } 4145 - bHandled = TRUE; 4146 - return 1; 4145 + if (sbci) 4146 + { 4147 + this->Exec(&CGID_Explorer, sbci, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); 4148 + bHandled = TRUE; 4149 + } 4150 + return TRUE; 4147 4151 } 4148 4152 4149 4153 LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 4150 4154 { 4155 + CComHeapPtr<ITEMIDLIST> pidl; 4156 + switch (LOWORD(wParam)) 4157 + { 4158 + case FCIDM_SHBROWSER_REFRESH: 4159 + wParam = FCIDM_SHVIEW_REFRESH; 4160 + break; 4161 + case FCIDM_SHBROWSER_FINDFILES: 4162 + return OnCommand(IDM_EXPLORERBAR_SEARCH, 0); 4163 + case FCIDM_CABINET_NT5_GOTO_DRIVES: 4164 + if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidl))) 4165 + BrowseObject(pidl, SBSP_ABSOLUTE | SBSP_SAMEBROWSER | SBSP_ACTIVATE_NOFOCUS); 4166 + return 0; 4167 + #if 0 // TODO: Toggle entire itbar(rebar) after LPTOOLBARITEM->fShow support is added 4168 + case FCIDM_CABINET_TOGGLEITBAR: 4169 + break; 4170 + #endif 4171 + } 4172 + 4151 4173 if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL) 4152 4174 return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam); 4153 4175 return 0;
+18 -36
dll/win32/shell32/CDefView.cpp
··· 2566 2566 2567 2567 switch (dwCmdID) 2568 2568 { 2569 - case FCIDM_SHVIEW_SMALLICON: 2570 - m_FolderSettings.ViewMode = FVM_SMALLICON; 2571 - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); 2572 - CheckToolbar(); 2573 - break; 2574 - case FCIDM_SHVIEW_BIGICON: 2575 - m_FolderSettings.ViewMode = FVM_ICON; 2576 - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_ICON); 2577 - CheckToolbar(); 2578 - break; 2579 - case FCIDM_SHVIEW_LISTVIEW: 2580 - m_FolderSettings.ViewMode = FVM_LIST; 2581 - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_LIST); 2582 - CheckToolbar(); 2583 - break; 2584 - case FCIDM_SHVIEW_REPORTVIEW: 2585 - m_FolderSettings.ViewMode = FVM_DETAILS; 2586 - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); 2587 - CheckToolbar(); 2569 + case FCIDM_SHVIEW_BIGICON: C_ASSERT(FCIDM_SHVIEW_BIGICON == 0x7029); 2570 + case FCIDM_SHVIEW_SMALLICON: C_ASSERT(FCIDM_SHVIEW_SMALLICON == 0x702A); 2571 + case FCIDM_SHVIEW_LISTVIEW: C_ASSERT(FCIDM_SHVIEW_LISTVIEW == 0x702B); 2572 + case FCIDM_SHVIEW_REPORTVIEW: C_ASSERT(FCIDM_SHVIEW_REPORTVIEW == 0x702C); 2573 + case 0x702D: 2574 + case FCIDM_SHVIEW_TILEVIEW: C_ASSERT(FCIDM_SHVIEW_TILEVIEW == 0x702E); 2575 + case 0x702F: 2576 + SetCurrentViewMode(dwCmdID - FCIDM_SHVIEW_BIGICON + 1); 2588 2577 break; 2589 2578 case FCIDM_SHVIEW_SNAPTOGRID: 2590 2579 m_ListView.Arrange(LVA_SNAPTOGRID); ··· 2610 2599 for (int i=0; i < nCount; i++) 2611 2600 m_ListView.SetItemState(i, m_ListView.GetItemState(i, LVIS_SELECTED) ^ LVIS_SELECTED, LVIS_SELECTED); 2612 2601 break; 2602 + case FCIDM_SHVIEW_DESELECTALL: 2603 + m_ListView.SetItemState(-1, 0, LVIS_SELECTED); 2604 + break; 2613 2605 case FCIDM_SHVIEW_REFRESH: 2614 2606 Refresh(); 2615 2607 break; ··· 2621 2613 if (SHRestricted(REST_NOVIEWCONTEXTMENU)) 2622 2614 return 0; 2623 2615 return OnExplorerCommand(dwCmdID, TRUE); 2624 - case FCIDM_SHVIEW_COPYTO: 2625 - case FCIDM_SHVIEW_MOVETO: 2616 + case FCIDM_SHVIEW_COPYTO: C_ASSERT(FCIDM_SHVIEW_COPYTO == 0x701e); 2617 + case FCIDM_SHVIEW_MOVETO: C_ASSERT(FCIDM_SHVIEW_MOVETO == 0x701f); 2626 2618 _DoCopyToMoveToFolder(dwCmdID == FCIDM_SHVIEW_COPYTO); 2627 2619 return 0; 2628 2620 case FCIDM_SHVIEW_INSERT: ··· 3636 3628 means. */ 3637 3629 switch (ViewMode) 3638 3630 { 3639 - case FVM_ICON: 3640 - dwStyle = LVS_ICON; 3641 - break; 3642 - case FVM_DETAILS: 3643 - dwStyle = LVS_REPORT; 3644 - break; 3645 - case FVM_SMALLICON: 3646 - dwStyle = LVS_SMALLICON; 3647 - break; 3648 - case FVM_LIST: 3649 - dwStyle = LVS_LIST; 3650 - break; 3631 + case FVM_ICON: dwStyle = LVS_ICON; break; 3632 + case FVM_SMALLICON: dwStyle = LVS_SMALLICON; break; 3633 + case FVM_LIST: dwStyle = LVS_LIST; break; 3634 + case FVM_DETAILS: dwStyle = LVS_REPORT; break; 3651 3635 default: 3652 - { 3653 3636 FIXME("ViewMode %d not implemented\n", ViewMode); 3654 3637 dwStyle = LVS_LIST; 3655 3638 break; 3656 - } 3657 3639 } 3658 3640 3659 3641 m_ListView.ModifyStyle(LVS_TYPEMASK, dwStyle); ··· 3661 3643 /* This will not necessarily be the actual mode set above. 3662 3644 This mimics the behavior of Windows XP. */ 3663 3645 m_FolderSettings.ViewMode = ViewMode; 3664 - 3646 + CheckToolbar(); 3665 3647 return S_OK; 3666 3648 } 3667 3649
+1 -1
dll/win32/shell32/CDefaultContextMenu.cpp
··· 1015 1015 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds); 1016 1016 1017 1017 /* Add the default part of the menu */ 1018 - HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE"); 1018 + HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCEW(MENU_SHV_FILE)); 1019 1019 1020 1020 /* Remove uneeded entries */ 1021 1021 if (!(rfg & SFGAO_CANMOVE))
+13 -1
dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp
··· 33 33 static const WCHAR szProgmanClassName[] = L"Progman"; 34 34 static const WCHAR szProgmanWindowName[] = L"Program Manager"; 35 35 36 + static BOOL IsDesktopBrowserForwardShellViewCmd(WORD Cmd) 37 + { 38 + // Note: The normal CShellBrowser forwards the entire FCIDM_SHVIEWFIRST..LAST range, we do not. 39 + // Note: Windows allows FCIDM_SHVIEW_SHOWINGROUPS but we don't support it nor does it make sense. 40 + return (FCIDM_SHVIEW_CREATELINK <= Cmd && Cmd <= FCIDM_SHVIEW_DESELECTALL) || 41 + (FCIDM_SHVIEW_ARRANGE_AUTO <= Cmd && Cmd <= FCIDM_SHVIEW_ARRANGE_AUTOGRID) || 42 + (Cmd == FCIDM_SHVIEW_REFRESH); 43 + } 44 + 36 45 class CDesktopBrowser : 37 46 public CWindowImpl<CDesktopBrowser, CWindow, CFrameWinTraits>, 38 47 public CComObjectRootEx<CComMultiThreadModelNoCS>, ··· 399 408 if (m_ShellView) 400 409 m_ShellView->Refresh(); 401 410 break; 411 + default: 412 + if (IsDesktopBrowserForwardShellViewCmd(LOWORD(wParam)) && m_hWndShellView) 413 + return SendMessageW(m_hWndShellView, uMsg, wParam, lParam); 414 + break; 402 415 } 403 - 404 416 return 0; 405 417 } 406 418
+11 -8
dll/win32/shell32/shresdef.h
··· 856 856 /* Shell view commands */ 857 857 #define FCIDM_SHVIEW_ARRANGE 0x7001 858 858 #define FCIDM_SHVIEW_VIEW 0x7002 859 + #define FCIDM_SHVIEW_CREATELINK 0x7010 859 860 #define FCIDM_SHVIEW_DELETE 0x7011 861 + #define FCIDM_SHVIEW_RENAME 0x7012 860 862 #define FCIDM_SHVIEW_PROPERTIES 0x7013 861 863 #define FCIDM_SHVIEW_CUT 0x7018 862 864 #define FCIDM_SHVIEW_COPY 0x7019 ··· 868 870 #define FCIDM_SHVIEW_SELECTALL 0x7021 869 871 #define FCIDM_SHVIEW_INVERTSELECTION 0x7022 870 872 871 - #define FCIDM_SHVIEW_BIGICON 0x7029 //FIXME 872 - #define FCIDM_SHVIEW_SMALLICON 0x702A //FIXME 873 - #define FCIDM_SHVIEW_LISTVIEW 0x702B //FIXME 874 - #define FCIDM_SHVIEW_REPORTVIEW 0x702C //FIXME 873 + #define FCIDM_SHVIEW_BIGICON 0x7029 874 + #define FCIDM_SHVIEW_SMALLICON 0x702A 875 + #define FCIDM_SHVIEW_LISTVIEW 0x702B 876 + #define FCIDM_SHVIEW_REPORTVIEW 0x702C 877 + #define FCIDM_SHVIEW_TILEVIEW 0x702E 875 878 /* 0x7030-0x703f are used by the shellbrowser */ 876 879 #define FCIDM_SHVIEW_AUTOARRANGE 0x7031 877 880 #define FCIDM_SHVIEW_SNAPTOGRID 0x7032 878 881 #define FCIDM_SHVIEW_ALIGNTOGRID 0x7033 879 882 880 883 #define FCIDM_SHVIEW_HELP 0x7041 881 - #define FCIDM_SHVIEW_RENAME 0x7050 882 - #define FCIDM_SHVIEW_CREATELINK 0x7051 883 884 #define FCIDM_SHVIEW_NEWLINK 0x7052 884 885 #define FCIDM_SHVIEW_NEWFOLDER 0x7053 885 886 886 - #define FCIDM_SHVIEW_REFRESH 0x7100 /* FIXME */ 887 887 #define FCIDM_SHVIEW_EXPLORE 0x7101 /* FIXME */ 888 888 #define FCIDM_SHVIEW_OPEN 0x7102 /* FIXME */ 889 + #define FCIDM_SHVIEW_REFRESH 0x7103 889 890 890 891 #define FCIDM_TB_UPFOLDER 0xA001 891 892 #define FCIDM_TB_NEWFOLDER 0xA002 ··· 893 894 #define FCIDM_TB_REPORTVIEW 0xA004 894 895 #define FCIDM_TB_DESKTOP 0xA005 /* FIXME */ 895 896 897 + #define MENU_SHV_FILE 210 896 898 #define IDM_UNDO (FCIDM_SHVIEW_UNDO - 0x7000) 897 899 #define IDM_CUT (FCIDM_SHVIEW_CUT - 0x7000) 898 900 #define IDM_COPY (FCIDM_SHVIEW_COPY - 0x7000) ··· 900 902 #define IDM_CREATELINK (FCIDM_SHVIEW_CREATELINK - 0x7000) 901 903 #define IDM_DELETE (FCIDM_SHVIEW_DELETE - 0x7000) 902 904 #define IDM_RENAME (FCIDM_SHVIEW_RENAME - 0x7000) 903 - #define IDM_PROPERTIES (FCIDM_SHVIEW_PROPERTIES - 0x7000) 904 905 #define IDM_COPYTO (FCIDM_SHVIEW_COPYTO - 0x7000) 905 906 #define IDM_MOVETO (FCIDM_SHVIEW_MOVETO - 0x7000) 907 + #define MENU_SHV_FILEPROPERTIES 211 908 + #define IDM_PROPERTIES (FCIDM_SHVIEW_PROPERTIES - 0x7000) 906 909 907 910 #define IDM_DRAGFILE 0xce 908 911 #define IDM_COPYHERE 0x7
-3
sdk/include/psdk/shlobj.h
··· 610 610 #define FCIDM_SHVIEW_ALIGNTOGRID 0x7033 611 611 612 612 #define FCIDM_SHVIEW_HELP 0x7041 613 - #define FCIDM_SHVIEW_RENAME 0x7050 614 - #define FCIDM_SHVIEW_CREATELINK 0x7051 615 613 #define FCIDM_SHVIEW_NEWLINK 0x7052 616 614 #define FCIDM_SHVIEW_NEWFOLDER 0x7053 617 615 618 - #define FCIDM_SHVIEW_REFRESH 0x7100 /* FIXME */ 619 616 #define FCIDM_SHVIEW_EXPLORE 0x7101 /* FIXME */ 620 617 #define FCIDM_SHVIEW_OPEN 0x7102 /* FIXME */ 621 618
+33
sdk/include/reactos/shlobj_undoc.h
··· 47 47 ULONG pidlSize; 48 48 }; 49 49 50 + /**************************************************************************** 51 + * IShellView/IShellBrowser/CabinetWClass WM_COMMAND identifiers 52 + */ 53 + #define FCIDM_SHVIEW_CREATELINK 0x7010 54 + #define FCIDM_SHVIEW_DELETE 0x7011 55 + #define FCIDM_SHVIEW_RENAME 0x7012 56 + #define FCIDM_SHVIEW_PROPERTIES 0x7013 57 + #define FCIDM_SHVIEW_CUT 0x7018 58 + #define FCIDM_SHVIEW_COPY 0x7019 59 + #define FCIDM_SHVIEW_INSERT 0x701A 60 + #define FCIDM_SHVIEW_UNDO 0x701B 61 + #define FCIDM_SHVIEW_INSERTLINK 0x701C 62 + #define FCIDM_SHVIEW_COPYTO 0x701E 63 + #define FCIDM_SHVIEW_MOVETO 0x701F 64 + #define FCIDM_SHVIEW_SELECTALL 0x7021 65 + #define FCIDM_SHVIEW_INVERTSELECTION 0x7022 66 + #define FCIDM_SHVIEW_DESELECTALL 0x7023 67 + #define FCIDM_SHVIEW_ARRANGE_AUTO 0x7051 // IShellFolderView::AutoArrange 68 + #define FCIDM_SHVIEW_ARRANGE_GRID 0x7052 // IShellFolderView::ArrangeGrid => LVA_SNAPTOGRID 69 + #define FCIDM_SHVIEW_SHOWDESKTOPICONS 0x7053 70 + #define FCIDM_SHVIEW_ARRANGE_AUTOGRID 0x7054 71 + #define FCIDM_SHVIEW_REFRESH 0x7103 72 + #define FCIDM_SHVIEW_SHOWINGROUPS 0x7601 73 + #define FCIDM_SHBROWSER_REFRESH 0xA065 74 + #define FCIDM_SHBROWSER_MAPNETDRIVE 0xA081 75 + #define FCIDM_SHBROWSER_UNMAPNETDRIVE 0xA082 76 + #define FCIDM_SHBROWSER_FINDFILES 0xA085 77 + #define FCIDM_SHBROWSER_OPTIONS 0xA123 78 + #define FCIDM_CABINET_NT5_GOTO_DRIVES 0xA132 79 + #define FCIDM_CABINET_TOGGLEITBAR 0xA201 80 + #define FCIDM_CABINET_TOGGLESTATUSBAR 0xA202 81 + #define FCIDM_CABINET_REFRESH 0xA220 82 + 50 83 /***************************************************************************** 51 84 * CGID_Explorer (IShellBrowser OLECMD IDs) 52 85 */