diff options
Diffstat (limited to 'vcl/source/helper/lazydelete.cxx')
-rw-r--r-- | vcl/source/helper/lazydelete.cxx | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/vcl/source/helper/lazydelete.cxx b/vcl/source/helper/lazydelete.cxx index 9b439a6df9af..f5a8d8fbb14e 100644 --- a/vcl/source/helper/lazydelete.cxx +++ b/vcl/source/helper/lazydelete.cxx @@ -33,9 +33,10 @@ #ifndef LAZYDELETE_CXX #define LAZYDELETE_CXX -#include <vcl/window.hxx> -#include <vcl/menu.hxx> -#include <vcl/lazydelete.hxx> +#include "vcl/window.hxx" +#include "vcl/menu.hxx" +#include "vcl/lazydelete.hxx" +#include "vcl/svdata.hxx" namespace vcl { @@ -81,6 +82,44 @@ template<> bool LazyDeletor<Menu>::is_less( Menu* left, Menu* right ) return left != NULL; } +DeleteOnDeinitBase::~DeleteOnDeinitBase() +{ +} + +void DeleteOnDeinitBase::addDeinitContainer( DeleteOnDeinitBase* i_pContainer ) +{ + ImplSVData* pSVData = ImplGetSVData(); + if( ! pSVData ) + { + ImplInitSVData(); + pSVData = ImplGetSVData(); + } + + DBG_ASSERT( ! pSVData->mbDeInit, "DeleteOnDeinit added after DeiInitVCL !" ); + if( pSVData->mbDeInit ) + return; + + if( pSVData->mpDeinitDeleteList == NULL ) + pSVData->mpDeinitDeleteList = new std::list< DeleteOnDeinitBase* >(); + pSVData->mpDeinitDeleteList->push_back( i_pContainer ); } +void DeleteOnDeinitBase::ImplDeleteOnDeInit() +{ + ImplSVData* pSVData = ImplGetSVData(); + if( pSVData->mpDeinitDeleteList ) + { + for( std::list< vcl::DeleteOnDeinitBase* >::iterator it = pSVData->mpDeinitDeleteList->begin(); + it != pSVData->mpDeinitDeleteList->end(); ++it ) + { + (*it)->doCleanup(); + } + delete pSVData->mpDeinitDeleteList; + pSVData->mpDeinitDeleteList = NULL; + } +} + +} // namespace vcl + #endif + |