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<string> const & v = allManualsFiles();
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;
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: "
}
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);
}
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);
}
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;
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;