/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1998 **/ /**********************************************************************/ /* proppage.h Implementation for property pages in MMC FILE HISTORY: */ #ifndef _PROPPAGE_H #define _PROPPAGE_H // proppage.h : header file // #include "afxdlgs.h" /////////////////////////////////////////////////////////////////////////////// // FORWARD DECLARATIONS class CPropertyPageBase; typedef CList< CPropertyPageBase*, CPropertyPageBase* > CPropertyPageBaseList; HWND FindMMCMainWindow(); ///////////////////////////////////////////////////////////////////////////// // CPropertyPageHolderBase class CPropertyPageHolderBase { public: // construction // for scope pane property pages and wizards CPropertyPageHolderBase(ITFSNode * pNode, IComponentData *pComponentData, LPCTSTR pszSheetName, BOOL bIsScopePane = TRUE); // for result pane property pages only // result pane wizards should use the previous constructor CPropertyPageHolderBase(ITFSNode * pNode, IComponent * pComponent, LPCTSTR pszSheetName, BOOL bIsScopePane = FALSE); virtual ~CPropertyPageHolderBase(); // initialization // common // property sheet only HRESULT CreateModelessSheet(LPPROPERTYSHEETCALLBACK pSheetCallback, LONG_PTR hConsoleHandle); // Property sheet, but do everything ourselves HRESULT DoModelessSheet(); // wizard only HRESULT DoModalWizard(); // helpers // common void SetSheetWindow(HWND hSheetWindow); HWND GetSheetWindow(); BOOL SetDefaultSheetPos(); // sets the sheet window centered to the MMC main window void AddRef(); void Release(); DWORD GetRefCount(); // get/set for the node we are working on ITFSNode * GetNode(); void SetNode(ITFSNode* pNode); // get/set for the container we refer to ITFSNode * GetContainer(); BOOL IsWizardMode(); void ForceDestroy(); // forcefull shut down running sheet void AddPageToList(CPropertyPageBase* pPage); BOOL RemovePageFromList(CPropertyPageBase* pPage, BOOL bDeleteObject); // property sheet only // by WeiJiang 5/11/98, PeekMessageDuringNotifyConsole flag void EnablePeekMessageDuringNotifyConsole(BOOL bEnable) { m_bPeekMessageDuringNotifyConsole = bEnable; }; DWORD NotifyConsole(CPropertyPageBase* pPage); // notify console of property changes void AcknowledgeNotify(); // acknowledge from the console virtual void OnPropertyChange(BOOL bScopePane) {} // wizard only BOOL SetWizardButtons(DWORD dwFlags); BOOL SetWizardButtonsFirst(BOOL bValid); BOOL SetWizardButtonsMiddle(BOOL bValid); BOOL SetWizardButtonsLast(BOOL bValid); BOOL PressButton(int nButton); virtual DWORD OnFinish() { return 0; } virtual BOOL OnPropertyChange(BOOL bScopePane, LONG_PTR* pChangeMask); // execute from main thread HRESULT AddPageToSheet(CPropertyPageBase* pPage); HRESULT RemovePageFromSheet(CPropertyPageBase* pPage); HWND SetActiveWindow(); void IncrementDirty(int cDirty) { m_cDirty += cDirty; }; BOOL IsDirty() { return m_cDirty != 0; }; BOOL IsWiz97() { return m_bWiz97; } protected: // common HRESULT AddAllPagesToSheet(); private: void DeleteAllPages(); void FinalDestruct(); // attributes protected: // by WeiJiang 5/11/98, PeekMessageDuringNotifyConsole flag BOOL m_bPeekMessageDuringNotifyConsole; // Set to FALSE by default // common CString m_stSheetTitle; // title for the sheet/wizard window CPropertyPageBaseList m_pageList; // list of property page objects BOOL m_bWizardMode; // Wizard Mode (i.e. not modeless property sheet) BOOL m_bCalledFromConsole; // console told us to put up this page BOOL m_bAutoDelete; // delete itself when refcount is zero BOOL m_bAutoDeletePages; // explicitely delete the prop pages BOOL m_bSheetPosSet; BOOL m_bWiz97; SPIComponentData m_spComponentData; SPIComponent m_spComponent; BOOL m_bIsScopePane; // is this sheet for a scope pane node DWORD m_nCreatedCount; // count of pages actually created SPITFSNode m_spNode; // node the pages (or wizard) refers to SPITFSNode m_spParentNode; // node the pages (or wizard) refers to HWND m_hSheetWindow; // window handle to the sheet // property sheet only LONG_PTR m_hConsoleHandle; // handle for notifications to console HANDLE m_hEventHandle; // syncronization handle for property notifications // wizard only SPIPropertySheetCallback m_spSheetCallback;// cached pointer to add/remove pages int m_cDirty; BOOL m_fSetDefaultSheetPos; private: // property sheet only // variables to use across thread boundaries DWORD m_dwLastErr; // generic error code CPropertyPageBase* m_pPropChangePage; // page for which notification is valid public: HANDLE m_hThread; void SetError(DWORD dwErr) { m_dwLastErr = dwErr;} DWORD GetError() { return m_dwLastErr; } CPropertyPageBase* GetPropChangePage() { ASSERT(m_pPropChangePage != NULL); return m_pPropChangePage; } }; ///////////////////////////////////////////////////////////////////////////// // CPropertyPageBase class CPropertyPageBase : public CPropertyPage { DECLARE_DYNCREATE(CPropertyPageBase) // Construction private: CPropertyPageBase(){} // cannot use this constructor public: CPropertyPageBase(UINT nIDTemplate, UINT nIDCaption = 0); virtual ~CPropertyPageBase(); // Overrides public: virtual BOOL OnApply(); virtual void CancelApply(); protected: // Generated message map functions //{{AFX_MSG(CGeneralPage) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); //}}AFX_MSG // help messages afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); DECLARE_MESSAGE_MAP() // attributes public: void SetHolder(CPropertyPageHolderBase* pPageHolder); CPropertyPageHolderBase* GetHolder(); PROPSHEETPAGE m_psp97; HPROPSHEETPAGE m_hPage; // property seet only virtual BOOL OnPropertyChange(BOOL bScopePane, LONG_PTR* pChangeMask) // execute from main thread { return FALSE; /* do not repaint UI */ } // Use this call to get the actual help map // this version will check the global help map first. DWORD * GetHelpMapInternal(); // override this to return the pointer to the help map virtual LPDWORD GetHelpMap() { return NULL; } void InitWiz97(BOOL bHideHeader, UINT nIDHeaderTitle, UINT nIDHeaderSubTitle); protected: // These functions set the dirty flag on the current page virtual void SetDirty(BOOL bDirty); virtual BOOL IsDirty() { return m_bIsDirty; } private: CString m_szHeaderTitle; CString m_szHeaderSubTitle; CPropertyPageHolderBase* m_pPageHolder; // backpointer to holder BOOL m_bIsDirty; // dirty flag }; /*--------------------------------------------------------------------------- Inlined functions ---------------------------------------------------------------------------*/ inline void CPropertyPageHolderBase::AddRef() { m_nCreatedCount++; } inline DWORD CPropertyPageHolderBase::GetRefCount() { return m_nCreatedCount; } inline HWND CPropertyPageHolderBase::GetSheetWindow() { return m_hSheetWindow; } inline ITFSNode * CPropertyPageHolderBase::GetNode() { if (m_spNode) m_spNode->AddRef(); return m_spNode; } inline void CPropertyPageHolderBase::SetNode(ITFSNode *pNode) { m_spNode.Set(pNode); m_spParentNode.Release(); if (m_spNode) m_spNode->GetParent(&m_spParentNode); } inline ITFSNode * CPropertyPageHolderBase::GetContainer() { if (m_spParentNode) m_spParentNode->AddRef(); return m_spParentNode; } inline BOOL CPropertyPageHolderBase::IsWizardMode() { return m_bWizardMode; } inline BOOL CPropertyPageHolderBase::SetWizardButtonsFirst(BOOL bValid) { return SetWizardButtons(bValid ? PSWIZB_NEXT : 0); } inline BOOL CPropertyPageHolderBase::SetWizardButtonsMiddle(BOOL bValid) { return SetWizardButtons(bValid ? (PSWIZB_BACK|PSWIZB_NEXT) : PSWIZB_BACK); } inline BOOL CPropertyPageHolderBase::SetWizardButtonsLast(BOOL bValid) { return SetWizardButtons(bValid ? (PSWIZB_BACK|PSWIZB_FINISH) : (PSWIZB_BACK|PSWIZB_DISABLEDFINISH)); } inline void CPropertyPageBase::SetHolder(CPropertyPageHolderBase *pPageHolder) { Assert((pPageHolder != NULL) && (m_pPageHolder == NULL)); m_pPageHolder = pPageHolder; } inline CPropertyPageHolderBase * CPropertyPageBase::GetHolder() { return m_pPageHolder; } inline void CPropertyPageBase::SetDirty(BOOL bDirty) { SetModified(bDirty); m_bIsDirty = bDirty; } // Use this function for property pages on the Scope pane HRESULT DoPropertiesOurselvesSinceMMCSucks(ITFSNode *pNode, IComponentData *pComponentData, LPCTSTR pszSheetTitle); // Use this function for property pages on the result pane HRESULT DoPropertiesOurselvesSinceMMCSucks(ITFSNode * pNode, IComponent * pComponent, LPCTSTR pszSheetTitle, int nVirtualIndex = -1); /*!-------------------------------------------------------------------------- EnableChildControls Use this function to enable/disable/hide/show all child controls on a page (actually it will work with any child windows, the parent does not have to be a property page). Author: KennT ---------------------------------------------------------------------------*/ HRESULT EnableChildControls(HWND hWnd, DWORD dwFlags); #define PROPPAGE_CHILD_SHOW 0x00000001 #define PROPPAGE_CHILD_HIDE 0x00000002 #define PROPPAGE_CHILD_ENABLE 0x00000004 #define PROPPAGE_CHILD_DISABLE 0x00000008 /*!-------------------------------------------------------------------------- MultiEnableWindow This function takes a variable length list of control ids, that will be enabled/disabled. The last item in the control id list must be 0. The reason why I called this MultiEnableWindow instead of EnableMultiWindow is that we can grep for EnableWindow and still show these calls. Author: KennT ---------------------------------------------------------------------------*/ HRESULT MultiEnableWindow(HWND hWndParent, BOOL fEnable, UINT nCtrlId, ...); #endif // _PROPPAGE_H