From 0f9fd7ec1991f8ad2a9834891f1d5aa49ceca7f2 Mon Sep 17 00:00:00 2001 From: Armin Le Grand Date: Fri, 27 Jul 2018 13:38:46 +0200 Subject: tdf#118963 Hand over a SdrModel to createControlLabelPair MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I34a35ff0700d14474fa9946851812c25c4eb4bc1 Reviewed-on: https://gerrit.libreoffice.org/58187 Tested-by: Jenkins Reviewed-by: Armin Le Grand (cherry picked from commit e5ee79b5c089e72e6b24c04c7c820d706bd39993) Reviewed-on: https://gerrit.libreoffice.org/61316 Reviewed-by: Thorsten Behrens Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara (cherry picked from commit 2cf13c31c6aa262e4bb4b075597f3543ecd3c4a6) Reviewed-on: https://gerrit.libreoffice.org/61936 Tested-by: Xisco Faulí Reviewed-by: Michael Stahl --- include/svx/fmview.hxx | 6 ++- reportdesign/source/ui/report/ReportController.cxx | 51 +++++++++++++++++----- svx/source/form/fmview.cxx | 4 +- svx/source/form/fmvwimp.cxx | 32 +++++++++++--- svx/source/inc/fmvwimp.hxx | 6 ++- 5 files changed, 78 insertions(+), 21 deletions(-) diff --git a/include/svx/fmview.hxx b/include/svx/fmview.hxx index c47267f6a968..90125b46f5b0 100644 --- a/include/svx/fmview.hxx +++ b/include/svx/fmview.hxx @@ -97,7 +97,11 @@ public: sal_uInt16 _nLabelObjectID, SdrPage* _pLabelPage, SdrPage* _pControlPage, - SdrModel* _pModel, + + // tdf#118963 Need a SdrModel for SdrObject creation. To make the + // demand clear, hand over a SdrMldel& + SdrModel& _rModel, + SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl ); diff --git a/reportdesign/source/ui/report/ReportController.cxx b/reportdesign/source/ui/report/ReportController.cxx index ab76f3f14616..5a6fa67586df 100644 --- a/reportdesign/source/ui/report/ReportController.cxx +++ b/reportdesign/source/ui/report/ReportController.cxx @@ -3137,11 +3137,26 @@ void OReportController::createControl(const Sequence< PropertyValue >& _aArgs,co { SdrUnoObj* pLabel( nullptr ); SdrUnoObj* pControl( nullptr ); - FmFormView::createControlLabelPair( getDesignView() - ,nLeftMargin,0 - ,nullptr,nullptr,_nObjectId,SdrInventor::ReportDesign,OBJ_DLG_FIXEDTEXT, - nullptr,pSectionWindow->getReportSection().getPage(),m_aReportModel.get(), - pLabel,pControl); + + FmFormView::createControlLabelPair( + getDesignView(), + nLeftMargin, + 0, + nullptr, + nullptr, + _nObjectId, + SdrInventor::ReportDesign, + OBJ_DLG_FIXEDTEXT, + nullptr, + pSectionWindow->getReportSection().getPage(), + + // tdf#118963 Need a SdrModel for SdrObject creation. Dereferencing + // m_aReportModel seems pretty safe, it's done in other places, initialized + // in impl_initialize and throws a RuntimeException if not existing. + *m_aReportModel, + + pLabel, + pControl); // always use SdrObject::Free(...) for SdrObjects (!) SdrObject* pTemp(pLabel); @@ -3434,12 +3449,28 @@ void OReportController::addPairControls(const Sequence< PropertyValue >& aArgs) OSectionView* pSectionViews[2]; pSectionViews[0] = &pSectionWindow[1]->getReportSection().getSectionView(); pSectionViews[1] = &pSectionWindow[0]->getReportSection().getSectionView(); + // find this in svx - FmFormView::createControlLabelPair( getDesignView() - ,nLeftMargin,0 - ,xField,xNumberFormats,nOBJID,SdrInventor::ReportDesign,OBJ_DLG_FIXEDTEXT, - pSectionWindow[1]->getReportSection().getPage(),pSectionWindow[0]->getReportSection().getPage(),m_aReportModel.get(), - pControl[0],pControl[1]); + FmFormView::createControlLabelPair( + getDesignView(), + nLeftMargin, + 0, + xField, + xNumberFormats, + nOBJID, + SdrInventor::ReportDesign, + OBJ_DLG_FIXEDTEXT, + pSectionWindow[1]->getReportSection().getPage(), + pSectionWindow[0]->getReportSection().getPage(), + + // tdf#118963 Need a SdrModel for SdrObject creation. Dereferencing + // m_aReportModel seems pretty safe, it's done in other places, initialized + // in impl_initialize and throws a RuntimeException if not existing. + *m_aReportModel, + + pControl[0], + pControl[1]); + if ( pControl[0] && pControl[1] ) { SdrPageView* pPgViews[2]; diff --git a/svx/source/form/fmview.cxx b/svx/source/form/fmview.cxx index 1d9aadc0ab90..15df6aa0adfb 100644 --- a/svx/source/form/fmview.cxx +++ b/svx/source/form/fmview.cxx @@ -566,13 +566,13 @@ FmFormObj* FmFormView::getMarkedGrid() const void FmFormView::createControlLabelPair( OutputDevice const * _pOutDev, sal_Int32 _nXOffsetMM, sal_Int32 _nYOffsetMM, const Reference< XPropertySet >& _rxField, const Reference< XNumberFormats >& _rxNumberFormats, sal_uInt16 _nControlObjectID, SdrInventor _nInventor, sal_uInt16 _nLabelObjectID, - SdrPage* _pLabelPage, SdrPage* _pControlPage, SdrModel* _pModel, SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl ) + SdrPage* _pLabelPage, SdrPage* _pControlPage, SdrModel& _rModel, SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl ) { FmXFormView::createControlLabelPair( *_pOutDev, _nXOffsetMM, _nYOffsetMM, _rxField, _rxNumberFormats, _nControlObjectID, "", _nInventor, _nLabelObjectID, - _pLabelPage, _pControlPage, _pModel, + _pLabelPage, _pControlPage, _rModel, _rpLabel, _rpControl ); } diff --git a/svx/source/form/fmvwimp.cxx b/svx/source/form/fmvwimp.cxx index f31659ea3a40..260892f1d9eb 100644 --- a/svx/source/form/fmvwimp.cxx +++ b/svx/source/form/fmvwimp.cxx @@ -1514,11 +1514,29 @@ bool FmXFormView::createControlLabelPair( OutputDevice const & _rOutDev, sal_Int const Reference< XDataSource >& _rxDataSource, const OUString& _rDataSourceName, const OUString& _rCommand, const sal_Int32 _nCommandType ) { - if ( !createControlLabelPair( _rOutDev, _nXOffsetMM, _nYOffsetMM, - _rxField, _rxNumberFormats, _nControlObjectID, _rFieldPostfix, SdrInventor::FmForm, OBJ_FM_FIXEDTEXT, - nullptr, nullptr, nullptr, _rpLabel, _rpControl ) - ) + if(!createControlLabelPair( + _rOutDev, + _nXOffsetMM, + _nYOffsetMM, + _rxField, + _rxNumberFormats, + _nControlObjectID, + _rFieldPostfix, + SdrInventor::FmForm, + OBJ_FM_FIXEDTEXT, + nullptr, + nullptr, + + // tdf#118963 Hand over a SdrModel to SdrObject-creation. It uses the local m_pView + // and already returning false when nullptr == getView() could be done, but m_pView + // is already dereferenced here in many places (see below), so just use it for now. + getView()->getSdrModelFromSdrView(), + + _rpLabel, + _rpControl)) + { return false; + } // insert the control model(s) into the form component hierarchy if ( _rpLabel ) @@ -1539,7 +1557,7 @@ bool FmXFormView::createControlLabelPair( OutputDevice const & _rOutDev, sal_Int const Reference< XPropertySet >& _rxField, const Reference< XNumberFormats >& _rxNumberFormats, sal_uInt16 _nControlObjectID, const OUString& _rFieldPostfix, SdrInventor _nInventor, sal_uInt16 _nLabelObjectID, - SdrPage* /*_pLabelPage*/, SdrPage* /*_pControlPage*/, SdrModel* _pModel, SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl) + SdrPage* /*_pLabelPage*/, SdrPage* /*_pControlPage*/, SdrModel& _rModel, SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl) { sal_Int32 nDataType = 0; OUString sFieldName; @@ -1582,7 +1600,7 @@ bool FmXFormView::createControlLabelPair( OutputDevice const & _rOutDev, sal_Int { pLabel.reset( dynamic_cast< SdrUnoObj* >( SdrObjFactory::MakeNewObject( - *_pModel, + _rModel, _nInventor, _nLabelObjectID))); @@ -1614,7 +1632,7 @@ bool FmXFormView::createControlLabelPair( OutputDevice const & _rOutDev, sal_Int // the control ::std::unique_ptr< SdrUnoObj, SdrObjectFreeOp > pControl( dynamic_cast< SdrUnoObj* >( SdrObjFactory::MakeNewObject( - *_pModel, + _rModel, _nInventor, _nControlObjectID))); diff --git a/svx/source/inc/fmvwimp.hxx b/svx/source/inc/fmvwimp.hxx index 8e77b3eeb641..5fb1403bec42 100644 --- a/svx/source/inc/fmvwimp.hxx +++ b/svx/source/inc/fmvwimp.hxx @@ -261,7 +261,11 @@ private: sal_uInt16 _nLabelObjectID, SdrPage* _pLabelPage, SdrPage* _pControlPage, - SdrModel* _pModel, + + // tdf#118963 Need a SdrModel for SdrObject creation. To make the + // demand clear, hand over a SdrMldel& + SdrModel& _rModel, + SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl ); -- cgit v1.2.3