diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-10-17 15:03:34 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-10-17 15:20:00 +0100 |
commit | 5bdfa8c12472eb9ff6ca054c2ada7150b1869fff (patch) | |
tree | 216653598067193c86a15daeb41fea0c053ab624 /svx | |
parent | 0c1e9111d02649e77513a1d108146c9c055adb3a (diff) |
Resolves: fdo#62682 crash on second export of svg
because the first export has left "dangling" CalcFieldValueHdl Links in
Outliners that got created based on the Drawing Outliner while it had a
temporary CalcFieldValueHdl installed, and didn't get the old CalcFieldValueHdl
installed when the old Drawing Outliner one was re-installed.
Change-Id: I064a154ece488c9a4c3467b753451df7e73ae883
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/inc/svdoutlinercache.hxx | 7 | ||||
-rw-r--r-- | svx/source/svdraw/svdmodel.cxx | 11 | ||||
-rw-r--r-- | svx/source/svdraw/svdoutlinercache.cxx | 2 |
3 files changed, 20 insertions, 0 deletions
diff --git a/svx/source/inc/svdoutlinercache.hxx b/svx/source/inc/svdoutlinercache.hxx index 6dbf7286c817..03572fc29389 100644 --- a/svx/source/inc/svdoutlinercache.hxx +++ b/svx/source/inc/svdoutlinercache.hxx @@ -21,6 +21,7 @@ #define INCLUDED_SVX_SOURCE_INC_SVDOUTLINERCACHE_HXX #include <sal/types.h> +#include <vector> class SdrModel; class SdrOutliner; @@ -33,12 +34,18 @@ private: SdrOutliner* mpModeOutline; SdrOutliner* mpModeText; + + std::vector<SdrOutliner*> maActiveOutliners; public: SdrOutlinerCache( SdrModel* pModel ); ~SdrOutlinerCache(); SdrOutliner* createOutliner( sal_uInt16 nOutlinerMode ); void disposeOutliner( SdrOutliner* pOutliner ); + std::vector<SdrOutliner*> GetActiveOutliners() const + { + return maActiveOutliners; + } }; #endif diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 8a46865dbbe0..409f5c9bc14d 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -1918,6 +1918,17 @@ SdrOutliner* SdrModel::createOutliner( sal_uInt16 nOutlinerMode ) return mpOutlinerCache->createOutliner( nOutlinerMode ); } +std::vector<SdrOutliner*> SdrModel::GetActiveOutliners() const +{ + std::vector<SdrOutliner*> aRet(mpOutlinerCache ? + mpOutlinerCache->GetActiveOutliners() : std::vector<SdrOutliner*>()); + + aRet.push_back(pDrawOutliner); + aRet.push_back(pHitTestOutliner); + + return aRet; +} + void SdrModel::disposeOutliner( SdrOutliner* pOutliner ) { if( mpOutlinerCache ) diff --git a/svx/source/svdraw/svdoutlinercache.cxx b/svx/source/svdraw/svdoutlinercache.cxx index e9697988e043..c85266837534 100644 --- a/svx/source/svdraw/svdoutlinercache.cxx +++ b/svx/source/svdraw/svdoutlinercache.cxx @@ -48,6 +48,7 @@ SdrOutliner* SdrOutlinerCache::createOutliner( sal_uInt16 nOutlinerMode ) pOutliner = SdrMakeOutliner( nOutlinerMode, mpModel ); Outliner& aDrawOutliner = mpModel->GetDrawOutliner(); pOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() ); + maActiveOutliners.push_back(pOutliner); } return pOutliner; @@ -94,6 +95,7 @@ void SdrOutlinerCache::disposeOutliner( SdrOutliner* pOutliner ) } else { + maActiveOutliners.erase(std::remove(maActiveOutliners.begin(), maActiveOutliners.end(), pOutliner), maActiveOutliners.end()); delete pOutliner; } } |