diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2020-09-18 18:52:45 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-09-21 10:47:42 +0200 |
commit | 54bd2266d6e0c8926ecaf0fbb2dbb5ee9d1a802d (patch) | |
tree | dacb8d4bc325619f405d9529981c4529be98fd4a | |
parent | fefcad1186232b26180d095bbafdf8e8bdda8209 (diff) |
tdf#136855 writerfilter: RTF import: buffer annotations inside tables
The problem is that one of the annotations is inside a table that
happens to start with a covered cell (vertically merged).
The table row is buffered, but the annotation is not, so it is inserted
before any of the text of the table cells is inserted, so it ends up in
the covered cell.
The strucuture of annotations is a bit icky; to fix this, buffer both the
\annotation destination and \atrfstart \atrfend start and end
destinations.
Change-Id: Ie955a75a2d254f8d7e965259698b688eece7cbd6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103016
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
-rw-r--r-- | writerfilter/source/rtftok/rtfdispatchdestination.cxx | 14 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 10 |
2 files changed, 22 insertions, 2 deletions
diff --git a/writerfilter/source/rtftok/rtfdispatchdestination.cxx b/writerfilter/source/rtftok/rtfdispatchdestination.cxx index 9574224e0fa0..f545d861a0c8 100644 --- a/writerfilter/source/rtftok/rtfdispatchdestination.cxx +++ b/writerfilter/source/rtftok/rtfdispatchdestination.cxx @@ -335,7 +335,19 @@ RTFError RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) case RTF_ANNOTATION: if (!m_pSuperstream) { - resolveSubstream(m_nGroupStartPos - 1, NS_ooxml::LN_annotation); + if (!m_aStates.top().getCurrentBuffer()) + { + resolveSubstream(m_nGroupStartPos - 1, NS_ooxml::LN_annotation); + } + else + { + RTFSprms aAttributes; + aAttributes.set(Id(0), new RTFValue(m_nGroupStartPos - 1)); + aAttributes.set(Id(1), new RTFValue(NS_ooxml::LN_annotation)); + aAttributes.set(Id(2), new RTFValue(OUString())); + m_aStates.top().getCurrentBuffer()->push_back( + Buf_t(BUFFER_RESOLVESUBSTREAM, new RTFValue(aAttributes), nullptr)); + } m_aStates.top().setDestination(Destination::SKIP); } else diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 7edeccdcb4e7..bbcec8792bc1 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -2725,7 +2725,15 @@ RTFError RTFDocumentImpl::beforePopState(RTFParserState& rState) aAttributes.set(NS_ooxml::LN_EG_RangeMarkupElements_commentRangeEnd, pValue); writerfilter::Reference<Properties>::Pointer_t pProperties = new RTFReferenceProperties(aAttributes); - Mapper().props(pProperties); + if (!m_aStates.top().getCurrentBuffer()) + { + Mapper().props(pProperties); + } + else + { + auto const pValue2 = new RTFValue(aAttributes, RTFSprms()); + bufferProperties(*m_aStates.top().getCurrentBuffer(), pValue2, nullptr); + } } break; case Destination::ANNOTATIONREFERENCE: |