diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-02-08 12:34:55 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-02-08 14:33:28 +0100 |
commit | e15f9ceafdf6e8b21cd315936ab44edfa91dd8b2 (patch) | |
tree | e099d0ba1a9052073242518fda35c74b72825a6b | |
parent | 8880c773e779710dc0a08760e92afd709a73ca31 (diff) |
fdo#59953 RTF import: fix unreadable graphic and nested cell contents
There were two issues here:
1) c3b0f13546b30e5db3aecd311c7178e4e0933208 added a mechanism to work
around broken documents, but that didn't deal with nested tables.
Additionally, the check compared the max row width with the width of the
last cell, not the last row.
2) d276d3f3ae112a11c8cb5768650d147cbb94275e cleaned up implicit
horizontal merge detection, but didn't deal with valid documents, where
each row definition is available twice.
Change-Id: I1a32ec2fcb0d1a8fca7a7bd26501d3daf17880c9
-rw-r--r-- | sw/qa/extras/rtfimport/data/fdo59953.rtf | 16 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 12 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableManager.cxx | 5 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 4 |
4 files changed, 34 insertions, 3 deletions
diff --git a/sw/qa/extras/rtfimport/data/fdo59953.rtf b/sw/qa/extras/rtfimport/data/fdo59953.rtf new file mode 100644 index 000000000000..66432e32ab85 --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo59953.rtf @@ -0,0 +1,16 @@ +{\rtf1\ansi\deff0 +\trowd\cellx7384\cellx9652 +\pard\intbl\sl0 +A1 +\cell +\pard\intbl\sl0\lin10 +B1 +\cell +\trowd\cellx7384\cellx9652\row +\trowd\cellx7384\cellx9652 +\pard\intbl A2\cell +\pard\intbl B2\cell +\trowd\cellx7384\cellx9652 +\row +\pard\itap0\sl0\lin14\rin8 \par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index a3a2f12e651a..446e9c925c01 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -142,6 +142,7 @@ public: void testFdo58646(); void testFdo59419(); void testFdo58076_2(); + void testFdo59953(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -255,6 +256,7 @@ void Test::run() {"fdo58646.rtf", &Test::testFdo58646}, {"fdo59419.rtf", &Test::testFdo59419}, {"fdo58076-2.rtf", &Test::testFdo58076_2}, + {"fdo59953.rtf", &Test::testFdo59953}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1106,6 +1108,16 @@ void Test::testFdo58076_2() CPPUNIT_ASSERT_EQUAL(sal_Int32(TWIP_TO_MM100(8345)), getProperty<sal_Int32>(xDraws->getByIndex(0), "HoriOrientPosition")); } +void Test::testFdo59953() +{ + 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); + // Cell width of A1 was 4998 (e.g. not set / not wide enough, ~50% of total width) + uno::Reference<table::XTableRows> xTableRows(xTable->getRows(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(7650), getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(0), "TableColumnSeparators")[0].Position); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index 448d6e18fb4d..52fbd0ccb749 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -222,7 +222,10 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) break; case NS_ooxml::LN_CT_TblGridBase_gridCol: { - getCurrentGrid()->push_back( ConversionHelper::convertTwipToMM100( nIntValue ) ); + if (nIntValue == -1) + getCurrentGrid()->clear(); + else + getCurrentGrid()->push_back( ConversionHelper::convertTwipToMM100( nIntValue ) ); } break; case NS_ooxml::LN_CT_TcPrBase_vMerge : //vertical merge diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 325ff4f6eb8c..9d5de81a8404 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1719,8 +1719,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) case RTF_NESTROW: { // If the right edge of the last cell (row width) is smaller than the width of some other row, mimic the WW8 import: add a fake cell. - RTFValue::Pointer_t pLastCellx = m_aStates.top().aTableRowSprms.find(NS_ooxml::LN_CT_TblGridBase_gridCol, false); - if (pLastCellx.get() && pLastCellx->getInt() < m_nCellxMax) + if (nKeyword == RTF_ROW && m_aStates.top().nCellX < m_nCellxMax) dispatchValue(RTF_CELLX, m_nCellxMax); if (m_aStates.top().nCells) @@ -2140,6 +2139,7 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) break; case RTF_TROWD: m_aStates.top().aTableRowSprms = m_aDefaultState.aTableRowSprms; + m_aStates.top().aTableRowSprms.set(NS_ooxml::LN_CT_TblGridBase_gridCol, RTFValue::Pointer_t(new RTFValue(-1)), false); m_aStates.top().aTableRowAttributes = m_aDefaultState.aTableRowAttributes; m_aStates.top().nCellX = 0; // In case the table definition is in the middle of the row |