X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfind.C;h=fa6acb468fb2962dacf05f498e971a09e53ed288;hb=c7db12d1acf83fb5191fab908e0153fa752f4530;hp=e5d0f75afbc6eb18d592aeb27ad6b1153d604f2f;hpb=43cb604df7775c765716b328e49c33e61beda987;p=lyx.git diff --git a/src/lyxfind.C b/src/lyxfind.C index e5d0f75afb..fa6acb468f 100644 --- a/src/lyxfind.C +++ b/src/lyxfind.C @@ -7,13 +7,17 @@ #include "lyxtext.h" #include "lyxfind.h" #include "LyXView.h" -#include "lyx_gui_misc.h" +#include "frontends/Alert.h" #include "support/textutils.h" #include "support/lstrings.h" #include "BufferView.h" #include "buffer.h" +#include "debug.h" #include "gettext.h" +using lyx::pos_type; + + /// // locally used enum /// @@ -28,39 +32,39 @@ enum SearchResult { /// returns true if the specified string is at the specified position -bool IsStringInText(Paragraph * par, Paragraph::size_type pos, - string const & str, bool const & = true, - bool const & = false); +bool IsStringInText(Paragraph * par, pos_type pos, + string const & str, bool const & = true, + bool const & = false); /// if the string is found: return true and set the cursor to the new position SearchResult SearchForward(BufferView *, LyXText * text, string const & str, - bool const & = true, bool const & = false); + bool const & = true, bool const & = false); /// SearchResult SearchBackward(BufferView *, LyXText * text, string const & str, - bool const & = true, bool const & = false); + bool const & = true, bool const & = false); int LyXReplace(BufferView * bv, - string const & searchstr, string const & replacestr, - bool forward, bool casesens, bool matchwrd, bool replaceall, - bool once) + string const & searchstr, string const & replacestr, + bool forward, bool casesens, bool matchwrd, bool replaceall, + bool once) { - if (!bv->available() || bv->buffer()->isReadonly()) + if (!bv->available() || bv->buffer()->isReadonly()) return 0; - + // CutSelection cannot cut a single space, so we have to stop // in order to avoid endless loop :-( if (searchstr.length() == 0 || (searchstr.length() == 1 && searchstr[0] == ' ')) { - WriteAlert(_("Sorry!"), _("You cannot replace a single space, " - "nor an empty character.")); + Alert::alert(_("Sorry!"), _("You cannot replace a single space, " + "nor an empty character.")); return 0; } - + LyXText * text = bv->getLyXText(); - // now we can start searching for the first + // now we can start searching for the first // start at top if replaceall bool fw = forward; if (replaceall) { @@ -73,7 +77,7 @@ int LyXReplace(BufferView * bv, // override search direction because we search top to bottom fw = true; } - + // if nothing selected or selection does not equal search string // search and select next occurance and return if no replaceall string str1; @@ -106,25 +110,25 @@ int LyXReplace(BufferView * bv, if (!once) found = LyXFind(bv, searchstr, fw, false, casesens, matchwrd); } while (!once && replaceall && found); - + if (bv->focus()) bv->showCursor(); - + return replace_count; } bool LyXFind(BufferView * bv, - string const & searchstr, bool forward, - bool frominset, bool casesens, bool matchwrd) + string const & searchstr, bool forward, + bool frominset, bool casesens, bool matchwrd) { if (!bv->available() || searchstr.empty()) return false; - + LyXText * text = bv->getLyXText(); bv->hideCursor(); bv->update(text, BufferView::SELECT|BufferView::FITCUR); - + if (text->selection.set()) text->cursor = forward ? text->selection.end : text->selection.start; @@ -140,7 +144,7 @@ bool LyXFind(BufferView * bv, else { text = bv->getLyXText(); Paragraph * par = text->cursor.par(); - Paragraph::size_type pos = text->cursor.pos(); + pos_type pos = text->cursor.pos(); if (forward) { if (pos < par->size() - 1) ++pos; @@ -152,13 +156,13 @@ bool LyXFind(BufferView * bv, text->setCursor(bv, par, pos); } if (par) { - result = forward ? + result = forward ? SearchForward(bv, text, searchstr, casesens, matchwrd) : SearchBackward(bv, text, searchstr, casesens, matchwrd); } } } else { - result = forward ? + result = forward ? SearchForward(bv, text, searchstr, casesens, matchwrd) : SearchBackward(bv, text, searchstr, casesens, matchwrd); } @@ -174,39 +178,38 @@ bool LyXFind(BufferView * bv, bv->update(bv->getLyXText(), BufferView::SELECT|BufferView::FITCUR); } else if (result == SR_NOT_FOUND) found = false; - + if (bv->focus()) bv->showCursor(); - + return found; } // returns true if the specified string is at the specified position -bool IsStringInText(Paragraph * par, Paragraph::size_type pos, +bool IsStringInText(Paragraph * par, pos_type pos, string const & str, bool const & cs, bool const & mw) { if (!par) return false; - + string::size_type size = str.length(); - Paragraph::size_type i = 0; + pos_type i = 0; while (((pos + i) < par->size()) && (string::size_type(i) < size) && (cs ? (str[i] == par->getChar(pos + i)) - : (toupper(str[i]) == toupper(par->getChar(pos + i))))) + : (uppercase(str[i]) == uppercase(par->getChar(pos + i))))) { ++i; } if (size == string::size_type(i)) { // if necessary, check whether string matches word - if (!mw || - (mw && ((pos <= 0 || !IsLetterCharOrDigit(par->getChar(pos - 1))) - && (pos + Paragraph::size_type(size) >= par->size() - || !IsLetterCharOrDigit(par->getChar(pos + size)))) - )) - { + if (!mw) + return true; + if ((pos <= 0 || !IsLetterCharOrDigit(par->getChar(pos - 1))) + && (pos + pos_type(size) >= par->size() + || !IsLetterCharOrDigit(par->getChar(pos + size)))) { return true; } } @@ -217,10 +220,11 @@ bool IsStringInText(Paragraph * par, Paragraph::size_type pos, // if the string can be found: return true and set the cursor to // the new position, cs = casesensitive, mw = matchword SearchResult SearchForward(BufferView * bv, LyXText * text, string const & str, - bool const & cs, bool const & mw) + bool const & cs, bool const & mw) { Paragraph * par = text->cursor.par(); - Paragraph::size_type pos = text->cursor.pos(); + pos_type pos = text->cursor.pos(); + Paragraph * prev_par = par; UpdatableInset * inset; while (par && !IsStringInText(par, pos, str, cs, mw)) { @@ -235,41 +239,25 @@ SearchResult SearchForward(BufferView * bv, LyXText * text, string const & str, return SR_FOUND_NOUPDATE; text = bv->getLyXText(); } - if (pos < par->size() - 1) - ++pos; - else { - pos = 0; + + ++pos; + + if (pos >= par->size()) { + prev_par = par; par = par->next(); + pos = 0; } } + if (par) { text->setCursor(bv, par, pos); return SR_FOUND; -#if 0 - } else if (text->inset_owner) { - // test if we're inside an inset if yes unlock the inset - // and recall us with the outside LyXText! - bv->unlockInset((UpdatableInset *)text->inset_owner); - if (!bv->theLockingInset()) { - text = bv->getLyXText(); - par = text->cursor.par(); - pos = text->cursor.pos(); - if (pos < par->size() - 1) - ++pos; - else { - pos = 0; - par = par->next(); - } - if (!par) - return SR_NOT_FOUND; - text->setCursor(bv, par, pos); - return SearchForward(bv, text, str, cs, mw); - } else { - return SR_NOT_FOUND; - } -#endif - } else + } else { + // make sure we end up at the end of the text, + // not the start point of the last search + text->setCursor(bv, prev_par, prev_par->size()); return SR_NOT_FOUND; + } } @@ -277,16 +265,18 @@ SearchResult SearchForward(BufferView * bv, LyXText * text, string const & str, // if the string can be found: return true and set the cursor to // the new position, cs = casesensitive, mw = matchword SearchResult SearchBackward(BufferView * bv, LyXText * text, - string const & str, - bool const & cs, bool const & mw) + string const & str, + bool const & cs, bool const & mw) { Paragraph * par = text->cursor.par(); - Paragraph::size_type pos = text->cursor.pos(); + pos_type pos = text->cursor.pos(); + Paragraph * prev_par = par; do { if (pos > 0) --pos; else { + prev_par = par; // We skip empty paragraphs (Asger) do { par = par->previous(); @@ -305,23 +295,15 @@ SearchResult SearchBackward(BufferView * bv, LyXText * text, if (inset->searchBackward(bv, str, cs, mw)) return SR_FOUND_NOUPDATE; text = bv->getLyXText(); - } + } } while (par && !IsStringInText(par, pos, str, cs, mw)); - + if (par) { text->setCursor(bv, par, pos); return SR_FOUND; + } else { + // go to the last part of the unsuccessful search + text->setCursor(bv, prev_par, 0); + return SR_NOT_FOUND; } -#if 0 - else if (text->inset_owner) { - // test if we're inside an inset if yes unlock the inset - // and recall us with the outside LyXText! - bv->unlockInset((UpdatableInset *)text->inset_owner); - if (!bv->theLockingInset()) { - return SearchBackward(bv, bv->getLyXText(), str, cs, mw); - } - } -#endif - return SR_NOT_FOUND; } -