[Libreoffice-commits] core.git: sw/qa writerfilter/source

Miklos Vajna vmiklos at collabora.co.uk
Tue May 8 09:06:34 UTC 2018


 sw/qa/extras/rtfimport/data/tdf117403.rtf                |   15 ++++++
 sw/qa/extras/rtfimport/rtfimport.cxx                     |   14 ++++++
 writerfilter/source/dmapper/DomainMapperTableHandler.cxx |   35 +++++++++++++--
 3 files changed, 60 insertions(+), 4 deletions(-)

New commits:
commit 42b32321381126ad70700424b8970dbc45a843f5
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue May 8 09:06:26 2018 +0200

    tdf#117403 RTF import: fix lost cell border of merged cell
    
    If two source cells have different border types, then Writer takes the
    second, Word takes the first. So mimic the MSO behavior explicitly in
    dmapper.
    
    Change-Id: I25adc62e024a929216c7b05fec44e1f602f28285
    Reviewed-on: https://gerrit.libreoffice.org/53956
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/sw/qa/extras/rtfimport/data/tdf117403.rtf b/sw/qa/extras/rtfimport/data/tdf117403.rtf
new file mode 100644
index 000000000000..243fe548c246
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/tdf117403.rtf
@@ -0,0 +1,15 @@
+{\rtf\ansi\ansicpg1252\deff2
+{\fonttbl
+{\f0\fcharset238\froman Tms Rmn;}
+{\f1\fdecor Symbol;}
+{\f2\fcharset238\fswiss Helv;}
+{\f3\fcharset238\fmodern Courier New;}
+}
+\sectd
+\pgwsxn16837\pghsxn11905\marglsxn400\margrsxn400\margtsxn801\margbsxn801\lndscpsxn\plain\fs20\pard\qc
+\pard\pard
+\par
+\trowd\clmgf\clbrdrb\brdrs\brdrw1\cellx1764\clmrg\cellx2325
+\pard\intbl \qc \fs12 A1\cell
+\pard\intbl \cell
+\row \pard \par}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 457aedce0acb..a92c2782b933 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -1292,6 +1292,20 @@ DECLARE_RTFIMPORT_TEST(testTdf78506, "tdf78506.rtf")
     }
 }
 
+DECLARE_RTFIMPORT_TEST(testTdf117403, "tdf117403.rtf")
+{
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(),
+                                                    uno::UNO_QUERY);
+    uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xCell(xTable->getCellByName("A1"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xCell.is());
+    table::BorderLine2 aExpected(static_cast<sal_Int32>(COL_BLACK), 0, 4, 0,
+                                 table::BorderLineStyle::SOLID, 4);
+    // This failed, border was not imported, OuterLineWidth was 0 instead of 4.
+    CPPUNIT_ASSERT_BORDER_EQUAL(aExpected, getProperty<table::BorderLine2>(xCell, "BottomBorder"));
+}
+
 DECLARE_RTFIMPORT_TEST(testImportHeaderFooter, "tdf108055.rtf")
 {
     // The RTF import sometimes added Header and Footer multiple Times
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 2a701dc9bd8b..287028cff621 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -1030,21 +1030,48 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
                 {
                     if (!aMerges.empty())
                     {
+                        static const std::vector<OUStringLiteral> aBorderNames
+                            = { "TopBorder", "LeftBorder", "BottomBorder", "RightBorder" };
+
                         // Perform horizontal merges in reverse order, so the fact that merging changes the position of cells won't cause a problem for us.
                         for (std::vector<HorizontallyMergedCell>::reverse_iterator it = aMerges.rbegin(); it != aMerges.rend(); ++it)
                         {
                             uno::Reference<table::XCellRange> xCellRange(xTable, uno::UNO_QUERY_THROW);
-                            uno::Reference<beans::XPropertySet> xCell(xCellRange->getCellByPosition(it->m_nFirstCol, it->m_nFirstRow), uno::UNO_QUERY_THROW);
-                            OUString aFirst = xCell->getPropertyValue("CellName").get<OUString>();
+                            uno::Reference<beans::XPropertySet> xFirstCell(
+                                xCellRange->getCellByPosition(it->m_nFirstCol, it->m_nFirstRow),
+                                uno::UNO_QUERY_THROW);
+                            OUString aFirst
+                                = xFirstCell->getPropertyValue("CellName").get<OUString>();
                             // tdf#105852: Only try to merge if m_nLastCol is set (i.e. there were some merge continuation cells)
                             if (it->m_nLastCol != -1)
                             {
-                                xCell.set(xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow), uno::UNO_QUERY_THROW);
-                                OUString aLast = xCell->getPropertyValue("CellName").get<OUString>();
+                                // Save border properties of the first cell
+                                // before merge.
+                                table::BorderLine2 aBorderValues[4];
+                                for (size_t i = 0; i < aBorderNames.size(); ++i)
+                                    xFirstCell->getPropertyValue(aBorderNames[i])
+                                        >>= aBorderValues[i];
+
+                                uno::Reference<beans::XPropertySet> xLastCell(
+                                    xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow),
+                                    uno::UNO_QUERY_THROW);
+                                OUString aLast
+                                    = xLastCell->getPropertyValue("CellName").get<OUString>();
 
                                 uno::Reference<text::XTextTableCursor> xCursor = xTable->createCursorByCellName(aFirst);
                                 xCursor->gotoCellByName(aLast, true);
+
                                 xCursor->mergeRange();
+
+                                // Handle conflicting properties: mergeRange()
+                                // takes the last cell, Word takes the first
+                                // cell.
+                                for (size_t i = 0; i < aBorderNames.size(); ++i)
+                                {
+                                    if (aBorderValues[i].LineStyle != table::BorderLineStyle::NONE)
+                                        xFirstCell->setPropertyValue(
+                                            aBorderNames[i], uno::makeAny(aBorderValues[i]));
+                                }
                             }
                         }
                     }


More information about the Libreoffice-commits mailing list