summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2013-05-16 15:27:08 +0200
committerPetr Mladek <pmladek@suse.cz>2013-05-28 17:22:47 +0200
commitf678e50744a70035f6d4f91f762c8fdbf4aa62d8 (patch)
tree512813c1c8095c7bcb1257fa2cd5d09e1173d4ca /svx
parent4bdd125b06b4250fc528ad185a9a3434b49fe388 (diff)
fdo#64279, bnc#821586 do not crash opening report for editing
There are two problems: 1) The classes derived from SdrObject cache their SvxShape, but do not implement impl_setUnoShape(). 2) There is a lifetime issue in association of a SdrObject and its SvxShape. SvxDrawPage::CreateSdrObject not only creates a new SdrObject for a shape, but also inserts it into the page. At this point, the shape has not been attached to the object yet. That means that the object creates another shape at one point during the InsertObject call, which is then destroyed again. But reportdesign shapes own their objects, which means that destuction of the shape causes destruction of the object too... My first idea was to disable the insertion in SvxDrawPage::CreateSdrObject, but it has been there since the dawn of time, so I did not gather the courage to do that. Instead, I put in a hack to allow to skip the insertion. Change-Id: I888a54067be1934578434d8b476a13a7ff8d02b3 (cherry picked from commit 02d03eb4ad6e64744659c5fe04282b25b66c28d8) Signed-off-by: David Tardon <dtardon@redhat.com> Conflicts: include/svx/svdobj.hxx Change-Id: I36406f399092c2c85278633d2ee7c953fc76f1bc Reviewed-on: https://gerrit.libreoffice.org/4071 Reviewed-by: Petr Mladek <pmladek@suse.cz> Tested-by: Petr Mladek <pmladek@suse.cz>
Diffstat (limited to 'svx')
-rw-r--r--svx/inc/svx/svdobj.hxx10
-rw-r--r--svx/source/svdraw/svdobj.cxx19
-rw-r--r--svx/source/unodraw/unopage.cxx14
3 files changed, 40 insertions, 3 deletions
diff --git a/svx/inc/svx/svdobj.hxx b/svx/inc/svx/svdobj.hxx
index 8241ed461e52..cf6d266dc815 100644
--- a/svx/inc/svx/svdobj.hxx
+++ b/svx/inc/svx/svdobj.hxx
@@ -1051,6 +1051,11 @@ public:
Rectangle GetBLIPSizeRectangle() const;
void SetBLIPSizeRectangle( const Rectangle& aRect );
+ /// @see mbDoNotInsertIntoPageAutomatically
+ void SetDoNotInsertIntoPageAutomatically(bool bSet);
+ /// @see mbDoNotInsertIntoPageAutomatically
+ bool IsDoNotInsertIntoPageAutomatically() const;
+
protected:
/** Sets a new UNO shape
*
@@ -1078,6 +1083,11 @@ private:
SvxShape* mpSvxShape;
::com::sun::star::uno::WeakReference< ::com::sun::star::uno::XInterface >
maWeakUnoShape;
+ /** HACK: Do not automatically insert newly created object into a page.
+ *
+ * The user needs to do it manually later.
+ */
+ bool mbDoNotInsertIntoPageAutomatically;
};
//************************************************************
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index 2c7d5310de3f..09cc65886c52 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -422,6 +422,7 @@ SdrObject::SdrObject()
,mnLayerID(0)
,mpSvxShape( NULL )
,maWeakUnoShape()
+ ,mbDoNotInsertIntoPageAutomatically(false)
{
DBG_CTOR(SdrObject,NULL);
bVirtObj =false;
@@ -496,6 +497,8 @@ SdrObject::~SdrObject()
delete mpViewContact;
mpViewContact = 0L;
}
+
+ mnLayerID = static_cast<SdrLayerID>(0xdead);
}
void SdrObject::Free( SdrObject*& _rpObject )
@@ -584,7 +587,11 @@ void SdrObject::SetPage(SdrPage* pNewPage)
// assume they create compatible UNO shape objects so we shouldn't have
// to invalidate.
if (pOldPage != pPage && !(pOldPage && pPage && pOldModel == pModel))
- setUnoShape(NULL);
+ {
+ SvxShape* const pShape(getSvxShape());
+ if (pShape && !pShape->HasSdrObjectOwnership())
+ setUnoShape(NULL);
+ }
}
SdrPage* SdrObject::GetPage() const
@@ -3205,6 +3212,16 @@ void SdrObject::SetContextWritingMode( const sal_Int16 /*_nContextWritingMode*/
// this base class does not support different writing modes, so ignore the call
}
+void SdrObject::SetDoNotInsertIntoPageAutomatically(const bool bSet)
+{
+ mbDoNotInsertIntoPageAutomatically = bSet;
+}
+
+bool SdrObject::IsDoNotInsertIntoPageAutomatically() const
+{
+ return mbDoNotInsertIntoPageAutomatically;
+}
+
SdrObjFactory::SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel)
{
diff --git a/svx/source/unodraw/unopage.cxx b/svx/source/unodraw/unopage.cxx
index 0ab54524627e..12da32064856 100644
--- a/svx/source/unodraw/unopage.cxx
+++ b/svx/source/unodraw/unopage.cxx
@@ -243,6 +243,12 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape
pShape->Create( pObj, this );
OSL_ENSURE( pShape->GetSdrObject() == pObj, "SvxDrawPage::add: shape does not know about its newly created SdrObject!" );
+ if ( !pObj->IsInserted() )
+ {
+ pObj->SetModel(mpModel);
+ mpPage->InsertObject( pObj );
+ }
+
mpModel->SetChanged();
}
@@ -836,8 +842,12 @@ Reference< drawing::XShape > SvxDrawPage::_CreateShape( SdrObject *pObj ) const
SdrObject *SvxDrawPage::CreateSdrObject( const Reference< drawing::XShape > & xShape ) throw()
{
SdrObject* pObj = _CreateSdrObject( xShape );
- if( pObj && !pObj->IsInserted() )
- mpPage->InsertObject( pObj );
+ if( pObj)
+ {
+ pObj->SetModel(mpModel);
+ if ( !pObj->IsInserted() && !pObj->IsDoNotInsertIntoPageAutomatically() )
+ mpPage->InsertObject( pObj );
+ }
return pObj;
}