WindowsXP-SP1/shell/themes/themeui/thsettingspg.cpp
2020-09-30 16:53:49 +02:00

419 lines
11 KiB
C++

/*****************************************************************************\
FILE: ThSettingsPg.cpp
DESCRIPTION:
This code will display a "Theme Settings" tab in the advanced
"Display Properties" dialog (the advanced dialog, not the base dlg).
BryanSt 3/23/2000 Updated and Converted to C++
Copyright (C) Microsoft Corp 1993-2000. All rights reserved.
\*****************************************************************************/
#include "priv.h"
#include "regutil.h"
#include "ThSettingsPg.h"
#include "AdvAppearPg.h"
//============================================================================================================
// Class
//============================================================================================================
class CThemeSettingsPage : public CObjectWithSite
, public IAdvancedDialog
{
public:
//////////////////////////////////////////////////////
// Public Interfaces
//////////////////////////////////////////////////////
// *** IUnknown ***
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
// *** IAdvancedDialog ***
virtual STDMETHODIMP DisplayAdvancedDialog(IN HWND hwndParent, IN IPropertyBag * pBasePage, IN BOOL * pfEnableApply);
CThemeSettingsPage();
protected:
private:
virtual ~CThemeSettingsPage(void);
// Private Member Variables
long m_cRef;
BOOL m_fDirty;
HWND m_hDlg;
IPropertyBag * m_pPropertyBag;
// Private Member Functions
INT_PTR _ThemeSettingsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
HRESULT _OnInitThemesDlg(HWND hDlg);
HRESULT _OnDestroy(HWND hDlg);
INT_PTR _OnCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
HRESULT _LoadState(IN IPropertyBag * pBasePage);
HRESULT _SaveState(IN IPropertyBag * pBasePage);
HRESULT _OnSaveButton(HWND hDlg);
HRESULT _OnDeleteButton(HWND hDlg);
HRESULT _IsDirty(IN BOOL * pIsDirty);
static INT_PTR CALLBACK ThemeSettingsDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
};
//============================================================================================================
// *** Globals ***
//============================================================================================================
const static DWORD FAR aThemeSettingsHelpIds[] = {
IDC_TSPG_THEMELIST_LABLE, IDH_DISPLAY_THEMESETTINGS_NAMELABLE,
IDC_TSPG_THEME_NAME, IDH_DISPLAY_THEMESETTINGS_NAME,
IDC_TSPG_CB_GROUP_LABEL, IDH_DISPLAY_THEMESETTINGS_LABEL,
IDC_TSPG_CB_LABEL, IDH_DISPLAY_THEMESETTINGS_LABEL,
IDC_TSPG_CB_WALLPAPER, IDH_DISPLAY_THEMESETTINGS_WALLPAPER,
IDC_TSPG_CB_SOUNDS, IDH_DISPLAY_THEMESETTINGS_SOUNDS,
IDC_TSPG_CB_MOUSE, IDH_DISPLAY_THEMESETTINGS_MOUSE,
IDC_TSPG_CB_SCREENSAVER, IDH_DISPLAY_THEMESETTINGS_SCREENSAVER,
IDC_TSPG_CB_ICONS, IDH_DISPLAY_THEMESETTINGS_ICONS,
IDC_TSPG_CB_COLORS, IDH_DISPLAY_THEMESETTINGS_COLORS,
IDC_TSPG_CB_FONTS, IDH_DISPLAY_THEMESETTINGS_FONTS,
IDC_TSPG_CB_BORDERS, IDH_DISPLAY_THEMESETTINGS_BORDERS,
0, 0
};
#define SZ_HELPFILE_THEMESETTINGS TEXT("display.hlp")
const TCHAR * g_szCBNames[SIZE_THEME_FILTERS] =
{
SZ_PBPROP_THEME_FILTER TEXT("Screen saver"),
SZ_PBPROP_THEME_FILTER TEXT("Sound events"),
SZ_PBPROP_THEME_FILTER TEXT("Mouse pointers"),
SZ_PBPROP_THEME_FILTER TEXT("Desktop wallpaper"),
SZ_PBPROP_THEME_FILTER TEXT("Icons"),
// TEXT("Icon size and spacing"),
SZ_PBPROP_THEME_FILTER TEXT("Colors"),
SZ_PBPROP_THEME_FILTER TEXT("Font names and styles"),
SZ_PBPROP_THEME_FILTER TEXT("Font and window sizes"),
SZ_PBPROP_THEME_FILTER TEXT("Rotate theme monthly")
};
//===========================
// *** Class Internals & Helpers ***
//===========================
INT_PTR CALLBACK CThemeSettingsPage::ThemeSettingsDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
CThemeSettingsPage * pThis = (CThemeSettingsPage *)GetWindowLongPtr(hDlg, DWLP_USER);
if (WM_INITDIALOG == wMsg)
{
pThis = (CThemeSettingsPage *) lParam;
if (pThis)
{
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
}
}
if (pThis)
return pThis->_ThemeSettingsDlgProc(hDlg, wMsg, wParam, lParam);
return DefWindowProc(hDlg, wMsg, wParam, lParam);
}
HRESULT CThemeSettingsPage::_OnSaveButton(HWND hDlg)
{
HRESULT hr = E_NOTIMPL;
return hr;
}
HRESULT CThemeSettingsPage::_OnDeleteButton(HWND hDlg)
{
HRESULT hr = E_NOTIMPL;
return hr;
}
HRESULT CThemeSettingsPage::_OnInitThemesDlg(HWND hDlg)
{
m_hDlg = hDlg;
if (m_pPropertyBag)
{
VARIANT varName;
VariantInit(&varName);
HRESULT hr = m_pPropertyBag->Read(SZ_PBPROP_THEME_DISPLAYNAME, &varName, NULL);
if (SUCCEEDED(hr))
{
if (VT_BSTR == varName.vt)
{
SetWindowTextW(GetDlgItem(hDlg, IDC_TSPG_THEME_NAME), varName.bstrVal);
}
VariantClear(&varName);
}
}
return _LoadState(m_pPropertyBag);
}
HRESULT CThemeSettingsPage::_OnDestroy(HWND hDlg)
{
return S_OK;
}
INT_PTR CThemeSettingsPage::_OnCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL fHandled = 1; // Not handled (WM_COMMAND seems to be different)
WORD idCtrl = GET_WM_COMMAND_ID(wParam, lParam);
switch (idCtrl)
{
case IDOK:
_SaveState(m_pPropertyBag);
EndDialog(hDlg, IDOK);
break;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
break;
case IDC_TSPG_CB_SCREENSAVER:
case IDC_TSPG_CB_SOUNDS:
case IDC_TSPG_CB_MOUSE:
case IDC_TSPG_CB_WALLPAPER:
case IDC_TSPG_CB_ICONS:
case IDC_TSPG_CB_COLORS:
case IDC_TSPG_CB_FONTS:
case IDC_TSPG_CB_BORDERS:
m_fDirty = TRUE;
break;
default:
break;
}
return fHandled;
}
// This Property Sheet appear in the top level of the "Display Control Panel".
INT_PTR CThemeSettingsPage::_ThemeSettingsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_NOTIFY:
break;
case WM_INITDIALOG:
_OnInitThemesDlg(hDlg);
break;
case WM_DESTROY:
_OnDestroy(hDlg);
break;
case WM_HELP:
WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, SZ_HELPFILE_THEMESETTINGS, HELP_WM_HELP, (DWORD_PTR) aThemeSettingsHelpIds);
break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, SZ_HELPFILE_THEMESETTINGS, HELP_CONTEXTMENU, (DWORD_PTR) aThemeSettingsHelpIds);
break;
case WM_COMMAND:
_OnCommand(hDlg, message, wParam, lParam);
break;
}
return FALSE;
}
HRESULT CThemeSettingsPage::_IsDirty(IN BOOL * pIsDirty)
{
HRESULT hr = E_INVALIDARG;
if (pIsDirty)
{
*pIsDirty = m_fDirty;
hr = S_OK;
}
return hr;
}
HRESULT CThemeSettingsPage::_LoadState(IN IPropertyBag * pPropertyBag)
{
HRESULT hr = E_INVALIDARG;
if (pPropertyBag)
{
for (int nIndex = IDC_TSPG_CB_SCREENSAVER; nIndex <= IDC_TSPG_CB_BORDERS; nIndex++)
{
VARIANT varFilter;
varFilter.vt = VT_BOOL;
varFilter.boolVal = VARIANT_TRUE;
hr = pPropertyBag->Read(g_szCBNames[nIndex - IDC_TSPG_CB_SCREENSAVER], &varFilter, NULL);
CheckDlgButton(m_hDlg, nIndex, ((VARIANT_TRUE == varFilter.boolVal) ? BST_CHECKED : BST_UNCHECKED));
}
}
return hr;
}
HRESULT CThemeSettingsPage::_SaveState(IN IPropertyBag * pBasePage)
{
HRESULT hr = E_INVALIDARG;
if (pBasePage)
{
for (int nIndex = IDC_TSPG_CB_SCREENSAVER; nIndex <= IDC_TSPG_CB_BORDERS; nIndex++)
{
VARIANT varFilter;
varFilter.vt = VT_BOOL;
varFilter.boolVal = ((BST_UNCHECKED != IsDlgButtonChecked(m_hDlg, nIndex)) ? VARIANT_TRUE : VARIANT_FALSE);
hr = pBasePage->Write(g_szCBNames[nIndex - IDC_TSPG_CB_SCREENSAVER], &varFilter);
}
}
return hr;
}
//===========================
// *** IAdvancedDialog Interface ***
//===========================
HRESULT CThemeSettingsPage::DisplayAdvancedDialog(IN HWND hwndParent, IN IPropertyBag * pBasePage, IN BOOL * pfEnableApply)
{
HRESULT hr = E_INVALIDARG;
if (hwndParent && pBasePage && pfEnableApply)
{
// Load State Into Advanced Dialog
*pfEnableApply = FALSE;
IUnknown_Set((IUnknown **) &m_pPropertyBag, pBasePage);
hr = S_OK;
// Display Advanced Dialog
if (IDOK == DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(DLG_THEMESETTINGSPG), hwndParent, CThemeSettingsPage::ThemeSettingsDlgProc, (LPARAM)this))
{
// The user clicked OK, so merge modified state back into base dialog
_IsDirty(pfEnableApply);
}
}
return hr;
}
//===========================
// *** IUnknown Interface ***
//===========================
ULONG CThemeSettingsPage::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
ULONG CThemeSettingsPage::Release()
{
if (InterlockedDecrement(&m_cRef))
return m_cRef;
delete this;
return 0;
}
HRESULT CThemeSettingsPage::QueryInterface(REFIID riid, void **ppvObj)
{
static const QITAB qit[] = {
QITABENT(CThemeSettingsPage, IObjectWithSite),
QITABENT(CThemeSettingsPage, IAdvancedDialog),
{ 0 },
};
return QISearch(this, qit, riid, ppvObj);
}
//===========================
// *** Class Methods ***
//===========================
CThemeSettingsPage::CThemeSettingsPage() : m_cRef(1)
{
DllAddRef();
// This needs to be allocated in Zero Inited Memory.
// Assert that all Member Variables are inited to Zero.
ASSERT(!m_fDirty);
ASSERT(!m_hDlg);
ASSERT(!m_pPropertyBag);
}
CThemeSettingsPage::~CThemeSettingsPage()
{
IUnknown_Set((IUnknown **) &m_pPropertyBag, NULL);
DllRelease();
}
HRESULT CThemeSettingsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog)
{
HRESULT hr = E_INVALIDARG;
if (ppAdvDialog)
{
CThemeSettingsPage * pThis = new CThemeSettingsPage();
if (pThis)
{
hr = pThis->QueryInterface(IID_PPV_ARG(IAdvancedDialog, ppAdvDialog));
pThis->Release();
}
else
{
*ppAdvDialog = NULL;
hr = E_OUTOFMEMORY;
}
}
return hr;
}