diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-01-07 12:30:23 +0100 |
---|---|---|
committer | Ashod Nakashian <ashnakash@gmail.com> | 2016-01-21 13:25:39 +0000 |
commit | 258f344021e7a229ae146e0214af19e45c59c032 (patch) | |
tree | 629a8d103a939a590dbf4ccc02ac4edc2a1016ac | |
parent | 6c0535b2b0e3f6d4bd5a9515a2c1a43e32e22a25 (diff) |
tdf#96943 sw Hide Whitespace: don't create pages for widow / orphan ...
... paragraphs that would otherwise fit nominal size of the page frame
(cherry picked from commits 6d8da2b2deb4be2182ca1852cec7eb38a4c654eb and
59ae2d11d5884ffdf77dec95d8cd2566943fd789)
Conflicts:
sw/qa/extras/uiwriter/uiwriter.cxx
Change-Id: I90c3de9150b17c951e1ac4158babb7a71afee9ee
Reviewed-on: https://gerrit.libreoffice.org/21445
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Ashod Nakashian <ashnakash@gmail.com>
Tested-by: Ashod Nakashian <ashnakash@gmail.com>
-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/inc/pagefrm.hxx | 3 | ||||
-rw-r--r-- | sw/source/core/layout/calcmove.cxx | 32 | ||||
-rw-r--r-- | sw/source/core/layout/pagechg.cxx | 28 | ||||
-rw-r--r-- | sw/source/core/text/widorp.cxx | 9 |
6 files changed, 64 insertions, 27 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 eea54dfe8fb4..bff3a4ba757d 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -173,6 +173,7 @@ public: void testTdf77014(); void testTdf92648(); void testTdf96515(); + void testTdf96943(); void testTdf96479(); void testTdf96536(); @@ -256,6 +257,7 @@ public: CPPUNIT_TEST(testTdf77014); CPPUNIT_TEST(testTdf92648); CPPUNIT_TEST(testTdf96515); + CPPUNIT_TEST(testTdf96943); CPPUNIT_TEST(testTdf96479); CPPUNIT_TEST(testTdf96536); CPPUNIT_TEST_SUITE_END(); @@ -2908,6 +2910,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::testTdf96479() { // We want to verify the empty input text field in the bookmark diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx index 840c580ff382..2df4c1d58a37 100644 --- a/sw/source/core/inc/pagefrm.hxx +++ b/sw/source/core/inc/pagefrm.hxx @@ -334,6 +334,9 @@ public: static const vcl::Font& GetEmptyPageFont(); static SwTwips GetSidebarBorderWidth( const SwViewShell* ); + + /// Adjust a bottom-of-page-frame - bottom-of-text-frame difference in case whitespace is hidden. + void HandleWhitespaceHiddenDiff(SwTwips& nDiff); }; inline SwContentFrame *SwPageFrame::FindFirstBodyContent() diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx index 21d479a79131..84daf90e8c5b 100644 --- a/sw/source/core/layout/calcmove.cxx +++ b/sw/source/core/layout/calcmove.cxx @@ -1522,32 +1522,12 @@ void SwContentFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/) const long nPrtBottom = (GetUpper()->*fnRect->fnGetPrtBottom)(); long nBottomDist = (Frame().*fnRect->fnBottomDist)(nPrtBottom); - SwViewShell* pShell = getRootFrame()->GetCurrShell(); - if (pShell && pShell->GetViewOptions()->IsWhitespaceHidden()) - { - // When whitespace is hidden, the page frame has two heights: the - // nominal (defined by the frame format), and the actual (which is - // at most the nominal height, but can be smaller in case there is - // no content for the whole page). - // The layout size is the actual one, but we want to move the - // content frame to a new page only in case it doesn't fit the - // nominal size. - if (nBottomDist < 0) - { - // Content frame doesn't fit the actual size, check if it fits the nominal one. - SwPageFrame* pPageFrame = 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 > -nBottomDist) - { - // It does: don't move it and invalidate our page frame so - // that it gets a larger height. - nBottomDist = 0; - pPageFrame->InvalidateSize(); - } - } - } + // Hide whitespace may require not to insert a new page. + SwPageFrame* pPageFrame = FindPageFrame(); + long nOldBottomDist = nBottomDist; + pPageFrame->HandleWhitespaceHiddenDiff(nBottomDist); + if (nOldBottomDist != nBottomDist) + pPageFrame->InvalidateSize(); if( nBottomDist >= 0 ) { diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx index 34adb7a7ea4f..967ee2fe5305 100644 --- a/sw/source/core/layout/pagechg.cxx +++ b/sw/source/core/layout/pagechg.cxx @@ -2287,6 +2287,34 @@ bool SwPageFrame::IsOverHeaderFooterArea( const Point& rPt, FrameControlType &rC return false; } +void SwPageFrame::HandleWhitespaceHiddenDiff(SwTwips& nDiff) +{ + SwViewShell* pShell = getRootFrame()->GetCurrShell(); + if (pShell && pShell->GetViewOptions()->IsWhitespaceHidden()) + { + // When whitespace is hidden, the page frame has two heights: the + // nominal (defined by the frame format), and the actual (which is + // at most the nominal height, but can be smaller in case there is + // no content for the whole page). + // The layout size is the actual one, but we want to move the + // content frame to a new page only in case it doesn't fit the + // nominal size. + if (nDiff < 0) + { + // Content frame doesn't fit the actual size, check if it fits the nominal one. + const SwFrameFormat* pPageFormat = static_cast<const SwFrameFormat*>(GetRegisteredIn()); + const Size& rPageSize = pPageFormat->GetFrameSize().GetSize(); + long nWhitespace = rPageSize.getHeight() - Frame().Height(); + if (nWhitespace > -nDiff) + { + // It does: don't move it and invalidate our page frame so + // that it gets a larger height. + nDiff = 0; + } + } + } +} + SwTextGridItem const* GetGridItem(SwPageFrame const*const pPage) { if (pPage && pPage->HasGrid()) diff --git a/sw/source/core/text/widorp.cxx b/sw/source/core/text/widorp.cxx index 11e8c7aa658b..c75a9586ef19 100644 --- a/sw/source/core/text/widorp.cxx +++ b/sw/source/core/text/widorp.cxx @@ -37,6 +37,7 @@ #include "itrtxt.hxx" #include "sectfrm.hxx" #include "ftnfrm.hxx" +#include "pagefrm.hxx" #undef WIDOWTWIPS @@ -126,8 +127,14 @@ 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; + + // Hide whitespace may require not to insert a new page. + SwPageFrame* pPageFrame = m_pFrame->FindPageFrame(); + pPageFrame->HandleWhitespaceHiddenDiff(nDiff); + // If everything is inside the existing frame the result is true; - bFit = nHeight >= nLineHeight; + bFit = nDiff >= 0; // --> OD #i103292# if ( !bFit ) |