371 lines
9.2 KiB
C
371 lines
9.2 KiB
C
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2001.
|
||
|
//
|
||
|
// File: Snppage.h
|
||
|
//
|
||
|
// Contents: WiF Policy Snapin
|
||
|
//
|
||
|
//
|
||
|
// History: TaroonM
|
||
|
// 10/30/01
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef _SNPPAGE_H
|
||
|
#define _SNPPAGE_H
|
||
|
|
||
|
// CSnapPage.h : header file
|
||
|
//
|
||
|
|
||
|
// PSM_QUERYSIBLING helpers
|
||
|
//
|
||
|
// User defined message IDs, passed in wparam of message PSM_QUERYSIBLING
|
||
|
#define PSM_QUERYSIBLING_ACTIVATED (WM_USER + 1)
|
||
|
|
||
|
#ifdef WIZ97WIZARDS
|
||
|
class CWiz97Sheet;
|
||
|
#endif
|
||
|
|
||
|
class CPropertySheetManager;
|
||
|
|
||
|
class CSnapPage : public CPropertyPage
|
||
|
{
|
||
|
DECLARE_DYNCREATE(CSnapPage)
|
||
|
|
||
|
CSnapPage(UINT nIDTemplate, BOOL bWiz97=FALSE, UINT nNextIDD=-1);
|
||
|
CSnapPage() {ASSERT(0);};
|
||
|
virtual ~CSnapPage();
|
||
|
|
||
|
virtual HRESULT Initialize( CComObject<CSecPolItem>* pSecPolItem);
|
||
|
void SetManager(CPropertySheetManager * pManager)
|
||
|
{
|
||
|
m_spManager = pManager;
|
||
|
}
|
||
|
|
||
|
UINT m_nIDD;
|
||
|
UINT m_nNextIDD;
|
||
|
BOOL m_bWiz97;
|
||
|
|
||
|
#ifdef WIZ97WIZARDS
|
||
|
public:
|
||
|
virtual BOOL InitWiz97( CComObject<CSecPolItem> *pSecPolItem, DWORD dwFlags,
|
||
|
DWORD dwWizButtonFlags = 0, UINT nHeaderTitle = 0, UINT nSubTitle = 0);
|
||
|
virtual BOOL InitWiz97( LPFNPSPCALLBACK pfnCallback, CComObject<CSecPolItem> *pSecPolItem,
|
||
|
DWORD dwFlags, DWORD dwWizButtonFlags = 0, UINT nHeaderTitle = 0, UINT nSubTitle = 0,
|
||
|
STACK_INT *pstackPages=NULL);
|
||
|
|
||
|
// our m_psp
|
||
|
PROPSHEETPAGE m_psp;
|
||
|
|
||
|
void Wiz97Sheet (CWiz97Sheet* pWiz97Sheet) {m_pWiz97Sheet = pWiz97Sheet;};
|
||
|
CWiz97Sheet* Wiz97Sheet () {return m_pWiz97Sheet;};
|
||
|
|
||
|
protected:
|
||
|
void CommonInitWiz97( CComObject<CSecPolItem> *pSecPolItem, DWORD dwFlags,
|
||
|
DWORD dwWizButtonFlags, UINT nHeaderTitle, UINT nSubTitle );
|
||
|
void SetCallback( LPFNPSPCALLBACK pfnCallback );
|
||
|
void SetPostRemoveFocus( int nListSel, UINT nAddId, UINT nRemoveId, CWnd *pwndPrevFocus );
|
||
|
|
||
|
CWiz97Sheet* m_pWiz97Sheet;
|
||
|
DWORD m_dwWizButtonFlags;
|
||
|
|
||
|
TCHAR* m_pHeaderTitle;
|
||
|
TCHAR* m_pHeaderSubTitle;
|
||
|
#endif
|
||
|
|
||
|
// Overrides
|
||
|
public:
|
||
|
// ClassWizard generate virtual function overrides
|
||
|
//{{AFX_VIRTUAL(CSnapPage)
|
||
|
public:
|
||
|
virtual BOOL OnApply();
|
||
|
virtual void OnCancel();
|
||
|
virtual BOOL OnWizardFinish();
|
||
|
|
||
|
#ifdef WIZ97WIZARDS
|
||
|
virtual BOOL OnSetActive();
|
||
|
virtual LRESULT OnWizardBack();
|
||
|
virtual LRESULT OnWizardNext();
|
||
|
#endif
|
||
|
//}}AFX_VIRTUAL
|
||
|
|
||
|
static UINT CALLBACK PropertyPageCallback (HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp);
|
||
|
UINT (CALLBACK* m_pDefaultCallback) (HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp);
|
||
|
|
||
|
// Don't need to save original LPARAM for m_pDefaultCallback. For some reason it works just
|
||
|
// fine as is.
|
||
|
//LPARAM m_paramDefaultCallback;
|
||
|
|
||
|
void ProtectFromStaleData (BOOL bRefresh = TRUE) {m_bDoRefresh = bRefresh;};
|
||
|
|
||
|
// Implementation
|
||
|
public:
|
||
|
|
||
|
BOOL IsModified() { return m_bModified; }
|
||
|
|
||
|
//This is get called when the CPropertySheetManager notify the page
|
||
|
//that the apply in the manager is done
|
||
|
//See also CPropertySheetManager::NotifyManagerApplied
|
||
|
virtual void OnManagerApplied() {};
|
||
|
|
||
|
protected:
|
||
|
//{{AFX_MSG(CSnapPage)
|
||
|
virtual BOOL OnInitDialog();
|
||
|
afx_msg void OnDestroy();
|
||
|
//}}AFX_MSG
|
||
|
DECLARE_MESSAGE_MAP()
|
||
|
|
||
|
void SetResultObject( CComObject<CSecPolItem>* pSecPolItem )
|
||
|
{
|
||
|
CComObject<CSecPolItem> * pOldItem = m_pspiResultItem;
|
||
|
|
||
|
m_pspiResultItem = pSecPolItem;
|
||
|
if (m_pspiResultItem)
|
||
|
{
|
||
|
m_pspiResultItem->AddRef();
|
||
|
}
|
||
|
|
||
|
if (pOldItem)
|
||
|
{
|
||
|
pOldItem->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CComObject<CSecPolItem>* GetResultObject() { ASSERT( NULL != m_pspiResultItem ); return m_pspiResultItem; }
|
||
|
|
||
|
// Want to test validity of m_pspiResultItem without actually getting the ptr.
|
||
|
// We can keep the ASSERT in the accessor function this way.
|
||
|
BOOL IsNullResultObject() { return NULL == m_pspiResultItem ? TRUE : FALSE; }
|
||
|
|
||
|
void SetModified( BOOL bChanged = TRUE );
|
||
|
|
||
|
BOOL IsCancelEnabled();
|
||
|
|
||
|
BOOL ActivateThisPage();
|
||
|
|
||
|
int PopWiz97Page ();
|
||
|
void PushWiz97Page (int nIDD);
|
||
|
|
||
|
virtual void OnFinishInitDialog()
|
||
|
{
|
||
|
m_bInitializing = FALSE;
|
||
|
}
|
||
|
BOOL HandlingInitDialog() { return m_bInitializing; }
|
||
|
|
||
|
virtual BOOL CancelApply();
|
||
|
|
||
|
CComObject <CSecPolItem>* m_pspiResultItem;
|
||
|
|
||
|
CComPtr<CPropertySheetManager> m_spManager;
|
||
|
|
||
|
private:
|
||
|
BOOL m_bDoRefresh;
|
||
|
BOOL m_bModified;
|
||
|
BOOL m_bInitializing; // TRUE during OnInitDialog
|
||
|
|
||
|
STACK_INT *m_pstackWiz97Pages;
|
||
|
|
||
|
};
|
||
|
|
||
|
//the class to handle MMC property pages
|
||
|
class CSnapinPropPage : public CSnapPage
|
||
|
{
|
||
|
DECLARE_DYNCREATE(CSnapinPropPage)
|
||
|
|
||
|
public:
|
||
|
CSnapinPropPage (UINT nIDTemplate, BOOL fNotifyConsole = TRUE) :
|
||
|
CSnapPage(nIDTemplate),
|
||
|
m_fNotifyConsole (fNotifyConsole)
|
||
|
{}
|
||
|
|
||
|
CSnapinPropPage() :CSnapPage() {}
|
||
|
|
||
|
virtual ~CSnapinPropPage() {}
|
||
|
|
||
|
virtual BOOL OnApply()
|
||
|
{
|
||
|
if (IsModified() && m_pspiResultItem && m_fNotifyConsole)
|
||
|
{
|
||
|
LONG_PTR handleNotify = m_pspiResultItem->GetNotifyHandle();
|
||
|
|
||
|
//We dont use CPropertySheetManager to control the prop sheet if this is
|
||
|
//a MMC prop sheet. So we should call OnManagerApplied to let the page to
|
||
|
//apply the data here
|
||
|
if (!m_spManager.p)
|
||
|
{
|
||
|
OnManagerApplied();
|
||
|
}
|
||
|
|
||
|
if (handleNotify)
|
||
|
MMCPropertyChangeNotify(handleNotify, (LPARAM) m_pspiResultItem);
|
||
|
}
|
||
|
|
||
|
return CSnapPage::OnApply();
|
||
|
}
|
||
|
protected:
|
||
|
BOOL m_fNotifyConsole;
|
||
|
};
|
||
|
|
||
|
typedef CList<CSnapPage *, CSnapPage *> CListSnapPages;
|
||
|
|
||
|
|
||
|
class ATL_NO_VTABLE CPropertySheetManager :
|
||
|
public CComObjectRootEx<CComSingleThreadModel>,
|
||
|
public IUnknown
|
||
|
{
|
||
|
BEGIN_COM_MAP(CPropertySheetManager)
|
||
|
COM_INTERFACE_ENTRY(IUnknown)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
public:
|
||
|
CPropertySheetManager() :
|
||
|
m_fModified (FALSE),
|
||
|
m_fCanceled (FALSE),
|
||
|
m_fDataChangeOnApply (FALSE)
|
||
|
{}
|
||
|
|
||
|
virtual ~CPropertySheetManager() {};
|
||
|
|
||
|
BOOL IsModified() {
|
||
|
return m_fModified;
|
||
|
}
|
||
|
void SetModified(BOOL fModified) {
|
||
|
m_fModified = fModified;
|
||
|
}
|
||
|
|
||
|
BOOL IsCanceled() {
|
||
|
return m_fCanceled;
|
||
|
}
|
||
|
|
||
|
BOOL HasEverApplied() {
|
||
|
return m_fDataChangeOnApply;
|
||
|
}
|
||
|
|
||
|
CPropertySheet * PropertySheet()
|
||
|
{
|
||
|
return &m_Sheet;
|
||
|
}
|
||
|
|
||
|
virtual void AddPage(CSnapPage * pPage)
|
||
|
{
|
||
|
ASSERT(pPage);
|
||
|
|
||
|
m_listPages.AddTail(pPage);
|
||
|
pPage->SetManager(this);
|
||
|
|
||
|
m_Sheet.AddPage(pPage);
|
||
|
}
|
||
|
|
||
|
virtual void OnCancel()
|
||
|
{
|
||
|
m_fCanceled = TRUE;
|
||
|
}
|
||
|
|
||
|
virtual BOOL OnApply()
|
||
|
{
|
||
|
if (!IsModified())
|
||
|
return TRUE;
|
||
|
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
SetModified(FALSE); // prevent from doing this more than once
|
||
|
|
||
|
CSnapPage * pPage;
|
||
|
|
||
|
POSITION pos = m_listPages.GetHeadPosition();
|
||
|
while(pos)
|
||
|
{
|
||
|
pPage = m_listPages.GetNext(pos);
|
||
|
if (pPage->IsModified())
|
||
|
{
|
||
|
fRet = pPage->OnApply();
|
||
|
|
||
|
//exit if any page says no
|
||
|
if (!fRet)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//OK we update data at least once now
|
||
|
if (fRet)
|
||
|
m_fDataChangeOnApply = TRUE;
|
||
|
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
//the manager should call this method to notify the pages that
|
||
|
//the apply in the manager is done, so that the page can do their
|
||
|
//specific data operation
|
||
|
virtual void NotifyManagerApplied()
|
||
|
{
|
||
|
CSnapPage * pPage;
|
||
|
POSITION pos = m_listPages.GetHeadPosition();
|
||
|
while(pos)
|
||
|
{
|
||
|
pPage = m_listPages.GetNext(pos);
|
||
|
pPage->OnManagerApplied();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual CPropertySheet * GetSheet()
|
||
|
{
|
||
|
return &m_Sheet;
|
||
|
}
|
||
|
|
||
|
virtual int DoModalPropertySheet()
|
||
|
{
|
||
|
return m_Sheet.DoModal();
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
|
||
|
CPropertySheet m_Sheet;
|
||
|
CListSnapPages m_listPages;
|
||
|
BOOL m_fModified;
|
||
|
BOOL m_fCanceled;
|
||
|
BOOL m_fDataChangeOnApply;
|
||
|
|
||
|
};
|
||
|
|
||
|
class CMMCPropSheetManager : public CPropertySheetManager
|
||
|
{
|
||
|
public:
|
||
|
CMMCPropSheetManager() :
|
||
|
CPropertySheetManager(),
|
||
|
m_fNotifyConsole(FALSE)
|
||
|
{}
|
||
|
|
||
|
void EnableConsoleNotify(
|
||
|
LONG_PTR lpNotifyHandle,
|
||
|
LPARAM lParam = 0
|
||
|
)
|
||
|
{
|
||
|
m_fNotifyConsole = TRUE;
|
||
|
m_lpNotifyHandle = lpNotifyHandle;
|
||
|
m_lpNotifyParam = lParam;
|
||
|
}
|
||
|
|
||
|
void NotifyConsole()
|
||
|
{
|
||
|
if (m_fNotifyConsole && m_lpNotifyHandle)
|
||
|
{
|
||
|
::MMCPropertyChangeNotify(
|
||
|
m_lpNotifyHandle,
|
||
|
m_lpNotifyParam
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
LONG_PTR m_lpNotifyHandle;
|
||
|
LPARAM m_lpNotifyParam;
|
||
|
BOOL m_fNotifyConsole;
|
||
|
};
|
||
|
|
||
|
//Max number of chars in a name or description
|
||
|
const UINT c_nMaxName = 255;
|
||
|
|
||
|
#endif
|