diff options
author | Pranav Kant <pranavk@collabora.co.uk> | 2017-03-14 15:27:42 +0530 |
---|---|---|
committer | pranavk <pranavk@collabora.co.uk> | 2017-03-14 14:01:30 +0000 |
commit | 1eb69f6b9c78b19d3944c90c17ff8d498affc316 (patch) | |
tree | abe4ff66996de7e75f3092bac5864a143cdad215 /sw | |
parent | fe7a5fe993dc9c1361fbf974e725451adce6eef7 (diff) |
sw lok: Notify when redline position is changed + unit test
Make RedlineNotification function a static member of SwRedlineTable
class
Change-Id: Ifbd6014198838b1106e873c9563d215e95b3572d
Reviewed-on: https://gerrit.libreoffice.org/35177
Reviewed-by: pranavk <pranavk@collabora.co.uk>
Tested-by: pranavk <pranavk@collabora.co.uk>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/docary.hxx | 6 | ||||
-rw-r--r-- | sw/qa/extras/tiledrendering/tiledrendering.cxx | 20 | ||||
-rw-r--r-- | sw/source/core/doc/docredln.cxx | 12 | ||||
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 24 |
4 files changed, 55 insertions, 7 deletions
diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx index f9aa44231eca..cc3bfb4bf1f9 100644 --- a/sw/inc/docary.hxx +++ b/sw/inc/docary.hxx @@ -313,6 +313,9 @@ struct CompareSwRedlineTable bool operator()(SwRangeRedline* const &lhs, SwRangeRedline* const &rhs) const; }; +// Notification type for notifying about redlines to LOK clients +enum class RedlineNotification { Add, Remove, Modify }; + class SwRedlineTable { public: @@ -362,6 +365,9 @@ public: vector_type::const_iterator begin() const { return maVector.begin(); } vector_type::const_iterator end() const { return maVector.end(); } void Resort() { maVector.Resort(); } + + // Notifies all LOK clients when redliens are added/modified/removed + static void LOKRedlineNotification(RedlineNotification eType, SwRedlineTable::size_type nPos, SwRangeRedline* pRedline); }; /// Table that holds 'extra' redlines, such as 'table row insert\delete', 'paragraph moves' etc... diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 0a55c6c83e2f..6fbcded9ff1f 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -1375,6 +1375,26 @@ void SwTiledRenderingTest::testRedlineUpdateCallback() // This was 0, as LOK_CALLBACK_REDLINE_TABLE_ENTRY_MODIFIED wasn't sent. CPPUNIT_ASSERT_EQUAL(1, m_nRedlineTableEntryModified); + // Turn off the change tracking mode, make some modification to left of the + // redline so that its position changes + xPropertySet->setPropertyValue("RecordChanges", uno::makeAny(false)); + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->Insert("This text is left of the redline"); + + // Position of the redline has changed => Modify callback + CPPUNIT_ASSERT_EQUAL(2, m_nRedlineTableEntryModified); + + pWrtShell->DelLeft(); + // Deletion also emits Modify callback + CPPUNIT_ASSERT_EQUAL(3, m_nRedlineTableEntryModified); + + // Make changes to the right of the redline => no position change in redline + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/false, 100/*Go enough right */, /*bBasicCall=*/false); + pWrtShell->Insert("This text is right of the redline"); + + // No Modify callbacks + CPPUNIT_ASSERT_EQUAL(3, m_nRedlineTableEntryModified); + comphelper::LibreOfficeKit::setActive(false); } diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index 6ae2e2931f3e..555cff796b59 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -60,8 +60,6 @@ using namespace com::sun::star; -enum class RedlineNotification { Add, Remove, Modify }; - #ifdef DBG_UTIL void sw_DebugRedline( const SwDoc* pDoc ) @@ -304,7 +302,7 @@ bool SwExtraRedlineTable::DeleteTableCellRedline( SwDoc* pDoc, const SwTableBox& } /// Emits LOK notification about one addition / removal of a redline item. -static void lcl_RedlineNotification(RedlineNotification nType, SwRedlineTable::size_type nPos, SwRangeRedline* pRedline) +void SwRedlineTable::LOKRedlineNotification(RedlineNotification nType, SwRedlineTable::size_type nPos, SwRangeRedline* pRedline) { if (!comphelper::LibreOfficeKit::isActive()) return; @@ -363,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(); - lcl_RedlineNotification(RedlineNotification::Add, nP, p); + LOKRedlineNotification(RedlineNotification::Add, nP, p); p->CallDisplayFunc(nP); return rv.second; } @@ -523,7 +521,7 @@ bool SwRedlineTable::Remove( const SwRangeRedline* p ) void SwRedlineTable::Remove( size_type nP ) { - lcl_RedlineNotification(RedlineNotification::Remove, nP, maVector[nP]); + LOKRedlineNotification(RedlineNotification::Remove, nP, maVector[nP]); SwDoc* pDoc = nullptr; if( !nP && 1 == size() ) pDoc = maVector.front()->GetDoc(); @@ -550,7 +548,7 @@ void SwRedlineTable::DeleteAndDestroy( size_type nP, size_type nL ) size_t nCount = 0; for( vector_type::const_iterator it = maVector.begin() + nP; it != maVector.begin() + nP + nL; ++it ) { - lcl_RedlineNotification(RedlineNotification::Remove, nP + nCount, *it); + LOKRedlineNotification(RedlineNotification::Remove, nP + nCount, *it); delete *it; ++nCount; } @@ -993,7 +991,7 @@ void SwRangeRedline::MaybeNotifyModification() { if (rRedTable[i] == this) { - lcl_RedlineNotification(RedlineNotification::Modify, i, this); + SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, i, this); break; } } diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index cf22c355e38e..c31f0b26325c 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -20,6 +20,7 @@ #include <hintids.hxx> #include <hints.hxx> +#include <comphelper/lok.hxx> #include <comphelper/string.hxx> #include <editeng/fontitem.hxx> #include <editeng/formatbreakitem.hxx> @@ -1206,6 +1207,29 @@ void SwTextNode::Update( SwSortedObjs* pSortedObjs = pContentFrame ? pContentFrame->GetDrawObjs() : nullptr; if (pSortedObjs) pSortedObjs->UpdateAll(); + + // Inform LOK clients about change in position of redlines (if any) + if (comphelper::LibreOfficeKit::isActive()) + { + const SwRedlineTable& rTable = GetDoc()->getIDocumentRedlineAccess().GetRedlineTable(); + for (SwRedlineTable::size_type nRedlnPos = 0; nRedlnPos < rTable.size(); ++nRedlnPos) + { + SwRangeRedline* pRedln = rTable[nRedlnPos]; + if (pRedln->HasMark()) + { + if (this == &pRedln->End()->nNode.GetNode() && *pRedln->GetPoint() != *pRedln->GetMark()) + { + // Redline is changed only when some change occurs before it + if (nChangePos <= pRedln->Start()->nContent.GetIndex()) + { + SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, nRedlnPos, pRedln); + } + } + } + else if (this == &pRedln->GetPoint()->nNode.GetNode()) + SwRedlineTable::LOKRedlineNotification(RedlineNotification::Modify, nRedlnPos, pRedln); + } + } } void SwTextNode::ChgTextCollUpdateNum( const SwTextFormatColl *pOldColl, |