|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1999 Microsoft Corporation
//
// Module Name:
// AtlBaseWizPage.h
//
// Implementation File:
// AtlBaseWizPage.cpp
//
// Description:
// Definition of the CWizardPageWindow and CWizardPageImpl classes.
//
// Author:
// David Potter (davidp) December 2, 1997
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __ATLBASEWIZPAGE_H_
#define __ATLBASEWIZPAGE_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 CStaticWizardPageList; class CDynamicWizardPageList; class CExtensionWizardPageList; class CExtensionWizard97PageList; class CWizardPageList; class CWizardPageWindow; class CStaticWizardPageWindow; class CDynamicWizardPageWindow; class CExtensionWizardPageWindow; class CExtensionWizard97PageWindow; template < class T, class TWin > class CWizardPageImpl; template < class T > class CStaticWizardPageImpl; template < class T > class CDynamicWizardPageImpl; template < class T > class CExtensionWizardPageImpl; template < class T > class CExtensionWizard97PageImpl;
/////////////////////////////////////////////////////////////////////////////
// External Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CWizardWindow; class CCluAdmExDll;
/////////////////////////////////////////////////////////////////////////////
// Include Files
/////////////////////////////////////////////////////////////////////////////
#ifndef __ATLBASEPAGE_H_
#include "AtlBasePage.h" // for CBasePageWindow, CBasePageImpl
#endif
#ifndef __ATLDBGWIN_H_
#include "AtlDbgWin.h" // for debugging definitions
#endif
#ifndef __ATLBASEWIZ_H_
#include "AtlBaseWiz.h" // for CWizardWindow (Pwiz() usage)
#endif
/////////////////////////////////////////////////////////////////////////////
// Type Definitions
/////////////////////////////////////////////////////////////////////////////
class CStaticWizardPageList : public std::list< CStaticWizardPageWindow * > { }; //*** class CStaticWizardPageList
class CDynamicWizardPageList : public std::list< CDynamicWizardPageWindow * > { }; //*** class CDynamicWizardPageList
class CExtensionWizardPageList : public std::list< CExtensionWizardPageWindow * > { }; //*** class CExtensionWizardPageList
class CExtensionWizard97PageList : public std::list< CExtensionWizard97PageWindow * > { }; //*** class CExtensionWizard97PageList
#define WIZARDPAGE_HEADERTITLEID( ids ) \
static UINT GetWizardPageHeaderTitleId(void) \ { \ return ids; \ }
#define WIZARDPAGE_HEADERSUBTITLEID( ids ) \
static UINT GetWizardPageHeaderSubTitleId(void) \ { \ return ids; \ }
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CWizardPageList
//
// Description:
// List of wizard pages.
//
// Inheritance:
// CWizardPageList
// std::list< CWizardPageWindow * >
//
//--
/////////////////////////////////////////////////////////////////////////////
class CWizardPageList : public std::list< CWizardPageWindow * > { typedef std::list< CWizardPageWindow * > baseClass;
public: // Find page by resource ID
CWizardPageWindow * PwpageFromID( IN LPCTSTR psz );
// Find next page by resource ID
CWizardPageWindow * PwpageNextFromID( IN LPCTSTR psz );
}; //*** class CWizardPageList
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CWizardPageWindow
//
// Description:
// Base wizard property sheet page window.
//
// Inheritance:
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
class CWizardPageWindow : public CBasePageWindow { typedef CBasePageWindow baseClass;
friend CWizardWindow; friend CCluAdmExDll;
public: //
// Construction
//
// Standard constructor
CWizardPageWindow( HWND hWnd = NULL ) : baseClass( hWnd ) , m_fWizardButtons( 0 ) , m_bBackPressed( FALSE ) , m_bIsPageEnabled( FALSE ) , m_bIsNextPageSet( FALSE ) { } //*** CWizardPageWindow()
// Destructor
virtual ~CWizardPageWindow( void ) { } //*** ~CWizardPageWindow()
public: //
// CWizardPageWindow public methods.
//
// Enable or disable the Next button
void EnableNext( IN BOOL bEnable = TRUE ) { ATLASSERT( Pwiz() != NULL );
//
// Ask the wizard to enable or disable the Next button.
//
Pwiz()->EnableNext( bEnable, FWizardButtons() );
} //*** EnableNext()
// Set the next page to be enabled
void SetNextPage( IN LPCTSTR pszNextPage ) { Pwiz()->SetNextPage( this, pszNextPage ); m_bIsNextPageSet = TRUE;
} //*** SetNextPage()
// Set the next page to be enabled from a dialog ID
void SetNextPage( IN UINT idNextPage ) { Pwiz()->SetNextPage( this, idNextPage ); m_bIsNextPageSet = TRUE;
} //*** SetNextPage()
public: //
// Message handler functions.
//
// Handler for PSN_SETACTIVE
BOOL OnSetActive( void ) { if ( ! m_bIsPageEnabled ) { return FALSE; } // if: page is not enabled to be displayed
SetWizardButtons(); m_bBackPressed = FALSE;
return baseClass::OnSetActive();
} //*** OnSetActive()
// Handler for PSN_WIZBACK
int OnWizardBack( void ) { m_bBackPressed = TRUE; int nResult = baseClass::OnWizardBack(); if ( ! UpdateData( TRUE /*bSaveAndValidate*/ ) ) { nResult = -1; } // if: error updating data
if ( nResult == -1 ) // if not successful
{ m_bBackPressed = FALSE; } // if: failure occurred
else if ( nResult == 0 ) // defaulting to go to next page
{ } // else if: no next page specified
return nResult;
} //*** OnWizardBack()
// Handler for PSN_WIZNEXT
int OnWizardNext( void ) { // Update the data in the class from the page.
if ( ! UpdateData( TRUE /*bSaveAndValidate*/ ) ) { return -1; } // if: error updating data
// Save the data in the sheet.
if ( ! BApplyChanges() ) { return -1; } // if: error applying changes
int nResult = baseClass::OnWizardNext();
return nResult;
} //*** OnWizardNext()
// Handler for PSN_WIZFINISH
BOOL OnWizardFinish( void ) { if ( BIsPageEnabled() ) { // 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
} // if: page is enabled
return baseClass::OnWizardFinish();
} //*** OnWizardFinish()
// Handler for PSN_RESET
void OnReset( void ) { Pwiz()->OnReset(); baseClass::OnReset();
} //*** OnReset()
// Implementation
protected: DWORD m_fWizardButtons; BOOL m_bBackPressed; BOOL m_bIsPageEnabled; BOOL m_bIsNextPageSet; CString m_strHeaderTitle; CString m_strHeaderSubTitle;
DWORD FWizardButtons( void ) const { return m_fWizardButtons; } BOOL BBackPressed( void ) const { return m_bBackPressed; } BOOL BIsPageEnabled( void ) const { return m_bIsPageEnabled; } BOOL BIsNextPageSet( void ) const { return m_bIsNextPageSet; } const CString & StrHeaderTitle( void ) const { return m_strHeaderTitle; } const CString & StrHeaderSubTitle( void ) const { return m_strHeaderSubTitle; }
CWizardWindow * Pwiz( void ) const { return (CWizardWindow *) Psht(); }
// Set default wizard buttons to be displayed with page
void SetDefaultWizardButtons( IN DWORD fWizardButtons ) { ATLASSERT( fWizardButtons != 0 ); m_fWizardButtons = fWizardButtons;
} //*** SetDefaultWizardButtons()
public: // Set wizard buttons on the wizard
void SetWizardButtons( void ) { ATLASSERT( m_fWizardButtons != 0 ); Pwiz()->SetWizardButtons( m_fWizardButtons );
} //*** SetWizardButtons()
// Enable or disable the page
void EnablePage( IN BOOL bEnable = TRUE ) { m_bIsPageEnabled = bEnable;
} //*** EnablePage()
}; //*** class CWizardPageWindow
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CStaticWizardPageWindow
//
// Description:
// Base wizard property sheet page window for pages added to a wizard
// property sheet before the call to PropertySheet(). This page cannot
// be removed from the sheet.
//
// Inheritance:
// CStaticWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
class CStaticWizardPageWindow : public CWizardPageWindow { typedef CWizardPageWindow baseClass;
public: //
// Construction
//
// Standard constructor
CStaticWizardPageWindow( HWND hWnd = NULL ) : baseClass( hWnd ) { } //*** CStaticWizardPageWindow()
}; //*** class CStaticWizardPageWindow
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CDynamicWizardPageWindow
//
// Description:
// Base wizard property sheet page window for pages added to a wizard
// property sheet after the call to PropertySheet(). This page may be
// removed from the sheet.
//
// Inheritance:
// CDynamicWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
class CDynamicWizardPageWindow : public CWizardPageWindow { typedef CWizardPageWindow baseClass;
public: //
// Construction
//
// Standard constructor
CDynamicWizardPageWindow( HWND hWnd = NULL ) : baseClass( hWnd ) , m_hpage( NULL ) , m_bPageAddedToSheet( FALSE ) { } //*** CDynamicWizardPageWindow()
// Destructor
~CDynamicWizardPageWindow( void ) { //
// Destroy the page if it hasn't been added to the sheet yet.
// If it has been added to the sheet, the sheet will destroy it.
//
if ( (m_hpage != NULL) && ! m_bPageAddedToSheet ) { DestroyPropertySheetPage( m_hpage ); m_hpage = NULL; } // if: page not deleted yet and not added to the sheet
} //*** ~CDynamicWizardPageWindow()
// Create the page
virtual DWORD ScCreatePage( void ) = 0;
protected: HPROPSHEETPAGE m_hpage; BOOL m_bPageAddedToSheet;
public: // Property page handle
HPROPSHEETPAGE Hpage( void ) const { return m_hpage; }
// Returns whether page has been added to the sheet or not
BOOL BPageAddedToSheet( void ) const { return m_bPageAddedToSheet; }
// Set whether the page has been added to the sheet or not
void SetPageAdded( IN BOOL bAdded = TRUE ) { m_bPageAddedToSheet = bAdded; if ( ! bAdded ) { m_hpage = NULL; } // if: removing page
} //*** SetPageAdded()
}; //*** class CDynamicWizardPageWindow
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CExtensionWizardPageWindow
//
// Description:
// Base wizard property sheet page window for pages added to a wizard
// property sheet after the call to PropertySheet() identified as a
// non-Wizard97 extension to the list of standard pages. This page may
// be removed from the sheet.
//
// Inheritance:
// CExtensionWizardPageWindow
// CDynamicWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
class CExtensionWizardPageWindow : public CDynamicWizardPageWindow { typedef CDynamicWizardPageWindow baseClass;
public: //
// Construction
//
// Standard constructor
CExtensionWizardPageWindow( HWND hWnd = NULL ) : baseClass( hWnd ) { } //*** CExtensionWizardPageWindow()
}; //*** class CExtensionWizardPageWindow
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CExtensionWizard97PageWindow
//
// Description:
// Base wizard property sheet page window for pages added to a wizard
// property sheet after the call to PropertySheet() identified as a
// Wizard97 extension to the list of standard pages. This page may be
// removed from the sheet.
//
// Inheritance:
// CExtensionWizard97PageWindow
// CExtensionWizardPageWindow
// CDynamicWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
class CExtensionWizard97PageWindow : public CExtensionWizardPageWindow { typedef CExtensionWizardPageWindow baseClass;
public: //
// Construction
//
// Standard constructor
CExtensionWizard97PageWindow( HWND hWnd = NULL ) : baseClass( hWnd ) { } //*** CExtensionWizard97PageWindow()
}; //*** class CExtensionWizard97PageWindow
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CWizardPageImpl
//
// Description:
// Base wizard property sheet page implementation.
//
// Inheritance:
// CWizardPageImpl< T, TWin >
// CBasePageImpl< T, TWin >
// CPropertyPageImpl< T, TWin >
// <TWin>
// ...
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T, class TWin = CWizardPageWindow > class CWizardPageImpl : public CBasePageImpl< T, TWin > { typedef CWizardPageImpl< T, TWin > thisClass; typedef CBasePageImpl< T, TWin > baseClass;
public: //
// Construction
//
// Standard constructor
CWizardPageImpl( IN OUT LPCTSTR lpszTitle = NULL ) : baseClass( lpszTitle ) { // Set the pointer in the base window class to our prop page header.
m_ppsp = &m_psp;
} //*** CWizardPageImpl( lpszTitle )
// Constructor taking a resource ID for the title
CWizardPageImpl( IN UINT nIDTitle ) : baseClass( nIDTitle ) { // Set the pointer in the base window class to our prop page header.
m_ppsp = &m_psp;
} //*** CWizardPageImpl( nIDTitle )
// Initialize the page
virtual BOOL BInit( IN CBaseSheetWindow * psht ) { if ( ! baseClass::BInit( psht ) ) { return FALSE; } // if: base class failed
if ( (Pwiz()->Ppsh()->dwFlags & PSH_WIZARD97) && (Pwiz()->Ppsh()->dwFlags & PSH_HEADER) ) { //
// Get the header title.
//
UINT idsTitle = T::GetWizardPageHeaderTitleId(); if ( idsTitle != 0 ) { m_strHeaderTitle.LoadString( idsTitle ); m_psp.pszHeaderTitle = m_strHeaderTitle; m_psp.dwFlags |= PSP_USEHEADERTITLE; m_psp.dwFlags &= ~PSP_HIDEHEADER;
//
// Get the header subtitle.
//
UINT idsSubTitle = T::GetWizardPageHeaderSubTitleId(); if ( idsSubTitle != 0 ) { m_strHeaderSubTitle.LoadString( idsSubTitle ); m_psp.pszHeaderSubTitle = m_strHeaderSubTitle; m_psp.dwFlags |= PSP_USEHEADERSUBTITLE; } // if: subtitle specified
} // if: title specified
else { m_psp.dwFlags |= PSP_HIDEHEADER; } // else: no title specified
} // if: Wizard97 with a header
return TRUE;
} //*** BInit()
public: //
// CWizardPageImpl public methods.
//
// Get the next page we're going to
CWizardPageWindow * PwizpgNext( IN LPCTSTR psz = NULL ) { ATLASSERT( psz != (LPCTSTR) -1 ); CWizardPageWindow * ppage = NULL; if ( psz == NULL ) { //
// There will not be a resource ID for extension pages, so check
// for that before calling PwpageNextFromID. This allows us to
// leave the assert in there for a non-NULL resource.
//
if ( T::IDD != 0 ) { ppage = Pwiz()->PlwpPages()->PwpageNextFromID( MAKEINTRESOURCE( T::IDD ) ); } // if: there is a resource ID for this page
} // if: no next page specified
else { ppage = Pwiz()->PlwpPages()->PwpageFromID( psz ); } // else: next page specified
return ppage;
} //*** PwizpgNext()
// Enable or disable the next page
void EnableNextPage( IN BOOL bEnable = TRUE ) { CWizardPageWindow * pwp = PwizpgNext(); if ( pwp != NULL ) { pwp->EnablePage( bEnable ); } // if: next page found
} //*** EnableNextPage()
public: //
// Message handler functions.
//
//
// Message handler override functions.
//
// Handler for PSN_WIZBACK
int OnWizardBack( void ) { //
// Make sure back button is marked as last button pressed.
//
Pwiz()->SetLastWizardButton( ID_WIZBACK );
return baseClass::OnWizardBack();
} //*** OnWizardBack()
// Handler for PSN_WIZNEXT
int OnWizardNext( void ) { //
// Make sure next button is marked as last button pressed.
//
Pwiz()->SetLastWizardButton( ID_WIZNEXT );
int nResult = baseClass::OnWizardNext(); if ( nResult != -1 ) { if ( ! BIsNextPageSet() ) { EnableNextPage(); } // if: next page not set yet
m_bIsNextPageSet = FALSE; } // if: changing pages
return nResult;
} //*** OnWizardNext()
// Implementation
protected:
public:
}; //*** class CWizardPageImpl
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CStaticWizardPageImpl
//
// Description:
// Base wizard property sheet page implementation for pages added to a
// wizard property sheet before the call to PropertySheet(). This page
// cannot be removed from the sheet.
//
// Inheritance:
// CStaticWizardPageImpl< T >
// CWizardPageImpl< T, CStaticWizardPageWindow >
// CBasePageImpl< T, CStaticWizardPageWindow >
// CPropertyPageImpl< T, CStaticWizardPageWindow >
// CStaticWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T > class CStaticWizardPageImpl : public CWizardPageImpl< T, CStaticWizardPageWindow > { typedef CStaticWizardPageImpl< T > thisClass; typedef CWizardPageImpl< T, CStaticWizardPageWindow > baseClass;
public: //
// Construction.
//
// Standard constructor
CStaticWizardPageImpl( IN OUT LPCTSTR lpszTitle = NULL ) : baseClass( lpszTitle ) { } //*** CStaticWizardPageImpl( lpszTitle )
// Constructor taking a resource ID for the title
CStaticWizardPageImpl( IN UINT nIDTitle ) : baseClass( nIDTitle ) { } //*** CStaticWizardPageImpl( nIDTitle )
}; //*** class CStaticWizardPageImpl
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CDynamicWizardPageImpl
//
// Description:
// Base wizard property sheet page implementation for pages added to a
// wizard property sheet after the call to PropertySheet(). This page
// may be removed from the sheet.
//
// Inheritance:
// CDynamicWizardPageImpl< T >
// CWizardPageImpl< T, CDynamicWizardPageWindow >
// CBasePageImpl< T, CDynamicWizardPageWindow >
// CPropertyPageImpl< T, CDynamicWizardPageWindow >
// CDynamicWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T > class CDynamicWizardPageImpl : public CWizardPageImpl< T, CDynamicWizardPageWindow > { typedef CDynamicWizardPageImpl< T > thisClass; typedef CWizardPageImpl< T, CDynamicWizardPageWindow > baseClass;
public: //
// Construction.
//
// Standard constructor
CDynamicWizardPageImpl( IN OUT LPCTSTR lpszTitle = NULL ) : baseClass( lpszTitle ) { } //*** CDynamicWizardPageImpl( lpszTitle )
// Constructor taking a resource ID for the title
CDynamicWizardPageImpl( IN UINT nIDTitle ) : baseClass( nIDTitle ) { } //*** CDynamicWizardPageImpl( nIDTitle )
// Create the page
DWORD ScCreatePage( void ) { ATLASSERT( m_hpage == NULL );
m_hpage = CreatePropertySheetPage( &m_psp ); if ( m_hpage == NULL ) { return GetLastError(); } // if: error creating the page
return ERROR_SUCCESS;
} //*** ScCreatePage()
}; //*** class CDynamicWizardPageImpl
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CExtensionWizardPageImpl
//
// Description:
// Base wizard property sheet page implementation for pages added to a
// wizard property sheet after the call to PropertySheet() identified
// as a non-Wizard97 extension to the list of standard pages. This
// page may be removed from the sheet.
//
// Inheritance:
// CExtensionWizardPageImpl< T >
// CWizardPageImpl< T, CExtensionWizardPageWindow >
// CBasePageImpl< T, CExtensionWizardPageWindow >
// CPropertyPageImpl< T, CExtensionWizardPageWindow >
// CExtensionWizardPageWindow
// CDynamicWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T > class CExtensionWizardPageImpl : public CWizardPageImpl< T, CExtensionWizardPageWindow > { typedef CExtensionWizardPageImpl< T > thisClass; typedef CWizardPageImpl< T, CExtensionWizardPageWindow > baseClass;
public: //
// Construction.
//
// Standard constructor
CExtensionWizardPageImpl( IN OUT LPCTSTR lpszTitle = NULL ) : baseClass( lpszTitle ) { } //*** CExtensionWizardPageImpl( lpszTitle )
// Constructor taking a resource ID for the title
CExtensionWizardPageImpl( IN UINT nIDTitle ) : baseClass( nIDTitle ) { } //*** CExtensionWizardPageImpl( nIDTitle )
}; //*** class CExtensionWizardPageImpl
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CExtensionWizard97PageImpl
//
// Description:
// Base wizard property sheet page implementation for pages added to a
// wizard property sheet after the call to PropertySheet() identified
// as a Wizard97 extension to the list of standard pages. This page
// may be removed from the sheet.
//
// Inheritance:
// CExtensionWizard97PageImpl< T >
// CWizardPageImpl< T, CExtensionWizard97PageWindow >
// CBasePageImpl< T, CExtensionWizard97PageWindow >
// CPropertyPageImpl< T, CExtensionWizard97PageWindow >
// CExtensionWizard97PageWindow
// CExtensionWizardPageWindow
// CDynamicWizardPageWindow
// CWizardPageWindow
// CBasePageWindow
// CPropertyPageWindow
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T > class CExtensionWizard97PageImpl : public CWizardPageImpl< T, CExtensionWizard97PageWindow > { typedef CExtensionWizard97PageImpl< T > thisClass; typedef CWizardPageImpl< T, CExtensionWizard97PageWindow > baseClass;
public: //
// Construction.
//
// Standard constructor
CExtensionWizard97PageImpl( IN OUT LPCTSTR lpszTitle = NULL ) : baseClass( lpszTitle ) { } //*** CExtensionWizard97PageImpl( lpszTitle )
// Constructor taking a resource ID for the title
CExtensionWizard97PageImpl( IN UINT nIDTitle ) : baseClass( nIDTitle ) { } //*** CExtensionWizard97PageImpl( nIDTitle )
}; //*** class CExtensionWizard97PageImpl
/////////////////////////////////////////////////////////////////////////////
#endif // __ATLBASEWIZPAGE_H_
|