]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfind.cpp
ar.po: updates from Hatim
[lyx.git] / src / lyxfind.cpp
index 85b66d071588639d32e4447c9f0358897e016e04..d26b1c89b6027dcc6f8df736f307ccf78075e743 100644 (file)
@@ -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,31 +408,66 @@ 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."));
        }
-       bv->buffer().updatePreviews();
        return update;
 }
 
 
-bool findNextChange(DocIterator & cur)
+bool findNextChange(BufferView * bv, Cursor & cur, bool const check_wrap)
 {
        for (; cur; cur.forwardPos())
                if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
                        return true;
+
+       if (check_wrap) {
+               DocIterator cur_orig(bv->cursor());
+               docstring q = _("End of file reached while searching forward.\n"
+                         "Continue searching from the beginning?");
+               int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
+                       q, 0, 1, _("&Yes"), _("&No"));
+               if (wrap_answer == 0) {
+                       bv->cursor().clear();
+                       bv->cursor().push_back(CursorSlice(bv->buffer().inset()));
+                       bv->clearSelection();
+                       cur.setCursor(bv->cursor().selectionBegin());
+                       if (findNextChange(bv, cur, false))
+                               return true;
+               }
+               bv->cursor().setCursor(cur_orig);
+       }
+
        return false;
 }
 
 
-bool findPreviousChange(DocIterator & cur)
+bool findPreviousChange(BufferView * bv, Cursor & cur, bool const check_wrap)
 {
        for (cur.backwardPos(); cur; cur.backwardPos()) {
                if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
                        return true;
        }
+
+       if (check_wrap) {
+               DocIterator cur_orig(bv->cursor());
+               docstring 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) {
+                       bv->cursor().setCursor(doc_iterator_end(&bv->buffer()));
+                       bv->cursor().backwardPos();
+                       bv->clearSelection();
+                       cur.setCursor(bv->cursor().selectionBegin());
+                       if (findPreviousChange(bv, cur, false))
+                               return true;
+               }
+               bv->cursor().setCursor(cur_orig);
+       }
+
        return false;
 }
 
@@ -449,7 +512,7 @@ bool findChange(BufferView * bv, bool forward)
        Cursor cur(*bv);
        cur.setCursor(forward ? bv->cursor().selectionEnd()
                      : bv->cursor().selectionBegin());
-       forward ? findNextChange(cur) : findPreviousChange(cur);
+       forward ? findNextChange(bv, cur, true) : findPreviousChange(bv, cur, true);
        return selectChange(cur, forward);
 }
 
@@ -1072,7 +1135,7 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
                for (int s = cur.depth() - 1; s >= 0; --s) {
                        CursorSlice const & cs = cur[s];
                        if (cs.asInsetMath() && cs.asInsetMath()->asHullInset()) {
-                               WriteStream ws(ods);
+                               WriteStream ws(os);
                                cs.asInsetMath()->asHullInset()->header_write(ws);
                                break;
                        }
@@ -1094,7 +1157,7 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
                        CursorSlice const & cs = cur[s];
                        InsetMath * inset = cs.asInsetMath();
                        if (inset && inset->asHullInset()) {
-                               WriteStream ws(ods);
+                               WriteStream ws(os);
                                inset->asHullInset()->footer_write(ws);
                                break;
                        }
@@ -1426,7 +1489,6 @@ static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, M
        LYXERR(Debug::FIND, "After pos adj cur=" << cur << " with depth: " << cur.depth() << " and len: " << sel_len);
        bv->putSelectionAt(DocIterator(cur), sel_len, !opt.forward);
        bv->processUpdateFlags(Update::Force);
-       bv->buffer().updatePreviews();
 }