473 lines
14 KiB
C
473 lines
14 KiB
C
|
//============================================================================
|
||
|
// 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_
|