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

Manfred Blume manfred.blume at cib.de
Thu Dec 21 23:21:02 UTC 2017


 sw/qa/extras/uiwriter/data/fdo114306.odt |binary
 sw/qa/extras/uiwriter/uiwriter.cxx       |   15 +++++++++++++++
 sw/source/core/layout/findfrm.cxx        |    8 +++++++-
 sw/source/core/layout/flowfrm.cxx        |    9 +++++++--
 4 files changed, 29 insertions(+), 3 deletions(-)

New commits:
commit 18765b9fa739337d2d891513f6e2fb7c3ce23b50
Author: Manfred Blume <manfred.blume at cib.de>
Date:   Fri Dec 8 15:01:51 2017 +0100

    tdf#114306 fix unexpected page break in row-spanned table
    
    If a para gets moved off to another page, it never gets
    moved back. Make IsMoveable() more symmetric, add condition
    to MoveBwd to also claim table content back.
    
    Change-Id: I5366eb824f0ef7016599c777786cbdf42f65b9b5
    Reviewed-on: https://gerrit.libreoffice.org/46021
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/qa/extras/uiwriter/data/fdo114306.odt b/sw/qa/extras/uiwriter/data/fdo114306.odt
new file mode 100755
index 000000000000..5a7d2f9ca864
Binary files /dev/null and b/sw/qa/extras/uiwriter/data/fdo114306.odt differ
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 6d6469c376d4..256b3ea8077c 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -289,6 +289,7 @@ public:
     void testTdf99689TableOfTables();
     void testTdf113790();
     void testTdf108048();
+    void testTdf114306();
 
     CPPUNIT_TEST_SUITE(SwUiWriterTest);
     CPPUNIT_TEST(testReplaceForward);
@@ -458,6 +459,7 @@ public:
     CPPUNIT_TEST(testTdf99689TableOfTables);
     CPPUNIT_TEST(testTdf113790);
     CPPUNIT_TEST(testTdf108048);
+    CPPUNIT_TEST(testTdf114306);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -5243,6 +5245,19 @@ void SwUiWriterTest::testTdf112025()
     CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStyle, "IsLandscape"));
 }
 
+void SwUiWriterTest::testTdf114306()
+{
+    load(DATA_DIRECTORY, "fdo114306.odt");
+    xmlDocPtr pXmlDoc = parseLayoutDump();
+
+    // There are 2 long paragraphs in cell A1.
+    // A part of paragraph 2 should flow over to the second page but
+    // *not* the whole paragraph. There should be 2 paragraphs on
+    // page 1 and 1 paragraph on page 2.
+    assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt", 2);
+    assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt", 1);
+}
+
 void SwUiWriterTest::testTdf108524()
 {
     createDoc("tdf108524.odt");
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx
index 73d4a86c0bce..494920dc6281 100644
--- a/sw/source/core/layout/findfrm.cxx
+++ b/sw/source/core/layout/findfrm.cxx
@@ -1303,8 +1303,14 @@ bool SwFrame::IsMoveable( const SwLayoutFrame* _pLayoutFrame ) const
                   _pLayoutFrame->IsInDocBody() ||
                   _pLayoutFrame->IsInFootnote() )
         {
+            // If IsMovable() is called before a MoveFwd() the method
+            // may return false if there is no NextCellLeaf. If
+            // IsMovable() is called before a MoveBwd() the method may
+            // return false if there is no PrevCellLeaf.
             if ( _pLayoutFrame->IsInTab() && !IsTabFrame() &&
-                 ( !IsContentFrame() || !const_cast<SwFrame*>(this)->GetNextCellLeaf() ) )
+                 ( !IsContentFrame() || (!const_cast<SwFrame*>(this)->GetNextCellLeaf()
+                                      && !const_cast<SwFrame*>(this)->GetPrevCellLeaf()) )
+                )
             {
                 bRetVal = false;
             }
diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx
index 83043c78278f..78b78e61b8e9 100644
--- a/sw/source/core/layout/flowfrm.cxx
+++ b/sw/source/core/layout/flowfrm.cxx
@@ -2021,14 +2021,19 @@ bool SwFlowFrame::MoveBwd( bool &rbReformat )
         const SwLayoutFrame* pUpperFrame = m_rThis.GetUpper();
         while ( pUpperFrame )
         {
-            if ( pUpperFrame->IsTabFrame() )
+            if ( pUpperFrame->IsTabFrame() || pUpperFrame->IsRowFrame() )
             {
                 return false;
             }
             // If the text frame is a follow-section-in-table, that can move
             // backward as well.
             bool bIsFollowSection = pUpperFrame->IsSctFrame() && static_cast<const SwSectionFrame*>(pUpperFrame)->GetPrecede();
-            if ( ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) || bIsFollowSection )
+
+            // If the text frame is a follow-in-table, that can move
+            // backward as well.
+            bool bIsFollow = const_cast<SwLayoutFrame*>(pUpperFrame)->GetPrevCellLeaf();
+
+            if ( ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) || bIsFollowSection || bIsFollow )
             {
                 break;
             }


More information about the Libreoffice-commits mailing list