[Libreoffice-commits] core.git: sw/source

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Mon May 6 15:50:04 UTC 2019


 sw/source/core/text/frmform.cxx |    9 ++++++++-
 sw/source/core/text/txtfrm.cxx  |    2 +-
 2 files changed, 9 insertions(+), 2 deletions(-)

New commits:
commit 1caea03fcc6c24e38b2d1d9f6097ad84183ffefd
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon May 6 15:40:41 2019 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon May 6 17:48:54 2019 +0200

    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 at cib.de>

diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx
index db81c7aca3e7..3b484176ab8e 100644
--- a/sw/source/core/text/frmform.cxx
+++ b/sw/source/core/text/frmform.cxx
@@ -226,7 +226,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 37c1c406d365..b531bd749742 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -2631,6 +2631,7 @@ void SwTextFrame::PrepWidows( const sal_uInt16 nNeed, bool bNotify )
     SwParaPortion *pPara = GetPara();
     if ( !pPara )
         return;
+    pPara->SetPrepWidows();
 
     sal_uInt16 nHave = nNeed;
 
@@ -2662,7 +2663,6 @@ void SwTextFrame::PrepWidows( const sal_uInt16 nNeed, bool bNotify )
 
         if( bSplit )
         {
-            pPara->SetPrepWidows();
             GetFollow()->SetOfst( aLine.GetEnd() );
             aLine.TruncLines( true );
             if( pPara->IsFollowField() )


More information about the Libreoffice-commits mailing list