diff options
author | Noel <noel.grandin@collabora.co.uk> | 2021-02-09 13:42:22 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-02-10 07:35:41 +0100 |
commit | 09cb778b6eb7d3a5b9029965a1320b49c90e7295 (patch) | |
tree | 63d75bc66ddbe4af5f6a52f4a0d65e9b199dbae7 /reportdesign | |
parent | ccdee8eebaa56619248e35001017226eecfe4e83 (diff) |
clean up SdrObject cloning
using operator= implies that overwriting an SdrObject is a
useful operation, but that is not at all true - they are typically
linked into and referred to by many other things.
So rather use a copy-constructor.
Also clean up a couple of weird "do some stuff after the clone"
code into the main copy constructor.
Change-Id: Iefc1481b527602748b5f3abed06e7cca66c0581c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110633
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'reportdesign')
-rw-r--r-- | reportdesign/inc/RptObject.hxx | 8 | ||||
-rw-r--r-- | reportdesign/source/core/sdr/RptObject.cxx | 76 |
2 files changed, 44 insertions, 40 deletions
diff --git a/reportdesign/inc/RptObject.hxx b/reportdesign/inc/RptObject.hxx index fa2c7c3890ed..fe8b49d08738 100644 --- a/reportdesign/inc/RptObject.hxx +++ b/reportdesign/inc/RptObject.hxx @@ -190,8 +190,6 @@ public: virtual OOle2Obj* CloneSdrObject(SdrModel& rTargetModel) const override; virtual void initializeOle() override; - OOle2Obj& operator=(const OOle2Obj& rObj); - void initializeChart( const css::uno::Reference< css::frame::XModel>& _xModel); private: @@ -203,6 +201,8 @@ private: SdrModel& rSdrModel, const OUString& _sComponentName, SdrObjKind _nType); + // copy constructor + OOle2Obj(SdrModel& rSdrModel, const OOle2Obj& rSource); virtual void NbcMove( const Size& rSize ) override; virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override; @@ -241,6 +241,8 @@ protected: const css::uno::Reference< css::report::XReportComponent>& _xComponent, const OUString& rModelName, SdrObjKind _nObjectType); + // copy constructor + OUnoObject(SdrModel& rSdrModel, OUnoObject const & rSource); // protected destructor virtual ~OUnoObject() override; @@ -270,8 +272,6 @@ public: virtual SdrInventor GetObjInventor() const override; virtual OUnoObject* CloneSdrObject(SdrModel& rTargetModel) const override; - OUnoObject& operator=(const OUnoObject& rObj); - private: virtual void impl_setUnoShape( const css::uno::Reference< css::uno::XInterface >& rxUnoShape ) override; void impl_initializeModel_nothrow(); diff --git a/reportdesign/source/core/sdr/RptObject.cxx b/reportdesign/source/core/sdr/RptObject.cxx index b83f742676c6..21395b7c5da7 100644 --- a/reportdesign/source/core/sdr/RptObject.cxx +++ b/reportdesign/source/core/sdr/RptObject.cxx @@ -586,6 +586,22 @@ OUnoObject::OUnoObject( } OUnoObject::OUnoObject( + SdrModel& rSdrModel, OUnoObject const & rSource) +: SdrUnoObj(rSdrModel, rSource.getUnoControlModelTypeName()) + ,OObjectBase(rSource.getServiceName()) + ,m_nObjectType(rSource.m_nObjectType) + // tdf#119067 + ,m_bSetDefaultLabel(rSource.m_bSetDefaultLabel) +{ + if ( !rSource.getUnoControlModelTypeName().isEmpty() ) + impl_initializeModel_nothrow(); + Reference<XPropertySet> xSource(const_cast<OUnoObject&>(rSource).getUnoShape(), uno::UNO_QUERY); + Reference<XPropertySet> xDest(getUnoShape(), uno::UNO_QUERY); + if ( xSource.is() && xDest.is() ) + comphelper::copyProperties(xSource.get(), xDest.get()); +} + +OUnoObject::OUnoObject( SdrModel& rSdrModel, const uno::Reference< report::XReportComponent>& _xComponent, const OUString& rModelName, @@ -886,21 +902,7 @@ void OUnoObject::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUn OUnoObject* OUnoObject::CloneSdrObject(SdrModel& rTargetModel) const { - return CloneHelper< OUnoObject >(rTargetModel); -} - -OUnoObject& OUnoObject::operator=(const OUnoObject& rObj) -{ - if( this == &rObj ) - return *this; - SdrUnoObj::operator=(rObj); - - Reference<XPropertySet> xSource(const_cast<OUnoObject&>(rObj).getUnoShape(), uno::UNO_QUERY); - Reference<XPropertySet> xDest(getUnoShape(), uno::UNO_QUERY); - if ( xSource.is() && xDest.is() ) - comphelper::copyProperties(xSource.get(), xDest.get()); - - return *this; + return new OUnoObject(rTargetModel, *this); } // OOle2Obj @@ -929,6 +931,28 @@ OOle2Obj::OOle2Obj( m_bIsListening = true; } +static uno::Reference< chart2::data::XDatabaseDataProvider > lcl_getDataProvider(const uno::Reference < embed::XEmbeddedObject >& _xObj); + +OOle2Obj::OOle2Obj(SdrModel& rSdrModel, OOle2Obj const & rSource) +: SdrOle2Obj(rSdrModel, rSource) + ,OObjectBase(rSource.getServiceName()) + ,m_nType(rSource.m_nType) + ,m_bOnlyOnce(rSource.m_bOnlyOnce) +{ + m_bIsListening = true; + + OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject())); + svt::EmbeddedObjectRef::TryRunningState( GetObjRef() ); + impl_createDataProvider_nothrow(rRptModel.getReportDefinition().get()); + + uno::Reference< chart2::data::XDatabaseDataProvider > xSource( lcl_getDataProvider(rSource.GetObjRef()) ); + uno::Reference< chart2::data::XDatabaseDataProvider > xDest( lcl_getDataProvider(GetObjRef()) ); + if ( xSource.is() && xDest.is() ) + comphelper::copyProperties(xSource.get(),xDest.get()); + + initializeChart(rRptModel.getReportDefinition().get()); +} + OOle2Obj::~OOle2Obj() { } @@ -1092,27 +1116,7 @@ static uno::Reference< chart2::data::XDatabaseDataProvider > lcl_getDataProvider // Clone() should make a complete copy of the object. OOle2Obj* OOle2Obj::CloneSdrObject(SdrModel& rTargetModel) const { - return CloneHelper< OOle2Obj >(rTargetModel); -} - -OOle2Obj& OOle2Obj::operator=(const OOle2Obj& rObj) -{ - if( this == &rObj ) - return *this; - SdrOle2Obj::operator=(rObj); - - OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject())); - svt::EmbeddedObjectRef::TryRunningState( GetObjRef() ); - impl_createDataProvider_nothrow(rRptModel.getReportDefinition().get()); - - uno::Reference< chart2::data::XDatabaseDataProvider > xSource( lcl_getDataProvider(rObj.GetObjRef()) ); - uno::Reference< chart2::data::XDatabaseDataProvider > xDest( lcl_getDataProvider(GetObjRef()) ); - if ( xSource.is() && xDest.is() ) - comphelper::copyProperties(xSource.get(),xDest.get()); - - initializeChart(rRptModel.getReportDefinition().get()); - - return *this; + return new OOle2Obj(rTargetModel, *this); } void OOle2Obj::impl_createDataProvider_nothrow(const uno::Reference< frame::XModel>& _xModel) |