419 lines
9.2 KiB
C
419 lines
9.2 KiB
C
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) 1996-1998 Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// AtlBasePage.h
|
||
|
//
|
||
|
// Description:
|
||
|
// Definition of the CBasePageWindow and CBasePageImpl classes.
|
||
|
//
|
||
|
// Author:
|
||
|
// David Potter (davidp) December 2, 1997
|
||
|
//
|
||
|
// Revision History:
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef __ATLBASEPAGE_H_
|
||
|
#define __ATLBASEPAGE_H_
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Forward Class Declarations
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CBasePageWindow;
|
||
|
template < class T, class TBase > class CBasePageImpl;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// External Class Declarations
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CBaseSheetWindow;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Include Files
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef __ATLDBGWIN_H_
|
||
|
#include "AtlDbgWin.h" // for DBG_xxx routines
|
||
|
#endif
|
||
|
|
||
|
#ifndef __DLGITEMUTILS_H_
|
||
|
#include "DlgItemUtils.h" // for CDlgItemUtils
|
||
|
#endif
|
||
|
|
||
|
#ifndef __ATLBASESHEET_H_
|
||
|
#include "AtlBaseSheet.h" // for CBaseSheetWindow for BReadOnly()
|
||
|
#endif
|
||
|
|
||
|
#ifndef __ATLPOPUPHELP_H_
|
||
|
#include "AtlPopupHelp.h" // for COnlineHelp
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Type Definitions
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// class CBasePageWindow
|
||
|
//
|
||
|
// Description:
|
||
|
// Base property sheet page window for all kinds of property sheets.
|
||
|
//
|
||
|
// Inheritance:
|
||
|
// CBasePageWindow
|
||
|
// CPropertyPageWindow, CDlgItemUtils
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CBasePageWindow
|
||
|
: public CPropertyPageWindow
|
||
|
, public CDlgItemUtils
|
||
|
{
|
||
|
typedef CPropertyPageWindow baseClass;
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Construction
|
||
|
//
|
||
|
|
||
|
// Standard constructor
|
||
|
CBasePageWindow( HWND hWnd = NULL )
|
||
|
: baseClass( hWnd )
|
||
|
, m_bReadOnly( FALSE )
|
||
|
, m_psht( NULL )
|
||
|
, m_ppsp( NULL )
|
||
|
{
|
||
|
} //*** CBasePageWindow()
|
||
|
|
||
|
// Destructor
|
||
|
virtual ~CBasePageWindow( void )
|
||
|
{
|
||
|
//
|
||
|
// This must be virtual so that a pointer to an object
|
||
|
// of type CBasePropertyPageWindow can be held and then later
|
||
|
// deleted. That way the derived class's destructor will
|
||
|
// be called.
|
||
|
//
|
||
|
|
||
|
} //*** ~CBasePageWindow()
|
||
|
|
||
|
// Initialize the page
|
||
|
virtual BOOL BInit( IN CBaseSheetWindow * psht )
|
||
|
{
|
||
|
ATLASSERT( psht != NULL );
|
||
|
ATLASSERT( m_psht == NULL );
|
||
|
m_psht = psht;
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** BInit()
|
||
|
|
||
|
protected:
|
||
|
//
|
||
|
// CBasePageWindow helper methods.
|
||
|
//
|
||
|
|
||
|
// Attach a control to a dialog item.
|
||
|
void AttachControl( CWindow & rwndControl, UINT idc )
|
||
|
{
|
||
|
HWND hwndControl = GetDlgItem( idc );
|
||
|
ATLASSERT( hwndControl != NULL );
|
||
|
rwndControl.Attach( hwndControl );
|
||
|
|
||
|
} //*** AttachControl()
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// CBasePageWindow public methods to override.
|
||
|
//
|
||
|
|
||
|
// Update data on or from the page
|
||
|
virtual BOOL UpdateData( IN BOOL bSaveAndValidate )
|
||
|
{
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** UpdateData()
|
||
|
|
||
|
// Apply changes made on this page to the sheet
|
||
|
virtual BOOL BApplyChanges( void )
|
||
|
{
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** BApplyChanges()
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Message handler functions.
|
||
|
//
|
||
|
|
||
|
// Handler for WM_INITDIALOG
|
||
|
BOOL OnInitDialog( void )
|
||
|
{
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** OnInitDialog()
|
||
|
|
||
|
// Handler for PSN_SETACTIVE
|
||
|
BOOL OnSetActive( void )
|
||
|
{
|
||
|
return UpdateData( FALSE /*bSaveAndValidate*/ );
|
||
|
|
||
|
} //*** OnSetActive()
|
||
|
|
||
|
// Handler for PSN_APPLY
|
||
|
BOOL OnApply( void )
|
||
|
{
|
||
|
// Update the data in the class from the page.
|
||
|
if ( ! UpdateData( TRUE /*bSaveAndValidate*/ ) )
|
||
|
{
|
||
|
return FALSE;
|
||
|
} // if: error updating data
|
||
|
|
||
|
// Save the data in the sheet.
|
||
|
if ( ! BApplyChanges() )
|
||
|
{
|
||
|
return FALSE;
|
||
|
} // if: error applying changes
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** OnApply()
|
||
|
|
||
|
// Handler for PSN_WIZBACK
|
||
|
int OnWizardBack( void )
|
||
|
{
|
||
|
// 0 = goto next page
|
||
|
// -1 = prevent page change
|
||
|
// >0 = jump to page by dlg ID
|
||
|
return 0;
|
||
|
|
||
|
} //*** OnWizardBack()
|
||
|
|
||
|
// Handler for PSN_WIZNEXT
|
||
|
int OnWizardNext( void )
|
||
|
{
|
||
|
// 0 = goto next page
|
||
|
// -1 = prevent page change
|
||
|
// >0 = jump to page by dlg ID
|
||
|
return 0;
|
||
|
|
||
|
} //*** OnWizardNext()
|
||
|
|
||
|
// Handler for PSN_WIZFINISH
|
||
|
BOOL OnWizardFinish( void )
|
||
|
{
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** OnWizardFinish()
|
||
|
|
||
|
// Handler for PSN_RESET
|
||
|
void OnReset( void )
|
||
|
{
|
||
|
} //*** OnReset()
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
PROPSHEETPAGE * m_ppsp; // Pointer to property sheet header in impl class.
|
||
|
CBaseSheetWindow * m_psht; // Pointer to sheet this page belongs to.
|
||
|
BOOL m_bReadOnly; // Set if the page cannot be changed.
|
||
|
CString m_strTitle; // Used to support resource IDs for the title.
|
||
|
|
||
|
CBaseSheetWindow * Psht( void ) const { return m_psht; }
|
||
|
BOOL BReadOnly( void ) const { return m_bReadOnly || Psht()->BReadOnly(); }
|
||
|
const CString & StrTitle( void ) const { return m_strTitle; }
|
||
|
|
||
|
public:
|
||
|
// Return a pointer to the property page header
|
||
|
PROPSHEETPAGE * Ppsp( void ) const
|
||
|
{
|
||
|
ATLASSERT( m_ppsp != NULL );
|
||
|
return m_ppsp;
|
||
|
|
||
|
} //*** Ppsp()
|
||
|
|
||
|
}; //*** class CBasePageWindow
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// class CBasePageImpl
|
||
|
//
|
||
|
// Purpose:
|
||
|
// Base property sheet page implementation for all kinds of property
|
||
|
// sheets.
|
||
|
//
|
||
|
// Inheritance:
|
||
|
// CBasePageImpl< T, TBase >
|
||
|
// CPropertyPageImpl< T, TBase >, CPopupHelp< T >
|
||
|
// <TBase>
|
||
|
// ...
|
||
|
// CBasePageWindow
|
||
|
// CPropertyPageWindow
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
template < class T, class TBase = CBasePageWindow >
|
||
|
class CBasePageImpl
|
||
|
: public CPropertyPageImpl< T, TBase >
|
||
|
, public CPopupHelp< T >
|
||
|
{
|
||
|
typedef CBasePageImpl< T, TBase > thisClass;
|
||
|
typedef CPropertyPageImpl< T, TBase > baseClass;
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Construction
|
||
|
//
|
||
|
|
||
|
// Standard constructor
|
||
|
CBasePageImpl(
|
||
|
LPCTSTR lpszTitle = NULL
|
||
|
)
|
||
|
: baseClass( lpszTitle )
|
||
|
{
|
||
|
} //*** CBasePageImpl()
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Message map.
|
||
|
//
|
||
|
BEGIN_MSG_MAP( thisClass )
|
||
|
#if DBG
|
||
|
#ifdef _DBG_MSG
|
||
|
MESSAGE_RANGE_HANDLER( 0, 0xffffffff, OnMsg )
|
||
|
#endif // _DBG_MSG
|
||
|
#ifdef _DBG_MSG_NOTIFY
|
||
|
MESSAGE_HANDLER( WM_NOTIFY, OnNotify )
|
||
|
#endif // _DBG_MSG_NOTIFY
|
||
|
#ifdef _DBG_MSG_COMMAND
|
||
|
MESSAGE_HANDLER( WM_COMMAND, OnCommand )
|
||
|
#endif // _DBG_MSG_COMMAND
|
||
|
#endif // DBG
|
||
|
MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
|
||
|
CHAIN_MSG_MAP( CPopupHelp< T > )
|
||
|
CHAIN_MSG_MAP( baseClass )
|
||
|
END_MSG_MAP()
|
||
|
|
||
|
#if DBG && defined( _DBG_MSG )
|
||
|
// Handler for any message
|
||
|
LRESULT OnMsg( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled )
|
||
|
{
|
||
|
return DBG_OnMsg( uMsg, wParam, lParam, bHandled, T::s_pszClassName );
|
||
|
|
||
|
} //*** OnMsg()
|
||
|
#endif // DBG && defined( _DBG_MSG )
|
||
|
|
||
|
#if DBG && defined( _DBG_MSG_NOTIFY )
|
||
|
// Handler for the WM_NOTIFY message
|
||
|
LRESULT OnNotify( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled )
|
||
|
{
|
||
|
return DBG_OnNotify( uMsg, wParam, lParam, bHandled, T::s_pszClassName, T::s_rgmapCtrlNames );
|
||
|
|
||
|
} //*** OnNotify()
|
||
|
#endif // DBG && defined( _DBG_MSG_NOTIFY )
|
||
|
|
||
|
#if DBG && defined( _DBG_MSG_COMMAND )
|
||
|
// Handler for the WM_COMMAND message
|
||
|
LRESULT OnCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled )
|
||
|
{
|
||
|
return DBG_OnCommand( uMsg, wParam, lParam, bHandled, T::s_pszClassName, T::s_rgmapCtrlNames );
|
||
|
|
||
|
} //*** OnCommand()
|
||
|
#endif // DBG && defined( _DBG_MSG_COMMAND )
|
||
|
|
||
|
//
|
||
|
// Message handler functions.
|
||
|
//
|
||
|
|
||
|
// Handler for WM_INITDIALOG
|
||
|
LRESULT OnInitDialog(
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam,
|
||
|
BOOL & bHandled
|
||
|
)
|
||
|
{
|
||
|
T * pT = static_cast< T * >( this );
|
||
|
return pT->OnInitDialog();
|
||
|
|
||
|
} //*** OnInitDialog()
|
||
|
|
||
|
// Handler for WM_INITDIALOG
|
||
|
BOOL OnInitDialog( void )
|
||
|
{
|
||
|
return baseClass::OnInitDialog();
|
||
|
|
||
|
} //*** OnInitDialog()
|
||
|
|
||
|
//
|
||
|
// These notification handlers are needed because CPropertyPageImpl
|
||
|
// implements them itself, which prevents the call from making it
|
||
|
// to the window class.
|
||
|
//
|
||
|
|
||
|
// Handler for PSN_SETACTIVE
|
||
|
BOOL OnSetActive( void )
|
||
|
{
|
||
|
// Call the TBase method to avoid the CPropertySheetImpl empty method
|
||
|
return TBase::OnSetActive();
|
||
|
|
||
|
} //*** OnSetActive()
|
||
|
|
||
|
// Handler for PSN_APPLY
|
||
|
BOOL OnApply( void )
|
||
|
{
|
||
|
// Call the TBase method to avoid the CPropertySheetImpl empty method
|
||
|
return TBase::OnApply();
|
||
|
|
||
|
} //*** OnApply()
|
||
|
|
||
|
// Handler for PSN_WIZBACK
|
||
|
int OnWizardBack( void )
|
||
|
{
|
||
|
// Call the TBase method to avoid the CPropertySheetImpl empty method
|
||
|
return TBase::OnWizardBack();
|
||
|
|
||
|
} //*** OnWizardBack()
|
||
|
|
||
|
// Handler for PSN_WIZNEXT
|
||
|
int OnWizardNext( void )
|
||
|
{
|
||
|
// Call the TBase method to avoid the CPropertySheetImpl empty method
|
||
|
return TBase::OnWizardNext();
|
||
|
|
||
|
} //*** OnWizardNext()
|
||
|
|
||
|
// Handler for PSN_WIZFINISH
|
||
|
BOOL OnWizardFinish( void )
|
||
|
{
|
||
|
// Call the TBase method to avoid the CPropertySheetImpl empty method
|
||
|
return TBase::OnWizardFinish();
|
||
|
|
||
|
} //*** OnWizardFinish()
|
||
|
|
||
|
// Handler for PSN_RESET
|
||
|
void OnReset( void )
|
||
|
{
|
||
|
// Call the TBase method to avoid the CPropertySheetImpl empty method
|
||
|
TBase::OnReset();
|
||
|
|
||
|
} //*** OnReset()
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
|
||
|
public:
|
||
|
|
||
|
}; //*** class CBasePageImpl
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#endif // __ATLBASEPAGE_H_
|