sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx | 6 +- sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx | 33 ++++-------- sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx | 9 ++- sw/source/writerfilter/dmapper/PropertyMap.cxx | 27 ++++----- sw/source/writerfilter/dmapper/PropertyMap.hxx | 5 + 5 files changed, 38 insertions(+), 42 deletions(-)
New commits: commit dd87f62ed7163098c5497fa1caddfebb947e27eb Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Fri Aug 9 15:05:03 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Aug 9 17:31:20 2024 +0200 make writerfilter redlines more type-safe and pass by const& to reduce copying Change-Id: I0f21f0b0f9430571292ed2ddabd7cd2b5cc2f093 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171694 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins diff --git a/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx b/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx index 1a366dff4d2c..7bfe83fd0a37 100644 --- a/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapperTableHandler.cxx @@ -1669,11 +1669,11 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) bool bRecordChanges = m_rDMapper_Impl.GetSettingsTable()->GetRecordChanges(); if (xTextAppendAndConvert.is() && !(bInFootnote && bRecordChanges)) { - std::deque<css::uno::Any> aFramedRedlines = m_rDMapper_Impl.m_aStoredRedlines[StoredRedlines::FRAME]; + const std::deque<StoredRedline>& rFramedRedlines = m_rDMapper_Impl.m_aStoredRedlines[StoredRedlines::FRAME]; std::vector<sal_Int32> redPos, redLen; std::vector<OUString> redCell; std::vector<OUString> redTable; - BeforeConvertToTextFrame(aFramedRedlines, redPos, redLen, redCell, redTable); + BeforeConvertToTextFrame(rFramedRedlines, redPos, redLen, redCell, redTable); uno::Reference<text::XTextContent> xContent = xTextAppendAndConvert->convertToTextFrame(xStart, xEnd, comphelper::containerToSequence(aFrameProperties)); xFrameAnchor.set(xContent->getAnchor(), uno::UNO_QUERY); @@ -1722,7 +1722,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) } } - AfterConvertToTextFrame(m_rDMapper_Impl, aFramedRedlines, redPos, redLen, redCell, redTable); + AfterConvertToTextFrame(m_rDMapper_Impl, rFramedRedlines, redPos, redLen, redCell, redTable); } if (xFrameAnchor.is() && eBreakType != style::BreakType_NONE) diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx index e60ab7b12f29..57a6a306205d 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx @@ -4173,9 +4173,7 @@ void DomainMapper_Impl::CreateRedline(uno::Reference<text::XTextRange> const& xR if (eType != StoredRedlines::NONE) { - m_aStoredRedlines[eType].emplace_back(xRange); - m_aStoredRedlines[eType].emplace_back(sType); - m_aStoredRedlines[eType].emplace_back(aRedlineProperties); + m_aStoredRedlines[eType].emplace_back(StoredRedline{xRange, sType, aRedlineProperties}); } } catch( const uno::Exception & ) @@ -4299,16 +4297,15 @@ void DomainMapper_Impl::PushAnnotation() static void lcl_CopyRedlines( uno::Reference< text::XText > const& xSrc, - std::deque<css::uno::Any>& rRedlines, + const std::deque<StoredRedline>& rRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, sal_Int32& redIdx) { redIdx = -1; - for( size_t i = 0; i < rRedlines.size(); i+=3) + for( size_t i = 0; i < rRedlines.size(); i++) { - uno::Reference< text::XTextRange > xRange; - rRedlines[i] >>= xRange; + uno::Reference< text::XTextRange > xRange = rRedlines[i].mxRange; // is this a redline of the temporary footnote? uno::Reference<text::XTextCursor> xRangeCursor; @@ -4342,27 +4339,23 @@ static void lcl_CopyRedlines( static void lcl_PasteRedlines( uno::Reference< text::XText > const& xDest, - std::deque<css::uno::Any>& rRedlines, + const std::deque<StoredRedline>& rRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, sal_Int32 redIdx) { // create redlines in the copied footnote - for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx); i+=3) + for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx); i++) { - OUString sType; - beans::PropertyValues aRedlineProperties( 3 ); // skip failed createTextCursorByRange() - if (redPos[i/3] == -1) + if (redPos[i] == -1) continue; - rRedlines[i+1] >>= sType; - rRedlines[i+2] >>= aRedlineProperties; uno::Reference< text::XTextCursor > xCrsr = xDest->getText()->createTextCursor(); - xCrsr->goRight(redPos[i/3], false); - xCrsr->goRight(redLen[i/3], true); + xCrsr->goRight(redPos[i], false); + xCrsr->goRight(redLen[i], true); uno::Reference < text::XRedline > xRedline( xCrsr, uno::UNO_QUERY_THROW ); try { - xRedline->makeRedline( sType, aRedlineProperties ); + xRedline->makeRedline( rRedlines[i].msType, rRedlines[i].maRedlineProperties ); } catch(const uno::Exception&) { @@ -4392,7 +4385,7 @@ bool DomainMapper_Impl::CopyTemporaryNotes( lcl_PasteRedlines(xNoteDest, m_aStoredRedlines[eType], redPos, redLen, redIdx); // remove processed redlines - for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx) + 2; i++) + for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx); i++) m_aStoredRedlines[eType].pop_front(); return true; @@ -9636,12 +9629,12 @@ void DomainMapper_Impl::ExecuteFrameConversion() m_bIsActualParagraphFramed = false; - if (redPos.size() == m_aStoredRedlines[StoredRedlines::FRAME].size()/3) + if (redPos.size() == m_aStoredRedlines[StoredRedlines::FRAME].size()) { for( sal_Int32 i = m_aStoredRedlines[StoredRedlines::FRAME].size() - 1; i >= 0; --i) { // keep redlines of floating tables to process them in CloseSectionGroup() - if ( redPos[i/3] != -1 ) + if ( redPos[i] != -1 ) { m_aStoredRedlines[StoredRedlines::FRAME].erase(m_aStoredRedlines[StoredRedlines::FRAME].begin() + i); } diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx index 3d74d76667c7..de95d961fe5e 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx +++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx @@ -281,6 +281,13 @@ struct FieldParagraph bool m_bRemove = false; }; +struct StoredRedline +{ + css::uno::Reference<css::text::XTextRange> mxRange; + OUString msType; + css::beans::PropertyValues maRedlineProperties; +}; + /// field stack element class FieldContext : public virtual SvRefBase { @@ -1236,7 +1243,7 @@ public: /// Handle redline text portions in a frame, footnotes and redlines: /// store their data, and create them after frame creation or footnote/endnote copying bool m_bIsActualParagraphFramed; - std::deque<css::uno::Any> m_aStoredRedlines[StoredRedlines::NONE]; + std::deque<StoredRedline> m_aStoredRedlines[StoredRedlines::NONE]; bool IsParaWithInlineObject() const { return m_StreamStateStack.top().bParaWithInlineObject; } diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx b/sw/source/writerfilter/dmapper/PropertyMap.cxx index 7a3611bd6624..1d9e6280966a 100644 --- a/sw/source/writerfilter/dmapper/PropertyMap.cxx +++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx @@ -1397,14 +1397,13 @@ void SectionPropertyMap::HandleIncreasedAnchoredObjectSpacing(DomainMapper_Impl& rAnchoredObjectAnchors.clear(); } -void BeforeConvertToTextFrame(std::deque<css::uno::Any>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable) +void BeforeConvertToTextFrame(const std::deque<StoredRedline>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable) { // convert redline ranges to cursor movement and character length - for( size_t i = 0; i < rFramedRedlines.size(); i+=3) + for( size_t i = 0; i < rFramedRedlines.size(); i++) { uno::Reference<text::XText> xCell; - uno::Reference< text::XTextRange > xRange; - rFramedRedlines[i] >>= xRange; + uno::Reference< text::XTextRange > xRange = rFramedRedlines[i].mxRange; uno::Reference< beans::XPropertySet > xRangeProperties; if ( xRange.is() ) { @@ -1457,28 +1456,24 @@ void BeforeConvertToTextFrame(std::deque<css::uno::Any>& rFramedRedlines, std::v } } -void AfterConvertToTextFrame(DomainMapper_Impl& rDM_Impl, std::deque<css::uno::Any>& aFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable) +void AfterConvertToTextFrame(DomainMapper_Impl& rDM_Impl, const std::deque<StoredRedline>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable) { rtl::Reference<SwXTextDocument> xTextDocument(rDM_Impl.GetTextDocument()); uno::Reference<container::XNameAccess> xTables = xTextDocument->getTextTables(); - for( size_t i = 0; i < aFramedRedlines.size(); i+=3) + for( size_t i = 0; i < rFramedRedlines.size(); i++) { - OUString sType; - beans::PropertyValues aRedlineProperties( 3 ); // skip failed createTextCursorByRange() - if (redPos[i/3] == -1) + if (redPos[i] == -1) continue; - aFramedRedlines[i+1] >>= sType; - aFramedRedlines[i+2] >>= aRedlineProperties; - uno::Reference<text::XTextTable> xTable(xTables->getByName(redTable[i/3]), uno::UNO_QUERY); - uno::Reference<text::XText> xCell(xTable->getCellByName(redCell[i/3]), uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByName(redTable[i]), uno::UNO_QUERY); + uno::Reference<text::XText> xCell(xTable->getCellByName(redCell[i]), uno::UNO_QUERY); uno::Reference<text::XTextCursor> xCrsr = xCell->createTextCursor(); - xCrsr->goRight(redPos[i/3], false); - xCrsr->goRight(redLen[i/3], true); + xCrsr->goRight(redPos[i], false); + xCrsr->goRight(redLen[i], true); uno::Reference < text::XRedline > xRedline( xCrsr, uno::UNO_QUERY_THROW ); try { - xRedline->makeRedline( sType, aRedlineProperties ); + xRedline->makeRedline( rFramedRedlines[i].msType, rFramedRedlines[i].maRedlineProperties ); } catch (const uno::Exception&) { diff --git a/sw/source/writerfilter/dmapper/PropertyMap.hxx b/sw/source/writerfilter/dmapper/PropertyMap.hxx index a70c628c3de0..9268d32609ee 100644 --- a/sw/source/writerfilter/dmapper/PropertyMap.hxx +++ b/sw/source/writerfilter/dmapper/PropertyMap.hxx @@ -66,6 +66,7 @@ namespace writerfilter::dmapper { class DomainMapper_Impl; struct AnchoredObjectInfo; +struct StoredRedline; enum BorderPosition { @@ -439,9 +440,9 @@ public: static void removeXTextContent(css::uno::Reference<css::text::XText> const& rxText); }; -void BeforeConvertToTextFrame(std::deque<css::uno::Any>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable); +void BeforeConvertToTextFrame(const std::deque<StoredRedline>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable); -void AfterConvertToTextFrame(DomainMapper_Impl& rDM_Impl, std::deque<css::uno::Any>& aFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable); +void AfterConvertToTextFrame(DomainMapper_Impl& rDM_Impl, const std::deque<StoredRedline>& aFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable); class ParagraphProperties : public SvRefBase {