sw/qa/extras/uiwriter/data/fdo114306.odt |binary sw/qa/extras/uiwriter/uiwriter.cxx | 28 ++++++++++++++++++++++++++++ sw/source/core/layout/findfrm.cxx | 27 ++++++++++++++++++++++++++- sw/source/core/layout/flowfrm.cxx | 8 ++++++-- 4 files changed, 60 insertions(+), 3 deletions(-)
New commits: commit 58074678a9a6608a745acef6e61b81ede09cd180 Author: Manfred Blume <manfred.bl...@cib.de> Date: Thu Dec 21 21:10:03 2017 +0100 tdf#114306 fix Unexpected page break in long table Cherry-picked from 18765b9fa739337d2d891513f6e2fb7c3ce23b50 Change-Id: I9a89bb29a1d745c0bc3c46966a60c2f9a484bdd8 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 766ab7199419..afdd8aee20dc 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -206,6 +206,7 @@ public: void testTdf104814(); void testTdf105417(); void testTdf112025(); + void testTdf114306(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); @@ -311,6 +312,7 @@ public: CPPUNIT_TEST(testTdf104814); CPPUNIT_TEST(testTdf105417); CPPUNIT_TEST(testTdf112025); + CPPUNIT_TEST(testTdf114306); CPPUNIT_TEST_SUITE_END(); private: @@ -3784,6 +3786,32 @@ void SwUiWriterTest::testTdf112025() CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStyle, "IsLandscape")); } +void SwUiWriterTest::testTdf114306() +{ + load(DATA_DIRECTORY, "fdo114306.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + xmlDocPtr pXmlDoc = parseLayoutDump(); + xmlXPathObjectPtr pXmlObj; + xmlNodeSetPtr pXmlNodes; + int numberOfNodes = 0; + + // 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. + pXmlObj = getXPathNode(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt"); + pXmlNodes = pXmlObj->nodesetval; + numberOfNodes = xmlXPathNodeSetGetLength(pXmlNodes); + CPPUNIT_ASSERT_EQUAL(2, numberOfNodes); + xmlXPathFreeObject(pXmlObj); + + pXmlObj = getXPathNode(pXmlDoc, "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt"); + pXmlNodes = pXmlObj->nodesetval; + numberOfNodes = xmlXPathNodeSetGetLength(pXmlNodes); + CPPUNIT_ASSERT_EQUAL(1, numberOfNodes); + xmlXPathFreeObject(pXmlObj); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx index bac984ba36dc..c33571aaf047 100644 --- a/sw/source/core/layout/findfrm.cxx +++ b/sw/source/core/layout/findfrm.cxx @@ -1298,8 +1298,33 @@ bool SwFrame::IsMoveable( const SwLayoutFrame* _pLayoutFrame ) const _pLayoutFrame->IsInDocBody() || _pLayoutFrame->IsInFootnote() ) { + /* + https://bugs.documentfoundation.org/show_bug.cgi?id=114306 + This method is mostly used like: + + if (<other conditions> && IsMoveable()) + { + ... + SwFlowFrame::MoveFwd() + } + + or + + if (<other conditions> && IsMoveable()) + { + ... + SwFlowFrame::MoveBwd() + } + + 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. + + The patch should make IsMoveable() more symmetric. + */ if ( _pLayoutFrame->IsInTab() && !IsTabFrame() && - ( !IsContentFrame() || !const_cast<SwFrame*>(this)->GetNextCellLeaf( MAKEPAGE_NONE ) ) ) + ( !IsContentFrame() || (!const_cast<SwFrame*>(this)->GetNextCellLeaf( MAKEPAGE_NONE ) + && !const_cast<SwFrame*>(this)->GetPrevCellLeaf( MAKEPAGE_NONE )) ) + ) { bRetVal = false; } diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 02bed5f77dfa..779ec657ccda 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -2006,11 +2006,15 @@ bool SwFlowFrame::MoveBwd( bool &rbReformat ) const SwLayoutFrame* pUpperFrame = m_rThis.GetUpper(); while ( pUpperFrame ) { - if ( pUpperFrame->IsTabFrame() ) + if ( pUpperFrame->IsTabFrame() || pUpperFrame->IsRowFrame() ) { return false; } - if ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) + + // 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() ) || bIsFollow ) { break; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits