diff options
author | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-01-06 20:56:20 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-01-06 21:00:11 -0500 |
commit | f60c1cd239da3e2fcb30f4af8761013c8ae9c0fc (patch) | |
tree | 9a6636340c81a1ddad6d128ba47988bced48a90b | |
parent | d59211357a4ae75365f23479ac2e1cd2376a5dab (diff) |
fdo#44467: Deleting sheets should adjust drawing object pages as well.
Good thing we caught this, because we were also leaking memory by not
deleting the deleted sheet instances.
-rw-r--r-- | sc/source/core/data/document.cxx | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index eb03a7420b99..15d529576f6d 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -95,6 +95,7 @@ #include "externalrefmgr.hxx" #include "tabprotection.hxx" #include "clipparam.hxx" +#include "stlalgorithm.hxx" #include <map> #include <limits> @@ -651,17 +652,19 @@ bool ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc ) if ( pUnoBroadcaster ) pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1 ) ); - SCTAB i; - for (i=0; i< static_cast<SCTAB>(maTabs.size()); i++) + for (SCTAB i = 0, n = static_cast<SCTAB>(maTabs.size()); i < n; ++i) if (maTabs[i]) - maTabs[i]->UpdateDeleteTab(nTab,false, - pRefUndoDoc ? pRefUndoDoc->maTabs[i] : 0); - maTabs.erase(maTabs.begin()+ nTab); + maTabs[i]->UpdateDeleteTab( + nTab, false, pRefUndoDoc ? pRefUndoDoc->maTabs[i] : 0); + + TableContainer::iterator it = maTabs.begin() + nTab; + delete *it; + maTabs.erase(it); // UpdateBroadcastAreas must be called between UpdateDeleteTab, // which ends listening, and StartAllListeners, to not modify // areas that are to be inserted by starting listeners. UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,-1); - TableContainer::iterator it = maTabs.begin(); + it = maTabs.begin(); for (; it != maTabs.end(); ++it) if ( *it ) (*it)->UpdateCompile(); @@ -738,17 +741,20 @@ bool ScDocument::DeleteTabs( SCTAB nTab, SCTAB nSheets, ScDocument* pRefUndoDoc if ( pUnoBroadcaster ) pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1*nSheets ) ); - SCTAB i; - for (i=0; i< static_cast<SCTAB>(maTabs.size()); i++) + for (SCTAB i = 0, n = static_cast<SCTAB>(maTabs.size()); i < n; ++i) if (maTabs[i]) - maTabs[i]->UpdateDeleteTab(nTab,false, - pRefUndoDoc ? pRefUndoDoc->maTabs[i] : 0,nSheets); - maTabs.erase(maTabs.begin()+ nTab, maTabs.begin() + nTab + nSheets); + maTabs[i]->UpdateDeleteTab( + nTab, false, pRefUndoDoc ? pRefUndoDoc->maTabs[i] : 0,nSheets); + + TableContainer::iterator it = maTabs.begin() + nTab; + TableContainer::iterator itEnd = it + nSheets; + std::for_each(it, itEnd, ScDeleteObjectByPtr<ScTable>()); + maTabs.erase(it, itEnd); // UpdateBroadcastAreas must be called between UpdateDeleteTab, // which ends listening, and StartAllListeners, to not modify // areas that are to be inserted by starting listeners. UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,-1*nSheets); - TableContainer::iterator it = maTabs.begin(); + it = maTabs.begin(); for (; it != maTabs.end(); ++it) if ( *it ) (*it)->UpdateCompile(); |