]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfind.cpp
Fixed some lines that were too long. It compiled afterwards.
[lyx.git] / src / lyxfind.cpp
index f8001349279ebc76bd28c6f6803a1af4dfb31a00..aa28e0d83670bbb47654a4d2bb8a6915655a4f8e 100644 (file)
 #include "lyxfind.h"
 
 #include "Buffer.h"
-#include "LCursor.h"
+#include "Cursor.h"
 #include "CutAndPaste.h"
 #include "buffer_funcs.h"
 #include "BufferView.h"
 #include "debug.h"
 #include "FuncRequest.h"
 #include "gettext.h"
-#include "LyXText.h"
+#include "Text.h"
 #include "Paragraph.h"
 #include "ParIterator.h"
 #include "Undo.h"
 
-#include "frontends/Alert.h"
+#include "frontends/alert.h"
 
 #include "support/convert.h"
 #include "support/docstream.h"
@@ -62,7 +62,8 @@ public:
        {}
 
        // returns true if the specified string is at the specified position
-       bool operator()(Paragraph const & par, pos_type pos) const
+       // del specifies whether deleted strings in ct mode will be considered
+       bool operator()(Paragraph const & par, pos_type pos, bool del = true) const
        {
                docstring::size_type const size = str.length();
                pos_type i = 0;
@@ -74,6 +75,8 @@ public:
                                break;
                        if (!cs && uppercase(str[i]) != uppercase(par.getChar(pos + i)))
                                break;
+                       if (!del && par.isDeleted(pos + i))
+                               break;
                }
 
                if (size != docstring::size_type(i))
@@ -101,20 +104,24 @@ private:
 };
 
 
-bool findForward(DocIterator & cur, MatchString const & match)
+bool findForward(DocIterator & cur, MatchString const & match,
+                bool find_del = true)
 {
        for (; cur; cur.forwardChar())
-               if (cur.inTexted() && match(cur.paragraph(), cur.pos()))
+               if (cur.inTexted() &&
+                   match(cur.paragraph(), cur.pos(), find_del))
                        return true;
        return false;
 }
 
 
-bool findBackwards(DocIterator & cur, MatchString const & match)
+bool findBackwards(DocIterator & cur, MatchString const & match,
+                bool find_del = true)
 {
        while (cur) {
                cur.backwardChar();
-               if (cur.inTexted() && match(cur.paragraph(), cur.pos()))
+               if (cur.inTexted() &&
+                   match(cur.paragraph(), cur.pos(), find_del))
                        return true;
        }
        return false;
@@ -134,14 +141,15 @@ bool searchAllowed(BufferView * bv, docstring const & str)
 {
        if (str.empty()) {
                frontend::Alert::error(_("Search error"),
-                                           _("Search string is empty"));
+                                           _("Search string is empty"));
                return false;
        }
        return bv->buffer();
 }
 
 
-bool find(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool fw)
+bool find(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool fw,
+         bool find_del = true)
 {
        if (!searchAllowed(bv, searchstr))
                return false;
@@ -150,7 +158,8 @@ bool find(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool f
 
        MatchString const match(searchstr, cs, mw);
 
-       bool found = fw ? findForward(cur, match) : findBackwards(cur, match);
+       bool found = fw ? findForward(cur, match, find_del) :
+                         findBackwards(cur, match, find_del);
 
        if (found)
                bv->putSelectionAt(cur, searchstr.length(), !fw);
@@ -177,15 +186,15 @@ int replaceAll(BufferView * bv,
        int const ssize = searchstr.size();
 
        DocIterator cur = doc_iterator_begin(buf.inset());
-       while (findForward(cur, match)) {
+       while (findForward(cur, match, false)) {
                pos_type pos = cur.pos();
-               LyXFont const font
+               Font const font
                        = cur.paragraph().getFontSettings(buf.params(), pos);
                int striked = ssize - cur.paragraph().eraseChars(pos, pos + ssize,
                                                            buf.params().trackChanges);
                cur.paragraph().insert(pos, replacestr, font,
-                                      Change(buf.params().trackChanges ?
-                                             Change::INSERTED : Change::UNCHANGED));
+                                      Change(buf.params().trackChanges ?
+                                             Change::INSERTED : Change::UNCHANGED));
                for (int i = 0; i < rsize + striked; ++i)
                        cur.forwardChar();
                ++num;
@@ -224,10 +233,10 @@ int replace(BufferView * bv, docstring const & searchstr,
        if (!stringSelected(bv, searchstr, cs, mw, fw))
                return 0;
 
-       LCursor & cur = bv->cursor();
+       Cursor & cur = bv->cursor();
        cap::replaceSelectionWithString(cur, replacestr, fw);
        bv->buffer()->markDirty();
-       find(bv, searchstr, cs, mw, fw);
+       find(bv, searchstr, cs, mw, fw, false);
        bv->update();
 
        return 1;
@@ -289,7 +298,7 @@ void find(BufferView * bv, FuncRequest const & ev)
 }
 
 
-void replace(BufferView * bv, FuncRequest const & ev)
+void replace(BufferView * bv, FuncRequest const & ev, bool has_deleted)
 {
        if (!bv || ev.action != LFUN_WORD_REPLACE)
                return;
@@ -310,23 +319,34 @@ void replace(BufferView * bv, FuncRequest const & ev)
 
        Buffer * buf = bv->buffer();
 
-       int const replace_count = all
-               ? replaceAll(bv, search, rplc, casesensitive, matchword)
-               : replace(bv, search, rplc, casesensitive, matchword, forward);
-
-       if (replace_count == 0) {
-               // emit message signal.
-               buf->message(_("String not found!"));
-       } else {
-               if (replace_count == 1) {
+       if (!has_deleted) {
+               int const replace_count = all
+                       ? replaceAll(bv, search, rplc, casesensitive, matchword)
+                       : replace(bv, search, rplc, casesensitive, matchword, forward);
+       
+               if (replace_count == 0) {
                        // emit message signal.
-                       buf->message(_("String has been replaced."));
+                       buf->message(_("String not found!"));
                } else {
-                       docstring str = convert<docstring>(replace_count);
-                       str += _(" strings have been replaced.");
-                       // emit message signal.
-                       buf->message(str);
+                       if (replace_count == 1) {
+                               // emit message signal.
+                               buf->message(_("String has been replaced."));
+                       } else {
+                               docstring str = convert<docstring>(replace_count);
+                               str += _(" strings have been replaced.");
+                               // emit message signal.
+                               buf->message(str);
+                       }
                }
+       } else {
+               // if we have deleted characters, we do not replace at all, but
+               // rather search for the next occurence
+               bool const found = find(bv, search,
+                                       casesensitive, matchword, forward);
+
+               if (!found)
+                       // emit message signal.
+                       bv->message(_("String not found!"));
        }
 }
 
@@ -357,7 +377,7 @@ bool findNextChange(BufferView * bv)
        }
 
        // avoid crash (assertion violation) if the imaginary end-of-par
-       // character of the last paragraph of the document is marked as changed 
+       // character of the last paragraph of the document is marked as changed
        if (cur == et) {
                cur = ok;
        }