sw/qa/extras/ooxmlexport/data/tdf100037_inlineZOrder.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport18.cxx                |   14 +++++++++++++-
 sw/qa/extras/ooxmlexport/ooxmlexport9.cxx                 |    5 ++---
 sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx      |    6 ++++++
 4 files changed, 21 insertions(+), 4 deletions(-)

New commits:
commit 6c2ab0f3ca440f6e10b438e6ee0e235cbe155216
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Thu Jun 6 19:05:29 2024 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Fri Jun 7 12:41:15 2024 +0200

    tdf#100037 vml import: add AS_CHAR images to zOrder calculation
    
    Inline shapes are at the level of body text,
    so any heaven-layer floating objects should be above it,
    and any hell-layer flys should be below it.
    
    DML images already do this in applyZOrder().
    
    make CppunitTest_sw_ooxmlexport18 \
        CPPUNIT_TEST_NAME=testTdf100037_inlineZOrder
    
    Change-Id: I51ab2eb4c1b59ebf048f16dca60a02b327c5e6b4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168511
    Reviewed-by: Justin Luth <jl...@mail.com>
    Tested-by: Jenkins

diff --git a/sw/qa/extras/ooxmlexport/data/tdf100037_inlineZOrder.docx 
b/sw/qa/extras/ooxmlexport/data/tdf100037_inlineZOrder.docx
new file mode 100644
index 000000000000..5f3e9b358392
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf100037_inlineZOrder.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
index de10f434b07c..50a9dc33e9e5 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
@@ -1058,12 +1058,24 @@ 
DECLARE_OOXMLEXPORT_TEST(testTdf159158_zOrder_headerBehind2, "tdf159158_zOrder_h
     CPPUNIT_ASSERT_EQUAL(OUString("HeaderImage"),
                          getProperty<OUString>(zOrder0, "LinkDisplayName"));
     CPPUNIT_ASSERT_EQUAL(OUString("BodyBlueRectangle"),
-                         getProperty<OUString>(zOrder1,"LinkDisplayName"));
+                         getProperty<OUString>(zOrder1, "LinkDisplayName"));
     // The logo should not be opaque since it is in the header.
     CPPUNIT_ASSERT(!getProperty<bool>(zOrder0, "Opaque")); // logo should be 
invisible
     CPPUNIT_ASSERT(!getProperty<bool>(zOrder1, "Opaque"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf100037_inlineZOrder, 
"tdf100037_inlineZOrder.docx")
+{
+    // given a floating textbox followed by an inline image,
+    // an inline image should always be behind a heaven-layer floating object.
+    uno::Reference<beans::XPropertySet> zOrder0(getShape(1), uno::UNO_QUERY);
+    uno::Reference<beans::XPropertySet> zOrder1(getShape(2), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(zOrder0, 
"ZOrder")); // lower
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getProperty<sal_Int32>(zOrder1, 
"ZOrder")); // higher
+    CPPUNIT_ASSERT_EQUAL(OUString("Image 2"), getProperty<OUString>(zOrder0, 
"LinkDisplayName"));
+    CPPUNIT_ASSERT_EQUAL(OUString("Frame1"), getProperty<OUString>(zOrder1, 
"LinkDisplayName"));
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf155903, "tdf155903.odt")
 {
     // Without the accompanying fix in place, this test would have crashed,
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
index fefabe5c3df3..6e9fae2d5fda 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
@@ -1223,8 +1223,7 @@ CPPUNIT_TEST_FIXTURE(Test, testActiveXControlAlign)
     CPPUNIT_ASSERT_EQUAL(2, getShapes());
     CPPUNIT_ASSERT_EQUAL(1, getPages());
     // First check box aligned as a floating object
-    uno::Reference<drawing::XControlShape> xControlShape(getShape(1), 
uno::UNO_QUERY);
-    CPPUNIT_ASSERT(xControlShape.is());
+    uno::Reference<drawing::XControlShape> xControlShape(getShape(2), 
uno::UNO_QUERY_THROW);
 
     // Check whether we have the right control
     uno::Reference<beans::XPropertySet> 
xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
@@ -1245,7 +1244,7 @@ CPPUNIT_TEST_FIXTURE(Test, testActiveXControlAlign)
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2341), xShape->getPosition().Y);
 
     // Second check box aligned inline / as character
-    xControlShape.set(getShape(2), uno::UNO_QUERY);
+    xControlShape.set(getShape(1), uno::UNO_QUERY_THROW);
 
     // Check whether we have the right control
     xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx 
b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
index 8f20487d301a..25612d082e5f 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
@@ -4831,6 +4831,12 @@ void DomainMapper_Impl::PushShapeContext( const 
uno::Reference< drawing::XShape
                 if(aPropMargin)
                     
xShapePropertySet->setPropertyValue(getPropertyName(PROP_BOTTOM_MARGIN),
                                                         aPropMargin->second);
+
+                sal_Int64 zOrder = SAL_MIN_INT64;
+                xShapePropertySet->setPropertyValue(u"ZOrder"_ustr,
+                    uno::Any(rZOrderHelper.findZOrder(zOrder, 
/*LastDuplicateWins*/true)));
+                rZOrderHelper.addItem(xShapePropertySet, zOrder);
+                checkZOrderStatus = true;
             }
             else
             {

Reply via email to