diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-07-31 22:43:51 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-08-01 10:12:29 +0200 |
commit | aaa6a5202a447fb4e86d5f016d8e79fbc34a3ed7 (patch) | |
tree | 1306fda3eeb4f9f20e15f56809d0f3205a6087c8 | |
parent | d99cc336d8476975a9fd7adf01b4b9f9cd917aaa (diff) |
tdf#109790 RTF import: keep remembering paragraph style between \cell and \row
This is the opposite situation as tdf#44715, where the problem was that
style was not reset between in-cell paragraphs.
Here we don't want to reset the paragraph style too early, so that
direct (character) formatting isn't lost just because the theoretical
end-of-row character would not have the same direct formatting.
Change-Id: I9bb54f37804f5889fb10504ae890362a2e42122c
Reviewed-on: https://gerrit.libreoffice.org/40609
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r-- | sw/qa/extras/rtfexport/data/tdf109790.rtf | 16 | ||||
-rw-r--r-- | sw/qa/extras/rtfexport/rtfexport.cxx | 8 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdispatchflag.cxx | 10 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdispatchsymbol.cxx | 4 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 3 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 3 |
6 files changed, 42 insertions, 2 deletions
diff --git a/sw/qa/extras/rtfexport/data/tdf109790.rtf b/sw/qa/extras/rtfexport/data/tdf109790.rtf new file mode 100644 index 000000000000..c25c11622812 --- /dev/null +++ b/sw/qa/extras/rtfexport/data/tdf109790.rtf @@ -0,0 +1,16 @@ +{\rtf1\adeflang1037\ansi\ansicpg1252\uc1\adeff0\deff0 +\noqfpromote +{\stylesheet +{\ql \li0\ri0\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \afs20\alang1037 \ltrch\fcs0 +\fs20\lang1033\langfe1033\loch\f0\hich\dbch\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;} +{\s26\fs44 \sbasedon0 \snext26 \slink27 \sqformat Subtitle;} +} +\paperw12240\paperh15840 +\pard\plain Start.\par +\trowd\cellx2310\pard\plain\s26\intbl +{\fs20 XXXX} +{\fs20 \cell } +\pard +{\row } +\pard\plain End.\par +} diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx index 9f75068be62f..9f3b558e5bdb 100644 --- a/sw/qa/extras/rtfexport/rtfexport.cxx +++ b/sw/qa/extras/rtfexport/rtfexport.cxx @@ -1231,6 +1231,14 @@ DECLARE_RTFEXPORT_TEST(testWatermark, "watermark.rtf") CPPUNIT_ASSERT_EQUAL((float)66, nFontSize); } +DECLARE_RTFEXPORT_TEST(testTdf109790, "tdf109790.rtf") +{ + uno::Reference<text::XTextTable> xTable(getParagraphOrTable(2), uno::UNO_QUERY); + uno::Reference<text::XTextRange> xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + // Style information was reset, which caused character height to be 22. + CPPUNIT_ASSERT_EQUAL(10.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/rtfdispatchflag.cxx b/writerfilter/source/rtftok/rtfdispatchflag.cxx index 93d5eeb8f6a7..5f512b94df77 100644 --- a/writerfilter/source/rtftok/rtfdispatchflag.cxx +++ b/writerfilter/source/rtftok/rtfdispatchflag.cxx @@ -461,9 +461,12 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) } break; case RTF_PARD: + { if (m_bHadPicture) dispatchSymbol(RTF_PAR); // \pard is allowed between \cell and \row, but in that case it should not reset the fact that we're inside a table. + // It should not reset the paragraph style, either, so remember the old paragraph style. + RTFValue::Pointer_t pOldStyle = m_aStates.top().aParagraphSprms.find(NS_ooxml::LN_CT_PPrBase_pStyle); m_aStates.top().aParagraphSprms = m_aDefaultState.aParagraphSprms; m_aStates.top().aParagraphAttributes = m_aDefaultState.aParagraphAttributes; @@ -476,13 +479,17 @@ 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)); + if (m_bAfterCellBeforeRow && pOldStyle) + // And we still have the same paragraph style. + m_aStates.top().aParagraphSprms.set(NS_ooxml::LN_CT_PPrBase_pStyle, pOldStyle); // 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>()); } resetFrame(); - // Reset currently selected paragraph style as well. + // Reset currently selected paragraph style as well, unless we are in the special "after \cell, before \row" state. // By default the style with index 0 is applied. + if (!m_bAfterCellBeforeRow) { OUString const aName = getStyleName(0); // But only in case it's not a character style. @@ -499,6 +506,7 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) // Need to send paragraph properties again, if there will be any. m_bNeedPap = true; break; + } case RTF_SECTD: { m_aStates.top().aSectionSprms = m_aDefaultState.aSectionSprms; diff --git a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx index 1e9bb1f8942b..8b3b4318c2ee 100644 --- a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx +++ b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx @@ -174,6 +174,9 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) case RTF_CELL: case RTF_NESTCELL: { + if (nKeyword == RTF_CELL) + m_bAfterCellBeforeRow = true; + checkFirstRun(); if (m_bNeedPap) { @@ -230,6 +233,7 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) break; case RTF_ROW: { + m_bAfterCellBeforeRow = false; if (m_aStates.top().nTableRowWidthAfter > 0) { // Add fake cellx / cell, RTF equivalent of diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 457fa1f6af68..544370132005 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -291,7 +291,8 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x m_hasFHeader(false), m_hasLFooter(false), m_hasRFooter(false), - m_hasFFooter(false) + m_hasFFooter(false), + m_bAfterCellBeforeRow(false) { OSL_ASSERT(xInputStream.is()); m_pInStream.reset(utl::UcbStreamHelper::CreateStream(xInputStream, true)); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 374f3ebe2b0c..51b1e254311e 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -667,6 +667,9 @@ private: bool m_hasLFooter; bool m_hasRFooter; bool m_hasFFooter; + + /// Are we after a \cell, but before a \row? + bool m_bAfterCellBeforeRow; }; } // namespace rtftok } // namespace writerfilter |