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.

234 lines
5.4 KiB

  1. //---------------------------------------------------------------------------
  2. //
  3. // File: PROPSEXT.CPP
  4. //
  5. // Implementation of the CPropSheetExt object.
  6. //
  7. //---------------------------------------------------------------------------
  8. #include "precomp.hxx"
  9. #pragma hdrstop
  10. #include "..\common\propsext.h"
  11. #include "EffectsBasePg.h"
  12. #include <cowsite.h> // for CObjectWithSite
  13. #define PROPSHEET_CLASS CEffectsBasePage
  14. class CPropSheetExt;
  15. HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog);
  16. class CEffectsPage : public CObjectWithSite
  17. , public IAdvancedPropPage
  18. , public IShellExtInit
  19. {
  20. public:
  21. //////////////////////////////////////////////////////
  22. // Public Interfaces
  23. //////////////////////////////////////////////////////
  24. // *** IUnknown ***
  25. virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
  26. virtual STDMETHODIMP_(ULONG) AddRef(void);
  27. virtual STDMETHODIMP_(ULONG) Release(void);
  28. // *** IShellExtInit ***
  29. virtual STDMETHODIMP Initialize(IN LPCITEMIDLIST pidlFolder, IDataObject * pDataObj, IN HKEY hkeyProgID) {return E_NOTIMPL;}
  30. // *** IShellPropSheetExt ***
  31. virtual STDMETHODIMP AddPages(IN LPFNSVADDPROPSHEETPAGE pfnAddPage, IN LPARAM lParam);
  32. virtual STDMETHODIMP ReplacePage(IN EXPPS uPageID, IN LPFNSVADDPROPSHEETPAGE pfnReplaceWith, IN LPARAM lParam) {return E_NOTIMPL;}
  33. // *** IAdvancedPropPage ***
  34. virtual STDMETHODIMP IsDirty(IN BOOL * pIsDirty);
  35. virtual STDMETHODIMP OnClose(IN BOOL fCancelled, IN IBasePropPage * pAdvPage);
  36. private:
  37. CEffectsPage(void);
  38. virtual ~CEffectsPage(void);
  39. // Private Member Variables
  40. int m_cRef;
  41. BOOL m_fDirty;
  42. EFFECTS_STATE m_effectsState;
  43. // Private Member Functions
  44. HRESULT _OnInit(HWND hDlg);
  45. HRESULT _OnLoad(HWND hDlg); // Load the state from the base page.
  46. HRESULT _OnApply(HWND hDlg); // The user clicked apply
  47. HRESULT _OnSave(HWND hDlg); // Save the state to the base page.
  48. INT_PTR _PropertySheetDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
  49. friend INT_PTR CALLBACK PropertySheetDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);
  50. friend HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog);
  51. };
  52. //===========================
  53. // *** Class Internals & Helpers ***
  54. //===========================
  55. //===========================
  56. // *** IAdvancedPropPage Interface ***
  57. //===========================
  58. HRESULT CEffectsPage::IsDirty(IN BOOL * pIsDirty)
  59. {
  60. HRESULT hr = E_INVALIDARG;
  61. if (pIsDirty)
  62. {
  63. *pIsDirty = m_fDirty;
  64. hr = S_OK;
  65. }
  66. return hr;
  67. }
  68. HRESULT CEffectsPage::OnClose(IN BOOL fCancelled, IN IBasePropPage * pAdvPage)
  69. {
  70. HRESULT hr = S_OK;
  71. // TODO: Merger State as appropriate
  72. return hr;
  73. }
  74. #define MAX_PROPSHEET_TITLE 50
  75. //===========================
  76. // *** IShellPropSheetExt Interface ***
  77. //===========================
  78. HRESULT CEffectsPage::AddPages(IN LPFNSVADDPROPSHEETPAGE pfnAddPage, IN LPARAM lParam)
  79. {
  80. HRESULT hr = E_INVALIDARG;
  81. PROPSHEETPAGE psp = {0};
  82. TCHAR szTitle[MAX_PROPSHEET_TITLE];
  83. LoadString(g_hInst, IDS_PAGE_TITLE, szTitle, ARRAYSIZE(szTitle));
  84. psp.dwSize = sizeof(psp);
  85. psp.hInstance = g_hInst;
  86. psp.dwFlags = (PSP_USETITLE | PSP_USECALLBACK);
  87. psp.lParam = (LPARAM) this;
  88. psp.pszTemplate = MAKEINTRESOURCE(PROP_SHEET_DLG);
  89. psp.pfnDlgProc = PropertySheetDlgProc;
  90. psp.pfnCallback = PropertySheetCallback;
  91. psp.pszTitle = szTitle;
  92. HPROPSHEETPAGE hpsp = CreatePropertySheetPage(&psp);
  93. if (hpsp)
  94. {
  95. if (pfnAddPage(hpsp, lParam))
  96. {
  97. hr = S_OK;
  98. }
  99. else
  100. {
  101. DestroyPropertySheetPage(hpsp);
  102. hr = E_FAIL;
  103. }
  104. }
  105. return hr;
  106. }
  107. //===========================
  108. // *** IUnknown Interface ***
  109. //===========================
  110. ULONG CEffectsPage::AddRef()
  111. {
  112. m_cRef++;
  113. return m_cRef;
  114. }
  115. ULONG CEffectsPage::Release()
  116. {
  117. Assert(m_cRef > 0);
  118. m_cRef--;
  119. if (m_cRef > 0)
  120. return m_cRef;
  121. delete this;
  122. return 0;
  123. }
  124. HRESULT CEffectsPage::QueryInterface(REFIID riid, void **ppvObj)
  125. {
  126. HRESULT hr = E_NOINTERFACE;
  127. static const QITAB qit[] = {
  128. QITABENT(CEffectsPage, IObjectWithSite),
  129. QITABENT(CEffectsPage, IAdvancedPropPage),
  130. QITABENTMULTI(CEffectsPage, IShellPropSheetExt, IAdvancedPropPage),
  131. { 0 },
  132. };
  133. return QISearch(this, qit, riid, ppvObj);
  134. }
  135. //===========================
  136. // *** Class Methods ***
  137. //===========================
  138. CEffectsPage::CEffectsPage() : m_cRef(1)
  139. {
  140. // This needs to be allocated in Zero Inited Memory.
  141. // Assert that all Member Variables are inited to Zero.
  142. m_fDirty = FALSE;
  143. }
  144. CEffectsPage::~CEffectsPage()
  145. {
  146. }
  147. HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog)
  148. {
  149. HRESULT hr = E_INVALIDARG;
  150. if (ppAdvDialog)
  151. {
  152. CEffectsPage * pThis = new CEffectsPage();
  153. if (pThis)
  154. {
  155. hr = pThis->QueryInterface(IID_PPV_ARG(IAdvancedDialog, ppAdvDialog));
  156. pThis->Release();
  157. }
  158. else
  159. {
  160. *ppAdvDialog = NULL;
  161. hr = E_OUTOFMEMORY;
  162. }
  163. }
  164. return hr;
  165. }
  166. #include "..\common\propsext.cpp"