mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[SHELL32][BROWSEUI] Implement ShellBrowser Apply/Reset default folder settings (#6912)
This commit is contained in:
parent
ad73e17418
commit
c97c1ad4c5
12 changed files with 339 additions and 38 deletions
|
@ -20,6 +20,52 @@
|
|||
|
||||
#include "precomp.h"
|
||||
|
||||
#define DEFBROWSERSTREAM L"Settings"
|
||||
#define DEFAULT_VID GUID_NULL // We don't support WebView
|
||||
#define CURRENT_VERSION ( DEFFOLDERSETTINGS::VER_XP )
|
||||
|
||||
template<class S, class D> static void CopyTo(const S &Src, D &Dst)
|
||||
{
|
||||
Dst.FolderSettings = Src.FolderSettings;
|
||||
}
|
||||
|
||||
static void EnsureValid(FOLDERSETTINGS &fs)
|
||||
{
|
||||
if ((int)fs.ViewMode < FVM_AUTO || (int)fs.ViewMode > FVM_LAST)
|
||||
fs.ViewMode = SBFOLDERSETTINGS::DEF_FVM;
|
||||
|
||||
fs.fFlags &= ~(FWF_OWNERDATA | FWF_DESKTOP | FWF_TRANSPARENT | FWF_NOCLIENTEDGE |
|
||||
FWF_NOSUBFOLDERS | FWF_NOSCROLL | FWF_NOENUMREFRESH | FWF_NOVISIBLE);
|
||||
}
|
||||
|
||||
static void EnsureValid(DEFFOLDERSETTINGS &dfs)
|
||||
{
|
||||
EnsureValid(dfs.FolderSettings);
|
||||
}
|
||||
|
||||
static void InitializeDefaults(DEFFOLDERSETTINGS &dfs)
|
||||
{
|
||||
C_ASSERT(FIELD_OFFSET(DEFFOLDERSETTINGS, FolderSettings) == 4);
|
||||
C_ASSERT(FIELD_OFFSET(DEFFOLDERSETTINGS, ViewPriority) == DEFFOLDERSETTINGS::SIZE_IE4);
|
||||
C_ASSERT(sizeof(DEFFOLDERSETTINGS) == DEFFOLDERSETTINGS::SIZE_XP);
|
||||
|
||||
*(UINT*)&dfs = FALSE; // Set all unknown flags to FALSE
|
||||
dfs.Statusbar = TRUE;
|
||||
dfs.FolderSettings.ViewMode = SBFOLDERSETTINGS::DEF_FVM;
|
||||
dfs.FolderSettings.fFlags = SBFOLDERSETTINGS::DEF_FWF;
|
||||
dfs.vid = DEFAULT_VID;
|
||||
dfs.Version = CURRENT_VERSION;
|
||||
dfs.Counter = 0;
|
||||
dfs.ViewPriority = VIEW_PRIORITY_CACHEMISS;
|
||||
}
|
||||
|
||||
void SBFOLDERSETTINGS::Load()
|
||||
{
|
||||
DEFFOLDERSETTINGS dfs;
|
||||
CGlobalFolderSettings::Load(dfs);
|
||||
CopyTo(dfs, *this);
|
||||
}
|
||||
|
||||
CGlobalFolderSettings::CGlobalFolderSettings()
|
||||
{
|
||||
}
|
||||
|
@ -28,13 +74,83 @@ CGlobalFolderSettings::~CGlobalFolderSettings()
|
|||
{
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Get(DEFFOLDERSETTINGS *paramC, int param10)
|
||||
HRESULT CGlobalFolderSettings::ResetBrowserSettings()
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
return Save(NULL);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Set(
|
||||
const DEFFOLDERSETTINGS *paramC, int param10, unsigned int param14)
|
||||
HRESULT CGlobalFolderSettings::SaveBrowserSettings(const SBFOLDERSETTINGS &sbfs)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
DEFFOLDERSETTINGS dfs;
|
||||
InitializeDefaults(dfs);
|
||||
CopyTo(sbfs, dfs);
|
||||
return Save(&dfs);
|
||||
}
|
||||
|
||||
HRESULT CGlobalFolderSettings::Load(DEFFOLDERSETTINGS &dfs)
|
||||
{
|
||||
HKEY hStreamsKey = SHGetShellKey(SHKEY_Key_Explorer, L"Streams", FALSE);
|
||||
if (hStreamsKey)
|
||||
{
|
||||
DWORD cb = sizeof(DEFFOLDERSETTINGS);
|
||||
DWORD err = SHRegGetValueW(hStreamsKey, NULL, DEFBROWSERSTREAM,
|
||||
SRRF_RT_REG_BINARY, NULL, &dfs, &cb);
|
||||
RegCloseKey(hStreamsKey);
|
||||
if (!err && cb >= DEFFOLDERSETTINGS::SIZE_NT4)
|
||||
{
|
||||
if (cb < FIELD_OFFSET(DEFFOLDERSETTINGS, vid))
|
||||
{
|
||||
dfs.FolderSettings.fFlags = SBFOLDERSETTINGS::DEF_FWF;
|
||||
}
|
||||
if (cb < FIELD_OFFSET(DEFFOLDERSETTINGS, Version))
|
||||
{
|
||||
dfs.vid = DEFAULT_VID;
|
||||
}
|
||||
if (cb <= FIELD_OFFSET(DEFFOLDERSETTINGS, ViewPriority))
|
||||
{
|
||||
dfs.Version = CURRENT_VERSION;
|
||||
}
|
||||
dfs.ViewPriority = VIEW_PRIORITY_STALECACHEHIT;
|
||||
EnsureValid(dfs);
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
InitializeDefaults(dfs);
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
HRESULT CGlobalFolderSettings::Save(const DEFFOLDERSETTINGS *pFDS)
|
||||
{
|
||||
HKEY hStreamsKey = SHGetShellKey(SHKEY_Key_Explorer, L"Streams", TRUE);
|
||||
if (!hStreamsKey)
|
||||
return E_FAIL;
|
||||
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
if (!pFDS)
|
||||
{
|
||||
DWORD err = SHDeleteValueW(hStreamsKey, NULL, DEFBROWSERSTREAM);
|
||||
hr = (!err || err == ERROR_FILE_NOT_FOUND) ? S_OK : HResultFromWin32(err);
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD cb = sizeof(DEFFOLDERSETTINGS);
|
||||
hr = HResultFromWin32(SHSetValueW(hStreamsKey, NULL, DEFBROWSERSTREAM, REG_BINARY, pFDS, cb));
|
||||
}
|
||||
RegCloseKey(hStreamsKey);
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Get(struct DEFFOLDERSETTINGS *pFDS, UINT cb)
|
||||
{
|
||||
if (cb != sizeof(DEFFOLDERSETTINGS) || !pFDS)
|
||||
return E_INVALIDARG;
|
||||
return Load(*pFDS);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Set(const struct DEFFOLDERSETTINGS *pFDS, UINT cb, UINT unknown)
|
||||
{
|
||||
// NULL pFDS means reset
|
||||
if (cb != sizeof(DEFFOLDERSETTINGS) && pFDS)
|
||||
return E_INVALIDARG;
|
||||
return Save(pFDS);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,20 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
struct SBFOLDERSETTINGS // Private version of DEFFOLDERSETTINGS used by CShellBrowser
|
||||
{
|
||||
FOLDERSETTINGS FolderSettings;
|
||||
|
||||
enum { DEF_FVM = FVM_DETAILS }; // Windows uses FVM_ICON?
|
||||
enum { DEF_FWF = FWF_NOHEADERINALLVIEWS };
|
||||
void InitializeDefaults()
|
||||
{
|
||||
FolderSettings.ViewMode = DEF_FVM;
|
||||
FolderSettings.fFlags = DEF_FWF;
|
||||
}
|
||||
void Load();
|
||||
};
|
||||
|
||||
class CGlobalFolderSettings :
|
||||
public CComCoClass<CGlobalFolderSettings, &CLSID_GlobalFolderSettings>,
|
||||
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
||||
|
@ -30,9 +44,14 @@ public:
|
|||
CGlobalFolderSettings();
|
||||
~CGlobalFolderSettings();
|
||||
|
||||
static HRESULT ResetBrowserSettings();
|
||||
static HRESULT SaveBrowserSettings(const SBFOLDERSETTINGS &sbfs);
|
||||
static HRESULT Load(DEFFOLDERSETTINGS &dfs);
|
||||
static HRESULT Save(const DEFFOLDERSETTINGS *pFDS);
|
||||
|
||||
// *** IGlobalFolderSettings methods ***
|
||||
STDMETHOD(Get)(DEFFOLDERSETTINGS *paramC, int param10) override;
|
||||
STDMETHOD(Set)(const DEFFOLDERSETTINGS *paramC, int param10, unsigned int param14) override;
|
||||
STDMETHOD(Get)(struct DEFFOLDERSETTINGS *pFDS, UINT cb) override;
|
||||
STDMETHOD(Set)(const struct DEFFOLDERSETTINGS *pFDS, UINT cb, UINT unknown) override;
|
||||
|
||||
DECLARE_REGISTRY_RESOURCEID(IDR_GLOBALFOLDERSETTINGS)
|
||||
DECLARE_NOT_AGGREGATABLE(CGlobalFolderSettings)
|
||||
|
|
|
@ -24,7 +24,7 @@ void ShellSettings::Save()
|
|||
void ShellSettings::Load()
|
||||
{
|
||||
fStatusBarVisible = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main",
|
||||
L"StatusBarOther", FALSE, FALSE);
|
||||
L"StatusBarOther", FALSE, TRUE);
|
||||
|
||||
fShowGoButton = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main",
|
||||
L"ShowGoButton", FALSE, TRUE);
|
||||
|
|
|
@ -12,12 +12,13 @@
|
|||
|
||||
struct ShellSettings
|
||||
{
|
||||
BOOL fLocked = FALSE;
|
||||
BOOL fShowGoButton = FALSE;
|
||||
BOOL fStatusBarVisible = FALSE;
|
||||
BOOL fLocked = TRUE;
|
||||
BOOL fShowGoButton = TRUE;
|
||||
BOOL fStatusBarVisible = TRUE;
|
||||
|
||||
void Save();
|
||||
void Load();
|
||||
void Reset() { ShellSettings().Save(); }
|
||||
};
|
||||
|
||||
struct CabinetStateSettings : CABINETSTATE
|
||||
|
|
|
@ -305,6 +305,7 @@ private:
|
|||
HDSA menuDsa;
|
||||
HACCEL m_hAccel;
|
||||
ShellSettings m_settings;
|
||||
SBFOLDERSETTINGS m_deffoldersettings;
|
||||
public:
|
||||
#if 0
|
||||
ULONG InternalAddRef()
|
||||
|
@ -332,6 +333,7 @@ public:
|
|||
HRESULT ShowBand(const CLSID &classID, bool vertical);
|
||||
HRESULT NavigateToParent();
|
||||
HRESULT DoFolderOptions();
|
||||
HRESULT ApplyBrowserDefaultFolderSettings(IShellView *pvs);
|
||||
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
void RepositionBars();
|
||||
HRESULT BuildExplorerBandMenu();
|
||||
|
@ -723,6 +725,7 @@ CShellBrowser::CShellBrowser()
|
|||
fHistoryStream = NULL;
|
||||
fHistoryBindContext = NULL;
|
||||
m_settings.Load();
|
||||
m_deffoldersettings.Load();
|
||||
gCabinetState.Load();
|
||||
}
|
||||
|
||||
|
@ -802,13 +805,35 @@ HRESULT CShellBrowser::Initialize()
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CShellBrowser::ApplyBrowserDefaultFolderSettings(IShellView *pvs)
|
||||
{
|
||||
HRESULT hr;
|
||||
if (pvs)
|
||||
{
|
||||
m_settings.Save();
|
||||
SBFOLDERSETTINGS &sbfs = m_deffoldersettings, defsbfs;
|
||||
if (FAILED(pvs->GetCurrentInfo(&sbfs.FolderSettings)))
|
||||
{
|
||||
defsbfs.InitializeDefaults();
|
||||
sbfs = defsbfs;
|
||||
}
|
||||
hr = CGlobalFolderSettings::SaveBrowserSettings(sbfs);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.Reset();
|
||||
hr = CGlobalFolderSettings::ResetBrowserSettings();
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
|
||||
{
|
||||
CComPtr<IShellFolder> newFolder;
|
||||
FOLDERSETTINGS newFolderSettings;
|
||||
HRESULT hResult;
|
||||
CLSID clsid;
|
||||
BOOL HasIconViewType;
|
||||
CComPtr<IShellFolder> newFolder;
|
||||
FOLDERSETTINGS newFolderSettings = m_deffoldersettings.FolderSettings;
|
||||
HRESULT hResult;
|
||||
CLSID clsid;
|
||||
BOOL HasIconViewType;
|
||||
|
||||
// called by shell view to browse to new folder
|
||||
// also called by explorer band to navigate to new folder
|
||||
|
@ -822,9 +847,6 @@ HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
|
|||
|
||||
if (HasIconViewType)
|
||||
newFolderSettings.ViewMode = FVM_ICON;
|
||||
else
|
||||
newFolderSettings.ViewMode = FVM_DETAILS;
|
||||
newFolderSettings.fFlags = 0;
|
||||
hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);
|
||||
if (FAILED_UNEXPECTEDLY(hResult))
|
||||
return hResult;
|
||||
|
@ -2128,8 +2150,8 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::Exec(const GUID *pguidCmdGroup, DWORD n
|
|||
{
|
||||
switch (nCmdID)
|
||||
{
|
||||
case 1:
|
||||
// Reset All Folders option in Folder Options
|
||||
case DVCMDID_RESET_DEFAULTFOLDER_SETTINGS:
|
||||
IUnknown_Exec(fCurrentShellView, CGID_DefView, nCmdID, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2644,7 +2666,13 @@ LRESULT STDMETHODCALLTYPE CShellBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM
|
|||
|
||||
HRESULT STDMETHODCALLTYPE CShellBrowser::SetAsDefFolderSettings()
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
HRESULT hr = E_FAIL;
|
||||
if (fCurrentShellView)
|
||||
{
|
||||
hr = ApplyBrowserDefaultFolderSettings(fCurrentShellView);
|
||||
IUnknown_Exec(fCurrentShellView, CGID_DefView, DVCMDID_SET_DEFAULTFOLDER_SETTINGS, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewRect(RECT *prc)
|
||||
|
|
|
@ -2451,9 +2451,7 @@ SelectExtOnRename(void)
|
|||
LONG error;
|
||||
DWORD dwValue = FALSE, cbValue;
|
||||
|
||||
error = RegOpenKeyExW(HKEY_CURRENT_USER,
|
||||
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer",
|
||||
0, KEY_READ, &hKey);
|
||||
error = RegOpenKeyExW(HKEY_CURRENT_USER, REGSTR_PATH_EXPLORER, 0, KEY_READ, &hKey);
|
||||
if (error)
|
||||
return dwValue;
|
||||
|
||||
|
@ -3792,6 +3790,23 @@ HRESULT WINAPI CDefView::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCm
|
|||
(nCmdexecopt == 0))
|
||||
return 1;
|
||||
|
||||
if (IsEqualIID(*pguidCmdGroup, CGID_DefView))
|
||||
{
|
||||
WCHAR SubKey[MAX_PATH];
|
||||
switch (nCmdID)
|
||||
{
|
||||
case DVCMDID_SET_DEFAULTFOLDER_SETTINGS:
|
||||
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
|
||||
FIXME("Save current as default\n");
|
||||
break;
|
||||
case DVCMDID_RESET_DEFAULTFOLDER_SETTINGS:
|
||||
wsprintfW(SubKey, L"%s\\%s", REGSTR_PATH_EXPLORER, L"Streams\\Default");
|
||||
SHDeleteKey(HKEY_CURRENT_USER, SubKey);
|
||||
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return OLECMDERR_E_UNKNOWNGROUP;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
|
||||
#include <precomp.h>
|
||||
#include <shdeprecated.h>
|
||||
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(fprop);
|
||||
|
@ -42,8 +43,10 @@ INT_PTR CALLBACK FolderOptionsFileTypesDlg(HWND hwndDlg, UINT uMsg, WPARAM wPara
|
|||
|
||||
HRESULT STDMETHODCALLTYPE CFolderOptions::AddPages(LPFNSVADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
|
||||
{
|
||||
HPROPSHEETPAGE hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_GENERAL, FolderOptionsGeneralDlg, 0, NULL);
|
||||
HPROPSHEETPAGE hPage;
|
||||
LPARAM sheetparam = (LPARAM)static_cast<CFolderOptions*>(this);
|
||||
|
||||
hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_GENERAL, FolderOptionsGeneralDlg, sheetparam, NULL);
|
||||
if (hPage == NULL)
|
||||
{
|
||||
ERR("Failed to create property sheet page FolderOptionsGeneral\n");
|
||||
|
@ -52,7 +55,7 @@ HRESULT STDMETHODCALLTYPE CFolderOptions::AddPages(LPFNSVADDPROPSHEETPAGE pfnAdd
|
|||
if (!pfnAddPage(hPage, lParam))
|
||||
return E_FAIL;
|
||||
|
||||
hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_VIEW, FolderOptionsViewDlg, 0, NULL);
|
||||
hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_VIEW, FolderOptionsViewDlg, sheetparam, NULL);
|
||||
if (hPage == NULL)
|
||||
{
|
||||
ERR("Failed to create property sheet page FolderOptionsView\n");
|
||||
|
@ -61,7 +64,7 @@ HRESULT STDMETHODCALLTYPE CFolderOptions::AddPages(LPFNSVADDPROPSHEETPAGE pfnAdd
|
|||
if (!pfnAddPage(hPage, lParam))
|
||||
return E_FAIL;
|
||||
|
||||
hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_FILETYPES, FolderOptionsFileTypesDlg, 0, NULL);
|
||||
hPage = SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_FILETYPES, FolderOptionsFileTypesDlg, sheetparam, NULL);
|
||||
if (hPage == NULL)
|
||||
{
|
||||
ERR("Failed to create property sheet page FolderOptionsFileTypes\n");
|
||||
|
@ -90,7 +93,7 @@ HRESULT STDMETHODCALLTYPE CFolderOptions::Initialize(PCIDLIST_ABSOLUTE pidlFolde
|
|||
|
||||
|
||||
/*************************************************************************
|
||||
* FolderOptions IShellExtInit interface
|
||||
* FolderOptions IObjectWithSite interface
|
||||
*/
|
||||
HRESULT STDMETHODCALLTYPE CFolderOptions::SetSite(IUnknown *pUnkSite)
|
||||
{
|
||||
|
@ -100,6 +103,45 @@ HRESULT STDMETHODCALLTYPE CFolderOptions::SetSite(IUnknown *pUnkSite)
|
|||
|
||||
HRESULT STDMETHODCALLTYPE CFolderOptions::GetSite(REFIID riid, void **ppvSite)
|
||||
{
|
||||
return m_pSite->QueryInterface(riid, ppvSite);
|
||||
return m_pSite ? m_pSite->QueryInterface(riid, ppvSite) : E_FAIL;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* FolderOptions helper methods
|
||||
*/
|
||||
HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
|
||||
{
|
||||
IBrowserService2 *bs2;
|
||||
HRESULT hr = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService2, &bs2));
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
if (Action == DFSA_APPLY)
|
||||
{
|
||||
hr = bs2->SetAsDefFolderSettings();
|
||||
}
|
||||
else if (Action == DFSA_RESET)
|
||||
{
|
||||
// There does not seem to be a method in IBrowserService2 for this
|
||||
IUnknown_Exec(bs2, CGID_DefView, DVCMDID_RESET_DEFAULTFOLDER_SETTINGS, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
// FFSA_QUERY: hr is already correct
|
||||
}
|
||||
bs2->Release();
|
||||
}
|
||||
|
||||
if (Action == DFSA_RESET)
|
||||
{
|
||||
IGlobalFolderSettings *pgfs;
|
||||
HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER,
|
||||
IID_IGlobalFolderSettings, (void **)&pgfs);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = pgfs->Set(NULL, 0, 0);
|
||||
pgfs->Release();
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -38,6 +38,10 @@ class CFolderOptions :
|
|||
//BOOL QueryDrop (DWORD dwKeyState, LPDWORD pdwEffect);
|
||||
//BOOL RecycleBinIsEmpty();
|
||||
|
||||
protected:
|
||||
enum DEFFOLDERSETTINGACTION { DFSA_QUERY = -1, DFSA_RESET, DFSA_APPLY };
|
||||
HRESULT HandleDefFolderSettings(int Action);
|
||||
|
||||
public:
|
||||
CFolderOptions();
|
||||
~CFolderOptions();
|
||||
|
@ -53,6 +57,15 @@ class CFolderOptions :
|
|||
STDMETHOD(SetSite)(IUnknown *pUnkSite) override;
|
||||
STDMETHOD(GetSite)(REFIID riid, void **ppvSite) override;
|
||||
|
||||
bool CanSetDefFolderSettings()
|
||||
{
|
||||
return SUCCEEDED(HandleDefFolderSettings(DFSA_QUERY));
|
||||
}
|
||||
HRESULT ApplyDefFolderSettings(bool ResetToDefault)
|
||||
{
|
||||
return HandleDefFolderSettings(ResetToDefault ? DFSA_RESET : DFSA_APPLY);
|
||||
}
|
||||
|
||||
DECLARE_REGISTRY_RESOURCEID(IDR_FOLDEROPTIONS)
|
||||
DECLARE_NOT_AGGREGATABLE(CFolderOptions)
|
||||
|
||||
|
|
|
@ -618,8 +618,18 @@ ViewDlg_CreateTreeImageList(VOID)
|
|||
}
|
||||
|
||||
static BOOL
|
||||
ViewDlg_OnInitDialog(HWND hwndDlg)
|
||||
ViewDlg_OnInitDialog(HWND hwndDlg, LPPROPSHEETPAGE psp)
|
||||
{
|
||||
SetWindowLongPtr(hwndDlg, GWL_USERDATA, psp->lParam);
|
||||
CFolderOptions *pFO = (CFolderOptions*)psp->lParam;
|
||||
|
||||
if (!pFO || !pFO->CanSetDefFolderSettings())
|
||||
{
|
||||
// The global options (started from rundll32 or control panel)
|
||||
// has no browser to copy the current settings from.
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_VIEW_APPLY_TO_ALL), FALSE);
|
||||
}
|
||||
|
||||
HWND hwndTreeView = GetDlgItem(hwndDlg, IDC_VIEW_TREEVIEW);
|
||||
|
||||
s_hTreeImageList = ViewDlg_CreateTreeImageList();
|
||||
|
@ -941,7 +951,7 @@ FolderOptionsViewDlg(
|
|||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
return ViewDlg_OnInitDialog(hwndDlg);
|
||||
return ViewDlg_OnInitDialog(hwndDlg, (LPPROPSHEETPAGE)lParam);
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
|
@ -949,6 +959,18 @@ FolderOptionsViewDlg(
|
|||
case IDC_VIEW_RESTORE_DEFAULTS: // Restore Defaults
|
||||
ViewDlg_RestoreDefaults(hwndDlg);
|
||||
break;
|
||||
|
||||
case IDC_VIEW_APPLY_TO_ALL:
|
||||
case IDC_VIEW_RESET_ALL:
|
||||
{
|
||||
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||
CFolderOptions *pFO = (CFolderOptions*)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
|
||||
if (pFO)
|
||||
hr = pFO->ApplyDefFolderSettings(LOWORD(wParam) == IDC_VIEW_RESET_ALL);
|
||||
if (FAILED(hr))
|
||||
SHELL_ErrorBox(hwndDlg, hr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <powrprof.h>
|
||||
#include <winnetwk.h>
|
||||
#include <objsafe.h>
|
||||
#include <regstr.h>
|
||||
|
||||
#include <comctl32_undoc.h>
|
||||
#include <shlguid_undoc.h>
|
||||
|
|
|
@ -94,6 +94,36 @@ inline BOOL _ROS_FAILED_HELPER(HRESULT hr, const char* expr, const char* filenam
|
|||
} /* extern "C" */
|
||||
#endif /* defined(__cplusplus) */
|
||||
|
||||
static inline UINT
|
||||
SHELL_ErrorBoxHelper(HWND hwndOwner, UINT Error)
|
||||
{
|
||||
WCHAR buf[400];
|
||||
UINT cch;
|
||||
|
||||
if (!IsWindowVisible(hwndOwner))
|
||||
hwndOwner = NULL;
|
||||
if (Error == ERROR_SUCCESS)
|
||||
Error = ERROR_INTERNAL_ERROR;
|
||||
|
||||
cch = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL, Error, 0, buf, _countof(buf), NULL);
|
||||
if (!cch)
|
||||
{
|
||||
enum { user32_IDS_ERROR = 2 }; // IDS_ERROR from user32 resource.h ("Error" string)
|
||||
cch = LoadStringW(LoadLibraryW(L"USER32"), user32_IDS_ERROR, buf, _countof(buf));
|
||||
wsprintfW(buf + cch, L"\n\n%#x (%d)", Error, Error);
|
||||
}
|
||||
MessageBoxW(hwndOwner, buf, NULL, MB_OK | MB_ICONSTOP);
|
||||
return Error;
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
template<class H> static UINT
|
||||
SHELL_ErrorBox(H hwndOwner, UINT Error = GetLastError())
|
||||
{
|
||||
return SHELL_ErrorBoxHelper(const_cast<HWND>(hwndOwner), Error);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
template <typename T>
|
||||
class CComCreatorCentralInstance
|
||||
|
|
|
@ -83,6 +83,12 @@ struct persistState
|
|||
#define PANE_PRIVACY 7
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
* CGID_DefView OLECMD IDs
|
||||
*/
|
||||
#define DVCMDID_SET_DEFAULTFOLDER_SETTINGS 0
|
||||
#define DVCMDID_RESET_DEFAULTFOLDER_SETTINGS 1
|
||||
|
||||
/*****************************************************************************
|
||||
* IInitializeObject interface
|
||||
*/
|
||||
|
@ -144,7 +150,15 @@ DECLARE_INTERFACE_(IBanneredBar, IUnknown)//, "596A9A94-013E-11d1-8D34-00A0C90F2
|
|||
*/
|
||||
struct DEFFOLDERSETTINGS
|
||||
{
|
||||
long offset0;
|
||||
enum { SIZE_NT4 = 8, SIZE_IE4 = 36, SIZE_XP = 40 };
|
||||
enum { VER_98 = 0, VER_2000 = 3, VER_XP = 4 }; // Win98SE with IE5 writes 0, not 3 as the version
|
||||
UINT Statusbar : 1; // "StatusBarOther" is the new location for this
|
||||
UINT Toolbar : 1; // Not used when Explorer uses ReBar
|
||||
FOLDERSETTINGS FolderSettings;
|
||||
SHELLVIEWID vid;
|
||||
UINT Version;
|
||||
UINT Counter; // Incremented every time default folder settings are applied. Invalidates a cache?
|
||||
UINT ViewPriority; // VIEW_PRIORITY_*
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
|
@ -152,12 +166,12 @@ struct DEFFOLDERSETTINGS
|
|||
DECLARE_INTERFACE_(IGlobalFolderSettings, IUnknown)
|
||||
{
|
||||
/*** IUnknown ***/
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
/*** IGlobalFolderSettings ***/
|
||||
STDMETHOD(Get)(THIS_ struct DEFFOLDERSETTINGS *buffer, int theSize) PURE;
|
||||
STDMETHOD(Set)(THIS_ const struct DEFFOLDERSETTINGS *buffer, int theSize, unsigned int param14) PURE;
|
||||
STDMETHOD(Get)(THIS_ struct DEFFOLDERSETTINGS *pFDS, UINT cb) PURE;
|
||||
STDMETHOD(Set)(THIS_ const struct DEFFOLDERSETTINGS *pFDS, UINT cb, UINT unknown) PURE;
|
||||
};
|
||||
#undef INTERFACE
|
||||
|
||||
|
|
Loading…
Reference in a new issue