/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sfx2.hxx" #include #include #include #ifndef _MSGBOX_HXX //autogen #include #endif #include #include #include #ifndef GCC #endif #include "app.hrc" #include #include #include #include "appdata.hxx" #include #include #include #include "arrdecl.hxx" #include "sfx2/sfxresid.hxx" #include #include #include #include #include #include "sfxtypes.hxx" #include "sfxlocal.hrc" #include #include "nochaos.hxx" #include #include #include #include #include #include "appbaslib.hxx" #include using ::basic::BasicManagerRepository; //=================================================================== sal_Bool SfxApplication::QueryExit_Impl() { sal_Bool bQuit = sal_True; // will trotzdem noch jemand, den man nicht abschiessen kann, die App haben? if ( !bQuit ) { // nicht wirklich beenden, nur minimieren InfoBox aInfoBox( NULL, SfxResId(MSG_CANT_QUIT) ); aInfoBox.Execute(); DBG_TRACE( "QueryExit => FALSE (in use)" ); return sal_False; } return sal_True; } //------------------------------------------------------------------------- void SfxApplication::Deinitialize() { if ( pAppData_Impl->bDowning ) return; StarBASIC::Stop(); // ggf. BASIC speichern BasicManager* pBasMgr = BasicManagerRepository::getApplicationBasicManager( false ); if ( pBasMgr && pBasMgr->IsModified() ) SaveBasicManager(); SaveBasicAndDialogContainer(); pAppData_Impl->bDowning = sal_True; // wegen Timer aus DecAliveCount und QueryExit DELETEZ( pAppData_Impl->pTemplates ); // By definition there shouldn't be any open view frames when we reach // this method. Therefore this call makes no sense and is the source of // some stack traces, which we don't understand. // For more information see: // #123501# //SetViewFrame(0); pAppData_Impl->bDowning = sal_False; DBG_ASSERT( !SfxViewFrame::GetFirst(), "existing SfxViewFrame after Execute" ); DBG_ASSERT( !SfxObjectShell::GetFirst(), "existing SfxObjectShell after Execute" ); pAppData_Impl->pAppDispat->Pop( *this, SFX_SHELL_POP_UNTIL ); pAppData_Impl->pAppDispat->Flush(); pAppData_Impl->bDowning = sal_True; pAppData_Impl->pAppDispat->DoDeactivate_Impl( sal_True, NULL ); // call derived application-exit Exit(); // Controller u."a. freigeben // dabei sollten auch restliche Komponenten ( Beamer! ) verschwinden BasicManagerRepository::resetApplicationBasicManager(); pAppData_Impl->pBasicManager->reset( NULL ); // this will also delete pBasMgr DBG_ASSERT( pAppData_Impl->pViewFrame == 0, "active foreign ViewFrame" ); delete[] pAppData_Impl->pInterfaces, pAppData_Impl->pInterfaces = 0; // free administration managers DELETEZ(pAppData_Impl->pAppDispat); SfxResId::DeleteResMgr(); DELETEZ(pAppData_Impl->pOfaResMgr); // ab hier d"urfen keine SvObjects mehr existieren DELETEZ(pAppData_Impl->pMatcher); DELETEX(pAppData_Impl->pSlotPool); DELETEX(pAppData_Impl->pFactArr); DELETEX(pAppData_Impl->pInitLinkList); DELETEX(pAppData_Impl->pTbxCtrlFac); DELETEX(pAppData_Impl->pStbCtrlFac); DELETEX(pAppData_Impl->pMenuCtrlFac); DELETEX(pAppData_Impl->pViewFrames); DELETEX(pAppData_Impl->pViewShells); DELETEX(pAppData_Impl->pObjShells); //TODO/CLEANTUP //ReleaseArgs could be used instead! /* This leak is intended ! Otherwise the TestTool cant use .uno:QuitApp ... because every destructed ItemSet work's on an already released pool pointer .-) NoChaos::ReleaseItemPool(); */ pAppData_Impl->pPool = NULL; DELETEZ(pAppData_Impl->pBasicResMgr); DELETEZ(pAppData_Impl->pSvtResMgr); }