Kaydet (Commit) 1ec88cdb authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#96308 RTF import: fix tab stop inheritance inside table cells

The tab stop list is a paragraph property, and RTF requires to repeat it
after \s as direct formatting, otherwise the parser should be assumed
that the tab stop list is cleared as a direct formatting.

Non-buffered text handles that in getDefaultSPRM(), handle it directly
in the RTF_PARD code for buffered text.

Change-Id: I16b09bc4c177df5a74d16653b829b198aa1a800f
üst 6e2b8411
{\rtf1
{\stylesheet
{\s30\tx2552 Body Text 3;}
}
\deftab284
\pard\plain\par
\trowd\cellx2694\cellx4678 \pard\intbl\tx284 A1\cell
\pard\intbl\tx2694 before\par
\pard\plain\s30\intbl 7.\tab Champion\par
\pard\plain\intbl after\cell\row
\pard\par
}
......@@ -2391,6 +2391,22 @@ DECLARE_RTFIMPORT_TEST(testTdf96308Deftab, "tdf96308-deftab.rtf")
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(convertTwipToMm100(284)), getProperty<sal_Int32>(xDefaults, "TabStopDistance"));
}
DECLARE_RTFIMPORT_TEST(testTdf96308Tabpos, "tdf96308-tabpos.rtf")
{
// Get the tab stops of the second para in the B1 cell of the first table in the document.
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("B1"), uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
xParaEnum->nextElement();
uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY);
auto aTabStops = getProperty< uno::Sequence<style::TabStop> >(xPara, "ParaTabStops");
// This failed: tab stops were not deleted as direct formatting on the paragraph.
CPPUNIT_ASSERT(!aTabStops.hasElements());
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -2987,6 +2987,8 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
{
// We are still in a table.
m_aStates.top().aParagraphSprms.set(NS_ooxml::LN_inTbl, std::make_shared<RTFValue>(1));
// Ideally getDefaultSPRM() would take care of this, but it would not when we're buffering.
m_aStates.top().aParagraphSprms.set(NS_ooxml::LN_CT_PPrBase_tabs, std::make_shared<RTFValue>());
}
m_aStates.top().resetFrame();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment