|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2000 Microsoft Corporation
//
// Module Name:
// AtlBasePropSheet.cpp
//
// Abstract:
// Implementation of the CBasePropertySheetWindow class.
//
// Author:
// David Potter (davidp) February 26, 1998
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "AtlBasePropSheet.h"
#include "AtlBasePropPage.h"
#include "AtlExtDll.h"
#include "StlUtils.h"
#include "ExcOper.h"
#include "AdmCommonRes.h"
/////////////////////////////////////////////////////////////////////////////
// class CBasePropertySheetWindow
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::~CBasePropertySheetWindow
//
// Routine Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
// Exceptions Thrown:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CBasePropertySheetWindow::~CBasePropertySheetWindow( void ) { //
// Delete pages from the page list.
//
if ( m_plppPages != NULL ) { DeleteAllPtrListItems( m_plppPages ); delete m_plppPages; } // if: page array has been allocated
} //*** CBasePropertySheetWindow::~CBasePropertySheetWindow()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::BInit
//
// Routine Description:
// Initialize the sheet.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Property sheet initialized successfully.
// FALSE Error initializing the property sheet.
//
// Exceptions Thrown:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CBasePropertySheetWindow::BInit( void ) { ATLASSERT( PlppPages()->size() > 0 ); ATLASSERT( m_hWnd == NULL );
BOOL bSuccess = TRUE; CPropertyPageList::iterator itCurrent = PlppPages()->begin(); CPropertyPageList::iterator itLast = PlppPages()->end(); CStaticPropertyPageWindow * pspp;
//
// Add static pages.
//
for ( ; itCurrent != itLast ; itCurrent++ ) { //
// If this is a static page, add it to the list.
//
pspp = dynamic_cast< CStaticPropertyPageWindow * >( *itCurrent ); if ( pspp != NULL ) { //
// Initialize the page.
//
bSuccess = pspp->BInit( this ); if ( ! bSuccess ) { break; } // if: error initializing the page
//
// Add the page.
//
bSuccess = AddPage( pspp->Ppsp() ); if ( ! bSuccess ) { CNTException nte( GetLastError(), ADMC_IDS_ADD_PAGE_TO_PROP_SHEET_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error adding the page
} // if: static page
} // for: each page
return bSuccess;
} //*** CBasePropertySheetWindow::BInit()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::BAddPage
//
// Routine Description:
// Add a page to the page list.
//
// Arguments:
// ppp [IN] Property page to add.
//
// Return Value:
// TRUE Page added successfully.
// FALSE Error adding page.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CBasePropertySheetWindow::BAddPage( IN CBasePropertyPageWindow * ppp ) { ATLASSERT( ppp != NULL );
BOOL bSuccess = FALSE;
// Loop to avoid goto's.
do { //
// Allocate the page array if it doesn't exist yet.
//
if ( m_plppPages == NULL ) { m_plppPages = new CPropertyPageList; ATLASSERT( m_plppPages != NULL ); if ( m_plppPages == NULL ) { CNTException nte( GetLastError(), ADMC_IDS_ADD_FIRST_PAGE_TO_PROP_SHEET_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error allocating page list
} // if: no page array yet
//
// Insert the page at the end of the list.
//
PlppPages()->insert( PlppPages()->end(), ppp );
bSuccess = TRUE; } while ( 0 );
return bSuccess;
} //*** CBasePropertySheetWindow::BAddPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::OnSheetInitialized
//
// Routine Description:
// Handler for PSCB_INITIALIZED.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
// Exceptions Thrown:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBasePropertySheetWindow::OnSheetInitialized( void ) { //
// Add dynamic pages, including extension pages.
//
{ //
// Get pointers to beginning and end of list.
//
CPropertyPageList::iterator itCurrent = PlppPages()->begin(); CPropertyPageList::iterator itLast = PlppPages()->end();
//
// Loop through the list and add each dynamic page.
//
for ( ; itCurrent != itLast ; itCurrent++ ) { CDynamicPropertyPageWindow * pdpp = dynamic_cast< CDynamicPropertyPageWindow * >( *itCurrent ); if ( pdpp != NULL ) { if ( pdpp->Hpage() != NULL ) { AddPage( pdpp->Hpage() ); pdpp->SetPageAdded( TRUE ); } // if: page has already been created
} // if: dynamic page found
} // for: each item in the list
} // Add dynamic pages, including extension pages
//
// Call the base class method.
//
CBaseSheetWindow::OnSheetInitialized();
} //*** CBasePropertySheetWindow::OnSheetInitialized()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::AddExtensionPages
//
// Routine Description:
// Add extension pages to the sheet.
//
// Arguments:
// hfont [IN] Font to use for the extension pages.
// hicon [IN] Icon to use for the extension pages.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBasePropertySheetWindow::AddExtensionPages( IN HFONT hfont, IN HICON hicon ) { ATLASSERT( PcoObjectToExtend() != NULL );
//
// Add extension pages if there any extensions.
//
if ( (PcoObjectToExtend()->PlstrAdminExtensions() != NULL) && (PcoObjectToExtend()->PlstrAdminExtensions()->size() > 0) ) { //
// Get the currently selected page so we can reset it when we're done.
//
CTabCtrl tabc( GetTabControl() ); int nCurPage = tabc.GetCurSel();
//
// Prepare to add extension pages.
//
CDynamicPropertyPageList ldpp; PrepareToAddExtensionPages( ldpp );
//
// If no extensions object has been created yet, create it now.
//
if ( Pext() == NULL ) { m_pext = new CCluAdmExtensions; ATLASSERT( m_pext != NULL ); } // if: no extensions list yet
//
// 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 { Pext()->CreatePropertySheetPages( this, *PcoObjectToExtend()->PlstrAdminExtensions(), PcoObjectToExtend(), hfont, hicon ); } // try
catch (...) { } // catch: anything
//
// Complete the process of adding extension pages.
//
CompleteAddingExtensionPages( ldpp );
//
// Restore the current selection.
// This has to be done because sometimes the above process causes
// the current page to be set to the last page added, which prevents
// the next page from being displayed.
//
SetActivePage( nCurPage ); } // if: object has extensions
else { //
// Remove extension pages.
//
RemoveAllExtensionPages(); } // else: object doesn't have extensions
} //*** CBasePropertySheetWindow::AddExtensionPages()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::PrepareToAddExtensionPages
//
// Routine Description:
// Prepare to add extension pages by deleting existing extension
// pages and removing dynamic pages.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBasePropertySheetWindow::PrepareToAddExtensionPages( CDynamicPropertyPageList & rldpp ) { //
// Delete all extension pages.
//
RemoveAllExtensionPages();
//
// Move all dynamic pages to the temporary list.
//
ATLASSERT( rldpp.size() == 0); MovePtrListItems< CBasePropertyPageWindow *, CDynamicPropertyPageWindow * >( PlppPages(), &rldpp );
//
// Remove all pages in the temporary list from the property sheet.
// The page must have already been created because we don't have
// any access to the PROPSHEETPAGE structure to create it
// during the completion phase.
//
{ CDynamicPropertyPageList::iterator itCurrent; CDynamicPropertyPageList::iterator itLast;
itCurrent = rldpp.begin(); itLast = rldpp.end(); for ( ; itCurrent != itLast ; itCurrent++ ) { CDynamicPropertyPageWindow * pdpp = *itCurrent; ATLASSERT( pdpp != NULL ); if ( pdpp->Hpage() != NULL ) { RemovePage( pdpp->Hpage() ); pdpp->SetPageAdded( FALSE ); } // if: page already created
} // for: each page in the list
} // Remove dynamic pages
} //*** CBasePropertySheetWindow::PrepareToAddExtensionPages()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::HrAddExtensionPage
//
// Routine Description:
// Add an extension page.
//
// Arguments:
// ppage [IN OUT] Page to be added.
//
// Return Value:
// S_OK Page added successfully.
// S_FALSE Page not added.
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CBasePropertySheetWindow::HrAddExtensionPage( IN CBasePageWindow * ppage ) { ATLASSERT( ppage != NULL );
HRESULT hr = S_OK;
CExtensionPropertyPageWindow * pepp = dynamic_cast< CExtensionPropertyPageWindow * >( ppage ); ATLASSERT( pepp != NULL );
if ( (ppage == NULL) || (pepp == NULL ) ) { return S_FALSE; } // if: invalid arguments
//
// Add the page to the sheet.
//
if ( m_hWnd != NULL ) { AddPage( pepp->Hpage() ); pepp->SetPageAdded( TRUE ); } // if: sheet is being displayed
//
// Add the page to the end of the list.
//
PlppPages()->insert( PlppPages()->end(), reinterpret_cast< CBasePropertyPageWindow * >( ppage ) );
return hr;
} //*** CBasePropertySheetWindow::HrAddExtensionPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::CompleteAddingExtensionPages
//
// Routine Description:
// Complete the process of adding extension pages to the sheet by
// re-adding dynamic pages.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBasePropertySheetWindow::CompleteAddingExtensionPages( CDynamicPropertyPageList & rldpp ) { DWORD sc; CDynamicPropertyPageWindow * pdpp;
//
// Move all pages from the temporary list to the real list and
// add them to the end of the sheet.
//
CDynamicPropertyPageList::iterator itCurrent = rldpp.begin(); CDynamicPropertyPageList::iterator itLast = rldpp.end(); while ( itCurrent != itLast ) { pdpp = *itCurrent; ATLASSERT( pdpp != NULL );
//
// Create the page.
//
sc = pdpp->ScCreatePage(); if ( sc != ERROR_SUCCESS ) { CNTException nte( sc, ADMC_IDS_CREATE_EXT_PAGE_ERROR, NULL, NULL, FALSE ); delete pdpp; itCurrent = rldpp.erase( itCurrent ); continue; } // if: error creating the page
//
// Add the page to the sheet.
//
ATLASSERT( pdpp->Hpage() != NULL ); AddPage( pdpp->Hpage() ); pdpp->SetPageAdded( TRUE );
//
// Move the page to real list.
//
PlppPages()->insert( PlppPages()->end(), pdpp ); itCurrent = rldpp.erase( itCurrent ); } // while: not at last page
} //*** CBasePropertySheetWindow::CompleteAddingExtensionPages()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBasePropertySheetWindow::RemoveAllExtensionPages
//
// Routine Description:
// Remove all extension pages from the property sheet.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBasePropertySheetWindow::RemoveAllExtensionPages( void ) { //
// Remove the extension pages.
//
CExtensionPropertyPageList lepp; MovePtrListItems< CBasePropertyPageWindow *, CExtensionPropertyPageWindow * >( PlppPages(), &lepp ); CExtensionPropertyPageList::iterator itCurrent = lepp.begin(); CExtensionPropertyPageList::iterator itLast = lepp.end(); for ( ; itCurrent != itLast ; itCurrent++ ) { CExtensionPropertyPageWindow * pepp = *itCurrent; ATLASSERT( pepp != NULL ); if ( pepp->Hpage() != NULL ) { RemovePage( pepp->Hpage() ); pepp->SetPageAdded( FALSE ); } // if: page already created
} // for: each page in the list
DeleteAllPtrListItems( &lepp );
} //*** CBasePropertySheetWindow::RemoveAllExtensionPages()
|