From 2c737cedd914e30b013b090392a43a4cb48e62a6 Mon Sep 17 00:00:00 2001 From: Jürgen Schmidt Date: Fri, 8 Jun 2012 09:10:43 +0000 Subject: Resolves: #i119912# Crash when redo split pasted table used by chart fix: While deleting any box from chart data provider, verify whether there are any invalidate chart data sequence inside, if so, catch the exception and remove it. Patch By: Peng Chen Found By: yanji Review By: jsc (cherry picked from commit a92e353922d63d785e3d46aa1a4783846a9dea18) Change-Id: I239824e92d13e42b83674dbdeaeef053f1e6ea9a --- sw/source/core/unocore/unochart.cxx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'sw') diff --git a/sw/source/core/unocore/unochart.cxx b/sw/source/core/unocore/unochart.cxx index 17b116aa5235..14484459e1ea 100644 --- a/sw/source/core/unocore/unochart.cxx +++ b/sw/source/core/unocore/unochart.cxx @@ -1583,6 +1583,7 @@ sal_Bool SwChartDataProvider::DeleteBox( const SwTable *pTable, const SwTableBox { SwChartDataSequence *pDataSeq = 0; sal_Bool bNowEmpty = sal_False; + sal_Bool bSeqDisposed = sal_False; // check if weak reference is still valid... uno::Reference< chart2::data::XDataSequence > xTemp(*aIt); // temporary needed for g++ 3.3.5 @@ -1593,10 +1594,16 @@ sal_Bool SwChartDataProvider::DeleteBox( const SwTable *pTable, const SwTableBox pDataSeq = static_cast< SwChartDataSequence * >( xRef.get() ); if (pDataSeq) { -#if OSL_DEBUG_LEVEL > 1 - OUString aRangeStr( pDataSeq->getSourceRangeRepresentation() ); -#endif - bNowEmpty = pDataSeq->DeleteBox( rBox ); + try + { + bNowEmpty = pDataSeq->DeleteBox( rBox ); + } + catch (const lang::DisposedException&) + { + bNowEmpty = sal_True; + bSeqDisposed = sal_True; + } + if (bNowEmpty) aDelIt = aIt; } @@ -1606,7 +1613,7 @@ sal_Bool SwChartDataProvider::DeleteBox( const SwTable *pTable, const SwTableBox if (bNowEmpty) { rSet.erase( aDelIt ); - if (pDataSeq) + if (pDataSeq && !bSeqDisposed) pDataSeq->dispose(); // the current way to tell chart that sth. got removed } } @@ -2512,6 +2519,9 @@ void SAL_CALL SwChartDataSequence::removeEventListener( sal_Bool SwChartDataSequence::DeleteBox( const SwTableBox &rBox ) { + if (bDisposed) + throw lang::DisposedException(); + #if OSL_DEBUG_LEVEL > 1 String aBoxName( rBox.GetName() ); #endif -- cgit