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
 {

Reply via email to