diff options
-rw-r--r-- | sw/qa/extras/rtfexport/data/tdf123393.rtf | 14 | ||||
-rw-r--r-- | sw/qa/extras/rtfexport/rtfexport3.cxx | 13 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdispatchsymbol.cxx | 4 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 35 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 5 |
5 files changed, 58 insertions, 13 deletions
diff --git a/sw/qa/extras/rtfexport/data/tdf123393.rtf b/sw/qa/extras/rtfexport/data/tdf123393.rtf new file mode 100644 index 000000000000..381b038d314c --- /dev/null +++ b/sw/qa/extras/rtfexport/data/tdf123393.rtf @@ -0,0 +1,14 @@ +{\rtf1 +{\fonttbl +{\f0 Times New Roman;} +} +{\stylesheet +{\s0\fs20 Normal;} +{\s31\fs14 Body Text 3;} +} +Before\par +\trowd\cellx2694\cellx4678 +\pard\intbl\fs14 A1\cell +\pard\intbl\s31\fs14 B1\cell\row +\pard\plain After\par +} diff --git a/sw/qa/extras/rtfexport/rtfexport3.cxx b/sw/qa/extras/rtfexport/rtfexport3.cxx index e4a069464335..576f7b6c85b8 100644 --- a/sw/qa/extras/rtfexport/rtfexport3.cxx +++ b/sw/qa/extras/rtfexport/rtfexport3.cxx @@ -219,6 +219,19 @@ DECLARE_RTFEXPORT_TEST(testTdf122455, "tdf122455.rtf") CPPUNIT_ASSERT_EQUAL(16.0, getProperty<double>(getRun(getParagraph(1), 1), "CharHeight")); } +DECLARE_RTFEXPORT_TEST(testTdf123393, "tdf123393.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); + // Without the accompanying fix in place, this test would have failed with + // 'Expected: 7; Actual : 10', i.e. font size was too large. + CPPUNIT_ASSERT_EQUAL( + 7.f, getProperty<float>(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharHeight")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx index f7371ee7ac22..2603ebe22952 100644 --- a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx +++ b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx @@ -184,10 +184,10 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) // There were no runs in the cell, so we need to send paragraph and character properties here. auto pPValue = new RTFValue(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms); - m_aTableBufferStack.back().emplace_back(Buf_t(BUFFER_PROPS, pPValue, nullptr)); + bufferProperties(m_aTableBufferStack.back(), pPValue, nullptr); auto pCValue = new RTFValue(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms); - m_aTableBufferStack.back().emplace_back(Buf_t(BUFFER_PROPS, pCValue, nullptr)); + bufferProperties(m_aTableBufferStack.back(), pCValue, nullptr); } RTFValue::Pointer_t pValue; diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 16b4b7cff5cd..104e0e004bf6 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -570,7 +570,7 @@ void RTFDocumentImpl::checkNeedPap() { auto pValue = new RTFValue(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms); - m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PROPS, pValue, nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, pValue, nullptr); } } } @@ -588,7 +588,7 @@ void RTFDocumentImpl::runProps() { auto pValue = new RTFValue(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms); - m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PROPS, pValue, nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, pValue, nullptr); } // Delete the sprm, so the trackchange range will be started only once. @@ -1143,7 +1143,7 @@ void RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XS else { auto pValue = new RTFValue(aAttributes, aSprms); - m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PROPS, pValue, nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, pValue, nullptr); } } @@ -1672,6 +1672,11 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, RTFSprms* const pSprms, } else if (std::get<0>(aTuple) == BUFFER_PICTURE) m_aStates.top().aPicture = std::get<1>(aTuple)->getPicture(); + else if (std::get<0>(aTuple) == BUFFER_SETSTYLE) + { + if (!m_aStates.empty()) + m_aStates.top().nCurrentStyleIndex = std::get<1>(aTuple)->getInt(); + } else assert(false); } @@ -2121,7 +2126,7 @@ RTFError RTFDocumentImpl::popState() else { auto pFFValue = new RTFValue(aFFAttributes, aFFSprms); - m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PROPS, pFFValue, nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, pFFValue, nullptr); } m_aFormfieldAttributes.clear(); m_aFormfieldSprms.clear(); @@ -2313,8 +2318,8 @@ RTFError RTFDocumentImpl::popState() if (!m_aStates.top().pCurrentBuffer) Mapper().props(new RTFReferenceProperties(lcl_getBookmarkProperties(nPos, aStr))); else - m_aStates.top().pCurrentBuffer->push_back(Buf_t( - BUFFER_PROPS, new RTFValue(lcl_getBookmarkProperties(nPos, aStr)), nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, + new RTFValue(lcl_getBookmarkProperties(nPos, aStr)), nullptr); } break; case Destination::BOOKMARKEND: @@ -2326,9 +2331,9 @@ RTFError RTFDocumentImpl::popState() Mapper().props(new RTFReferenceProperties( lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr))); else - m_aStates.top().pCurrentBuffer->push_back(Buf_t( - BUFFER_PROPS, new RTFValue(lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr)), - nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, + new RTFValue(lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr)), + nullptr); } break; case Destination::INDEXENTRY: @@ -3030,8 +3035,8 @@ RTFError RTFDocumentImpl::popState() if (!m_aStates.top().pCurrentBuffer) Mapper().props(new RTFReferenceProperties(RTFSprms(), aTCSprms)); else - m_aStates.top().pCurrentBuffer->push_back( - Buf_t(BUFFER_PROPS, new RTFValue(RTFSprms(), aTCSprms), nullptr)); + bufferProperties(*m_aStates.top().pCurrentBuffer, new RTFValue(RTFSprms(), aTCSprms), + nullptr); } // This is the end of the doc, see if we need to close the last section. @@ -3459,6 +3464,14 @@ RTFParserState::RTFParserState(RTFDocumentImpl* pDocumentImpl) void RTFDocumentImpl::resetFrame() { m_aStates.top().aFrame = RTFFrame(&m_aStates.top()); } +void RTFDocumentImpl::bufferProperties(RTFBuffer_t& rBuffer, const RTFValue::Pointer_t& pValue, + const tools::SvRef<TableRowBuffer>& pTableProperties) +{ + rBuffer.emplace_back( + Buf_t(BUFFER_SETSTYLE, new RTFValue(m_aStates.top().nCurrentStyleIndex), nullptr)); + rBuffer.emplace_back(Buf_t(BUFFER_PROPS, pValue, pTableProperties)); +} + RTFPicture::RTFPicture() = default; RTFShape::RTFShape() = default; diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 6fe21351c5c8..d51512889d74 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -76,6 +76,8 @@ enum class RTFBorderState /// Different kind of buffers for table cell contents. enum RTFBufferTypes { + BUFFER_SETSTYLE, + /// Stores properties, should be created only in bufferProperties(). BUFFER_PROPS, BUFFER_NESTROW, BUFFER_CELLEND, @@ -499,6 +501,9 @@ public: bool isStyleSheetImport(); /// Resets m_aStates.top().aFrame. void resetFrame(); + /// Buffers properties to be sent later. + void bufferProperties(RTFBuffer_t& rBuffer, const RTFValue::Pointer_t& pValue, + const tools::SvRef<TableRowBuffer>& pTableProperties); private: SvStream& Strm(); |