summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2022-04-18 16:30:55 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2022-04-25 17:45:08 +0200
commit697d7b8bf50bdbf097c45f5d7974a27a14e1dd9e (patch)
tree7133591abb5a7d8eb251f359613daadb43700f5b
parent116b246e42a1c807e4e693bd020231a22f05abcd (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> Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133300
-rw-r--r--editeng/inc/editdoc.hxx38
-rw-r--r--editeng/qa/unit/core-test.cxx4
-rw-r--r--editeng/source/editeng/editdbg.cxx32
-rw-r--r--editeng/source/editeng/editdoc.cxx114
-rw-r--r--editeng/source/editeng/editeng.cxx24
-rw-r--r--editeng/source/editeng/impedit.cxx16
-rw-r--r--editeng/source/editeng/impedit.hxx8
-rw-r--r--editeng/source/editeng/impedit2.cxx211
-rw-r--r--editeng/source/editeng/impedit3.cxx279
-rw-r--r--editeng/source/editeng/impedit4.cxx79
-rw-r--r--editeng/source/editeng/impedit5.cxx10
11 files changed, 428 insertions, 387 deletions
diff --git a/editeng/inc/editdoc.hxx b/editeng/inc/editdoc.hxx
index 133ea1ca9daa..353273c847e2 100644
--- a/editeng/inc/editdoc.hxx
+++ b/editeng/inc/editdoc.hxx
@@ -433,10 +433,8 @@ class TextPortionList
PortionsType maPortions;
public:
- TextPortionList();
- ~TextPortionList();
- TextPortionList(TextPortionList&&) = default;
- TextPortionList& operator=(TextPortionList&&) = default;
+ TextPortionList();
+ ~TextPortionList();
void Reset();
sal_Int32 FindPortion(
@@ -477,7 +475,9 @@ private:
bool bInvalid:1; // for skillful formatting
public:
- EditLine();
+ EditLine();
+ EditLine( const EditLine& );
+ ~EditLine();
bool IsIn( sal_Int32 nIndex ) const
{ return ( (nIndex >= nStart ) && ( nIndex < nEnd ) ); }
@@ -532,6 +532,7 @@ public:
EditLine* Clone() const;
+ EditLine& operator = ( const EditLine& rLine );
friend bool operator == ( const EditLine& r1, const EditLine& r2 );
};
@@ -543,10 +544,8 @@ class EditLineList
LinesType maLines;
public:
- EditLineList();
- ~EditLineList();
- EditLineList(EditLineList&&) = default;
- EditLineList& operator=(EditLineList&&) = default;
+ EditLineList();
+ ~EditLineList();
void Reset();
void DeleteFromLine(sal_Int32 nDelFrom);
@@ -583,11 +582,11 @@ private:
bool bVisible : 1; // Belongs to the node!
bool bForceRepaint : 1;
+ ParaPortion( const ParaPortion& ) = delete;
+
public:
- ParaPortion( ContentNode* pNode );
- ~ParaPortion();
- ParaPortion( ParaPortion&& ) = default;
- ParaPortion& operator=( ParaPortion&& ) = default;
+ ParaPortion( ContentNode* pNode );
+ ~ParaPortion();
sal_Int32 GetLineNumber( sal_Int32 nIndex ) const;
@@ -634,7 +633,7 @@ public:
class ParaPortionList
{
mutable sal_Int32 nLastCache;
- std::vector<ParaPortion> maPortions;
+ std::vector<std::unique_ptr<ParaPortion>> maPortions;
public:
ParaPortionList();
~ParaPortionList();
@@ -647,12 +646,13 @@ public:
ParaPortion* SafeGetObject(sal_Int32 nPos);
sal_Int32 GetPos(const ParaPortion* p) const;
- ParaPortion& operator[](sal_Int32 nPos);
- const ParaPortion& operator[](sal_Int32 nPos) const;
+ ParaPortion* operator[](sal_Int32 nPos);
+ const ParaPortion* operator[](sal_Int32 nPos) const;
- ParaPortion Remove(sal_Int32 nPos);
- ParaPortion& Insert(sal_Int32 nPos, ParaPortion&& p);
- void Append(ParaPortion&& p);
+ 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;
#if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx
index 0859a018ca0a..5e99d63c8746 100644
--- a/editeng/qa/unit/core-test.cxx
+++ b/editeng/qa/unit/core-test.cxx
@@ -191,8 +191,8 @@ void Test::testLineSpacing()
aEditEngine.QuickSetAttribs(*pSet, aSelection);
// Assert changes
- ParaPortion& rParaPortion = aEditEngine.GetParaPortions()[0];
- ContentNode* const pNode = rParaPortion.GetNode();
+ ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0];
+ ContentNode* const pNode = pParaPortion->GetNode();
const SvxLineSpacingItem& rLSItem = pNode->GetContentAttribs().GetItem(EE_PARA_SBL);
CPPUNIT_ASSERT_EQUAL(SvxInterLineSpaceRule::Prop, rLSItem.GetInterLineSpaceRule());
CPPUNIT_ASSERT_EQUAL(nSpace, rLSItem.GetPropLineSpace());
diff --git a/editeng/source/editeng/editdbg.cxx b/editeng/source/editeng/editdbg.cxx
index d2a97cdb0efa..36344567a217 100644
--- a/editeng/source/editeng/editdbg.cxx
+++ b/editeng/source/editeng/editdbg.cxx
@@ -335,22 +335,22 @@ void EditEngine::DumpData(const EditEngine* pEE, bool bInfoBox)
fprintf( fp, "\n================================================================================" );
for ( sal_Int32 nPortion = 0; nPortion < pEE->pImpEditEngine->GetParaPortions().Count(); nPortion++)
{
- ParaPortion& rPPortion = pEE->pImpEditEngine->GetParaPortions()[nPortion];
+ ParaPortion* pPPortion = pEE->pImpEditEngine->GetParaPortions()[nPortion];
fprintf( fp, "\nParagraph %" SAL_PRIdINT32 ": Length = %" SAL_PRIdINT32 ", Invalid = %i\nText = '%s'",
- nPortion, rPPortion.GetNode()->Len(), rPPortion.IsInvalid(),
- OUStringToOString(rPPortion.GetNode()->GetString(), RTL_TEXTENCODING_UTF8).getStr() );
+ nPortion, pPPortion->GetNode()->Len(), pPPortion->IsInvalid(),
+ OUStringToOString(pPPortion->GetNode()->GetString(), RTL_TEXTENCODING_UTF8).getStr() );
fprintf( fp, "\nVorlage:" );
- SfxStyleSheet* pStyle = rPPortion.GetNode()->GetStyleSheet();
+ SfxStyleSheet* pStyle = pPPortion->GetNode()->GetStyleSheet();
if ( pStyle )
fprintf( fp, " %s", OUStringToOString( pStyle->GetName(), RTL_TEXTENCODING_UTF8).getStr() );
fprintf( fp, "\nParagraph attribute:" );
- DbgOutItemSet( fp, rPPortion.GetNode()->GetContentAttribs().GetItems(), false, false );
+ DbgOutItemSet( fp, pPPortion->GetNode()->GetContentAttribs().GetItems(), false, false );
fprintf( fp, "\nCharacter attribute:" );
bool bZeroAttr = false;
- for ( sal_Int32 z = 0; z < rPPortion.GetNode()->GetCharAttribs().Count(); ++z )
+ for ( sal_Int32 z = 0; z < pPPortion->GetNode()->GetCharAttribs().Count(); ++z )
{
- const std::unique_ptr<EditCharAttrib>& rAttr = rPPortion.GetNode()->GetCharAttribs().GetAttribs()[z];
+ const std::unique_ptr<EditCharAttrib>& rAttr = pPPortion->GetNode()->GetCharAttribs().GetAttribs()[z];
OStringBuffer aCharAttribs;
aCharAttribs.append("\nA");
aCharAttribs.append(nPortion);
@@ -370,20 +370,20 @@ void EditEngine::DumpData(const EditEngine* pEE, bool bInfoBox)
if ( bZeroAttr )
fprintf( fp, "\nNULL-Attribute!" );
- const sal_Int32 nTextPortions = rPPortion.GetTextPortions().Count();
+ const sal_Int32 nTextPortions = pPPortion->GetTextPortions().Count();
OStringBuffer aPortionStr("\nText portions: #");
aPortionStr.append(nTextPortions);
aPortionStr.append(" \nA");
aPortionStr.append(nPortion);
aPortionStr.append(": Paragraph Length = ");
- aPortionStr.append(rPPortion.GetNode()->Len());
+ aPortionStr.append(pPPortion->GetNode()->Len());
aPortionStr.append("\nA");
aPortionStr.append(nPortion);
aPortionStr.append(": ");
sal_Int32 n = 0;
for ( sal_Int32 z = 0; z < nTextPortions; ++z )
{
- TextPortion& rPortion = rPPortion.GetTextPortions()[z];
+ TextPortion& rPortion = pPPortion->GetTextPortions()[z];
aPortionStr.append(' ');
aPortionStr.append(rPortion.GetLen());
aPortionStr.append('(');
@@ -399,23 +399,23 @@ void EditEngine::DumpData(const EditEngine* pEE, bool bInfoBox)
aPortionStr.append(nPortion);
aPortionStr.append(": Total length: ");
aPortionStr.append(n);
- if ( rPPortion.GetNode()->Len() != n )
+ if ( pPPortion->GetNode()->Len() != n )
aPortionStr.append(" => Error !!!");
fprintf(fp, "%s", aPortionStr.getStr());
fprintf( fp, "\n\nLines:" );
// First the content ...
- for ( sal_Int32 nLine = 0; nLine < rPPortion.GetLines().Count(); nLine++ )
+ for ( sal_Int32 nLine = 0; nLine < pPPortion->GetLines().Count(); nLine++ )
{
- EditLine& rLine = rPPortion.GetLines()[nLine];
+ EditLine& rLine = pPPortion->GetLines()[nLine];
- OString aLine(OUStringToOString(rPPortion.GetNode()->Copy(rLine.GetStart(), rLine.GetEnd() - rLine.GetStart()), RTL_TEXTENCODING_ASCII_US));
+ OString aLine(OUStringToOString(pPPortion->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 < rPPortion.GetLines().Count(); nLine++ )
+ for ( sal_Int32 nLine = 0; nLine < pPPortion->GetLines().Count(); nLine++ )
{
- EditLine& rLine = rPPortion.GetLines()[nLine];
+ EditLine& rLine = pPPortion->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 270b17923390..3e4e636648e7 100644
--- a/editeng/source/editeng/editdoc.cxx
+++ b/editeng/source/editeng/editdoc.cxx
@@ -369,6 +369,7 @@ TextPortionList::TextPortionList()
TextPortionList::~TextPortionList()
{
+ Reset();
}
void TextPortionList::Reset()
@@ -684,65 +685,52 @@ ParaPortionList::~ParaPortionList()
sal_Int32 ParaPortionList::GetPos(const ParaPortion* p) const
{
- sal_Int32 nArrayLen = maPortions.size();
-
- // Through certain filter code-paths we do a lot of appends, which in
- // turn call GetPos - creating some N^2 nightmares. If we have a
- // non-trivially large list, do a few checks from the end first.
- if (nLastCache > 16 && nArrayLen > 16)
- {
- sal_Int32 nEnd;
- if (nLastCache > nArrayLen - 2)
- nEnd = nArrayLen;
- else
- nEnd = nLastCache + 2;
-
- for (sal_Int32 nIdx = nLastCache - 2; nIdx < nEnd; ++nIdx)
- {
- if (&maPortions.at(nIdx) == p)
- {
- nLastCache = nIdx;
- return nIdx;
- }
- }
- }
- // The world's lamest linear search from svarray...
- for (sal_Int32 nIdx = 0; nIdx < nArrayLen; ++nIdx)
- if (&maPortions.at(nIdx) == p)
- {
- nLastCache = nIdx;
- return nLastCache;
- }
+ return FastGetPos(maPortions, p, nLastCache);
+}
- // XXX "not found" condition for sal_Int32 indexes
- return EE_PARA_NOT_FOUND;
+ParaPortion* ParaPortionList::operator [](sal_Int32 nPos)
+{
+ return 0 <= nPos && nPos < static_cast<sal_Int32>(maPortions.size()) ? maPortions[nPos].get() : nullptr;
}
-ParaPortion& ParaPortionList::operator [](sal_Int32 nPos)
+const ParaPortion* ParaPortionList::operator [](sal_Int32 nPos) const
{
- return maPortions[nPos];
+ return 0 <= nPos && nPos < static_cast<sal_Int32>(maPortions.size()) ? maPortions[nPos].get() : nullptr;
}
-const ParaPortion& ParaPortionList::operator [](sal_Int32 nPos) const
+std::unique_ptr<ParaPortion> ParaPortionList::Release(sal_Int32 nPos)
{
- return maPortions[nPos];
+ if (nPos < 0 || static_cast<sal_Int32>(maPortions.size()) <= nPos)
+ {
+ SAL_WARN( "editeng", "ParaPortionList::Release - out of bounds pos " << nPos);
+ return nullptr;
+ }
+ std::unique_ptr<ParaPortion> p = std::move(maPortions[nPos]);
+ maPortions.erase(maPortions.begin()+nPos);
+ return p;
}
-ParaPortion ParaPortionList::Remove(sal_Int32 nPos)
+void ParaPortionList::Remove(sal_Int32 nPos)
{
- auto it = maPortions.begin()+nPos;
- ParaPortion val = std::move(*it);
- maPortions.erase(it);
- return val;
+ if (nPos < 0 || static_cast<sal_Int32>(maPortions.size()) <= nPos)
+ {
+ SAL_WARN( "editeng", "ParaPortionList::Remove - out of bounds pos " << nPos);
+ return;
+ }
+ maPortions.erase(maPortions.begin()+nPos);
}
-ParaPortion& ParaPortionList::Insert(sal_Int32 nPos, ParaPortion&& p)
+void ParaPortionList::Insert(sal_Int32 nPos, std::unique_ptr<ParaPortion> p)
{
+ if (nPos < 0 || static_cast<sal_Int32>(maPortions.size()) < nPos)
+ {
+ SAL_WARN( "editeng", "ParaPortionList::Insert - out of bounds pos " << nPos);
+ return;
+ }
maPortions.insert(maPortions.begin()+nPos, std::move(p));
- return maPortions[nPos];
}
-void ParaPortionList::Append(ParaPortion&& p)
+void ParaPortionList::Append(std::unique_ptr<ParaPortion> p)
{
maPortions.push_back(std::move(p));
}
@@ -768,9 +756,10 @@ tools::Long ParaPortionList::GetYOffset(const ParaPortion* pPPortion) const
tools::Long nHeight = 0;
for (const auto & rPortion : maPortions)
{
- if ( pPPortion == &rPortion )
+ const ParaPortion* pTmpPortion = rPortion.get();
+ if ( pTmpPortion == pPPortion )
return nHeight;
- nHeight += rPortion.GetHeight();
+ nHeight += pTmpPortion->GetHeight();
}
OSL_FAIL( "GetYOffset: Portion not found" );
return nHeight;
@@ -781,7 +770,7 @@ sal_Int32 ParaPortionList::FindParagraph(tools::Long nYOffset) const
tools::Long nY = 0;
for (size_t i = 0, n = maPortions.size(); i < n; ++i)
{
- nY += maPortions[i].GetHeight(); // should also be correct even in bVisible!
+ nY += maPortions[i]->GetHeight(); // should also be correct even in bVisible!
if ( nY > nYOffset )
return i <= SAL_MAX_INT32 ? static_cast<sal_Int32>(i) : SAL_MAX_INT32;
}
@@ -790,12 +779,12 @@ sal_Int32 ParaPortionList::FindParagraph(tools::Long nYOffset) const
const ParaPortion* ParaPortionList::SafeGetObject(sal_Int32 nPos) const
{
- return 0 <= nPos && nPos < static_cast<sal_Int32>(maPortions.size()) ? &maPortions[nPos] : nullptr;
+ return 0 <= nPos && nPos < static_cast<sal_Int32>(maPortions.size()) ? maPortions[nPos].get() : nullptr;
}
ParaPortion* ParaPortionList::SafeGetObject(sal_Int32 nPos)
{
- return 0 <= nPos && nPos < static_cast<sal_Int32>(maPortions.size()) ? &maPortions[nPos] : nullptr;
+ return 0 <= nPos && nPos < static_cast<sal_Int32>(maPortions.size()) ? maPortions[nPos].get() : nullptr;
}
#if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
@@ -939,6 +928,26 @@ EditLine::EditLine() :
{
}
+EditLine::EditLine( const EditLine& r ) :
+ nTxtWidth(0),
+ nStartPosX(0),
+ nStart(r.nStart),
+ nEnd(r.nEnd),
+ nStartPortion(r.nStartPortion),
+ nEndPortion(r.nEndPortion),
+ nHeight(0),
+ nTxtHeight(0),
+ nMaxAscent(0),
+ bHangingPunctuation(r.bHangingPunctuation),
+ bInvalid(true)
+{
+}
+
+EditLine::~EditLine()
+{
+}
+
+
EditLine* EditLine::Clone() const
{
EditLine* pL = new EditLine;
@@ -973,6 +982,15 @@ bool operator == ( const EditLine& r1, const EditLine& r2 )
return true;
}
+EditLine& EditLine::operator = ( const EditLine& r )
+{
+ nEnd = r.nEnd;
+ nStart = r.nStart;
+ nEndPortion = r.nEndPortion;
+ nStartPortion = r.nStartPortion;
+ return *this;
+}
+
void EditLine::SetHeight( sal_uInt16 nH, sal_uInt16 nTxtH )
{
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index f9207a937c1f..77dd821618cf 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -694,12 +694,12 @@ bool EditEngine::IsIdleFormatterActive() const
ParaPortion* EditEngine::FindParaPortion(ContentNode const * pNode)
{
- return &pImpEditEngine->FindParaPortion(pNode);
+ return pImpEditEngine->FindParaPortion(pNode);
}
const ParaPortion* EditEngine::FindParaPortion(ContentNode const * pNode) const
{
- return &pImpEditEngine->FindParaPortion(pNode);
+ return pImpEditEngine->FindParaPortion(pNode);
}
const ParaPortion* EditEngine::GetPrevVisPortion(const ParaPortion* pCurPortion) const
@@ -1918,7 +1918,7 @@ void EditEngine::SetControlWord( EEControlBits nWord )
for ( sal_Int32 n = 0; n < nNodes; n++ )
{
ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( n );
- const ParaPortion& rPortion = pImpEditEngine->GetParaPortions()[n];
+ const ParaPortion* pPortion = pImpEditEngine->GetParaPortions()[n];
bool bWrongs = false;
if (pNode->GetWrongList() != nullptr)
bWrongs = !pNode->GetWrongList()->empty();
@@ -1928,10 +1928,10 @@ void EditEngine::SetControlWord( EEControlBits nWord )
pImpEditEngine->aInvalidRect.SetLeft( 0 );
pImpEditEngine->aInvalidRect.SetRight( pImpEditEngine->GetPaperSize().Width() );
pImpEditEngine->aInvalidRect.SetTop( nY+1 );
- pImpEditEngine->aInvalidRect.SetBottom( nY + rPortion.GetHeight()-1 );
+ pImpEditEngine->aInvalidRect.SetBottom( nY+pPortion->GetHeight()-1 );
pImpEditEngine->UpdateViews( pImpEditEngine->pActiveView );
}
- nY += rPortion.GetHeight();
+ nY += pPortion->GetHeight();
}
}
}
@@ -2273,8 +2273,8 @@ bool EditEngine::ShouldCreateBigTextObject() const
sal_Int32 nParas = pImpEditEngine->GetEditDoc().Count();
for ( sal_Int32 nPara = 0; nPara < nParas; nPara++ )
{
- ParaPortion& rParaPortion = pImpEditEngine->GetParaPortions()[nPara];
- nTextPortions = nTextPortions + rParaPortion.GetTextPortions().Count();
+ ParaPortion* pParaPortion = pImpEditEngine->GetParaPortions()[nPara];
+ nTextPortions = nTextPortions + pParaPortion->GetTextPortions().Count();
}
return nTextPortions >= pImpEditEngine->GetBigTextObjectStart();
}
@@ -2431,11 +2431,11 @@ ParagraphInfos EditEngine::GetParagraphInfos( sal_Int32 nPara )
aInfos.bValid = pImpEditEngine->IsFormatted();
if ( pImpEditEngine->IsFormatted() )
{
- const ParaPortion& rParaPortion = pImpEditEngine->GetParaPortions()[nPara];
- const EditLine* pLine = rParaPortion.GetLines().Count() ?
- &rParaPortion.GetLines()[0] : nullptr;
- DBG_ASSERT( pLine, "GetParagraphInfos - Paragraph out of range" );
- if ( pLine )
+ 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 )
{
aInfos.nFirstLineHeight = pLine->GetHeight();
aInfos.nFirstLineTextHeight = pLine->GetTxtHeight();
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index 63dd7b78cd44..348bb24f9577 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -1135,7 +1135,7 @@ tools::Rectangle ImpEditView::GetEditCursor() const
if (nPara == EE_PARA_NOT_FOUND) // #i94322
return tools::Rectangle();
- const ParaPortion& rParaPortion = pEditEngine->GetParaPortions()[nPara];
+ const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara];
GetCursorFlags nShowCursorFlags = nExtraCursorFlags | GetCursorFlags::TextOnly;
@@ -1148,7 +1148,7 @@ tools::Rectangle ImpEditView::GetEditCursor() const
nShowCursorFlags |= GetCursorFlags::PreferPortionStart;
}
- return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, &rParaPortion);
+ return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, pParaPortion);
}
void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
@@ -1182,7 +1182,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
if (nPara == EE_PARA_NOT_FOUND) // #i94322
return;
- const ParaPortion& rParaPortion = pEditEngine->GetParaPortions()[nPara];
+ const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara];
GetCursorFlags nShowCursorFlags = nExtraCursorFlags | GetCursorFlags::TextOnly;
@@ -1195,7 +1195,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
nShowCursorFlags |= GetCursorFlags::PreferPortionStart;
}
- tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, &rParaPortion);
+ tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, pParaPortion);
if ( bGotoCursor ) // && (!pEditEngine->pImpEditEngine->GetStatus().AutoPageSize() ) )
{
@@ -1435,8 +1435,8 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
CursorDirection nCursorDir = CursorDirection::NONE;
if ( IsInsertMode() && !aEditSelection.HasRange() && ( pEditEngine->pImpEditEngine->HasDifferentRTLLevels( aPaM.GetNode() ) ) )
{
- sal_uInt16 nTextPortion = rParaPortion.GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, bool(nShowCursorFlags & GetCursorFlags::PreferPortionStart) );
- const TextPortion& rTextPortion = rParaPortion.GetTextPortions()[nTextPortion];
+ sal_uInt16 nTextPortion = pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, bool(nShowCursorFlags & GetCursorFlags::PreferPortionStart) );
+ const TextPortion& rTextPortion = pParaPortion->GetTextPortions()[nTextPortion];
if (rTextPortion.IsRightToLeft())
nCursorDir = CursorDirection::RTL;
else
@@ -1867,8 +1867,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& rParaPortion = pEditEngine->GetParaPortions()[nPara];
- nY += rParaPortion.GetFirstLineOffset();
+ const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara];
+ nY += pParaPortion->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 3855f38da45c..bc1ae95f6666 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -760,8 +760,8 @@ private:
void CheckIdleFormatter();
- inline const ParaPortion& FindParaPortion( const ContentNode* pNode ) const;
- inline ParaPortion& FindParaPortion( ContentNode const * pNode );
+ inline const ParaPortion* FindParaPortion( const ContentNode* pNode ) const;
+ inline ParaPortion* FindParaPortion( ContentNode const * pNode );
css::uno::Reference< css::datatransfer::XTransferable > CreateTransferable( const EditSelection& rSelection );
@@ -1263,14 +1263,14 @@ inline SfxUndoManager* ImpEditEngine::SetUndoManager(SfxUndoManager* pNew)
return pRetval;
}
-inline const ParaPortion& ImpEditEngine::FindParaPortion( const ContentNode* pNode ) const
+inline const ParaPortion* ImpEditEngine::FindParaPortion( const ContentNode* pNode ) const
{
sal_Int32 nPos = aEditDoc.GetPos( pNode );
DBG_ASSERT( nPos < GetParaPortions().Count(), "Portionloser Node?" );
return GetParaPortions()[ nPos ];
}
-inline ParaPortion& ImpEditEngine::FindParaPortion( ContentNode const * pNode )
+inline ParaPortion* ImpEditEngine::FindParaPortion( ContentNode const * pNode )
{
sal_Int32 nPos = aEditDoc.GetPos( pNode );
DBG_ASSERT( nPos < GetParaPortions().Count(), "Portionloser Node?" );
diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx
index 5880948068cb..64cab02ca186 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -238,7 +238,7 @@ void ImpEditEngine::InitDoc(bool bKeepParaAttribs)
GetParaPortions().Reset();
- GetParaPortions().Insert(0, ParaPortion( aEditDoc[0] ));
+ GetParaPortions().Insert(0, std::make_unique<ParaPortion>( aEditDoc[0] ));
bFormatted = false;
@@ -378,8 +378,8 @@ bool ImpEditEngine::Command( const CommandEvent& rCEvt, EditView* pView )
}
}
- ParaPortion& rPortion = FindParaPortion( mpIMEInfos->aPos.GetNode() );
- rPortion.MarkSelectionInvalid( mpIMEInfos->aPos.GetIndex() );
+ ParaPortion* pPortion = FindParaPortion( mpIMEInfos->aPos.GetNode() );
+ pPortion->MarkSelectionInvalid( mpIMEInfos->aPos.GetIndex() );
bool bWasCursorOverwrite = mpIMEInfos->bWasCursorOverwrite;
@@ -444,8 +444,8 @@ bool ImpEditEngine::Command( const CommandEvent& rCEvt, EditView* pView )
mpIMEInfos->nLen = pData->GetText().getLength();
}
- ParaPortion& rPortion = FindParaPortion( mpIMEInfos->aPos.GetNode() );
- rPortion.MarkSelectionInvalid( mpIMEInfos->aPos.GetIndex() );
+ ParaPortion* pPortion = FindParaPortion( mpIMEInfos->aPos.GetNode() );
+ pPortion->MarkSelectionInvalid( mpIMEInfos->aPos.GetIndex() );
FormatAndUpdate( pView );
}
@@ -768,8 +768,9 @@ void ImpEditEngine::ParaAttribsChanged( ContentNode const * pNode, bool bIgnoreU
aEditDoc.SetModified( true );
bFormatted = false;
- ParaPortion& rPortion = FindParaPortion( pNode );
- rPortion.MarkSelectionInvalid( 0 );
+ ParaPortion* pPortion = FindParaPortion( pNode );
+ OSL_ENSURE( pPortion, "ParaAttribsChanged: Portion?" );
+ pPortion->MarkSelectionInvalid( 0 );
sal_Int32 nPara = aEditDoc.GetPos( pNode );
if ( bIgnoreUndoCheck || pEditEngine->IsInUndo() )
@@ -1254,14 +1255,15 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView )
{
assert(pView && "No View - No Cursor Movement!");
- const ParaPortion& rPPortion = FindParaPortion( rPaM.GetNode() );
- sal_Int32 nLine = rPPortion.GetLineNumber( rPaM.GetIndex() );
- const EditLine& rLine = rPPortion.GetLines()[nLine];
+ const ParaPortion* pPPortion = FindParaPortion( rPaM.GetNode() );
+ OSL_ENSURE( pPPortion, "No matching portion found: CursorUp ");
+ sal_Int32 nLine = pPPortion->GetLineNumber( rPaM.GetIndex() );
+ const EditLine& rLine = pPPortion->GetLines()[nLine];
tools::Long nX;
if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW )
{
- nX = GetXPos( &rPPortion, &rLine, rPaM.GetIndex() );
+ nX = GetXPos( pPPortion, &rLine, rPaM.GetIndex() );
pView->pImpEditView->nTravelXPos = nX+nOnePixelInRef;
}
else
@@ -1270,8 +1272,8 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView )
EditPaM aNewPaM( rPaM );
if ( nLine ) // same paragraph
{
- const EditLine& rPrevLine = rPPortion.GetLines()[nLine-1];
- aNewPaM.SetIndex( GetChar( &rPPortion, &rPrevLine, nX ) );
+ const EditLine& rPrevLine = pPPortion->GetLines()[nLine-1];
+ 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
@@ -1281,7 +1283,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView const * pView )
}
else // previous paragraph
{
- const ParaPortion* pPrevPortion = GetPrevVisPortion( &rPPortion );
+ const ParaPortion* pPrevPortion = GetPrevVisPortion( pPPortion );
if ( pPrevPortion )
{
const EditLine& rLine2 = pPrevPortion->GetLines()[pPrevPortion->GetLines().Count()-1];
@@ -1297,31 +1299,32 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView )
{
OSL_ENSURE( pView, "No View - No Cursor Movement!" );
- const ParaPortion& rPPortion = FindParaPortion( rPaM.GetNode() );
- sal_Int32 nLine = rPPortion.GetLineNumber( rPaM.GetIndex() );
+ const ParaPortion* pPPortion = FindParaPortion( rPaM.GetNode() );
+ OSL_ENSURE( pPPortion, "No matching portion found: CursorDown" );
+ sal_Int32 nLine = pPPortion->GetLineNumber( rPaM.GetIndex() );
tools::Long nX;
if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW )
{
- const EditLine& rLine = rPPortion.GetLines()[nLine];
- nX = GetXPos( &rPPortion, &rLine, rPaM.GetIndex() );
+ const EditLine& rLine = pPPortion->GetLines()[nLine];
+ nX = GetXPos( pPPortion, &rLine, rPaM.GetIndex() );
pView->pImpEditView->nTravelXPos = nX+nOnePixelInRef;
}
else
nX = pView->pImpEditView->nTravelXPos;
EditPaM aNewPaM( rPaM );
- if ( nLine < rPPortion.GetLines().Count()-1 )
+ if ( nLine < pPPortion->GetLines().Count()-1 )
{
- const EditLine& rNextLine = rPPortion.GetLines()[nLine+1];
- aNewPaM.SetIndex( GetChar( &rPPortion, &rNextLine, nX ) );
+ const EditLine& rNextLine = pPPortion->GetLines()[nLine+1];
+ aNewPaM.SetIndex( GetChar( pPPortion, &rNextLine, nX ) );
// Special treatment, see CursorUp ...
- if ( ( aNewPaM.GetIndex() == rNextLine.GetEnd() ) && ( aNewPaM.GetIndex() > rNextLine.GetStart() ) && ( aNewPaM.GetIndex() < rPPortion.GetNode()->Len() ) )
+ if ( ( aNewPaM.GetIndex() == rNextLine.GetEnd() ) && ( aNewPaM.GetIndex() > rNextLine.GetStart() ) && ( aNewPaM.GetIndex() < pPPortion->GetNode()->Len() ) )
aNewPaM = CursorLeft( aNewPaM );
}
else // next paragraph
{
- const ParaPortion* pNextPortion = GetNextVisPortion( &rPPortion );
+ const ParaPortion* pNextPortion = GetNextVisPortion( pPPortion );
if ( pNextPortion )
{
const EditLine& rLine = pNextPortion->GetLines()[0];
@@ -1339,9 +1342,10 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView const * pView )
EditPaM ImpEditEngine::CursorStartOfLine( const EditPaM& rPaM )
{
- const ParaPortion& rCurPortion = FindParaPortion( rPaM.GetNode() );
- sal_Int32 nLine = rCurPortion.GetLineNumber( rPaM.GetIndex() );
- const EditLine& rLine = rCurPortion.GetLines()[nLine];
+ const ParaPortion* pCurPortion = FindParaPortion( rPaM.GetNode() );
+ OSL_ENSURE( pCurPortion, "No Portion for the PaM ?" );
+ sal_Int32 nLine = pCurPortion->GetLineNumber( rPaM.GetIndex() );
+ const EditLine& rLine = pCurPortion->GetLines()[nLine];
EditPaM aNewPaM( rPaM );
aNewPaM.SetIndex( rLine.GetStart() );
@@ -1350,9 +1354,10 @@ EditPaM ImpEditEngine::CursorStartOfLine( const EditPaM& rPaM )
EditPaM ImpEditEngine::CursorEndOfLine( const EditPaM& rPaM )
{
- const ParaPortion& rCurPortion = FindParaPortion( rPaM.GetNode() );
- sal_Int32 nLine = rCurPortion.GetLineNumber( rPaM.GetIndex() );
- const EditLine& rLine = rCurPortion.GetLines()[nLine];
+ const ParaPortion* pCurPortion = FindParaPortion( rPaM.GetNode() );
+ OSL_ENSURE( pCurPortion, "No Portion for the PaM ?" );
+ sal_Int32 nLine = pCurPortion->GetLineNumber( rPaM.GetIndex() );
+ const EditLine& rLine = pCurPortion->GetLines()[nLine];
EditPaM aNewPaM( rPaM );
aNewPaM.SetIndex( rLine.GetEnd() );
@@ -2146,25 +2151,25 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_Int32 n
if ( nNewPos == 0 ) // Move to Start
{
- pRecalc1 = &GetParaPortions()[0];
- pRecalc2 = &GetParaPortions()[aOldPositions.Min()];
+ pRecalc1 = GetParaPortions()[0];
+ pRecalc2 = GetParaPortions()[aOldPositions.Min()];
}
else if ( nNewPos == nParaCount )
{
- pRecalc1 = &GetParaPortions()[nParaCount-1];
- pRecalc2 = &GetParaPortions()[aOldPositions.Max()];
+ pRecalc1 = GetParaPortions()[nParaCount-1];
+ pRecalc2 = GetParaPortions()[aOldPositions.Max()];
}
if ( aOldPositions.Min() == 0 ) // Move from Start
{
- pRecalc3 = &GetParaPortions()[0];
- pRecalc4 = &GetParaPortions()[aOldPositions.Max()+1];
+ pRecalc3 = GetParaPortions()[0];
+ pRecalc4 = GetParaPortions()[aOldPositions.Max()+1];
}
else if ( aOldPositions.Max() == (nParaCount-1) )
{
- pRecalc3 = &GetParaPortions()[aOldPositions.Max()];
- pRecalc4 = &GetParaPortions()[aOldPositions.Min()-1];
+ pRecalc3 = GetParaPortions()[aOldPositions.Max()];
+ pRecalc4 = GetParaPortions()[aOldPositions.Min()-1];
}
MoveParagraphsInfo aMoveParagraphsInfo( aOldPositions.Min(), aOldPositions.Max(), nNewPos );
@@ -2180,28 +2185,28 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_Int32 n
for (tools::Long i = aOldPositions.Min(); i <= aOldPositions.Max(); i++ )
{
// always aOldPositions.Min(), since Remove().
- ParaPortion aTmpPortion = GetParaPortions().Remove(aOldPositions.Min());
+ std::unique_ptr<ParaPortion> pTmpPortion = GetParaPortions().Release(aOldPositions.Min());
aEditDoc.Release( aOldPositions.Min() );
- aTmpPortionList.Append(std::move(aTmpPortion));
+ aTmpPortionList.Append(std::move(pTmpPortion));
}
sal_Int32 nRealNewPos = pDestPortion ? GetParaPortions().GetPos( pDestPortion ) : GetParaPortions().Count();
- OSL_ENSURE( nRealNewPos != EE_PARA_NOT_FOUND, "ImpMoveParagraphs: Invalid Position!" );
+ assert( nRealNewPos != EE_PARA_NOT_FOUND && "ImpMoveParagraphs: Invalid Position!" );
sal_Int32 i = 0;
while( aTmpPortionList.Count() > 0 )
{
- ParaPortion aTmpPortion = aTmpPortionList.Remove(0);
+ std::unique_ptr<ParaPortion> pTmpPortion = aTmpPortionList.Release(0);
if ( i == 0 )
- aSelection.Min().SetNode( aTmpPortion.GetNode() );
+ aSelection.Min().SetNode( pTmpPortion->GetNode() );
- aSelection.Max().SetNode( aTmpPortion.GetNode() );
- aSelection.Max().SetIndex( aTmpPortion.GetNode()->Len() );
+ aSelection.Max().SetNode( pTmpPortion->GetNode() );
+ aSelection.Max().SetIndex( pTmpPortion->GetNode()->Len() );
- ContentNode* pN = aTmpPortion.GetNode();
+ ContentNode* pN = pTmpPortion->GetNode();
aEditDoc.Insert(nRealNewPos+i, pN);
- GetParaPortions().Insert(nRealNewPos+i, std::move(aTmpPortion));
+ GetParaPortions().Insert(nRealNewPos+i, std::move(pTmpPortion));
++i;
}
@@ -2275,7 +2280,8 @@ EditPaM ImpEditEngine::ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pR
ParaAttribsChanged( pLeft, true );
// First search for Portions since pRight is gone after ConnectParagraphs.
- ParaPortion& rLeftPortion = FindParaPortion( pLeft );
+ ParaPortion* pLeftPortion = FindParaPortion( pLeft );
+ OSL_ENSURE( pLeftPortion, "Blind Portion in ImpConnectParagraphs(1)" );
if ( GetStatus().DoOnlineSpelling() )
{
@@ -2302,7 +2308,7 @@ EditPaM ImpEditEngine::ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pR
EditPaM aPaM = aEditDoc.ConnectParagraphs( pLeft, pRight );
GetParaPortions().Remove( nParagraphTobeDeleted );
- rLeftPortion.MarkSelectionInvalid( aPaM.GetIndex() );
+ pLeftPortion->MarkSelectionInvalid( aPaM.GetIndex() );
// the right node is deleted by EditDoc:ConnectParagraphs().
if ( GetTextRanger() )
@@ -2312,9 +2318,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& rPP = GetParaPortions()[n];
- rPP.MarkSelectionInvalid( 0 );
- rPP.GetLines().Reset();
+ ParaPortion* pPP = GetParaPortions()[n];
+ pPP->MarkSelectionInvalid( 0 );
+ pPP->GetLines().Reset();
}
}
@@ -2449,23 +2455,26 @@ EditPaM ImpEditEngine::ImpDeleteSelection(const EditSelection& rCurSel)
{
// The Rest of the StartNodes...
ImpRemoveChars( aStartPaM, aStartPaM.GetNode()->Len() - aStartPaM.GetIndex() );
- ParaPortion& rPortion = FindParaPortion( aStartPaM.GetNode() );
- rPortion.MarkSelectionInvalid( aStartPaM.GetIndex() );
+ ParaPortion* pPortion = FindParaPortion( aStartPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in ImpDeleteSelection(3)" );
+ pPortion->MarkSelectionInvalid( aStartPaM.GetIndex() );
// The beginning of the EndNodes...
const sal_Int32 nChars = aEndPaM.GetIndex();
aEndPaM.SetIndex( 0 );
ImpRemoveChars( aEndPaM, nChars );
- ParaPortion& rPortion2 = FindParaPortion( aEndPaM.GetNode() );
- rPortion2.MarkSelectionInvalid( 0 );
+ pPortion = FindParaPortion( aEndPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in ImpDeleteSelection(4)" );
+ pPortion->MarkSelectionInvalid( 0 );
// Join together...
aStartPaM = ImpConnectParagraphs( aStartPaM.GetNode(), aEndPaM.GetNode() );
}
else
{
ImpRemoveChars( aStartPaM, aEndPaM.GetIndex() - aStartPaM.GetIndex() );
- ParaPortion& rPortion = FindParaPortion( aStartPaM.GetNode() );
- rPortion.MarkInvalid( aEndPaM.GetIndex(), aStartPaM.GetIndex() - aEndPaM.GetIndex() );
+ ParaPortion* pPortion = FindParaPortion( aStartPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in ImpDeleteSelection(5)" );
+ pPortion->MarkInvalid( aEndPaM.GetIndex(), aStartPaM.GetIndex() - aEndPaM.GetIndex() );
}
UpdateSelections();
@@ -2670,8 +2679,9 @@ EditPaM ImpEditEngine::InsertTextUserInput( const EditSelection& rCurSel,
}
aEditDoc.InsertText( aPaM, OUString(c) );
- ParaPortion& rPortion = FindParaPortion( aPaM.GetNode() );
- rPortion.MarkInvalid( aPaM.GetIndex(), 1 );
+ ParaPortion* pPortion = FindParaPortion( aPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in InsertText" );
+ pPortion->MarkInvalid( aPaM.GetIndex(), 1 );
aPaM.SetIndex( aPaM.GetIndex()+1 ); // does not do EditDoc-Method anymore
}
@@ -2756,7 +2766,8 @@ EditPaM ImpEditEngine::ImpInsertText(const EditSelection& aCurSel, const OUStrin
nStart2 = nEnd2+1;
}
}
- ParaPortion& rPortion = FindParaPortion( aPaM.GetNode() );
+ ParaPortion* pPortion = FindParaPortion( aPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in InsertText" );
if ( GetStatus().DoOnlineSpelling() )
{
@@ -2765,10 +2776,10 @@ EditPaM ImpEditEngine::ImpInsertText(const EditSelection& aCurSel, const OUStrin
if (pWrongs && !pWrongs->empty())
pWrongs->ClearWrongs( aCurWord.Min().GetIndex(), aPaM.GetIndex(), aPaM.GetNode() );
// ... and mark both words as 'to be checked again'
- rPortion.MarkInvalid( aCurWord.Min().GetIndex(), aLine.getLength() );
+ pPortion->MarkInvalid( aCurWord.Min().GetIndex(), aLine.getLength() );
}
else
- rPortion.MarkInvalid( aCurPaM.GetIndex(), aLine.getLength() );
+ pPortion->MarkInvalid( aCurPaM.GetIndex(), aLine.getLength() );
}
if ( nEnd < aText.getLength() )
aPaM = ImpInsertParaBreak( aPaM );
@@ -2820,8 +2831,9 @@ EditPaM ImpEditEngine::ImpInsertFeature(const EditSelection& rCurSel, const SfxP
aPaM = aEditDoc.InsertFeature( aPaM, rItem );
UpdateFields();
- ParaPortion& rPortion = FindParaPortion( aPaM.GetNode() );
- rPortion.MarkInvalid( aPaM.GetIndex()-1, 1 );
+ ParaPortion* pPortion = FindParaPortion( aPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in InsertFeature" );
+ pPortion->MarkInvalid( aPaM.GetIndex()-1, 1 );
TextModified();
@@ -2883,14 +2895,16 @@ EditPaM ImpEditEngine::ImpInsertParaBreak( EditPaM& rPaM, bool bKeepEndingAttrib
pRWrongs->SetInvalidRange(0, 1); // Only test the first word
}
- ParaPortion& rPortion = FindParaPortion( rPaM.GetNode() );
- rPortion.MarkInvalid( rPaM.GetIndex(), 0 );
+ ParaPortion* pPortion = FindParaPortion( rPaM.GetNode() );
+ OSL_ENSURE( pPortion, "Blind Portion in ImpInsertParaBreak" );
+ pPortion->MarkInvalid( rPaM.GetIndex(), 0 );
// Optimization: Do not place unnecessarily many getPos to Listen!
// Here, as in undo, but also in all other methods.
- sal_Int32 nPos = GetParaPortions().GetPos( &rPortion );
- ParaPortion& rNewPortion = GetParaPortions().Insert(nPos+1, ParaPortion(aPaM.GetNode()));
- ParaAttribsChanged( rNewPortion.GetNode() );
+ sal_Int32 nPos = GetParaPortions().GetPos( pPortion );
+ ParaPortion* pNewPortion = new ParaPortion( aPaM.GetNode() );
+ GetParaPortions().Insert(nPos+1, std::unique_ptr<ParaPortion>(pNewPortion));
+ ParaAttribsChanged( pNewPortion->GetNode() );
if ( IsCallParaInsertedOrDeleted() )
GetEditEnginePtr()->ParagraphInserted( nPos+1 );
@@ -2921,7 +2935,7 @@ EditPaM ImpEditEngine::ImpFastInsertParagraph( sal_Int32 nPara )
aEditDoc.Insert(nPara, pNode);
- GetParaPortions().Insert(nPara, ParaPortion( pNode ));
+ GetParaPortions().Insert(nPara, std::make_unique<ParaPortion>( pNode ));
if ( IsCallParaInsertedOrDeleted() )
GetEditEnginePtr()->ParagraphInserted( nPara );
@@ -3013,8 +3027,9 @@ bool ImpEditEngine::UpdateFields()
if ( bChangesInPara )
{
// If possible be more precise when invalidate.
- ParaPortion& rPortion = GetParaPortions()[nPara];
- rPortion.MarkSelectionInvalid( 0 );
+ ParaPortion* pPortion = GetParaPortions()[nPara];
+ OSL_ENSURE( pPortion, "NULL-Pointer in Doc" );
+ pPortion->MarkSelectionInvalid( 0 );
}
}
return bChanges;
@@ -3118,21 +3133,21 @@ void ImpEditEngine::IterateLineAreas(const IterateLinesAreasFunc& f, IterFlag eO
sal_Int16 nColumn = 0;
for (sal_Int32 n = 0, nPortions = GetParaPortions().Count(); n < nPortions; ++n)
{
- ParaPortion& rPortion = GetParaPortions()[n];
+ ParaPortion* pPortion = GetParaPortions()[n];
bool bSkipThis = true;
- if (rPortion.IsVisible())
+ if (pPortion->IsVisible())
{
// when typing idle formatting, asynchronous Paint. Invisible Portions may be invalid.
- if (rPortion.IsInvalid())
+ if (pPortion->IsInvalid())
return;
LineAreaInfo aInfo{
nColumn, // nColumn
- rPortion, // rPortion
+ *pPortion, // pPortion
n, // nPortion
nullptr, // pLine
0, // nLine
- { aLineStart, Size{ nColumnWidth, rPortion.GetFirstLineOffset() } }, // aArea
+ { aLineStart, Size{ nColumnWidth, pPortion->GetFirstLineOffset() } }, // aArea
0 // nHeightNeededToNotWrap
};
auto eResult = f(aInfo);
@@ -3144,16 +3159,16 @@ void ImpEditEngine::IterateLineAreas(const IterateLinesAreasFunc& f, IterFlag eO
if (!aStatus.IsOutliner())
{
const SvxLineSpacingItem& rLSItem
- = rPortion.GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL);
+ = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL);
nSBL = (rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Fix)
? GetYValue(rLSItem.GetInterLineSpace())
: 0;
}
- adjustYDirectionAware(aLineStart, rPortion.GetFirstLineOffset());
- for (sal_Int32 nLine = 0, nLines = rPortion.GetLines().Count(); nLine < nLines; nLine++)
+ adjustYDirectionAware(aLineStart, pPortion->GetFirstLineOffset());
+ for (sal_Int32 nLine = 0, nLines = pPortion->GetLines().Count(); nLine < nLines; nLine++)
{
- EditLine& rLine = rPortion.GetLines()[nLine];
+ EditLine& rLine = pPortion->GetLines()[nLine];
tools::Long nLineHeight = rLine.GetHeight();
if (nLine != nLines - 1)
nLineHeight += nVertLineSpacing;
@@ -3189,7 +3204,7 @@ void ImpEditEngine::IterateLineAreas(const IterateLinesAreasFunc& f, IterFlag eO
if (!aStatus.IsOutliner())
{
const SvxULSpaceItem& rULItem
- = rPortion.GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE);
+ = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE);
tools::Long nUL = GetYValue(rULItem.GetLower());
adjustYDirectionAware(aLineStart, nUL);
}
@@ -3307,19 +3322,20 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace
// Over all the paragraphs ...
- ParaPortion& rPortion = GetParaPortions()[nPara];
- if ( rPortion.IsVisible() )
+ OSL_ENSURE( 0 <= nPara && nPara < GetParaPortions().Count(), "CalcParaWidth: Out of range" );
+ ParaPortion* pPortion = GetParaPortions()[nPara];
+ if ( pPortion && pPortion->IsVisible() )
{
- const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( rPortion.GetNode() );
- sal_Int32 nSpaceBeforeAndMinLabelWidth = GetSpaceBeforeAndMinLabelWidth( rPortion.GetNode() );
+ const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( pPortion->GetNode() );
+ sal_Int32 nSpaceBeforeAndMinLabelWidth = GetSpaceBeforeAndMinLabelWidth( pPortion->GetNode() );
// On the lines of the paragraph ...
- sal_Int32 nLines = rPortion.GetLines().Count();
+ sal_Int32 nLines = pPortion->GetLines().Count();
for ( sal_Int32 nLine = 0; nLine < nLines; nLine++ )
{
- EditLine& rLine = rPortion.GetLines()[nLine];
+ EditLine& 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
@@ -3330,15 +3346,15 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, bool bIgnoreExtraSpace
{
tools::Long nFI = GetXValue( rLRItem.GetTextFirstLineOffset() );
nCurWidth -= nFI;
- if ( rPortion.GetBulletX() > nCurWidth )
+ if ( pPortion->GetBulletX() > nCurWidth )
{
nCurWidth += nFI; // LI?
- if ( rPortion.GetBulletX() > nCurWidth )
- nCurWidth = rPortion.GetBulletX();
+ if ( pPortion->GetBulletX() > nCurWidth )
+ nCurWidth = pPortion->GetBulletX();
}
}
nCurWidth += GetXValue( rLRItem.GetRight() );
- nCurWidth += CalcLineWidth( &rPortion, &rLine, bIgnoreExtraSpace );
+ nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace );
if ( nCurWidth > nMaxWidth )
{
nMaxWidth = nCurWidth;
@@ -3640,21 +3656,22 @@ void ImpEditEngine::UpdateSelections()
{
nPara = GetParaPortions().Count()-1;
}
+ assert(GetParaPortions()[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() )
+ while ( nPara <= nLastPara && !GetParaPortions()[nPara]->IsVisible() )
nPara++;
if ( nPara > nLastPara ) // then also backwards ...
{
nPara = nCurPara;
- while ( nPara && !GetParaPortions()[nPara].IsVisible() )
+ while ( nPara && !GetParaPortions()[nPara]->IsVisible() )
nPara--;
}
- OSL_ENSURE( GetParaPortions()[nPara].IsVisible(), "No visible paragraph found: UpdateSelections" );
+ OSL_ENSURE( GetParaPortions()[nPara]->IsVisible(), "No visible paragraph found: UpdateSelections" );
- ParaPortion& rParaPortion = GetParaPortions()[nPara];
- EditSelection aTmpSelection( EditPaM( rParaPortion.GetNode(), 0 ) );
+ ParaPortion* pParaPortion = GetParaPortions()[nPara];
+ EditSelection aTmpSelection( EditPaM( pParaPortion->GetNode(), 0 ) );
pView->pImpEditView->SetEditSelection( aTmpSelection );
bChanged=true;
break; // for loop
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 215abfac6749..947cfccb49b4 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -356,7 +356,7 @@ bool ImpEditEngine::IsPageOverflow( ) const
void ImpEditEngine::FormatFullDoc()
{
for ( sal_Int32 nPortion = 0; nPortion < GetParaPortions().Count(); nPortion++ )
- GetParaPortions()[nPortion].MarkSelectionInvalid( 0 );
+ GetParaPortions()[nPortion]->MarkSelectionInvalid( 0 );
FormatDoc();
}
@@ -380,20 +380,20 @@ void ImpEditEngine::FormatDoc()
for ( sal_Int32 nPara = 0; nPara < GetParaPortions().Count(); nPara++ )
{
- ParaPortion& rParaPortion = GetParaPortions()[nPara];
- if ( rParaPortion.MustRepaint() || ( rParaPortion.IsInvalid() && rParaPortion.IsVisible() ) )
+ ParaPortion* pParaPortion = GetParaPortions()[nPara];
+ if ( pParaPortion->MustRepaint() || ( pParaPortion->IsInvalid() && pParaPortion->IsVisible() ) )
{
// No formatting should be necessary for MustRepaint()!
- if ( !rParaPortion.IsInvalid() || CreateLines( nPara, nY ) )
+ if ( !pParaPortion->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& rPP = GetParaPortions()[n];
- rPP.MarkSelectionInvalid( 0 );
- rPP.GetLines().Reset();
+ ParaPortion* pPP = GetParaPortions()[n];
+ pPP->MarkSelectionInvalid( 0 );
+ pPP->GetLines().Reset();
}
}
bGrow = true;
@@ -408,12 +408,12 @@ void ImpEditEngine::FormatDoc()
}
}
- rParaPortion.SetMustRepaint( false );
+ pParaPortion->SetMustRepaint( false );
}
aRepaintParas.insert(nPara);
}
- nY += rParaPortion.GetHeight();
+ nY += pParaPortion->GetHeight();
}
aInvalidRect = tools::Rectangle(); // make empty
@@ -521,11 +521,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& rParaPortion = GetParaPortions()[nPara];
+ ParaPortion* pParaPortion = GetParaPortions()[nPara];
SvxAdjust eJustification = GetJustification( nPara );
if ( eJustification != SvxAdjust::Left )
{
- rParaPortion.MarkSelectionInvalid( 0 );
+ pParaPortion->MarkSelectionInvalid( 0 );
CreateLines( nPara, 0 ); // 0: For AutoPageSize no TextRange!
}
}
@@ -597,28 +597,28 @@ tools::Long ImpEditEngine::GetColumnWidth(const Size& rPaperSize) const
bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
{
- ParaPortion& rParaPortion = GetParaPortions()[nPara];
+ ParaPortion* pParaPortion = GetParaPortions()[nPara];
// sal_Bool: Changes in the height of paragraph Yes / No - sal_True/sal_False
- assert( rParaPortion.GetNode() && "Portion without Node in CreateLines" );
- DBG_ASSERT( rParaPortion.IsVisible(), "Invisible paragraphs not formatted!" );
- DBG_ASSERT( rParaPortion.IsInvalid(), "CreateLines: Portion not invalid!" );
+ assert( pParaPortion->GetNode() && "Portion without Node in CreateLines" );
+ DBG_ASSERT( pParaPortion->IsVisible(), "Invisible paragraphs not formatted!" );
+ DBG_ASSERT( pParaPortion->IsInvalid(), "CreateLines: Portion not invalid!" );
- bool bProcessingEmptyLine = ( rParaPortion.GetNode()->Len() == 0 );
- bool bEmptyNodeWithPolygon = ( rParaPortion.GetNode()->Len() == 0 ) && GetTextRanger();
+ bool bProcessingEmptyLine = ( pParaPortion->GetNode()->Len() == 0 );
+ bool bEmptyNodeWithPolygon = ( pParaPortion->GetNode()->Len() == 0 ) && GetTextRanger();
// Fast special treatment for empty paragraphs...
- if ( ( rParaPortion.GetNode()->Len() == 0 ) && !GetTextRanger() )
+ if ( ( pParaPortion->GetNode()->Len() == 0 ) && !GetTextRanger() )
{
// fast special treatment...
- if ( rParaPortion.GetTextPortions().Count() )
- rParaPortion.GetTextPortions().Reset();
- if ( rParaPortion.GetLines().Count() )
- rParaPortion.GetLines().Reset();
- CreateAndInsertEmptyLine( &rParaPortion );
- return FinishCreateLines( &rParaPortion );
+ if ( pParaPortion->GetTextPortions().Count() )
+ pParaPortion->GetTextPortions().Reset();
+ if ( pParaPortion->GetLines().Count() )
+ pParaPortion->GetLines().Reset();
+ CreateAndInsertEmptyLine( pParaPortion );
+ return FinishCreateLines( pParaPortion );
}
@@ -628,16 +628,16 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
// Always format for 100%:
bool bMapChanged = ImpCheckRefMapMode();
- if ( rParaPortion.GetLines().Count() == 0 )
+ if ( pParaPortion->GetLines().Count() == 0 )
{
EditLine* pL = new EditLine;
- rParaPortion.GetLines().Append(pL);
+ pParaPortion->GetLines().Append(pL);
}
// Get Paragraph attributes...
- ContentNode* const pNode = rParaPortion.GetNode();
+ ContentNode* const pNode = pParaPortion->GetNode();
bool bRightToLeftPara = IsRightToLeft( nPara );
@@ -650,30 +650,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 = rParaPortion.GetInvalidDiff();
- const sal_Int32 nInvalidStart = rParaPortion.GetInvalidPosStart();
+ const short nInvalidDiff = pParaPortion->GetInvalidDiff();
+ const sal_Int32 nInvalidStart = pParaPortion->GetInvalidPosStart();
const sal_Int32 nInvalidEnd = nInvalidStart + std::abs( nInvalidDiff );
bool bQuickFormat = false;
if ( !bEmptyNodeWithPolygon && !HasScriptType( nPara, i18n::ScriptType::COMPLEX ) )
{
- if ( ( rParaPortion.IsSimpleInvalid() ) && ( nInvalidDiff > 0 ) &&
+ if ( ( pParaPortion->IsSimpleInvalid() ) && ( nInvalidDiff > 0 ) &&
( pNode->GetString().indexOf( CH_FEATURE, nInvalidStart ) > nInvalidEnd ) )
{
bQuickFormat = true;
}
- else if ( ( rParaPortion.IsSimpleInvalid() ) && ( nInvalidDiff < 0 ) )
+ else if ( ( pParaPortion->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 = rParaPortion.GetTextPortions().Count();
+ sal_Int32 nPortions = pParaPortion->GetTextPortions().Count();
for ( sal_Int32 nTP = 0; nTP < nPortions; nTP++ )
{
// There must be no start / end in the deleted area.
- const TextPortion& rTP = rParaPortion.GetTextPortions()[ nTP ];
+ const TextPortion& rTP = pParaPortion->GetTextPortions()[ nTP ];
nPos = nPos + rTP.GetLen();
if ( ( nPos > nStart ) && ( nPos < nEnd ) )
{
@@ -694,17 +694,17 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
if ( bEmptyNodeWithPolygon )
{
TextPortion* pDummyPortion = new TextPortion( 0 );
- rParaPortion.GetTextPortions().Reset();
- rParaPortion.GetTextPortions().Append(pDummyPortion);
+ pParaPortion->GetTextPortions().Reset();
+ pParaPortion->GetTextPortions().Append(pDummyPortion);
}
else if ( bQuickFormat )
{
// faster Method:
- RecalcTextPortion( &rParaPortion, nInvalidStart, nInvalidDiff );
+ RecalcTextPortion( pParaPortion, nInvalidStart, nInvalidDiff );
}
else // nRealInvalidStart can be before InvalidStart, since Portions were deleted...
{
- CreateTextPortions( &rParaPortion, nRealInvalidStart );
+ CreateTextPortions( pParaPortion, nRealInvalidStart );
}
@@ -712,10 +712,10 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
// Flag the line => do not remove it !
- sal_Int32 nLine = rParaPortion.GetLines().Count()-1;
+ sal_Int32 nLine = pParaPortion->GetLines().Count()-1;
for ( sal_Int32 nL = 0; nL <= nLine; nL++ )
{
- EditLine& rLine = rParaPortion.GetLines()[nL];
+ EditLine& rLine = pParaPortion->GetLines()[nL];
if ( rLine.GetEnd() > nRealInvalidStart ) // not nInvalidStart!
{
nLine = nL;
@@ -725,20 +725,20 @@ 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 && ( !rParaPortion.IsSimpleInvalid() || ( nInvalidEnd < pNode->Len() ) || ( nInvalidDiff <= 0 ) ) )
+ if ( nLine && ( !pParaPortion->IsSimpleInvalid() || ( nInvalidEnd < pNode->Len() ) || ( nInvalidDiff <= 0 ) ) )
nLine--;
- EditLine* pLine = &rParaPortion.GetLines()[nLine];
+ EditLine* pLine = &pParaPortion->GetLines()[nLine];
static tools::Rectangle aZeroArea { Point(), Point() };
tools::Rectangle aBulletArea( aZeroArea );
if ( !nLine )
{
- aBulletArea = GetEditEnginePtr()->GetBulletArea( GetParaPortions().GetPos( &rParaPortion ) );
+ aBulletArea = GetEditEnginePtr()->GetBulletArea( GetParaPortions().GetPos( pParaPortion ) );
if ( !aBulletArea.IsWidthEmpty() && aBulletArea.Right() > 0 )
- rParaPortion.SetBulletX( static_cast<sal_Int32>(GetXValue( aBulletArea.Right() )) );
+ pParaPortion->SetBulletX( static_cast<sal_Int32>(GetXValue( aBulletArea.Right() )) );
else
- rParaPortion.SetBulletX( 0 ); // if Bullet is set incorrectly
+ pParaPortion->SetBulletX( 0 ); // if Bullet is set incorrectly
}
@@ -776,9 +776,9 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
tools::Long nFI = GetXValue( rLRItem.GetTextFirstLineOffset() );
nStartX += nFI;
- if ( !nLine && ( rParaPortion.GetBulletX() > nStartX ) )
+ if ( !nLine && ( pParaPortion->GetBulletX() > nStartX ) )
{
- nStartX = rParaPortion.GetBulletX();
+ nStartX = pParaPortion->GetBulletX();
}
}
@@ -818,7 +818,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
{
GetTextRanger()->SetVertical( IsVertical() );
- tools::Long nTextY = nStartPosY + GetEditCursor( &rParaPortion, 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 );
@@ -896,7 +896,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 = rParaPortion.GetTextPortions().Count();
+ const sal_Int32 nTextPortions = pParaPortion->GetTextPortions().Count();
assert(nTextPortions > 0);
bContinueLastPortion = (nTmpPortion >= nTextPortions);
if (bContinueLastPortion)
@@ -914,17 +914,17 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
}
nPortionStart = nTmpPos;
- pPortion = &rParaPortion.GetTextPortions()[nTmpPortion];
+ pPortion = &pParaPortion->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();
- rParaPortion.GetTextPortions().Remove( nTmpPortion );
+ pParaPortion->GetTextPortions().Remove( nTmpPortion );
if (nTmpPortion && nTmpLen)
{
nTmpPortion--;
- TextPortion& rPrev = rParaPortion.GetTextPortions()[nTmpPortion];
+ TextPortion& rPrev = pParaPortion->GetTextPortions()[nTmpPortion];
DBG_ASSERT( rPrev.GetKind() == PortionKind::TEXT, "Portion?!" );
nTmpWidth -= rPrev.GetSize().Width();
nTmpPos = nTmpPos - rPrev.GetLen();
@@ -932,8 +932,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
rPrev.GetSize().setWidth( -1 );
}
- assert( nTmpPortion < rParaPortion.GetTextPortions().Count() && "No more Portions left!" );
- pPortion = &rParaPortion.GetTextPortions()[nTmpPortion];
+ assert( nTmpPortion < pParaPortion->GetTextPortions().Count() && "No more Portions left!" );
+ pPortion = &pParaPortion->GetTextPortions()[nTmpPortion];
}
if (bContinueLastPortion)
@@ -1147,7 +1147,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
if (bContinueLastPortion)
{
Size aSize( aTmpFont.QuickGetTextSize( GetRefDevice(),
- rParaPortion.GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() ));
+ pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() ));
pPortion->GetSize().AdjustWidth(aSize.Width() );
if (pPortion->GetSize().Height() < aSize.Height())
pPortion->GetSize().setHeight( aSize.Height() );
@@ -1155,7 +1155,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
else
{
pPortion->GetSize() = aTmpFont.QuickGetTextSize( GetRefDevice(),
- rParaPortion.GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() );
+ pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() );
}
// #i9050# Do Kerning also behind portions...
@@ -1204,7 +1204,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& rTP = rParaPortion.GetTextPortions()[n];
+ const TextPortion& rTP = pParaPortion->GetTextPortions()[n];
nWidthAfterTab += rTP.GetSize().Width();
}
tools::Long nW = nWidthAfterTab; // Length before tab position
@@ -1217,13 +1217,13 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
}
else if ( aCurrentTab.aTabStop.GetAdjustment() == SvxTabAdjust::Decimal )
{
- OUString aText = GetSelected( EditSelection( EditPaM( rParaPortion.GetNode(), nTmpPos ),
- EditPaM( rParaPortion.GetNode(), nTmpPos + nPortionLen ) ) );
+ OUString aText = GetSelected( EditSelection( EditPaM( pParaPortion->GetNode(), nTmpPos ),
+ EditPaM( pParaPortion->GetNode(), nTmpPos + nPortionLen ) ) );
sal_Int32 nDecPos = aText.indexOf( aCurrentTab.aTabStop.GetDecimal() );
if ( nDecPos != -1 )
{
- nW -= rParaPortion.GetTextPortions()[nTmpPortion].GetSize().Width();
- nW += aTmpFont.QuickGetTextSize( GetRefDevice(), rParaPortion.GetNode()->GetString(), nTmpPos, nDecPos ).Width();
+ nW -= pParaPortion->GetTextPortions()[nTmpPortion].GetSize().Width();
+ nW += aTmpFont.QuickGetTextSize( GetRefDevice(), pParaPortion->GetNode()->GetString(), nTmpPos, nDecPos ).Width();
aCurrentTab.bValid = false;
}
}
@@ -1237,7 +1237,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
nW = nMaxW;
aCurrentTab.bValid = false;
}
- TextPortion& rTabPortion = rParaPortion.GetTextPortions()[aCurrentTab.nTabPortion];
+ TextPortion& rTabPortion = pParaPortion->GetTextPortions()[aCurrentTab.nTabPortion];
rTabPortion.GetSize().setWidth( aCurrentTab.nTabPos - aCurrentTab.nStartPosX - nW - nStartX );
nTmpWidth = aCurrentTab.nStartPosX + rTabPortion.GetSize().Width() + nWidthAfterTab;
}
@@ -1276,8 +1276,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( &rParaPortion, nTmpPos, pLine );
- nTmpWidth += rParaPortion.GetTextPortions()[nP].GetSize().Width();
+ sal_Int32 nP = SplitTextPortion( pParaPortion, nTmpPos, pLine );
+ nTmpWidth += pParaPortion->GetTextPortions()[nP].GetSize().Width();
}
}
else if ( nTmpWidth >= nXWidth )
@@ -1317,8 +1317,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
bEOL = true;
bEOC = true;
pLine->SetEnd( nPortionEnd );
- assert( rParaPortion.GetTextPortions().Count() && "No TextPortions?" );
- pLine->SetEndPortion( rParaPortion.GetTextPortions().Count() - 1 );
+ assert( pParaPortion->GetTextPortions().Count() && "No TextPortions?" );
+ pLine->SetEndPortion( pParaPortion->GetTextPortions().Count() - 1 );
}
if ( aStatus.OneCharPerLine() )
@@ -1350,7 +1350,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
pNode, pPortion, nPortionStart, pDXArray, 10000, true);
}
if( pPortion )
- ImpBreakLine( &rParaPortion, pLine, pPortion, nPortionStart,
+ ImpBreakLine( pParaPortion, pLine, pPortion, nPortionStart,
nRemainingWidth, bCanHyphenate && bHyphenatePara );
}
@@ -1359,7 +1359,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
// CalcTextSize should be replaced by a continuous registering!
- Size aTextSize = pLine->CalcTextSize( rParaPortion );
+ Size aTextSize = pLine->CalcTextSize( *pParaPortion );
if ( aTextSize.Height() == 0 )
{
@@ -1381,7 +1381,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 = rParaPortion.GetTextPortions()[nP];
+ const TextPortion& rTP = pParaPortion->GetTextPortions()[nP];
// problem with hard font height attribute, when everything but the line break has this attribute
if ( rTP.GetKind() != PortionKind::LINEBREAK )
{
@@ -1473,8 +1473,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
tools::Long nRemainingWidth = nMaxLineWidth - aTextSize.Width();
if ( nRemainingWidth > 0 )
{
- ImplExpandCompressedPortions( pLine, &rParaPortion, nRemainingWidth );
- aTextSize = pLine->CalcTextSize( rParaPortion );
+ ImplExpandCompressedPortions( pLine, pParaPortion, nRemainingWidth );
+ aTextSize = pLine->CalcTextSize( *pParaPortion );
}
}
@@ -1483,7 +1483,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 = rParaPortion.GetTextPortions()[pLine->GetEndPortion()];
+ TextPortion& rTP = pParaPortion->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())
@@ -1518,7 +1518,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( &rParaPortion, pLine, nRemainingSpace );
+ ImpAdjustBlocks( pParaPortion, pLine, nRemainingSpace );
}
break;
default:
@@ -1552,7 +1552,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
}
// for <0 think over !
- if ( rParaPortion.IsSimpleInvalid() )
+ if ( pParaPortion->IsSimpleInvalid() )
{
// Change through simple Text changes...
// Do not cancel formatting since Portions possibly have to be split
@@ -1579,7 +1579,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
if (bQuickFormat)
{
bLineBreak = false;
- rParaPortion.CorrectValuesBehindLastFormattedLine( nLine );
+ pParaPortion->CorrectValuesBehindLastFormattedLine( nLine );
break;
}
}
@@ -1592,7 +1592,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
if ( nEnd == ( aSaveLine.GetEnd() + nInvalidDiff ) )
{
bLineBreak = false;
- rParaPortion.CorrectValuesBehindLastFormattedLine( nLine );
+ pParaPortion->CorrectValuesBehindLastFormattedLine( nLine );
break;
}
}
@@ -1608,8 +1608,8 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
// Next line or maybe a new line...
pLine = nullptr;
- if ( nLine < rParaPortion.GetLines().Count()-1 )
- pLine = &rParaPortion.GetLines()[++nLine];
+ if ( nLine < pParaPortion->GetLines().Count()-1 )
+ pLine = &pParaPortion->GetLines()[++nLine];
if ( pLine && ( nIndex >= pNode->Len() ) )
{
nDelFromLine = nLine;
@@ -1620,16 +1620,16 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
if ( nIndex < pNode->Len() )
{
pLine = new EditLine;
- rParaPortion.GetLines().Insert(++nLine, pLine);
+ pParaPortion->GetLines().Insert(++nLine, 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 );
- rParaPortion.GetTextPortions().Append(pDummyPortion);
+ pParaPortion->GetTextPortions().Append(pDummyPortion);
pLine = new EditLine;
- rParaPortion.GetLines().Insert(++nLine, pLine);
+ pParaPortion->GetLines().Insert(++nLine, pLine);
bForceOneRun = true;
bProcessingEmptyLine = true;
}
@@ -1646,16 +1646,16 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
} // while ( Index < Len )
if ( nDelFromLine >= 0 )
- rParaPortion.GetLines().DeleteFromLine( nDelFromLine );
+ pParaPortion->GetLines().DeleteFromLine( nDelFromLine );
- DBG_ASSERT( rParaPortion.GetLines().Count(), "No line after CreateLines!" );
+ DBG_ASSERT( pParaPortion->GetLines().Count(), "No line after CreateLines!" );
if ( bLineBreak )
- CreateAndInsertEmptyLine( &rParaPortion );
+ CreateAndInsertEmptyLine( pParaPortion );
pBuf.reset();
- bool bHeightChanged = FinishCreateLines( &rParaPortion );
+ bool bHeightChanged = FinishCreateLines( pParaPortion );
if ( bMapChanged )
GetRefDevice()->Pop();
@@ -2597,9 +2597,9 @@ void ImpEditEngine::SetTextRanger( std::unique_ptr<TextRanger> pRanger )
for ( sal_Int32 nPara = 0; nPara < GetParaPortions().Count(); nPara++ )
{
- ParaPortion& rParaPortion = GetParaPortions()[nPara];
- rParaPortion.MarkSelectionInvalid( 0 );
- rParaPortion.GetLines().Reset();
+ ParaPortion* pParaPortion = GetParaPortions()[nPara];
+ pParaPortion->MarkSelectionInvalid( 0 );
+ pParaPortion->GetLines().Reset();
}
FormatFullDoc();
@@ -3106,7 +3106,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()[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
@@ -3135,41 +3135,41 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
for ( sal_Int32 n = 0; n < GetParaPortions().Count(); n++ )
{
- const ParaPortion& rPortion = GetParaPortions()[n];
+ const ParaPortion* const pPortion = GetParaPortions()[n];
+ assert( pPortion && "NULL-Pointer in TokenList in Paint" );
// if when typing idle formatting, asynchronous Paint.
// Invisible Portions may be invalid.
- if ( rPortion.IsVisible() && rPortion.IsInvalid() )
+ if ( pPortion->IsVisible() && pPortion->IsInvalid() )
return;
if ( pPDFExtOutDevData )
pPDFExtOutDevData->BeginStructureElement( vcl::PDFWriter::Paragraph );
- const tools::Long nParaHeight = rPortion.GetHeight();
- if ( rPortion.IsVisible() && (
+ const tools::Long nParaHeight = pPortion->GetHeight();
+ if ( pPortion->IsVisible() && (
( !IsVertical() && ( ( aStartPos.Y() + nParaHeight ) > aClipRect.Top() ) ) ||
( IsVertical() && IsTopToBottom() && ( ( aStartPos.X() - nParaHeight ) < aClipRect.Right() ) ) ||
( IsVertical() && !IsTopToBottom() && ( ( aStartPos.X() + nParaHeight ) > aClipRect.Left() ) ) ) )
-
{
Point aTmpPos;
// Over the lines of the paragraph...
- const sal_Int32 nLines = rPortion.GetLines().Count();
+ const sal_Int32 nLines = pPortion->GetLines().Count();
const sal_Int32 nLastLine = nLines-1;
bool bEndOfParagraphWritten(false);
- adjustYDirectionAware(aStartPos, rPortion.GetFirstLineOffset());
+ adjustYDirectionAware(aStartPos, pPortion->GetFirstLineOffset());
- const SvxLineSpacingItem& rLSItem = rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL );
+ const SvxLineSpacingItem& rLSItem = pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL );
sal_uInt16 nSBL = ( rLSItem.GetInterLineSpaceRule() == SvxInterLineSpaceRule::Fix )
? GetYValue( rLSItem.GetInterLineSpace() ) : 0;
bool bPaintBullet (false);
for ( sal_Int32 nLine = 0; nLine < nLines; nLine++ )
{
- const EditLine* const pLine = &rPortion.GetLines()[nLine];
+ const EditLine* const pLine = &pPortion->GetLines()[nLine];
assert( pLine && "NULL-Pointer in the line iterator in UpdateViews" );
sal_Int32 nIndex = pLine->GetStart();
tools::Long nLineHeight = pLine->GetHeight();
@@ -3209,10 +3209,10 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
for ( sal_Int32 nPortion = pLine->GetStartPortion(); nPortion <= pLine->GetEndPortion(); nPortion++ )
{
- DBG_ASSERT( rPortion.GetTextPortions().Count(), "Line without Textportion in Paint!" );
- const TextPortion& rTextPortion = rPortion.GetTextPortions()[nPortion];
+ DBG_ASSERT( pPortion->GetTextPortions().Count(), "Line without Textportion in Paint!" );
+ const TextPortion& rTextPortion = pPortion->GetTextPortions()[nPortion];
- const tools::Long nPortionXOffset = GetPortionXOffset( &rPortion, pLine, nPortion );
+ const tools::Long nPortionXOffset = GetPortionXOffset( pPortion, pLine, nPortion );
setXDirectionAwareFrom(aTmpPos, aStartPos);
adjustXDirectionAware(aTmpPos, nPortionXOffset);
if (isXOverflowDirectionAware(aTmpPos, aClipRect))
@@ -3224,7 +3224,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
case PortionKind::FIELD:
case PortionKind::HYPHENATOR:
{
- SeekCursor( rPortion.GetNode(), nIndex+1, aTmpFont, &rOutDev );
+ SeekCursor( pPortion->GetNode(), nIndex+1, aTmpFont, &rOutDev );
bool bDrawFrame = false;
@@ -3272,7 +3272,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
if ( rTextPortion.GetKind() == PortionKind::TEXT )
{
- aText = rPortion.GetNode()->GetString();
+ aText = pPortion->GetNode()->GetString();
nTextStart = nIndex;
nTextLen = rTextPortion.GetLen();
pDXArray = pLine->GetCharPosArray().data() + (nIndex - pLine->GetStart());
@@ -3350,7 +3350,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
}
else if ( rTextPortion.GetKind() == PortionKind::FIELD )
{
- const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex);
+ const EditCharAttrib* pAttr = pPortion->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();
@@ -3446,7 +3446,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
if(GetStatus().DoOnlineSpelling() && rTextPortion.GetLen())
{
- WrongList* pWrongs = rPortion.GetNode()->GetWrongList();
+ WrongList* pWrongs = pPortion->GetNode()->GetWrongList();
if(pWrongs && !pWrongs->empty())
{
@@ -3493,7 +3493,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
if(PortionKind::FIELD == rTextPortion.GetKind())
{
- const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex);
+ const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex);
const SvxFieldItem* pFieldItem = dynamic_cast<const SvxFieldItem*>(pAttr->GetItem());
if(pFieldItem)
@@ -3505,7 +3505,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(rPortion.GetNode(), nIndex + 1)));
+ const lang::Locale aLocale(GetLocale(EditPaM(pPortion->GetNode(), nIndex + 1)));
// create EOL and EOP bools
const bool bEndOfLine(nPortion == pLine->GetEndPortion());
@@ -3572,20 +3572,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 = rPortion.GetNode()->GetCharAttribs().FindAttrib( EE_CHAR_ESCAPEMENT, nIndex );
+ EditCharAttrib* pPrev = pPortion->GetNode()->GetCharAttribs().FindAttrib( EE_CHAR_ESCAPEMENT, nIndex );
if ( pPrev )
{
SvxFont aDummy;
// Underscore in front?
if ( pPrev->GetStart() )
{
- SeekCursor( rPortion.GetNode(), pPrev->GetStart(), aDummy );
+ SeekCursor( pPortion->GetNode(), pPrev->GetStart(), aDummy );
if ( aDummy.GetUnderline() != LINESTYLE_NONE )
bSpecialUnderline = true;
}
- if ( !bSpecialUnderline && ( pPrev->GetEnd() < rPortion.GetNode()->Len() ) )
+ if ( !bSpecialUnderline && ( pPrev->GetEnd() < pPortion->GetNode()->Len() ) )
{
- SeekCursor( rPortion.GetNode(), pPrev->GetEnd()+1, aDummy );
+ SeekCursor( pPortion->GetNode(), pPrev->GetEnd()+1, aDummy );
if ( aDummy.GetUnderline() != LINESTYLE_NONE )
bSpecialUnderline = true;
}
@@ -3645,7 +3645,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
{
if ( rTextPortion.GetKind() == PortionKind::FIELD )
{
- const EditCharAttrib* pAttr = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex);
+ const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex);
const SvxFieldItem* pFieldItem = dynamic_cast<const SvxFieldItem*>(pAttr->GetItem());
if( pFieldItem )
{
@@ -3667,7 +3667,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
}
}
- const WrongList* const pWrongList = rPortion.GetNode()->GetWrongList();
+ const WrongList* const pWrongList = pPortion->GetNode()->GetWrongList();
if ( GetStatus().DoOnlineSpelling() && pWrongList && !pWrongList->empty() && rTextPortion.GetLen() )
{
{//#105750# adjust LinePos for superscript or subscript text
@@ -3680,7 +3680,7 @@ 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, rPortion.GetNode()->GetWrongList(), nOrientation, aOrigin, IsVertical(), rTextPortion.IsRightToLeft() );
+ 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, IsVertical(), rTextPortion.IsRightToLeft() );
rOutDev.SetLineColor( aOldColor );
}
}
@@ -3694,7 +3694,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 = rPortion.GetNode()->GetCharAttribs().FindFeature(nIndex);
+ const EditCharAttrib* pAttr = pPortion->GetNode()->GetCharAttribs().FindFeature(nIndex);
assert( pAttr && "Field not found" );
const SvxFieldItem* pFieldItem = dynamic_cast<const SvxFieldItem*>(pAttr->GetItem());
@@ -3716,7 +3716,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
{
if ( rTextPortion.GetExtraValue() && ( rTextPortion.GetExtraValue() != ' ' ) )
{
- SeekCursor( rPortion.GetNode(), nIndex+1, aTmpFont, &rOutDev );
+ SeekCursor( pPortion->GetNode(), nIndex+1, aTmpFont, &rOutDev );
aTmpFont.SetTransparent( false );
aTmpFont.SetEscapement( 0 );
aTmpFont.SetPhysFont(rOutDev);
@@ -3799,7 +3799,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, tools::Rectangle aClipRect, Po
if ( !aStatus.IsOutliner() )
{
- const SvxULSpaceItem& rULItem = rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE );
+ const SvxULSpaceItem& rULItem = pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE );
tools::Long nUL = GetYValue( rULItem.GetLower() );
adjustYDirectionAware(aStartPos, nUL);
}
@@ -3896,7 +3896,7 @@ void ImpEditEngine::InsertContent( ContentNode* pNode, sal_Int32 nPos )
{
DBG_ASSERT( pNode, "NULL-Pointer in InsertContent! " );
DBG_ASSERT( IsInUndo(), "InsertContent only for Undo()!" );
- GetParaPortions().Insert(nPos, ParaPortion( pNode ));
+ GetParaPortions().Insert(nPos, std::make_unique<ParaPortion>( pNode ));
aEditDoc.Insert(nPos, pNode);
if ( IsCallParaInsertedOrDeleted() )
GetEditEnginePtr()->ParagraphInserted( nPos );
@@ -4032,18 +4032,18 @@ 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 )
{
- ParaPortion& rTmpPortion = GetParaPortions()[nFirstInvPara-1];
- rTmpPortion.MarkInvalid( rTmpPortion.GetNode()->Len(), 0 );
- rTmpPortion.ResetHeight();
+ pTmpPortion = GetParaPortions()[nFirstInvPara-1];
+ pTmpPortion->MarkInvalid( pTmpPortion->GetNode()->Len(), 0 );
}
else
{
- ParaPortion& rTmpPortion = GetParaPortions()[0];
- rTmpPortion.MarkSelectionInvalid( 0 );
- rTmpPortion.ResetHeight();
+ pTmpPortion = GetParaPortions()[0];
+ pTmpPortion->MarkSelectionInvalid( 0 );
}
+ pTmpPortion->ResetHeight();
}
IMPL_LINK_NOARG(ImpEditEngine, StatusTimerHdl, Timer *, void)
@@ -4066,17 +4066,19 @@ void ImpEditEngine::CallStatusHdl()
ContentNode* ImpEditEngine::GetPrevVisNode( ContentNode const * pCurNode )
{
- const ParaPortion& rPortion1 = FindParaPortion( pCurNode );
- const ParaPortion* pPortion2 = GetPrevVisPortion( &rPortion1 );
- if ( pPortion2 )
- return pPortion2->GetNode();
+ const ParaPortion* pPortion = FindParaPortion( pCurNode );
+ DBG_ASSERT( pPortion, "GetPrevVisibleNode: No matching portion!" );
+ pPortion = GetPrevVisPortion( pPortion );
+ if ( pPortion )
+ return pPortion->GetNode();
return nullptr;
}
ContentNode* ImpEditEngine::GetNextVisNode( ContentNode const * pCurNode )
{
- const ParaPortion& rPortion = FindParaPortion( pCurNode );
- const ParaPortion* pPortion = GetNextVisPortion( &rPortion );
+ const ParaPortion* pPortion = FindParaPortion( pCurNode );
+ DBG_ASSERT( pPortion, "GetNextVisibleNode: No matching portion!" );
+ pPortion = GetNextVisPortion( pPortion );
if ( pPortion )
return pPortion->GetNode();
return nullptr;
@@ -4085,9 +4087,10 @@ ContentNode* ImpEditEngine::GetNextVisNode( ContentNode const * pCurNode )
const ParaPortion* ImpEditEngine::GetPrevVisPortion( const ParaPortion* pCurPortion ) const
{
sal_Int32 nPara = GetParaPortions().GetPos( pCurPortion );
- const ParaPortion* pPortion = nPara ? &GetParaPortions()[--nPara] : nullptr;
+ 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;
+ pPortion = nPara ? GetParaPortions()[--nPara] : nullptr;
return pPortion;
}
@@ -4116,7 +4119,7 @@ tools::Long ImpEditEngine::CalcVertLineSpacing(Point& rStartPos) const
// All paragraphs must have the block justification set.
return 0;
- const ParaPortion* pPortion = &rParaPortions[i];
+ const ParaPortion* pPortion = rParaPortions[i];
nTotalOccupiedHeight += pPortion->GetFirstLineOffset();
const SvxLineSpacingItem& rLSItem = pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL);
@@ -4194,7 +4197,7 @@ void ImpEditEngine::FormatAndUpdate( EditView* pCurView, bool bCalledFromUndo )
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 );
+ GetParaPortions()[nPortion]->MarkInvalid( 0, 0 );
FormatDoc();
UpdateViews( pCurView );
}
@@ -4611,8 +4614,8 @@ void ImpEditEngine::ImplUpdateOverflowingParaNum(tools::Long nPaperHeight)
tools::Long nPH;
for ( sal_Int32 nPara = 0; nPara < GetParaPortions().Count(); nPara++ ) {
- ParaPortion& rPara = GetParaPortions()[nPara];
- nPH = rPara.GetHeight();
+ ParaPortion* pPara = GetParaPortions()[nPara];
+ nPH = pPara->GetHeight();
nY += nPH;
if ( nY > nPaperHeight /*nCurTextHeight*/ ) // found first paragraph overflowing
{
@@ -4631,13 +4634,13 @@ void ImpEditEngine::ImplUpdateOverflowingLineNum(tools::Long nPaperHeight,
tools::Long nY = nHeightBeforeOverflowingPara;
tools::Long nLH;
- ParaPortion& rPara = GetParaPortions()[nOverflowingPara];
+ ParaPortion *pPara = GetParaPortions()[nOverflowingPara];
// Like UpdateOverflowingParaNum but for each line in the first
// overflowing paragraph.
- for ( sal_Int32 nLine = 0; nLine < rPara.GetLines().Count(); nLine++ ) {
+ for ( sal_Int32 nLine = 0; nLine < pPara->GetLines().Count(); nLine++ ) {
// XXX: We must use a reference here because the copy constructor resets the height
- EditLine &aLine = rPara.GetLines()[nLine];
+ EditLine &aLine = pPara->GetLines()[nLine];
nLH = aLine.GetHeight();
nY += nLH;
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index ee199b663855..05b4b6485329 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -548,20 +548,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();
@@ -579,14 +580,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();
@@ -1021,8 +1022,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;
@@ -1098,39 +1099,39 @@ std::unique_ptr<EditTextObject> ImpEditEngine::CreateTextObject( EditSelection a
pTxtObj->mpImpl->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
}
}
@@ -1212,8 +1213,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;
@@ -1261,7 +1263,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
@@ -1291,40 +1293,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().Insert(_n, pNew);
+ pParaPortion->GetTextPortions().Insert(_n, 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().Insert(m, pNew);
+ pParaPortion->GetLines().Insert(m, 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() ), "InsertBinTextObject: 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() ), "InsertBinTextObject: ParaPortion not completely formatted!" );
#endif
}
}
@@ -2942,8 +2945,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 );
}
}
}
diff --git a/editeng/source/editeng/impedit5.cxx b/editeng/source/editeng/impedit5.cxx
index d1846f1df880..aaf23374308e 100644
--- a/editeng/source/editeng/impedit5.cxx
+++ b/editeng/source/editeng/impedit5.cxx
@@ -521,7 +521,7 @@ void ImpEditEngine::SetAttribs( EditSelection aSel, const SfxItemSet& rSet, SetA
DBG_ASSERT( GetParaPortions().SafeGetObject( nNode ), "Portion not found: SetAttribs" );
ContentNode* pNode = aEditDoc.GetObject( nNode );
- ParaPortion& rPortion = GetParaPortions()[nNode];
+ ParaPortion* pPortion = GetParaPortions()[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!
@@ -563,14 +563,14 @@ void ImpEditEngine::SetAttribs( EditSelection aSel, const SfxItemSet& rSet, SetA
if ( bParaAttribFound )
{
- ParaAttribsChanged( rPortion.GetNode() );
+ ParaAttribsChanged( pPortion->GetNode() );
}
else if ( bCharAttribFound )
{
bFormatted = false;
if ( !pNode->Len() || ( nStartPos != nEndPos ) )
{
- rPortion.MarkSelectionInvalid( nStartPos );
+ pPortion->MarkSelectionInvalid( nStartPos );
if ( bCheckLanguage )
pNode->GetWrongList()->SetInvalidRange(nStartPos, nEndPos);
}
@@ -601,7 +601,7 @@ void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, EERemoveParaAttribsMo
for ( sal_Int32 nNode = nStartNode; nNode <= nEndNode; nNode++ )
{
ContentNode* pNode = aEditDoc.GetObject( nNode );
- ParaPortion& rPortion = GetParaPortions()[nNode];
+ ParaPortion* pPortion = GetParaPortions()[nNode];
DBG_ASSERT( aEditDoc.GetObject( nNode ), "Node not found: SetAttribs" );
DBG_ASSERT( GetParaPortions().SafeGetObject( nNode ), "Portion not found: SetAttribs" );
@@ -635,7 +635,7 @@ void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, EERemoveParaAttribsMo
if ( bChanged && !bRemoveParaAttribs )
{
bFormatted = false;
- rPortion.MarkSelectionInvalid( nStartPos );
+ pPortion->MarkSelectionInvalid( nStartPos );
}
}
}