Blob Blame History Raw
From a3f38bdaaff91abdf2e0f01d0b6370aa958e4a20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Tue, 10 Dec 2013 16:54:59 +0000
Subject: [PATCH 063/109] 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.

(cherry picked from commit 0b8e2e5efe20519e8b5563314bac0cbb84a3b967)

Conflicts:
	svx/source/table/svdotable.cxx

Change-Id: I09f9a73b01fb2ddf059402146acdc7bd823798b9
Reviewed-on: https://gerrit.libreoffice.org/7051
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
---
 svx/source/table/svdotable.cxx | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx
index bed3988..474d42d 100644
--- a/svx/source/table/svdotable.cxx
+++ b/svx/source/table/svdotable.cxx
@@ -268,9 +268,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 );
     UpdateWritingMode();
     LayoutTable( mpTableObj->aRect, true, true );
     mpTableObj->maLogicRect = mpTableObj->aRect;
@@ -282,6 +282,8 @@ SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource )
 {
     if (this != &rSource)
     {
+        disconnectTableStyle();
+
         if( mpLayouter )
         {
             delete mpLayouter;
@@ -307,6 +309,8 @@ SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource )
         ApplyCellStyles();
         mpTableObj->aRect = mpTableObj->maLogicRect;
         LayoutTable( mpTableObj->aRect, false, false );
+
+        connectTableStyle();
     }
     return *this;
 }
@@ -453,8 +457,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();
+    }
 }
 
 // -----------------------------------------------------------------------------
-- 
1.8.4.2