diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2024-01-02 15:29:52 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2024-01-02 09:56:55 +0100 |
commit | 548f0b1883e18ff2870a40bccf047864ff35c18b (patch) | |
tree | 6b2115305cbb622a9d8f200ca4be520657263561 /editeng | |
parent | 14e49062012f8699125422cc8a82a22b26f43143 (diff) |
editeng: preserve ContentNode in a unique_ptr when moving paras
When we move the paragraphs, we can just take the unique_ptr of
ContetNodes out of the EditDoc and move it to new position inside
EditDoc, like it is done for ParaPortions in ParaPortionList.
No need to muck with the raw pointers and releasing the ContentNode
from a unique_ptr and later moving it back again.
Also just use a std::vector for ParaPortions instead of a new
instance of ParaPortionList.
Change-Id: I8634ccc83121c1ee683be4c2cfb0cedbd469c05d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161531
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/editeng/impedit2.cxx | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index 78a56dc926bc..6e9351a7c80e 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -2199,36 +2199,42 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_Int32 n // do not lose sight of the Position ! ParaPortion* pDestPortion = GetParaPortions().SafeGetObject( nNewPos ); - ParaPortionList aTmpPortionList; + // Temporary containers used for moving the paragraph portions and content nodes to a new location + std::vector<std::unique_ptr<ParaPortion>> aParagraphPortionVector; + std::vector<std::unique_ptr<ContentNode>> aContentNodeVector; + + // Take the paragraph portions and content nodes out of its containers for (tools::Long i = aOldPositions.Min(); i <= aOldPositions.Max(); i++ ) { - // always aOldPositions.Min(), since Remove(). - std::unique_ptr<ParaPortion> pTmpPortion = GetParaPortions().Release(aOldPositions.Min()); - auto pContentNode = maEditDoc.Release(aOldPositions.Min()); - pContentNode.release(); - aTmpPortionList.Append(std::move(pTmpPortion)); + // always aOldPositions.Min() as the index, since we remove and the elements from the containers and the + // other elements shift to the left. + std::unique_ptr<ParaPortion> pPortion = GetParaPortions().Release(aOldPositions.Min()); + aParagraphPortionVector.push_back(std::move(pPortion)); + + std::unique_ptr<ContentNode> pContentNode = maEditDoc.Release(aOldPositions.Min()); + aContentNodeVector.push_back(std::move(pContentNode)); } + // Determine the new location for paragraphs sal_Int32 nRealNewPos = pDestPortion ? GetParaPortions().GetPos( pDestPortion ) : GetParaPortions().Count(); assert( nRealNewPos != EE_PARA_NOT_FOUND && "ImpMoveParagraphs: Invalid Position!" ); + // Add the paragraph portions and content nodes to a new position sal_Int32 i = 0; - while( aTmpPortionList.Count() > 0 ) + for (auto& pPortion : aParagraphPortionVector) { - std::unique_ptr<ParaPortion> pTmpPortion = aTmpPortionList.Release(0); - if ( i == 0 ) - aSelection.Min().SetNode( pTmpPortion->GetNode() ); - - aSelection.Max().SetNode( pTmpPortion->GetNode() ); - aSelection.Max().SetIndex( pTmpPortion->GetNode()->Len() ); + if (i == 0) + aSelection.Min().SetNode(pPortion->GetNode()); + aSelection.Max().SetNode(pPortion->GetNode()); + aSelection.Max().SetIndex(pPortion->GetNode()->Len()); - ContentNode* pNode = pTmpPortion->GetNode(); - maEditDoc.Insert(nRealNewPos+i, std::unique_ptr<ContentNode>(pNode)); + maEditDoc.Insert(nRealNewPos + i, std::move(aContentNodeVector[i])); + GetParaPortions().Insert(nRealNewPos + i, std::move(pPortion)); - GetParaPortions().Insert(nRealNewPos+i, std::move(pTmpPortion)); ++i; } + // Signal end of paragraph moving maEndMovingParagraphsHdl.Call( aMoveParagraphsInfo ); if ( GetNotifyHdl().IsSet() ) |