X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfind.C;h=9e92f3b63b64db4b1b4a75d885e80307e4424520;hb=89b422b320a352e503c0625820da1073805d74a9;hp=cfee2c9f04435a7be031677ef35ef4764c07eef2;hpb=68b7ef25fb7d2da230d3eb11d6737701abfc2e64;p=lyx.git diff --git a/src/lyxfind.C b/src/lyxfind.C index cfee2c9f04..9e92f3b63b 100644 --- a/src/lyxfind.C +++ b/src/lyxfind.C @@ -18,6 +18,7 @@ #include "buffer.h" #include "cursor.h" #include "CutAndPaste.h" +#include "buffer_funcs.h" #include "BufferView.h" #include "debug.h" #include "funcrequest.h" @@ -28,52 +29,47 @@ #include "undo.h" #include "frontends/Alert.h" -#include "frontends/LyXView.h" +#include "frontends/Selection.h" -#include "support/textutils.h" -#include "support/tostr.h" +#include "support/convert.h" +#include "support/docstream.h" -#include "support/std_sstream.h" - -using lyx::support::lowercase; -using lyx::support::uppercase; -using lyx::support::split; +namespace lyx { -using lyx::par_type; -using lyx::pos_type; +using support::lowercase; +using support::uppercase; +using support::split; using std::advance; -using std::ostringstream; -using std::string; namespace { -bool parse_bool(string & howto) +bool parse_bool(docstring & howto) { if (howto.empty()) return false; - string var; + docstring var; howto = split(howto, var, ' '); return (var == "1"); } -class MatchString : public std::binary_function +class MatchString : public std::binary_function { public: - MatchString(string const & str, bool cs, bool mw) + MatchString(docstring const & str, bool cs, bool mw) : str(str), cs(cs), mw(mw) {} // returns true if the specified string is at the specified position - bool operator()(Paragraph const & par, lyx::pos_type pos) const + bool operator()(Paragraph const & par, pos_type pos) const { - string::size_type const size = str.length(); - lyx::pos_type i = 0; - lyx::pos_type const parsize = par.size(); + docstring::size_type const size = str.length(); + pos_type i = 0; + pos_type const parsize = par.size(); for (i = 0; pos + i < parsize; ++i) { - if (string::size_type(i) >= size) + if (docstring::size_type(i) >= size) break; if (cs && str[i] != par.getChar(pos + i)) break; @@ -81,15 +77,15 @@ public: break; } - if (size != string::size_type(i)) + if (size != docstring::size_type(i)) return false; // if necessary, check whether string matches word if (mw) { - if (pos > 0 && IsLetterCharOrDigit(par.getChar(pos - 1))) + if (pos > 0 && par.isLetter(pos - 1)) return false; - if (pos + lyx::pos_type(size) < parsize - && IsLetterCharOrDigit(par.getChar(pos + size))); + if (pos + pos_type(size) < parsize + && par.isLetter(pos + size)) return false; } @@ -98,7 +94,7 @@ public: private: // search string - string str; + docstring str; // case sensitive bool cs; // match whole words only @@ -117,35 +113,36 @@ bool findForward(DocIterator & cur, MatchString const & match) bool findBackwards(DocIterator & cur, MatchString const & match) { - for (; cur; cur.backwardChar()) + while (cur) { + cur.backwardChar(); if (cur.inTexted() && match(cur.paragraph(), cur.pos())) return true; + } return false; } bool findChange(DocIterator & cur) { - for (; cur; cur.forwardChar()) - if (cur.inTexted() && !cur.paragraph().empty() && - cur.paragraph().lookupChange(cur.pos()) - != Change::UNCHANGED) + for (; cur; cur.forwardPos()) + if (cur.inTexted() && !cur.paragraph().isUnchanged(cur.pos())) return true; return false; } -bool searchAllowed(BufferView * bv, string const & str) +bool searchAllowed(BufferView * bv, docstring const & str) { if (str.empty()) { - Alert::error(_("Search error"), _("Search string is empty")); + frontend::Alert::error(_("Search error"), + _("Search string is empty")); return false; } - return bv->available(); + return bv->buffer(); } -bool find(BufferView * bv, string const & searchstr, bool cs, bool mw, bool fw) +bool find(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool fw) { if (!searchAllowed(bv, searchstr)) return false; @@ -164,7 +161,7 @@ bool find(BufferView * bv, string const & searchstr, bool cs, bool mw, bool fw) int replaceAll(BufferView * bv, - string const & searchstr, string const & replacestr, + docstring const & searchstr, docstring const & replacestr, bool cs, bool mw) { Buffer & buf = *bv->buffer(); @@ -172,7 +169,7 @@ int replaceAll(BufferView * bv, if (!searchAllowed(bv, searchstr) || buf.isReadonly()) return 0; - recordUndoFullDocument(bv->cursor()); + recordUndoFullDocument(bv); MatchString const match(searchstr, cs, mw); int num = 0; @@ -182,17 +179,20 @@ int replaceAll(BufferView * bv, DocIterator cur = doc_iterator_begin(buf.inset()); while (findForward(cur, match)) { - lyx::pos_type pos = cur.pos(); + pos_type pos = cur.pos(); LyXFont const font = cur.paragraph().getFontSettings(buf.params(), pos); - int striked = ssize - cur.paragraph().erase(pos, pos + ssize); - cur.paragraph().insert(pos, replacestr, font); + 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)); for (int i = 0; i < rsize + striked; ++i) cur.forwardChar(); ++num; } - bv->text()->init(bv); + updateLabels(buf); bv->putSelectionAt(doc_iterator_begin(buf.inset()), 0, false); if (num) buf.markDirty(); @@ -200,13 +200,13 @@ int replaceAll(BufferView * bv, } -bool stringSelected(BufferView * bv, string const & searchstr, +bool stringSelected(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool fw) { // if nothing selected or selection does not equal search // string search and select next occurance and return - string const & str1 = searchstr; - string const str2 = bv->cursor().selectionAsString(false); + docstring const & str1 = searchstr; + docstring const str2 = bv->cursor().selectionAsString(false); if ((cs && str1 != str2) || lowercase(str1) != lowercase(str2)) { find(bv, searchstr, cs, mw, fw); return false; @@ -216,8 +216,8 @@ bool stringSelected(BufferView * bv, string const & searchstr, } -int replace(BufferView * bv, string const & searchstr, - string const & replacestr, bool cs, bool mw, bool fw) +int replace(BufferView * bv, docstring const & searchstr, + docstring const & replacestr, bool cs, bool mw, bool fw) { if (!searchAllowed(bv, searchstr) || bv->buffer()->isReadonly()) return 0; @@ -226,9 +226,7 @@ int replace(BufferView * bv, string const & searchstr, return 0; LCursor & cur = bv->cursor(); - lyx::cap::replaceSelectionWithString(cur, replacestr); - lyx::cap::setSelectionRange(cur, replacestr.length()); - cur.top() = fw ? cur.selEnd() : cur.selBegin(); + cap::replaceSelectionWithString(cur, replacestr, fw); bv->buffer()->markDirty(); find(bv, searchstr, cs, mw, fw); bv->update(); @@ -239,13 +237,10 @@ int replace(BufferView * bv, string const & searchstr, } // namespace anon -namespace lyx { -namespace find { - -string const find2string(string const & search, +docstring const find2string(docstring const & search, bool casesensitive, bool matchword, bool forward) { - ostringstream ss; + odocstringstream ss; ss << search << '\n' << int(casesensitive) << ' ' << int(matchword) << ' ' @@ -254,11 +249,11 @@ string const find2string(string const & search, } -string const replace2string(string const & search, string const & replace, +docstring const replace2string(docstring const & search, docstring const & replace, bool casesensitive, bool matchword, bool all, bool forward) { - ostringstream ss; + odocstringstream ss; ss << search << '\n' << replace << '\n' << int(casesensitive) << ' ' @@ -274,23 +269,24 @@ void find(BufferView * bv, FuncRequest const & ev) if (!bv || ev.action != LFUN_WORD_FIND) return; - lyxerr << "find called, cmd: " << ev << std::endl; + //lyxerr << "find called, cmd: " << ev << std::endl; // data is of the form // " // " - string search; - string howto = split(ev.argument, search, '\n'); + docstring search; + docstring howto = split(ev.argument(), search, '\n'); bool casesensitive = parse_bool(howto); bool matchword = parse_bool(howto); bool forward = parse_bool(howto); - bool const found = ::find(bv, search, + bool const found = find(bv, search, casesensitive, matchword, forward); if (!found) - bv->owner()->message(_("String not found!")); + // emit message signal. + bv->message(_("String not found!")); } @@ -303,31 +299,34 @@ void replace(BufferView * bv, FuncRequest const & ev) // " // // " - string search; - string replace; - string howto = split(ev.argument, search, '\n'); - howto = split(howto, replace, '\n'); + docstring search; + docstring rplc; + docstring howto = split(ev.argument(), search, '\n'); + howto = split(howto, rplc, '\n'); bool casesensitive = parse_bool(howto); bool matchword = parse_bool(howto); bool all = parse_bool(howto); bool forward = parse_bool(howto); - LyXView * lv = bv->owner(); + Buffer * buf = bv->buffer(); int const replace_count = all - ? ::replaceAll(bv, search, replace, casesensitive, matchword) - : ::replace(bv, search, replace, casesensitive, matchword, forward); + ? replaceAll(bv, search, rplc, casesensitive, matchword) + : replace(bv, search, rplc, casesensitive, matchword, forward); if (replace_count == 0) { - lv->message(_("String not found!")); + // emit message signal. + buf->message(_("String not found!")); } else { if (replace_count == 1) { - lv->message(_("String has been replaced.")); + // emit message signal. + buf->message(_("String has been replaced.")); } else { - string str = tostr(replace_count); + docstring str = convert(replace_count); str += _(" strings have been replaced."); - lv->message(str); + // emit message signal. + buf->message(str); } } } @@ -335,35 +334,32 @@ void replace(BufferView * bv, FuncRequest const & ev) bool findNextChange(BufferView * bv) { - if (!bv->available()) + if (!bv->buffer()) return false; - DocIterator cur = DocIterator(bv->cursor()); + DocIterator cur = bv->cursor(); if (!findChange(cur)) return false; - Paragraph const & par = cur.paragraph(); - pos_type pos = cur.pos(); + bv->cursor().setCursor(cur); + bv->cursor().resetAnchor(); - Change orig_change = par.lookupChangeFull(pos); - pos_type parsize = par.size(); - pos_type end = pos; + Change orig_change = cur.paragraph().lookupChange(cur.pos()); - for (; end != parsize; ++end) { - Change change = par.lookupChangeFull(end); + DocIterator et = doc_iterator_end(cur.inset()); + for (; cur != et; cur.forwardPosNoDescend()) { + Change change = cur.paragraph().lookupChange(cur.pos()); if (change != orig_change) { - // slight UI optimisation: for replacements, we get - // text like : _old_new. Consider that as one change. - if (!(orig_change.type == Change::DELETED && - change.type == Change::INSERTED)) - break; + break; } } - pos_type length = end - pos; - bv->putSelectionAt(cur, length, true); + // Now put cursor to end of selection: + bv->cursor().setCursor(cur); + bv->cursor().setSelection(); + theSelection().haveSelection(bv->cursor().selection()); + return true; } -} // find namespace } // lyx namespace