summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2019-05-06 15:40:41 +0200
committerMiklos Vajna <vmiklos@collabora.com>2019-05-09 13:19:57 +0200
commit880fa5382c0249f09584a9a7af498cecaa75a08c (patch)
treeac3be10724e499e834d653716a74bcf02ac1c9af
parent62d1222fde5adff3949e4ea5a593f3aff6fe8631 (diff)
tdf#122892 tdf#124366 sw: fix loop in SwTextFrame::CalcFollow()
... differently; commit b7d4418c309c8bc4fd25485dd3a0ea6ad9edf34e was partially wrong because if SetPrepWidows() isn't called and the master and follow have fewer lines than the sum of orphans and widows, then the frames must be merged, i.e., master must move forward to the next page and follow must be deleted, but that only happens with SetPrepWidows(). However if the SwTextFrame::PrepWidows() determines that no lines can be moved from the master, SwTextFrame::CalcPreps() will grow the master to force it to move to the next page, and then it sets SetWidow() too, so check this flag to break the loop in SwTextFrame::CalcFollow(). Another question is what is the point of the "very cheesy" follow formatting fall-back, which might be removable. Change-Id: I0769a5a4f13ca4c95c2229a496207809d05576f9 Reviewed-on: https://gerrit.libreoffice.org/71866 Tested-by: Jenkins Reviewed-by: Michael Stahl <Michael.Stahl@cib.de> (cherry picked from commit 1caea03fcc6c24e38b2d1d9f6097ad84183ffefd) Reviewed-on: https://gerrit.libreoffice.org/71882 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Reviewed-by: Xisco Faulí <xiscofauli@libreoffice.org> Tested-by: Xisco Faulí <xiscofauli@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--sw/source/core/text/frmform.cxx9
-rw-r--r--sw/source/core/text/txtfrm.cxx2
2 files changed, 9 insertions, 2 deletions
diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx
index 157a338bda34..dad1b9a47109 100644
--- a/sw/source/core/text/frmform.cxx
+++ b/sw/source/core/text/frmform.cxx
@@ -238,7 +238,14 @@ bool SwTextFrame::CalcFollow(TextFrameIndex const nTextOfst)
if ( !pMyFollow->GetNext() && !pMyFollow->HasFootnote() )
nOldBottom = aRectFnSet.IsVert() ? 0 : LONG_MAX;
- while( true )
+ // tdf#122892 check flag:
+ // 1. WidowsAndOrphans::FindWidows() determines follow is a widow
+ // 2. SwTextFrame::PrepWidows() calls SetPrepWidows() on master;
+ // if it can spare lines, master truncates one line
+ // 3. SwTextFrame::CalcPreps() on master (below);
+ // unless IsPrepMustFit(), if master hasn't shrunk via 2., it will SetWidow()
+ // 4. loop must exit then, because the follow didn't grow so nothing will ever change
+ while (!IsWidow())
{
if( !FormatLevel::LastLevel() )
{
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index 99981405d297..d5a71ed936a7 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -2567,6 +2567,7 @@ void SwTextFrame::PrepWidows( const sal_uInt16 nNeed, bool bNotify )
SwParaPortion *pPara = GetPara();
if ( !pPara )
return;
+ pPara->SetPrepWidows();
sal_uInt16 nHave = nNeed;
@@ -2598,7 +2599,6 @@ void SwTextFrame::PrepWidows( const sal_uInt16 nNeed, bool bNotify )
if( bSplit )
{
- pPara->SetPrepWidows();
GetFollow()->SetOfst( aLine.GetEnd() );
aLine.TruncLines( true );
if( pPara->IsFollowField() )