Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

516 lines
13 KiB

/////////////////////////////////////////////////////////////////////////////
//
// 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( )