From 8611f6e259b807b4f19c8dc0eab86ca648891ce3 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Thu, 27 May 2021 10:27:46 +0200 Subject: ref-count SdrObject Which means we can get rid of the majestic hack of ScCaptionPtr Previously, SdrObject was manually managed, and the ownership passed around in very complicated fashion. Notes: (*) SvxShape has a strong reference to SdrObject, where previously it had a weak reference. It is now strong since otherwise the SdrObject will go away very eagerly. (*) SdrObject still has a weak reference to SvxShape (*) In the existing places that an SdrObject is being deleted, we now just clear the reference (*) instead of SwVirtFlyDrawObj removing itself from the page that contains inside it's destructor, make the call site do the removing from the page. (*) Needed to take the SolarMutex in UndoManagerHelper_Impl::impl_clear because this can be called from UNO (e.g. sfx2_complex JUnit test) and the SdrObjects need the SolarMutex when destructing. (*) handle a tricky situation with SwDrawVirtObj in the SwDrawModel destructor because the existing code wants mpDrawObj in SwAnchoredObject to be sometimes owning, sometimes not, which results in a cycle with the new code. Change-Id: I4d79df1660e386388e5d51030653755bca02a163 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138837 Tested-by: Jenkins Reviewed-by: Noel Grandin --- basctl/source/dlged/dlged.cxx | 30 +++++++++++++++--------------- basctl/source/dlged/dlgedfac.cxx | 20 ++++++++++---------- basctl/source/dlged/dlgedobj.cxx | 10 ++++------ basctl/source/inc/dlged.hxx | 2 +- basctl/source/inc/dlgedfac.hxx | 2 +- basctl/source/inc/dlgedobj.hxx | 8 ++++---- 6 files changed, 35 insertions(+), 37 deletions(-) (limited to 'basctl') diff --git a/basctl/source/dlged/dlged.cxx b/basctl/source/dlged/dlged.cxx index d0ac5611566c..306555489df5 100644 --- a/basctl/source/dlged/dlged.cxx +++ b/basctl/source/dlged/dlged.cxx @@ -342,8 +342,8 @@ void DlgEditor::SetDialog( const uno::Reference< container::XNameContainer >& xU pDlgEdForm = new DlgEdForm(*pDlgEdModel, *this); uno::Reference< awt::XControlModel > xDlgMod( m_xUnoControlDialogModel , uno::UNO_QUERY ); pDlgEdForm->SetUnoControlModel(xDlgMod); - static_cast(pDlgEdModel->GetPage(0))->SetDlgEdForm( pDlgEdForm ); - pDlgEdModel->GetPage(0)->InsertObject( pDlgEdForm ); + static_cast(pDlgEdModel->GetPage(0))->SetDlgEdForm( pDlgEdForm.get() ); + pDlgEdModel->GetPage(0)->InsertObject( pDlgEdForm.get() ); AdjustPageSize(); pDlgEdForm->SetRectFromProps(); pDlgEdForm->UpdateTabIndices(); // for backward compatibility @@ -382,11 +382,11 @@ void DlgEditor::SetDialog( const uno::Reference< container::XNameContainer >& xU Any aCtrl = m_xUnoControlDialogModel->getByName( indexToName.second ); Reference< css::awt::XControlModel > xCtrlModel; aCtrl >>= xCtrlModel; - DlgEdObj* pCtrlObj = new DlgEdObj(*pDlgEdModel); + rtl::Reference pCtrlObj = new DlgEdObj(*pDlgEdModel); pCtrlObj->SetUnoControlModel( xCtrlModel ); - pCtrlObj->SetDlgEdForm( pDlgEdForm ); - pDlgEdForm->AddChild( pCtrlObj ); - pDlgEdModel->GetPage(0)->InsertObject( pCtrlObj ); + pCtrlObj->SetDlgEdForm( pDlgEdForm.get() ); + pDlgEdForm->AddChild( pCtrlObj.get() ); + pDlgEdModel->GetPage(0)->InsertObject( pCtrlObj.get() ); pCtrlObj->SetRectFromProps(); pCtrlObj->UpdateStep(); pCtrlObj->StartListening(); @@ -400,7 +400,7 @@ void DlgEditor::SetDialog( const uno::Reference< container::XNameContainer >& xU void DlgEditor::ResetDialog () { - DlgEdForm* pOldDlgEdForm = pDlgEdForm; + DlgEdForm* pOldDlgEdForm = pDlgEdForm.get(); DlgEdPage* pPage = static_cast(pDlgEdModel->GetPage(0)); SdrPageView* pPgView = pDlgEdView->GetSdrPageView(); bool bWasMarked = pDlgEdView->IsObjMarked( pOldDlgEdForm ); @@ -412,7 +412,7 @@ void DlgEditor::ResetDialog () pPage->SetDlgEdForm( nullptr ); SetDialog( m_xUnoControlDialogModel ); if( bWasMarked ) - pDlgEdView->MarkObj( pDlgEdForm, pPgView ); + pDlgEdView->MarkObj( pDlgEdForm.get(), pPgView ); } @@ -603,12 +603,12 @@ void DlgEditor::SetInsertObj(SdrObjKind eObj) void DlgEditor::CreateDefaultObject() { // create object by factory - SdrObject* pObj = SdrObjFactory::MakeNewObject( + rtl::Reference pObj = SdrObjFactory::MakeNewObject( *pDlgEdModel, pDlgEdView->GetCurrentObjInventor(), pDlgEdView->GetCurrentObjIdentifier()); - DlgEdObj* pDlgEdObj = dynamic_cast(pObj); + DlgEdObj* pDlgEdObj = dynamic_cast(pObj.get()); if (!pDlgEdObj) return; @@ -914,9 +914,9 @@ void DlgEditor::Paste() Reference< util::XCloneable > xClone( xCM, uno::UNO_QUERY ); Reference< awt::XControlModel > xCtrlModel( xClone->createClone(), uno::UNO_QUERY ); - DlgEdObj* pCtrlObj = new DlgEdObj(*pDlgEdModel); - pCtrlObj->SetDlgEdForm(pDlgEdForm); // set parent form - pDlgEdForm->AddChild(pCtrlObj); // add child to parent form + rtl::Reference pCtrlObj = new DlgEdObj(*pDlgEdModel); + pCtrlObj->SetDlgEdForm(pDlgEdForm.get()); // set parent form + pDlgEdForm->AddChild(pCtrlObj.get()); // add child to parent form pCtrlObj->SetUnoControlModel( xCtrlModel ); // set control model // set new name @@ -950,7 +950,7 @@ void DlgEditor::Paste() m_xUnoControlDialogModel->insertByName( aOUniqueName , aCtrlModel ); // insert object into drawing page - pDlgEdModel->GetPage(0)->InsertObject( pCtrlObj ); + pDlgEdModel->GetPage(0)->InsertObject( pCtrlObj.get() ); pCtrlObj->SetRectFromProps(); pCtrlObj->UpdateStep(); pDlgEdForm->UpdateTabOrderAndGroups(); @@ -958,7 +958,7 @@ void DlgEditor::Paste() // mark object SdrPageView* pPgView = pDlgEdView->GetSdrPageView(); - pDlgEdView->MarkObj( pCtrlObj, pPgView, false, true); + pDlgEdView->MarkObj( pCtrlObj.get(), pPgView, false, true); } // center marked objects in dialog editor form diff --git a/basctl/source/dlged/dlgedfac.cxx b/basctl/source/dlged/dlgedfac.cxx index 03713c2b94ee..eed140560534 100644 --- a/basctl/source/dlged/dlgedfac.cxx +++ b/basctl/source/dlged/dlgedfac.cxx @@ -45,7 +45,7 @@ DlgEdFactory::~DlgEdFactory() COVERITY_NOEXCEPT_FALSE } -IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) +IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, rtl::Reference ) { static const uno::Reference xDialogSFact = [] { uno::Reference xFact; @@ -59,7 +59,7 @@ IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) return xFact; }(); - SdrObject* pNewObj = nullptr; + rtl::Reference pNewObj; if( (aParams.nInventor == SdrInventor::BasicDialog) && (aParams.nObjIdentifier >= SdrObjKind::BasicDialogPushButton) && (aParams.nObjIdentifier <= SdrObjKind::BasicDialogFormHorizontalScroll) ) @@ -74,26 +74,26 @@ IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) break; case SdrObjKind::BasicDialogFormRadio: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.form.component.RadioButton", xDialogSFact ); - static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); + static_cast< DlgEdObj* >( pNewObj.get() )->MakeDataAware( mxModel ); break; case SdrObjKind::BasicDialogCheckbox: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.UnoControlCheckBoxModel", xDialogSFact ); break; case SdrObjKind::BasicDialogFormCheck: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.form.component.CheckBox", xDialogSFact ); - static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); + static_cast< DlgEdObj* >( pNewObj.get() )->MakeDataAware( mxModel ); break; case SdrObjKind::BasicDialogListbox: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.UnoControlListBoxModel", xDialogSFact ); break; case SdrObjKind::BasicDialogFormList: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.form.component.ListBox", xDialogSFact ); - static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); + static_cast< DlgEdObj* >( pNewObj.get() )->MakeDataAware( mxModel ); break; case SdrObjKind::BasicDialogFormCombo: case SdrObjKind::BasicDialogCombobox: { - DlgEdObj* pNew = nullptr; + rtl::Reference pNew; if ( aParams.nObjIdentifier == SdrObjKind::BasicDialogCombobox ) pNew = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.UnoControlComboBoxModel", xDialogSFact ); else @@ -135,12 +135,12 @@ IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) break; case SdrObjKind::BasicDialogFormHorizontalScroll: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.form.component.ScrollBar", xDialogSFact ); - static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); + static_cast< DlgEdObj* >( pNewObj.get() )->MakeDataAware( mxModel ); break; case SdrObjKind::BasicDialogFormVerticalScroll: case SdrObjKind::BasicDialogVerticalScrollbar: { - DlgEdObj* pNew = nullptr; + rtl::Reference pNew; if ( aParams.nObjIdentifier == SdrObjKind::BasicDialogVerticalScrollbar ) pNew = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.UnoControlScrollBarModel", xDialogSFact ); else @@ -167,7 +167,7 @@ IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) break; case SdrObjKind::BasicDialogVerticalFixedLine: { - DlgEdObj* pNew = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.UnoControlFixedLineModel", xDialogSFact ); + rtl::Reference pNew = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.UnoControlFixedLineModel", xDialogSFact ); pNewObj = pNew; // set vertical orientation try @@ -208,7 +208,7 @@ IMPL_LINK( DlgEdFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject* ) break; case SdrObjKind::BasicDialogFormSpin: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.form.component.SpinButton", xDialogSFact ); - static_cast< DlgEdObj* >( pNewObj )->MakeDataAware( mxModel ); + static_cast< DlgEdObj* >( pNewObj.get() )->MakeDataAware( mxModel ); break; case SdrObjKind::BasicDialogTreeControl: pNewObj = new DlgEdObj(aParams.rSdrModel, "com.sun.star.awt.tree.TreeControlModel", xDialogSFact ); diff --git a/basctl/source/dlged/dlgedobj.cxx b/basctl/source/dlged/dlgedobj.cxx index 1d89210b7dd5..3e06307941da 100644 --- a/basctl/source/dlged/dlgedobj.cxx +++ b/basctl/source/dlged/dlgedobj.cxx @@ -70,7 +70,6 @@ DlgEditor& DlgEdObj::GetDialogEditor () DlgEdObj::DlgEdObj(SdrModel& rSdrModel) : SdrUnoObj(rSdrModel, OUString()) ,bIsListening(false) - ,pDlgEdForm( nullptr ) { } @@ -118,7 +117,6 @@ DlgEdObj::DlgEdObj( const css::uno::Reference< css::lang::XMultiServiceFactory >& rxSFac) : SdrUnoObj(rSdrModel, rModelName, rxSFac) ,bIsListening(false) - ,pDlgEdForm( nullptr ) { } @@ -906,16 +904,16 @@ SdrObjKind DlgEdObj::GetObjIdentifier() const } } -DlgEdObj* DlgEdObj::CloneSdrObject(SdrModel& rTargetModel) const +rtl::Reference DlgEdObj::CloneSdrObject(SdrModel& rTargetModel) const { return new DlgEdObj(rTargetModel, *this); } -SdrObjectUniquePtr DlgEdObj::getFullDragClone() const +rtl::Reference DlgEdObj::getFullDragClone() const { // no need to really add the clone for dragging, it's a temporary // object - return SdrObjectUniquePtr(new SdrUnoObj(getSdrModelFromSdrObject(), *this)); + return rtl::Reference(new SdrUnoObj(getSdrModelFromSdrObject(), *this)); } void DlgEdObj::NbcMove( const Size& rSize ) @@ -961,7 +959,7 @@ bool DlgEdObj::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd) // implementation. For historical reasons, the SdrPage (which is the DlgEdPage) was // already set. For now, get it from the SdrDragStat and use it to access and set // the local pDlgEdForm - if(nullptr == pDlgEdForm && nullptr != rStat.GetPageView()) + if(!pDlgEdForm && nullptr != rStat.GetPageView()) { const DlgEdPage* pDlgEdPage(dynamic_cast(rStat.GetPageView()->GetPage())); diff --git a/basctl/source/inc/dlged.hxx b/basctl/source/inc/dlged.hxx index 0d1c461ad106..c50faf51b36c 100644 --- a/basctl/source/inc/dlged.hxx +++ b/basctl/source/inc/dlged.hxx @@ -112,7 +112,7 @@ private: std::unique_ptr pDlgEdModel; // never nullptr DlgEdPage* pDlgEdPage; // never nullptr std::unique_ptr pDlgEdView; // never nullptr - DlgEdForm* pDlgEdForm; // never nullptr + rtl::Reference pDlgEdForm; // never nullptr css::uno::Reference< css::container::XNameContainer > m_xUnoControlDialogModel; css::uno::Reference< css::awt::XControlContainer > m_xControlContainer; css::uno::Sequence< css::datatransfer::DataFlavor > m_ClipboardDataFlavors; diff --git a/basctl/source/inc/dlgedfac.hxx b/basctl/source/inc/dlgedfac.hxx index f200b01f84c9..5e583ada1729 100644 --- a/basctl/source/inc/dlgedfac.hxx +++ b/basctl/source/inc/dlgedfac.hxx @@ -35,7 +35,7 @@ public: DlgEdFactory(css::uno::Reference xModel); ~DlgEdFactory() COVERITY_NOEXCEPT_FALSE; - DECL_LINK(MakeObject, SdrObjCreatorParams, SdrObject*); + DECL_LINK(MakeObject, SdrObjCreatorParams, rtl::Reference); }; } // namespace basctl diff --git a/basctl/source/inc/dlgedobj.hxx b/basctl/source/inc/dlgedobj.hxx index d5e29cf48caf..a8c249adec16 100644 --- a/basctl/source/inc/dlgedobj.hxx +++ b/basctl/source/inc/dlgedobj.hxx @@ -50,7 +50,7 @@ class DlgEdObj: public SdrUnoObj private: bool bIsListening; - DlgEdForm* pDlgEdForm; + rtl::Reference pDlgEdForm; css::uno::Reference< css::beans::XPropertyChangeListener> m_xPropertyChangeListener; css::uno::Reference< css::container::XContainerListener> m_xContainerListener; @@ -94,15 +94,15 @@ protected: public: void SetDlgEdForm( DlgEdForm* pForm ) { pDlgEdForm = pForm; } - DlgEdForm* GetDlgEdForm() const { return pDlgEdForm; } + DlgEdForm* GetDlgEdForm() const { return pDlgEdForm.get(); } virtual SdrInventor GetObjInventor() const override; virtual SdrObjKind GetObjIdentifier() const override; - virtual DlgEdObj* CloneSdrObject(SdrModel& rTargetModel) const override; // not working yet + virtual rtl::Reference CloneSdrObject(SdrModel& rTargetModel) const override; // not working yet // FullDrag support - virtual SdrObjectUniquePtr getFullDragClone() const override; + virtual rtl::Reference getFullDragClone() const override; bool supportsService( OUString const & serviceName ) const; OUString GetDefaultName() const; -- cgit