diff options
author | László Németh <nemeth@numbertext.org> | 2021-05-05 21:33:28 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2021-05-06 16:19:05 +0200 |
commit | ed7271d9d44fe1a0195ae669644f23c01b6960d8 (patch) | |
tree | 884d95f9c98badeea8ead8dda153425bf62d117e /writerfilter/source | |
parent | 1ff996e5e720d77ce32b8c44d4c29569ddbc113a (diff) |
tdf#128913 DOCX: import track changes of inline images
Deleted images were imported as not deleted part of
the document. Both deleted and inserted images lost
their change tracking.
Change-Id: Ia273d307d01c5ea535889bc9951084e96cd7fc50
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115178
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'writerfilter/source')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 32 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.cxx | 4 |
3 files changed, 37 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index b0ef95e0a785..863526d814fd 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -1834,6 +1834,24 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con } } + // apply redlines for inline images + if (IsParaWithInlineObject()) + { + for (const auto& rAnchored : rAppendContext.m_aAnchoredObjects) + { + // process only inline objects with redlining + if (!rAnchored.m_xRedlineForInline) + continue; + + // select the inline image and set its redline + auto xAnchorRange = rAnchored.m_xAnchoredObject->getAnchor(); + uno::Reference< text::XTextCursor > xCursorOnImage = + xAnchorRange->getText()->createTextCursorByRange(xAnchorRange); + xCursorOnImage->goRight(1, true); + CreateRedline( xCursorOnImage, rAnchored.m_xRedlineForInline ); + } + } + xTextRange = xTextAppend->finishParagraph( comphelper::containerToSequence(aProperties) ); m_xPreviousParagraph.set(xTextRange, uno::UNO_QUERY); @@ -7060,7 +7078,21 @@ void DomainMapper_Impl::ImportGraphic(const writerfilter::Reference< Properties m_aTextAppendStack.top().m_aAnchoredObjects.push_back(aInfo); } else if (eGraphicImportType == IMPORT_AS_DETECTED_INLINE) + { m_bParaWithInlineObject = true; + + // store inline images with track changes, because the anchor point + // to set redlining is not available yet + if (!m_aTextAppendStack.empty() && !m_aRedlines.top().empty() ) + { + // Remember this object is anchored to the current paragraph. + AnchoredObjectInfo aInfo; + aInfo.m_xAnchoredObject = xTextContent; + aInfo.m_xRedlineForInline = m_aRedlines.top().back(); + m_aTextAppendStack.top().m_aAnchoredObjects.push_back(aInfo); + } + + } } // Clear the reference, so in case the embedded object is inside a diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index c12d75e201fa..99d266968c72 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -420,6 +420,7 @@ struct AnchoredObjectInfo { css::uno::Reference<css::text::XTextContent> m_xAnchoredObject; sal_Int32 m_nLeftMargin = 0; + RedlineParamsPtr m_xRedlineForInline; }; /// Stores info about objects anchored to a given paragraph. diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index cc556ddc6330..9b4c819e35cb 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -1275,6 +1275,10 @@ void SectionPropertyMap::HandleIncreasedAnchoredObjectSpacing(DomainMapper_Impl& sal_Int32 nOpaqueCount = 0; for (const auto& rAnchored : rAnchor.m_aAnchoredObjects) { + // Ignore inline objects stored only for redlining. + if (rAnchored.m_xRedlineForInline) + continue; + uno::Reference<beans::XPropertySet> xShape(rAnchored.m_xAnchoredObject, uno::UNO_QUERY); if (!xShape.is()) { |