bool findOne(BufferView * bv, docstring const & searchstr,
- bool case_sens, bool whole, bool forward, bool find_del = true)
+ bool case_sens, bool whole, bool forward,
+ bool find_del = true, bool check_wrap = false)
{
if (!searchAllowed(searchstr))
return false;
if (match_len > 0)
bv->putSelectionAt(cur, match_len, !forward);
+ else if (check_wrap) {
+ DocIterator cur_orig(bv->cursor());
+ docstring q;
+ if (forward)
+ q = _("End of file reached while searching forward.\n"
+ "Continue searching from the beginning?");
+ else
+ q = _("Beginning of file reached while searching backward.\n"
+ "Continue searching from the end?");
+ int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
+ q, 0, 1, _("&Yes"), _("&No"));
+ if (wrap_answer == 0) {
+ if (forward) {
+ bv->cursor().clear();
+ bv->cursor().push_back(CursorSlice(bv->buffer().inset()));
+ } else {
+ bv->cursor().setCursor(doc_iterator_end(&bv->buffer()));
+ bv->cursor().backwardPos();
+ }
+ bv->clearSelection();
+ if (findOne(bv, searchstr, case_sens, whole, forward, find_del, false))
+ return true;
+ }
+ bv->cursor().setCursor(cur_orig);
+ return false;
+ }
return match_len > 0;
}
bool whole, bool forward, bool findnext)
{
Cursor & cur = bv->cursor();
+ bool found = false;
if (!cur.selection()) {
// no selection, non-empty search string: find it
if (!searchstr.empty()) {
- findOne(bv, searchstr, case_sens, whole, forward);
- return make_pair(true, 0);
+ found = findOne(bv, searchstr, case_sens, whole, forward, true, findnext);
+ return make_pair(found, 0);
}
// empty search string
if (!cur.inTexted())
// no selection or current selection is not search word:
// just find the search word
if (!have_selection || !match) {
- findOne(bv, searchstr, case_sens, whole, forward);
- return make_pair(true, 0);
+ found = findOne(bv, searchstr, case_sens, whole, forward, true, findnext);
+ return make_pair(found, 0);
}
// we're now actually ready to replace. if the buffer is
cur.pos() = cur.lastpos());
}
if (findnext)
- findOne(bv, searchstr, case_sens, whole, forward, false);
+ findOne(bv, searchstr, case_sens, whole, forward, false, findnext);
return make_pair(true, 1);
}
bool matchword = parse_bool(howto);
bool forward = parse_bool(howto);
- return findOne(bv, search, casesensitive, matchword, forward);
+ return findOne(bv, search, casesensitive, matchword, forward, true, true);
}
} else if (findnext) {
// if we have deleted characters, we do not replace at all, but
// rather search for the next occurence
- if (findOne(bv, search, casesensitive, matchword, forward))
+ if (findOne(bv, search, casesensitive, matchword, forward, true, findnext))
update = true;
else
bv->message(_("String not found."));
}
- bv->buffer().updatePreviews();
return update;
}
-bool findNextChange(DocIterator & cur)
+bool findNextChange(BufferView * bv, Cursor & cur, bool const check_wrap)
{
for (; cur; cur.forwardPos())
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
return true;
+
+ if (check_wrap) {
+ DocIterator cur_orig(bv->cursor());
+ docstring q = _("End of file reached while searching forward.\n"
+ "Continue searching from the beginning?");
+ int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
+ q, 0, 1, _("&Yes"), _("&No"));
+ if (wrap_answer == 0) {
+ bv->cursor().clear();
+ bv->cursor().push_back(CursorSlice(bv->buffer().inset()));
+ bv->clearSelection();
+ cur.setCursor(bv->cursor().selectionBegin());
+ if (findNextChange(bv, cur, false))
+ return true;
+ }
+ bv->cursor().setCursor(cur_orig);
+ }
+
return false;
}
-bool findPreviousChange(DocIterator & cur)
+bool findPreviousChange(BufferView * bv, Cursor & cur, bool const check_wrap)
{
for (cur.backwardPos(); cur; cur.backwardPos()) {
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
return true;
}
+
+ if (check_wrap) {
+ DocIterator cur_orig(bv->cursor());
+ docstring q = _("Beginning of file reached while searching backward.\n"
+ "Continue searching from the end?");
+ int wrap_answer = frontend::Alert::prompt(_("Wrap search?"),
+ q, 0, 1, _("&Yes"), _("&No"));
+ if (wrap_answer == 0) {
+ bv->cursor().setCursor(doc_iterator_end(&bv->buffer()));
+ bv->cursor().backwardPos();
+ bv->clearSelection();
+ cur.setCursor(bv->cursor().selectionBegin());
+ if (findPreviousChange(bv, cur, false))
+ return true;
+ }
+ bv->cursor().setCursor(cur_orig);
+ }
+
return false;
}
Cursor cur(*bv);
cur.setCursor(forward ? bv->cursor().selectionEnd()
: bv->cursor().selectionBegin());
- forward ? findNextChange(cur) : findPreviousChange(cur);
+ forward ? findNextChange(bv, cur, true) : findPreviousChange(bv, cur, true);
return selectChange(cur, forward);
}
for (int s = cur.depth() - 1; s >= 0; --s) {
CursorSlice const & cs = cur[s];
if (cs.asInsetMath() && cs.asInsetMath()->asHullInset()) {
- WriteStream ws(ods);
+ WriteStream ws(os);
cs.asInsetMath()->asHullInset()->header_write(ws);
break;
}
CursorSlice const & cs = cur[s];
InsetMath * inset = cs.asInsetMath();
if (inset && inset->asHullInset()) {
- WriteStream ws(ods);
+ WriteStream ws(os);
inset->asHullInset()->footer_write(ws);
break;
}
LYXERR(Debug::FIND, "After pos adj cur=" << cur << " with depth: " << cur.depth() << " and len: " << sel_len);
bv->putSelectionAt(DocIterator(cur), sel_len, !opt.forward);
bv->processUpdateFlags(Update::Force);
- bv->buffer().updatePreviews();
}