Reactos
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}