editeng/source/editeng/editeng.cxx | 10 - editeng/source/editeng/impedit.cxx | 22 +- editeng/source/editeng/impedit.hxx | 34 +-- editeng/source/editeng/impedit2.cxx | 275 +++++++++++++++---------------- editeng/source/editeng/impedit3.cxx | 317 +++++++++++++++++------------------- include/editeng/editeng.hxx | 6 6 files changed, 321 insertions(+), 343 deletions(-)
New commits: commit 01092e632994a9b73ebcb29a4173d6eec6f1141c Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Jan 14 13:49:48 2024 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun Jan 14 16:06:17 2024 +0100 editeng: change the ParaPortion parameter from pointer to ref. In most cases we expect the ParaPortion pointer to be not-null, so it makes more sense to have the ParaPortion parameter as a ref. and not a raw pointer. Change-Id: I1659a1978e2615982e4ce6bdd99c9d9f3719e7bf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162040 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index d7a30a60b935..300b2fc65a0d 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -865,16 +865,14 @@ EditSelection EditEngine::SelectWord( return pImpEditEngine->SelectWord(rCurSelection, nWordType); } -tools::Long EditEngine::GetXPos( - const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const +tools::Long EditEngine::GetXPos(ParaPortion const& rParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const { - return pImpEditEngine->GetXPos(pParaPortion, rLine, nIndex, bPreferPortionStart); + return pImpEditEngine->GetXPos(rParaPortion, rLine, nIndex, bPreferPortionStart); } -Range EditEngine::GetLineXPosStartEnd( - const ParaPortion* pParaPortion, EditLine const& rLine) const +Range EditEngine::GetLineXPosStartEnd(ParaPortion const& rParaPortion, EditLine const& rLine) const { - return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, rLine); + return pImpEditEngine->GetLineXPosStartEnd(rParaPortion, rLine); } bool EditEngine::IsFormatted() const diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx index c1f20e9e55df..46c9928e300f 100644 --- a/editeng/source/editeng/impedit.cxx +++ b/editeng/source/editeng/impedit.cxx @@ -576,7 +576,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, nEndIndex = nStartIndex; tools::Rectangle aTmpRect(pEditEngine->pImpEditEngine->GetEditCursor( - &rInfo.rPortion, *rInfo.pLine, nStartIndex, GetCursorFlags::NONE)); + rInfo.rPortion, *rInfo.pLine, nStartIndex, GetCursorFlags::NONE)); const Size aLineOffset = pEditEngine->pImpEditEngine->getTopLeftDocOffset(rInfo.aArea); aTmpRect.Move(0, aLineOffset.Height()); @@ -595,7 +595,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, // Now that we have Bidi, the first/last index doesn't have to be the 'most outside' position if (!bPartOfLine) { - Range aLineXPosStartEnd = pEditEngine->GetLineXPosStartEnd(&rInfo.rPortion, *rInfo.pLine); + Range aLineXPosStartEnd = pEditEngine->GetLineXPosStartEnd(rInfo.rPortion, *rInfo.pLine); aTmpRect.SetLeft(aLineXPosStartEnd.Min()); aTmpRect.SetRight(aLineXPosStartEnd.Max()); aTmpRect.Move(aLineOffset.Width(), 0); @@ -616,8 +616,8 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, DBG_ASSERT(nTmpEndIndex > nTmpStartIndex, "DrawSelectionXOR, Start >= End?"); - tools::Long nX1 = pEditEngine->GetXPos(&rInfo.rPortion, *rInfo.pLine, nTmpStartIndex, true); - tools::Long nX2 = pEditEngine->GetXPos(&rInfo.rPortion, *rInfo.pLine, nTmpEndIndex); + tools::Long nX1 = pEditEngine->GetXPos(rInfo.rPortion, *rInfo.pLine, nTmpStartIndex, true); + tools::Long nX2 = pEditEngine->GetXPos(rInfo.rPortion, *rInfo.pLine, nTmpEndIndex); aTmpRect.SetLeft(std::min(nX1, nX2)); aTmpRect.SetRight(std::max(nX1, nX2)); @@ -1103,8 +1103,7 @@ boost::property_tree::ptree getHyperlinkPropTree(const OUString& sText, const OU } // End of anon namespace -tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags nShowCursorFlags, sal_Int32& nTextPortionStart, - const ParaPortion* pParaPortion) const +tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags nShowCursorFlags, sal_Int32& nTextPortionStart, ParaPortion const& rParaPortion) const { tools::Rectangle aEditCursor = pEditEngine->pImpEditEngine->PaMtoEditCursor( aPaM, nShowCursorFlags ); if ( !IsInsertMode() && !aEditSelection.HasRange() ) @@ -1115,8 +1114,8 @@ tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags nS aEditCursor.SetLeft( pEditEngine->pImpEditEngine->PaMtoEditCursor( aPaM, GetCursorFlags::TextOnly|GetCursorFlags::PreferPortionStart ).Left() ); aEditCursor.SetRight( aEditCursor.Left() ); - sal_Int32 nTextPortion = pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, true ); - const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[nTextPortion]; + sal_Int32 nTextPortion = rParaPortion.GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, true ); + const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[nTextPortion]; if ( rTextPortion.GetKind() == PortionKind::TAB ) { aEditCursor.AdjustRight(rTextPortion.GetSize().Width() ); @@ -1163,7 +1162,7 @@ tools::Rectangle ImpEditView::GetEditCursor() const nShowCursorFlags |= GetCursorFlags::PreferPortionStart; } - return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, pParaPortion); + return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, *pParaPortion); } void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor ) @@ -1210,7 +1209,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor ) nShowCursorFlags |= GetCursorFlags::PreferPortionStart; } - tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, pParaPortion); + tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, *pParaPortion); if ( bGotoCursor ) // && (!pEditEngine->pImpEditEngine->GetStatus().AutoPageSize() ) ) { diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 61afaea21b83..75a89f3cb047 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -344,8 +344,7 @@ protected: void HideDDCursor(); void ImplDrawHighlightRect(OutputDevice& rTarget, const Point& rDocPosTopLeft, const Point& rDocPosBottomRight, tools::PolyPolygon* pPolyPoly, bool bLOKCalcRTL); - tools::Rectangle ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags nShowCursorFlags, - sal_Int32& nTextPortionStart, const ParaPortion* pParaPortion) const; + tools::Rectangle ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags nShowCursorFlags, sal_Int32& nTextPortionStart, ParaPortion const& rParaPortion) const; public: ImpEditView( EditView* pView, EditEngine* pEng, vcl::Window* pWindow ); @@ -643,7 +642,7 @@ private: void ParaAttribsChanged( ContentNode const * pNode, bool bIgnoreUndoCheck = false ); void TextModified(); - void CalcHeight( ParaPortion* pPortion ); + void CalcHeight(ParaPortion& rParaPortion); void InsertUndo( std::unique_ptr<EditUndo> pUndo, bool bTryMerge = false ); void ResetUndoManager(); @@ -656,10 +655,10 @@ private: std::tuple<const ParaPortion*, const EditLine*, tools::Long> GetPortionAndLine(Point aDocPos); EditPaM GetPaM( Point aDocPos, bool bSmart = true ); bool IsTextPos(const Point& rDocPos, sal_uInt16 nBorder); - tools::Long GetXPos(const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const; - tools::Long GetPortionXOffset(const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nTextPortion) const; - sal_Int32 GetChar(const ParaPortion* pParaPortion, EditLine const& rLine, tools::Long nX, bool bSmart = true); - Range GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& rLine) const; + tools::Long GetXPos(ParaPortion const& rParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const; + tools::Long GetPortionXOffset(ParaPortion const& rParaPortion, EditLine const& rLine, sal_Int32 nTextPortion) const; + sal_Int32 GetChar(ParaPortion const& rParaPortion, EditLine const& rLine, tools::Long nX, bool bSmart = true); + Range GetLineXPosStartEnd(ParaPortion const& rParaPortion, EditLine const& rLine) const; void ParaAttribsToCharAttribs( ContentNode* pNode ); void GetCharAttribs( sal_Int32 nPara, std::vector<EECharAttrib>& rLst ) const; @@ -678,17 +677,17 @@ private: tools::Long calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem const& rLRItem); bool CreateLines(sal_Int32 nPara, sal_uInt32 nStartPosY); - void CreateAndInsertEmptyLine( ParaPortion* pParaPortion ); - bool FinishCreateLines( ParaPortion* pParaPortion ); - void CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rStartPos /*, sal_Bool bCreateBlockPortions */ ); - void RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 nStartPos, sal_Int32 nNewChars ); - sal_Int32 SplitTextPortion( ParaPortion* pParaPortion, sal_Int32 nPos, EditLine* pCurLine = nullptr ); + void CreateAndInsertEmptyLine(ParaPortion& rParaPortion); + bool FinishCreateLines(ParaPortion& rParaPortion); + void CreateTextPortions(ParaPortion& rParaPortion, sal_Int32& rStartPos); + void RecalcTextPortion(ParaPortion& rParaPortion, sal_Int32 nStartPos, sal_Int32 nNewChars); + sal_Int32 SplitTextPortion(ParaPortion& rParaPortion, sal_Int32 nPos, EditLine* pCurLine = nullptr); void SeekCursor( ContentNode* pNode, sal_Int32 nPos, SvxFont& rFont, OutputDevice* pOut = nullptr ); void RecalcFormatterFontMetrics( FormatterFontMetric& rCurMetrics, SvxFont& rFont ); void CheckAutoPageSize(); - void ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long nRemainingWidth, bool bCanHyphenate ); - void ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& rLine, tools::Long nRemainingSpace ); + void ImpBreakLine(ParaPortion& rParaPortion, EditLine& rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long nRemainingWidth, bool bCanHyphenate); + void ImpAdjustBlocks(ParaPortion& rParaPortion, EditLine& rLine, tools::Long nRemainingSpace ); EditPaM ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pRight, bool bBackward = false ); EditPaM ImpDeleteSelection(const EditSelection& rCurSel); EditPaM ImpInsertParaBreak( EditPaM& rPaM, bool bKeepEndingAttribs = true ); @@ -744,7 +743,7 @@ private: bool ImplCalcAsianCompression( ContentNode* pNode, TextPortion* pTextPortion, sal_Int32 nStartPos, sal_Int32* pDXArray, sal_uInt16 n100thPercentFromMax, bool bManipulateDXArray ); - void ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* pParaPortion, tools::Long nRemainingWidth); + void ImplExpandCompressedPortions(EditLine& rLine, ParaPortion& rParaPortion, tools::Long nRemainingWidth); void ImplInitLayoutMode(OutputDevice& rOutDev, sal_Int32 nPara, sal_Int32 nIndex); static LanguageType ImplCalcDigitLang(LanguageType eCurLang); @@ -1025,7 +1024,7 @@ public: sal_uInt32 GetTextHeightNTP() const; sal_uInt32 CalcTextWidth( bool bIgnoreExtraSpace); sal_uInt32 CalcParaWidth( sal_Int32 nParagraph, bool bIgnoreExtraSpace ); - sal_uInt32 CalcLineWidth( ParaPortion* pPortion, EditLine const& rLine, bool bIgnoreExtraSpace); + sal_uInt32 CalcLineWidth(ParaPortion const& rPortion, EditLine const& rLine, bool bIgnoreExtraSpace); sal_Int32 GetLineCount( sal_Int32 nParagraph ) const; sal_Int32 GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const; void GetLineBoundaries( /*out*/sal_Int32& rStart, /*out*/sal_Int32& rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const; @@ -1052,7 +1051,7 @@ public: } tools::Rectangle PaMtoEditCursor( EditPaM aPaM, GetCursorFlags nFlags = GetCursorFlags::NONE ); - tools::Rectangle GetEditCursor(const ParaPortion* pPortion, EditLine const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags); + tools::Rectangle GetEditCursor(ParaPortion const& rPortion, EditLine const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags); bool IsModified() const { return maEditDoc.IsModified(); } void SetModifyFlag(bool b) { maEditDoc.SetModified( b ); } diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index 065b28e69f18..ccb485789c74 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -578,7 +578,7 @@ bool ImpEditEngine::Command( const CommandEvent& rCEvt, EditView* pView ) { if (rInfo.pLine->IsIn(n)) { - tools::Rectangle aR = GetEditCursor(pParaPortion, *rInfo.pLine, n, GetCursorFlags::NONE); + tools::Rectangle aR = GetEditCursor(*pParaPortion, *rInfo.pLine, n, GetCursorFlags::NONE); aR.Move(getTopLeftDocOffset(rInfo.aArea)); aRects[n - nMinPos] = pView->GetImpEditView()->GetWindowPos(aR); } @@ -790,7 +790,7 @@ void ImpEditEngine::ParaAttribsChanged( ContentNode const * pNode, bool bIgnoreU ParaPortion* pNextPortion = GetParaPortions().SafeGetObject( nPara+1 ); // => is formatted again anyway, if Invalid. if ( pNextPortion && !pNextPortion->IsInvalid() ) - CalcHeight( pNextPortion ); + CalcHeight(*pNextPortion); } @@ -1274,7 +1274,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView ) tools::Long nX; if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW ) { - nX = GetXPos(pPPortion, rLine, rPaM.GetIndex()); + nX = GetXPos(*pPPortion, rLine, rPaM.GetIndex()); pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef; } else @@ -1284,7 +1284,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView ) if ( nLine ) // same paragraph { const EditLine& rPrevLine = pPPortion->GetLines()[nLine-1]; - aNewPaM.SetIndex(GetChar(pPPortion, rPrevLine, nX)); + aNewPaM.SetIndex(GetChar(*pPPortion, rPrevLine, nX)); // If a previous automatically wrapped line, and one has to be exactly // at the end of this line, the cursor lands on the current line at the // beginning. See Problem: Last character of an automatically wrapped @@ -1299,7 +1299,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView ) { const EditLine& rLine2 = pPrevPortion->GetLines()[pPrevPortion->GetLines().Count()-1]; aNewPaM.SetNode( pPrevPortion->GetNode() ); - aNewPaM.SetIndex(GetChar(pPrevPortion, rLine2, nX + mnOnePixelInRef)); + aNewPaM.SetIndex(GetChar(*pPrevPortion, rLine2, nX + mnOnePixelInRef)); } } @@ -1318,7 +1318,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView ) if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW ) { const EditLine& rLine = pPPortion->GetLines()[nLine]; - nX = GetXPos(pPPortion, rLine, rPaM.GetIndex()); + nX = GetXPos(*pPPortion, rLine, rPaM.GetIndex()); pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef; } else @@ -1328,7 +1328,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView ) if ( nLine < pPPortion->GetLines().Count()-1 ) { const EditLine& rNextLine = pPPortion->GetLines()[nLine+1]; - aNewPaM.SetIndex(GetChar(pPPortion, rNextLine, nX)); + aNewPaM.SetIndex(GetChar(*pPPortion, rNextLine, nX)); // Special treatment, see CursorUp ... if ( ( aNewPaM.GetIndex() == rNextLine.GetEnd() ) && ( aNewPaM.GetIndex() > rNextLine.GetStart() ) && ( aNewPaM.GetIndex() < pPPortion->GetNode()->Len() ) ) aNewPaM = CursorLeft( aNewPaM ); @@ -1342,7 +1342,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView ) aNewPaM.SetNode( pNextPortion->GetNode() ); // Never at the very end when several lines, because then a line // below the cursor appears. - aNewPaM.SetIndex(GetChar(pNextPortion, rLine, nX + mnOnePixelInRef)); + aNewPaM.SetIndex(GetChar(*pNextPortion, rLine, nX + mnOnePixelInRef)); if ( ( aNewPaM.GetIndex() == rLine.GetEnd() ) && ( aNewPaM.GetIndex() > rLine.GetStart() ) && ( pNextPortion->GetLines().Count() > 1 ) ) aNewPaM = CursorLeft( aNewPaM ); } @@ -2247,14 +2247,14 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_Int32 n maEditDoc.SetModified( true ); - if ( pRecalc1 ) - CalcHeight( pRecalc1 ); - if ( pRecalc2 ) - CalcHeight( pRecalc2 ); - if ( pRecalc3 ) - CalcHeight( pRecalc3 ); - if ( pRecalc4 ) - CalcHeight( pRecalc4 ); + if (pRecalc1) + CalcHeight(*pRecalc1); + if (pRecalc2) + CalcHeight(*pRecalc2); + if (pRecalc3) + CalcHeight(*pRecalc3); + if (pRecalc4) + CalcHeight(*pRecalc4); #if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG ParaPortionList::DbgCheck(GetParaPortions(), maEditDoc); @@ -3120,29 +3120,28 @@ EditPaM ImpEditEngine::InsertLineBreak(const EditSelection& aCurSel) // Helper functions -tools::Rectangle ImpEditEngine::GetEditCursor(const ParaPortion* pPortion, EditLine const& rLine, +tools::Rectangle ImpEditEngine::GetEditCursor(ParaPortion const& rPortion, EditLine const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags) { - assert(pPortion); // nIndex might be not in the line // Search within the line... tools::Long nX; if ((nIndex == rLine.GetStart()) && (nFlags & GetCursorFlags::StartOfLine)) { - Range aXRange = GetLineXPosStartEnd(pPortion, rLine); - nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? aXRange.Min() + Range aXRange = GetLineXPosStartEnd(rPortion, rLine); + nX = !IsRightToLeft(GetEditDoc().GetPos(rPortion.GetNode())) ? aXRange.Min() : aXRange.Max(); } else if ((nIndex == rLine.GetEnd()) && (nFlags & GetCursorFlags::EndOfLine)) { - Range aXRange = GetLineXPosStartEnd(pPortion, rLine); - nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? aXRange.Max() + Range aXRange = GetLineXPosStartEnd(rPortion, rLine); + nX = !IsRightToLeft(GetEditDoc().GetPos(rPortion.GetNode())) ? aXRange.Max() : aXRange.Min(); } else { - nX = GetXPos(pPortion, rLine, nIndex, bool(nFlags & GetCursorFlags::PreferPortionStart)); + nX = GetXPos(rPortion, rLine, nIndex, bool(nFlags & GetCursorFlags::PreferPortionStart)); } tools::Rectangle aEditCursor; @@ -3189,9 +3188,9 @@ tools::Rectangle ImpEditEngine::PaMtoEditCursor( EditPaM aPaM, GetCursorFlags nF }; IterateLineAreas(FindPortionLineAndArea, IterFlag::none); - if (pLastLine) + if (pLastLine && pPortion) { - aEditCursor = GetEditCursor(pPortion, *pLastLine, nIndex, nFlags); + aEditCursor = GetEditCursor(*pPortion, *pLastLine, nIndex, nFlags); aEditCursor.Move(getTopLeftDocOffset(aLineArea)); } else @@ -3334,7 +3333,8 @@ EditPaM ImpEditEngine::GetPaM( Point aDocPos, bool bSmart ) if (const auto& [pPortion, pLine, nLineStartX] = GetPortionAndLine(aDocPos); pPortion) { assert(pLine); - sal_Int32 nCurIndex = GetChar(pPortion, *pLine, aDocPos.X() - nLineStartX, bSmart); + assert(pPortion); + sal_Int32 nCurIndex = GetChar(*pPortion, *pLine, aDocPos.X() - nLineStartX, bSmart); EditPaM aPaM(pPortion->GetNode(), nCurIndex); if (nCurIndex && (nCurIndex == pLine->GetEnd()) @@ -3353,7 +3353,8 @@ bool ImpEditEngine::IsTextPos(const Point& rDocPos, sal_uInt16 nBorder) if (const auto& [pPortion, pLine, nLineStartX] = GetPortionAndLine(rDocPos); pPortion) { assert(pLine); - Range aLineXPosStartEnd = GetLineXPosStartEnd(pPortion, *pLine); + assert(pPortion); + Range aLineXPosStartEnd = GetLineXPosStartEnd(*pPortion, *pLine); if ((rDocPos.X() >= nLineStartX + aLineXPosStartEnd.Min() - nBorder) && (rDocPos.X() <= nLineStartX + aLineXPosStartEnd.Max() + nBorder)) return true; @@ -3431,7 +3432,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace } } nCurWidth += scaleXSpacingValue(rLRItem.GetRight()); - nCurWidth += CalcLineWidth(pPortion, rLine, bIgnoreExtraSpace); + nCurWidth += CalcLineWidth(*pPortion, rLine, bIgnoreExtraSpace); if ( nCurWidth > nMaxWidth ) { nMaxWidth = nCurWidth; @@ -3443,9 +3444,9 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace return static_cast<sal_uInt32>(nMaxWidth); } -sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* pPortion, EditLine const& rLine, bool bIgnoreExtraSpace) +sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion const& rPortion, EditLine const& rLine, bool bIgnoreExtraSpace) { - sal_Int32 nPara = GetEditDoc().GetPos( pPortion->GetNode() ); + sal_Int32 nPara = GetEditDoc().GetPos(rPortion.GetNode()); // #114278# Saving both layout mode and language (since I'm // potentially changing both) @@ -3460,7 +3461,7 @@ sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* pPortion, EditLine const& r sal_Int32 nPos = rLine.GetStart(); for ( sal_Int32 nTP = rLine.GetStartPortion(); nTP <= rLine.GetEndPortion(); nTP++ ) { - const TextPortion& rTextPortion = pPortion->GetTextPortions()[nTP]; + const TextPortion& rTextPortion = rPortion.GetTextPortions()[nTP]; switch ( rTextPortion.GetKind() ) { case PortionKind::FIELD: @@ -3478,12 +3479,12 @@ sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* pPortion, EditLine const& r } else { - SvxFont aTmpFont( pPortion->GetNode()->GetCharAttribs().GetDefFont() ); - SeekCursor( pPortion->GetNode(), nPos+1, aTmpFont ); + SvxFont aTmpFont(rPortion.GetNode()->GetCharAttribs().GetDefFont()); + SeekCursor(rPortion.GetNode(), nPos + 1, aTmpFont); aTmpFont.SetPhysFont(*GetRefDevice()); ImplInitDigitMode(*GetRefDevice(), aTmpFont.GetLanguage()); nWidth += aTmpFont.QuickGetTextSize( GetRefDevice(), - pPortion->GetNode()->GetString(), nPos, rTextPortion.GetLen(), nullptr ).Width(); + rPortion.GetNode()->GetString(), nPos, rTextPortion.GetLen(), nullptr ).Width(); } } break; @@ -3997,7 +3998,7 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< datatransfer::XTransfera return aNewSelection; } -sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const& rLine, tools::Long nXPos, bool bSmart) +sal_Int32 ImpEditEngine::GetChar(ParaPortion const& rParaPortion, EditLine const& rLine, tools::Long nXPos, bool bSmart) { sal_Int32 nChar = -1; sal_Int32 nCurIndex = rLine.GetStart(); @@ -4006,8 +4007,8 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const // Search best matching portion with GetPortionXOffset() for ( sal_Int32 i = rLine.GetStartPortion(); i <= rLine.GetEndPortion(); i++ ) { - const TextPortion& rPortion = pParaPortion->GetTextPortions()[i]; - tools::Long nXLeft = GetPortionXOffset( pParaPortion, rLine, i ); + const TextPortion& rPortion = rParaPortion.GetTextPortions()[i]; + tools::Long nXLeft = GetPortionXOffset(rParaPortion, rLine, i); tools::Long nXRight = nXLeft + rPortion.GetSize().Width(); if ( ( nXLeft <= nXPos ) && ( nXRight >= nXPos ) ) { @@ -4075,9 +4076,9 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const nChar = nChar + nOffset; // Check if index is within a cell: - if ( nChar && ( nChar < pParaPortion->GetNode()->Len() ) ) + if ( nChar && ( nChar < rParaPortion.GetNode()->Len() ) ) { - EditPaM aPaM( pParaPortion->GetNode(), nChar+1 ); + EditPaM aPaM( rParaPortion.GetNode(), nChar+1 ); sal_uInt16 nScriptType = GetI18NScriptType( aPaM ); if ( nScriptType == i18n::ScriptType::COMPLEX ) { @@ -4085,9 +4086,9 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const sal_Int32 nCount = 1; lang::Locale aLocale = GetLocale( aPaM ); sal_Int32 nRight = _xBI->nextCharacters( - pParaPortion->GetNode()->GetString(), nChar, aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount ); + rParaPortion.GetNode()->GetString(), nChar, aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount ); sal_Int32 nLeft = _xBI->previousCharacters( - pParaPortion->GetNode()->GetString(), nRight, aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount ); + rParaPortion.GetNode()->GetString(), nRight, aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount ); if ( ( nLeft != nChar ) && ( nRight != nChar ) ) { nChar = ( std::abs( nRight - nChar ) < std::abs( nLeft - nChar ) ) ? nRight : nLeft; @@ -4095,7 +4096,7 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const } else { - OUString aStr(pParaPortion->GetNode()->GetString()); + OUString aStr(rParaPortion.GetNode()->GetString()); // tdf#102625: don't select middle of a pair of surrogates with mouse cursor if (rtl::isSurrogate(aStr[nChar])) --nChar; @@ -4115,11 +4116,11 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const return nChar; } -Range ImpEditEngine::GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& rLine) const +Range ImpEditEngine::GetLineXPosStartEnd(ParaPortion const& rParaPortion, EditLine const& rLine) const { Range aLineXPosStartEnd; - sal_Int32 nPara = GetEditDoc().GetPos( pParaPortion->GetNode() ); + sal_Int32 nPara = GetEditDoc().GetPos(rParaPortion.GetNode()); if ( !IsRightToLeft( nPara ) ) { aLineXPosStartEnd.Min() = rLine.GetStartPosX(); @@ -4134,13 +4135,13 @@ Range ImpEditEngine::GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLi return aLineXPosStartEnd; } -tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nTextPortion) const +tools::Long ImpEditEngine::GetPortionXOffset(ParaPortion const& rParaPortion, EditLine const& rLine, sal_Int32 nTextPortion) const { tools::Long nX = rLine.GetStartPosX(); for ( sal_Int32 i = rLine.GetStartPortion(); i < nTextPortion; i++ ) { - const TextPortion& rPortion = pParaPortion->GetTextPortions()[i]; + const TextPortion& rPortion = rParaPortion.GetTextPortions()[i]; switch ( rPortion.GetKind() ) { case PortionKind::FIELD: @@ -4155,10 +4156,10 @@ tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, Ed } } - sal_Int32 nPara = GetEditDoc().GetPos( pParaPortion->GetNode() ); + sal_Int32 nPara = GetEditDoc().GetPos(rParaPortion.GetNode()); bool bR2LPara = IsRightToLeft( nPara ); - const TextPortion& rDestPortion = pParaPortion->GetTextPortions()[nTextPortion]; + const TextPortion& rDestPortion = rParaPortion.GetTextPortions()[nTextPortion]; if ( rDestPortion.GetKind() != PortionKind::TAB ) { if ( !bR2LPara && rDestPortion.GetRightToLeftLevel() ) @@ -4167,7 +4168,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, Ed sal_Int32 nTmpPortion = nTextPortion+1; while ( nTmpPortion <= rLine.GetEndPortion() ) { - const TextPortion& rNextTextPortion = pParaPortion->GetTextPortions()[nTmpPortion]; + const TextPortion& rNextTextPortion = rParaPortion.GetTextPortions()[nTmpPortion]; if ( rNextTextPortion.GetRightToLeftLevel() && ( rNextTextPortion.GetKind() != PortionKind::TAB ) ) nX += rNextTextPortion.GetSize().Width(); else @@ -4179,7 +4180,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, Ed while ( nTmpPortion > rLine.GetStartPortion() ) { --nTmpPortion; - const TextPortion& rPrevTextPortion = pParaPortion->GetTextPortions()[nTmpPortion]; + const TextPortion& rPrevTextPortion = rParaPortion.GetTextPortions()[nTmpPortion]; if ( rPrevTextPortion.GetRightToLeftLevel() && ( rPrevTextPortion.GetKind() != PortionKind::TAB ) ) nX -= rPrevTextPortion.GetSize().Width(); else @@ -4192,7 +4193,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, Ed sal_Int32 nTmpPortion = nTextPortion+1; while ( nTmpPortion <= rLine.GetEndPortion() ) { - const TextPortion& rNextTextPortion = pParaPortion->GetTextPortions()[nTmpPortion]; + const TextPortion& rNextTextPortion = rParaPortion.GetTextPortions()[nTmpPortion]; if ( !rNextTextPortion.IsRightToLeft() && ( rNextTextPortion.GetKind() != PortionKind::TAB ) ) nX += rNextTextPortion.GetSize().Width(); else @@ -4204,7 +4205,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, Ed while ( nTmpPortion > rLine.GetStartPortion() ) { --nTmpPortion; - const TextPortion& rPrevTextPortion = pParaPortion->GetTextPortions()[nTmpPortion]; + const TextPortion& rPrevTextPortion = rParaPortion.GetTextPortions()[nTmpPortion]; if ( !rPrevTextPortion.IsRightToLeft() && ( rPrevTextPortion.GetKind() != PortionKind::TAB ) ) nX -= rPrevTextPortion.GetSize().Width(); else @@ -4224,8 +4225,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, Ed return nX; } -tools::Long ImpEditEngine::GetXPos( - const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const +tools::Long ImpEditEngine::GetXPos(ParaPortion const& rParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const { OSL_ENSURE( ( nIndex >= rLine.GetStart() ) && ( nIndex <= rLine.GetEnd() ) , "GetXPos has to be called properly!" ); @@ -4237,13 +4237,13 @@ tools::Long ImpEditEngine::GetXPos( bDoPreferPortionStart = false; sal_Int32 nTextPortionStart = 0; - sal_Int32 nTextPortion = pParaPortion->GetTextPortions().FindPortion( nIndex, nTextPortionStart, bDoPreferPortionStart ); + sal_Int32 nTextPortion = rParaPortion.GetTextPortions().FindPortion( nIndex, nTextPortionStart, bDoPreferPortionStart ); OSL_ENSURE( ( nTextPortion >= rLine.GetStartPortion() ) && ( nTextPortion <= rLine.GetEndPortion() ), "GetXPos: Portion not in current line! " ); - const TextPortion& rPortion = pParaPortion->GetTextPortions()[nTextPortion]; + const TextPortion& rPortion = rParaPortion.GetTextPortions()[nTextPortion]; - tools::Long nX = GetPortionXOffset( pParaPortion, rLine, nTextPortion ); + tools::Long nX = GetPortionXOffset(rParaPortion, rLine, nTextPortion); // calc text width, portion size may include CJK/CTL spacing... // But the array might not be init yet, if using text ranger this method is called within CreateLines()... @@ -4259,18 +4259,18 @@ tools::Long ImpEditEngine::GetXPos( // End of Portion if ( rPortion.GetKind() == PortionKind::TAB ) { - if ( nTextPortion+1 < pParaPortion->GetTextPortions().Count() ) + if ( nTextPortion+1 < rParaPortion.GetTextPortions().Count() ) { - const TextPortion& rNextPortion = pParaPortion->GetTextPortions()[nTextPortion+1]; + const TextPortion& rNextPortion = rParaPortion.GetTextPortions()[nTextPortion+1]; if ( rNextPortion.GetKind() != PortionKind::TAB ) { if ( !bPreferPortionStart ) - nX = GetXPos( pParaPortion, rLine, nIndex, true ); - else if ( !IsRightToLeft( GetEditDoc().GetPos( pParaPortion->GetNode() ) ) ) + nX = GetXPos(rParaPortion, rLine, nIndex, true ); + else if ( !IsRightToLeft( GetEditDoc().GetPos(rParaPortion.GetNode()) ) ) nX += nPortionTextWidth; } } - else if ( !IsRightToLeft( GetEditDoc().GetPos( pParaPortion->GetNode() ) ) ) + else if ( !IsRightToLeft( GetEditDoc().GetPos(rParaPortion.GetNode()) ) ) { nX += nPortionTextWidth; } @@ -4311,7 +4311,7 @@ tools::Long ImpEditEngine::GetXPos( nX += rPortion.GetExtraInfos()->nPortionOffsetX; if ( rPortion.GetExtraInfos()->nAsianCompressionTypes & AsianCompressionFlags::PunctuationRight ) { - AsianCompressionFlags nType = GetCharTypeForCompression( pParaPortion->GetNode()->GetChar( nIndex ) ); + AsianCompressionFlags nType = GetCharTypeForCompression(rParaPortion.GetNode()->GetChar(nIndex)); if ( nType == AsianCompressionFlags::PunctuationRight && !rLine.GetCharPosArray().empty() ) { sal_Int32 n = nIndex - nTextPortionStart; @@ -4321,7 +4321,7 @@ tools::Long ImpEditEngine::GetXPos( if ( (n+1) < rPortion.GetLen() ) { // smaller, when char behind is AsianCompressionFlags::PunctuationRight also - nType = GetCharTypeForCompression( pParaPortion->GetNode()->GetChar( nIndex+1 ) ); + nType = GetCharTypeForCompression(rParaPortion.GetNode()->GetChar(nIndex + 1)); if ( nType == AsianCompressionFlags::PunctuationRight ) { sal_Int32 nNextCharWidth = ( ( (n+2) < rPortion.GetLen() ) ? pDXArray[n+1] : rPortion.GetSize().Width() ) @@ -4354,44 +4354,44 @@ tools::Long ImpEditEngine::GetXPos( return nX; } -void ImpEditEngine::CalcHeight( ParaPortion* pPortion ) +void ImpEditEngine::CalcHeight(ParaPortion& rPortion) { - pPortion->nHeight = 0; - pPortion->nFirstLineOffset = 0; + rPortion.nHeight = 0; + rPortion.nFirstLineOffset = 0; - if ( !pPortion->IsVisible() ) + if (!rPortion.IsVisible()) return; - OSL_ENSURE( pPortion->GetLines().Count(), "Paragraph with no lines in ParaPortion::CalcHeight" ); - for (sal_Int32 nLine = 0; nLine < pPortion->GetLines().Count(); ++nLine) - pPortion->nHeight += pPortion->GetLines()[nLine].GetHeight(); + OSL_ENSURE(rPortion.GetLines().Count(), "Paragraph with no lines in ParaPortion::CalcHeight"); + for (sal_Int32 nLine = 0; nLine < rPortion.GetLines().Count(); ++nLine) + rPortion.nHeight += rPortion.GetLines()[nLine].GetHeight(); if (maStatus.IsOutliner()) return; - const SvxULSpaceItem& rULItem = pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE ); - const SvxLineSpacingItem& rLSItem = pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL ); + const SvxULSpaceItem& rULItem = rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE ); + const SvxLineSpacingItem& rLSItem = rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL ); sal_Int32 nSBL = ( rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Fix ) ? scaleYSpacingValue(rLSItem.GetInterLineSpace()) : 0; if ( nSBL ) { - if ( pPortion->GetLines().Count() > 1 ) - pPortion->nHeight += ( pPortion->GetLines().Count() - 1 ) * nSBL; + if (rPortion.GetLines().Count() > 1) + rPortion.nHeight += (rPortion.GetLines().Count() - 1) * nSBL; if (maStatus.ULSpaceSummation()) - pPortion->nHeight += nSBL; + rPortion.nHeight += nSBL; } - sal_Int32 nPortion = GetParaPortions().GetPos( pPortion ); + sal_Int32 nPortion = GetParaPortions().GetPos(&rPortion); if ( nPortion ) { sal_uInt16 nUpper = scaleYSpacingValue(rULItem.GetUpper()); - pPortion->nHeight += nUpper; - pPortion->nFirstLineOffset = nUpper; + rPortion.nHeight += nUpper; + rPortion.nFirstLineOffset = nUpper; } if ( nPortion != (GetParaPortions().Count()-1) ) { - pPortion->nHeight += scaleYSpacingValue(rULItem.GetLower()); // not in the last + rPortion.nHeight += scaleYSpacingValue(rULItem.GetLower()); // not in the last } @@ -4412,29 +4412,28 @@ void ImpEditEngine::CalcHeight( ParaPortion* pPortion ) // check if distance by LineSpacing > Upper: sal_uInt16 nExtraSpace = scaleYSpacingValue(lcl_CalcExtraSpace(rLSItem)); - if ( nExtraSpace > pPortion->nFirstLineOffset ) + if (nExtraSpace > rPortion.nFirstLineOffset) { // Paragraph becomes 'bigger': - pPortion->nHeight += ( nExtraSpace - pPortion->nFirstLineOffset ); - pPortion->nFirstLineOffset = nExtraSpace; + rPortion.nHeight += (nExtraSpace - rPortion.nFirstLineOffset); + rPortion.nFirstLineOffset = nExtraSpace; } // Determine nFirstLineOffset now f(pNode) => now f(pNode, pPrev): sal_uInt16 nPrevLower = scaleYSpacingValue(rPrevULItem.GetLower()); // This PrevLower is still in the height of PrevPortion ... - if ( nPrevLower > pPortion->nFirstLineOffset ) + if (nPrevLower > rPortion.nFirstLineOffset) { // Paragraph is 'small': - pPortion->nHeight -= pPortion->nFirstLineOffset; - pPortion->nFirstLineOffset = 0; + rPortion.nHeight -= rPortion.nFirstLineOffset; + rPortion.nFirstLineOffset = 0; } else if ( nPrevLower ) { // Paragraph becomes 'somewhat smaller': - pPortion->nHeight -= nPrevLower; - pPortion->nFirstLineOffset = - pPortion->nFirstLineOffset - nPrevLower; + rPortion.nHeight -= nPrevLower; + rPortion.nFirstLineOffset = rPortion.nFirstLineOffset - nPrevLower; } // I find it not so good, but Writer3 feature: // Check if distance by LineSpacing > Lower: this value is not @@ -4447,10 +4446,10 @@ void ImpEditEngine::CalcHeight( ParaPortion* pPortion ) { sal_uInt16 nMoreLower = nExtraSpace - nPrevLower; // Paragraph becomes 'bigger', 'grows' downwards: - if ( nMoreLower > pPortion->nFirstLineOffset ) + if ( nMoreLower > rPortion.nFirstLineOffset ) { - pPortion->nHeight += ( nMoreLower - pPortion->nFirstLineOffset ); - pPortion->nFirstLineOffset = nMoreLower; + rPortion.nHeight += (nMoreLower - rPortion.nFirstLineOffset); + rPortion.nFirstLineOffset = nMoreLower; } } } diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index d9a20723826e..43bc6d34f4ef 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -643,8 +643,8 @@ bool ImpEditEngine::createLinesForEmptyParagraph(ParaPortion& rParaPortion) if (rParaPortion.GetLines().Count()) rParaPortion.GetLines().Reset(); - CreateAndInsertEmptyLine(&rParaPortion); - return FinishCreateLines(&rParaPortion); + CreateAndInsertEmptyLine(rParaPortion); + return FinishCreateLines(rParaPortion); } tools::Long ImpEditEngine::calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem const& rLRItem) @@ -770,11 +770,11 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) else if ( bQuickFormat ) { // faster Method: - RecalcTextPortion( pParaPortion, nInvalidStart, nInvalidDiff ); + RecalcTextPortion(*pParaPortion, nInvalidStart, nInvalidDiff); } else // nRealInvalidStart can be before InvalidStart, since Portions were deleted... { - CreateTextPortions( pParaPortion, nRealInvalidStart ); + CreateTextPortions(*pParaPortion, nRealInvalidStart); } // Search for line with InvalidPos, start one line before @@ -877,7 +877,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) { GetTextRanger()->SetVertical( IsEffectivelyVertical() ); - tools::Long nTextY = nStartPosY + GetEditCursor(pParaPortion, *pLine, pLine->GetStart(), GetCursorFlags::NONE).Top(); + tools::Long nTextY = nStartPosY + GetEditCursor(*pParaPortion, *pLine, pLine->GetStart(), GetCursorFlags::NONE).Top(); if ( !bSameLineAgain ) { SeekCursor( pNode, nTmpPos+1, aTmpFont ); @@ -1344,7 +1344,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) { DBG_ASSERT( pPortion->GetKind() == PortionKind::TEXT, "Len>1, but no TextPortion?" ); nTmpWidth -= pPortion->GetSize().Width(); - sal_Int32 nP = SplitTextPortion( pParaPortion, nTmpPos, pLine ); + sal_Int32 nP = SplitTextPortion(*pParaPortion, nTmpPos, pLine); nTmpWidth += pParaPortion->GetTextPortions()[nP].GetSize().Width(); } } @@ -1419,8 +1419,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) pNode, pPortion, nPortionStart, pDXArray, 10000, true); } if( pPortion ) - ImpBreakLine( pParaPortion, *pLine, pPortion, nPortionStart, - nRemainingWidth, bCanHyphenate && bHyphenatePara ); + ImpBreakLine(*pParaPortion, *pLine, pPortion, nPortionStart, nRemainingWidth, bCanHyphenate && bHyphenatePara); } @@ -1566,7 +1565,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) tools::Long nRemainingWidth = nMaxLineWidth - aTextSize.Width(); if ( nRemainingWidth > 0 ) { - ImplExpandCompressedPortions(*pLine, pParaPortion, nRemainingWidth); + ImplExpandCompressedPortions(*pLine, *pParaPortion, nRemainingWidth); aTextSize = pLine->CalcTextSize( *pParaPortion ); } } @@ -1611,7 +1610,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) tools::Long nRemainingSpace = nMaxLineWidth - aTextSize.Width(); pLine->SetStartPosX( nStartX ); if ( nRemainingSpace > 0 && (!bEOC || bDistLastLine) ) - ImpAdjustBlocks(pParaPortion, *pLine, nRemainingSpace); + ImpAdjustBlocks(*pParaPortion, *pLine, nRemainingSpace); } break; default: @@ -1755,9 +1754,9 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) DBG_ASSERT( pParaPortion->GetLines().Count(), "No line after CreateLines!" ); if ( bLineBreak ) - CreateAndInsertEmptyLine( pParaPortion ); + CreateAndInsertEmptyLine(*pParaPortion); - bool bHeightChanged = FinishCreateLines( pParaPortion ); + bool bHeightChanged = FinishCreateLines(*pParaPortion); if ( bMapChanged ) GetRefDevice()->Pop(); @@ -1767,20 +1766,20 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) return bHeightChanged; } -void ImpEditEngine::CreateAndInsertEmptyLine( ParaPortion* pParaPortion ) +void ImpEditEngine::CreateAndInsertEmptyLine(ParaPortion& rParaPortion) { DBG_ASSERT( !GetTextRanger(), "Don't use CreateAndInsertEmptyLine with a polygon!" ); EditLine* pTmpLine = new EditLine; - pTmpLine->SetStart( pParaPortion->GetNode()->Len() ); - pTmpLine->SetEnd( pParaPortion->GetNode()->Len() ); - pParaPortion->GetLines().Append(std::unique_ptr<EditLine>(pTmpLine)); + pTmpLine->SetStart(rParaPortion.GetNode()->Len()); + pTmpLine->SetEnd(rParaPortion.GetNode()->Len()); + rParaPortion.GetLines().Append(std::unique_ptr<EditLine>(pTmpLine)); - bool bLineBreak = pParaPortion->GetNode()->Len() > 0; + bool bLineBreak = rParaPortion.GetNode()->Len() > 0; sal_Int32 nSpaceBefore = 0; - sal_Int32 nSpaceBeforeAndMinLabelWidth = GetSpaceBeforeAndMinLabelWidth( pParaPortion->GetNode(), &nSpaceBefore ); - const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( pParaPortion->GetNode() ); - const SvxLineSpacingItem& rLSItem = pParaPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL ); + sal_Int32 nSpaceBeforeAndMinLabelWidth = GetSpaceBeforeAndMinLabelWidth(rParaPortion.GetNode(), &nSpaceBefore); + const SvxLRSpaceItem& rLRItem = GetLRSpaceItem(rParaPortion.GetNode()); + const SvxLineSpacingItem& rLSItem = rParaPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL ); tools::Long nStartX = scaleXSpacingValue(rLRItem.GetTextLeft() + rLRItem.GetTextFirstLineOffset() + nSpaceBefore); tools::Rectangle aBulletArea { Point(), Point() }; @@ -1790,28 +1789,28 @@ void ImpEditEngine::CreateAndInsertEmptyLine( ParaPortion* pParaPortion ) } else { - aBulletArea = GetEditEnginePtr()->GetBulletArea( GetParaPortions().GetPos( pParaPortion ) ); + aBulletArea = GetEditEnginePtr()->GetBulletArea( GetParaPortions().GetPos(&rParaPortion)); if ( !aBulletArea.IsEmpty() && aBulletArea.Right() > 0 ) - pParaPortion->SetBulletX(sal_Int32(scaleXSpacingValue(aBulletArea.Right()))); + rParaPortion.SetBulletX(sal_Int32(scaleXSpacingValue(aBulletArea.Right()))); else - pParaPortion->SetBulletX( 0 ); // If Bullet set incorrectly. - if ( pParaPortion->GetBulletX() > nStartX ) + rParaPortion.SetBulletX( 0 ); // If Bullet set incorrectly. + if (rParaPortion.GetBulletX() > nStartX) { nStartX = scaleXSpacingValue(rLRItem.GetTextLeft() + rLRItem.GetTextFirstLineOffset() + nSpaceBeforeAndMinLabelWidth); - if ( pParaPortion->GetBulletX() > nStartX ) - nStartX = pParaPortion->GetBulletX(); + if (rParaPortion.GetBulletX() > nStartX) + nStartX = rParaPortion.GetBulletX(); } } SvxFont aTmpFont; - SeekCursor( pParaPortion->GetNode(), bLineBreak ? pParaPortion->GetNode()->Len() : 0, aTmpFont ); + SeekCursor(rParaPortion.GetNode(), bLineBreak ? rParaPortion.GetNode()->Len() : 0, aTmpFont ); aTmpFont.SetPhysFont(*mpRefDev); TextPortion* pDummyPortion = new TextPortion( 0 ); pDummyPortion->SetSize(aTmpFont.GetPhysTxtSize(mpRefDev)); if ( IsFixedCellHeight() ) pDummyPortion->setHeight( ImplCalculateFontIndependentLineSpacing( aTmpFont.GetFontHeight() ) ); - pParaPortion->GetTextPortions().Append(pDummyPortion); + rParaPortion.GetTextPortions().Append(pDummyPortion); FormatterFontMetric aFormatterMetrics; RecalcFormatterFontMetrics( aFormatterMetrics, aTmpFont ); pTmpLine->SetMaxAscent( aFormatterMetrics.nMaxAscent ); @@ -1822,7 +1821,7 @@ void ImpEditEngine::CreateAndInsertEmptyLine( ParaPortion* pParaPortion ) if (!maStatus.IsOutliner()) { - sal_Int32 nPara = GetParaPortions().GetPos( pParaPortion ); + sal_Int32 nPara = GetParaPortions().GetPos(&rParaPortion); SvxAdjust eJustification = GetJustification( nPara ); tools::Long nMaxLineWidth = GetColumnWidth(maPaperSize); nMaxLineWidth -= scaleXSpacingValue(rLRItem.GetRight()); @@ -1860,7 +1859,7 @@ void ImpEditEngine::CreateAndInsertEmptyLine( ParaPortion* pParaPortion ) } else if ( rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Prop ) { - sal_Int32 nPara = GetParaPortions().GetPos( pParaPortion ); + sal_Int32 nPara = GetParaPortions().GetPos(&rParaPortion); if ( nPara || pTmpLine->GetStartPortion() ) // Not the very first line { // There are documents with PropLineSpace 0, why? @@ -1897,30 +1896,30 @@ void ImpEditEngine::CreateAndInsertEmptyLine( ParaPortion* pParaPortion ) { // -2: The new one is already inserted. #ifdef DBG_UTIL - EditLine& rLastLine = pParaPortion->GetLines()[pParaPortion->GetLines().Count()-2]; - DBG_ASSERT( rLastLine.GetEnd() == pParaPortion->GetNode()->Len(), "different anyway?" ); + EditLine& rLastLine = rParaPortion.GetLines()[rParaPortion.GetLines().Count()-2]; + DBG_ASSERT( rLastLine.GetEnd() == rParaPortion.GetNode()->Len(), "different anyway?" ); #endif - sal_Int32 nPos = pParaPortion->GetTextPortions().Count() - 1 ; + sal_Int32 nPos = rParaPortion.GetTextPortions().Count() - 1 ; pTmpLine->SetStartPortion( nPos ); pTmpLine->SetEndPortion( nPos ); } } -bool ImpEditEngine::FinishCreateLines( ParaPortion* pParaPortion ) +bool ImpEditEngine::FinishCreateLines(ParaPortion& rParaPortion) { // CalcCharPositions( pParaPortion ); - pParaPortion->SetValid(); - tools::Long nOldHeight = pParaPortion->GetHeight(); - CalcHeight( pParaPortion ); + rParaPortion.SetValid(); + tools::Long nOldHeight = rParaPortion.GetHeight(); + CalcHeight(rParaPortion); - DBG_ASSERT( pParaPortion->GetTextPortions().Count(), "FinishCreateLines: No Text-Portion?" ); - bool bRet = ( pParaPortion->GetHeight() != nOldHeight ); + DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "FinishCreateLines: No Text-Portion?"); + bool bRet = rParaPortion.GetHeight() != nOldHeight; return bRet; } -void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long nRemainingWidth, bool bCanHyphenate ) +void ImpEditEngine::ImpBreakLine(ParaPortion& rParaPortion, EditLine& rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long nRemainingWidth, bool bCanHyphenate) { - ContentNode* const pNode = pParaPortion->GetNode(); + ContentNode* const pNode = rParaPortion.GetNode(); sal_Int32 nBreakInLine = nPortionStart - rLine.GetStart(); sal_Int32 nMax = nBreakInLine + pPortion->GetLen(); @@ -2138,7 +2137,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, Te // the dickey portion is the end portion rLine.SetEnd( nBreakPos ); - sal_Int32 nEndPortion = SplitTextPortion( pParaPortion, nBreakPos, &rLine); + sal_Int32 nEndPortion = SplitTextPortion(rParaPortion, nBreakPos, &rLine); if ( !bCompressBlank && !bHangingPunctuation ) { @@ -2152,7 +2151,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, Te if ( bCompressBlank || bHangingPunctuation ) { - TextPortion& rTP = pParaPortion->GetTextPortions()[nEndPortion]; + TextPortion& rTP = rParaPortion.GetTextPortions()[nEndPortion]; DBG_ASSERT( rTP.GetKind() == PortionKind::TEXT, "BlankRubber: No TextPortion!" ); DBG_ASSERT( nBreakPos > rLine.GetStart(), "SplitTextPortion at the beginning of the line?" ); sal_Int32 nPosInArray = nBreakPos - 1 - rLine.GetStart(); @@ -2169,7 +2168,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, Te pHyphPortion->SetKind( PortionKind::HYPHENATOR ); if ( (cAlternateReplChar || cAlternateExtraChar) && bAltFullRight ) // alternation after the break doesn't supported { - TextPortion& rPrev = pParaPortion->GetTextPortions()[nEndPortion]; + TextPortion& rPrev = rParaPortion.GetTextPortions()[nEndPortion]; DBG_ASSERT( rPrev.GetLen(), "Hyphenate: Prev portion?!" ); rPrev.SetLen( rPrev.GetLen() - nAltDelChar ); pHyphPortion->SetLen( nAltDelChar ); @@ -2181,27 +2180,25 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, Te // Determine the width of the Hyph-Portion: SvxFont aFont; - SeekCursor( pParaPortion->GetNode(), nBreakPos, aFont ); + SeekCursor(rParaPortion.GetNode(), nBreakPos, aFont); aFont.SetPhysFont(*GetRefDevice()); pHyphPortion->SetSize(Size(GetRefDevice()->GetTextWidth(CH_HYPH), GetRefDevice()->GetTextHeight())); - pParaPortion->GetTextPortions().Insert(++nEndPortion, pHyphPortion); + rParaPortion.GetTextPortions().Insert(++nEndPortion, pHyphPortion); } rLine.SetEndPortion( nEndPortion ); } -void ImpEditEngine::ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& rLine, tools::Long nRemainingSpace ) +void ImpEditEngine::ImpAdjustBlocks(ParaPortion& rParaPortion, EditLine& rLine, tools::Long nRemainingSpace ) { DBG_ASSERT( nRemainingSpace > 0, "AdjustBlocks: Somewhat too little..." ); if ( ( nRemainingSpace < 0 ) || rLine.IsEmpty() ) return ; - assert(pParaPortion); - const sal_Int32 nFirstChar = rLine.GetStart(); const sal_Int32 nLastChar = rLine.GetEnd() -1; // Last points behind - ContentNode* pNode = pParaPortion->GetNode(); + ContentNode* pNode = rParaPortion.GetNode(); DBG_ASSERT( nLastChar < pNode->Len(), "AdjustBlocks: Out of range!" ); @@ -2256,8 +2253,8 @@ void ImpEditEngine::ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& rLine, { aPositions.pop_back(); sal_Int32 nPortionStart, nPortion; - nPortion = pParaPortion->GetTextPortions().FindPortion( nLastChar+1, nPortionStart ); - TextPortion& rLastPortion = pParaPortion->GetTextPortions()[ nPortion ]; + nPortion = rParaPortion.GetTextPortions().FindPortion( nLastChar+1, nPortionStart ); + TextPortion& rLastPortion = rParaPortion.GetTextPortions()[ nPortion ]; tools::Long nRealWidth = rLine.GetCharPosArray()[nLastChar-nFirstChar]; tools::Long nBlankWidth = nRealWidth; if ( nLastChar > nPortionStart ) @@ -2301,8 +2298,8 @@ void ImpEditEngine::ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& rLine, if ( nChar < nLastChar ) { sal_Int32 nPortionStart, nPortion; - nPortion = pParaPortion->GetTextPortions().FindPortion( nChar, nPortionStart, true ); - TextPortion& rLastPortion = pParaPortion->GetTextPortions()[ nPortion ]; + nPortion = rParaPortion.GetTextPortions().FindPortion( nChar, nPortionStart, true ); + TextPortion& rLastPortion = rParaPortion.GetTextPortions()[ nPortion ]; // The width of the portion: rLastPortion.adjustSize(nMore4Everyone, 0); @@ -2522,21 +2519,19 @@ void ImpEditEngine::ImpFindKashidas( ContentNode* pNode, sal_Int32 nStart, sal_I rArray.push_back(pos); } -sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* pPortion, sal_Int32 nPos, EditLine* pCurLine ) +sal_Int32 ImpEditEngine::SplitTextPortion(ParaPortion& rParaPortion, sal_Int32 nPos, EditLine* pCurLine) { // The portion at nPos is split, if there is not a transition at nPos anyway if ( nPos == 0 ) return 0; - assert( pPortion && "SplitTextPortion: Which ?" ); - sal_Int32 nSplitPortion; sal_Int32 nTmpPos = 0; TextPortion* pTextPortion = nullptr; - sal_Int32 nPortions = pPortion->GetTextPortions().Count(); + sal_Int32 nPortions = rParaPortion.GetTextPortions().Count(); for ( nSplitPortion = 0; nSplitPortion < nPortions; nSplitPortion++ ) { - TextPortion& rTP = pPortion->GetTextPortions()[nSplitPortion]; + TextPortion& rTP = rParaPortion.GetTextPortions()[nSplitPortion]; nTmpPos = nTmpPos + rTP.GetLen(); if ( nTmpPos >= nPos ) { @@ -2559,7 +2554,7 @@ sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* pPortion, sal_Int32 nPos sal_Int32 nOverlapp = nTmpPos - nPos; pTextPortion->SetLen( pTextPortion->GetLen() - nOverlapp ); TextPortion* pNewPortion = new TextPortion( nOverlapp ); - pPortion->GetTextPortions().Insert(nSplitPortion+1, pNewPortion); + rParaPortion.GetTextPortions().Insert(nSplitPortion+1, pNewPortion); // Set sizes if ( pCurLine ) { @@ -2570,13 +2565,13 @@ sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* pPortion, sal_Int32 nPos if ( pTextPortion->GetExtraInfos() && pTextPortion->GetExtraInfos()->bCompressed ) { // We need the original size from the portion - sal_Int32 nTxtPortionStart = pPortion->GetTextPortions().GetStartPos( nSplitPortion ); - SvxFont aTmpFont( pPortion->GetNode()->GetCharAttribs().GetDefFont() ); - SeekCursor( pPortion->GetNode(), nTxtPortionStart+1, aTmpFont ); + sal_Int32 nTxtPortionStart = rParaPortion.GetTextPortions().GetStartPos( nSplitPortion ); + SvxFont aTmpFont = rParaPortion.GetNode()->GetCharAttribs().GetDefFont(); + SeekCursor(rParaPortion.GetNode(), nTxtPortionStart + 1, aTmpFont); aTmpFont.SetPhysFont(*GetRefDevice()); GetRefDevice()->Push( vcl::PushFlags::TEXTLANGUAGE ); ImplInitDigitMode(*GetRefDevice(), aTmpFont.GetLanguage()); - Size aSz = aTmpFont.QuickGetTextSize( GetRefDevice(), pPortion->GetNode()->GetString(), + Size aSz = aTmpFont.QuickGetTextSize( GetRefDevice(), rParaPortion.GetNode()->GetString(), nTxtPortionStart, pTextPortion->GetLen(), nullptr ); GetRefDevice()->Pop(); pTextPortion->GetExtraInfos()->nOrgWidth = aSz.Width(); @@ -2588,10 +2583,10 @@ sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* pPortion, sal_Int32 nPos return nSplitPortion; } -void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rStart ) +void ImpEditEngine::CreateTextPortions(ParaPortion& rParaPortion, sal_Int32& rStart) { sal_Int32 nStartPos = rStart; - ContentNode* pNode = pParaPortion->GetNode(); + ContentNode* pNode = rParaPortion.GetNode(); DBG_ASSERT( pNode->Len(), "CreateTextPortions should not be used for empty paragraphs!" ); o3tl::sorted_vector< sal_Int32 > aPositions; @@ -2609,14 +2604,14 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rS } aPositions.insert( pNode->Len() ); - if ( pParaPortion->aScriptInfos.empty() ) - InitScriptTypes( GetParaPortions().GetPos( pParaPortion ) ); + if (rParaPortion.aScriptInfos.empty()) + InitScriptTypes(GetParaPortions().GetPos(&rParaPortion)); - const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos; + const ScriptTypePosInfos& rTypes = rParaPortion.aScriptInfos; for (const ScriptTypePosInfo& rType : rTypes) aPositions.insert( rType.nStartPos ); - const WritingDirectionInfos& rWritingDirections = pParaPortion->aWritingDirectionInfos; + const WritingDirectionInfos& rWritingDirections = rParaPortion.aWritingDirectionInfos; for (const WritingDirectionInfo & rWritingDirection : rWritingDirections) aPositions.insert( rWritingDirection.nStartPos ); @@ -2640,9 +2635,9 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rS sal_Int32 nPortionStart = 0; sal_Int32 nInvPortion = 0; sal_Int32 nP; - for ( nP = 0; nP < pParaPortion->GetTextPortions().Count(); nP++ ) + for ( nP = 0; nP < rParaPortion.GetTextPortions().Count(); nP++ ) { - const TextPortion& rTmpPortion = pParaPortion->GetTextPortions()[nP]; + const TextPortion& rTmpPortion = rParaPortion.GetTextPortions()[nP]; nPortionStart = nPortionStart + rTmpPortion.GetLen(); if ( nPortionStart >= nStartPos ) { @@ -2652,16 +2647,16 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rS break; } } - DBG_ASSERT( nP < pParaPortion->GetTextPortions().Count() || !pParaPortion->GetTextPortions().Count(), "Nothing to delete: CreateTextPortions" ); - if ( nInvPortion && ( nPortionStart+pParaPortion->GetTextPortions()[nInvPortion].GetLen() > nStartPos ) ) + DBG_ASSERT( nP < rParaPortion.GetTextPortions().Count() || !rParaPortion.GetTextPortions().Count(), "Nothing to delete: CreateTextPortions" ); + if ( nInvPortion && ( nPortionStart + rParaPortion.GetTextPortions()[nInvPortion].GetLen() > nStartPos ) ) { // prefer one in front... // But only if it was in the middle of the portion of, otherwise it // might be the only one in the row in front! nInvPortion--; - nPortionStart = nPortionStart - pParaPortion->GetTextPortions()[nInvPortion].GetLen(); + nPortionStart = nPortionStart - rParaPortion.GetTextPortions()[nInvPortion].GetLen(); } - pParaPortion->GetTextPortions().DeleteFromPortion( nInvPortion ); + rParaPortion.GetTextPortions().DeleteFromPortion( nInvPortion ); // A portion may also have been formed by a line break: aPositions.insert( nPortionStart ); @@ -2674,21 +2669,21 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& rS while ( i != aPositions.end() ) { TextPortion* pNew = new TextPortion( (*i++) - *nInvPos++ ); - pParaPortion->GetTextPortions().Append(pNew); + rParaPortion.GetTextPortions().Append(pNew); } - DBG_ASSERT( pParaPortion->GetTextPortions().Count(), "No Portions?!" ); + DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "No Portions?!"); #if OSL_DEBUG_LEVEL > 0 - OSL_ENSURE( ParaPortion::DbgCheckTextPortions(*pParaPortion), "Portion is broken?" ); + OSL_ENSURE( ParaPortion::DbgCheckTextPortions(rParaPortion), "Portion is broken?" ); #endif } -void ImpEditEngine::RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 nStartPos, sal_Int32 nNewChars ) +void ImpEditEngine::RecalcTextPortion(ParaPortion& rParaPortion, sal_Int32 nStartPos, sal_Int32 nNewChars) { - DBG_ASSERT( pParaPortion->GetTextPortions().Count(), "No Portions!" ); + DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "No Portions!"); DBG_ASSERT( nNewChars, "RecalcTextPortion with Diff == 0" ); - ContentNode* const pNode = pParaPortion->GetNode(); + ContentNode* const pNode = rParaPortion.GetNode(); if ( nNewChars > 0 ) { // If an Attribute begins/ends at nStartPos, then a new portion starts @@ -2697,29 +2692,28 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 nSta { sal_Int32 nNewPortionPos = 0; if ( nStartPos ) - nNewPortionPos = SplitTextPortion( pParaPortion, nStartPos ) + 1; + nNewPortionPos = SplitTextPortion(rParaPortion, nStartPos) + 1; // A blank portion may be here, if the paragraph was empty, // or if a line was created by a hard line break. - if ( ( nNewPortionPos < pParaPortion->GetTextPortions().Count() ) && - !pParaPortion->GetTextPortions()[nNewPortionPos].GetLen() ) + if ( ( nNewPortionPos < rParaPortion.GetTextPortions().Count() ) && + !rParaPortion.GetTextPortions()[nNewPortionPos].GetLen() ) { - TextPortion& rTP = pParaPortion->GetTextPortions()[nNewPortionPos]; + TextPortion& rTP = rParaPortion.GetTextPortions()[nNewPortionPos]; DBG_ASSERT( rTP.GetKind() == PortionKind::TEXT, "the empty portion was no TextPortion!" ); rTP.SetLen( rTP.GetLen() + nNewChars ); } else { TextPortion* pNewPortion = new TextPortion( nNewChars ); - pParaPortion->GetTextPortions().Insert(nNewPortionPos, pNewPortion); + rParaPortion.GetTextPortions().Insert(nNewPortionPos, pNewPortion); } } else { sal_Int32 nPortionStart; - const sal_Int32 nTP = pParaPortion->GetTextPortions(). - FindPortion( nStartPos, nPortionStart ); - TextPortion& rTP = pParaPortion->GetTextPortions()[ nTP ]; + const sal_Int32 nTP = rParaPortion.GetTextPortions().FindPortion( nStartPos, nPortionStart ); + TextPortion& rTP = rParaPortion.GetTextPortions()[ nTP ]; rTP.SetLen( rTP.GetLen() + nNewChars ); rTP.setWidth(-1); } @@ -2736,11 +2730,11 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 nSta sal_Int32 nPortion = 0; sal_Int32 nPos = 0; sal_Int32 nEnd = nStartPos-nNewChars; - sal_Int32 nPortions = pParaPortion->GetTextPortions().Count(); + sal_Int32 nPortions = rParaPortion.GetTextPortions().Count(); TextPortion* pTP = nullptr; for ( nPortion = 0; nPortion < nPortions; nPortion++ ) { - pTP = &pParaPortion->GetTextPortions()[ nPortion ]; + pTP = &rParaPortion.GetTextPortions()[ nPortion ]; if ( ( nPos+pTP->GetLen() ) > nStartPos ) { DBG_ASSERT( nPos <= nStartPos, "Wrong Start!" ); @@ -2754,14 +2748,14 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 nSta { // Remove portion; PortionKind nType = pTP->GetKind(); - pParaPortion->GetTextPortions().Remove( nPortion ); + rParaPortion.GetTextPortions().Remove( nPortion ); if ( nType == PortionKind::LINEBREAK ) { - TextPortion& rNext = pParaPortion->GetTextPortions()[ nPortion ]; + TextPortion& rNext = rParaPortion.GetTextPortions()[ nPortion ]; if ( !rNext.GetLen() ) { // Remove dummy portion - pParaPortion->GetTextPortions().Remove( nPortion ); + rParaPortion.GetTextPortions().Remove( nPortion ); } } } @@ -2771,30 +2765,30 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 nSta pTP->SetLen( pTP->GetLen() + nNewChars ); } - sal_Int32 nPortionCount = pParaPortion->GetTextPortions().Count(); + sal_Int32 nPortionCount = rParaPortion.GetTextPortions().Count(); assert( nPortionCount ); if (nPortionCount) { // No HYPHENATOR portion is allowed to get stuck right at the end... sal_Int32 nLastPortion = nPortionCount - 1; - pTP = &pParaPortion->GetTextPortions()[nLastPortion]; + pTP = &rParaPortion.GetTextPortions()[nLastPortion]; if ( pTP->GetKind() == PortionKind::HYPHENATOR ) { // Discard portion; if possible, correct the ones before, // if the Hyphenator portion has swallowed one character... if ( nLastPortion && pTP->GetLen() ) { - TextPortion& rPrev = pParaPortion->GetTextPortions()[nLastPortion - 1]; + TextPortion& rPrev = rParaPortion.GetTextPortions()[nLastPortion - 1]; DBG_ASSERT( rPrev.GetKind() == PortionKind::TEXT, "Portion?!" ); rPrev.SetLen( rPrev.GetLen() + pTP->GetLen() ); rPrev.setWidth(-1); } - pParaPortion->GetTextPortions().Remove( nLastPortion ); + rParaPortion.GetTextPortions().Remove( nLastPortion ); } } } #if OSL_DEBUG_LEVEL > 0 - OSL_ENSURE( ParaPortion::DbgCheckTextPortions(*pParaPortion), "Portions are broken?" ); + OSL_ENSURE( ParaPortion::DbgCheckTextPortions(rParaPortion), "Portions are broken?" ); #endif } @@ -3423,7 +3417,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po DBG_ASSERT( pPortion->GetTextPortions().Count(), "Line without Textportion in Paint!" ); const TextPortion& rTextPortion = pPortion->GetTextPortions()[nPortion]; - const tools::Long nPortionXOffset = GetPortionXOffset( pPortion, rLine, nPortion ); + const tools::Long nPortionXOffset = GetPortionXOffset(*pPortion, rLine, nPortion); setXDirectionAwareFrom(aTmpPos, aStartPos); adjustXDirectionAware(aTmpPos, nPortionXOffset); if (isXOverflowDirectionAware(aTmpPos, aClipRect)) @@ -4227,7 +4221,7 @@ void ImpEditEngine::ShowParagraph( sal_Int32 nParagraph, bool bShow ) } else { - CalcHeight( pPPortion ); + CalcHeight(*pPPortion); } mnCurTextHeight += pPPortion->GetHeight(); } @@ -4840,14 +4834,14 @@ bool ImpEditEngine::ImplCalcAsianCompression(ContentNode* pNode, } -void ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* pParaPortion, tools::Long nRemainingWidth) +void ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion& rParaPortion, tools::Long nRemainingWidth) { bool bFoundCompressedPortion = false; tools::Long nCompressed = 0; std::vector<TextPortion*> aCompressedPortions; sal_Int32 nPortion = rLine.GetEndPortion(); - TextPortion* pTP = &pParaPortion->GetTextPortions()[ nPortion ]; + TextPortion* pTP = &rParaPortion.GetTextPortions()[ nPortion ]; while ( pTP && ( pTP->GetKind() == PortionKind::TEXT ) ) { if ( pTP->GetExtraInfos() && pTP->GetExtraInfos()->bCompressed ) @@ -4856,7 +4850,7 @@ void ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* p nCompressed += pTP->GetExtraInfos()->nOrgWidth - pTP->GetSize().Width(); aCompressedPortions.push_back(pTP); } - pTP = ( nPortion > rLine.GetStartPortion() ) ? &pParaPortion->GetTextPortions()[ --nPortion ] : nullptr; + pTP = ( nPortion > rLine.GetStartPortion() ) ? &rParaPortion.GetTextPortions()[ --nPortion ] : nullptr; } if ( !bFoundCompressedPortion ) @@ -4878,13 +4872,13 @@ void ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* p pTP->setWidth(pTP->GetExtraInfos()->nOrgWidth); if ( nCompressPercent ) { - sal_Int32 nTxtPortion = pParaPortion->GetTextPortions().GetPos( pTP ); - sal_Int32 nTxtPortionStart = pParaPortion->GetTextPortions().GetStartPos( nTxtPortion ); + sal_Int32 nTxtPortion = rParaPortion.GetTextPortions().GetPos( pTP ); + sal_Int32 nTxtPortionStart = rParaPortion.GetTextPortions().GetStartPos( nTxtPortion ); DBG_ASSERT( nTxtPortionStart >= rLine.GetStart(), "Portion doesn't belong to the line!!!" ); sal_Int32* pDXArray = rLine.GetCharPosArray().data() + (nTxtPortionStart - rLine.GetStart()); if ( pTP->GetExtraInfos()->pOrgDXArray ) memcpy( pDXArray, pTP->GetExtraInfos()->pOrgDXArray.get(), (pTP->GetLen()-1)*sizeof(sal_Int32) ); - ImplCalcAsianCompression( pParaPortion->GetNode(), pTP, nTxtPortionStart, pDXArray, static_cast<sal_uInt16>(nCompressPercent), true ); + ImplCalcAsianCompression( rParaPortion.GetNode(), pTP, nTxtPortionStart, pDXArray, static_cast<sal_uInt16>(nCompressPercent), true ); } } } diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx index 241473832286..bf0b5bb34951 100644 --- a/include/editeng/editeng.hxx +++ b/include/editeng/editeng.hxx @@ -184,10 +184,9 @@ private: const EditSelection& rCurSelection, sal_Int16 nWordType = css::i18n::WordType::ANYWORD_IGNOREWHITESPACES); - EDITENG_DLLPRIVATE tools::Long GetXPos( - const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const; + EDITENG_DLLPRIVATE tools::Long GetXPos(ParaPortion const& rParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const; - EDITENG_DLLPRIVATE Range GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& rLine) const; + EDITENG_DLLPRIVATE Range GetLineXPosStartEnd(ParaPortion const& rParaPortion, EditLine const& rLine) const; EDITENG_DLLPRIVATE InternalEditStatus& GetInternalEditStatus(); commit ee880f953e8b04c736a44fea63513d041681955f Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Fri Jan 12 13:35:22 2024 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun Jan 14 16:06:07 2024 +0100 editeng: use EditLine as ref. and use const We assert the EditLine pointer is valid (not nullptr) in some methods or just expect it to be valid without asserting. If this is the case then we might as well change the parameter to be a reference. Also change EditLine to const&, where this makes sense in the code. Change-Id: Ia28810fea9d4e053f18fbb45968644545f5bf83b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162012 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 7af59f499e12..d7a30a60b935 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -866,15 +866,15 @@ EditSelection EditEngine::SelectWord( } tools::Long EditEngine::GetXPos( - const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 nIndex, bool bPreferPortionStart) const + const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const { - return pImpEditEngine->GetXPos(pParaPortion, pLine, nIndex, bPreferPortionStart); + return pImpEditEngine->GetXPos(pParaPortion, rLine, nIndex, bPreferPortionStart); } Range EditEngine::GetLineXPosStartEnd( - const ParaPortion* pParaPortion, const EditLine* pLine) const + const ParaPortion* pParaPortion, EditLine const& rLine) const { - return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, pLine); + return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, rLine); } bool EditEngine::IsFormatted() const diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx index abf3c5337255..c1f20e9e55df 100644 --- a/editeng/source/editeng/impedit.cxx +++ b/editeng/source/editeng/impedit.cxx @@ -576,7 +576,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, nEndIndex = nStartIndex; tools::Rectangle aTmpRect(pEditEngine->pImpEditEngine->GetEditCursor( - &rInfo.rPortion, rInfo.pLine, nStartIndex, GetCursorFlags::NONE)); + &rInfo.rPortion, *rInfo.pLine, nStartIndex, GetCursorFlags::NONE)); const Size aLineOffset = pEditEngine->pImpEditEngine->getTopLeftDocOffset(rInfo.aArea); aTmpRect.Move(0, aLineOffset.Height()); @@ -595,8 +595,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, // Now that we have Bidi, the first/last index doesn't have to be the 'most outside' position if (!bPartOfLine) { - Range aLineXPosStartEnd - = pEditEngine->GetLineXPosStartEnd(&rInfo.rPortion, rInfo.pLine); + Range aLineXPosStartEnd = pEditEngine->GetLineXPosStartEnd(&rInfo.rPortion, *rInfo.pLine); aTmpRect.SetLeft(aLineXPosStartEnd.Min()); aTmpRect.SetRight(aLineXPosStartEnd.Max()); aTmpRect.Move(aLineOffset.Width(), 0); @@ -617,10 +616,8 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, DBG_ASSERT(nTmpEndIndex > nTmpStartIndex, "DrawSelectionXOR, Start >= End?"); - tools::Long nX1 - = pEditEngine->GetXPos(&rInfo.rPortion, rInfo.pLine, nTmpStartIndex, true); - tools::Long nX2 - = pEditEngine->GetXPos(&rInfo.rPortion, rInfo.pLine, nTmpEndIndex); + tools::Long nX1 = pEditEngine->GetXPos(&rInfo.rPortion, *rInfo.pLine, nTmpStartIndex, true); + tools::Long nX2 = pEditEngine->GetXPos(&rInfo.rPortion, *rInfo.pLine, nTmpEndIndex); aTmpRect.SetLeft(std::min(nX1, nX2)); aTmpRect.SetRight(std::max(nX1, nX2)); diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 6705f4e5dc4f..61afaea21b83 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -656,10 +656,10 @@ private: std::tuple<const ParaPortion*, const EditLine*, tools::Long> GetPortionAndLine(Point aDocPos); EditPaM GetPaM( Point aDocPos, bool bSmart = true ); bool IsTextPos(const Point& rDocPos, sal_uInt16 nBorder); - tools::Long GetXPos(const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const; - tools::Long GetPortionXOffset(const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 nTextPortion) const; - sal_Int32 GetChar(const ParaPortion* pParaPortion, const EditLine* pLine, tools::Long nX, bool bSmart = true); - Range GetLineXPosStartEnd( const ParaPortion* pParaPortion, const EditLine* pLine ) const; + tools::Long GetXPos(const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const; + tools::Long GetPortionXOffset(const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nTextPortion) const; + sal_Int32 GetChar(const ParaPortion* pParaPortion, EditLine const& rLine, tools::Long nX, bool bSmart = true); + Range GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& rLine) const; void ParaAttribsToCharAttribs( ContentNode* pNode ); void GetCharAttribs( sal_Int32 nPara, std::vector<EECharAttrib>& rLst ) const; @@ -687,8 +687,8 @@ private: void RecalcFormatterFontMetrics( FormatterFontMetric& rCurMetrics, SvxFont& rFont ); void CheckAutoPageSize(); - void ImpBreakLine( ParaPortion* pParaPortion, EditLine* pLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long nRemainingWidth, bool bCanHyphenate ); - void ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine* pLine, tools::Long nRemainingSpace ); + void ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long nRemainingWidth, bool bCanHyphenate ); + void ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& rLine, tools::Long nRemainingSpace ); EditPaM ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pRight, bool bBackward = false ); EditPaM ImpDeleteSelection(const EditSelection& rCurSel); EditPaM ImpInsertParaBreak( EditPaM& rPaM, bool bKeepEndingAttribs = true ); @@ -744,7 +744,7 @@ private: bool ImplCalcAsianCompression( ContentNode* pNode, TextPortion* pTextPortion, sal_Int32 nStartPos, sal_Int32* pDXArray, sal_uInt16 n100thPercentFromMax, bool bManipulateDXArray ); - void ImplExpandCompressedPortions( EditLine* pLine, ParaPortion* pParaPortion, tools::Long nRemainingWidth ); + void ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* pParaPortion, tools::Long nRemainingWidth); void ImplInitLayoutMode(OutputDevice& rOutDev, sal_Int32 nPara, sal_Int32 nIndex); static LanguageType ImplCalcDigitLang(LanguageType eCurLang); @@ -1025,7 +1025,7 @@ public: sal_uInt32 GetTextHeightNTP() const; sal_uInt32 CalcTextWidth( bool bIgnoreExtraSpace); sal_uInt32 CalcParaWidth( sal_Int32 nParagraph, bool bIgnoreExtraSpace ); - sal_uInt32 CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, bool bIgnoreExtraSpace); + sal_uInt32 CalcLineWidth( ParaPortion* pPortion, EditLine const& rLine, bool bIgnoreExtraSpace); sal_Int32 GetLineCount( sal_Int32 nParagraph ) const; sal_Int32 GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const; void GetLineBoundaries( /*out*/sal_Int32& rStart, /*out*/sal_Int32& rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const; @@ -1052,8 +1052,7 @@ public: } tools::Rectangle PaMtoEditCursor( EditPaM aPaM, GetCursorFlags nFlags = GetCursorFlags::NONE ); - tools::Rectangle GetEditCursor(const ParaPortion* pPortion, const EditLine* pLine, - sal_Int32 nIndex, GetCursorFlags nFlags); + tools::Rectangle GetEditCursor(const ParaPortion* pPortion, EditLine const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags); bool IsModified() const { return maEditDoc.IsModified(); } void SetModifyFlag(bool b) { maEditDoc.SetModified( b ); } diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index 6e9351a7c80e..065b28e69f18 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -578,8 +578,7 @@ bool ImpEditEngine::Command( const CommandEvent& rCEvt, EditView* pView ) { if (rInfo.pLine->IsIn(n)) { - tools::Rectangle aR = GetEditCursor(pParaPortion, rInfo.pLine, n, - GetCursorFlags::NONE); + tools::Rectangle aR = GetEditCursor(pParaPortion, *rInfo.pLine, n, GetCursorFlags::NONE); aR.Move(getTopLeftDocOffset(rInfo.aArea)); aRects[n - nMinPos] = pView->GetImpEditView()->GetWindowPos(aR); } @@ -1275,7 +1274,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView ) tools::Long nX; if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW ) { - nX = GetXPos( pPPortion, &rLine, rPaM.GetIndex() ); + nX = GetXPos(pPPortion, rLine, rPaM.GetIndex()); pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef; } else @@ -1285,7 +1284,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView ) if ( nLine ) // same paragraph { const EditLine& rPrevLine = pPPortion->GetLines()[nLine-1]; - aNewPaM.SetIndex( GetChar( pPPortion, &rPrevLine, nX ) ); + aNewPaM.SetIndex(GetChar(pPPortion, rPrevLine, nX)); // If a previous automatically wrapped line, and one has to be exactly // at the end of this line, the cursor lands on the current line at the // beginning. See Problem: Last character of an automatically wrapped @@ -1300,7 +1299,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView ) { const EditLine& rLine2 = pPrevPortion->GetLines()[pPrevPortion->GetLines().Count()-1]; aNewPaM.SetNode( pPrevPortion->GetNode() ); - aNewPaM.SetIndex( GetChar( pPrevPortion, &rLine2, nX + mnOnePixelInRef ) ); + aNewPaM.SetIndex(GetChar(pPrevPortion, rLine2, nX + mnOnePixelInRef)); } } @@ -1319,7 +1318,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView ) if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW ) { const EditLine& rLine = pPPortion->GetLines()[nLine]; - nX = GetXPos( pPPortion, &rLine, rPaM.GetIndex() ); + nX = GetXPos(pPPortion, rLine, rPaM.GetIndex()); pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef; } else @@ -1329,7 +1328,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView ) if ( nLine < pPPortion->GetLines().Count()-1 ) { const EditLine& rNextLine = pPPortion->GetLines()[nLine+1]; - aNewPaM.SetIndex( GetChar( pPPortion, &rNextLine, nX ) ); + aNewPaM.SetIndex(GetChar(pPPortion, rNextLine, nX)); // Special treatment, see CursorUp ... if ( ( aNewPaM.GetIndex() == rNextLine.GetEnd() ) && ( aNewPaM.GetIndex() > rNextLine.GetStart() ) && ( aNewPaM.GetIndex() < pPPortion->GetNode()->Len() ) ) aNewPaM = CursorLeft( aNewPaM ); @@ -1343,7 +1342,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView ) aNewPaM.SetNode( pNextPortion->GetNode() ); // Never at the very end when several lines, because then a line // below the cursor appears. - aNewPaM.SetIndex( GetChar( pNextPortion, &rLine, nX + mnOnePixelInRef ) ); + aNewPaM.SetIndex(GetChar(pNextPortion, rLine, nX + mnOnePixelInRef)); if ( ( aNewPaM.GetIndex() == rLine.GetEnd() ) && ( aNewPaM.GetIndex() > rLine.GetStart() ) && ( pNextPortion->GetLines().Count() > 1 ) ) aNewPaM = CursorLeft( aNewPaM ); } @@ -3121,41 +3120,41 @@ EditPaM ImpEditEngine::InsertLineBreak(const EditSelection& aCurSel) // Helper functions -tools::Rectangle ImpEditEngine::GetEditCursor(const ParaPortion* pPortion, const EditLine* pLine, +tools::Rectangle ImpEditEngine::GetEditCursor(const ParaPortion* pPortion, EditLine const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags) { - assert(pPortion && pLine); + assert(pPortion); // nIndex might be not in the line // Search within the line... tools::Long nX; - if ((nIndex == pLine->GetStart()) && (nFlags & GetCursorFlags::StartOfLine)) + if ((nIndex == rLine.GetStart()) && (nFlags & GetCursorFlags::StartOfLine)) { - Range aXRange = GetLineXPosStartEnd(pPortion, pLine); + Range aXRange = GetLineXPosStartEnd(pPortion, rLine); nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? aXRange.Min() : aXRange.Max(); } - else if ((nIndex == pLine->GetEnd()) && (nFlags & GetCursorFlags::EndOfLine)) + else if ((nIndex == rLine.GetEnd()) && (nFlags & GetCursorFlags::EndOfLine)) { - Range aXRange = GetLineXPosStartEnd(pPortion, pLine); + Range aXRange = GetLineXPosStartEnd(pPortion, rLine); nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? aXRange.Max() : aXRange.Min(); } else { - nX = GetXPos(pPortion, pLine, nIndex, bool(nFlags & GetCursorFlags::PreferPortionStart)); + nX = GetXPos(pPortion, rLine, nIndex, bool(nFlags & GetCursorFlags::PreferPortionStart)); } tools::Rectangle aEditCursor; aEditCursor.SetLeft(nX); aEditCursor.SetRight(nX); - aEditCursor.SetBottom(pLine->GetHeight() - 1); + aEditCursor.SetBottom(rLine.GetHeight() - 1); if (nFlags & GetCursorFlags::TextOnly) - aEditCursor.SetTop(aEditCursor.Bottom() - pLine->GetTxtHeight() + 1); + aEditCursor.SetTop(aEditCursor.Bottom() - rLine.GetTxtHeight() + 1); else aEditCursor.SetTop(aEditCursor.Bottom() - - std::min(pLine->GetTxtHeight(), pLine->GetHeight()) + 1); + - std::min(rLine.GetTxtHeight(), rLine.GetHeight()) + 1); return aEditCursor; } @@ -3192,7 +3191,7 @@ tools::Rectangle ImpEditEngine::PaMtoEditCursor( EditPaM aPaM, GetCursorFlags nF if (pLastLine) { - aEditCursor = GetEditCursor(pPortion, pLastLine, nIndex, nFlags); + aEditCursor = GetEditCursor(pPortion, *pLastLine, nIndex, nFlags); aEditCursor.Move(getTopLeftDocOffset(aLineArea)); } else @@ -3334,8 +3333,8 @@ EditPaM ImpEditEngine::GetPaM( Point aDocPos, bool bSmart ) if (const auto& [pPortion, pLine, nLineStartX] = GetPortionAndLine(aDocPos); pPortion) { - sal_Int32 nCurIndex - = GetChar(pPortion, pLine, aDocPos.X() - nLineStartX, bSmart); + assert(pLine); + sal_Int32 nCurIndex = GetChar(pPortion, *pLine, aDocPos.X() - nLineStartX, bSmart); EditPaM aPaM(pPortion->GetNode(), nCurIndex); if (nCurIndex && (nCurIndex == pLine->GetEnd()) @@ -3353,7 +3352,8 @@ bool ImpEditEngine::IsTextPos(const Point& rDocPos, sal_uInt16 nBorder) { if (const auto& [pPortion, pLine, nLineStartX] = GetPortionAndLine(rDocPos); pPortion) { - Range aLineXPosStartEnd = GetLineXPosStartEnd(pPortion, pLine); + assert(pLine); + Range aLineXPosStartEnd = GetLineXPosStartEnd(pPortion, *pLine); if ((rDocPos.X() >= nLineStartX + aLineXPosStartEnd.Min() - nBorder) && (rDocPos.X() <= nLineStartX + aLineXPosStartEnd.Max() + nBorder)) return true; @@ -3412,7 +3412,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace sal_Int32 nLines = pPortion->GetLines().Count(); for ( sal_Int32 nLine = 0; nLine < nLines; nLine++ ) { - EditLine& rLine = pPortion->GetLines()[nLine]; + EditLine const& rLine = pPortion->GetLines()[nLine]; // nCurWidth = pLine->GetStartPosX(); // For Center- or Right- alignment it depends on the paper // width, here not preferred. I general, it is best not leave it @@ -3431,7 +3431,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace } } nCurWidth += scaleXSpacingValue(rLRItem.GetRight()); - nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace ); + nCurWidth += CalcLineWidth(pPortion, rLine, bIgnoreExtraSpace); if ( nCurWidth > nMaxWidth ) { nMaxWidth = nCurWidth; @@ -3443,7 +3443,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace return static_cast<sal_uInt32>(nMaxWidth); } -sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, bool bIgnoreExtraSpace ) +sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* pPortion, EditLine const& rLine, bool bIgnoreExtraSpace) { sal_Int32 nPara = GetEditDoc().GetPos( pPortion->GetNode() ); @@ -3457,8 +3457,8 @@ sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, // Calculation of the width without the Indents ... sal_uInt32 nWidth = 0; - sal_Int32 nPos = pLine->GetStart(); - for ( sal_Int32 nTP = pLine->GetStartPortion(); nTP <= pLine->GetEndPortion(); nTP++ ) + sal_Int32 nPos = rLine.GetStart(); + for ( sal_Int32 nTP = rLine.GetStartPortion(); nTP <= rLine.GetEndPortion(); nTP++ ) { const TextPortion& rTextPortion = pPortion->GetTextPortions()[nTP]; switch ( rTextPortion.GetKind() ) @@ -3997,20 +3997,17 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< datatransfer::XTransfera return aNewSelection; } -sal_Int32 ImpEditEngine::GetChar( - const ParaPortion* pParaPortion, const EditLine* pLine, tools::Long nXPos, bool bSmart) +sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine const& rLine, tools::Long nXPos, bool bSmart) { - assert(pLine); - sal_Int32 nChar = -1; - sal_Int32 nCurIndex = pLine->GetStart(); + sal_Int32 nCurIndex = rLine.GetStart(); // Search best matching portion with GetPortionXOffset() - for ( sal_Int32 i = pLine->GetStartPortion(); i <= pLine->GetEndPortion(); i++ ) + for ( sal_Int32 i = rLine.GetStartPortion(); i <= rLine.GetEndPortion(); i++ ) { const TextPortion& rPortion = pParaPortion->GetTextPortions()[i]; - tools::Long nXLeft = GetPortionXOffset( pParaPortion, pLine, i ); + tools::Long nXLeft = GetPortionXOffset( pParaPortion, rLine, i ); tools::Long nXRight = nXLeft + rPortion.GetSize().Width(); if ( ( nXLeft <= nXPos ) && ( nXRight >= nXPos ) ) { @@ -4034,7 +4031,7 @@ sal_Int32 ImpEditEngine::GetChar( { sal_Int32 nMax = rPortion.GetLen(); sal_Int32 nOffset = -1; - sal_Int32 nTmpCurIndex = nChar - pLine->GetStart(); + sal_Int32 nTmpCurIndex = nChar - rLine.GetStart(); tools::Long nXInPortion = nXPos - nXLeft; if ( rPortion.IsRightToLeft() ) @@ -4043,11 +4040,11 @@ sal_Int32 ImpEditEngine::GetChar( // Search in Array... for ( sal_Int32 x = 0; x < nMax; x++ ) { - tools::Long nTmpPosMax = pLine->GetCharPosArray()[nTmpCurIndex+x]; + tools::Long nTmpPosMax = rLine.GetCharPosArray()[nTmpCurIndex+x]; if ( nTmpPosMax > nXInPortion ) { // Check whether this or the previous... - tools::Long nTmpPosMin = x ? pLine->GetCharPosArray()[nTmpCurIndex+x-1] : 0; + tools::Long nTmpPosMin = x ? rLine.GetCharPosArray()[nTmpCurIndex+x-1] : 0; tools::Long nDiffLeft = nXInPortion - nTmpPosMin; tools::Long nDiffRight = nTmpPosMax - nXInPortion; OSL_ENSURE( nDiffLeft >= 0, "DiffLeft negative" ); @@ -4058,8 +4055,8 @@ sal_Int32 ImpEditEngine::GetChar( // I18N: If there are character position with the length of 0, // they belong to the same character, we can not use this position as an index. // Skip all 0-positions, cheaper than using XBreakIterator: - tools::Long nX = pLine->GetCharPosArray()[nTmpCurIndex + x]; - while(x < nMax && pLine->GetCharPosArray()[nTmpCurIndex + x] == nX) + tools::Long nX = rLine.GetCharPosArray()[nTmpCurIndex + x]; + while(x < nMax && rLine.GetCharPosArray()[nTmpCurIndex + x] == nX) ++x; } nOffset = x; @@ -4112,38 +4109,36 @@ sal_Int32 ImpEditEngine::GetChar( if ( nChar == -1 ) { - nChar = ( nXPos <= pLine->GetStartPosX() ) ? pLine->GetStart() : pLine->GetEnd(); + nChar = ( nXPos <= rLine.GetStartPosX() ) ? rLine.GetStart() : rLine.GetEnd(); } return nChar; } -Range ImpEditEngine::GetLineXPosStartEnd( const ParaPortion* pParaPortion, const EditLine* pLine ) const +Range ImpEditEngine::GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& rLine) const { Range aLineXPosStartEnd; sal_Int32 nPara = GetEditDoc().GetPos( pParaPortion->GetNode() ); if ( !IsRightToLeft( nPara ) ) { - aLineXPosStartEnd.Min() = pLine->GetStartPosX(); - aLineXPosStartEnd.Max() = pLine->GetStartPosX() + pLine->GetTextWidth(); + aLineXPosStartEnd.Min() = rLine.GetStartPosX(); + aLineXPosStartEnd.Max() = rLine.GetStartPosX() + rLine.GetTextWidth(); } else { - aLineXPosStartEnd.Min() = GetPaperSize().Width() - ( pLine->GetStartPosX() + pLine->GetTextWidth() ); - aLineXPosStartEnd.Max() = GetPaperSize().Width() - pLine->GetStartPosX(); + aLineXPosStartEnd.Min() = GetPaperSize().Width() - (rLine.GetStartPosX() + rLine.GetTextWidth()); + aLineXPosStartEnd.Max() = GetPaperSize().Width() - rLine.GetStartPosX(); } - return aLineXPosStartEnd; } -tools::Long ImpEditEngine::GetPortionXOffset( - const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 nTextPortion) const +tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nTextPortion) const { - tools::Long nX = pLine->GetStartPosX(); + tools::Long nX = rLine.GetStartPosX(); - for ( sal_Int32 i = pLine->GetStartPortion(); i < nTextPortion; i++ ) + for ( sal_Int32 i = rLine.GetStartPortion(); i < nTextPortion; i++ ) { const TextPortion& rPortion = pParaPortion->GetTextPortions()[i]; switch ( rPortion.GetKind() ) @@ -4170,7 +4165,7 @@ tools::Long ImpEditEngine::GetPortionXOffset( { // Portions behind must be added, visual before this portion sal_Int32 nTmpPortion = nTextPortion+1; - while ( nTmpPortion <= pLine->GetEndPortion() ) + while ( nTmpPortion <= rLine.GetEndPortion() ) { const TextPortion& rNextTextPortion = pParaPortion->GetTextPortions()[nTmpPortion]; if ( rNextTextPortion.GetRightToLeftLevel() && ( rNextTextPortion.GetKind() != PortionKind::TAB ) ) @@ -4181,7 +4176,7 @@ tools::Long ImpEditEngine::GetPortionXOffset( } -e ... etc. - the rest is truncated