517 lines
12 KiB
C++
517 lines
12 KiB
C++
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) 1996-2000 Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// BaseWiz.cpp
|
||
|
//
|
||
|
// Description:
|
||
|
// Implementation of the CBaseWizard class.
|
||
|
//
|
||
|
// Maintained By:
|
||
|
// David Potter (davidp) July 23, 1996
|
||
|
//
|
||
|
// Revision History:
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "BaseWiz.h"
|
||
|
#include "BaseWPag.h"
|
||
|
#include "ClusItem.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CBaseWizard
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
IMPLEMENT_DYNAMIC( CBaseWizard, CBaseSheet )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Message Maps
|
||
|
|
||
|
BEGIN_MESSAGE_MAP( CBaseWizard, CBaseSheet )
|
||
|
//{{AFX_MSG_MAP(CBaseWizard)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::CBaseWizard
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Constructor.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// nIDCaption [IN] String resource ID for the caption for the wizard.
|
||
|
// pParentWnd [IN OUT] Parent window for this property sheet.
|
||
|
// iSelectPage [IN] Page to show first.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
CBaseWizard::CBaseWizard(
|
||
|
IN UINT nIDCaption,
|
||
|
IN OUT CWnd * pParentWnd,
|
||
|
IN UINT iSelectPage
|
||
|
)
|
||
|
: CBaseSheet( nIDCaption, pParentWnd, iSelectPage )
|
||
|
{
|
||
|
m_pci = NULL;
|
||
|
m_bNeedToLoadExtensions = TRUE;
|
||
|
|
||
|
} //*** CBaseWizard::CBaseWizard( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::BInit
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Initialize the wizard.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// iimgIcon [IN] Index in the large image list for the image to use
|
||
|
// as the icon on each page.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// TRUE Wizard initialized successfully.
|
||
|
// FALSE Wizard not initialized successfully.
|
||
|
//
|
||
|
// Exceptions Thrown:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CBaseWizard::BInit( IN IIMG iimgIcon )
|
||
|
{
|
||
|
BOOL bSuccess = TRUE;
|
||
|
CWaitCursor wc;
|
||
|
|
||
|
// Call the base class method.
|
||
|
if ( ! CBaseSheet::BInit( iimgIcon ) )
|
||
|
{
|
||
|
return FALSE;
|
||
|
} // if
|
||
|
|
||
|
// Make this sheet a wizard.
|
||
|
SetWizardMode( );
|
||
|
|
||
|
// Add non-extension pages.
|
||
|
try
|
||
|
{
|
||
|
// Add non-extension pages.
|
||
|
{
|
||
|
CWizPage * ppages = Ppages( );
|
||
|
int cpages = Cpages( );
|
||
|
int ipage;
|
||
|
|
||
|
ASSERT( ppages != NULL );
|
||
|
ASSERT( cpages != 0 );
|
||
|
|
||
|
for ( ipage = 0 ; ipage < cpages ; ipage++ )
|
||
|
{
|
||
|
ASSERT_VALID( ppages[ ipage ].m_pwpage );
|
||
|
ppages[ ipage ].m_pwpage->BInit( this );
|
||
|
AddPage( ppages[ ipage ].m_pwpage );
|
||
|
} // for: each page
|
||
|
} // Add non-extension pages
|
||
|
|
||
|
} // try
|
||
|
catch ( CException * pe )
|
||
|
{
|
||
|
pe->ReportError( );
|
||
|
pe->Delete( );
|
||
|
bSuccess = FALSE;
|
||
|
} // catch: anything
|
||
|
|
||
|
return bSuccess;
|
||
|
|
||
|
} //*** CBaseWizard::BInit( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::DoModal
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Display a modal wizard. Calls OnWizardFinish( ) or OnCancel( ) based
|
||
|
// on what the user pressed to dismiss the wizard.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// id Control the user pressed to dismiss the wizard.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
INT_PTR CBaseWizard::DoModal( void )
|
||
|
{
|
||
|
INT_PTR id;
|
||
|
|
||
|
// Don't display a help button.
|
||
|
m_psh.dwFlags &= ~PSH_HASHELP;
|
||
|
|
||
|
// Display the property sheet.
|
||
|
id = CBaseSheet::DoModal( );
|
||
|
if ( id == ID_WIZFINISH )
|
||
|
{
|
||
|
OnWizardFinish( );
|
||
|
} // if
|
||
|
else if ( id == IDCANCEL )
|
||
|
{
|
||
|
OnCancel( );
|
||
|
} // else
|
||
|
|
||
|
return id;
|
||
|
|
||
|
} //*** CBaseWizard::DoModal( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::OnInitDialog
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Handler for the WM_INITDIALOG message.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// TRUE Focus not set yet.
|
||
|
// FALSE Focus already set.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CBaseWizard::OnInitDialog( void )
|
||
|
{
|
||
|
BOOL bFocusNotSet;
|
||
|
|
||
|
// Call the base class method.
|
||
|
bFocusNotSet = CBaseSheet::OnInitDialog( );
|
||
|
|
||
|
// Remove the system menu.
|
||
|
ModifyStyle( WS_SYSMENU, 0 );
|
||
|
|
||
|
return bFocusNotSet;
|
||
|
|
||
|
} //*** CBaseWizard::OnInitDialog( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::OnWizardFinish
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Called after the wizard has been dismissed when the Finish button
|
||
|
// has been pressed.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CBaseWizard::OnWizardFinish( void )
|
||
|
{
|
||
|
} //*** CBaseWizard::OnWizardFinish( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::OnCancel
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Called after the wizard has been dismissed when the Cancel button
|
||
|
// has been pressed.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CBaseWizard::OnCancel( void )
|
||
|
{
|
||
|
} //*** CBaseWizard::OnCancel( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::LoadExtensions
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Load extensions to the wizard. Unload existing extension pages
|
||
|
// if necessary.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pci [IN OUT] Cluster item.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CBaseWizard::LoadExtensions(
|
||
|
IN OUT CClusterItem * pci
|
||
|
)
|
||
|
{
|
||
|
ASSERT_VALID( pci );
|
||
|
|
||
|
if ( BNeedToLoadExtensions( ) )
|
||
|
{
|
||
|
// Remove previous extensions.
|
||
|
{
|
||
|
POSITION pos;
|
||
|
|
||
|
pos = Lhpage( ).GetHeadPosition( );
|
||
|
while ( pos != NULL )
|
||
|
{
|
||
|
SendMessage( PSM_REMOVEPAGE, 0, (LPARAM) Lhpage( ).GetNext( pos ) );
|
||
|
} // while
|
||
|
Lhpage( ).RemoveAll( );
|
||
|
} // Remove previous extensions
|
||
|
|
||
|
// Add extension pages.
|
||
|
m_pci = pci;
|
||
|
AddExtensionPages( Pci( )->PlstrExtensions( ), Pci( ) );
|
||
|
m_bNeedToLoadExtensions = FALSE;
|
||
|
|
||
|
// Set the last page's wizard button setting.
|
||
|
{
|
||
|
CWizPage * pwizpg = &Ppages( )[ Cpages( ) - 1 ];
|
||
|
|
||
|
if ( Lhpage( ).GetCount( ) == 0 )
|
||
|
{
|
||
|
pwizpg->m_dwWizButtons &= ~PSWIZB_NEXT;
|
||
|
pwizpg->m_dwWizButtons |= PSWIZB_FINISH;
|
||
|
} // if: no pages added
|
||
|
else
|
||
|
{
|
||
|
pwizpg->m_dwWizButtons |= PSWIZB_NEXT;
|
||
|
pwizpg->m_dwWizButtons &= ~PSWIZB_FINISH;
|
||
|
} // else: some pages were added
|
||
|
} // Set the last page's wizard button setting
|
||
|
} // if: extensions need to be loaded
|
||
|
|
||
|
} //*** CBaseWizard::LoadExtensions( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::AddExtensionPages
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Add extension pages to the sheet.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// plstrExtensions [IN] List of extension names (CLSIDs).
|
||
|
// pci [IN OUT] Cluster item.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CBaseWizard::AddExtensionPages(
|
||
|
IN const CStringList * plstrExtensions,
|
||
|
IN OUT CClusterItem * pci
|
||
|
)
|
||
|
{
|
||
|
ASSERT_VALID( pci );
|
||
|
|
||
|
// Add extension pages.
|
||
|
if ( ( plstrExtensions != NULL )
|
||
|
&& ( plstrExtensions->GetCount( ) > 0 ) )
|
||
|
{
|
||
|
// Enclose the loading of the extension in a try/catch block so
|
||
|
// that the loading of the extension won't prevent all pages
|
||
|
// from being displayed.
|
||
|
try
|
||
|
{
|
||
|
Ext( ).CreateWizardPages(
|
||
|
this,
|
||
|
*plstrExtensions,
|
||
|
pci,
|
||
|
NULL,
|
||
|
Hicon( )
|
||
|
);
|
||
|
} // try
|
||
|
catch ( CException * pe )
|
||
|
{
|
||
|
pe->ReportError( );
|
||
|
pe->Delete( );
|
||
|
} // catch: CException
|
||
|
catch ( ... )
|
||
|
{
|
||
|
} // catch: anything
|
||
|
} // Add extension pages
|
||
|
|
||
|
} //*** CBaseWizard::AddExtensionPages( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::SetWizardButtons
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Set the wizard buttons based on which page is asking.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// rwpage [IN] Page to set the buttons for.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CBaseWizard::SetWizardButtons( IN const CBaseWizardPage & rwpage )
|
||
|
{
|
||
|
CWizPage * pwizpg;
|
||
|
|
||
|
pwizpg = PwizpgFromPwpage( rwpage );
|
||
|
if ( pwizpg != NULL )
|
||
|
{
|
||
|
SetWizardButtons( pwizpg->m_dwWizButtons );
|
||
|
} // if: page was found
|
||
|
|
||
|
} //*** CBaseWizard::SetWizardButtons( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::EnableNext
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Enables or disables the NEXT or FINISH button.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// bEnable [IN] TRUE = enable the button, FALSE = disable the button.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void CBaseWizard::EnableNext(
|
||
|
IN const CBaseWizardPage & rwpage,
|
||
|
IN BOOL bEnable /*=TRUE*/
|
||
|
)
|
||
|
{
|
||
|
DWORD dwWizButtons;
|
||
|
CWizPage * pwizpg;
|
||
|
|
||
|
pwizpg = PwizpgFromPwpage( rwpage );
|
||
|
if ( pwizpg != NULL )
|
||
|
{
|
||
|
dwWizButtons = pwizpg->m_dwWizButtons;
|
||
|
if ( ! bEnable )
|
||
|
{
|
||
|
dwWizButtons &= ~( PSWIZB_NEXT | PSWIZB_FINISH );
|
||
|
if ( pwizpg->m_dwWizButtons & PSWIZB_FINISH )
|
||
|
{
|
||
|
dwWizButtons |= PSWIZB_DISABLEDFINISH;
|
||
|
} // if
|
||
|
} // if: disabling the button
|
||
|
|
||
|
SetWizardButtons( dwWizButtons );
|
||
|
} // if: page was found
|
||
|
|
||
|
} //*** CBaseWizard::EnableNext( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::PwizpgFromPwpage
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Find the CWizPage entry for the specified CBaseWizardPage.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// rwpage [IN] Page to search for.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// pwizpg Entry in the Ppages( ) array.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
CWizPage * CBaseWizard::PwizpgFromPwpage( IN const CBaseWizardPage & rwpage )
|
||
|
{
|
||
|
int cwizpg = Cpages( );
|
||
|
CWizPage * pwizpg = Ppages( );
|
||
|
|
||
|
while ( cwizpg-- > 0 )
|
||
|
{
|
||
|
if ( pwizpg->m_pwpage == &rwpage )
|
||
|
{
|
||
|
return pwizpg;
|
||
|
} // if
|
||
|
pwizpg++;
|
||
|
} // while: more pages in the list
|
||
|
|
||
|
return NULL;
|
||
|
|
||
|
} //*** CBaseWizard::PwizpgFromPwpage( )
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseWizard::HrAddPage
|
||
|
//
|
||
|
// Routine Description:
|
||
|
// Add an extension page.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// hpage [IN OUT] Page to be added.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// S_OK Page added successfully.
|
||
|
// S_FALSE Page not added.
|
||
|
//
|
||
|
//--
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CBaseWizard::HrAddPage( IN OUT HPROPSHEETPAGE hpage )
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
ASSERT( hpage != NULL );
|
||
|
if ( hpage == NULL )
|
||
|
{
|
||
|
return S_FALSE;
|
||
|
} // if
|
||
|
|
||
|
// Add the page to the wizard.
|
||
|
try
|
||
|
{
|
||
|
// Add the page to the wizard.
|
||
|
SendMessage( PSM_ADDPAGE, 0, (LPARAM) hpage );
|
||
|
|
||
|
// Add the page to the end of the list.
|
||
|
Lhpage( ).AddTail( hpage );
|
||
|
} // try
|
||
|
catch ( CMemoryException * pme )
|
||
|
{
|
||
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
pme->Delete( );
|
||
|
} // catch: anything
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
} //*** CBaseWizard::HrAddPage( )
|