Reactos
at master 184 lines 5.7 kB view raw
1/* 2 * Folder options. 3 * 4 * Copyright (C) 2016 Mark Jansen 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21#include <precomp.h> 22#include <shdeprecated.h> 23 24 25WINE_DEFAULT_DEBUG_CHANNEL(fprop); 26 27CFolderOptions::CFolderOptions() 28 :m_pSite(NULL) 29{ 30} 31 32CFolderOptions::~CFolderOptions() 33{ 34} 35 36/************************************************************************* 37 * FolderOptions IShellPropSheetExt interface 38 */ 39 40INT_PTR CALLBACK FolderOptionsGeneralDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 41INT_PTR CALLBACK FolderOptionsViewDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 42INT_PTR CALLBACK FolderOptionsFileTypesDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 43 44HRESULT STDMETHODCALLTYPE CFolderOptions::AddPages(LPFNSVADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) 45{ 46 HPROPSHEETPAGE hPage; 47 LPARAM sheetparam = (LPARAM)static_cast<CFolderOptions*>(this); 48 49 hPage = SH_CreatePropertySheetPageEx(IDD_FOLDER_OPTIONS_GENERAL, FolderOptionsGeneralDlg, 50 sheetparam, NULL, &PropSheetPageLifetimeCallback<CFolderOptions>); 51 HRESULT hr = AddPropSheetPage(hPage, pfnAddPage, lParam); 52 if (FAILED_UNEXPECTEDLY(hr)) 53 { 54 ERR("Failed to create property sheet page FolderOptionsGeneral\n"); 55 return hr; 56 } 57 else 58 { 59 AddRef(); // For PropSheetPageLifetimeCallback 60 } 61 62 hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_VIEW, FolderOptionsViewDlg, sheetparam, NULL); 63 if (hPage == NULL) 64 { 65 ERR("Failed to create property sheet page FolderOptionsView\n"); 66 return E_FAIL; 67 } 68 if (!pfnAddPage(hPage, lParam)) 69 return E_FAIL; 70 71 hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_FILETYPES, FolderOptionsFileTypesDlg, sheetparam, NULL); 72 if (hPage == NULL) 73 { 74 ERR("Failed to create property sheet page FolderOptionsFileTypes\n"); 75 return E_FAIL; 76 } 77 if (!pfnAddPage(hPage, lParam)) 78 return E_FAIL; 79 80 return S_OK; 81} 82 83HRESULT STDMETHODCALLTYPE CFolderOptions::ReplacePage(EXPPS uPageID, LPFNSVADDPROPSHEETPAGE pfnReplaceWith, LPARAM lParam) 84{ 85 TRACE("(%p) (uPageID %u, pfnReplaceWith %p lParam %p\n", this, uPageID, pfnReplaceWith, lParam); 86 return E_NOTIMPL; 87} 88 89/************************************************************************* 90 * FolderOptions IShellExtInit interface 91 */ 92 93HRESULT STDMETHODCALLTYPE CFolderOptions::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID) 94{ 95 return S_OK; 96} 97 98 99/************************************************************************* 100 * FolderOptions IObjectWithSite interface 101 */ 102HRESULT STDMETHODCALLTYPE CFolderOptions::SetSite(IUnknown *pUnkSite) 103{ 104 m_pSite = pUnkSite; 105 return S_OK; 106} 107 108HRESULT STDMETHODCALLTYPE CFolderOptions::GetSite(REFIID riid, void **ppvSite) 109{ 110 return m_pSite ? m_pSite->QueryInterface(riid, ppvSite) : E_FAIL; 111} 112 113/************************************************************************* 114 * FolderOptions helper methods 115 */ 116static HRESULT ResetGlobalFolderSettings() 117{ 118 IGlobalFolderSettings *pgfs; 119 HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, 120 IID_PPV_ARG(IGlobalFolderSettings, &pgfs)); 121 if (SUCCEEDED(hr)) 122 { 123 hr = pgfs->Set(NULL, 0, 0); 124 pgfs->Release(); 125 } 126 return hr; 127} 128 129static inline HRESULT ExecResetDefViewFolderSettings(IUnknown *pUnk) 130{ 131 return IUnknown_Exec(pUnk, CGID_DefView, DVCMDID_RESET_DEFAULTFOLDER_SETTINGS, 132 OLECMDEXECOPT_DODEFAULT, NULL, NULL); 133} 134 135static HRESULT ResetDefViewFolderSettings() 136{ 137 CComPtr<IShellFolder> pSF; 138 HRESULT hr = SHGetDesktopFolder(&pSF); 139 if (SUCCEEDED(hr)) 140 { 141 CComPtr<IShellView> pSV; 142 SFV_CREATE create = { sizeof(SFV_CREATE), pSF }; 143 if (SUCCEEDED(hr = SHCreateShellFolderView(&create, &pSV))) 144 hr = ExecResetDefViewFolderSettings(pSV); 145 } 146 return hr; 147} 148 149HRESULT CFolderOptions::ResetGlobalAndDefViewFolderSettings() 150{ 151 ResetDefViewFolderSettings(); 152 return ResetGlobalFolderSettings(); 153} 154 155HRESULT CFolderOptions::HandleDefFolderSettings(int Action) 156{ 157 IBrowserService2 *bs2; 158 HRESULT hr = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService2, &bs2)); 159 if (SUCCEEDED(hr)) 160 { 161 if (Action == DFSA_APPLY) 162 { 163 hr = bs2->SetAsDefFolderSettings(); 164 } 165 else if (Action == DFSA_RESET) 166 { 167 // There does not seem to be a method in IBrowserService2 for this 168 ExecResetDefViewFolderSettings(bs2); 169 } 170 else 171 { 172 // DFSA_QUERY: hr is already correct 173 } 174 bs2->Release(); 175 } 176 177 if (Action == DFSA_RESET) 178 { 179 // In case the browser is hosting a 3rd-party view, we force a DefView reset 180 hr = ResetGlobalAndDefViewFolderSettings(); 181 } 182 183 return hr; 184}