]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfind.cpp
Help avoiding shortcut clashes by discriminating strings.
[lyx.git] / src / lyxfind.cpp
index 98cfb581e695b901a3f57d1f9401a922a35b893b..1e45b6502bbd230caf429244527c1f5d772cbd76 100644 (file)
@@ -270,6 +270,13 @@ pair<bool, int> replaceOne(BufferView * bv, docstring searchstr,
                return pair<bool, int>(false, 0);
 
        cap::replaceSelectionWithString(cur, replacestr, forward);
+       if (forward) {
+               cur.pos() += replacestr.length();
+               LASSERT(cur.pos() <= cur.lastpos(), /* */);
+       } else {
+               cur.pos() -= replacestr.length();
+               LASSERT(cur.pos() >= 0, /* */);
+       }
        findOne(bv, searchstr, case_sens, whole, forward, false);
 
        return pair<bool, int>(true, 1);
@@ -907,6 +914,7 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
 
        TexRow texrow;
        odocstringstream ods;
+       otexstream os(ods);
        OutputParams runparams(&buf.params().encoding());
        runparams.nice = false;
        runparams.flavor = OutputParams::LATEX;
@@ -915,14 +923,12 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
        runparams.dryrun = true;
 
        if (cur.inTexted()) {
-                       // @TODO what about searching beyond/across paragraph breaks ?
-                       ParagraphList::const_iterator pit = cur.innerText()->paragraphs().begin();
-                       for (int i = 0; i < cur.pit(); ++i)
-                                       ++pit;
-               pos_type const endpos = (len == -1 || cur.pos() + len > int(pit->size()))
-                       ? pit->size() : cur.pos() + len;
-               TeXOnePar(buf, *cur.innerText(), pit, ods, texrow, runparams, string(),
-                       cur.pos(), endpos);
+               // @TODO what about searching beyond/across paragraph breaks ?
+               pos_type endpos = cur.paragraph().size();
+               if (len != -1 && endpos > cur.pos() + len)
+                       endpos = cur.pos() + len;
+               TeXOnePar(buf, *cur.innerText(), cur.pit(), os, texrow, runparams,
+                       string(), cur.pos(), endpos);
                LYXERR(Debug::FIND, "Latexified text: '" << lyx::to_utf8(ods.str()) << "'");
        } else if (cur.inMathed()) {
                // Retrieve the math environment type, and add '$' or '$[' or others (\begin{equation}) accordingly
@@ -1102,6 +1108,7 @@ int findBackwardsAdv(DocIterator & cur, MatchStringAdv & match) {
 docstring stringifyFromForSearch(FindAndReplaceOptions const & opt,
        DocIterator const & cur, int len)
 {
+       LASSERT(cur.pos() >= 0 && cur.pos() <= cur.lastpos(), /* */);
        if (!opt.ignoreformat)
                return latexifyFromCursor(cur, len);
        else
@@ -1191,9 +1198,6 @@ static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, M
        Buffer repl_buffer("", false);
        repl_buffer.setUnnamed(true);
        LASSERT(repl_buffer.readString(lyx), /**/);
-       repl_buffer.changeLanguage(
-               repl_buffer.language(),
-               cur.getFont().language());
        if (opt.keep_case && sel_len >= 2) {
                if (cur.inTexted()) {
                        if (firstUppercase(cur))
@@ -1204,20 +1208,26 @@ static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, M
        }
        cap::cutSelection(cur, false, false);
        if (!cur.inMathed()) {
+               repl_buffer.changeLanguage(
+                       repl_buffer.language(),
+                       cur.getFont().language());
                LYXERR(Debug::FIND, "Replacing by pasteParagraphList()ing repl_buffer");
+               LYXERR(Debug::FIND, "Before pasteParagraphList() cur=" << cur << endl);
                cap::pasteParagraphList(cur, repl_buffer.paragraphs(),
                                        repl_buffer.params().documentClassPtr(),
                                        bv->buffer().errorList("Paste"));
+               LYXERR(Debug::FIND, "After pasteParagraphList() cur=" << cur << endl);
+               sel_len = repl_buffer.paragraphs().begin()->size();
        } else {
                odocstringstream ods;
+               otexstream os(ods);
                OutputParams runparams(&repl_buffer.params().encoding());
                runparams.nice = false;
                runparams.flavor = OutputParams::LATEX;
                runparams.linelen = 8000; //lyxrc.plaintext_linelen;
                runparams.dryrun = true;
                TexRow texrow;
-               TeXOnePar(repl_buffer, repl_buffer.text(), 
-                         repl_buffer.paragraphs().begin(), ods, texrow, runparams);
+               TeXOnePar(repl_buffer, repl_buffer.text(), 0, os, texrow, runparams);
                //repl_buffer.getSourceCode(ods, 0, repl_buffer.paragraphs().size(), false);
                docstring repl_latex = ods.str();
                LYXERR(Debug::FIND, "Latexified replace_buffer: '" << repl_latex << "'");
@@ -1226,10 +1236,13 @@ static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, M
                regex_replace(s, s, "\\\\\\[(.*)\\\\\\]", "$1");
                repl_latex = from_utf8(s);
                LYXERR(Debug::FIND, "Replacing by niceInsert()ing latex: '" << repl_latex << "'");
-               cur.niceInsert(repl_latex);
+               sel_len = cur.niceInsert(repl_latex);
        }
-       cur.pos() -= repl_buffer.paragraphs().begin()->size();
-       bv->putSelectionAt(DocIterator(cur), repl_buffer.paragraphs().begin()->size(), !opt.forward);
+       cur.pos() -= sel_len;
+       if (cur.pos() < 0)
+               cur.pos() = 0;
+       LYXERR(Debug::FIND, "Putting selection at cur=" << cur << " with len: " << sel_len);
+       bv->putSelectionAt(DocIterator(cur), sel_len, !opt.forward);
        bv->processUpdateFlags(Update::Force);
 }
 
@@ -1238,7 +1251,7 @@ static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, M
 bool findAdv(BufferView * bv, FindAndReplaceOptions const & opt)
 {
        DocIterator cur;
-       int match_len;
+       int match_len = 0;
 
        if (opt.search.empty()) {
                bv->message(_("Search text is empty!"));