summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-01-08 14:56:26 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-02-05 10:48:16 +0000
commitf14577899781a040fa7d505f8a7554b6266aeb0c (patch)
tree0ef90ed6804ac94278b52c74cb372c3aa07d743c
parentbc257df73af5fdaf973c8229a743a3ea0ce06a67 (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>
-rw-r--r--sw/qa/extras/uiwriter/uiwriter.cxx30
-rw-r--r--sw/source/core/inc/pagefrm.hxx5
-rw-r--r--sw/source/core/layout/calcmove.cxx13
-rw-r--r--sw/source/core/layout/pagechg.cxx6
-rw-r--r--sw/source/core/layout/wsfrm.cxx18
-rw-r--r--sw/source/core/text/widorp.cxx3
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;