From: Tommaso Cucinotta Date: Sat, 20 Mar 2010 13:59:46 +0000 (+0000) Subject: Fixed issues in backward search in various corner cases (fixed #6482 and #6596). X-Git-Tag: 2.0.0~3751 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=57aa866a1c5e5f401a5f39ed81d2823bc6f2e3e7;p=features.git Fixed issues in backward search in various corner cases (fixed #6482 and #6596). Now, when scope includes multiple documents, the switch_buffer LFUN is only issues if buffer actually changes. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33812 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/frontends/qt4/FindAndReplace.cpp b/src/frontends/qt4/FindAndReplace.cpp index d57c272fc2..a172ee147e 100644 --- a/src/frontends/qt4/FindAndReplace.cpp +++ b/src/frontends/qt4/FindAndReplace.cpp @@ -355,7 +355,7 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) Buffer * buf = &bv->buffer(); Buffer * buf_orig = &bv->buffer(); - Cursor cur_orig(bv->cursor()); + DocIterator cur_orig(bv->cursor()); if (opt.scope == FindAndReplaceOptions::S_ALL_MANUALS) { vector const & v = allManualsFiles(); @@ -378,6 +378,7 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) do { LYXERR(Debug::FIND, "Dispatching LFUN_WORD_FINDADV"); dispatch(cmd); + LYXERR(Debug::FIND, "dispatched"); if (bv->cursor().result().dispatched()) { // Match found, selected and replaced if needed return; @@ -396,14 +397,15 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) if (wrap_answer == 1) break; } - lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, - buf->absFileName())); + if (buf != &view_.documentBufferView()->buffer()) + lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, + buf->absFileName())); bv = view_.documentBufferView(); if (opt.forward) { bv->cursor().clear(); bv->cursor().push_back(CursorSlice(buf->inset())); } else { - lyx::dispatch(FuncRequest(LFUN_BUFFER_END)); + //lyx::dispatch(FuncRequest(LFUN_BUFFER_END)); bv->cursor().setCursor(doc_iterator_end(buf)); bv->cursor().backwardPos(); LYXERR(Debug::FIND, "findBackAdv5: cur: " @@ -411,11 +413,11 @@ void FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt) } bv->clearSelection(); } while (wrap_answer != 1); - if (buf != buf_orig) + if (buf_orig != &view_.documentBufferView()->buffer()) lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH, buf_orig->absFileName())); bv = view_.documentBufferView(); - bv->cursor() = cur_orig; + bv->cursor().setCursor(cur_orig); } diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 6aade107bb..b615ff6983 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -980,25 +980,21 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match) void findMostBackwards(DocIterator & cur, MatchStringAdv const & match, int & len) { DocIterator cur_begin = doc_iterator_begin(cur.buffer()); - len = findAdvFinalize(cur, match); - if (cur != cur_begin) { - Inset & inset = cur.inset(); - int old_len; - DocIterator old_cur; - DocIterator dit2; - do { - old_cur = cur; - old_len = len; - cur.backwardPos(); - LYXERR(Debug::FIND, "findMostBackwards(): old_cur=" - << old_cur << ", old_len=" << len << ", cur=" << cur); - dit2 = cur; - } while (cur != cur_begin && &cur.inset() == &inset && match(cur) - && (len = findAdvFinalize(dit2, match)) > old_len); - cur = old_cur; - len = old_len; + DocIterator tmp_cur = cur; + len = findAdvFinalize(tmp_cur, match); + Inset & inset = cur.inset(); + for (; cur != cur_begin; cur.backwardPos()) { + LYXERR(Debug::FIND, "findMostBackwards(): cur=" << cur); + DocIterator new_cur = cur; + new_cur.backwardPos(); + if (new_cur == cur || &new_cur.inset() != &inset || !match(new_cur)) + break; + int new_len = findAdvFinalize(new_cur, match); + if (new_len == len) + break; + len = new_len; } - LYXERR(Debug::FIND, "findMostBackwards(): cur=" << cur); + LYXERR(Debug::FIND, "findMostBackwards(): exiting with cur=" << cur); } @@ -1007,10 +1003,11 @@ int findBackwardsAdv(DocIterator & cur, MatchStringAdv & match) { if (! cur) return 0; // Backup of original position - DocIterator cur_orig(cur); DocIterator cur_begin = doc_iterator_begin(cur.buffer()); if (cur == cur_begin) return 0; + cur.backwardPos(); + DocIterator cur_orig(cur); bool found_match; bool pit_changed = false; found_match = false; @@ -1025,22 +1022,21 @@ int findBackwardsAdv(DocIterator & cur, MatchStringAdv & match) { cur.pos() = cur_orig.pos(); LYXERR(Debug::FIND, "findBackAdv2: cur: " << cur); DocIterator cur_prev_iter; - while (true) { + do { found_match = match(cur); LYXERR(Debug::FIND, "findBackAdv3: found_match=" << found_match << ", cur: " << cur); if (found_match) { int len; findMostBackwards(cur, match, len); - if (cur < cur_orig) - return len; + return len; } - // Prevent infinite loop at begin of document - if (cur == cur_begin || cur == cur_prev_iter) + // Stop if begin of document reached + if (cur == cur_begin) break; cur_prev_iter = cur; cur.backwardPos(); - } + } while (true); } if (cur == cur_begin) break;