Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

418 lines
11 KiB

  1. /*****************************************************************************\
  2. FILE: ThSettingsPg.cpp
  3. DESCRIPTION:
  4. This code will display a "Theme Settings" tab in the advanced
  5. "Display Properties" dialog (the advanced dialog, not the base dlg).
  6. BryanSt 3/23/2000 Updated and Converted to C++
  7. Copyright (C) Microsoft Corp 1993-2000. All rights reserved.
  8. \*****************************************************************************/
  9. #include "priv.h"
  10. #include "regutil.h"
  11. #include "ThSettingsPg.h"
  12. #include "AdvAppearPg.h"
  13. //============================================================================================================
  14. // Class
  15. //============================================================================================================
  16. class CThemeSettingsPage : public CObjectWithSite
  17. , public IAdvancedDialog
  18. {
  19. public:
  20. //////////////////////////////////////////////////////
  21. // Public Interfaces
  22. //////////////////////////////////////////////////////
  23. // *** IUnknown ***
  24. virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
  25. virtual STDMETHODIMP_(ULONG) AddRef(void);
  26. virtual STDMETHODIMP_(ULONG) Release(void);
  27. // *** IAdvancedDialog ***
  28. virtual STDMETHODIMP DisplayAdvancedDialog(IN HWND hwndParent, IN IPropertyBag * pBasePage, IN BOOL * pfEnableApply);
  29. CThemeSettingsPage();
  30. protected:
  31. private:
  32. virtual ~CThemeSettingsPage(void);
  33. // Private Member Variables
  34. long m_cRef;
  35. BOOL m_fDirty;
  36. HWND m_hDlg;
  37. IPropertyBag * m_pPropertyBag;
  38. // Private Member Functions
  39. INT_PTR _ThemeSettingsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  40. HRESULT _OnInitThemesDlg(HWND hDlg);
  41. HRESULT _OnDestroy(HWND hDlg);
  42. INT_PTR _OnCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  43. HRESULT _LoadState(IN IPropertyBag * pBasePage);
  44. HRESULT _SaveState(IN IPropertyBag * pBasePage);
  45. HRESULT _OnSaveButton(HWND hDlg);
  46. HRESULT _OnDeleteButton(HWND hDlg);
  47. HRESULT _IsDirty(IN BOOL * pIsDirty);
  48. static INT_PTR CALLBACK ThemeSettingsDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
  49. };
  50. //============================================================================================================
  51. // *** Globals ***
  52. //============================================================================================================
  53. const static DWORD FAR aThemeSettingsHelpIds[] = {
  54. IDC_TSPG_THEMELIST_LABLE, IDH_DISPLAY_THEMESETTINGS_NAMELABLE,
  55. IDC_TSPG_THEME_NAME, IDH_DISPLAY_THEMESETTINGS_NAME,
  56. IDC_TSPG_CB_GROUP_LABEL, IDH_DISPLAY_THEMESETTINGS_LABEL,
  57. IDC_TSPG_CB_LABEL, IDH_DISPLAY_THEMESETTINGS_LABEL,
  58. IDC_TSPG_CB_WALLPAPER, IDH_DISPLAY_THEMESETTINGS_WALLPAPER,
  59. IDC_TSPG_CB_SOUNDS, IDH_DISPLAY_THEMESETTINGS_SOUNDS,
  60. IDC_TSPG_CB_MOUSE, IDH_DISPLAY_THEMESETTINGS_MOUSE,
  61. IDC_TSPG_CB_SCREENSAVER, IDH_DISPLAY_THEMESETTINGS_SCREENSAVER,
  62. IDC_TSPG_CB_ICONS, IDH_DISPLAY_THEMESETTINGS_ICONS,
  63. IDC_TSPG_CB_COLORS, IDH_DISPLAY_THEMESETTINGS_COLORS,
  64. IDC_TSPG_CB_FONTS, IDH_DISPLAY_THEMESETTINGS_FONTS,
  65. IDC_TSPG_CB_BORDERS, IDH_DISPLAY_THEMESETTINGS_BORDERS,
  66. 0, 0
  67. };
  68. #define SZ_HELPFILE_THEMESETTINGS TEXT("display.hlp")
  69. const TCHAR * g_szCBNames[SIZE_THEME_FILTERS] =
  70. {
  71. SZ_PBPROP_THEME_FILTER TEXT("Screen saver"),
  72. SZ_PBPROP_THEME_FILTER TEXT("Sound events"),
  73. SZ_PBPROP_THEME_FILTER TEXT("Mouse pointers"),
  74. SZ_PBPROP_THEME_FILTER TEXT("Desktop wallpaper"),
  75. SZ_PBPROP_THEME_FILTER TEXT("Icons"),
  76. // TEXT("Icon size and spacing"),
  77. SZ_PBPROP_THEME_FILTER TEXT("Colors"),
  78. SZ_PBPROP_THEME_FILTER TEXT("Font names and styles"),
  79. SZ_PBPROP_THEME_FILTER TEXT("Font and window sizes"),
  80. SZ_PBPROP_THEME_FILTER TEXT("Rotate theme monthly")
  81. };
  82. //===========================
  83. // *** Class Internals & Helpers ***
  84. //===========================
  85. INT_PTR CALLBACK CThemeSettingsPage::ThemeSettingsDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
  86. {
  87. CThemeSettingsPage * pThis = (CThemeSettingsPage *)GetWindowLongPtr(hDlg, DWLP_USER);
  88. if (WM_INITDIALOG == wMsg)
  89. {
  90. pThis = (CThemeSettingsPage *) lParam;
  91. if (pThis)
  92. {
  93. SetWindowLongPtr(hDlg, DWLP_USER, lParam);
  94. }
  95. }
  96. if (pThis)
  97. return pThis->_ThemeSettingsDlgProc(hDlg, wMsg, wParam, lParam);
  98. return DefWindowProc(hDlg, wMsg, wParam, lParam);
  99. }
  100. HRESULT CThemeSettingsPage::_OnSaveButton(HWND hDlg)
  101. {
  102. HRESULT hr = E_NOTIMPL;
  103. return hr;
  104. }
  105. HRESULT CThemeSettingsPage::_OnDeleteButton(HWND hDlg)
  106. {
  107. HRESULT hr = E_NOTIMPL;
  108. return hr;
  109. }
  110. HRESULT CThemeSettingsPage::_OnInitThemesDlg(HWND hDlg)
  111. {
  112. m_hDlg = hDlg;
  113. if (m_pPropertyBag)
  114. {
  115. VARIANT varName;
  116. VariantInit(&varName);
  117. HRESULT hr = m_pPropertyBag->Read(SZ_PBPROP_THEME_DISPLAYNAME, &varName, NULL);
  118. if (SUCCEEDED(hr))
  119. {
  120. if (VT_BSTR == varName.vt)
  121. {
  122. SetWindowTextW(GetDlgItem(hDlg, IDC_TSPG_THEME_NAME), varName.bstrVal);
  123. }
  124. VariantClear(&varName);
  125. }
  126. }
  127. return _LoadState(m_pPropertyBag);
  128. }
  129. HRESULT CThemeSettingsPage::_OnDestroy(HWND hDlg)
  130. {
  131. return S_OK;
  132. }
  133. INT_PTR CThemeSettingsPage::_OnCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  134. {
  135. BOOL fHandled = 1; // Not handled (WM_COMMAND seems to be different)
  136. WORD idCtrl = GET_WM_COMMAND_ID(wParam, lParam);
  137. switch (idCtrl)
  138. {
  139. case IDOK:
  140. _SaveState(m_pPropertyBag);
  141. EndDialog(hDlg, IDOK);
  142. break;
  143. case IDCANCEL:
  144. EndDialog(hDlg, IDCANCEL);
  145. break;
  146. case IDC_TSPG_CB_SCREENSAVER:
  147. case IDC_TSPG_CB_SOUNDS:
  148. case IDC_TSPG_CB_MOUSE:
  149. case IDC_TSPG_CB_WALLPAPER:
  150. case IDC_TSPG_CB_ICONS:
  151. case IDC_TSPG_CB_COLORS:
  152. case IDC_TSPG_CB_FONTS:
  153. case IDC_TSPG_CB_BORDERS:
  154. m_fDirty = TRUE;
  155. break;
  156. default:
  157. break;
  158. }
  159. return fHandled;
  160. }
  161. // This Property Sheet appear in the top level of the "Display Control Panel".
  162. INT_PTR CThemeSettingsPage::_ThemeSettingsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  163. {
  164. switch(message)
  165. {
  166. case WM_NOTIFY:
  167. break;
  168. case WM_INITDIALOG:
  169. _OnInitThemesDlg(hDlg);
  170. break;
  171. case WM_DESTROY:
  172. _OnDestroy(hDlg);
  173. break;
  174. case WM_HELP:
  175. WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, SZ_HELPFILE_THEMESETTINGS, HELP_WM_HELP, (DWORD_PTR) aThemeSettingsHelpIds);
  176. break;
  177. case WM_CONTEXTMENU: // right mouse click
  178. WinHelp((HWND) wParam, SZ_HELPFILE_THEMESETTINGS, HELP_CONTEXTMENU, (DWORD_PTR) aThemeSettingsHelpIds);
  179. break;
  180. case WM_COMMAND:
  181. _OnCommand(hDlg, message, wParam, lParam);
  182. break;
  183. }
  184. return FALSE;
  185. }
  186. HRESULT CThemeSettingsPage::_IsDirty(IN BOOL * pIsDirty)
  187. {
  188. HRESULT hr = E_INVALIDARG;
  189. if (pIsDirty)
  190. {
  191. *pIsDirty = m_fDirty;
  192. hr = S_OK;
  193. }
  194. return hr;
  195. }
  196. HRESULT CThemeSettingsPage::_LoadState(IN IPropertyBag * pPropertyBag)
  197. {
  198. HRESULT hr = E_INVALIDARG;
  199. if (pPropertyBag)
  200. {
  201. for (int nIndex = IDC_TSPG_CB_SCREENSAVER; nIndex <= IDC_TSPG_CB_BORDERS; nIndex++)
  202. {
  203. VARIANT varFilter;
  204. varFilter.vt = VT_BOOL;
  205. varFilter.boolVal = VARIANT_TRUE;
  206. hr = pPropertyBag->Read(g_szCBNames[nIndex - IDC_TSPG_CB_SCREENSAVER], &varFilter, NULL);
  207. CheckDlgButton(m_hDlg, nIndex, ((VARIANT_TRUE == varFilter.boolVal) ? BST_CHECKED : BST_UNCHECKED));
  208. }
  209. }
  210. return hr;
  211. }
  212. HRESULT CThemeSettingsPage::_SaveState(IN IPropertyBag * pBasePage)
  213. {
  214. HRESULT hr = E_INVALIDARG;
  215. if (pBasePage)
  216. {
  217. for (int nIndex = IDC_TSPG_CB_SCREENSAVER; nIndex <= IDC_TSPG_CB_BORDERS; nIndex++)
  218. {
  219. VARIANT varFilter;
  220. varFilter.vt = VT_BOOL;
  221. varFilter.boolVal = ((BST_UNCHECKED != IsDlgButtonChecked(m_hDlg, nIndex)) ? VARIANT_TRUE : VARIANT_FALSE);
  222. hr = pBasePage->Write(g_szCBNames[nIndex - IDC_TSPG_CB_SCREENSAVER], &varFilter);
  223. }
  224. }
  225. return hr;
  226. }
  227. //===========================
  228. // *** IAdvancedDialog Interface ***
  229. //===========================
  230. HRESULT CThemeSettingsPage::DisplayAdvancedDialog(IN HWND hwndParent, IN IPropertyBag * pBasePage, IN BOOL * pfEnableApply)
  231. {
  232. HRESULT hr = E_INVALIDARG;
  233. if (hwndParent && pBasePage && pfEnableApply)
  234. {
  235. // Load State Into Advanced Dialog
  236. *pfEnableApply = FALSE;
  237. IUnknown_Set((IUnknown **) &m_pPropertyBag, pBasePage);
  238. hr = S_OK;
  239. // Display Advanced Dialog
  240. if (IDOK == DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(DLG_THEMESETTINGSPG), hwndParent, CThemeSettingsPage::ThemeSettingsDlgProc, (LPARAM)this))
  241. {
  242. // The user clicked OK, so merge modified state back into base dialog
  243. _IsDirty(pfEnableApply);
  244. }
  245. }
  246. return hr;
  247. }
  248. //===========================
  249. // *** IUnknown Interface ***
  250. //===========================
  251. ULONG CThemeSettingsPage::AddRef()
  252. {
  253. return InterlockedIncrement(&m_cRef);
  254. }
  255. ULONG CThemeSettingsPage::Release()
  256. {
  257. if (InterlockedDecrement(&m_cRef))
  258. return m_cRef;
  259. delete this;
  260. return 0;
  261. }
  262. HRESULT CThemeSettingsPage::QueryInterface(REFIID riid, void **ppvObj)
  263. {
  264. static const QITAB qit[] = {
  265. QITABENT(CThemeSettingsPage, IObjectWithSite),
  266. QITABENT(CThemeSettingsPage, IAdvancedDialog),
  267. { 0 },
  268. };
  269. return QISearch(this, qit, riid, ppvObj);
  270. }
  271. //===========================
  272. // *** Class Methods ***
  273. //===========================
  274. CThemeSettingsPage::CThemeSettingsPage() : m_cRef(1)
  275. {
  276. DllAddRef();
  277. // This needs to be allocated in Zero Inited Memory.
  278. // Assert that all Member Variables are inited to Zero.
  279. ASSERT(!m_fDirty);
  280. ASSERT(!m_hDlg);
  281. ASSERT(!m_pPropertyBag);
  282. }
  283. CThemeSettingsPage::~CThemeSettingsPage()
  284. {
  285. IUnknown_Set((IUnknown **) &m_pPropertyBag, NULL);
  286. DllRelease();
  287. }
  288. HRESULT CThemeSettingsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog)
  289. {
  290. HRESULT hr = E_INVALIDARG;
  291. if (ppAdvDialog)
  292. {
  293. CThemeSettingsPage * pThis = new CThemeSettingsPage();
  294. if (pThis)
  295. {
  296. hr = pThis->QueryInterface(IID_PPV_ARG(IAdvancedDialog, ppAdvDialog));
  297. pThis->Release();
  298. }
  299. else
  300. {
  301. *ppAdvDialog = NULL;
  302. hr = E_OUTOFMEMORY;
  303. }
  304. }
  305. return hr;
  306. }