|
|
//============================================================================
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: sheet.h
//
// History:
// Abolade Gbadegesin April-17-1996 Created.
//
// This file contains declarations for the CPropertySheetEx_Mine class,
// which is based on CPropertySheet and supports modal or modeless display.
//============================================================================
#ifndef _SHEET_H_
#define _SHEET_H_
//----------------------------------------------------------------------------
// Class: CPropertySheetEx_Mine
//----------------------------------------------------------------------------
class CPropertySheetEx_Mine : public CPropertySheet {
DECLARE_DYNAMIC(CPropertySheetEx_Mine)
public:
//-------------------------------------------------------------------
// Constructors
//
//-------------------------------------------------------------------
CPropertySheetEx_Mine( UINT nIDCaption, CWnd* pParent = NULL, UINT iPage = 0 ) : CPropertySheet(nIDCaption, pParent, iPage), m_bSheetModal(FALSE), m_bDllInvoked(FALSE) { m_psh.dwFlags &= ~(PSH_HASHELP); }
CPropertySheetEx_Mine( LPCTSTR pszCaption, CWnd* pParent = NULL, UINT iPage = 0 ) : CPropertySheet(pszCaption, pParent, iPage), m_bSheetModal(FALSE), m_bDllInvoked(FALSE) { m_psh.dwFlags &= ~(PSH_HASHELP); }
CPropertySheetEx_Mine( ) : m_bDllInvoked(FALSE), m_bSheetModal(FALSE) { m_psh.dwFlags &= ~(PSH_HASHELP); }
//-------------------------------------------------------------------
// Function: DestroyWindow
//
// Checks whether the sheet was invoked modeless from a DLL,
// and if so tells the admin-thread to destroy the sheet.
// This is necessary since DestroyWindow can only be invoked
// from the context of the thread which created the window.
//-------------------------------------------------------------------
virtual BOOL DestroyWindow( );
//-------------------------------------------------------------------
// Function: OnHelpInfo
//
// This is called by MFC in response to WM_HELP message
//
//
//-------------------------------------------------------------------
afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo);
//-------------------------------------------------------------------
// Function: DoModeless
//
// Invoked to show the modeless property sheet
//-------------------------------------------------------------------
BOOL DoModeless( CWnd* pParent = NULL, BOOL bDllInvoked = FALSE );
//-------------------------------------------------------------------
// Function: OnInitDialog
//
// Invokes the base OnInitDialog and then if DoModeless was called,
// shows the buttons OK, Cancel, Apply, and Help which are hidden
// in the default CPropertySheet::OnInitDialog
//-------------------------------------------------------------------
virtual BOOL OnInitDialog( );
//-------------------------------------------------------------------
// Function: PostNcDestroy
//
// Destroys the sheet's object if modeless
//-------------------------------------------------------------------
virtual void PostNcDestroy( ) {
CPropertySheet::PostNcDestroy();
if (!m_bSheetModal) { delete this; } }
//-------------------------------------------------------------------
// Function: PreTranslateMessage
//
// Replacement for CPropertySheet::PreTranslateMessage;
// handles destruction of the sheet when it is modeless.
//-------------------------------------------------------------------
virtual BOOL PreTranslateMessage( MSG* pmsg );
protected:
// This is set to TRUE if we are calling this through DoModal().
// We can't use the m_bModeless variable due to the Wiz97 changes.
BOOL m_bSheetModal;
BOOL m_bDllInvoked;
DECLARE_MESSAGE_MAP() };
//----------------------------------------------------------------------------
// Type: PFNROUTERUICALLBACK
//
// Defines the callback function used by the CRtrPropertySheet class.
//----------------------------------------------------------------------------
typedef VOID (CALLBACK* PFNROUTERUICALLBACK)( IN HWND hwndSheet, IN VOID* pCallbackData, IN UINT uiCode );
//----------------------------------------------------------------------------
// Definitions of the callback codes passed by the CRtrPropertySheet class.
//----------------------------------------------------------------------------
#define RTRUI_Close 1
#define RTRUI_Apply 2
#define RTRUI_Changed 3
#define RTRUI_Unchanged 4
//----------------------------------------------------------------------------
// Class: CRtrSheet
//
// This class is used by property sheets in the router administration tool.
// It is intended to host pages derived from CRtrPropertyPage (below).
//
// It is an enhanced version of CPropertySheetEx_Mine; sheets derived
// from this class allow their creators to specify a callback
// to be invoked when certain events occur, such as closing the sheet or
// applying changes.
//
// It also allows its contained pages to accumulate their changes in memory
// when the user selects "Apply"; the changes are then saved together,
// rather than having each page save its own changes.
// Note that this increases the performance of the router UI, which uses RPC
// to save its information; using this class results in a single RPC call
// to save changes, rather than separate calls from each of the pages.
//----------------------------------------------------------------------------
class CRtrSheet : public CPropertySheetEx_Mine {
DECLARE_DYNAMIC(CRtrSheet)
public:
//-------------------------------------------------------------------
// Constructors
//
//-------------------------------------------------------------------
CRtrSheet( PFNROUTERUICALLBACK pfnCallback, VOID* pCallbackData, UINT nIDCaption, CWnd* pParent = NULL, UINT iPage = 0 ) : CPropertySheetEx_Mine(nIDCaption, pParent, iPage), m_pfnCallback(pfnCallback), m_pCallbackData(pCallbackData) { }
CRtrSheet( PFNROUTERUICALLBACK pfnCallback, VOID* pCallbackData, LPCTSTR pszCaption, CWnd* pParent = NULL, UINT iPage = 0 ) : CPropertySheetEx_Mine(pszCaption, pParent, iPage), m_pfnCallback(pfnCallback), m_pCallbackData(pCallbackData) { }
CRtrSheet( ) : m_pfnCallback(NULL), m_pCallbackData(NULL) { }
//-------------------------------------------------------------------
// Function: Cancel
//
// Called to cancel the sheet.
//-------------------------------------------------------------------
virtual VOID Cancel( ) {
if (!m_bSheetModal) { PressButton(PSBTN_CANCEL); } else { EndDialog(IDCANCEL); } }
//-------------------------------------------------------------------
// Function: Callback
//
// Called by contained pages to notify the sheet-owner of events
//-------------------------------------------------------------------
virtual VOID Callback( UINT uiMsg ) {
if (m_pfnCallback) { m_pfnCallback(m_hWnd, m_pCallbackData, uiMsg); } }
//-------------------------------------------------------------------
// Function: DoModal
//
// Invoked to show a modal property sheet.
//
// We remove the 'Apply' button so that the page only gets applied
// when the user hits OK.
//
// In addition, in order to avoid an MFC bug, lock the handle-map
// for the caller's module. The bug surfaces when idle-processing
// in MFC deletes the dialog's top-level parent from the temporary
// handle-map, causing an assertion to fail as soon as the dialog
// is dismissed.
//-------------------------------------------------------------------
virtual INT_PTR DoModal( ) {
m_bSheetModal = TRUE; m_psh.dwFlags |= PSH_NOAPPLYNOW; m_psh.dwFlags &= ~(PSH_HASHELP);
AfxLockTempMaps();
INT_PTR ret = CPropertySheet::DoModal();
AfxUnlockTempMaps();
m_bSheetModal = FALSE;
return ret; }
//-------------------------------------------------------------------
// Function: ApplyAll
//
// This should be overridden to call the "Apply" method of each of
// the sheet's pages, collecting information, and then saving all
// changes at once.
//-------------------------------------------------------------------
virtual BOOL ApplyAll( ) { return TRUE; }
//-------------------------------------------------------------------
// Function: PostNcDestroy
//
// notifies the UI framework that the sheet is being destroyed
//-------------------------------------------------------------------
virtual void PostNcDestroy( ) {
Callback(RTRUI_Close);
CPropertySheetEx_Mine::PostNcDestroy(); }
protected:
PFNROUTERUICALLBACK m_pfnCallback; VOID* m_pCallbackData; };
//----------------------------------------------------------------------------
// Class: CRtrPage
//
// This class is used for property-pages in the router administration tool.
// It is intended to be contained by a CRtrSheet-derived object.
//
// In addition to the behavior defined by CPropertyPage, this class
// adds the ability to have a page accumulate its changes with those of
// other pages in a sheet, and have the sheet save the collected changes.
//
// This is accomplished below by overriding "CPropertyPage::OnApply"
// to call the parent-sheet's "CRtrSheet::ApplyAll" if the page
// is the first page (i.e. the page with index 0).
//
// The parent's "ApplyAll" should then call the "CRtrSheet::Apply"
// methods for each of the pages in the sheet, passing them a sheet-specific
// pointer into which changes are to be collected. The parent then saves
// the information for all of the pages.
//
// CRtrPage-derived objects can also notify the creator of the sheet
// of events, by calling the "CRtrSheet::Callback" method.
//----------------------------------------------------------------------------
class CRtrPage : public CPropertyPage { DECLARE_DYNAMIC(CRtrPage)
public:
//-------------------------------------------------------------------
// Constructors
//
//-------------------------------------------------------------------
CRtrPage( LPCTSTR lpszTemplate, UINT nIDCaption = 0 ) : CPropertyPage(lpszTemplate, nIDCaption) { m_psp.dwFlags &= ~(PSP_HASHELP); } CRtrPage( UINT nIDTemplate, UINT nIDCaption = 0 ) : CPropertyPage(nIDTemplate, nIDCaption) { m_psp.dwFlags &= ~(PSP_HASHELP); }
//-------------------------------------------------------------------
// Function: Cancel
//
// Called to cancel the sheet.
//-------------------------------------------------------------------
virtual VOID Cancel( ) { ((CRtrSheet*)GetParent())->Cancel(); } //-------------------------------------------------------------------
// Function: OnApply
//
// Called by the MFC propsheet-proc when user clicks Apply;
// the active page calls the pages' parent (CPropertySheet)
// and the parent invokes the Apply method for each of its pages.
//-------------------------------------------------------------------
virtual BOOL OnApply( ) { if (((CRtrSheet *)GetParent())->GetActiveIndex() != ((CRtrSheet *)GetParent())->GetPageIndex(this)) { return TRUE; } else { return ((CRtrSheet *)GetParent())->ApplyAll(); } }
//-------------------------------------------------------------------
// Function: Apply
//
// called by the page's parent (CRtrSheet) to apply changes
//-------------------------------------------------------------------
virtual BOOL Apply( VOID* pArg ) { return TRUE; } //-------------------------------------------------------------------
// Function: Callback
//
// notifies the UI framework of an event
//-------------------------------------------------------------------
virtual void Callback( UINT uiMsg ) { ((CRtrSheet *)GetParent())->Callback(uiMsg); } // help messages
afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
protected: // 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; }
DECLARE_MESSAGE_MAP()
};
#endif // _SHEET_H_
|