summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svx/svdobj.hxx10
-rw-r--r--reportdesign/inc/RptObject.hxx6
-rw-r--r--reportdesign/source/core/sdr/RptObject.cxx24
-rw-r--r--svx/source/svdraw/svdobj.cxx19
-rw-r--r--svx/source/unodraw/unopage.cxx14
5 files changed, 70 insertions, 3 deletions
diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx
index d3047b897e2f..081fe76cae19 100644
--- a/include/svx/svdobj.hxx
+++ b/include/svx/svdobj.hxx
@@ -1055,6 +1055,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
*
@@ -1082,6 +1087,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/reportdesign/inc/RptObject.hxx b/reportdesign/inc/RptObject.hxx
index ac22e47d4f45..9de4b13fb163 100644
--- a/reportdesign/inc/RptObject.hxx
+++ b/reportdesign/inc/RptObject.hxx
@@ -169,6 +169,9 @@ public:
virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getUnoShape();
virtual sal_uInt16 GetObjIdentifier() const;
virtual sal_uInt32 GetObjInventor() const;
+
+private:
+ virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxUnoShape );
};
//============================================================================
@@ -182,6 +185,8 @@ class REPORTDESIGN_DLLPUBLIC OOle2Obj: public SdrOle2Obj , public OObjectBase
sal_uInt16 m_nType;
bool m_bOnlyOnce;
void impl_createDataProvider_nothrow( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel>& _xModel);
+ virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxUnoShape );
+
public:
static OOle2Obj* Create( const ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportComponent>& _xComponent,sal_uInt16 _nType )
{
@@ -271,6 +276,7 @@ public:
OUnoObject& operator=(const OUnoObject& rObj);
private:
+ virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxUnoShape );
void impl_setReportComponent_nothrow();
void impl_initializeModel_nothrow();
};
diff --git a/reportdesign/source/core/sdr/RptObject.cxx b/reportdesign/source/core/sdr/RptObject.cxx
index 280f3dec7138..ad81cdc06ff8 100644
--- a/reportdesign/source/core/sdr/RptObject.cxx
+++ b/reportdesign/source/core/sdr/RptObject.cxx
@@ -166,6 +166,9 @@ SdrObject* OObjectBase::createObject(const uno::Reference< report::XReportCompon
break;
}
+ if ( pNewObj )
+ pNewObj->SetDoNotInsertIntoPageAutomatically( true );
+
ensureSdrObjectOwnership( _xComponent );
return pNewObj;
@@ -609,6 +612,13 @@ uno::Reference< uno::XInterface > OCustomShape::getUnoShape()
return xShape;
}
+void OCustomShape::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUnoShape )
+{
+ SdrObjCustomShape::impl_setUnoShape( rxUnoShape );
+ releaseUnoShape();
+ m_xReportComponent.clear();
+}
+
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
TYPEINIT1(OUnoObject, SdrUnoObj);
@@ -932,6 +942,12 @@ uno::Reference< uno::XInterface > OUnoObject::getUnoShape()
return OObjectBase::getUnoShapeOf( *this );
}
+void OUnoObject::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUnoShape )
+{
+ SdrUnoObj::impl_setUnoShape( rxUnoShape );
+ releaseUnoShape();
+}
+
OUnoObject& OUnoObject::operator=(const OUnoObject& rObj)
{
if( this == &rObj )
@@ -1135,6 +1151,14 @@ uno::Reference< uno::XInterface > OOle2Obj::getUnoShape()
}
return xShape;
}
+
+void OOle2Obj::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUnoShape )
+{
+ SdrOle2Obj::impl_setUnoShape( rxUnoShape );
+ releaseUnoShape();
+ m_xReportComponent.clear();
+}
+
// -----------------------------------------------------------------------------
uno::Reference< chart2::data::XDatabaseDataProvider > lcl_getDataProvider(const uno::Reference < embed::XEmbeddedObject >& _xObj)
{
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index 7052004d5242..0577860bc0bf 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -423,6 +423,7 @@ SdrObject::SdrObject()
,mnLayerID(0)
,mpSvxShape( NULL )
,maWeakUnoShape()
+ ,mbDoNotInsertIntoPageAutomatically(false)
{
DBG_CTOR(SdrObject,NULL);
bVirtObj =false;
@@ -497,6 +498,8 @@ SdrObject::~SdrObject()
delete mpViewContact;
mpViewContact = 0L;
}
+
+ mnLayerID = static_cast<SdrLayerID>(0xdead);
}
void SdrObject::Free( SdrObject*& _rpObject )
@@ -585,7 +588,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
@@ -3223,6 +3230,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 df6e8ba547a1..4cd98006ff1e 100644
--- a/svx/source/unodraw/unopage.cxx
+++ b/svx/source/unodraw/unopage.cxx
@@ -242,6 +242,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();
}
@@ -835,8 +841,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;
}