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)

Reply via email to