sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx |binary sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 28 ++++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 9 +-- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 7 +- 5 files changed, 37 insertions(+), 7 deletions(-)
New commits: commit 5760d7876dae55d351e80b990dc064440fa46a73 Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Tue Oct 3 15:48:48 2023 -0400 Commit: Justin Luth <jl...@mail.com> CommitDate: Wed Oct 4 20:43:10 2023 +0200 related tdf#157572 writerfilter framePr: no vAlign if vAnchor=text See bug 157572 for the documentation. This can be seen in MS Word's UI. Have the vertical position be centered, and then change to "para": -> the vertical position changes to a numbered distance. make CppunitTest_sw_ooxmlexport5 \ CPPUNIT_TEST_NAME=testTdf157572_noVAlignAsText make CppunitTest_sw_ooxmlexport5 \ CPPUNIT_TEST_NAME=testTdf157572_insidiousCombination Change-Id: I6c00a34f14633e16178c1504a37e644a30cf4cd7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157529 Tested-by: Jenkins Reviewed-by: Justin Luth <jl...@mail.com> diff --git a/sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx b/sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx new file mode 100644 index 000000000000..d7437aedec30 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx b/sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx new file mode 100644 index 000000000000..98f1bb195ca8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx index 2ee3e1e80bf7..d97fd7c237d0 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx @@ -1440,6 +1440,34 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf157572_defaultVAnchor) assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr", "yAlign"); } +CPPUNIT_TEST_FIXTURE(Test, testTdf157572_insidiousCombination) +{ + loadAndSave("tdf157572_insidiousCombination.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // This is a NASTY example. In MS Word, it IMPORTS yAlign=bottom, but positions it as y=0. + // although the UI shows "bottom" instead of position 0cm. Clicking -ok- MOVES the textbox. + // Seems best to throw away "bottom" in LO, since a round-trip in MS Word keeps the 0cm + // position and the vAlign ONLY affects the UI. + + // vAnchor was defined as text. + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr","vAnchor","text"); + // yAlign=something is not compatible with "text" - don't write anything out + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr", "yAlign"); + // y is zero - no need to write out the default value + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr", "y"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf157572_noVAlignAsText) +{ + loadAndSave("tdf157572_noVAlignAsText.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr","vAnchor","text"); + // yAlign=something is not compatible with vAnchor="text" - don't write anything out + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr", "yAlign"); +} + CPPUNIT_TEST_FIXTURE(Test, testTdf112287B) { loadAndSave("tdf112287B.docx"); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 1b209d26a0de..144469810097 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1051,13 +1051,15 @@ void DocxAttributeOutput::PopulateFrameProperties(const SwFrameFormat* pFrameFor attrList->add( FSNS( XML_w, XML_x), OString::number(aPos.X)); + const OString relativeFromH = convertToOOXMLHoriOrientRel(rHoriOrient.GetRelationOrient()); + const OString relativeFromV = convertToOOXMLVertOrientRel(rVertOrient.GetRelationOrient()); OString aXAlign = convertToOOXMLHoriOrient(rHoriOrient.GetHoriOrient(), /*bIsPosToggle=*/false); OString aYAlign = convertToOOXMLVertOrient(rVertOrient.GetVertOrient()); if (!aXAlign.isEmpty()) attrList->add(FSNS(XML_w, XML_xAlign), aXAlign); - if (!aYAlign.isEmpty()) + if (!aYAlign.isEmpty() && relativeFromV != "text") attrList->add(FSNS(XML_w, XML_yAlign), aYAlign); - else + else if (aPos.Y) attrList->add( FSNS( XML_w, XML_y), OString::number(aPos.Y)); sal_Int16 nLeft = pFrameFormat->GetLRSpace().GetLeft(); @@ -1075,9 +1077,6 @@ void DocxAttributeOutput::PopulateFrameProperties(const SwFrameFormat* pFrameFor attrList->add(FSNS(XML_w, XML_hSpace), OString::number((nLeft + nRight) / 2)); attrList->add(FSNS(XML_w, XML_vSpace), OString::number((nUpper + nLower) / 2)); - OString relativeFromH = convertToOOXMLHoriOrientRel(rHoriOrient.GetRelationOrient()); - OString relativeFromV = convertToOOXMLVertOrientRel(rVertOrient.GetRelationOrient()); - switch (pFrameFormat->GetSurround().GetValue()) { case css::text::WrapTextMode_NONE: diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 77528bc546c7..36a0f6c178f9 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -1874,8 +1874,6 @@ DomainMapper_Impl::MakeFrameProperties(const ParagraphProperties& rProps) break; } } - aFrameProperties.push_back( - comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT), nVertOrient)); // Default the anchor in case FramePr_vAnchor is missing. // ECMA 17.3.1.11 says "page", @@ -1892,10 +1890,15 @@ DomainMapper_Impl::MakeFrameProperties(const ParagraphProperties& rProps) if (pProp->GetvAnchor() < 0) continue; nVAnchor = pProp->GetvAnchor(); + // vAlign is ignored if vAnchor is set to 'text' + if (nVAnchor == text::RelOrientation::FRAME) + nVertOrient = text::VertOrientation::NONE; break; } aFrameProperties.push_back( comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT_RELATION), nVAnchor)); + aFrameProperties.push_back( + comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT), nVertOrient)); text::WrapTextMode nWrap = text::WrapTextMode_NONE; for (const auto pProp : vProps)