windows-nt/Source/XPSP1/NT/shell/cpls/plus/propsext.cpp
2020-09-26 16:20:57 +08:00

235 lines
5.4 KiB
C++

//---------------------------------------------------------------------------
//
// File: PROPSEXT.CPP
//
// Implementation of the CPropSheetExt object.
//
//---------------------------------------------------------------------------
#include "precomp.hxx"
#pragma hdrstop
#include "..\common\propsext.h"
#include "EffectsBasePg.h"
#include <cowsite.h> // for CObjectWithSite
#define PROPSHEET_CLASS CEffectsBasePage
class CPropSheetExt;
HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog);
class CEffectsPage : public CObjectWithSite
, public IAdvancedPropPage
, public IShellExtInit
{
public:
//////////////////////////////////////////////////////
// Public Interfaces
//////////////////////////////////////////////////////
// *** IUnknown ***
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
// *** IShellExtInit ***
virtual STDMETHODIMP Initialize(IN LPCITEMIDLIST pidlFolder, IDataObject * pDataObj, IN HKEY hkeyProgID) {return E_NOTIMPL;}
// *** IShellPropSheetExt ***
virtual STDMETHODIMP AddPages(IN LPFNSVADDPROPSHEETPAGE pfnAddPage, IN LPARAM lParam);
virtual STDMETHODIMP ReplacePage(IN EXPPS uPageID, IN LPFNSVADDPROPSHEETPAGE pfnReplaceWith, IN LPARAM lParam) {return E_NOTIMPL;}
// *** IAdvancedPropPage ***
virtual STDMETHODIMP IsDirty(IN BOOL * pIsDirty);
virtual STDMETHODIMP OnClose(IN BOOL fCancelled, IN IBasePropPage * pAdvPage);
private:
CEffectsPage(void);
virtual ~CEffectsPage(void);
// Private Member Variables
int m_cRef;
BOOL m_fDirty;
EFFECTS_STATE m_effectsState;
// Private Member Functions
HRESULT _OnInit(HWND hDlg);
HRESULT _OnLoad(HWND hDlg); // Load the state from the base page.
HRESULT _OnApply(HWND hDlg); // The user clicked apply
HRESULT _OnSave(HWND hDlg); // Save the state to the base page.
INT_PTR _PropertySheetDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
friend INT_PTR CALLBACK PropertySheetDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);
friend HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog);
};
//===========================
// *** Class Internals & Helpers ***
//===========================
//===========================
// *** IAdvancedPropPage Interface ***
//===========================
HRESULT CEffectsPage::IsDirty(IN BOOL * pIsDirty)
{
HRESULT hr = E_INVALIDARG;
if (pIsDirty)
{
*pIsDirty = m_fDirty;
hr = S_OK;
}
return hr;
}
HRESULT CEffectsPage::OnClose(IN BOOL fCancelled, IN IBasePropPage * pAdvPage)
{
HRESULT hr = S_OK;
// TODO: Merger State as appropriate
return hr;
}
#define MAX_PROPSHEET_TITLE 50
//===========================
// *** IShellPropSheetExt Interface ***
//===========================
HRESULT CEffectsPage::AddPages(IN LPFNSVADDPROPSHEETPAGE pfnAddPage, IN LPARAM lParam)
{
HRESULT hr = E_INVALIDARG;
PROPSHEETPAGE psp = {0};
TCHAR szTitle[MAX_PROPSHEET_TITLE];
LoadString(g_hInst, IDS_PAGE_TITLE, szTitle, ARRAYSIZE(szTitle));
psp.dwSize = sizeof(psp);
psp.hInstance = g_hInst;
psp.dwFlags = (PSP_USETITLE | PSP_USECALLBACK);
psp.lParam = (LPARAM) this;
psp.pszTemplate = MAKEINTRESOURCE(PROP_SHEET_DLG);
psp.pfnDlgProc = PropertySheetDlgProc;
psp.pfnCallback = PropertySheetCallback;
psp.pszTitle = szTitle;
HPROPSHEETPAGE hpsp = CreatePropertySheetPage(&psp);
if (hpsp)
{
if (pfnAddPage(hpsp, lParam))
{
hr = S_OK;
}
else
{
DestroyPropertySheetPage(hpsp);
hr = E_FAIL;
}
}
return hr;
}
//===========================
// *** IUnknown Interface ***
//===========================
ULONG CEffectsPage::AddRef()
{
m_cRef++;
return m_cRef;
}
ULONG CEffectsPage::Release()
{
Assert(m_cRef > 0);
m_cRef--;
if (m_cRef > 0)
return m_cRef;
delete this;
return 0;
}
HRESULT CEffectsPage::QueryInterface(REFIID riid, void **ppvObj)
{
HRESULT hr = E_NOINTERFACE;
static const QITAB qit[] = {
QITABENT(CEffectsPage, IObjectWithSite),
QITABENT(CEffectsPage, IAdvancedPropPage),
QITABENTMULTI(CEffectsPage, IShellPropSheetExt, IAdvancedPropPage),
{ 0 },
};
return QISearch(this, qit, riid, ppvObj);
}
//===========================
// *** Class Methods ***
//===========================
CEffectsPage::CEffectsPage() : m_cRef(1)
{
// This needs to be allocated in Zero Inited Memory.
// Assert that all Member Variables are inited to Zero.
m_fDirty = FALSE;
}
CEffectsPage::~CEffectsPage()
{
}
HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog)
{
HRESULT hr = E_INVALIDARG;
if (ppAdvDialog)
{
CEffectsPage * pThis = new CEffectsPage();
if (pThis)
{
hr = pThis->QueryInterface(IID_PPV_ARG(IAdvancedDialog, ppAdvDialog));
pThis->Release();
}
else
{
*ppAdvDialog = NULL;
hr = E_OUTOFMEMORY;
}
}
return hr;
}
#include "..\common\propsext.cpp"