diff options
-rw-r--r-- | sw/qa/extras/uiwriter/data/tables-move-backwards.odt | bin | 0 -> 9578 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter.cxx | 26 | ||||
-rw-r--r-- | sw/source/core/layout/layact.cxx | 13 |
3 files changed, 38 insertions, 1 deletions
diff --git a/sw/qa/extras/uiwriter/data/tables-move-backwards.odt b/sw/qa/extras/uiwriter/data/tables-move-backwards.odt Binary files differnew file mode 100644 index 000000000000..861dc4f4ad86 --- /dev/null +++ b/sw/qa/extras/uiwriter/data/tables-move-backwards.odt diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 735ab11d4518..6dee000e182f 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -281,6 +281,7 @@ public: void testTdf116789(); void testTdf117225(); void testOleSaveWhileEdit(); + void testTablesMoveBackwards(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); @@ -423,6 +424,7 @@ public: CPPUNIT_TEST(testTdf116789); CPPUNIT_TEST(testTdf117225); CPPUNIT_TEST(testOleSaveWhileEdit); + CPPUNIT_TEST(testTablesMoveBackwards); CPPUNIT_TEST_SUITE_END(); private: @@ -5121,6 +5123,30 @@ void SwUiWriterTest::testOleSaveWhileEdit() comphelper::LibreOfficeKit::setActive(false); } +void SwUiWriterTest::testTablesMoveBackwards() +{ + // Load a document with 1 pages: empty content on first page, then 21 tables on the second page. + load(DATA_DIRECTORY, "tables-move-backwards.odt"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + SwDocShell* pDocShell = pTextDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + + // Delete the content on the first page. + pWrtShell->SttEndDoc(/*bStart=*/true); + pWrtShell->EndPg(/*bSelect=*/true); + pWrtShell->DelLeft(); + + // Calc the layout and check the number of pages. + pWrtShell->CalcLayout(); + xmlDocPtr pLayout = parseLayoutDump(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // i.e. there was an unexpected 2nd page, as only 20 out of 21 tables were moved to the first + // page. + assertXPath(pLayout, "//page", 1); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx index db136d963873..fff8e10ea4cc 100644 --- a/sw/source/core/layout/layact.cxx +++ b/sw/source/core/layout/layact.cxx @@ -1365,10 +1365,17 @@ bool SwLayAction::FormatLayout( OutputDevice *pRenderContext, SwLayoutFrame *pLa bool bTabChanged = false; while ( pLow && pLow->GetUpper() == pLay ) { + SwFrame* pNext = nullptr; if ( pLow->IsLayoutFrame() ) { if ( pLow->IsTabFrame() ) + { + // Remember what was the next of the lower. Formatting may move it to the previous + // page, in which case it looses its next. + pNext = pLow->GetNext(); + bTabChanged |= FormatLayoutTab( static_cast<SwTabFrame*>(pLow), bAddRect ); + } // Skip the ones already registered for deletion else if( !pLow->IsSctFrame() || static_cast<SwSectionFrame*>(pLow)->GetSection() ) bChanged |= FormatLayout( pRenderContext, static_cast<SwLayoutFrame*>(pLow), bAddRect ); @@ -1380,7 +1387,11 @@ bool SwLayAction::FormatLayout( OutputDevice *pRenderContext, SwLayoutFrame *pLa if ( IsAgain() ) return false; - pLow = pLow->GetNext(); + if (!pNext) + { + pNext = pLow->GetNext(); + } + pLow = pNext; } // add complete frame area as paint area, if frame // area has been already added and after formatting its lowers the frame area |