477 lines
12 KiB
C
477 lines
12 KiB
C
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) 1996-1999 Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// AtlBaseWiz.h
|
||
|
//
|
||
|
// Implementation File:
|
||
|
// AtlBaseWiz.cpp
|
||
|
//
|
||
|
// Description:
|
||
|
// Definition of the CWizardWindow and CWizardImpl classes.
|
||
|
//
|
||
|
// Author:
|
||
|
// David Potter (davidp) December 2, 1997
|
||
|
//
|
||
|
// Revision History:
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef __ATLBASEWIZ_H_
|
||
|
#define __ATLBASEWIZ_H_
|
||
|
|
||
|
// Required because of class names longer than 16 characters in lists.
|
||
|
#pragma warning( disable : 4786 ) // identifier was truncated to '255' characters in the browser information
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Forward Class Declarations
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CWizardWindow;
|
||
|
template < class T, class TBase > class CWizardImpl;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// External Class Declarations
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CWizardPageWindow;
|
||
|
class CWizardPageList;
|
||
|
class CDynamicWizardPageList;
|
||
|
class CExtensionWizardPageList;
|
||
|
class CClusterObject;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Include Files
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef __ADMCOMMONRES_H_
|
||
|
#include "AdmCommonRes.h" // for ID_WIZNEXT, etc.
|
||
|
#endif
|
||
|
|
||
|
#ifndef __ATLBASESHEET_H_
|
||
|
#include "AtlBaseSheet.h" // for CBaseSheetWindow
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Type Definitions
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// class CWizardWindow
|
||
|
//
|
||
|
// Description:
|
||
|
// Base wizard property sheet window.
|
||
|
//
|
||
|
// Inheritance:
|
||
|
// CWizardWindow
|
||
|
// CBaseSheetWindow
|
||
|
// CPropertySheetWindow
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CWizardWindow : public CBaseSheetWindow
|
||
|
{
|
||
|
typedef CBaseSheetWindow baseClass;
|
||
|
|
||
|
friend class CWizardPageWindow;
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Construction
|
||
|
//
|
||
|
|
||
|
// Standard constructor
|
||
|
CWizardWindow( HWND hWnd = NULL )
|
||
|
: baseClass( hWnd )
|
||
|
, m_plwpPages( NULL )
|
||
|
, m_plewpNormal( NULL )
|
||
|
, m_plewpAlternate( NULL )
|
||
|
, m_pwizAlternate( NULL )
|
||
|
, m_pcoObjectToExtend( NULL )
|
||
|
, m_nLastWizardButton( 0 )
|
||
|
{
|
||
|
m_pwizCurrent = this;
|
||
|
|
||
|
} //*** CWizardWindow()
|
||
|
|
||
|
// Destructor
|
||
|
~CWizardWindow( void );
|
||
|
|
||
|
protected:
|
||
|
CWizardPageList * m_plwpPages; // List of pages in the wizard.
|
||
|
CExtensionWizardPageList * m_plewpNormal; // List of normal extension pages.
|
||
|
CExtensionWizardPageList * m_plewpAlternate; // List of alternate extension pages.
|
||
|
CWizardWindow * m_pwizAlternate; // Alternate extension wizard.
|
||
|
CWizardWindow * m_pwizCurrent; // Currently visible wizard.
|
||
|
CClusterObject * m_pcoObjectToExtend; // Cluster object to extend.
|
||
|
int m_nLastWizardButton; // Indicates the last wizard button pressed.
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Access methods.
|
||
|
//
|
||
|
|
||
|
// Access list of pages in the wizard
|
||
|
CWizardPageList * PlwpPages( void )
|
||
|
{
|
||
|
ATLASSERT( m_plwpPages != NULL );
|
||
|
return m_plwpPages;
|
||
|
|
||
|
} //*** PlwpPages()
|
||
|
|
||
|
// Access list of normal extension pages
|
||
|
CExtensionWizardPageList * PlewpNormal( void ) { return m_plewpNormal; }
|
||
|
|
||
|
// Access list of alternate extension pages
|
||
|
CExtensionWizardPageList * PlewpAlternate( void ) { return m_plewpAlternate; }
|
||
|
|
||
|
// Access alternate extension wizard
|
||
|
CWizardWindow * PwizAlternate( void ) { return m_pwizAlternate; }
|
||
|
|
||
|
// Access currently visible wizard
|
||
|
CWizardWindow * PwizCurrent( void ) { return m_pwizCurrent; }
|
||
|
|
||
|
// Set the current wizard
|
||
|
void SetCurrentWizard( CWizardWindow * pwizCurrent )
|
||
|
{
|
||
|
ATLASSERT( pwizCurrent != NULL );
|
||
|
ATLASSERT( ( pwizCurrent == this ) || ( pwizCurrent == m_pwizAlternate ) );
|
||
|
m_pwizCurrent = pwizCurrent;
|
||
|
|
||
|
} //*** SetCurrentWizard()
|
||
|
|
||
|
// Set the alternate extension wizard
|
||
|
void SetAlternateWizard( IN CWizardWindow * pwiz )
|
||
|
{
|
||
|
ATLASSERT( pwiz != NULL );
|
||
|
m_pwizAlternate = pwiz;
|
||
|
|
||
|
} //*** SetAlternateWizard()
|
||
|
|
||
|
// Delete the alternate extension wizard
|
||
|
void DeleteAlternateWizard( void )
|
||
|
{
|
||
|
ATLASSERT( m_pwizAlternate != NULL );
|
||
|
ATLASSERT( m_pwizCurrent != m_pwizAlternate );
|
||
|
delete m_pwizAlternate;
|
||
|
m_pwizAlternate = NULL;
|
||
|
|
||
|
} //*** ClearAlternateWizard()
|
||
|
|
||
|
// Access the cluster object to extend
|
||
|
CClusterObject * PcoObjectToExtend( void ) { return m_pcoObjectToExtend; }
|
||
|
|
||
|
// Set the object to extend
|
||
|
void SetObjectToExtend( IN CClusterObject * pco )
|
||
|
{
|
||
|
ATLASSERT( pco != NULL );
|
||
|
m_pcoObjectToExtend = pco;
|
||
|
|
||
|
} //*** SetObjectToExtend()
|
||
|
|
||
|
// Returns the last wizard button pressed
|
||
|
int NLastWizardButton( void ) const { return m_nLastWizardButton; }
|
||
|
|
||
|
// Set the last wizard button pressed
|
||
|
void SetLastWizardButton( IN int idCtrl )
|
||
|
{
|
||
|
ATLASSERT( (idCtrl == ID_WIZBACK) || (idCtrl == ID_WIZNEXT) || (idCtrl == IDCANCEL) );
|
||
|
m_nLastWizardButton = idCtrl;
|
||
|
|
||
|
} //*** SetLastWizardButton()
|
||
|
|
||
|
// Returns whether the Back button was pressed
|
||
|
BOOL BBackPressed( void ) const { return (m_nLastWizardButton == ID_WIZBACK); }
|
||
|
|
||
|
// Returns whether the Next button was pressed
|
||
|
BOOL BNextPressed( void ) const { return (m_nLastWizardButton == ID_WIZNEXT); }
|
||
|
|
||
|
// Returns whether the Cancel button was pressed
|
||
|
BOOL BCancelPressed( void ) const { return (m_nLastWizardButton == IDCANCEL); }
|
||
|
|
||
|
// Returns whether the wizard is Wizard97 compliant or not
|
||
|
BOOL BWizard97( void ) const { return (Ppsh()->dwFlags & PSH_WIZARD97) == PSH_WIZARD97; }
|
||
|
|
||
|
public:
|
||
|
// Add a page (required to get to base class method)
|
||
|
void AddPage( HPROPSHEETPAGE hPage )
|
||
|
{
|
||
|
CBaseSheetWindow::AddPage( hPage );
|
||
|
|
||
|
} //*** AddPage( hPage )
|
||
|
|
||
|
// Add a page (required to get to base class method)
|
||
|
BOOL AddPage( LPCPROPSHEETPAGE pPage )
|
||
|
{
|
||
|
return CBaseSheetWindow::AddPage( pPage );
|
||
|
|
||
|
} //*** AddPage( pPage )
|
||
|
|
||
|
// Add a page to wizard
|
||
|
BOOL BAddPage( IN CWizardPageWindow * pwp );
|
||
|
|
||
|
// Set the next page to be displayed
|
||
|
void SetNextPage( IN CWizardPageWindow * pwCurrentPage, IN LPCTSTR pszNextPage );
|
||
|
|
||
|
// Set the next page to be displayed from a dialog ID
|
||
|
void SetNextPage( IN CWizardPageWindow * pwCurrentPage, IN UINT idNextPage )
|
||
|
{
|
||
|
SetNextPage( pwCurrentPage, MAKEINTRESOURCE( idNextPage ) );
|
||
|
|
||
|
} //*** SetNextPage( idNextPage )
|
||
|
|
||
|
// Handler for BN_CLICKED for ID_WIZFINISH
|
||
|
LRESULT OnWizFinish(
|
||
|
WORD wNotifyCode,
|
||
|
WORD idCtrl,
|
||
|
HWND hwndCtrl,
|
||
|
BOOL & bHandled
|
||
|
)
|
||
|
{
|
||
|
EnumChildWindows( m_hWnd, &ECWCallback, (LPARAM) this );
|
||
|
|
||
|
if ( m_pwizAlternate != NULL )
|
||
|
{
|
||
|
return m_pwizAlternate->OnWizFinish( wNotifyCode, idCtrl, hwndCtrl, bHandled );
|
||
|
} // if: alternate wizard exists
|
||
|
|
||
|
bHandled = FALSE;
|
||
|
return FALSE;
|
||
|
|
||
|
} //*** OnWizFinish()
|
||
|
|
||
|
static BOOL CALLBACK ECWCallback( HWND hWnd, LPARAM lParam )
|
||
|
{
|
||
|
CWizardWindow *pww = (CWizardWindow *) lParam;
|
||
|
NMHDR nmhdr;
|
||
|
|
||
|
// If we enumerated ourself, skip
|
||
|
if ( pww->m_hWnd == hWnd )
|
||
|
{
|
||
|
return TRUE;
|
||
|
} // if: enumerating ourself
|
||
|
|
||
|
nmhdr.hwndFrom = pww->m_hWnd;
|
||
|
nmhdr.idFrom = 0;
|
||
|
nmhdr.code = PSN_WIZFINISH;
|
||
|
|
||
|
SendMessage( hWnd, WM_NOTIFY, 0, (LPARAM) &nmhdr );
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
} //*** ECWCallback()
|
||
|
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// CWizardWindow methods.
|
||
|
//
|
||
|
|
||
|
// Enable or disable the Next button
|
||
|
void EnableNext( IN BOOL bEnable, IN DWORD fDefaultWizardButtons )
|
||
|
{
|
||
|
ATLASSERT( fDefaultWizardButtons != 0 );
|
||
|
|
||
|
//
|
||
|
// If there is an alternate wizard, send this message to it.
|
||
|
//
|
||
|
if ( PwizCurrent() == PwizAlternate() )
|
||
|
{
|
||
|
PwizAlternate()->EnableNext( bEnable, fDefaultWizardButtons );
|
||
|
} // if: there is an alternate wizard
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Get the buttons for the wizard.
|
||
|
//
|
||
|
DWORD fWizardButtons = fDefaultWizardButtons;
|
||
|
|
||
|
//
|
||
|
// If the Next button is to be disabled, make sure we show a
|
||
|
// disabled Finish button if the Finish button is supposed to be
|
||
|
// displayed. Otherwise a disabled Next button will be displayed.
|
||
|
//
|
||
|
if ( ! bEnable )
|
||
|
{
|
||
|
fWizardButtons &= ~(PSWIZB_NEXT | PSWIZB_FINISH);
|
||
|
if ( fDefaultWizardButtons & PSWIZB_FINISH )
|
||
|
{
|
||
|
fWizardButtons |= PSWIZB_DISABLEDFINISH;
|
||
|
} // if: finish button displayed
|
||
|
} // if: disabling the button
|
||
|
|
||
|
//
|
||
|
// Set the new button states.
|
||
|
//
|
||
|
SetWizardButtons( fWizardButtons );
|
||
|
|
||
|
} // else: no alternate wizard
|
||
|
|
||
|
} //*** EnableNext()
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Overrides of abstract methods.
|
||
|
//
|
||
|
|
||
|
// Add extension pages to the sheet
|
||
|
virtual void AddExtensionPages( IN HFONT hfont, IN HICON hicon );
|
||
|
|
||
|
// Add a page (called by extension)
|
||
|
virtual HRESULT HrAddExtensionPage( IN CBasePageWindow * ppage );
|
||
|
|
||
|
// Handle a reset from one of the pages
|
||
|
virtual void OnReset( void )
|
||
|
{
|
||
|
} //*** OnReset()
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Message handler functions.
|
||
|
//
|
||
|
|
||
|
// Handler for PSCB_INITIALIZED
|
||
|
void OnSheetInitialized( void );
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
// Prepare to add exension pages to the wizard
|
||
|
void PrepareToAddExtensionPages( IN OUT CDynamicWizardPageList & rldwp );
|
||
|
|
||
|
// Complete the process of adding extension pages
|
||
|
void CompleteAddingExtensionPages( IN OUT CDynamicWizardPageList & rldwp );
|
||
|
|
||
|
// Remove all extension pages from the wizard
|
||
|
void RemoveAllExtensionPages( void );
|
||
|
|
||
|
}; //*** class CWizardWindow
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// class CWizardImpl
|
||
|
//
|
||
|
// Description:
|
||
|
// Base wizard property sheet implementation.
|
||
|
//
|
||
|
// Inheritance:
|
||
|
// CWizardImpl< T, TBase >
|
||
|
// CBaseSheetImpl< T, TBase >
|
||
|
// CPropertySheetImpl< T, TBase >
|
||
|
// <TBase>
|
||
|
// ...
|
||
|
// CWizardWindow
|
||
|
// CBaseSheetWindow
|
||
|
// CPropertySheetWindow
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
template < class T, class TBase = CWizardWindow >
|
||
|
class CWizardImpl : public CBaseSheetImpl< T, TBase >
|
||
|
{
|
||
|
typedef CWizardImpl< T, TBase > thisClass;
|
||
|
typedef CBaseSheetImpl< T, TBase > baseClass;
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Construction
|
||
|
//
|
||
|
|
||
|
// Standard constructor
|
||
|
CWizardImpl(
|
||
|
IN LPCTSTR lpszTitle = NULL,
|
||
|
IN UINT uStartPage = 0
|
||
|
)
|
||
|
: CBaseSheetImpl< T, TBase >( lpszTitle, uStartPage )
|
||
|
{
|
||
|
// Make this sheet a wizard.
|
||
|
SetWizardMode();
|
||
|
|
||
|
// Set the pointer in the base window class to our prop sheet header.
|
||
|
m_ppsh = &m_psh;
|
||
|
|
||
|
} //*** CWizardImpl( lpszTitle )
|
||
|
|
||
|
// Constructor taking a resource ID for the title
|
||
|
CWizardImpl(
|
||
|
IN UINT nIDTitle,
|
||
|
IN UINT uStartPage = 0
|
||
|
)
|
||
|
: CBaseSheetImpl< T, TBase >( NULL, uStartPage )
|
||
|
{
|
||
|
m_strTitle.LoadString( nIDTitle );
|
||
|
m_psh.pszCaption = m_strTitle;
|
||
|
|
||
|
// Make this sheet a wizard.
|
||
|
SetWizardMode();
|
||
|
|
||
|
// Set the pointer in the base window class to our prop sheet header.
|
||
|
m_ppsh = &m_psh;
|
||
|
|
||
|
} //*** CWizardImpl( nIDTitle )
|
||
|
|
||
|
public:
|
||
|
//
|
||
|
// Message map.
|
||
|
//
|
||
|
BEGIN_MSG_MAP( thisClass )
|
||
|
COMMAND_HANDLER( ID_WIZBACK, BN_CLICKED, OnButtonPressed )
|
||
|
COMMAND_HANDLER( ID_WIZNEXT, BN_CLICKED, OnButtonPressed )
|
||
|
COMMAND_HANDLER( ID_WIZFINISH, BN_CLICKED, OnWizFinish )
|
||
|
COMMAND_HANDLER( IDCANCEL, BN_CLICKED, OnButtonPressed )
|
||
|
CHAIN_MSG_MAP( baseClass )
|
||
|
END_MSG_MAP()
|
||
|
|
||
|
//
|
||
|
// Message handler functions.
|
||
|
//
|
||
|
|
||
|
// Handler for BN_CLICKED on wizard buttons
|
||
|
LRESULT OnButtonPressed(
|
||
|
WORD wNotifyCode,
|
||
|
WORD idCtrl,
|
||
|
HWND hwndCtrl,
|
||
|
BOOL & bHandled
|
||
|
)
|
||
|
{
|
||
|
m_nLastWizardButton = idCtrl;
|
||
|
bHandled = FALSE;
|
||
|
return 0;
|
||
|
|
||
|
} //*** OnButtonPressed()
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
CString m_strTitle; // Used to support resource IDs for the title.
|
||
|
|
||
|
public:
|
||
|
const CString & StrTitle( void ) const { return m_strTitle; }
|
||
|
|
||
|
// Set the title of the sheet
|
||
|
void SetTitle( LPCTSTR lpszText, UINT nStyle = 0 )
|
||
|
{
|
||
|
baseClass::SetTitle( lpszText, nStyle );
|
||
|
m_strTitle = lpszText;
|
||
|
|
||
|
} //*** SetTitle()
|
||
|
|
||
|
}; //*** class CWizardImpl
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Global Function Prototypes
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// Create a dialog template for use with a dummy page
|
||
|
DLGTEMPLATE * PdtCreateDummyPageDialogTemplate( IN WORD cx, IN WORD cy );
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#endif // __ATLBASEWIZ_H_
|