From a9bba3827888b290c435a3b0e5cdf50846d08bd2 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Thu, 22 Jul 2021 11:02:30 +0300 Subject: Simplify EditTextObject's pool initialization Old scheme (ever since commit fd069bee7e57ad529c3c0974559fd2d84ec3151a "initial import") was that when source EditTextObject was owner of the pool, the copy created a new pool; and when source was not owner, the copy just re-used existing pool. It made no sense since commit 1545949690c750d7b512000723b564e69cf3c3a6 where pools were made ref-counted using rtl::Reference. This also simplifies the only place which used the EditTextObject ctor taking pool by making the related ctor to take all necessary arguments instead of calling setters after constructing the object, which allows to drop a couple of setters. Change-Id: I843e154dd57f33f7c037063b4a0fcc0ac5a33cd2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119358 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- editeng/source/editeng/editobj.cxx | 81 ++++++++++--------------------------- editeng/source/editeng/editobj2.hxx | 8 +--- editeng/source/editeng/impedit4.cxx | 13 ++---- 3 files changed, 27 insertions(+), 75 deletions(-) diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx index 9f8cc2cb76df..5f14386c4ccb 100644 --- a/editeng/source/editeng/editobj.cxx +++ b/editeng/source/editeng/editobj.cxx @@ -254,51 +254,36 @@ void EditTextObjectImpl::Dump() const } #endif -static EditEngineItemPool* getEditEngineItemPool(SfxItemPool* pPool) +static rtl::Reference getEditEngineItemPool(SfxItemPool* pPool, MapUnit eDefaultMetric) { - EditEngineItemPool* pRetval = dynamic_cast< EditEngineItemPool* >(pPool); - - while(!pRetval && pPool && pPool->GetSecondaryPool()) - { - pPool = pPool->GetSecondaryPool(); - - if(pPool) - { - pRetval = dynamic_cast< EditEngineItemPool* >(pPool); - } - } - - return pRetval; -} - -EditTextObjectImpl::EditTextObjectImpl( SfxItemPool* pP ) - : meUserType(OutlinerMode::DontKnow) - , meScriptType(SvtScriptType::NONE) - , meRotation(TextRotation::NONE) - , meMetric(MapUnit::LASTENUMDUMMY) - , mbVertical(false) -{ - // #i101239# ensure target is an EditEngineItemPool, else - // fallback to pool ownership. This is needed to ensure that at + // #i101239# ensure target is an EditEngineItemPool, so that at // pool destruction time of an alien pool, the pool is still alive. // When registering would happen at an alien pool which just uses an // EditEngineItemPool as some sub-pool, that pool could already // be decoupled and deleted which would lead to crashes. - mpPool = getEditEngineItemPool(pP); + for (; pPool; pPool = pPool->GetSecondaryPool()) + if (dynamic_cast(pPool)) + return pPool; - if ( mpPool ) - { - mbOwnerOfPool = false; - } - else - { - mpPool = EditEngine::CreatePool(); - mbOwnerOfPool = true; - } + auto pRetval = EditEngine::CreatePool(); + pRetval->SetDefaultMetric(eDefaultMetric); + return pRetval; +} + +EditTextObjectImpl::EditTextObjectImpl(SfxItemPool* pP, MapUnit eDefaultMetric, bool bVertical, + TextRotation eRotation, SvtScriptType eScriptType) + : mpPool(getEditEngineItemPool(pP, eDefaultMetric)) + , meUserType(OutlinerMode::DontKnow) + , meScriptType(eScriptType) + , meRotation(eRotation) + , meMetric(eDefaultMetric) + , mbVertical(bVertical) +{ } EditTextObjectImpl::EditTextObjectImpl( const EditTextObjectImpl& r ) - : meUserType(r.meUserType) + : mpPool(r.mpPool) + , meUserType(r.meUserType) , meScriptType(r.meScriptType) , meRotation(r.meRotation) , meMetric(r.meMetric) @@ -306,24 +291,6 @@ EditTextObjectImpl::EditTextObjectImpl( const EditTextObjectImpl& r ) { // Do not copy PortionInfo - if ( !r.mbOwnerOfPool ) - { - // reuse alien pool; this must be an EditEngineItemPool - // since there is no other way to construct an EditTextObject - // than it's regular constructor where that is ensured - mpPool = r.mpPool; - mbOwnerOfPool = false; - } - else - { - mpPool = EditEngine::CreatePool(); - mbOwnerOfPool = true; - - } - - if (mbOwnerOfPool && r.mpPool) - mpPool->SetDefaultMetric( r.mpPool->GetMetric( DEF_METRIC ) ); - maContents.reserve(r.maContents.size()); for (auto const& content : r.maContents) maContents.push_back(std::unique_ptr(new ContentInfo(*content, *mpPool))); @@ -405,12 +372,6 @@ TextRotation EditTextObjectImpl::GetRotation() const return meRotation; } - -void EditTextObjectImpl::SetScriptType( SvtScriptType nType ) -{ - meScriptType = nType; -} - XEditAttribute EditTextObjectImpl::CreateAttrib( const SfxPoolItem& rItem, sal_Int32 nStart, sal_Int32 nEnd ) { return MakeXEditAttribute( *mpPool, rItem, nStart, nEnd ); diff --git a/editeng/source/editeng/editobj2.hxx b/editeng/source/editeng/editobj2.hxx index a6f2b1be0d6d..818ea0fbaf75 100644 --- a/editeng/source/editeng/editobj2.hxx +++ b/editeng/source/editeng/editobj2.hxx @@ -180,14 +180,14 @@ private: TextRotation meRotation; MapUnit meMetric; - bool mbOwnerOfPool; bool mbVertical; bool ImpChangeStyleSheets( std::u16string_view rOldName, SfxStyleFamily eOldFamily, const OUString& rNewName, SfxStyleFamily eNewFamily ); public: - EditTextObjectImpl( SfxItemPool* pPool ); + EditTextObjectImpl(SfxItemPool* pPool, MapUnit eDefaultMetric, bool bVertical, + TextRotation eRotation, SvtScriptType eScriptType); EditTextObjectImpl( const EditTextObjectImpl& r ); virtual ~EditTextObjectImpl() override; @@ -207,7 +207,6 @@ public: virtual TextRotation GetRotation() const override; virtual SvtScriptType GetScriptType() const override { return meScriptType;} - void SetScriptType( SvtScriptType nType ); virtual std::unique_ptr Clone() const override; @@ -254,9 +253,6 @@ public: bool HasMetric() const { return meMetric != MapUnit::LASTENUMDUMMY; } MapUnit GetMetric() const { return meMetric; } - void SetMetric( MapUnit n ) { meMetric = n; } - - bool IsOwnerOfPool() const { return mbOwnerOfPool; } virtual bool operator==( const EditTextObject& rCompare ) const override; bool Equals( const EditTextObjectImpl& rCompare, bool bComparePool ) const; diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index 1786b3215d88..de36a316de83 100644 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -989,14 +989,6 @@ std::unique_ptr ImpEditEngine::CreateTextObject(const EditSelect std::unique_ptr ImpEditEngine::CreateTextObject( EditSelection aSel, SfxItemPool* pPool, bool bAllowBigObjects, sal_Int32 nBigObjectStart ) { - std::unique_ptr pTxtObj(std::make_unique(pPool)); - pTxtObj->SetVertical( GetVertical() ); - pTxtObj->SetRotation( GetRotation() ); - MapUnit eMapUnit = aEditDoc.GetItemPool().GetMetric( DEF_METRIC ); - pTxtObj->SetMetric( eMapUnit ); - if ( pTxtObj->IsOwnerOfPool() ) - pTxtObj->GetPool()->SetDefaultMetric( eMapUnit ); - sal_Int32 nStartNode, nEndNode; sal_Int32 nTextPortions = 0; @@ -1009,7 +1001,10 @@ std::unique_ptr ImpEditEngine::CreateTextObject( EditSelection a // Templates are not saved! // (Only the name and family, template itself must be in App!) - pTxtObj->SetScriptType(GetItemScriptType(aSel)); + + const MapUnit eMapUnit = aEditDoc.GetItemPool().GetMetric(DEF_METRIC); + auto pTxtObj(std::make_unique(pPool, eMapUnit, GetVertical(), GetRotation(), + GetItemScriptType(aSel))); // iterate over the paragraphs ... sal_Int32 nNode; -- cgit