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