diff options
-rw-r--r-- | include/svx/svdobj.hxx | 10 | ||||
-rw-r--r-- | reportdesign/inc/RptObject.hxx | 6 | ||||
-rw-r--r-- | reportdesign/source/core/sdr/RptObject.cxx | 24 | ||||
-rw-r--r-- | svx/source/svdraw/svdobj.cxx | 19 | ||||
-rw-r--r-- | svx/source/unodraw/unopage.cxx | 14 |
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; } |