commit c0a425a319d2ea5f6c54d6bafcc0e00be7f1a1dd
Author: Juergen Spitzmueller <[email protected]>
Date:   Wed Sep 14 10:23:39 2016 +0200

    Move wrap check for simple search/replace to lyxfind
    
    This gets rid of some dirty dispatch tricks and fixes wrap-around
    on replace and in the spellchecker
    
    Fixes: #10378
---
 src/BufferView.cpp                    |   22 ++--------------
 src/frontends/qt4/GuiSearch.cpp       |   41 +-----------------------------
 src/frontends/qt4/GuiSearch.h         |    3 --
 src/frontends/qt4/GuiSpellchecker.cpp |    4 ++-
 src/lyxfind.cpp                       |   44 +++++++++++++++++++++++++++------
 5 files changed, 44 insertions(+), 70 deletions(-)

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 0212b16..fa95d40 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -1523,14 +1523,8 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                docstring const data =
                        find2string(searched_string, true, false, fw);
                bool found = lyxfind(this, FuncRequest(LFUN_WORD_FIND, data));
-               if (found) {
+               if (found)
                        dr.screenUpdate(Update::Force | Update::FitCursor);
-                       cur.dispatched();
-                       dispatched = true;
-               } else {
-                       cur.undispatched();
-                       dispatched = false;
-               }
                break;
        }
 
@@ -1542,14 +1536,9 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                        lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, 
"findreplace"));
                        break;
                }
-               if (lyxfind(this, req)) {
+               if (lyxfind(this, req))
                        dr.screenUpdate(Update::Force | Update::FitCursor);
-                       cur.dispatched();
-                       dispatched = true;
-               } else {
-                       cur.undispatched();
-                       dispatched = false;
-               }
+
                d->search_request_cache_ = req;
                break;
        }
@@ -1571,11 +1560,6 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                if (lyxreplace(this, cmd, has_deleted)) {
                        dr.forceBufferUpdate();
                        dr.screenUpdate(Update::Force | Update::FitCursor);
-                       cur.dispatched();
-                       dispatched = true;
-               } else {
-                       cur.undispatched();
-                       dispatched = false;
                }
                break;
        }
diff --git a/src/frontends/qt4/GuiSearch.cpp b/src/frontends/qt4/GuiSearch.cpp
index 7124647..411ba2e 100644
--- a/src/frontends/qt4/GuiSearch.cpp
+++ b/src/frontends/qt4/GuiSearch.cpp
@@ -120,49 +120,12 @@ void GuiSearch::replaceallClicked()
 }
 
 
-void GuiSearch::wrap_dispatch(const FuncRequest & func, bool forward)
-{
-       dispatch(func);
-
-       BufferView * bv = const_cast<BufferView *>(bufferview());
-
-       if (!bv->cursor().result().dispatched()) {
-               GuiView & lv = *const_cast<GuiView *>(&lyxview());
-               DocIterator cur_orig(bv->cursor());
-               docstring q;
-               if (forward)
-                       q = _("End of file reached while searching forward.\n"
-                         "Continue searching from the beginning?");
-               else
-                       q = _("Beginning of file reached while searching 
backward.\n"
-                         "Continue searching from the end?");
-               int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
-                       q, 0, 1, _("&Yes"), _("&No"));
-               if (wrap_answer == 0) {
-                       if (forward) {
-                               bv->cursor().clear();
-                               
bv->cursor().push_back(CursorSlice(bv->buffer().inset()));
-                       } else {
-                               
bv->cursor().setCursor(doc_iterator_end(&bv->buffer()));
-                               bv->cursor().backwardPos();
-                       }
-                       bv->clearSelection();
-                       dispatch(func);
-                       if (bv->cursor().result().dispatched())
-                               return;
-               }
-               bv->cursor().setCursor(cur_orig);
-               lv.message(_("String not found."));
-       }
-}
-
-
 void GuiSearch::find(docstring const & search, bool casesensitive,
                         bool matchword, bool forward)
 {
        docstring const data =
                find2string(search, casesensitive, matchword, forward);
-       wrap_dispatch(FuncRequest(LFUN_WORD_FIND, data), forward);
+       dispatch(FuncRequest(LFUN_WORD_FIND, data));
 }
 
 
@@ -173,7 +136,7 @@ void GuiSearch::replace(docstring const & search, docstring 
const & replace,
        docstring const data =
                replace2string(replace, search, casesensitive,
                                     matchword, all, forward);
-       wrap_dispatch(FuncRequest(LFUN_WORD_REPLACE, data), forward);
+       dispatch(FuncRequest(LFUN_WORD_REPLACE, data));
 }
 
 
diff --git a/src/frontends/qt4/GuiSearch.h b/src/frontends/qt4/GuiSearch.h
index bd82319..b565553 100644
--- a/src/frontends/qt4/GuiSearch.h
+++ b/src/frontends/qt4/GuiSearch.h
@@ -40,9 +40,6 @@ private:
        void dispatchParams() {}
        bool isBufferDependent() const { return true; }
 
-       /// Dispatches repeatedly func with wrap around question
-       void wrap_dispatch(const FuncRequest & func, bool forward);
-
        /// Searches occurence of string
        void find(docstring const & search,
                  bool casesensitive, bool matchword, bool forward);
diff --git a/src/frontends/qt4/GuiSpellchecker.cpp 
b/src/frontends/qt4/GuiSpellchecker.cpp
index 24aa43d..cbdf4f4 100644
--- a/src/frontends/qt4/GuiSpellchecker.cpp
+++ b/src/frontends/qt4/GuiSpellchecker.cpp
@@ -346,7 +346,7 @@ void SpellcheckerWidget::Private::setSelection(
                int const size = end.pos() - from.pos();
                bv->putSelectionAt(from, size, false);
        }
-       bv->processUpdateFlags(Update::Force | Update::FitCursor);      
+       bv->processUpdateFlags(Update::Force | Update::FitCursor);
 }
 
 void SpellcheckerWidget::Private::forward()
@@ -490,6 +490,8 @@ void SpellcheckerWidget::on_replaceAllPB_clicked()
        LYXERR(Debug::GUI, "Replace all (" << replacement << ")");
        dispatch(FuncRequest(LFUN_WORD_REPLACE, datastring));
        d->forward();
+       // replace all wraps around
+       d->wrapAround(true);
        d->check(); // continue spellchecking
        d->canCheck();
 }
diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
index cc8d1cf..92f9be1 100644
--- a/src/lyxfind.cpp
+++ b/src/lyxfind.cpp
@@ -132,7 +132,8 @@ bool searchAllowed(docstring const & str)
 
 
 bool findOne(BufferView * bv, docstring const & searchstr,
-            bool case_sens, bool whole, bool forward, bool find_del = true)
+            bool case_sens, bool whole, bool forward,
+            bool find_del = true, bool check_wrap = false)
 {
        if (!searchAllowed(searchstr))
                return false;
@@ -149,6 +150,32 @@ bool findOne(BufferView * bv, docstring const & searchstr,
 
        if (match_len > 0)
                bv->putSelectionAt(cur, match_len, !forward);
+       else if (check_wrap) {
+               DocIterator cur_orig(bv->cursor());
+               docstring q;
+               if (forward)
+                       q = _("End of file reached while searching forward.\n"
+                         "Continue searching from the beginning?");
+               else
+                       q = _("Beginning of file reached while searching 
backward.\n"
+                         "Continue searching from the end?");
+               int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
+                       q, 0, 1, _("&Yes"), _("&No"));
+               if (wrap_answer == 0) {
+                       if (forward) {
+                               bv->cursor().clear();
+                               
bv->cursor().push_back(CursorSlice(bv->buffer().inset()));
+                       } else {
+                               
bv->cursor().setCursor(doc_iterator_end(&bv->buffer()));
+                               bv->cursor().backwardPos();
+                       }
+                       bv->clearSelection();
+                       if (findOne(bv, searchstr, case_sens, whole, forward, 
find_del, false))
+                               return true;
+               }
+               bv->cursor().setCursor(cur_orig);
+               return false;
+       }
 
        return match_len > 0;
 }
@@ -221,11 +248,12 @@ pair<bool, int> replaceOne(BufferView * bv, docstring 
searchstr,
                           bool whole, bool forward, bool findnext)
 {
        Cursor & cur = bv->cursor();
+       bool found = false;
        if (!cur.selection()) {
                // no selection, non-empty search string: find it
                if (!searchstr.empty()) {
-                       findOne(bv, searchstr, case_sens, whole, forward);
-                       return make_pair(true, 0);
+                       found = findOne(bv, searchstr, case_sens, whole, 
forward, true, findnext);
+                       return make_pair(found, 0);
                }
                // empty search string
                if (!cur.inTexted())
@@ -253,8 +281,8 @@ pair<bool, int> replaceOne(BufferView * bv, docstring 
searchstr,
        // no selection or current selection is not search word:
        // just find the search word
        if (!have_selection || !match) {
-               findOne(bv, searchstr, case_sens, whole, forward);
-               return make_pair(true, 0);
+               found = findOne(bv, searchstr, case_sens, whole, forward, true, 
findnext);
+               return make_pair(found, 0);
        }
 
        // we're now actually ready to replace. if the buffer is
@@ -269,7 +297,7 @@ pair<bool, int> replaceOne(BufferView * bv, docstring 
searchstr,
                        cur.pos() = cur.lastpos());
        }
        if (findnext)
-               findOne(bv, searchstr, case_sens, whole, forward, false);
+               findOne(bv, searchstr, case_sens, whole, forward, false, 
findnext);
 
        return make_pair(true, 1);
 }
@@ -323,7 +351,7 @@ bool lyxfind(BufferView * bv, FuncRequest const & ev)
        bool matchword     = parse_bool(howto);
        bool forward       = parse_bool(howto);
 
-       return findOne(bv, search, casesensitive, matchword, forward);
+       return findOne(bv, search, casesensitive, matchword, forward, true, 
true);
 }
 
 
@@ -380,7 +408,7 @@ bool lyxreplace(BufferView * bv,
        } else if (findnext) {
                // if we have deleted characters, we do not replace at all, but
                // rather search for the next occurence
-               if (findOne(bv, search, casesensitive, matchword, forward))
+               if (findOne(bv, search, casesensitive, matchword, forward, 
true, findnext))
                        update = true;
                else
                        bv->message(_("String not found."));

Reply via email to