summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2013-12-10 16:54:59 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-12-11 12:59:44 +0000
commit3d742188d402b294af9a06ba15bc16d19966bd6f (patch)
tree097860321831528bc99992fc8a00cabac6c5321d
parent1e3f7a2a1ec604cb1f493ffa63ebc365044b0f4d (diff)
correctly dispose to avoid cyclic dependencies
accessibility cruft is still listening to dead tables so crashes in slidesorting in main panel if moved slide has tables in it after visiting slide sorter once. Change-Id: I09f9a73b01fb2ddf059402146acdc7bd823798b9 (cherry picked from commit 0b8e2e5efe20519e8b5563314bac0cbb84a3b967)
-rw-r--r--svx/source/table/svdotable.cxx20
1 files changed, 19 insertions, 1 deletions
diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx
index 994076e4f322..9c5e64ae677a 100644
--- a/svx/source/table/svdotable.cxx
+++ b/svx/source/table/svdotable.cxx
@@ -266,9 +266,9 @@ void SdrTableObjImpl::init( SdrTableObj* pTable, sal_Int32 nColumns, sal_Int32 n
mpTableObj = pTable;
mxTable = new TableModel( pTable );
mxTable->init( nColumns, nRows );
- mpLayouter = new TableLayouter( mxTable );
Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
mxTable->addModifyListener( xListener );
+ mpLayouter = new TableLayouter( mxTable );
LayoutTable( mpTableObj->aRect, true, true );
mpTableObj->maLogicRect = mpTableObj->aRect;
}
@@ -279,6 +279,8 @@ SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource )
{
if (this != &rSource)
{
+ disconnectTableStyle();
+
if( mpLayouter )
{
delete mpLayouter;
@@ -303,6 +305,8 @@ SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource )
ApplyCellStyles();
mpTableObj->aRect = mpTableObj->maLogicRect;
LayoutTable( mpTableObj->aRect, false, false );
+
+ connectTableStyle();
}
return *this;
}
@@ -449,8 +453,22 @@ bool SdrTableObjImpl::ApplyCellStyles()
void SdrTableObjImpl::dispose()
{
+ disconnectTableStyle();
+ mxTableStyle.clear();
+
+ if( mpLayouter )
+ {
+ delete mpLayouter;
+ mpLayouter = 0;
+ }
+
if( mxTable.is() )
+ {
+ Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
+ mxTable->removeModifyListener( xListener );
mxTable->dispose();
+ mxTable.clear();
+ }
}
// -----------------------------------------------------------------------------