writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx       |   19 
++++++++++
 writerfilter/qa/cppunittests/dmapper/data/floattable-hidden-anchor.docx |binary
 writerfilter/source/dmapper/DomainMapperTableHandler.cxx                |   18 
+++++++++
 3 files changed, 37 insertions(+)

New commits:
commit 52d265c0d2f2638c386475e58c3ee489ccd3f06c
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu Jul 13 08:14:42 2023 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Jul 13 11:14:28 2023 +0200

    sw floattable: fix lost floating table right before a hidden para from DOCX
    
    The bugdoc has a floating table, but that was not visible in Writer.
    
    What happens is that the table's anchor was hidden, so Writer was hiding
    the anchored table as well, but Word still shows the table in this case.
    
    Fix the problem similar to what commit
    79ddca4def81198e3eee42eca8aca42fef964c80 (sw floattable: fix lost
    floating table right before a table from DOC, 2023-07-05) did for the
    DOC import: if the paragraph has an anchored floating table and is
    hidden, then show the paragraph.
    
    An alternative would be to change how NS_ooxml::LN_EG_RPrBase_vanish is
    handled in DomainMapper::sprmWithProps(), but that would be too early:
    by the time we get the SPRM, there is no floating table yet. Another
    alternative would be to make sure floating tables are part of the
    "anchored object" list in DomainMapper_Impl::finishParagraph() (that's
    how shapes don't have this problem), but the anchor paragraph is
    finished before creating the floating table, so that would be again too
    early.
    
    Change-Id: I7df7e318b15e78ceb51474440923a80bfdc6054b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154376
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx 
b/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx
index 1f044bc2f309..8c11e3db22c7 100644
--- a/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx
@@ -114,6 +114,25 @@ CPPUNIT_TEST_FIXTURE(Test, 
testFloatingTablesOuterNonsplitInner)
     // i.e. the inner floating table was not floating.
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xFrames->getCount());
 }
+
+CPPUNIT_TEST_FIXTURE(Test, testDOCXFloatingTableHiddenAnchor)
+{
+    // Given a document with a floating table, anchored in a paragraph that is 
hidden:
+    loadFromURL(u"floattable-hidden-anchor.docx");
+
+    // When checking the visibility of the the anchor paragraph:
+    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> 
xText(xTextDocument->getText(), uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> xParagraphs = 
xText->createEnumeration();
+    uno::Reference<beans::XPropertySet> xAnchor(xParagraphs->nextElement(), 
uno::UNO_QUERY);
+
+    // Then make sure the anchor (and thus the table) is visible:
+    bool bCharHidden{};
+    CPPUNIT_ASSERT(xAnchor->getPropertyValue("CharHidden") >>= bCharHidden);
+    // Without the accompanying fix in place, this test would have failed, the 
paragraph + table was
+    // hidden.
+    CPPUNIT_ASSERT(!bCharHidden);
+}
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git 
a/writerfilter/qa/cppunittests/dmapper/data/floattable-hidden-anchor.docx 
b/writerfilter/qa/cppunittests/dmapper/data/floattable-hidden-anchor.docx
new file mode 100644
index 000000000000..08816aacc47e
Binary files /dev/null and 
b/writerfilter/qa/cppunittests/dmapper/data/floattable-hidden-anchor.docx differ
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx 
b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 370a89c0442f..5b0971eee20f 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -1643,6 +1643,24 @@ void DomainMapperTableHandler::endTable(unsigned int 
nestedTableLevel, bool bTab
                     }
                 }
 
+                if (xContent.is())
+                {
+                    // By the time the frame is created, the anchor's 
paragraph marker character
+                    // properties are already imported. Check if we need to 
disable "vanish", that
+                    // would lead to a hidden floating table in Writer, but it 
does not in Word.
+                    uno::Reference<beans::XPropertySet> 
xParagraph(xContent->getAnchor(),
+                                                                   
uno::UNO_QUERY);
+                    if (xParagraph.is())
+                    {
+                        bool bCharHidden{};
+                        xParagraph->getPropertyValue("CharHidden") >>= 
bCharHidden;
+                        if (bCharHidden)
+                        {
+                            xParagraph->setPropertyValue("CharHidden", 
uno::Any(false));
+                        }
+                    }
+                }
+
                 AfterConvertToTextFrame(m_rDMapper_Impl, aFramedRedlines, 
redPos, redLen, redCell, redTable);
             }
 

Reply via email to