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