commit 890fb133b1b2349588705d32fe0c9b95eb50503a
Author: Scott Kostyshak <[email protected]>
Date:   Fri May 4 18:21:54 2018 -0400

    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 23de5e5e195f8f76aea4760f0e6999a9a4174612)
---
 src/Paragraph.h |    4 +++-
 src/Text3.cpp   |   32 +++++++++++++++++++++++---------
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/src/Paragraph.h b/src/Paragraph.h
index 31157b5..34ae917 100644
--- a/src/Paragraph.h
+++ b/src/Paragraph.h
@@ -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 ?
diff --git a/src/Text3.cpp b/src/Text3.cpp
index b86819b..e75fad0 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -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:

Reply via email to