diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-01-07 12:30:23 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-01-07 15:13:04 +0100 |
commit | 6d8da2b2deb4be2182ca1852cec7eb38a4c654eb (patch) | |
tree | 9e03e6275cc741e81aa0043460656b3a15ec3882 /sw | |
parent | e035b03a91324c7856577c64bcb715a1f36f6c8b (diff) |
tdf#96943 sw Hide Whitespace: don't create pages for widow / orphan ...
... paragraphs that would otherwise fit nominal size of the page frame
Change-Id: I90c3de9150b17c951e1ac4158babb7a71afee9ee
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/uiwriter/data/tdf96943.odt | bin | 0 -> 8797 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter.cxx | 19 | ||||
-rw-r--r-- | sw/source/core/text/widorp.cxx | 22 |
3 files changed, 40 insertions, 1 deletions
diff --git a/sw/qa/extras/uiwriter/data/tdf96943.odt b/sw/qa/extras/uiwriter/data/tdf96943.odt Binary files differnew file mode 100644 index 000000000000..1ee5b9f91ce7 --- /dev/null +++ b/sw/qa/extras/uiwriter/data/tdf96943.odt diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index af882f1ae9d0..b001d0444c02 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -177,6 +177,7 @@ public: void testTdf77014(); void testTdf92648(); void testTdf96515(); + void testTdf96943(); void testTdf96536(); void testTdf96479(); @@ -262,6 +263,7 @@ public: CPPUNIT_TEST(testTdf77014); CPPUNIT_TEST(testTdf92648); CPPUNIT_TEST(testTdf96515); + CPPUNIT_TEST(testTdf96943); CPPUNIT_TEST(testTdf96536); CPPUNIT_TEST(testTdf96479); CPPUNIT_TEST_SUITE_END(); @@ -2945,6 +2947,23 @@ void SwUiWriterTest::testTdf96515() CPPUNIT_ASSERT_EQUAL(1, getPages()); } +void SwUiWriterTest::testTdf96943() +{ + // Enable hide whitespace mode. + SwDoc* pDoc = createDoc("tdf96943.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwViewOption aViewOptions(*pWrtShell->GetViewOptions()); + aViewOptions.SetHideWhitespaceMode(true); + pWrtShell->ApplyViewOptions(aViewOptions); + + // Insert a new character at the end of the document. + pWrtShell->SttEndDoc(/*bStt=*/false); + pWrtShell->Insert("d"); + + // This was 2, a new page was created for the new layout line. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + void SwUiWriterTest::testTdf96536() { // Enable hide whitespace mode. diff --git a/sw/source/core/text/widorp.cxx b/sw/source/core/text/widorp.cxx index 11e8c7aa658b..322bdab3797e 100644 --- a/sw/source/core/text/widorp.cxx +++ b/sw/source/core/text/widorp.cxx @@ -37,6 +37,10 @@ #include "itrtxt.hxx" #include "sectfrm.hxx" #include "ftnfrm.hxx" +#include "rootfrm.hxx" +#include "viewopt.hxx" +#include "pagefrm.hxx" +#include "fmtfsize.hxx" #undef WIDOWTWIPS @@ -126,8 +130,24 @@ bool SwTextFrameBreak::IsInside( SwTextMargin &rLine ) const // The Frame has a height to fit on the page. SwTwips nHeight = (*fnRect->fnYDiff)( (m_pFrame->GetUpper()->*fnRect->fnGetPrtBottom)(), m_nOrigin ); + SwTwips nDiff = nHeight - nLineHeight; + + SwViewShell* pShell = m_pFrame->getRootFrame()->GetCurrShell(); + if (pShell && pShell->GetViewOptions()->IsWhitespaceHidden()) + { + if (nDiff < 0) + { + SwPageFrame* pPageFrame = m_pFrame->FindPageFrame(); + const SwFrameFormat* pPageFormat = static_cast<const SwFrameFormat*>(pPageFrame->GetRegisteredIn()); + const Size& rPageSize = pPageFormat->GetFrameSize().GetSize(); + long nWhitespace = rPageSize.getHeight() - pPageFrame->Frame().Height(); + if (nWhitespace > -nDiff) + nDiff = 0; + } + } + // If everything is inside the existing frame the result is true; - bFit = nHeight >= nLineHeight; + bFit = nDiff >= 0; // --> OD #i103292# if ( !bFit ) |