]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfind.cpp
* GuiDocument.cpp:
[lyx.git] / src / lyxfind.cpp
index 6fa6aade1f459be41411005c503239b5bd763104..5c26645075e128791bd5ec1f4681f57996bb3a7e 100644 (file)
@@ -117,7 +117,7 @@ bool findBackwards(DocIterator & cur, MatchString const & match,
 
 bool findChange(DocIterator & cur, bool next)
 {
-       if (!next) 
+       if (!next)
                cur.backwardPos();
        for (; cur; next ? cur.forwardPos() : cur.backwardPos())
                if (cur.inTexted() && !cur.paragraph().isUnchanged(cur.pos())) {
@@ -202,9 +202,17 @@ int replaceAll(BufferView * bv,
 }
 
 
-bool stringSelected(BufferView * bv, docstring const & searchstr,
+bool stringSelected(BufferView * bv, docstring & searchstr,
                    bool cs, bool mw, bool fw)
 {
+       // if nothing selected and searched string is empty, this
+       // means that we want to search current word at cursor position.
+       if (!bv->cursor().selection() && searchstr.empty()) {
+               bv->cursor().innerText()->selectWord(bv->cursor(), WHOLE_WORD);
+               searchstr = bv->cursor().selectionAsString(false);
+               return true;
+       }
+
        // if nothing selected or selection does not equal search
        // string search and select next occurance and return
        docstring const & str1 = searchstr;
@@ -218,13 +226,13 @@ bool stringSelected(BufferView * bv, docstring const & searchstr,
 }
 
 
-int replace(BufferView * bv, docstring const & searchstr,
+int replace(BufferView * bv, docstring & searchstr,
            docstring const & replacestr, bool cs, bool mw, bool fw)
 {
-       if (!searchAllowed(bv, searchstr) || bv->buffer().isReadonly())
+       if (!stringSelected(bv, searchstr, cs, mw, fw))
                return 0;
 
-       if (!stringSelected(bv, searchstr, cs, mw, fw))
+       if (!searchAllowed(bv, searchstr) || bv->buffer().isReadonly())
                return 0;
 
        Cursor & cur = bv->cursor();
@@ -252,13 +260,13 @@ docstring const find2string(docstring const & search,
 }
 
 
-docstring const replace2string(docstring const & search, docstring const & replace,
-                           bool casesensitive, bool matchword,
-                           bool all, bool forward)
+docstring const replace2string(docstring const & replace,
+       docstring const & search, bool casesensitive, bool matchword,
+       bool all, bool forward)
 {
        odocstringstream ss;
-       ss << search << '\n'
-          << replace << '\n'
+       ss << replace << '\n'
+          << search << '\n'
           << int(casesensitive) << ' '
           << int(matchword) << ' '
           << int(all) << ' '
@@ -299,8 +307,8 @@ void replace(BufferView * bv, FuncRequest const & ev, bool has_deleted)
        //  <casesensitive> <matchword> <all> <forward>"
        docstring search;
        docstring rplc;
-       docstring howto = split(ev.argument(), search, '\n');
-       howto = split(howto, rplc, '\n');
+       docstring howto = split(ev.argument(), rplc, '\n');
+       howto = split(howto, search, '\n');
 
        bool casesensitive = parse_bool(howto);
        bool matchword     = parse_bool(howto);
@@ -311,7 +319,7 @@ void replace(BufferView * bv, FuncRequest const & ev, bool has_deleted)
                int const replace_count = all
                        ? replaceAll(bv, search, rplc, casesensitive, matchword)
                        : replace(bv, search, rplc, casesensitive, matchword, forward);
-       
+
                Buffer & buf = bv->buffer();
                if (replace_count == 0) {
                        // emit message signal.
@@ -355,11 +363,25 @@ bool findChange(BufferView * bv, bool next)
        if (bv->cursor().selection()) {
                // set the cursor at the beginning or at the end of the selection
                // before searching. Otherwise, the current change will be found.
-               if (next != bv->cursor().top() > bv->cursor().anchor())
+               if (next != (bv->cursor().top() > bv->cursor().anchor()))
                        bv->cursor().setCursorToAnchor();
        }
 
        DocIterator cur = bv->cursor();
+
+       // Are we within a change ? Then first search forward (backward),
+       // clear the selection and search the other way around (see the end
+       // of this function). This will avoid changes to be selected half.
+       bool search_both_sides = false;
+       if (cur.pos() > 1) {
+               Change change_next_pos
+                       = cur.paragraph().lookupChange(cur.pos());
+               Change change_prev_pos
+                       = cur.paragraph().lookupChange(cur.pos() - 1);
+               if (change_next_pos.isSimilarTo(change_prev_pos))
+                       search_both_sides = true;
+       }
+
        if (!findChange(cur, next))
                return false;
 
@@ -380,7 +402,8 @@ bool findChange(BufferView * bv, bool next)
                                break;
                }
        } else {
-               for (; !tip.at_begin(); tip.backwardPos()) {
+               for (; !tip.at_begin();) {
+                       tip.backwardPos();
                        Change change = tip.paragraph().lookupChange(tip.pos());
                        if (change != orig_change) {
                                // take a step forward to correctly set the selection
@@ -394,6 +417,11 @@ bool findChange(BufferView * bv, bool next)
        bv->cursor().setCursor(cur);
        bv->cursor().setSelection();
 
+       if (search_both_sides) {
+               bv->cursor().setSelection(false);
+               findChange(bv, !next);
+       }
+
        return true;
 }
 
@@ -582,7 +610,7 @@ public:
         ** @param at_begin
         **     If set, then match is searched only against beginning of text starting at cur.
         **     If unset, then match is searched anywhere in text starting at cur.
-        ** 
+        **
         ** @return
         ** The length of the matching text, or zero if no match was found.
         **/