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.
 
 
 
 
 
 

370 lines
9.2 KiB

//----------------------------------------------------------------------------
//
// 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