|
|
/////////////////////////////////////////////////////////////////////////////
//
// 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_
|