diff options
author | Noel Grandin <noelgrandin@gmail.com> | 2022-04-18 16:30:55 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2022-04-18 18:20:56 +0200 |
commit | 383b55a38da0d92b4499f38b4d7f5ff036e0072f (patch) | |
tree | e787369e9f1b1916eab21abcff8ab66516631962 /editeng/source/editeng/impedit4.cxx | |
parent | 4845e68e6575030464c260406b667f0a51bf4a9e (diff) |
tdf#148620 Crash in Draw using Format > Lists > Move Down
This reverts
commit 35f03f26799747894d1534796b6cb227bd4f233b
speed up loading large ODS a little
since ImpEditEngine::ImpMoveParagraphs wants to manipulate
ParaPortion's and also identify them by pointer
Also convert the OSL_ASSERT in this method to an assert
to catch such problems earlier
Change-Id: Id924d00c9524223db9a96e487b331ce60e3a4fff
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133128
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'editeng/source/editeng/impedit4.cxx')
-rw-r--r-- | editeng/source/editeng/impedit4.cxx | 79 |
1 files changed, 41 insertions, 38 deletions
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index 8d7fca6b3885..f8b2c3767ce8 100644 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -540,20 +540,21 @@ ErrCode ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel ) rOutput.WriteChar( ' ' ); // Separator ItemList aAttribItems; - ParaPortion& rParaPortion = FindParaPortion( pNode ); + ParaPortion* pParaPortion = FindParaPortion( pNode ); + DBG_ASSERT( pParaPortion, "Portion not found: WriteRTF" ); sal_Int32 nIndex = 0; sal_Int32 nStartPos = 0; sal_Int32 nEndPos = pNode->Len(); sal_Int32 nStartPortion = 0; - sal_Int32 nEndPortion = rParaPortion.GetTextPortions().Count() - 1; + sal_Int32 nEndPortion = pParaPortion->GetTextPortions().Count() - 1; bool bFinishPortion = false; sal_Int32 nPortionStart; if ( nNode == nStartNode ) { nStartPos = aSel.Min().GetIndex(); - nStartPortion = rParaPortion.GetTextPortions().FindPortion( nStartPos, nPortionStart ); + nStartPortion = pParaPortion->GetTextPortions().FindPortion( nStartPos, nPortionStart ); if ( nStartPos != 0 ) { aAttribItems.Clear(); @@ -571,14 +572,14 @@ ErrCode ImpEditEngine::WriteRTF( SvStream& rOutput, EditSelection aSel ) if ( nNode == nEndNode ) // can also be == nStart! { nEndPos = aSel.Max().GetIndex(); - nEndPortion = rParaPortion.GetTextPortions().FindPortion( nEndPos, nPortionStart ); + nEndPortion = pParaPortion->GetTextPortions().FindPortion( nEndPos, nPortionStart ); } const EditCharAttrib* pNextFeature = pNode->GetCharAttribs().FindFeature(nIndex); // start at 0, so the index is right ... for ( sal_Int32 n = 0; n <= nEndPortion; n++ ) { - const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[n]; + const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[n]; if ( n < nStartPortion ) { nIndex = nIndex + rTextPortion.GetLen(); @@ -1007,8 +1008,8 @@ std::unique_ptr<EditTextObject> ImpEditEngine::CreateTextObject( EditSelection a if ( bOnlyFullParagraphs ) { - const ParaPortion& rParaPortion = GetParaPortions()[nNode]; - nTextPortions += rParaPortion.GetTextPortions().Count(); + const ParaPortion* pParaPortion = GetParaPortions()[nNode]; + nTextPortions += pParaPortion->GetTextPortions().Count(); } sal_Int32 nStartPos = 0; @@ -1084,39 +1085,39 @@ std::unique_ptr<EditTextObject> ImpEditEngine::CreateTextObject( EditSelection a pTxtObj->SetPortionInfo(std::unique_ptr<XParaPortionList>(pXList)); for ( nNode = nStartNode; nNode <= nEndNode; nNode++ ) { - const ParaPortion& rParaPortion = GetParaPortions()[nNode]; + const ParaPortion* pParaPortion = GetParaPortions()[nNode]; XParaPortion* pX = new XParaPortion; pXList->push_back(pX); - pX->nHeight = rParaPortion.GetHeight(); - pX->nFirstLineOffset = rParaPortion.GetFirstLineOffset(); + pX->nHeight = pParaPortion->GetHeight(); + pX->nFirstLineOffset = pParaPortion->GetFirstLineOffset(); // The TextPortions - sal_uInt16 nCount = rParaPortion.GetTextPortions().Count(); + sal_uInt16 nCount = pParaPortion->GetTextPortions().Count(); sal_uInt16 n; for ( n = 0; n < nCount; n++ ) { - const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[n]; + const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[n]; TextPortion* pNew = new TextPortion( rTextPortion ); pX->aTextPortions.Append(pNew); } // The lines - nCount = rParaPortion.GetLines().Count(); + nCount = pParaPortion->GetLines().Count(); for ( n = 0; n < nCount; n++ ) { - const EditLine& rLine = rParaPortion.GetLines()[n]; + const EditLine& rLine = pParaPortion->GetLines()[n]; EditLine* pNew = rLine.Clone(); pX->aLines.Append(pNew); } #ifdef DBG_UTIL sal_uInt16 nTest; int nTPLen = 0, nTxtLen = 0; - 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!" ); + 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!" ); #endif } } @@ -1199,8 +1200,9 @@ EditSelection ImpEditEngine::InsertTextObject( const EditTextObject& rTextObject aPaM = ImpFastInsertText( aPaM, pC->GetText() ); - ParaPortion& rPortion = FindParaPortion( aPaM.GetNode() ); - rPortion.MarkInvalid( nStartPos, pC->GetText().getLength() ); + ParaPortion* pPortion = FindParaPortion( aPaM.GetNode() ); + DBG_ASSERT( pPortion, "Blind Portion in FastInsertText" ); + pPortion->MarkInvalid( nStartPos, pC->GetText().getLength() ); // Character attributes ... bool bAllreadyHasAttribs = aPaM.GetNode()->GetCharAttribs().Count() != 0; @@ -1248,7 +1250,7 @@ EditSelection ImpEditEngine::InsertTextObject( const EditTextObject& rTextObject UpdateFields(); // Otherwise, quick format => no attributes! - rPortion.MarkSelectionInvalid( nStartPos ); + pPortion->MarkSelectionInvalid( nStartPos ); } #if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG @@ -1278,40 +1280,41 @@ EditSelection ImpEditEngine::InsertTextObject( const EditTextObject& rTextObject if ( bNewContent && bUsePortionInfo ) { const XParaPortion& rXP = (*pPortionInfo)[n]; - ParaPortion& rParaPortion = GetParaPortions()[ nPara ]; - rParaPortion.nHeight = rXP.nHeight; - rParaPortion.nFirstLineOffset = rXP.nFirstLineOffset; - rParaPortion.bForceRepaint = true; - rParaPortion.SetValid(); // Do not format + ParaPortion* pParaPortion = GetParaPortions()[ nPara ]; + DBG_ASSERT( pParaPortion, "InsertBinTextObject: ParaPortion?" ); + pParaPortion->nHeight = rXP.nHeight; + pParaPortion->nFirstLineOffset = rXP.nFirstLineOffset; + pParaPortion->bForceRepaint = true; + pParaPortion->SetValid(); // Do not format // The Text Portions - rParaPortion.GetTextPortions().Reset(); + pParaPortion->GetTextPortions().Reset(); sal_uInt16 nCount = rXP.aTextPortions.Count(); for ( sal_uInt16 _n = 0; _n < nCount; _n++ ) { const TextPortion& rTextPortion = rXP.aTextPortions[_n]; TextPortion* pNew = new TextPortion( rTextPortion ); - rParaPortion.GetTextPortions().Append(pNew); + pParaPortion->GetTextPortions().Append(pNew); } // The lines - rParaPortion.GetLines().Reset(); + pParaPortion->GetLines().Reset(); nCount = rXP.aLines.Count(); for ( sal_uInt16 m = 0; m < nCount; m++ ) { const EditLine& rLine = rXP.aLines[m]; EditLine* pNew = rLine.Clone(); pNew->SetInvalid(); // Paint again! - rParaPortion.GetLines().Append(pNew); + pParaPortion->GetLines().Append(pNew); } #ifdef DBG_UTIL sal_uInt16 nTest; int nTPLen = 0, nTxtLen = 0; - 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() ), "InsertTextObject: ParaPortion not completely formatted!" ); + 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() ), "InsertTextObject: ParaPortion not completely formatted!" ); #endif } } @@ -2950,8 +2953,8 @@ EditSelection ImpEditEngine::TransliterateText( const EditSelection& rSelection, aNewSel.Max().SetIndex( aNewSel.Max().GetIndex() + nDiffs ); sal_Int32 nSelNode = aEditDoc.GetPos( rData.aSelection.Min().GetNode() ); - ParaPortion& rParaPortion = GetParaPortions()[nSelNode]; - rParaPortion.MarkSelectionInvalid( rData.nStart ); + ParaPortion* pParaPortion = GetParaPortions()[nSelNode]; + pParaPortion->MarkSelectionInvalid( rData.nStart ); } } } |