[Libreoffice-commits] core.git: sw/inc sw/qa sw/sdi sw/source

Pranav Kant pranavk at collabora.co.uk
Fri Mar 17 10:38:27 UTC 2017


 sw/inc/docary.hxx                              |    4 +--
 sw/inc/redline.hxx                             |    6 +++-
 sw/qa/extras/tiledrendering/tiledrendering.cxx |   33 +++++++++++++++++++++++--
 sw/qa/extras/uiwriter/uiwriter.cxx             |    9 ++++--
 sw/sdi/swriter.sdi                             |    8 +++---
 sw/source/core/doc/docredln.cxx                |   28 ++++++++++++---------
 sw/source/core/txtnode/ndtxt.cxx               |    4 +--
 sw/source/uibase/shells/textfld.cxx            |   15 +++--------
 sw/source/uibase/uiview/view2.cxx              |   33 ++++++++++++++-----------
 sw/source/uibase/uno/unotxdoc.cxx              |    2 -
 10 files changed, 91 insertions(+), 51 deletions(-)

New commits:
commit 56552630fe21a143ca243807f093ebb150a2de98
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Thu Mar 16 19:33:48 2017 +0530

    sw lok: Use unique redline identifier, instead of array indices
    
    Use a static integer counter as identifier to each redline
    
    Change few unit-tets that was testing redlines by using a hardcoded array
    index. Instead use these unique redline identifiers now.
    
    Change-Id: I63aec3fc8ab10d0dad0c936600d16e96999a2bcd
    Reviewed-on: https://gerrit.libreoffice.org/35276
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx
index fc67aa5018d6..4a95ac409512 100644
--- a/sw/inc/docary.hxx
+++ b/sw/inc/docary.hxx
@@ -366,8 +366,8 @@ public:
     vector_type::const_iterator end() const { return maVector.end(); }
     void                        Resort() { maVector.Resort(); }
 
-    // Notifies all LOK clients when redlines are added/modified/removed
-    static void                 LOKRedlineNotification(RedlineNotification eType, SwRedlineTable::size_type nPos, SwRangeRedline* pRedline);
+    // Notifies all LOK clients when redliens are added/modified/removed
+    static void                 LOKRedlineNotification(RedlineNotification eType, SwRangeRedline* pRedline);
 };
 
 /// Table that holds 'extra' redlines, such as 'table row insert\delete', 'paragraph moves' etc...
diff --git a/sw/inc/redline.hxx b/sw/inc/redline.hxx
index b75b666ae8a6..688cd1797c9d 100644
--- a/sw/inc/redline.hxx
+++ b/sw/inc/redline.hxx
@@ -173,6 +173,7 @@ class SW_DLLPUBLIC SwRangeRedline : public SwPaM
     SwNodeIndex* pContentSect;
     bool bDelLastPara : 1;
     bool bIsVisible : 1;
+    sal_uInt32 m_nId;
 
     void MoveToSection();
     void CopyToSection();
@@ -180,6 +181,8 @@ class SW_DLLPUBLIC SwRangeRedline : public SwPaM
     void MoveFromSection(size_t nMyPos);
 
 public:
+    static sal_uInt32 m_nLastId;
+
     SwRangeRedline( RedlineType_t eType, const SwPaM& rPam );
     SwRangeRedline( const SwRedlineData& rData, const SwPaM& rPam );
     SwRangeRedline( const SwRedlineData& rData, const SwPosition& rPos );
@@ -187,11 +190,12 @@ public:
     SwRangeRedline(SwRedlineData* pData, const SwPosition& rPos,
                bool bDelLP) :
         SwPaM( rPos ), pRedlineData( pData ), pContentSect( nullptr ),
-        bDelLastPara( bDelLP ), bIsVisible( true )
+        bDelLastPara( bDelLP ), bIsVisible( true ), m_nId( m_nLastId++ )
     {}
     SwRangeRedline( const SwRangeRedline& );
     virtual ~SwRangeRedline() override;
 
+    sal_uInt32 GetId() const { return m_nId; }
     SwNodeIndex* GetContentIdx() const { return pContentSect; }
     // For Undo.
     void SetContentIdx( const SwNodeIndex* );
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index a4275ff25d30..c07f9fb46772 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -31,6 +31,8 @@
 #include <cmdid.h>
 #include <sfx2/viewsh.hxx>
 #include <sfx2/lokhelper.hxx>
+#include <redline.hxx>
+#include <IDocumentRedlineAccess.hxx>
 
 static const char* const DATA_DIRECTORY = "/sw/qa/extras/tiledrendering/data/";
 
@@ -651,6 +653,10 @@ public:
     bool m_bViewLock;
     /// Set if any callback was invoked.
     bool m_bCalled;
+    /// Redline table size changed payload
+    boost::property_tree::ptree m_aRedlineTableChanged;
+    /// Redline table modified payload
+    boost::property_tree::ptree m_aRedlineTableModified;
 
     ViewCallback()
         : m_bOwnCursorInvalidated(false),
@@ -757,6 +763,22 @@ public:
             m_bViewLock = aTree.get_child("rectangle").get_value<std::string>() != "EMPTY";
         }
         break;
+        case LOK_CALLBACK_REDLINE_TABLE_SIZE_CHANGED:
+        {
+            m_aRedlineTableChanged.clear();
+            std::stringstream aStream(pPayload);
+            boost::property_tree::read_json(aStream, m_aRedlineTableChanged);
+            m_aRedlineTableChanged = m_aRedlineTableChanged.get_child("redline");
+        }
+        break;
+        case LOK_CALLBACK_REDLINE_TABLE_ENTRY_MODIFIED:
+        {
+            m_aRedlineTableModified.clear();
+            std::stringstream aStream(pPayload);
+            boost::property_tree::read_json(aStream, m_aRedlineTableModified);
+            m_aRedlineTableModified = m_aRedlineTableModified.get_child("redline");
+        }
+        break;
         }
     }
 };
@@ -1305,15 +1327,22 @@ void SwTiledRenderingTest::testTrackChanges()
     // Turn on trak changes, type "zzz" at the end, and move to the start.
     uno::Reference<beans::XPropertySet> xPropertySet(mxComponent, uno::UNO_QUERY);
     xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(true));
+    ViewCallback aView;
     SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell();
+    pWrtShell->GetSfxViewShell()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView);
     pWrtShell->EndDoc();
     pWrtShell->Insert("zzz");
     pWrtShell->SttDoc();
 
-    // Reject the change by index, while the cursor does not cover the tracked change.
+    // Get the redline just created
+    const SwRedlineTable& rTable = pWrtShell->GetDoc()->getIDocumentRedlineAccess().GetRedlineTable();
+    CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(1), rTable.size());
+    SwRangeRedline* pRedline = rTable[0];
+
+    // Reject the change by id, while the cursor does not cover the tracked change.
     uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
     {
-        {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(0))}
+        {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(pRedline->GetId()))}
     }));
     comphelper::dispatchCommand(".uno:RejectTrackedChange", aPropertyValues);
     Scheduler::ProcessEventsToIdle();
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index d906f3f56228..aec4b5e00a77 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -4120,11 +4120,14 @@ void SwUiWriterTest::testRedlineParam()
     pWrtShell->EndDoc();
     pWrtShell->Insert("zzz");
 
+    const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
+    CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(2), rTable.size());
+
     // Select the first redline.
     pWrtShell->SttDoc();
     uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
     {
-        {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(0))}
+        {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(rTable[0]->GetId()))}
     }));
     lcl_dispatchCommand(mxComponent, ".uno:NextTrackedChange", aPropertyValues);
     Scheduler::ProcessEventsToIdle();
@@ -4137,7 +4140,7 @@ void SwUiWriterTest::testRedlineParam()
     pWrtShell->SttDoc();
     aPropertyValues = comphelper::InitPropertySequence(
     {
-        {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(1))}
+        {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(rTable[1]->GetId()))}
     });
     lcl_dispatchCommand(mxComponent, ".uno:NextTrackedChange", aPropertyValues);
     Scheduler::ProcessEventsToIdle();
@@ -4148,7 +4151,7 @@ void SwUiWriterTest::testRedlineParam()
     pWrtShell->SttDoc();
     aPropertyValues = comphelper::InitPropertySequence(
     {
-        {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(1))}
+        {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(rTable[1]->GetId()))}
     });
     lcl_dispatchCommand(mxComponent, ".uno:RejectTrackedChange", aPropertyValues);
     Scheduler::ProcessEventsToIdle();
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index e9ac67777e5f..25a9493ed6e3 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -663,7 +663,7 @@ SfxVoidItem ClosePreview FN_CLOSE_PAGEPREVIEW
 ]
 
 SfxVoidItem CommentChangeTracking FN_REDLINE_COMMENT
-(SfxUInt16Item ChangeTrackingId FN_REDLINE_COMMENT,SvxPostItTextItem Text SID_ATTR_POSTIT_TEXT)
+(SfxUInt32Item ChangeTrackingId FN_REDLINE_COMMENT,SvxPostItTextItem Text SID_ATTR_POSTIT_TEXT)
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
@@ -7288,7 +7288,7 @@ SfxBoolItem SpellingAndGrammarDialog FN_SPELL_GRAMMAR_DIALOG
 ]
 
 SfxVoidItem AcceptTrackedChange FN_REDLINE_ACCEPT_DIRECT
-( SfxUInt16Item AcceptTrackedChange FN_REDLINE_ACCEPT_DIRECT )
+( SfxUInt32Item AcceptTrackedChange FN_REDLINE_ACCEPT_DIRECT )
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
@@ -7307,7 +7307,7 @@ SfxVoidItem AcceptTrackedChange FN_REDLINE_ACCEPT_DIRECT
 ]
 
 SfxVoidItem RejectTrackedChange FN_REDLINE_REJECT_DIRECT
-( SfxUInt16Item RejectTrackedChange FN_REDLINE_REJECT_DIRECT )
+( SfxUInt32Item RejectTrackedChange FN_REDLINE_REJECT_DIRECT )
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
@@ -7326,7 +7326,7 @@ SfxVoidItem RejectTrackedChange FN_REDLINE_REJECT_DIRECT
 ]
 
 SfxVoidItem NextTrackedChange FN_REDLINE_NEXT_CHANGE
-( SfxUInt16Item NextTrackedChange FN_REDLINE_NEXT_CHANGE )
+( SfxUInt32Item NextTrackedChange FN_REDLINE_NEXT_CHANGE )
 [
     AutoUpdate = FALSE,
     FastCall = FALSE,
diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx
index 8a485d5c9f5d..a8fc41eda758 100644
--- a/sw/source/core/doc/docredln.cxx
+++ b/sw/source/core/doc/docredln.cxx
@@ -302,7 +302,7 @@ bool SwExtraRedlineTable::DeleteTableCellRedline( SwDoc* pDoc, const SwTableBox&
 }
 
 /// Emits LOK notification about one addition / removal of a redline item.
-void SwRedlineTable::LOKRedlineNotification(RedlineNotification nType, SwRedlineTable::size_type nPos, SwRangeRedline* pRedline)
+void SwRedlineTable::LOKRedlineNotification(RedlineNotification nType, SwRangeRedline* pRedline)
 {
     if (!comphelper::LibreOfficeKit::isActive())
         return;
@@ -311,7 +311,7 @@ void SwRedlineTable::LOKRedlineNotification(RedlineNotification nType, SwRedline
     aRedline.put("action", (nType == RedlineNotification::Add ? "Add" :
                             (nType == RedlineNotification::Remove ? "Remove" :
                              (nType == RedlineNotification::Modify ? "Modify" : "???"))));
-    aRedline.put("index", nPos);
+    aRedline.put("index", pRedline->GetId());
     aRedline.put("author", pRedline->GetAuthorString(1).toUtf8().getStr());
     aRedline.put("type", nsRedlineType_t::SwRedlineTypeToOUString(pRedline->GetRedlineData().GetType()).toUtf8().getStr());
     aRedline.put("comment", pRedline->GetRedlineData().GetComment().toUtf8().getStr());
@@ -361,7 +361,7 @@ bool SwRedlineTable::Insert( SwRangeRedline* p )
     {
         std::pair<vector_type::const_iterator, bool> rv = maVector.insert( p );
         size_type nP = rv.first - begin();
-        LOKRedlineNotification(RedlineNotification::Add, nP, p);
+        LOKRedlineNotification(RedlineNotification::Add, p);
         p->CallDisplayFunc(nP);
         return rv.second;
     }
@@ -521,7 +521,7 @@ bool SwRedlineTable::Remove( const SwRangeRedline* p )
 
 void SwRedlineTable::Remove( size_type nP )
 {
-    LOKRedlineNotification(RedlineNotification::Remove, nP, maVector[nP]);
+    LOKRedlineNotification(RedlineNotification::Remove, maVector[nP]);
     SwDoc* pDoc = nullptr;
     if( !nP && 1 == size() )
         pDoc = maVector.front()->GetDoc();
@@ -545,12 +545,10 @@ void SwRedlineTable::DeleteAndDestroy( size_type nP, size_type nL )
     if( !nP && nL && nL == size() )
         pDoc = maVector.front()->GetDoc();
 
-    size_t nCount = 0;
     for( vector_type::const_iterator it = maVector.begin() + nP; it != maVector.begin() + nP + nL; ++it )
     {
-        LOKRedlineNotification(RedlineNotification::Remove, nP + nCount, *it);
+        LOKRedlineNotification(RedlineNotification::Remove, *it);
         delete *it;
-        ++nCount;
     }
     maVector.erase( maVector.begin() + nP, maVector.begin() + nP + nL );
 
@@ -927,10 +925,13 @@ OUString SwRedlineData::GetDescr() const
     return SW_RES(STR_REDLINE_INSERT + GetType());
 }
 
+sal_uInt32 SwRangeRedline::m_nLastId = 1;
+
 SwRangeRedline::SwRangeRedline(RedlineType_t eTyp, const SwPaM& rPam )
     : SwPaM( *rPam.GetMark(), *rPam.GetPoint() ),
     pRedlineData( new SwRedlineData( eTyp, GetDoc()->getIDocumentRedlineAccess().GetRedlineAuthor() ) ),
-    pContentSect( nullptr )
+    pContentSect( nullptr ),
+    m_nId( m_nLastId++ )
 {
     bDelLastPara = false;
     bIsVisible = true;
@@ -941,7 +942,8 @@ SwRangeRedline::SwRangeRedline(RedlineType_t eTyp, const SwPaM& rPam )
 SwRangeRedline::SwRangeRedline( const SwRedlineData& rData, const SwPaM& rPam )
     : SwPaM( *rPam.GetMark(), *rPam.GetPoint() ),
     pRedlineData( new SwRedlineData( rData )),
-    pContentSect( nullptr )
+    pContentSect( nullptr ),
+    m_nId( m_nLastId++ )
 {
     bDelLastPara = false;
     bIsVisible = true;
@@ -952,7 +954,8 @@ SwRangeRedline::SwRangeRedline( const SwRedlineData& rData, const SwPaM& rPam )
 SwRangeRedline::SwRangeRedline( const SwRedlineData& rData, const SwPosition& rPos )
     : SwPaM( rPos ),
     pRedlineData( new SwRedlineData( rData )),
-    pContentSect( nullptr )
+    pContentSect( nullptr ),
+    m_nId( m_nLastId++ )
 {
     bDelLastPara = false;
     bIsVisible = true;
@@ -961,7 +964,8 @@ SwRangeRedline::SwRangeRedline( const SwRedlineData& rData, const SwPosition& rP
 SwRangeRedline::SwRangeRedline( const SwRangeRedline& rCpy )
     : SwPaM( *rCpy.GetMark(), *rCpy.GetPoint() ),
     pRedlineData( new SwRedlineData( *rCpy.pRedlineData )),
-    pContentSect( nullptr )
+    pContentSect( nullptr ),
+    m_nId( rCpy.m_nId )
 {
     bDelLastPara = false;
     bIsVisible = true;
@@ -991,7 +995,7 @@ void SwRangeRedline::MaybeNotifyModification()
     {
         if (rRedTable[i] == this)
         {
-            SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, i, this);
+            SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, this);
             break;
         }
     }
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 94d33494610d..22264c339ccc 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -1222,12 +1222,12 @@ void SwTextNode::Update(
                     // Redline is changed only when some change occurs before it
                     if (nChangePos <= pRedln->Start()->nContent.GetIndex())
                     {
-                        SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, nRedlnPos, pRedln);
+                        SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, pRedln);
                     }
                 }
             }
             else if (this == &pRedln->GetPoint()->nNode.GetNode())
-                SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, nRedlnPos, pRedln);
+                SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, pRedln);
         }
     }
 }
diff --git a/sw/source/uibase/shells/textfld.cxx b/sw/source/uibase/shells/textfld.cxx
index b333f5fc4e6f..8b769879ee07 100644
--- a/sw/source/uibase/shells/textfld.cxx
+++ b/sw/source/uibase/shells/textfld.cxx
@@ -511,19 +511,14 @@ void SwTextShell::ExecField(SfxRequest &rReq)
 
                 const SwRangeRedline *pRedline = rSh.GetCurrRedline();
                 SwDoc *pDoc = rSh.GetDoc();
-                SwRedlineTable::size_type nRedline = SwRedlineTable::npos;
+                // If index is specified, goto and select the appropriate redline
                 if (pArgs && pArgs->GetItemState(nSlot, false, &pItem) == SfxItemState::SET)
                 {
-                    //TODO: SfxUInt16Item vs. SwRedlineTable::size_type mismatch:
-                    nRedline = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
-                    if (nRedline == USHRT_MAX)
-                        nRedline = SwRedlineTable::npos;
-
-                    if (nRedline != SwRedlineTable::npos)
+                    const sal_uInt32 nChangeId = static_cast<const SfxUInt32Item*>(pItem)->GetValue();
+                    const SwRedlineTable& rRedlineTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
+                    for (SwRedlineTable::size_type nRedline = 0; nRedline < rRedlineTable.size(); ++nRedline)
                     {
-                        // If index is specified, goto and select the appropriate redline
-                        const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
-                        if (nRedline < rTable.size())
+                        if (nChangeId == rRedlineTable[nRedline]->GetId())
                             pRedline = rSh.GotoRedline(nRedline, true);
                     }
                 }
diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx
index 7b534fdc0f7a..d64523fbd6d5 100644
--- a/sw/source/uibase/uiview/view2.cxx
+++ b/sw/source/uibase/uiview/view2.cxx
@@ -663,13 +663,16 @@ void SwView::Execute(SfxRequest &rReq)
         {
             SwDoc *pDoc = m_pWrtShell->GetDoc();
             SwPaM *pCursor = m_pWrtShell->GetCursor();
+            const SwRedlineTable& rRedlineTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
             SwRedlineTable::size_type nRedline = SwRedlineTable::npos;
             if (pArgs && pArgs->GetItemState(nSlot, false, &pItem) == SfxItemState::SET)
             {
-                //TODO: SfxUInt16Item vs. SwRedlineTable::size_type mismatch:
-                nRedline = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
-                if (nRedline == USHRT_MAX)
-                    nRedline = SwRedlineTable::npos;
+                const sal_Int64 nChangeId = static_cast<const SfxUInt32Item*>(pItem)->GetValue();
+                for (SwRedlineTable::size_type i = 0; i < rRedlineTable.size(); ++i)
+                {
+                    if (nChangeId == rRedlineTable[i]->GetId())
+                        nRedline = i;
+                }
             }
 
             if( pCursor->HasMark() && nRedline == SwRedlineTable::npos)
@@ -690,9 +693,9 @@ void SwView::Execute(SfxRequest &rReq)
                 {
                     // A redline was explicitly requested by specifying an
                     // index, don't guess based on the cursor position.
-                    const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
-                    if (nRedline < rTable.size())
-                        pRedline = rTable[nRedline];
+
+                    if (nRedline < rRedlineTable.size())
+                        pRedline = rRedlineTable[nRedline];
                 }
                 else
                     pRedline = pDoc->getIDocumentRedlineAccess().GetRedline(*pCursor->Start(), &nRedline);
@@ -713,20 +716,22 @@ void SwView::Execute(SfxRequest &rReq)
         {
             // If a parameter is provided, try going to the nth change, not to
             // the next one.
+            SwDoc* pDoc = m_pWrtShell->GetDoc();
+            const SwRedlineTable& rRedlineTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
             SwRedlineTable::size_type nRedline = SwRedlineTable::npos;
             if (pArgs && pArgs->GetItemState(nSlot, false, &pItem) == SfxItemState::SET)
             {
-                //TODO: SfxUInt16Item vs. SwRedlineTable::size_type mismatch:
-                nRedline = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
-                if (nRedline == USHRT_MAX)
-                    nRedline = SwRedlineTable::npos;
+                const sal_uInt32 nChangeId = static_cast<const SfxUInt32Item*>(pItem)->GetValue();
+                for (SwRedlineTable::size_type i = 0; i < rRedlineTable.size(); ++i)
+                {
+                    if (nChangeId == rRedlineTable[i]->GetId())
+                        nRedline = i;
+                }
             }
 
             const SwRangeRedline *pCurrent = m_pWrtShell->GetCurrRedline();
-            SwDoc* pDoc = m_pWrtShell->GetDoc();
-            const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
             const SwRangeRedline *pNext = nullptr;
-            if (nRedline < rTable.size())
+            if (nRedline < rRedlineTable.size())
                 pNext = m_pWrtShell->GotoRedline(nRedline, true);
             else
                 pNext = m_pWrtShell->SelNextRedline();
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index de8057e21640..a93469fb96f0 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3187,7 +3187,7 @@ OUString SwXTextDocument::getTrackedChanges()
     for (SwRedlineTable::size_type i = 0; i < rRedlineTable.size(); ++i)
     {
         boost::property_tree::ptree aTrackedChange;
-        aTrackedChange.put("index", i);
+        aTrackedChange.put("index", rRedlineTable[i]->GetId());
         aTrackedChange.put("author", rRedlineTable[i]->GetAuthorString(1).toUtf8().getStr());
         aTrackedChange.put("type", nsRedlineType_t::SwRedlineTypeToOUString(rRedlineTable[i]->GetRedlineData().GetType()).toUtf8().getStr());
         aTrackedChange.put("comment", rRedlineTable[i]->GetRedlineData().GetComment().toUtf8().getStr());


More information about the Libreoffice-commits mailing list