summaryrefslogtreecommitdiff
path: root/reportdesign
diff options
context:
space:
mode:
authorNoel <noel.grandin@collabora.co.uk>2021-02-09 13:42:22 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-02-10 07:35:41 +0100
commit09cb778b6eb7d3a5b9029965a1320b49c90e7295 (patch)
tree63d75bc66ddbe4af5f6a52f4a0d65e9b199dbae7 /reportdesign
parentccdee8eebaa56619248e35001017226eecfe4e83 (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.hxx8
-rw-r--r--reportdesign/source/core/sdr/RptObject.cxx76
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)