diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2024-01-15 11:57:08 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2024-01-15 14:28:11 +0100 |
commit | bf6cf27763b88583b7562c41c791fff45308362d (patch) | |
tree | 219033e6965ee7d4e7ce7f15c15e37f97a57e01c /editeng | |
parent | 6da480d086a599f6a0159c5244ce8fe0ae4131b8 (diff) |
editeng: return ParaPortion from the list as a ref.
Change operator[] for getRef(..) method, so instead of returning
a pointer, return a reference to ParaPortion instead. This also
needs changes to the code, because we now need to make sure before
hand that the ParaPortion is really available in the list and when
this is not possible or convenient, the change the call to use
existing "SafeGetObject" instead. Add "exists" to check if the
object is available in the ParaPortionList.
In addition add "lastIndex" method to return the index of the
last ParaPortion in the list (shortcut for Count() - 1).
Change-Id: Id52c38f996468af51c75d50185110ec8502169e2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162071
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/inc/ParagraphPortionList.hxx | 23 | ||||
-rw-r--r-- | editeng/qa/unit/core-test.cxx | 8 | ||||
-rw-r--r-- | editeng/source/editeng/editdbg.cxx | 32 | ||||
-rw-r--r-- | editeng/source/editeng/editdoc.cxx | 20 | ||||
-rw-r--r-- | editeng/source/editeng/editeng.cxx | 21 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.cxx | 16 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.hxx | 4 | ||||
-rw-r--r-- | editeng/source/editeng/impedit2.cxx | 109 | ||||
-rw-r--r-- | editeng/source/editeng/impedit3.cxx | 298 | ||||
-rw-r--r-- | editeng/source/editeng/impedit4.cxx | 33 | ||||
-rw-r--r-- | editeng/source/editeng/impedit5.cxx | 23 |
11 files changed, 302 insertions, 285 deletions
diff --git a/editeng/inc/ParagraphPortionList.hxx b/editeng/inc/ParagraphPortionList.hxx index aa7862afa8d7..7ee252132d4e 100644 --- a/editeng/inc/ParagraphPortionList.hxx +++ b/editeng/inc/ParagraphPortionList.hxx @@ -38,18 +38,33 @@ public: tools::Long GetYOffset(const ParaPortion* pPPortion) const; sal_Int32 FindParagraph(tools::Long nYOffset) const; - const ParaPortion* SafeGetObject(sal_Int32 nPos) const; - ParaPortion* SafeGetObject(sal_Int32 nPos); + const ParaPortion* SafeGetObject(sal_Int32 nPos) const + { + return exists(nPos) ? maPortions[nPos].get() : nullptr; + } + + ParaPortion* SafeGetObject(sal_Int32 nPos) + { + return exists(nPos) ? maPortions[nPos].get() : nullptr; + } sal_Int32 GetPos(const ParaPortion* p) const; - ParaPortion* operator[](sal_Int32 nPos); - const ParaPortion* operator[](sal_Int32 nPos) const; + + ParaPortion& getRef(sal_Int32 nPosition) { return *maPortions[nPosition]; } + ParaPortion const& getRef(sal_Int32 nPosition) const { return *maPortions[nPosition]; } std::unique_ptr<ParaPortion> Release(sal_Int32 nPos); void Remove(sal_Int32 nPos); void Insert(sal_Int32 nPos, std::unique_ptr<ParaPortion> p); void Append(std::unique_ptr<ParaPortion> p); sal_Int32 Count() const; + sal_Int32 lastIndex() const { return Count() - 1; } + + bool exists(sal_Int32 nPosition) const + { + return nPosition >= 0 && o3tl::make_unsigned(nPosition) < maPortions.size() + && maPortions[nPosition]; + } ParaPortionContainerType::iterator begin() { return maPortions.begin(); } ParaPortionContainerType::iterator end() { return maPortions.end(); } diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx index e0fb7ada253c..097602ec6b4c 100644 --- a/editeng/qa/unit/core-test.cxx +++ b/editeng/qa/unit/core-test.cxx @@ -199,8 +199,8 @@ void Test::testLineSpacing() aEditEngine.QuickSetAttribs(*pSet, aSelection); // Assert changes - ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0]; - ContentNode* const pNode = pParaPortion->GetNode(); + ParaPortion const& rParaPortion = aEditEngine.GetParaPortions().getRef(0); + ContentNode* const pNode = rParaPortion.GetNode(); const SvxLineSpacingItem& rLSItem = pNode->GetContentAttribs().GetItem(EE_PARA_SBL); CPPUNIT_ASSERT_EQUAL(SvxInterLineSpaceRule::Prop, rLSItem.GetInterLineSpaceRule()); CPPUNIT_ASSERT_EQUAL(nSpace, rLSItem.GetPropLineSpace()); @@ -2094,7 +2094,7 @@ void Test::testCreateLines() CPPUNIT_ASSERT_EQUAL(sal_Int32(2), rParagraphPortionList.Count()); { - EditLineList& rLines = rParagraphPortionList[0]->GetLines(); + EditLineList& rLines = rParagraphPortionList.getRef(0).GetLines(); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rLines.Count()); EditLine const& rLine = rLines[0]; @@ -2110,7 +2110,7 @@ void Test::testCreateLines() } { - EditLineList& rLines = rParagraphPortionList[1]->GetLines(); + EditLineList& rLines = rParagraphPortionList.getRef(1).GetLines(); CPPUNIT_ASSERT_EQUAL(sal_Int32(5), rLines.Count()); { diff --git a/editeng/source/editeng/editdbg.cxx b/editeng/source/editeng/editdbg.cxx index 74cd266d8bb8..1d43b1dc8487 100644 --- a/editeng/source/editeng/editdbg.cxx +++ b/editeng/source/editeng/editdbg.cxx @@ -347,22 +347,22 @@ void EditEngine::DumpData(const EditEngine* pEE, bool bInfoBox) fprintf( fp, "\n================================================================================" ); for ( sal_Int32 nPortion = 0; nPortion < pEE->pImpEditEngine->GetParaPortions().Count(); nPortion++) { - ParaPortion* pPPortion = pEE->pImpEditEngine->GetParaPortions()[nPortion]; + ParaPortion const& rPPortion = pEE->pImpEditEngine->GetParaPortions().getRef(nPortion); fprintf( fp, "\nParagraph %" SAL_PRIdINT32 ": Length = %" SAL_PRIdINT32 ", Invalid = %i\nText = '%s'", - nPortion, pPPortion->GetNode()->Len(), pPPortion->IsInvalid(), - OUStringToOString(pPPortion->GetNode()->GetString(), RTL_TEXTENCODING_UTF8).getStr() ); + nPortion, rPPortion.GetNode()->Len(), rPPortion.IsInvalid(), + OUStringToOString(rPPortion.GetNode()->GetString(), RTL_TEXTENCODING_UTF8).getStr() ); fprintf( fp, "\nVorlage:" ); - SfxStyleSheet* pStyle = pPPortion->GetNode()->GetStyleSheet(); + SfxStyleSheet* pStyle = rPPortion.GetNode()->GetStyleSheet(); if ( pStyle ) fprintf( fp, " %s", OUStringToOString( pStyle->GetName(), RTL_TEXTENCODING_UTF8).getStr() ); fprintf( fp, "\nParagraph attribute:" ); - DbgOutItemSet( fp, pPPortion->GetNode()->GetContentAttribs().GetItems(), false, false ); + DbgOutItemSet( fp, rPPortion.GetNode()->GetContentAttribs().GetItems(), false, false ); fprintf( fp, "\nCharacter attribute:" ); bool bZeroAttr = false; - for ( sal_Int32 z = 0; z < pPPortion->GetNode()->GetCharAttribs().Count(); ++z ) + for ( sal_Int32 z = 0; z < rPPortion.GetNode()->GetCharAttribs().Count(); ++z ) { - const std::unique_ptr<EditCharAttrib>& rAttr = pPPortion->GetNode()->GetCharAttribs().GetAttribs()[z]; + const std::unique_ptr<EditCharAttrib>& rAttr = rPPortion.GetNode()->GetCharAttribs().GetAttribs()[z]; OString aCharAttribs = "\nA" + OString::number(nPortion) @@ -382,20 +382,20 @@ void EditEngine::DumpData(const EditEngine* pEE, bool bInfoBox) if ( bZeroAttr ) fprintf( fp, "\nNULL-Attribute!" ); - const sal_Int32 nTextPortions = pPPortion->GetTextPortions().Count(); + const sal_Int32 nTextPortions = rPPortion.GetTextPortions().Count(); OStringBuffer aPortionStr("\nText portions: #" + OString::number(nTextPortions) + " \nA" + OString::number(nPortion) + ": Paragraph Length = " - + OString::number(pPPortion->GetNode()->Len()) + + OString::number(rPPortion.GetNode()->Len()) + "\nA" + OString::number(nPortion) + ": "); sal_Int32 n = 0; for ( sal_Int32 z = 0; z < nTextPortions; ++z ) { - TextPortion& rPortion = pPPortion->GetTextPortions()[z]; + TextPortion const& rPortion = rPPortion.GetTextPortions()[z]; aPortionStr.append(" " + OString::number(rPortion.GetLen()) + "(" @@ -410,23 +410,23 @@ void EditEngine::DumpData(const EditEngine* pEE, bool bInfoBox) + OString::number(nPortion) + ": Total length: " + OString::number(n)); - if ( pPPortion->GetNode()->Len() != n ) + if ( rPPortion.GetNode()->Len() != n ) aPortionStr.append(" => Error !!!"); fprintf(fp, "%s", aPortionStr.getStr()); fprintf( fp, "\n\nLines:" ); // First the content ... - for ( sal_Int32 nLine = 0; nLine < pPPortion->GetLines().Count(); nLine++ ) + for ( sal_Int32 nLine = 0; nLine < rPPortion.GetLines().Count(); nLine++ ) { - EditLine& rLine = pPPortion->GetLines()[nLine]; + EditLine const& rLine = rPPortion.GetLines()[nLine]; - OString aLine(OUStringToOString(pPPortion->GetNode()->Copy(rLine.GetStart(), rLine.GetEnd() - rLine.GetStart()), RTL_TEXTENCODING_ASCII_US)); + OString aLine(OUStringToOString(rPPortion.GetNode()->Copy(rLine.GetStart(), rLine.GetEnd() - rLine.GetStart()), RTL_TEXTENCODING_ASCII_US)); fprintf( fp, "\nLine %" SAL_PRIdINT32 "\t>%s<", nLine, aLine.getStr() ); } // then the internal data ... - for ( sal_Int32 nLine = 0; nLine < pPPortion->GetLines().Count(); nLine++ ) + for ( sal_Int32 nLine = 0; nLine < rPPortion.GetLines().Count(); nLine++ ) { - EditLine& rLine = pPPortion->GetLines()[nLine]; + EditLine const& rLine = rPPortion.GetLines()[nLine]; fprintf( fp, "\nLine %" SAL_PRIdINT32 ":\tStart: %" SAL_PRIdINT32 ",\tEnd: %" SAL_PRIdINT32, nLine, rLine.GetStart(), rLine.GetEnd() ); fprintf( fp, "\t\tPortions: %" SAL_PRIdINT32 " - %" SAL_PRIdINT32 ".\tHight: %i, Ascent=%i", rLine.GetStartPortion(), rLine.GetEndPortion(), rLine.GetHeight(), rLine.GetMaxAscent() ); } diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx index acbd97baf87b..1bd6504b2374 100644 --- a/editeng/source/editeng/editdoc.cxx +++ b/editeng/source/editeng/editdoc.cxx @@ -526,16 +526,6 @@ sal_Int32 ParaPortionList::GetPos(const ParaPortion* p) const return FastGetPos(maPortions, p, nLastCache); } -ParaPortion* ParaPortionList::operator [](sal_Int32 nPos) -{ - return 0 <= nPos && o3tl::make_unsigned(nPos) < maPortions.size() ? maPortions[nPos].get() : nullptr; -} - -const ParaPortion* ParaPortionList::operator [](sal_Int32 nPos) const -{ - return 0 <= nPos && o3tl::make_unsigned(nPos) < maPortions.size() ? maPortions[nPos].get() : nullptr; -} - std::unique_ptr<ParaPortion> ParaPortionList::Release(sal_Int32 nPos) { if (nPos < 0 || maPortions.size() <= o3tl::make_unsigned(nPos)) @@ -615,16 +605,6 @@ sal_Int32 ParaPortionList::FindParagraph(tools::Long nYOffset) const return EE_PARA_NOT_FOUND; } -const ParaPortion* ParaPortionList::SafeGetObject(sal_Int32 nPos) const -{ - return 0 <= nPos && o3tl::make_unsigned(nPos) < maPortions.size() ? maPortions[nPos].get() : nullptr; -} - -ParaPortion* ParaPortionList::SafeGetObject(sal_Int32 nPos) -{ - return 0 <= nPos && o3tl::make_unsigned(nPos) < maPortions.size() ? maPortions[nPos].get() : nullptr; -} - #if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG void ParaPortionList::DbgCheck(ParaPortionList const& rParas, EditDoc const& rDoc) diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 300b2fc65a0d..c55ace752c2b 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -1925,7 +1925,7 @@ void EditEngine::SetControlWord( EEControlBits nWord ) for ( sal_Int32 n = 0; n < nNodes; n++ ) { ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( n ); - const ParaPortion* pPortion = pImpEditEngine->GetParaPortions()[n]; + ParaPortion const& rPortion = pImpEditEngine->GetParaPortions().getRef(n); bool bWrongs = false; if (pNode->GetWrongList() != nullptr) bWrongs = !pNode->GetWrongList()->empty(); @@ -1935,10 +1935,10 @@ void EditEngine::SetControlWord( EEControlBits nWord ) pImpEditEngine->maInvalidRect.SetLeft( 0 ); pImpEditEngine->maInvalidRect.SetRight( pImpEditEngine->GetPaperSize().Width() ); pImpEditEngine->maInvalidRect.SetTop( nY+1 ); - pImpEditEngine->maInvalidRect.SetBottom( nY+pPortion->GetHeight()-1 ); + pImpEditEngine->maInvalidRect.SetBottom(nY + rPortion.GetHeight() - 1); pImpEditEngine->UpdateViews(pImpEditEngine->mpActiveView); } - nY += pPortion->GetHeight(); + nY += rPortion.GetHeight(); } } } @@ -2305,8 +2305,8 @@ bool EditEngine::ShouldCreateBigTextObject() const sal_Int32 nParas = pImpEditEngine->GetEditDoc().Count(); for ( sal_Int32 nPara = 0; nPara < nParas; nPara++ ) { - ParaPortion* pParaPortion = pImpEditEngine->GetParaPortions()[nPara]; - nTextPortions = nTextPortions + pParaPortion->GetTextPortions().Count(); + ParaPortion& rParaPortion = pImpEditEngine->GetParaPortions().getRef(nPara); + nTextPortions = nTextPortions + rParaPortion.GetTextPortions().Count(); } return nTextPortions >= pImpEditEngine->GetBigTextObjectStart(); } @@ -2461,13 +2461,12 @@ ParagraphInfos EditEngine::GetParagraphInfos( sal_Int32 nPara ) ParagraphInfos aInfos; aInfos.bValid = pImpEditEngine->IsFormatted(); - if ( pImpEditEngine->IsFormatted() ) + if (pImpEditEngine->IsFormatted() && pImpEditEngine->GetParaPortions().exists(nPara)) { - const ParaPortion* pParaPortion = pImpEditEngine->GetParaPortions()[nPara]; - const EditLine* pLine = (pParaPortion && pParaPortion->GetLines().Count()) ? - &pParaPortion->GetLines()[0] : nullptr; - DBG_ASSERT( pParaPortion && pLine, "GetParagraphInfos - Paragraph out of range" ); - if ( pParaPortion && pLine ) + ParaPortion const& rParaPortion = pImpEditEngine->GetParaPortions().getRef(nPara); + const EditLine* pLine = (rParaPortion.GetLines().Count()) ? &rParaPortion.GetLines()[0] : nullptr; + DBG_ASSERT(pLine, "GetParagraphInfos - Paragraph out of range"); + if (pLine) { aInfos.nFirstLineHeight = pLine->GetHeight(); aInfos.nFirstLineTextHeight = pLine->GetTxtHeight(); diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx index 46c9928e300f..598a4c68d1b3 100644 --- a/editeng/source/editeng/impedit.cxx +++ b/editeng/source/editeng/impedit.cxx @@ -1149,7 +1149,7 @@ tools::Rectangle ImpEditView::GetEditCursor() const if (nPara == EE_PARA_NOT_FOUND) // #i94322 return tools::Rectangle(); - const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara]; + ParaPortion const& rParaPortion = pEditEngine->GetParaPortions().getRef(nPara); GetCursorFlags nShowCursorFlags = nExtraCursorFlags | GetCursorFlags::TextOnly; @@ -1162,7 +1162,7 @@ tools::Rectangle ImpEditView::GetEditCursor() const nShowCursorFlags |= GetCursorFlags::PreferPortionStart; } - return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, *pParaPortion); + return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, rParaPortion); } void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor ) @@ -1196,7 +1196,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor ) if (nPara == EE_PARA_NOT_FOUND) // #i94322 return; - const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara]; + ParaPortion const& rParaPortion = pEditEngine->GetParaPortions().getRef(nPara); GetCursorFlags nShowCursorFlags = nExtraCursorFlags | GetCursorFlags::TextOnly; @@ -1209,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, rParaPortion); if ( bGotoCursor ) // && (!pEditEngine->pImpEditEngine->GetStatus().AutoPageSize() ) ) { @@ -1456,8 +1456,8 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor ) CursorDirection nCursorDir = CursorDirection::NONE; if ( IsInsertMode() && !aEditSelection.HasRange() && ( pEditEngine->pImpEditEngine->HasDifferentRTLLevels( aPaM.GetNode() ) ) ) { - sal_uInt16 nTextPortion = pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, bool(nShowCursorFlags & GetCursorFlags::PreferPortionStart) ); - const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[nTextPortion]; + sal_uInt16 nTextPortion = rParaPortion.GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, bool(nShowCursorFlags & GetCursorFlags::PreferPortionStart) ); + const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[nTextPortion]; if (rTextPortion.IsRightToLeft()) nCursorDir = CursorDirection::RTL; else @@ -1891,8 +1891,8 @@ bool ImpEditView::IsBulletArea( const Point& rPos, sal_Int32* pPara ) sal_Int32 nPara = pEditEngine->GetEditDoc().GetPos( aPaM.GetNode() ); tools::Rectangle aBulletArea = pEditEngine->GetBulletArea( nPara ); tools::Long nY = pEditEngine->GetDocPosTopLeft( nPara ).Y(); - const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara]; - nY += pParaPortion->GetFirstLineOffset(); + ParaPortion const& rParaPortion = pEditEngine->GetParaPortions().getRef(nPara); + nY += rParaPortion.GetFirstLineOffset(); if ( ( aDocPos.Y() > ( nY + aBulletArea.Top() ) ) && ( aDocPos.Y() < ( nY + aBulletArea.Bottom() ) ) && ( aDocPos.X() > ( aBulletArea.Left() ) ) && diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 75a89f3cb047..b55d91dda690 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -848,14 +848,14 @@ private: { sal_Int32 nPos = maEditDoc.GetPos( pNode ); DBG_ASSERT( nPos < GetParaPortions().Count(), "Portionloser Node?" ); - return GetParaPortions()[ nPos ]; + return GetParaPortions().SafeGetObject(nPos); } ParaPortion* FindParaPortion(ContentNode const * pNode) { sal_Int32 nPos = maEditDoc.GetPos( pNode ); DBG_ASSERT( nPos < GetParaPortions().Count(), "Portionloser Node?" ); - return GetParaPortions()[ nPos ]; + return GetParaPortions().SafeGetObject(nPos); } css::uno::Reference< css::datatransfer::XTransferable > CreateTransferable( const EditSelection& rSelection ); diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index ccb485789c74..9733f9fa638c 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -2166,27 +2166,35 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_Int32 n ParaPortion* pRecalc3 = nullptr; ParaPortion* pRecalc4 = nullptr; - if ( nNewPos == 0 ) // Move to Start + if (nNewPos == 0) // Move to Start { - pRecalc1 = GetParaPortions()[0]; - pRecalc2 = GetParaPortions()[aOldPositions.Min()]; + if (GetParaPortions().exists(0)) + pRecalc1 = &GetParaPortions().getRef(0); + if (GetParaPortions().exists(aOldPositions.Min())) + pRecalc2 = &GetParaPortions().getRef(aOldPositions.Min()); } - else if ( nNewPos == nParaCount ) + else if (nNewPos == nParaCount) { - pRecalc1 = GetParaPortions()[nParaCount-1]; - pRecalc2 = GetParaPortions()[aOldPositions.Max()]; + if (GetParaPortions().exists(nParaCount - 1)) + pRecalc1 = &GetParaPortions().getRef(nParaCount - 1); + if (GetParaPortions().exists(aOldPositions.Max())) + pRecalc2 = &GetParaPortions().getRef(aOldPositions.Max()); } - if ( aOldPositions.Min() == 0 ) // Move from Start + if (aOldPositions.Min() == 0) // Move from Start { - pRecalc3 = GetParaPortions()[0]; - pRecalc4 = GetParaPortions()[aOldPositions.Max()+1]; + if (GetParaPortions().exists(0)) + pRecalc3 = &GetParaPortions().getRef(0); + if (GetParaPortions().exists(aOldPositions.Max() + 1)) + pRecalc4 = &GetParaPortions().getRef(aOldPositions.Max() + 1); } - else if ( aOldPositions.Max() == (nParaCount-1) ) + else if (aOldPositions.Max() == nParaCount - 1) { - pRecalc3 = GetParaPortions()[aOldPositions.Max()]; - pRecalc4 = GetParaPortions()[aOldPositions.Min()-1]; + if (GetParaPortions().exists(aOldPositions.Max())) + pRecalc3 = &GetParaPortions().getRef(aOldPositions.Max()); + if (GetParaPortions().exists(aOldPositions.Min() - 1)) + pRecalc4 = &GetParaPortions().getRef(aOldPositions.Min() - 1); } MoveParagraphsInfo aMoveParagraphsInfo( aOldPositions.Min(), aOldPositions.Max(), nNewPos ); @@ -2342,9 +2350,9 @@ EditPaM ImpEditEngine::ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pR // the change of the total text height too late... for ( sal_Int32 n = nParagraphTobeDeleted; n < GetParaPortions().Count(); n++ ) { - ParaPortion* pPP = GetParaPortions()[n]; - pPP->MarkSelectionInvalid( 0 ); - pPP->GetLines().Reset(); + ParaPortion& rParaPortion = GetParaPortions().getRef(n); + rParaPortion.MarkSelectionInvalid(0); + rParaPortion.GetLines().Reset(); } } @@ -3103,9 +3111,9 @@ bool ImpEditEngine::UpdateFields() if ( bChangesInPara ) { // If possible be more precise when invalidate. - ParaPortion* pPortion = GetParaPortions()[nPara]; - assert(pPortion); - pPortion->MarkSelectionInvalid( 0 ); + assert(GetParaPortions().exists(nPara)); + ParaPortion& rPortion = GetParaPortions().getRef(nPara); + rPortion.MarkSelectionInvalid( 0 ); } } return bChanges; @@ -3208,19 +3216,19 @@ void ImpEditEngine::IterateLineAreas(const IterateLinesAreasFunc& f, IterFlag eO sal_Int16 nColumn = 0; for (sal_Int32 n = 0, nPortions = GetParaPortions().Count(); n < nPortions; ++n) { - ParaPortion* pPortion = GetParaPortions()[n]; + ParaPortion& rPortion = GetParaPortions().getRef(n); bool bSkipThis = true; - if (pPortion->IsVisible()) + if (rPortion.IsVisible()) { // when typing idle formatting, asynchronous Paint. Invisible Portions may be invalid. - if (pPortion->IsInvalid()) + if (rPortion.IsInvalid()) return; LineAreaInfo aInfo{ - *pPortion, // pPortion + rPortion, nullptr, // pLine 0, // nHeightNeededToNotWrap - { aLineStart, Size{ nColumnWidth, pPortion->GetFirstLineOffset() } }, // aArea + { aLineStart, Size{ nColumnWidth, rPortion.GetFirstLineOffset() } }, // aArea n, // nPortion 0, // nLine nColumn // nColumn @@ -3234,16 +3242,16 @@ void ImpEditEngine::IterateLineAreas(const IterateLinesAreasFunc& f, IterFlag eO if (!maStatus.IsOutliner()) { const SvxLineSpacingItem& rLSItem - = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL); + = rPortion.GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL); nSBL = (rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Fix) ? scaleYSpacingValue(rLSItem.GetInterLineSpace()) : 0; } - adjustYDirectionAware(aLineStart, pPortion->GetFirstLineOffset()); - for (sal_Int32 nLine = 0, nLines = pPortion->GetLines().Count(); nLine < nLines; nLine++) + adjustYDirectionAware(aLineStart, rPortion.GetFirstLineOffset()); + for (sal_Int32 nLine = 0, nLines = rPortion.GetLines().Count(); nLine < nLines; nLine++) { - EditLine& rLine = pPortion->GetLines()[nLine]; + EditLine& rLine = rPortion.GetLines()[nLine]; tools::Long nLineHeight = rLine.GetHeight(); if (nLine != nLines - 1) nLineHeight += nVertLineSpacing; @@ -3278,8 +3286,7 @@ void ImpEditEngine::IterateLineAreas(const IterateLinesAreasFunc& f, IterFlag eO } if (!maStatus.IsOutliner()) { - const SvxULSpaceItem& rULItem - = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE); + const SvxULSpaceItem& rULItem = rPortion.GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE); tools::Long nUL = scaleYSpacingValue(rULItem.GetLower()); adjustYDirectionAware(aLineStart, nUL); } @@ -3400,8 +3407,8 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace // Over all the paragraphs ... - OSL_ENSURE( 0 <= nPara && nPara < GetParaPortions().Count(), "CalcParaWidth: Out of range" ); - ParaPortion* pPortion = GetParaPortions()[nPara]; + OSL_ENSURE(GetParaPortions().exists(nPara), "CalcParaWidth: Out of range"); + ParaPortion* pPortion = GetParaPortions().SafeGetObject(nPara); if ( pPortion && pPortion->IsVisible() ) { const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( pPortion->GetNode() ); @@ -3622,8 +3629,8 @@ tools::Long ImpEditEngine::CalcTextHeight(tools::Long* pHeightNTP) sal_Int32 ImpEditEngine::GetLineCount( sal_Int32 nParagraph ) const { - OSL_ENSURE( 0 <= nParagraph && nParagraph < GetParaPortions().Count(), "GetLineCount: Out of range" ); - const ParaPortion* pPPortion = GetParaPortions().SafeGetObject( nParagraph ); + OSL_ENSURE(GetParaPortions().exists(nParagraph), "GetLineCount: Out of range"); + const ParaPortion* pPPortion = GetParaPortions().SafeGetObject(nParagraph); OSL_ENSURE( pPPortion, "Paragraph not found: GetLineCount" ); if ( pPPortion ) return pPPortion->GetLines().Count(); @@ -3633,9 +3640,9 @@ sal_Int32 ImpEditEngine::GetLineCount( sal_Int32 nParagraph ) const sal_Int32 ImpEditEngine::GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const { - OSL_ENSURE( 0 <= nParagraph && nParagraph < GetParaPortions().Count(), "GetLineLen: Out of range" ); - const ParaPortion* pPPortion = GetParaPortions().SafeGetObject( nParagraph ); - OSL_ENSURE( pPPortion, "Paragraph not found: GetLineLen" ); + OSL_ENSURE(GetParaPortions().exists(nParagraph), "GetLineLen: Out of range"); + const ParaPortion* pPPortion = GetParaPortions().SafeGetObject(nParagraph); + OSL_ENSURE(pPPortion, "Paragraph not found: GetLineLen"); if ( pPPortion && ( nLine < pPPortion->GetLines().Count() ) ) { const EditLine& rLine = pPPortion->GetLines()[nLine]; @@ -3647,7 +3654,7 @@ sal_Int32 ImpEditEngine::GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) con void ImpEditEngine::GetLineBoundaries( /*out*/sal_Int32 &rStart, /*out*/sal_Int32 &rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const { - OSL_ENSURE( 0 <= nParagraph && nParagraph < GetParaPortions().Count(), "GetLineCount: Out of range" ); + OSL_ENSURE(GetParaPortions().exists(nParagraph), "GetLineCount: Out of range"); const ParaPortion* pPPortion = GetParaPortions().SafeGetObject( nParagraph ); OSL_ENSURE( pPPortion, "Paragraph not found: GetLineBoundaries" ); rStart = rEnd = -1; // default values in case of error @@ -3688,7 +3695,7 @@ sal_Int32 ImpEditEngine::GetLineNumberAtIndex( sal_Int32 nPara, sal_Int32 nIndex sal_uInt16 ImpEditEngine::GetLineHeight( sal_Int32 nParagraph, sal_Int32 nLine ) { - OSL_ENSURE( 0 <= nParagraph && nParagraph < GetParaPortions().Count(), "GetLineCount: Out of range" ); + OSL_ENSURE(GetParaPortions().exists(nParagraph), "GetLineCount: Out of range"); ParaPortion* pPPortion = GetParaPortions().SafeGetObject( nParagraph ); OSL_ENSURE( pPPortion, "Paragraph not found: GetLineHeight" ); if ( pPPortion && ( nLine < pPPortion->GetLines().Count() ) ) @@ -3730,26 +3737,26 @@ void ImpEditEngine::UpdateSelections() // Use ParaPortions, as now also hidden paragraphs have to be // taken into account! sal_Int32 nPara = rInf.GetPosition(); - if (!GetParaPortions().SafeGetObject(nPara)) // Last paragraph + if (!GetParaPortions().exists(nPara)) // Last paragraph { - nPara = GetParaPortions().Count()-1; + nPara = GetParaPortions().lastIndex(); } - assert(GetParaPortions()[nPara] && "Empty Document in UpdateSelections ?"); + assert(GetParaPortions().exists(nPara) && "Empty Document in UpdateSelections ?"); // Do not end up from a hidden paragraph: - sal_Int32 nCurPara = nPara; - sal_Int32 nLastPara = GetParaPortions().Count()-1; - while ( nPara <= nLastPara && !GetParaPortions()[nPara]->IsVisible() ) + sal_Int32 nCurrentPara = nPara; + sal_Int32 nLastParaIndex = GetParaPortions().lastIndex(); + while (nPara <= nLastParaIndex && !GetParaPortions().getRef(nPara).IsVisible()) nPara++; - if ( nPara > nLastPara ) // then also backwards ... + if (nPara > nLastParaIndex) // then also backwards ... { - nPara = nCurPara; - while ( nPara && !GetParaPortions()[nPara]->IsVisible() ) + nPara = nCurrentPara; + while ( nPara && !GetParaPortions().getRef(nPara).IsVisible() ) nPara--; } - OSL_ENSURE( GetParaPortions()[nPara]->IsVisible(), "No visible paragraph found: UpdateSelections" ); + OSL_ENSURE(GetParaPortions().getRef(nPara).IsVisible(), "No visible paragraph found: UpdateSelections" ); - ParaPortion* pParaPortion = GetParaPortions()[nPara]; - EditSelection aTmpSelection( EditPaM( pParaPortion->GetNode(), 0 ) ); + ParaPortion& rParaPortion = GetParaPortions().getRef(nPara); + EditSelection aTmpSelection(EditPaM(rParaPortion.GetNode(), 0)); pView->pImpEditView->SetEditSelection( aTmpSelection ); bChanged=true; break; // for loop @@ -4389,7 +4396,7 @@ void ImpEditEngine::CalcHeight(ParaPortion& rPortion) rPortion.nFirstLineOffset = nUpper; } - if ( nPortion != (GetParaPortions().Count()-1) ) + if (nPortion != GetParaPortions().lastIndex()) { rPortion.nHeight += scaleYSpacingValue(rULItem.GetLower()); // not in the last } diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index 43bc6d34f4ef..350a533eb147 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -419,20 +419,20 @@ void ImpEditEngine::FormatDoc() for ( sal_Int32 nPara = 0; nPara < nParaCount; nPara++ ) { - ParaPortion* pParaPortion = GetParaPortions()[nPara]; - if ( pParaPortion->MustRepaint() || ( pParaPortion->IsInvalid() && pParaPortion->IsVisible() ) ) + ParaPortion& rParaPortion = GetParaPortions().getRef(nPara); + if (rParaPortion.MustRepaint() || (rParaPortion.IsInvalid() && rParaPortion.IsVisible())) { // No formatting should be necessary for MustRepaint()! - if ( !pParaPortion->IsInvalid() || CreateLines( nPara, nY ) ) + if (!rParaPortion.IsInvalid() || CreateLines( nPara, nY ) ) { if ( !bGrow && GetTextRanger() ) { // For a change in height all below must be reformatted... for ( sal_Int32 n = nPara+1; n < GetParaPortions().Count(); n++ ) { - ParaPortion* pPP = GetParaPortions()[n]; - pPP->MarkSelectionInvalid( 0 ); - pPP->GetLines().Reset(); + ParaPortion& rParaPortionToInvalidate = GetParaPortions().getRef(n); + rParaPortionToInvalidate.MarkSelectionInvalid( 0 ); + rParaPortionToInvalidate.GetLines().Reset(); } } bGrow = true; @@ -447,12 +447,12 @@ void ImpEditEngine::FormatDoc() } } - pParaPortion->SetMustRepaint( false ); + rParaPortion.SetMustRepaint( false ); } aRepaintParas.insert(nPara); } - nY += pParaPortion->GetHeight(); + nY += rParaPortion.GetHeight(); } maInvalidRect = tools::Rectangle(); // make empty @@ -560,11 +560,11 @@ void ImpEditEngine::CheckAutoPageSize() { // Only paragraphs which are not aligned to the left need to be // reformatted, the height can not be changed here anymore. - ParaPortion* pParaPortion = GetParaPortions()[nPara]; + ParaPortion& rParaPortion = GetParaPortions().getRef(nPara); SvxAdjust eJustification = GetJustification( nPara ); if ( eJustification != SvxAdjust::Left ) { - pParaPortion->MarkSelectionInvalid( 0 ); + rParaPortion.MarkSelectionInvalid(0); CreateLines( nPara, 0 ); // 0: For AutoPageSize no TextRange! } } @@ -669,21 +669,22 @@ tools::Long ImpEditEngine::calculateMaxLineWidth(tools::Long nStartX, SvxLRSpace bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) { - ParaPortion* pParaPortion = GetParaPortions()[nPara]; + assert(GetParaPortions().exists(nPara) && "Portion paragraph index is not valid"); + ParaPortion& rParaPortion = GetParaPortions().getRef(nPara); // sal_Bool: Changes in the height of paragraph Yes / No - sal_True/sal_False - assert( pParaPortion->GetNode() && "Portion without Node in CreateLines" ); - DBG_ASSERT( pParaPortion->IsVisible(), "Invisible paragraphs not formatted!" ); - DBG_ASSERT( pParaPortion->IsInvalid(), "CreateLines: Portion not invalid!" ); + assert(rParaPortion.GetNode() && "Portion without Node in CreateLines" ); + DBG_ASSERT( rParaPortion.IsVisible(), "Invisible paragraphs not formatted!" ); + DBG_ASSERT( rParaPortion.IsInvalid(), "CreateLines: Portion not invalid!" ); - bool bProcessingEmptyLine = ( pParaPortion->GetNode()->Len() == 0 ); - bool bEmptyNodeWithPolygon = ( pParaPortion->GetNode()->Len() == 0 ) && GetTextRanger(); + bool bProcessingEmptyLine = rParaPortion.GetNode()->Len() == 0 ; + bool bEmptyNodeWithPolygon = rParaPortion.GetNode()->Len() == 0 && GetTextRanger(); // Fast special treatment for empty paragraphs... - bool bEmptyParagraph = pParaPortion->GetNode()->Len() == 0 && !GetTextRanger(); + bool bEmptyParagraph = rParaPortion.GetNode()->Len() == 0 && !GetTextRanger(); if (bEmptyParagraph) - return createLinesForEmptyParagraph(*pParaPortion); + return createLinesForEmptyParagraph(rParaPortion); sal_Int64 nCurrentPosY = nStartPosY; // If we're allowed to skip parts outside and this cannot possibly fit in the given height, @@ -700,14 +701,14 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) // Always format for 100%: bool bMapChanged = ImpCheckRefMapMode(); - if ( pParaPortion->GetLines().Count() == 0 ) + if (rParaPortion.GetLines().Count() == 0) { - pParaPortion->GetLines().Append(std::make_unique<EditLine>()); + rParaPortion.GetLines().Append(std::make_unique<EditLine>()); } // Get Paragraph attributes... - ContentNode* const pNode = pParaPortion->GetNode(); + ContentNode* const pNode = rParaPortion.GetNode(); bool bRightToLeftPara = IsRightToLeft( nPara ); @@ -720,30 +721,30 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) const SvxLineSpacingItem& rLSItem = pNode->GetContentAttribs().GetItem( EE_PARA_SBL ); const bool bScriptSpace = pNode->GetContentAttribs().GetItem( EE_PARA_ASIANCJKSPACING ).GetValue(); - const short nInvalidDiff = pParaPortion->GetInvalidDiff(); - const sal_Int32 nInvalidStart = pParaPortion->GetInvalidPosStart(); + const short nInvalidDiff = rParaPortion.GetInvalidDiff(); + const sal_Int32 nInvalidStart = rParaPortion.GetInvalidPosStart(); const sal_Int32 nInvalidEnd = nInvalidStart + std::abs( nInvalidDiff ); bool bQuickFormat = false; if ( !bEmptyNodeWithPolygon && !HasScriptType( nPara, i18n::ScriptType::COMPLEX ) ) { - if ( ( pParaPortion->IsSimpleInvalid() ) && ( nInvalidDiff > 0 ) && + if ( ( rParaPortion.IsSimpleInvalid() ) && ( nInvalidDiff > 0 ) && ( pNode->GetString().indexOf( CH_FEATURE, nInvalidStart ) > nInvalidEnd ) ) { bQuickFormat = true; } - else if ( ( pParaPortion->IsSimpleInvalid() ) && ( nInvalidDiff < 0 ) ) + else if ( ( rParaPortion.IsSimpleInvalid() ) && ( nInvalidDiff < 0 ) ) { // check if delete over the portion boundaries was done... sal_Int32 nStart = nInvalidStart; // DOUBLE !!!!!!!!!!!!!!! sal_Int32 nEnd = nStart - nInvalidDiff; // negative bQuickFormat = true; sal_Int32 nPos = 0; - sal_Int32 nPortions = pParaPortion->GetTextPortions().Count(); + sal_Int32 nPortions = rParaPortion.GetTextPortions().Count(); for ( sal_Int32 nTP = 0; nTP < nPortions; nTP++ ) { // There must be no start / end in the deleted area. - const TextPortion& rTP = pParaPortion->GetTextPortions()[ nTP ]; + const TextPortion& rTP = rParaPortion.GetTextPortions()[ nTP ]; nPos = nPos + rTP.GetLen(); if ( ( nPos > nStart ) && ( nPos < nEnd ) ) { @@ -764,27 +765,27 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) if (bEmptyNodeWithPolygon) { TextPortion* pDummyPortion = new TextPortion( 0 ); - pParaPortion->GetTextPortions().Reset(); - pParaPortion->GetTextPortions().Append(pDummyPortion); + rParaPortion.GetTextPortions().Reset(); + rParaPortion.GetTextPortions().Append(pDummyPortion); } else if ( bQuickFormat ) { // faster Method: - RecalcTextPortion(*pParaPortion, nInvalidStart, nInvalidDiff); + RecalcTextPortion(rParaPortion, nInvalidStart, nInvalidDiff); } else // nRealInvalidStart can be before InvalidStart, since Portions were deleted... { - CreateTextPortions(*pParaPortion, nRealInvalidStart); + CreateTextPortions(rParaPortion, nRealInvalidStart); } // Search for line with InvalidPos, start one line before // Flag the line => do not remove it ! - sal_Int32 nLine = pParaPortion->GetLines().Count()-1; + sal_Int32 nLine = rParaPortion.GetLines().Count()-1; for ( sal_Int32 nL = 0; nL <= nLine; nL++ ) { - EditLine& rLine = pParaPortion->GetLines()[nL]; + EditLine& rLine = rParaPortion.GetLines()[nL]; if ( rLine.GetEnd() > nRealInvalidStart ) // not nInvalidStart! { nLine = nL; @@ -794,7 +795,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) } // Begin one line before... // If it is typed at the end, the line in front cannot change. - if (nLine && (!pParaPortion->IsSimpleInvalid() || + if (nLine && (!rParaPortion.IsSimpleInvalid() || (nInvalidEnd < pNode->Len()) || (nInvalidDiff <= 0))) { @@ -805,11 +806,11 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) if (!nLine) { - aBulletArea = GetEditEnginePtr()->GetBulletArea( GetParaPortions().GetPos( pParaPortion ) ); + aBulletArea = GetEditEnginePtr()->GetBulletArea(GetParaPortions().GetPos(&rParaPortion)); if ( !aBulletArea.IsWidthEmpty() && aBulletArea.Right() > 0 ) - pParaPortion->SetBulletX(sal_Int32(scaleXSpacingValue(aBulletArea.Right()))); + rParaPortion.SetBulletX(sal_Int32(scaleXSpacingValue(aBulletArea.Right()))); else - pParaPortion->SetBulletX( 0 ); // if Bullet is set incorrectly + rParaPortion.SetBulletX( 0 ); // if Bullet is set incorrectly } // Reformat all lines from here... @@ -817,7 +818,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) sal_Int32 nDelFromLine = -1; bool bLineBreak = false; - EditLine* pLine = &pParaPortion->GetLines()[nLine]; + EditLine* pLine = &rParaPortion.GetLines()[nLine]; sal_Int32 nIndex = pLine->GetStart(); EditLine aSaveLine( *pLine ); @@ -848,9 +849,9 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) tools::Long nFI = scaleXSpacingValue(rLRItem.GetTextFirstLineOffset()); nStartX += nFI; - if ( !nLine && ( pParaPortion->GetBulletX() > nStartX ) ) + if (!nLine && rParaPortion.GetBulletX() > nStartX) { - nStartX = pParaPortion->GetBulletX(); + nStartX = rParaPortion.GetBulletX(); } } @@ -877,7 +878,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(rParaPortion, *pLine, pLine->GetStart(), GetCursorFlags::NONE).Top(); if ( !bSameLineAgain ) { SeekCursor( pNode, nTmpPos+1, aTmpFont ); @@ -955,7 +956,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) const EditCharAttrib* pNextFeature = pNode->GetCharAttribs().FindFeature( pLine->GetStart() ); while ( ( nTmpWidth < nXWidth ) && !bEOL ) { - const sal_Int32 nTextPortions = pParaPortion->GetTextPortions().Count(); + const sal_Int32 nTextPortions = rParaPortion.GetTextPortions().Count(); assert(nTextPortions > 0); bContinueLastPortion = (nTmpPortion >= nTextPortions); if (bContinueLastPortion) @@ -973,17 +974,17 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) } nPortionStart = nTmpPos; - pPortion = &pParaPortion->GetTextPortions()[nTmpPortion]; + pPortion = &rParaPortion.GetTextPortions()[nTmpPortion]; if ( !bContinueLastPortion && pPortion->GetKind() == PortionKind::HYPHENATOR ) { // Throw away a Portion, if necessary correct the one before, // if the Hyph portion has swallowed a character... sal_Int32 nTmpLen = pPortion->GetLen(); - pParaPortion->GetTextPortions().Remove( nTmpPortion ); + rParaPortion.GetTextPortions().Remove( nTmpPortion ); if (nTmpPortion && nTmpLen) { nTmpPortion--; - TextPortion& rPrev = pParaPortion->GetTextPortions()[nTmpPortion]; + TextPortion& rPrev = rParaPortion.GetTextPortions()[nTmpPortion]; DBG_ASSERT( rPrev.GetKind() == PortionKind::TEXT, "Portion?!" ); nTmpWidth -= rPrev.GetSize().Width(); nTmpPos = nTmpPos - rPrev.GetLen(); @@ -991,8 +992,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) rPrev.setWidth(-1); } - assert( nTmpPortion < pParaPortion->GetTextPortions().Count() && "No more Portions left!" ); - pPortion = &pParaPortion->GetTextPortions()[nTmpPortion]; + assert(nTmpPortion < rParaPortion.GetTextPortions().Count() && "No more Portions left!"); + pPortion = &rParaPortion.GetTextPortions()[nTmpPortion]; } if (bContinueLastPortion) @@ -1205,15 +1206,14 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) if (bContinueLastPortion) { - Size aSize( aTmpFont.QuickGetTextSize( GetRefDevice(), - pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, &aCharPositionArray )); + Size aSize = aTmpFont.QuickGetTextSize( GetRefDevice(), rParaPortion.GetNode()->GetString(), nTmpPos, nPortionLen, &aCharPositionArray); pPortion->adjustSize(aSize.Width(), 0); if (pPortion->GetSize().Height() < aSize.Height()) pPortion->setHeight(aSize.Height()); } else { - auto aSize = aTmpFont.QuickGetTextSize(GetRefDevice(), pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, &aCharPositionArray); + Size aSize = aTmpFont.QuickGetTextSize(GetRefDevice(), rParaPortion.GetNode()->GetString(), nTmpPos, nPortionLen, &aCharPositionArray); pPortion->SetSize(aSize); } @@ -1267,7 +1267,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) tools::Long nWidthAfterTab = 0; for ( sal_Int32 n = aCurrentTab.nTabPortion+1; n <= nTmpPortion; n++ ) { - const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[n]; + const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[n]; nWidthAfterTab += rTextPortion.GetSize().Width(); } tools::Long nW = nWidthAfterTab; // Length before tab position @@ -1281,17 +1281,16 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) } else if ( aCurrentTab.aTabStop.GetAdjustment() == SvxTabAdjust::Decimal ) { - EditPaM aSelectionStart(pParaPortion->GetNode(), nTmpPos); - EditPaM aSelectionEnd(pParaPortion->GetNode(), nTmpPos + nPortionLen); + EditPaM aSelectionStart(rParaPortion.GetNode(), nTmpPos); + EditPaM aSelectionEnd(rParaPortion.GetNode(), nTmpPos + nPortionLen); EditSelection aSelection(aSelectionStart, aSelectionEnd); OUString aText = GetSelected(aSelection); sal_Int32 nDecPos = aText.indexOf( aCurrentTab.aTabStop.GetDecimal() ); if ( nDecPos != -1 ) { - nW -= pParaPortion->GetTextPortions()[nTmpPortion].GetSize().Width(); - nW += aTmpFont.QuickGetTextSize( GetRefDevice(), pParaPortion->GetNode()->GetString(), - nTmpPos, nDecPos, nullptr ).Width(); + nW -= rParaPortion.GetTextPortions()[nTmpPortion].GetSize().Width(); + nW += aTmpFont.QuickGetTextSize(GetRefDevice(), rParaPortion.GetNode()->GetString(), nTmpPos, nDecPos, nullptr).Width(); aCurrentTab.bValid = false; } } @@ -1305,7 +1304,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) nW = nMaxW; aCurrentTab.bValid = false; } - TextPortion& rTabPortion = pParaPortion->GetTextPortions()[aCurrentTab.nTabPortion]; + TextPortion& rTabPortion = rParaPortion.GetTextPortions()[aCurrentTab.nTabPortion]; rTabPortion.setWidth( aCurrentTab.nTabPos - aCurrentTab.nStartPosX - nW - nStartX ); nTmpWidth = aCurrentTab.nStartPosX + rTabPortion.GetSize().Width() + nWidthAfterTab; } @@ -1344,8 +1343,8 @@ 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); - nTmpWidth += pParaPortion->GetTextPortions()[nP].GetSize().Width(); + sal_Int32 nP = SplitTextPortion(rParaPortion, nTmpPos, pLine); + nTmpWidth += rParaPortion.GetTextPortions()[nP].GetSize().Width(); } } else if ( nTmpWidth >= nXWidth ) @@ -1385,8 +1384,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) bEOL = true; bEOC = true; pLine->SetEnd( nPortionEnd ); - assert( pParaPortion->GetTextPortions().Count() && "No TextPortions?" ); - pLine->SetEndPortion( pParaPortion->GetTextPortions().Count() - 1 ); + assert(rParaPortion.GetTextPortions().Count() && "No TextPortions?"); + pLine->SetEndPortion(rParaPortion.GetTextPortions().Count() - 1); } if (maStatus.OneCharPerLine()) @@ -1419,7 +1418,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(rParaPortion, *pLine, pPortion, nPortionStart, nRemainingWidth, bCanHyphenate && bHyphenatePara); } @@ -1427,7 +1426,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) // CalcTextSize should be replaced by a continuous registering! - Size aTextSize = pLine->CalcTextSize( *pParaPortion ); + Size aTextSize = pLine->CalcTextSize(rParaPortion); if ( aTextSize.Height() == 0 ) { @@ -1449,7 +1448,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) sal_Int32 nTPos = pLine->GetStart(); for ( sal_Int32 nP = pLine->GetStartPortion(); nP <= pLine->GetEndPortion(); nP++ ) { - const TextPortion& rTP = pParaPortion->GetTextPortions()[nP]; + const TextPortion& rTP = rParaPortion.GetTextPortions()[nP]; // problem with hard font height attribute, when everything but the line break has this attribute if ( rTP.GetKind() != PortionKind::LINEBREAK ) { @@ -1565,8 +1564,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) tools::Long nRemainingWidth = nMaxLineWidth - aTextSize.Width(); if ( nRemainingWidth > 0 ) { - ImplExpandCompressedPortions(*pLine, *pParaPortion, nRemainingWidth); - aTextSize = pLine->CalcTextSize( *pParaPortion ); + ImplExpandCompressedPortions(*pLine, rParaPortion, nRemainingWidth); + aTextSize = pLine->CalcTextSize(rParaPortion); } } @@ -1575,7 +1574,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) // Width from HangingPunctuation was set to 0 in ImpBreakLine, // check for rel width now, maybe create compression... tools::Long n = nMaxLineWidth - aTextSize.Width(); - TextPortion& rTP = pParaPortion->GetTextPortions()[pLine->GetEndPortion()]; + TextPortion& rTP = rParaPortion.GetTextPortions()[pLine->GetEndPortion()]; sal_Int32 nPosInArray = pLine->GetEnd()-1-pLine->GetStart(); tools::Long nNewValue = ( nPosInArray ? pLine->GetCharPosArray()[ nPosInArray-1 ] : 0 ) + n; if (o3tl::make_unsigned(nPosInArray) < pLine->GetCharPosArray().size()) @@ -1610,7 +1609,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(rParaPortion, *pLine, nRemainingSpace); } break; default: @@ -1644,7 +1643,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) } // for <0 think over ! - if ( pParaPortion->IsSimpleInvalid() ) + if (rParaPortion.IsSimpleInvalid()) { // Change through simple Text changes... // Do not cancel formatting since Portions possibly have to be split @@ -1671,7 +1670,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) if (bQuickFormat) { bLineBreak = false; - pParaPortion->CorrectValuesBehindLastFormattedLine( nLine ); + rParaPortion.CorrectValuesBehindLastFormattedLine( nLine ); break; } } @@ -1684,7 +1683,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) if ( nEnd == ( aSaveLine.GetEnd() + nInvalidDiff ) ) { bLineBreak = false; - pParaPortion->CorrectValuesBehindLastFormattedLine( nLine ); + rParaPortion.CorrectValuesBehindLastFormattedLine( nLine ); break; } } @@ -1701,8 +1700,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) // Next line or maybe a new line... pLine = nullptr; - if ( nLine < pParaPortion->GetLines().Count()-1 ) - pLine = &pParaPortion->GetLines()[++nLine]; + if ( nLine < rParaPortion.GetLines().Count()-1 ) + pLine = &rParaPortion.GetLines()[++nLine]; if ( pLine && ( nIndex >= pNode->Len() ) ) { nDelFromLine = nLine; @@ -1723,16 +1722,16 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) if ( nIndex < pNode->Len() ) { pLine = new EditLine; - pParaPortion->GetLines().Insert(++nLine, std::unique_ptr<EditLine>(pLine)); + rParaPortion.GetLines().Insert(++nLine, std::unique_ptr<EditLine>(pLine)); } else if ( nIndex && bLineBreak && GetTextRanger() ) { // normally CreateAndInsertEmptyLine would be called, but I want to use // CreateLines, so I need Polygon code only here... TextPortion* pDummyPortion = new TextPortion( 0 ); - pParaPortion->GetTextPortions().Append(pDummyPortion); + rParaPortion.GetTextPortions().Append(pDummyPortion); pLine = new EditLine; - pParaPortion->GetLines().Insert(++nLine, std::unique_ptr<EditLine>(pLine)); + rParaPortion.GetLines().Insert(++nLine, std::unique_ptr<EditLine>(pLine)); bForceOneRun = true; bProcessingEmptyLine = true; } @@ -1749,14 +1748,14 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) } // while ( Index < Len ) if ( nDelFromLine >= 0 ) - pParaPortion->GetLines().DeleteFromLine( nDelFromLine ); + rParaPortion.GetLines().DeleteFromLine( nDelFromLine ); - DBG_ASSERT( pParaPortion->GetLines().Count(), "No line after CreateLines!" ); + DBG_ASSERT(rParaPortion.GetLines().Count(), "No line after CreateLines!"); if ( bLineBreak ) - CreateAndInsertEmptyLine(*pParaPortion); + CreateAndInsertEmptyLine(rParaPortion); - bool bHeightChanged = FinishCreateLines(*pParaPortion); + bool bHeightChanged = FinishCreateLines(rParaPortion); if ( bMapChanged ) GetRefDevice()->Pop(); @@ -2796,9 +2795,8 @@ void ImpEditEngine::SetTextRanger( std::unique_ptr<TextRanger> pRanger ) { mpTextRanger = std::move(pRanger); - for ( sal_Int32 nPara = 0; nPara < GetParaPortions().Count(); nPara++ ) + for (auto& pParaPortion : GetParaPortions()) { - ParaPortion* pParaPortion = GetParaPortions()[nPara]; pParaPortion->MarkSelectionInvalid( 0 ); pParaPortion->GetLines().Reset(); } @@ -3318,7 +3316,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po tools::Long nFirstVisYPos = - rOutDev.GetMapMode().GetOrigin().Y(); DBG_ASSERT( GetParaPortions().Count(), "No ParaPortion?!" ); - SvxFont aTmpFont( GetParaPortions()[0]->GetNode()->GetCharAttribs().GetDefFont() ); + SvxFont aTmpFont = GetParaPortions().getRef(0).GetNode()->GetCharAttribs().GetDefFont(); vcl::PDFExtOutDevData* const pPDFExtOutDevData = dynamic_cast< vcl::PDFExtOutDevData* >( rOutDev.GetExtOutDevData() ); // In the case of rotated text is aStartPos considered TopLeft because @@ -3340,18 +3338,17 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po for ( sal_Int32 n = 0; n < GetParaPortions().Count(); n++ ) { - const ParaPortion* const pPortion = GetParaPortions()[n]; - assert( pPortion && "NULL-Pointer in TokenList in Paint" ); + ParaPortion const& rPortion = GetParaPortions().getRef(n); // if when typing idle formatting, asynchronous Paint. // Invisible Portions may be invalid. - if ( pPortion->IsVisible() && pPortion->IsInvalid() ) + if (rPortion.IsVisible() && rPortion.IsInvalid()) return; if ( pPDFExtOutDevData ) pPDFExtOutDevData->WrapBeginStructureElement(vcl::PDFWriter::Paragraph); - const tools::Long nParaHeight = pPortion->GetHeight(); - if ( pPortion->IsVisible() && ( + const tools::Long nParaHeight = rPortion.GetHeight(); + if (rPortion.IsVisible() && ( ( !IsEffectivelyVertical() && ( ( aStartPos.Y() + nParaHeight ) > aClipRect.Top() ) ) || ( IsEffectivelyVertical() && IsTopToBottom() && ( ( aStartPos.X() - nParaHeight ) < aClipRect.Right() ) ) || ( IsEffectivelyVertical() && !IsTopToBottom() && ( ( aStartPos.X() + nParaHeight ) > aClipRect.Left() ) ) ) ) @@ -3361,21 +3358,21 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po // Over the lines of the paragraph... - const sal_Int32 nLines = pPortion->GetLines().Count(); + const sal_Int32 nLines = rPortion.GetLines().Count(); const sal_Int32 nLastLine = nLines-1; bool bEndOfParagraphWritten(false); - adjustYDirectionAware(aStartPos, pPortion->GetFirstLineOffset()); + adjustYDirectionAware(aStartPos, rPortion.GetFirstLineOffset()); - const SvxLineSpacingItem& rLSItem = pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL ); + const SvxLineSpacingItem& rLSItem = rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL ); sal_uInt16 nSBL = ( rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Fix ) ? scaleYSpacingValue(rLSItem.GetInterLineSpace()) : 0; bool bPaintBullet (false); for ( sal_Int32 nLine = 0; nLine < nLines; nLine++ ) { - EditLine const& rLine = pPortion->GetLines()[nLine]; + EditLine const& rLine = rPortion.GetLines()[nLine]; sal_Int32 nIndex = rLine.GetStart(); tools::Long nLineHeight = rLine.GetHeight(); if (nLine != nLastLine) @@ -3414,10 +3411,10 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po for ( sal_Int32 nPortion = rLine.GetStartPortion(); nPortion <= rLine.GetEndPortion(); nPortion++ ) { - DBG_ASSERT( pPortion->GetTextPortions().Count(), "Line without Textportion in Paint!" ); - const TextPortion& rTextPortion = pPortion->GetTextPortions()[nPortion]; + DBG_ASSERT(rPortion.GetTextPortions().Count(), "Line without Textportion in Paint!"); + const TextPortion& rTextPortion = rPortion.GetTextPortions()[nPortion]; - const tools::Long nPortionXOffset = GetPortionXOffset(*pPortion, rLine, nPortion); + const tools::Long nPortionXOffset = GetPortionXOffset(rPortion, rLine, nPortion); setXDirectionAwareFrom(aTmpPos, aStartPos); adjustXDirectionAware(aTmpPos, nPortionXOffset); if (isXOverflowDirectionAware(aTmpPos, aClipRect)) @@ -3429,7 +3426,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po case PortionKind::FIELD: case PortionKind::HYPHENATOR: { - SeekCursor( pPortion->GetNode(), nIndex+1, aTmpFont, &rOutDev ); + SeekCursor(rPortion.GetNode(), nIndex + 1, aTmpFont, &rOutDev); bool bDrawFrame = false; @@ -3455,7 +3452,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po aTmpFont.SetFillColor( COL_LIGHTGRAY ); aTmpFont.SetTransparent( sal_False ); } - else if ( GetI18NScriptType( EditPaM( pPortion->GetNode(), nIndex+1 ) ) == i18n::ScriptType::COMPLEX ) + else if (GetI18NScriptType(EditPaM(rPortion.GetNode(), nIndex + 1)) == i18n::ScriptType::COMPLEX) { aTmpFont.SetFillColor( COL_LIGHTCYAN ); aTmpFont.SetTransparent( sal_False ); @@ -3478,7 +3475,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po if ( rTextPortion.GetKind() == PortionKind::TEXT ) { - aText = pPortion->GetNode()->GetString(); + aText = rPortion.GetNode()->GetString(); nTextStart = nIndex; nTextLen = rTextPortion.GetLen(); pDXArray = std::span(rLine.GetCharPosArray().data() + (nIndex - rLine.GetStart()), @@ -3565,7 +3562,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po } else if ( rTextPortion.GetKind() == PortionKind::FIELD ) { - const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex); + const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex); assert( pAttr && "Field not found"); DBG_ASSERT( dynamic_cast< const SvxFieldItem* >( pAttr->GetItem() ) != nullptr, "Field of the wrong type! "); aText = static_cast<const EditCharAttribField*>(pAttr)->GetFieldValue(); @@ -3620,8 +3617,8 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po && pOutlEditEng->GetCompatFlag(SdrCompatibilityFlag::IgnoreBreakAfterMultilineField) .value_or(false)) { - int nStartNextLine = pPortion->GetLines()[nLine + 1].GetStartPortion(); - const TextPortion& rNextTextPortion = pPortion->GetTextPortions()[nStartNextLine]; + int nStartNextLine = rPortion.GetLines()[nLine + 1].GetStartPortion(); + const TextPortion& rNextTextPortion = rPortion.GetTextPortions()[nStartNextLine]; if (rNextTextPortion.GetKind() == PortionKind::LINEBREAK) ++nLine; //ignore the following linebreak } @@ -3681,7 +3678,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po if(GetStatus().DoOnlineSpelling() && rTextPortion.GetLen()) { - WrongList* pWrongs = pPortion->GetNode()->GetWrongList(); + WrongList* pWrongs = rPortion.GetNode()->GetWrongList(); if(pWrongs && !pWrongs->empty()) { @@ -3728,7 +3725,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po if(PortionKind::FIELD == rTextPortion.GetKind()) { - const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex); + const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex); const SvxFieldItem* pFieldItem = dynamic_cast<const SvxFieldItem*>(pAttr->GetItem()); if(pFieldItem) @@ -3740,7 +3737,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po // support for EOC, EOW, EOS TEXT comments. To support that, // the locale is needed. With the locale and a XBreakIterator it is // possible to re-create the text marking info on primitive level - const lang::Locale aLocale(GetLocale(EditPaM(pPortion->GetNode(), nIndex + 1))); + const lang::Locale aLocale(GetLocale(EditPaM(rPortion.GetNode(), nIndex + 1))); // create EOL and EOP bools const bool bEndOfLine(nPortion == rLine.GetEndPortion()); @@ -3807,20 +3804,20 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po // base line of the original font height... // But only if there was something underlined before! bool bSpecialUnderline = false; - EditCharAttrib* pPrev = pPortion->GetNode()->GetCharAttribs().FindAttrib( EE_CHAR_ESCAPEMENT, nIndex ); + EditCharAttrib* pPrev = rPortion.GetNode()->GetCharAttribs().FindAttrib( EE_CHAR_ESCAPEMENT, nIndex ); if ( pPrev ) { SvxFont aDummy; // Underscore in front? if ( pPrev->GetStart() ) { - SeekCursor( pPortion->GetNode(), pPrev->GetStart(), aDummy ); + SeekCursor( rPortion.GetNode(), pPrev->GetStart(), aDummy ); if ( aDummy.GetUnderline() != LINESTYLE_NONE ) bSpecialUnderline = true; } - if ( !bSpecialUnderline && ( pPrev->GetEnd() < pPortion->GetNode()->Len() ) ) + if ( !bSpecialUnderline && ( pPrev->GetEnd() < rPortion.GetNode()->Len() ) ) { - SeekCursor( pPortion->GetNode(), pPrev->GetEnd()+1, aDummy ); + SeekCursor( rPortion.GetNode(), pPrev->GetEnd()+1, aDummy ); if ( aDummy.GetUnderline() != LINESTYLE_NONE ) bSpecialUnderline = true; } @@ -3871,7 +3868,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po { if (rTextPortion.GetKind() == PortionKind::FIELD) { - const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex); + const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex); const SvxFieldItem* pFieldItem = dynamic_cast<const SvxFieldItem*>(pAttr->GetItem()); if (pFieldItem) { @@ -3921,7 +3918,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po } } - const WrongList* const pWrongList = pPortion->GetNode()->GetWrongList(); + const WrongList* const pWrongList = rPortion.GetNode()->GetWrongList(); if ( GetStatus().DoOnlineSpelling() && pWrongList && !pWrongList->empty() && rTextPortion.GetLen() ) { {//#105750# adjust LinePos for superscript or subscript text @@ -3934,7 +3931,10 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po } Color aOldColor( rOutDev.GetLineColor() ); rOutDev.SetLineColor( GetColorConfig().GetColorValue( svtools::SPELL ).nColor ); - lcl_DrawRedLines( rOutDev, aTmpFont.GetFontSize().Height(), aRedLineTmpPos, static_cast<size_t>(nIndex), static_cast<size_t>(nIndex) + rTextPortion.GetLen(), pDXArray, pPortion->GetNode()->GetWrongList(), nOrientation, aOrigin, IsEffectivelyVertical(), rTextPortion.IsRightToLeft() ); + lcl_DrawRedLines(rOutDev, aTmpFont.GetFontSize().Height(), aRedLineTmpPos, + static_cast<size_t>(nIndex), static_cast<size_t>(nIndex) + rTextPortion.GetLen(), + pDXArray, rPortion.GetNode()->GetWrongList(), nOrientation, + aOrigin, IsEffectivelyVertical(), rTextPortion.IsRightToLeft()); rOutDev.SetLineColor( aOldColor ); } } @@ -3946,7 +3946,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po // add a meta file comment if we record to a metafile if( bMetafileValid ) { - const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex); + const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex); assert( pAttr && "Field not found" ); const SvxFieldItem* pFieldItem = dynamic_cast<const SvxFieldItem*>(pAttr->GetItem()); @@ -3968,7 +3968,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po { if ( rTextPortion.GetExtraValue() && ( rTextPortion.GetExtraValue() != ' ' ) ) { - SeekCursor( pPortion->GetNode(), nIndex+1, aTmpFont, &rOutDev ); + SeekCursor(rPortion.GetNode(), nIndex+1, aTmpFont, &rOutDev); aTmpFont.SetTransparent( false ); aTmpFont.SetEscapement( 0 ); aTmpFont.SetPhysFont(rOutDev); @@ -4051,7 +4051,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po if (!maStatus.IsOutliner()) { - const SvxULSpaceItem& rULItem = pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE ); + const SvxULSpaceItem& rULItem = rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE ); tools::Long nUL = scaleYSpacingValue(rULItem.GetLower()); adjustYDirectionAware(aStartPos, nUL); } @@ -4249,8 +4249,8 @@ EditSelection ImpEditEngine::MoveParagraphs( Range aOldPositions, sal_Int32 nNew EditSelection aSel( ImpMoveParagraphs( aOldPositions, nNewPos ) ); - if ( nNewPos >= GetParaPortions().Count() ) - nNewPos = GetParaPortions().Count() - 1; + if (nNewPos >= GetParaPortions().Count()) + nNewPos = GetParaPortions().lastIndex(); // Where the paragraph was inserted it has to be properly redrawn: // Where the paragraph was removed it has to be properly redrawn: @@ -4288,18 +4288,19 @@ void ImpEditEngine::InvalidateFromParagraph( sal_Int32 nFirstInvPara ) { // The following paragraphs are not invalidated, since ResetHeight() // => size change => all the following are re-issued anyway. - ParaPortion* pTmpPortion; - if ( nFirstInvPara != 0 ) + + if (nFirstInvPara != 0) { - pTmpPortion = GetParaPortions()[nFirstInvPara-1]; - pTmpPortion->MarkInvalid( pTmpPortion->GetNode()->Len(), 0 ); + ParaPortion& rPortion = GetParaPortions().getRef(nFirstInvPara - 1); + rPortion.MarkInvalid(rPortion.GetNode()->Len(), 0); + rPortion.ResetHeight(); } else { - pTmpPortion = GetParaPortions()[0]; - pTmpPortion->MarkSelectionInvalid( 0 ); + ParaPortion& rPortion = GetParaPortions().getRef(0); + rPortion.MarkSelectionInvalid(0); + rPortion.ResetHeight(); } - pTmpPortion->ResetHeight(); } IMPL_LINK_NOARG(ImpEditEngine, StatusTimerHdl, Timer *, void) @@ -4340,13 +4341,14 @@ ContentNode* ImpEditEngine::GetNextVisNode( ContentNode const * pCurNode ) return nullptr; } -const ParaPortion* ImpEditEngine::GetPrevVisPortion( const ParaPortion* pCurPortion ) const +const ParaPortion* ImpEditEngine::GetPrevVisPortion( const ParaPortion* pCurPortion) const { - sal_Int32 nPara = GetParaPortions().GetPos( pCurPortion ); - DBG_ASSERT( nPara < GetParaPortions().Count() , "Portion not found: GetPrevVisPortion" ); - const ParaPortion* pPortion = nPara ? GetParaPortions()[--nPara] : nullptr; - while ( pPortion && !pPortion->IsVisible() ) - pPortion = nPara ? GetParaPortions()[--nPara] : nullptr; + sal_Int32 nPara = GetParaPortions().GetPos(pCurPortion); + DBG_ASSERT(GetParaPortions().exists(nPara) , "Portion not found: GetPrevVisPortion"); + + const ParaPortion* pPortion = nPara ? GetParaPortions().SafeGetObject(--nPara) : nullptr; + while (pPortion && !pPortion->IsVisible()) + pPortion = nPara ? GetParaPortions().SafeGetObject(--nPara) : nullptr; return pPortion; } @@ -4375,17 +4377,17 @@ tools::Long ImpEditEngine::CalcVertLineSpacing(Point& rStartPos) const // All paragraphs must have the block justification set. return 0; - const ParaPortion* pPortion = rParaPortions[i]; - nTotalOccupiedHeight += pPortion->GetFirstLineOffset(); + ParaPortion const& rPortion = rParaPortions.getRef(i); + nTotalOccupiedHeight += rPortion.GetFirstLineOffset(); - const SvxLineSpacingItem& rLSItem = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL); + const SvxLineSpacingItem& rLSItem = rPortion.GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL); sal_uInt16 nSBL = ( rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Fix ) ? scaleYSpacingValue(rLSItem.GetInterLineSpace()) : 0; - const SvxULSpaceItem& rULItem = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE); + const SvxULSpaceItem& rULItem = rPortion.GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE); tools::Long nUL = scaleYSpacingValue(rULItem.GetLower()); - const EditLineList& rLines = pPortion->GetLines(); + const EditLineList& rLines = rPortion.GetLines(); sal_Int32 nLineCount = rLines.Count(); nTotalLineCount += nLineCount; for (sal_Int32 j = 0; j < nLineCount; ++j) @@ -4451,9 +4453,11 @@ void ImpEditEngine::FormatAndLayout( EditView* pCurView, bool bCalledFromUndo ) else { if (bCalledFromUndo) + { // in order to make bullet points that have had their styles changed, redraw themselves - for ( sal_Int32 nPortion = 0; nPortion < GetParaPortions().Count(); nPortion++ ) - GetParaPortions()[nPortion]->MarkInvalid( 0, 0 ); + for (auto& pParaPortion : GetParaPortions()) + pParaPortion->MarkInvalid(0, 0); + } FormatDoc(); UpdateViews( pCurView ); } @@ -4888,15 +4892,16 @@ void ImpEditEngine::ImplUpdateOverflowingParaNum(tools::Long nPaperHeight) tools::Long nY = 0; tools::Long nPH; - for ( sal_Int32 nPara = 0; nPara < GetParaPortions().Count(); nPara++ ) { - ParaPortion* pPara = GetParaPortions()[nPara]; - nPH = pPara->GetHeight(); + for (sal_Int32 nPara = 0; nPara < GetParaPortions().Count(); nPara++) + { + ParaPortion& rParaPortion = GetParaPortions().getRef(nPara); + nPH = rParaPortion.GetHeight(); nY += nPH; if ( nY > nPaperHeight /*mnCurTextHeight*/ ) // found first paragraph overflowing { mnOverflowingPara = nPara; SAL_INFO("editeng.chaining", "[CHAINING] Setting first overflowing #Para#: " << nPara); - ImplUpdateOverflowingLineNum( nPaperHeight, nPara, nY-nPH); + ImplUpdateOverflowingLineNum( nPaperHeight, nPara, nY - nPH); return; } } @@ -4906,21 +4911,26 @@ void ImpEditEngine::ImplUpdateOverflowingLineNum(tools::Long nPaperHeight, sal_uInt32 nOverflowingPara, tools::Long nHeightBeforeOverflowingPara) { + if (GetParaPortions().exists(nOverflowingPara)) + return; + tools::Long nY = nHeightBeforeOverflowingPara; tools::Long nLH; - ParaPortion *pPara = GetParaPortions()[nOverflowingPara]; + ParaPortion& rParaPortion = GetParaPortions().getRef(nOverflowingPara); // Like UpdateOverflowingParaNum but for each line in the first // overflowing paragraph. - for ( sal_Int32 nLine = 0; nLine < pPara->GetLines().Count(); nLine++ ) { + for (sal_Int32 nLine = 0; nLine < rParaPortion.GetLines().Count(); nLine++) + { // XXX: We must use a reference here because the copy constructor resets the height - EditLine &aLine = pPara->GetLines()[nLine]; + EditLine &aLine = rParaPortion.GetLines()[nLine]; nLH = aLine.GetHeight(); nY += nLH; // Debugging output - if (nLine == 0) { + if (nLine == 0) + { SAL_INFO("editeng.chaining", "[CHAINING] First line has height " << nLH); } diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index 6140fc9a7250..9db6b3ebfc54 100644 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -1050,8 +1050,7 @@ std::unique_ptr<EditTextObject> ImpEditEngine::CreateTextObject( EditSelection a if ( bOnlyFullParagraphs ) { - const ParaPortion* pParaPortion = GetParaPortions()[nNode]; - nTextPortions += pParaPortion->GetTextPortions().Count(); + nTextPortions += GetParaPortions().getRef(nNode).GetTextPortions().Count(); } sal_Int32 nStartPos = 0; @@ -1126,38 +1125,38 @@ std::unique_ptr<EditTextObject> ImpEditEngine::CreateTextObject( EditSelection a pTxtObj->SetPortionInfo(std::unique_ptr<XParaPortionList>(pXList)); for ( nNode = nStartNode; nNode <= nEndNode; nNode++ ) { - const ParaPortion* pParaPortion = GetParaPortions()[nNode]; + ParaPortion const& rParaPortion = GetParaPortions().getRef(nNode); XParaPortion* pX = new XParaPortion; pXList->push_back(pX); - pX->nHeight = pParaPortion->GetHeight(); - pX->nFirstLineOffset = pParaPortion->GetFirstLineOffset(); + pX->nHeight = rParaPortion.GetHeight(); + pX->nFirstLineOffset = rParaPortion.GetFirstLineOffset(); // The TextPortions - sal_uInt16 nCount = pParaPortion->GetTextPortions().Count(); + sal_uInt16 nCount = rParaPortion.GetTextPortions().Count(); sal_uInt16 n; for ( n = 0; n < nCount; n++ ) { - const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[n]; + const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[n]; TextPortion* pNew = new TextPortion( rTextPortion ); pX->aTextPortions.Append(pNew); } // The lines - nCount = pParaPortion->GetLines().Count(); + nCount = rParaPortion.GetLines().Count(); for ( n = 0; n < nCount; n++ ) { - const EditLine& rLine = pParaPortion->GetLines()[n]; + const EditLine& rLine = rParaPortion.GetLines()[n]; pX->aLines.Append(std::unique_ptr<EditLine>(rLine.Clone())); } #ifdef DBG_UTIL sal_uInt16 nTest; int nTPLen = 0, nTxtLen = 0; - for ( nTest = pParaPortion->GetTextPortions().Count(); nTest; ) - nTPLen += pParaPortion->GetTextPortions()[--nTest].GetLen(); - for ( nTest = pParaPortion->GetLines().Count(); nTest; ) - nTxtLen += pParaPortion->GetLines()[--nTest].GetLen(); - DBG_ASSERT( ( nTPLen == pParaPortion->GetNode()->Len() ) && ( nTxtLen == pParaPortion->GetNode()->Len() ), "CreateBinTextObject: ParaPortion not completely formatted!" ); + for (nTest = rParaPortion.GetTextPortions().Count(); nTest;) + nTPLen += rParaPortion.GetTextPortions()[--nTest].GetLen(); + for (nTest = rParaPortion.GetLines().Count(); nTest; ) + nTxtLen += rParaPortion.GetLines()[--nTest].GetLen(); + DBG_ASSERT(nTPLen == rParaPortion.GetNode()->Len() && nTxtLen == rParaPortion.GetNode()->Len(), "CreateBinTextObject: ParaPortion not completely formatted!"); #endif } } @@ -1322,7 +1321,7 @@ EditSelection ImpEditEngine::InsertTextObject( const EditTextObject& rTextObject if ( bNewContent && bUsePortionInfo ) { const XParaPortion& rXP = (*pPortionInfo)[n]; - ParaPortion* pParaPortion = GetParaPortions()[ nPara ]; + ParaPortion* pParaPortion = GetParaPortions().SafeGetObject(nPara); DBG_ASSERT( pParaPortion, "InsertBinTextObject: ParaPortion?" ); pParaPortion->nHeight = rXP.nHeight; pParaPortion->nFirstLineOffset = rXP.nFirstLineOffset; @@ -3010,8 +3009,8 @@ EditSelection ImpEditEngine::TransliterateText( const EditSelection& rSelection, aNewSel.Max().SetIndex( aNewSel.Max().GetIndex() + nDiffs ); sal_Int32 nSelNode = maEditDoc.GetPos( rData.aSelection.Min().GetNode() ); - ParaPortion* pParaPortion = GetParaPortions()[nSelNode]; - pParaPortion->MarkSelectionInvalid( rData.nStart ); + ParaPortion& rParaPortion = GetParaPortions().getRef(nSelNode); + rParaPortion.MarkSelectionInvalid(rData.nStart); } } } diff --git a/editeng/source/editeng/impedit5.cxx b/editeng/source/editeng/impedit5.cxx index 1a87241a1ae2..b60de1944be5 100644 --- a/editeng/source/editeng/impedit5.cxx +++ b/editeng/source/editeng/impedit5.cxx @@ -519,10 +519,13 @@ void ImpEditEngine::SetAttribs( EditSelection aSel, const SfxItemSet& rSet, SetA bool bCharAttribFound = false; DBG_ASSERT( maEditDoc.GetObject( nNode ), "Node not found: SetAttribs" ); - DBG_ASSERT( GetParaPortions().SafeGetObject( nNode ), "Portion not found: SetAttribs" ); + DBG_ASSERT(GetParaPortions().exists(nNode), "Portion not found: SetAttribs"); - ContentNode* pNode = maEditDoc.GetObject( nNode ); - ParaPortion* pPortion = GetParaPortions()[nNode]; + if (!GetParaPortions().exists(nNode)) + continue; + + ContentNode* pNode = maEditDoc.GetObject(nNode); + ParaPortion& rPortion = GetParaPortions().getRef(nNode); const sal_Int32 nStartPos = nNode==nStartNode ? aSel.Min().GetIndex() : 0; const sal_Int32 nEndPos = nNode==nEndNode ? aSel.Max().GetIndex() : pNode->Len(); // can also be == nStart! @@ -564,14 +567,14 @@ void ImpEditEngine::SetAttribs( EditSelection aSel, const SfxItemSet& rSet, SetA if ( bParaAttribFound ) { - ParaAttribsChanged( pPortion->GetNode() ); + ParaAttribsChanged(rPortion.GetNode()); } else if ( bCharAttribFound ) { mbFormatted = false; if ( !pNode->Len() || ( nStartPos != nEndPos ) ) { - pPortion->MarkSelectionInvalid( nStartPos ); + rPortion.MarkSelectionInvalid(nStartPos); if ( bCheckLanguage ) pNode->GetWrongList()->SetInvalidRange(nStartPos, nEndPos); } @@ -602,10 +605,14 @@ void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, EERemoveParaAttribsMo for ( sal_Int32 nNode = nStartNode; nNode <= nEndNode; nNode++ ) { ContentNode* pNode = maEditDoc.GetObject( nNode ); - ParaPortion* pPortion = GetParaPortions()[nNode]; DBG_ASSERT( maEditDoc.GetObject( nNode ), "Node not found: SetAttribs" ); - DBG_ASSERT( GetParaPortions().SafeGetObject( nNode ), "Portion not found: SetAttribs" ); + DBG_ASSERT(GetParaPortions().exists(nNode), "Portion not found: SetAttribs"); + + if (!GetParaPortions().exists(nNode)) + continue; + + ParaPortion& rPortion = GetParaPortions().getRef(nNode); const sal_Int32 nStartPos = nNode==nStartNode ? aSel.Min().GetIndex() : 0; const sal_Int32 nEndPos = nNode==nEndNode ? aSel.Max().GetIndex() : pNode->Len(); // can also be == nStart! @@ -636,7 +643,7 @@ void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, EERemoveParaAttribsMo if ( bChanged && !bRemoveParaAttribs ) { mbFormatted = false; - pPortion->MarkSelectionInvalid( nStartPos ); + rPortion.MarkSelectionInvalid(nStartPos); } } } |