sw/qa/core/layout/layout.cxx | 29 +++++++++++++++++++++++++++++ sw/source/core/layout/frmtool.cxx | 22 ++++++++++++++++++++-- sw/source/core/layout/paintfrm.cxx | 10 +++++++++- 3 files changed, 58 insertions(+), 3 deletions(-)
New commits: commit 59e816faa2a2bc0b88c39f063c53e00a33f23722 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Fri Feb 5 09:10:39 2021 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri Feb 5 10:02:14 2021 +0100 tdf#91920 sw page gutter margin, from top: add layout Take the new doc setting into account and if it's true, then undo the existing "increase left margin" logic, and do an "increase top margin" one instead. Change-Id: I358a34790a52e2720ec23e6841d56e66858e28b0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110454 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/sw/qa/core/layout/layout.cxx b/sw/qa/core/layout/layout.cxx index 77a2db553aa4..ebf7f816b918 100644 --- a/sw/qa/core/layout/layout.cxx +++ b/sw/qa/core/layout/layout.cxx @@ -297,6 +297,35 @@ CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, testGutterMargin) CPPUNIT_ASSERT_EQUAL(nGutterTwips, nNewLeft - nOldLeft); } +CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, testGutterTopMargin) +{ + // Create a document, remember the old top edge of the page print area (the rectangle that is + // inside margins). + SwDoc* pDoc = createSwDoc(); + uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xSettings( + xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY); + xSettings->setPropertyValue("GutterAtTop", uno::makeAny(true)); + uno::Reference<beans::XPropertySet> xStandard(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwFrame* pPage = pLayout->GetLower(); + tools::Long nOldTop = pPage->getFramePrintArea().Top(); + + // Set the gutter margin to 2cm. + sal_Int32 nGutterMm100 = 2000; + xStandard->setPropertyValue("GutterMargin", uno::makeAny(nGutterMm100)); + + // Verify that the new top edge is larger. + tools::Long nNewTop = pPage->getFramePrintArea().Top(); + tools::Long nGutterTwips = convertMm100ToTwip(nGutterMm100); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1134 + // - Actual : 0 + // i.e. the gutter was not added to the left margin. + CPPUNIT_ASSERT_EQUAL(nGutterTwips, nNewTop - nOldTop); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index 6a5fa10cb121..0cac4ad2ca96 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -2217,6 +2217,18 @@ SwBorderAttrs::~SwBorderAttrs() void SwBorderAttrs::CalcTop_() { m_nTop = CalcTopLine() + m_rUL.GetUpper(); + + if (m_rLR) + { + bool bGutterAtTop = m_rAttrSet.GetDoc()->getIDocumentSettingAccess().get( + DocumentSettingId::GUTTER_AT_TOP); + if (bGutterAtTop) + { + // Decrease the print area: the top space is the sum of top and gutter margins. + m_nTop += m_rLR->GetGutterMargin(); + } + } + m_bTop = false; } @@ -2318,8 +2330,14 @@ tools::Long SwBorderAttrs::CalcLeft( const SwFrame *pCaller ) const if (pCaller->IsPageFrame() && m_rLR) { - // Decrease the print area: the left space is the sum of left and gutter margins. - nLeft += m_rLR->GetGutterMargin(); + const auto pPageFrame = static_cast<const SwPageFrame*>(pCaller); + bool bGutterAtTop = pPageFrame->GetFormat()->getIDocumentSettingAccess().get( + DocumentSettingId::GUTTER_AT_TOP); + if (!bGutterAtTop) + { + // Decrease the print area: the left space is the sum of left and gutter margins. + nLeft += m_rLR->GetGutterMargin(); + } } return nLeft; diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 2e01551d3876..e941c68988a9 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -1292,11 +1292,19 @@ static void lcl_CalcBorderRect( SwRect &rRect, const SwFrame *pFrame, if (pFrame->IsPageFrame() && rAttrs.GetLRSpace()) { tools::Long nGutterMargin = rAttrs.GetLRSpace()->GetGutterMargin(); - if (nGutterMargin) + const auto pPageFrame = static_cast<const SwPageFrame*>(pFrame); + bool bGutterAtTop = pPageFrame->GetFormat()->getIDocumentSettingAccess().get( + DocumentSettingId::GUTTER_AT_TOP); + if (nGutterMargin && !bGutterAtTop) { // Paint the left border based on the left margin, ignoring the gutter margin. (rRect.*fnRect->fnSubLeft)(nGutterMargin); } + else if (nGutterMargin) + { + // Paint the top border based on the top margin, ignoring the gutter margin. + (rRect.*fnRect->fnSubTop)(nGutterMargin); + } } const SvxBoxItem &rBox = rAttrs.GetBox(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits