Only show Accept/Reject Change options if relevant

In the context menu for a selection, we now only show the options
"Accept Change" and "Reject Change" if there is actually a change in
the selection. Similarly, in the toolbar, the buttons are only
enabled when there is a change in the selection.

This fixes #10338.

(cherry picked from commit 23de5e5e19)
This commit is contained in:
Scott Kostyshak 2018-05-04 18:21:54 -04:00
parent f2772678b0
commit 890fb133b1
2 changed files with 26 additions and 10 deletions

View File

@ -263,10 +263,12 @@ public:
/// look up change at given pos
Change const & lookupChange(pos_type pos) const;
/// is there a change within the given range ?
/// is there a change within the given range (does not
/// check contained paragraphs)
bool isChanged(pos_type start, pos_type end) const;
/// is there an unchanged char at the given pos ?
bool isChanged(pos_type pos) const;
/// is there an insertion at the given pos ?
bool isInserted(pos_type pos) const;
/// is there a deletion at the given pos ?

View File

@ -3195,17 +3195,31 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
case LFUN_CHANGE_ACCEPT:
case LFUN_CHANGE_REJECT:
// In principle, these LFUNs should only be enabled if there
// is a change at the current position/in the current selection.
// However, without proper optimizations, this will inevitably
// result in unacceptable performance - just imagine a user who
// wants to select the complete content of a long document.
if (!cur.selection())
enable = cur.paragraph().isChanged(cur.pos());
else
// TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
// for selections.
enable = true;
else {
// will enable if there is a change in the selection
enable = false;
// cheap improvement for efficiency: using cached
// buffer variable, if there is no change in the
// document, no need to check further.
if (!cur.buffer()->areChangesPresent())
break;
for (DocIterator it = cur.selectionBegin(); it < cur.selectionEnd(); it.forwardPar()) {
pos_type const beg = it.pos();
pos_type end;
if (it.paragraph().id() == cur.selectionEnd().paragraph().id())
end = cur.selectionEnd().pos();
else
end = it.paragraph().size();
if (beg != end && it.paragraph().isChanged(beg, end)) {
enable = true;
break;
}
}
}
break;
case LFUN_OUTLINE_UP: