//---------------------------------------------------------------------------- // // 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* pSecPolItem); void SetManager(CPropertySheetManager * pManager) { m_spManager = pManager; } UINT m_nIDD; UINT m_nNextIDD; BOOL m_bWiz97; #ifdef WIZ97WIZARDS public: virtual BOOL InitWiz97( CComObject *pSecPolItem, DWORD dwFlags, DWORD dwWizButtonFlags = 0, UINT nHeaderTitle = 0, UINT nSubTitle = 0); virtual BOOL InitWiz97( LPFNPSPCALLBACK pfnCallback, CComObject *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 *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* pSecPolItem ) { CComObject * pOldItem = m_pspiResultItem; m_pspiResultItem = pSecPolItem; if (m_pspiResultItem) { m_pspiResultItem->AddRef(); } if (pOldItem) { pOldItem->Release(); } } CComObject* 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 * m_pspiResultItem; CComPtr 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 CListSnapPages; class ATL_NO_VTABLE CPropertySheetManager : public CComObjectRootEx, 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