From a5073875fe551790a314b402ff209545050c17da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Fri, 3 Jul 2020 16:52:45 +0200 Subject: [PATCH] tdf#134463 DOCX import: fix other "half" of contextualSpacing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Always ignore own bottom margin setting of the previous paragraph with contextual spacing, if the actual paragraph is identical. I.e. in that case, too, when the actual paragraph has no contextual spacing, like MSO does. Note: PARA_SPACE_MAX mode hasn't included this modification, yet, so only ODT documents converted from DOCX use it at the default setting. See also commit e318d5d8146d18e2c76e23f2e3c39527f2af9f36 (tdf#125893 DOCX import: fix "half" contextual paragraph spacing). Change-Id: I83fab2a2d85eeb9d48a8546d5a4e6423988d642c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97874 Tested-by: Jenkins Reviewed-by: László Németh --- sw/qa/extras/layout/data/tdf134463.docx | Bin 0 -> 11999 bytes sw/qa/extras/layout/layout.cxx | 8 ++++++++ sw/source/core/layout/flowfrm.cxx | 24 +++++++++++++++++------- 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 sw/qa/extras/layout/data/tdf134463.docx diff --git a/sw/qa/extras/layout/data/tdf134463.docx b/sw/qa/extras/layout/data/tdf134463.docx new file mode 100644 index 0000000000000000000000000000000000000000..9de51cc97557fb99debf94502a4d611d2030a62c GIT binary patch literal 11999 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 P77@@5rWkOHzg+zv^!syU literal 0 HcmV?d00001 diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 6240e1bc02e4..c9cc1b9214e2 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -3113,6 +3113,14 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf125893) assertXPath(pXmlDoc, "/root/page/body/txt[4]/infos/prtBounds", "top", "0"); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf134463) +{ + createDoc("tdf134463.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 621. The previous paragraph must have zero bottom border. + assertXPath(pXmlDoc, "/root/page/body/txt[3]/infos/prtBounds", "top", "21"); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf117188) { createDoc("tdf117188.docx"); diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index a110be7b8081..0ea5bd97042f 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -1421,16 +1421,25 @@ SwTwips SwFlowFrame::CalcUpperSpace( const SwBorderAttrs *pAttrs, if( pPrevFrame ) { const bool bUseFormerLineSpacing = rIDSA.get(DocumentSettingId::OLD_LINE_SPACING); - const bool bContextualSpacing = pAttrs->GetULSpace().GetContext() - && lcl_getContextualSpacing(pPrevFrame) + const bool bContextualSpacingThis = pAttrs->GetULSpace().GetContext(); + const bool bContextualSpacingPrev = lcl_getContextualSpacing(pPrevFrame); + + const bool bContextualSpacing = bContextualSpacingThis + && bContextualSpacingPrev && lcl_IdenticalStyles(pPrevFrame, &m_rThis); // tdf#125893 always ignore own top margin setting of the actual paragraph // with contextual spacing, if the previous paragraph is identical const bool bHalfContextualSpacing = !bContextualSpacing - && pAttrs->GetULSpace().GetContext() - && !lcl_getContextualSpacing(pPrevFrame) - && lcl_getContextualSpacing(&m_rThis) + && bContextualSpacingThis + && !bContextualSpacingPrev + && lcl_IdenticalStyles(pPrevFrame, &m_rThis); + + // tdf#134463 always ignore own bottom margin setting of the previous paragraph + // with contextual spacing, if the actual paragraph is identical + const bool bHalfContextualSpacingPrev = !bContextualSpacing + && !bContextualSpacingThis + && bContextualSpacingPrev && lcl_IdenticalStyles(pPrevFrame, &m_rThis); // i#11860 - use new method to determine needed spacing @@ -1488,8 +1497,9 @@ SwTwips SwFlowFrame::CalcUpperSpace( const SwBorderAttrs *pAttrs, } else { - nUpper = bContextualSpacing ? 0 : std::max(static_cast(nPrevLowerSpace), bHalfContextualSpacing - ? 0 : static_cast(pAttrs->GetULSpace().GetUpper()) ); + nUpper = bContextualSpacing ? 0 : std::max( + bHalfContextualSpacingPrev ? 0 : static_cast(nPrevLowerSpace), + bHalfContextualSpacing ? 0 : static_cast(pAttrs->GetULSpace().GetUpper()) ); // i#11859 - consideration of the line spacing // for the upper spacing of a text frame