1*9f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9f62ea84SAndrew Rist * distributed with this work for additional information 6*9f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 9*9f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*9f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9f62ea84SAndrew Rist * software distributed under the License is distributed on an 15*9f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 17*9f62ea84SAndrew Rist * specific language governing permissions and limitations 18*9f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*9f62ea84SAndrew Rist *************************************************************/ 21*9f62ea84SAndrew Rist 22*9f62ea84SAndrew Rist 23cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 24cdf0e10cSrcweir #include "precompiled_vcl.hxx" 25cdf0e10cSrcweir 26cdf0e10cSrcweir #ifndef LAZYDELETE_CXX 27cdf0e10cSrcweir #define LAZYDELETE_CXX 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include "vcl/window.hxx" 30cdf0e10cSrcweir #include "vcl/menu.hxx" 31cdf0e10cSrcweir #include "vcl/lazydelete.hxx" 32cdf0e10cSrcweir #include "svdata.hxx" 33cdf0e10cSrcweir 34cdf0e10cSrcweir namespace vcl { 35cdf0e10cSrcweir 36cdf0e10cSrcweir LazyDeletorBase::LazyDeletorBase() 37cdf0e10cSrcweir { 38cdf0e10cSrcweir } 39cdf0e10cSrcweir 40cdf0e10cSrcweir LazyDeletorBase::~LazyDeletorBase() 41cdf0e10cSrcweir { 42cdf0e10cSrcweir } 43cdf0e10cSrcweir 44cdf0e10cSrcweir // instantiate instance pointers for LazyDeletor<Window,Menu> 45cdf0e10cSrcweir template<> LazyDeletor<Window>* LazyDeletor<Window>::s_pOneInstance = NULL; 46cdf0e10cSrcweir template<> LazyDeletor<Menu>* LazyDeletor<Menu>::s_pOneInstance = NULL; 47cdf0e10cSrcweir 48cdf0e10cSrcweir // a list for all LazyeDeletor<T> singletons 49cdf0e10cSrcweir static std::vector< LazyDeletorBase* > lcl_aDeletors; 50cdf0e10cSrcweir 51cdf0e10cSrcweir void LazyDelete::addDeletor( LazyDeletorBase* i_pDel ) 52cdf0e10cSrcweir { 53cdf0e10cSrcweir lcl_aDeletors.push_back( i_pDel ); 54cdf0e10cSrcweir } 55cdf0e10cSrcweir 56cdf0e10cSrcweir void LazyDelete::flush() 57cdf0e10cSrcweir { 58cdf0e10cSrcweir unsigned int nCount = lcl_aDeletors.size(); 59cdf0e10cSrcweir for( unsigned int i = 0; i < nCount; i++ ) 60cdf0e10cSrcweir delete lcl_aDeletors[i]; 61cdf0e10cSrcweir lcl_aDeletors.clear(); 62cdf0e10cSrcweir } 63cdf0e10cSrcweir 64cdf0e10cSrcweir // specialized is_less function for Window 65cdf0e10cSrcweir template<> bool LazyDeletor<Window>::is_less( Window* left, Window* right ) 66cdf0e10cSrcweir { 67cdf0e10cSrcweir return (left != right && right->IsChild( left, sal_True )) ? true : false; 68cdf0e10cSrcweir } 69cdf0e10cSrcweir 70cdf0e10cSrcweir // specialized is_less function for Menu 71cdf0e10cSrcweir template<> bool LazyDeletor<Menu>::is_less( Menu* left, Menu* right ) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir while( left && left != right ) 74cdf0e10cSrcweir left = left->ImplGetStartedFrom(); 75cdf0e10cSrcweir return left != NULL; 76cdf0e10cSrcweir } 77cdf0e10cSrcweir 78cdf0e10cSrcweir DeleteOnDeinitBase::~DeleteOnDeinitBase() 79cdf0e10cSrcweir { 80cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 81cdf0e10cSrcweir if( pSVData && pSVData->mpDeinitDeleteList != NULL ) 82cdf0e10cSrcweir pSVData->mpDeinitDeleteList->remove( this ); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir void DeleteOnDeinitBase::addDeinitContainer( DeleteOnDeinitBase* i_pContainer ) 86cdf0e10cSrcweir { 87cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 88cdf0e10cSrcweir if( ! pSVData ) 89cdf0e10cSrcweir { 90cdf0e10cSrcweir ImplInitSVData(); 91cdf0e10cSrcweir pSVData = ImplGetSVData(); 92cdf0e10cSrcweir } 93cdf0e10cSrcweir 94cdf0e10cSrcweir DBG_ASSERT( ! pSVData->mbDeInit, "DeleteOnDeinit added after DeiInitVCL !" ); 95cdf0e10cSrcweir if( pSVData->mbDeInit ) 96cdf0e10cSrcweir return; 97cdf0e10cSrcweir 98cdf0e10cSrcweir if( pSVData->mpDeinitDeleteList == NULL ) 99cdf0e10cSrcweir pSVData->mpDeinitDeleteList = new std::list< DeleteOnDeinitBase* >(); 100cdf0e10cSrcweir pSVData->mpDeinitDeleteList->push_back( i_pContainer ); 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir void DeleteOnDeinitBase::ImplDeleteOnDeInit() 104cdf0e10cSrcweir { 105cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 106cdf0e10cSrcweir if( pSVData->mpDeinitDeleteList ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir for( std::list< vcl::DeleteOnDeinitBase* >::iterator it = pSVData->mpDeinitDeleteList->begin(); 109cdf0e10cSrcweir it != pSVData->mpDeinitDeleteList->end(); ++it ) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir (*it)->doCleanup(); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir delete pSVData->mpDeinitDeleteList; 114cdf0e10cSrcweir pSVData->mpDeinitDeleteList = NULL; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir } // namespace vcl 119cdf0e10cSrcweir 120cdf0e10cSrcweir #endif 121cdf0e10cSrcweir 122