diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-01-08 14:56:26 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-02-05 10:48:16 +0000 |
commit | f14577899781a040fa7d505f8a7554b6266aeb0c (patch) | |
tree | 0ef90ed6804ac94278b52c74cb372c3aa07d743c /sw | |
parent | bc257df73af5fdaf973c8229a743a3ea0ce06a67 (diff) |
tdf#96961 sw Hide Whitespace: still show whitespace on the last page
Mainly to match Word's hide whitespace behavior.
(cherry picked from commits cd51e0153a25f3950be54dd7fd58a0de6e148ae2,
49b67cdc36b599f865d4a6de214d901861f27196 and
363aa5dbb2c223b6cc3a109bd654f39772e310fa)
Conflicts:
sw/qa/extras/uiwriter/uiwriter.cxx
Change-Id: Ica09bca5004adbfa14d1c9aca04079129f8a1a68
Reviewed-on: https://gerrit.libreoffice.org/22122
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter.cxx | 30 | ||||
-rw-r--r-- | sw/source/core/inc/pagefrm.hxx | 5 | ||||
-rw-r--r-- | sw/source/core/layout/calcmove.cxx | 13 | ||||
-rw-r--r-- | sw/source/core/layout/pagechg.cxx | 6 | ||||
-rw-r--r-- | sw/source/core/layout/wsfrm.cxx | 18 | ||||
-rw-r--r-- | sw/source/core/text/widorp.cxx | 3 |
6 files changed, 61 insertions, 14 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index bff3a4ba757d..3e49ee9aeceb 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -176,6 +176,7 @@ public: void testTdf96943(); void testTdf96479(); void testTdf96536(); + void testTdf96961(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); @@ -260,6 +261,7 @@ public: CPPUNIT_TEST(testTdf96943); CPPUNIT_TEST(testTdf96479); CPPUNIT_TEST(testTdf96536); + CPPUNIT_TEST(testTdf96961); CPPUNIT_TEST_SUITE_END(); private: @@ -3031,7 +3033,11 @@ void SwUiWriterTest::testTdf96536() aViewOptions.SetHideWhitespaceMode(true); pWrtShell->ApplyViewOptions(aViewOptions); - // Insert a new paragraph at the end of the document, and then delete it. + // Insert a page break and go back to the first page. + pWrtShell->InsertPageBreak(); + pWrtShell->SttEndDoc(/*bStt=*/true); + + // Insert a new paragraph at the end of the page, and then delete it. uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); uno::Reference<text::XParagraphAppend> xParagraphAppend(xTextDocument->getText(), uno::UNO_QUERY); xParagraphAppend->finishParagraph(uno::Sequence<beans::PropertyValue>()); @@ -3043,7 +3049,27 @@ void SwUiWriterTest::testTdf96536() // This was 552, page did not shrink after deleting the second paragraph. // Expected 276, which is 12pt font size + default line spacing (15%), but // tolerate some difference to that. - CPPUNIT_ASSERT(parseDump("/root/infos/bounds", "height").toInt32() <= 276); + CPPUNIT_ASSERT(parseDump("/root/page[1]/infos/bounds", "height").toInt32() <= 276); +} + +void SwUiWriterTest::testTdf96961() +{ + // Insert a page break. + SwDoc* pDoc = createDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->InsertPageBreak(); + + // Enable hide whitespace mode. + SwViewOption aViewOptions(*pWrtShell->GetViewOptions()); + aViewOptions.SetHideWhitespaceMode(true); + pWrtShell->ApplyViewOptions(aViewOptions); + + calcLayout(); + + // Assert that the height of the last page is larger than the height of other pages. + sal_Int32 nOther = parseDump("/root/page[1]/infos/bounds", "height").toInt32(); + sal_Int32 nLast = parseDump("/root/page[2]/infos/bounds", "height").toInt32(); + CPPUNIT_ASSERT(nLast > nOther); } CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx index 2df4c1d58a37..3fae2a30bbc8 100644 --- a/sw/source/core/inc/pagefrm.hxx +++ b/sw/source/core/inc/pagefrm.hxx @@ -335,8 +335,9 @@ public: 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); + /// Is bottom-of-page-frame - bottom-of-text-frame difference valid in case whitespace is hidden? + /// If false is returned, then the caller should handle negative difference as (at least) zero difference instead. + bool CheckPageHeightValidForHideWhitespace(SwTwips nDiff); }; inline SwContentFrame *SwPageFrame::FindFirstBodyContent() diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx index 84daf90e8c5b..9eba5ebf13f9 100644 --- a/sw/source/core/layout/calcmove.cxx +++ b/sw/source/core/layout/calcmove.cxx @@ -740,7 +740,8 @@ void SwPageFrame::MakeAll(vcl::RenderContext* pRenderContext) } assert(pAttrs); - SwViewShell *pSh = getRootFrame()->GetCurrShell(); + SwRootFrame* pRootFrame = getRootFrame(); + SwViewShell* pSh = pRootFrame->GetCurrShell(); if (pSh && pSh->GetViewOptions()->getBrowseMode()) { // In BrowseView, we use fixed settings @@ -787,7 +788,7 @@ void SwPageFrame::MakeAll(vcl::RenderContext* pRenderContext) mbValidSize = mbValidPrtArea = true; continue; } - else if (pSh && pSh->GetViewOptions()->IsWhitespaceHidden()) + else if (pSh && pSh->GetViewOptions()->IsWhitespaceHidden() && pRootFrame->GetLastPage() != this) { long height = 0; SwLayoutFrame *pBody = FindBodyCont(); @@ -1524,10 +1525,12 @@ void SwContentFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/) // Hide whitespace may require not to insert a new page. SwPageFrame* pPageFrame = FindPageFrame(); - long nOldBottomDist = nBottomDist; - pPageFrame->HandleWhitespaceHiddenDiff(nBottomDist); - if (nOldBottomDist != nBottomDist) + const bool bHeightValid = pPageFrame->CheckPageHeightValidForHideWhitespace(nBottomDist); + if (!bHeightValid) + { pPageFrame->InvalidateSize(); + nBottomDist = 0; + } if( nBottomDist >= 0 ) { diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx index 967ee2fe5305..42ae8acbe5d9 100644 --- a/sw/source/core/layout/pagechg.cxx +++ b/sw/source/core/layout/pagechg.cxx @@ -2287,7 +2287,7 @@ bool SwPageFrame::IsOverHeaderFooterArea( const Point& rPt, FrameControlType &rC return false; } -void SwPageFrame::HandleWhitespaceHiddenDiff(SwTwips& nDiff) +bool SwPageFrame::CheckPageHeightValidForHideWhitespace(SwTwips nDiff) { SwViewShell* pShell = getRootFrame()->GetCurrShell(); if (pShell && pShell->GetViewOptions()->IsWhitespaceHidden()) @@ -2309,10 +2309,12 @@ void SwPageFrame::HandleWhitespaceHiddenDiff(SwTwips& nDiff) { // It does: don't move it and invalidate our page frame so // that it gets a larger height. - nDiff = 0; + return false; } } } + + return true; } SwTextGridItem const* GetGridItem(SwPageFrame const*const pPage) diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx index 0f60476f84ce..032177a40d31 100644 --- a/sw/source/core/layout/wsfrm.cxx +++ b/sw/source/core/layout/wsfrm.cxx @@ -2947,11 +2947,25 @@ void SwLayoutFrame::Format( vcl::RenderContext* /*pRenderContext*/, const SwBord if ( mbValidPrtArea && mbValidSize ) return; + bool bHideWhitespace = false; + if (IsPageFrame()) + { + SwViewShell* pShell = getRootFrame()->GetCurrShell(); + if (pShell && pShell->GetViewOptions()->IsWhitespaceHidden()) + { + // This is needed so that no space is reserved for the margin on + // the last page of the document. Other pages would have no margin + // set even without this, as their frame height is the content + // height already. + bHideWhitespace = true; + } + } + const sal_uInt16 nLeft = (sal_uInt16)pAttrs->CalcLeft(this); - const sal_uInt16 nUpper = pAttrs->CalcTop(); + const sal_uInt16 nUpper = bHideWhitespace ? 0 : pAttrs->CalcTop(); const sal_uInt16 nRight = (sal_uInt16)pAttrs->CalcRight(this); - const sal_uInt16 nLower = pAttrs->CalcBottom(); + const sal_uInt16 nLower = bHideWhitespace ? 0 : pAttrs->CalcBottom(); const bool bVert = IsVertical() && !IsPageFrame(); SwRectFn fnRect = bVert ? ( IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori; diff --git a/sw/source/core/text/widorp.cxx b/sw/source/core/text/widorp.cxx index c75a9586ef19..7c22b120d3a4 100644 --- a/sw/source/core/text/widorp.cxx +++ b/sw/source/core/text/widorp.cxx @@ -131,7 +131,8 @@ bool SwTextFrameBreak::IsInside( SwTextMargin &rLine ) const // Hide whitespace may require not to insert a new page. SwPageFrame* pPageFrame = m_pFrame->FindPageFrame(); - pPageFrame->HandleWhitespaceHiddenDiff(nDiff); + if (!pPageFrame->CheckPageHeightValidForHideWhitespace(nDiff)) + nDiff = 0; // If everything is inside the existing frame the result is true; bFit = nDiff >= 0; |