summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx9
-rw-r--r--sw/qa/extras/uiwriter/uiwriter.cxx30
-rw-r--r--sw/sdi/swriter.sdi1
-rw-r--r--sw/source/uibase/uiview/view2.cxx16
4 files changed, 49 insertions, 7 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index 97b3350f34aa..2576f9904ff7 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -482,6 +482,8 @@ static void documentRedline(GtkWidget* pButton, gpointer /*pItem*/)
GTK_RESPONSE_YES,
"Reject",
GTK_RESPONSE_NO,
+ "Jump",
+ GTK_RESPONSE_APPLY,
nullptr);
GtkWidget* pContentArea = gtk_dialog_get_content_area(GTK_DIALOG (pDialog));
@@ -518,7 +520,7 @@ static void documentRedline(GtkWidget* pButton, gpointer /*pItem*/)
gint res = gtk_dialog_run(GTK_DIALOG(pDialog));
// Dispatch the matching command, if necessary.
- if (res == GTK_RESPONSE_YES || res == GTK_RESPONSE_NO)
+ if (res == GTK_RESPONSE_YES || res == GTK_RESPONSE_NO || res == GTK_RESPONSE_APPLY)
{
GtkTreeSelection* pSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pTreeView));
GtkTreeIter aTreeIter;
@@ -531,8 +533,11 @@ static void documentRedline(GtkWidget* pButton, gpointer /*pItem*/)
std::string aCommand;
if (res == GTK_RESPONSE_YES)
aCommand = ".uno:AcceptTrackedChange";
- else
+ else if (res == GTK_RESPONSE_NO)
aCommand = ".uno:RejectTrackedChange";
+ else
+ // Just select the given redline, don't accept or reject it.
+ aCommand = ".uno:NextTrackedChange";
// Without the '.uno:' prefix.
std::string aKey = aCommand.substr(strlen(".uno:"));
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 8d0ed48feb03..5080f375070d 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -3853,15 +3853,39 @@ void SwUiWriterTest::testRedlineParam()
pWrtShell->EndDoc();
pWrtShell->Insert("zzz");
- // Move the cursor to the start again, and reject the second change.
+ // Select the first redline.
pWrtShell->SttDoc();
uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
{
- {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(1))}
+ {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(0))}
}));
- lcl_dispatchCommand(mxComponent, ".uno:RejectTrackedChange", aPropertyValues);
+ lcl_dispatchCommand(mxComponent, ".uno:NextTrackedChange", aPropertyValues);
Scheduler::ProcessEventsToIdle();
SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false);
+ // This failed: the parameter wasn't handled so the next change (zzz) was
+ // selected, not the first one (aaa).
+ CPPUNIT_ASSERT_EQUAL(OUString("aaa"), pShellCursor->GetText());
+
+ // Select the second redline.
+ pWrtShell->SttDoc();
+ aPropertyValues = comphelper::InitPropertySequence(
+ {
+ {"NextTrackedChange", uno::makeAny(static_cast<sal_uInt16>(1))}
+ });
+ lcl_dispatchCommand(mxComponent, ".uno:NextTrackedChange", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+ pShellCursor = pWrtShell->getShellCursor(false);
+ CPPUNIT_ASSERT_EQUAL(OUString("zzz"), pShellCursor->GetText());
+
+ // Move the cursor to the start again, and reject the second change.
+ pWrtShell->SttDoc();
+ aPropertyValues = comphelper::InitPropertySequence(
+ {
+ {"RejectTrackedChange", uno::makeAny(static_cast<sal_uInt16>(1))}
+ });
+ lcl_dispatchCommand(mxComponent, ".uno:RejectTrackedChange", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+ pShellCursor = pWrtShell->getShellCursor(false);
// This was 'middlezzz', the uno command rejected the redline under the
// cursor, instead of the requested one.
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index 96a05e149ff1..c5c65688c47a 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -7272,6 +7272,7 @@ SfxVoidItem RejectTrackedChange FN_REDLINE_REJECT_DIRECT
]
SfxVoidItem NextTrackedChange FN_REDLINE_NEXT_CHANGE
+( SfxUInt16Item NextTrackedChange FN_REDLINE_NEXT_CHANGE )
[
AutoUpdate = FALSE,
FastCall = FALSE,
diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx
index 366641a76066..5d200aef812b 100644
--- a/sw/source/uibase/uiview/view2.cxx
+++ b/sw/source/uibase/uiview/view2.cxx
@@ -709,8 +709,20 @@ void SwView::Execute(SfxRequest &rReq)
case FN_REDLINE_NEXT_CHANGE:
{
+ // If a parameter is provided, try going to the nth change, not to
+ // the next one.
+ sal_uInt16 nRedline = USHRT_MAX;
+ if (pArgs && pArgs->GetItemState(nSlot, false, &pItem) == SfxItemState::SET)
+ nRedline = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
+
const SwRangeRedline *pCurrent = m_pWrtShell->GetCurrRedline();
- const SwRangeRedline *pNext = m_pWrtShell->SelNextRedline();
+ SwDoc* pDoc = m_pWrtShell->GetDoc();
+ const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable();
+ const SwRangeRedline *pNext = nullptr;
+ if (nRedline < rTable.size())
+ pNext = m_pWrtShell->GotoRedline(nRedline, true);
+ else
+ pNext = m_pWrtShell->SelNextRedline();
// FN_REDLINE_PREV_CHANGE leaves the selection point at the start of the redline.
// In such cases, SelNextRedline (which starts searching from the selection point)
@@ -718,7 +730,7 @@ void SwView::Execute(SfxRequest &rReq)
// This behavior means that PREV_CHANGE followed by NEXT_CHANGE would not change
// the current redline, so we detect it and select the next redline again.
- if (pCurrent && pCurrent == pNext)
+ if (pCurrent && pCurrent == pNext && nRedline == USHRT_MAX)
pNext = m_pWrtShell->SelNextRedline();
if (pNext)