bool findChange(DocIterator & cur, bool next)
{
- if (!next)
+ if (!next)
cur.backwardPos();
for (; cur; next ? cur.forwardPos() : cur.backwardPos())
- if (cur.inTexted() && !cur.paragraph().isUnchanged(cur.pos())) {
+ if (cur.inTexted() && cur.paragraph().isChanged(cur.pos())) {
if (!next)
// if we search backwards, take a step forward
// to correctly set the anchor
}
-bool stringSelected(BufferView * bv, docstring const & searchstr,
+bool stringSelected(BufferView * bv, docstring & searchstr,
bool cs, bool mw, bool fw)
{
+ // if nothing selected and searched string is empty, this
+ // means that we want to search current word at cursor position.
+ if (!bv->cursor().selection() && searchstr.empty()) {
+ bv->cursor().innerText()->selectWord(bv->cursor(), WHOLE_WORD);
+ searchstr = bv->cursor().selectionAsString(false);
+ return true;
+ }
+
// if nothing selected or selection does not equal search
// string search and select next occurance and return
docstring const & str1 = searchstr;
}
-int replace(BufferView * bv, docstring const & searchstr,
+int replace(BufferView * bv, docstring & searchstr,
docstring const & replacestr, bool cs, bool mw, bool fw)
{
- if (!searchAllowed(bv, searchstr) || bv->buffer().isReadonly())
+ if (!stringSelected(bv, searchstr, cs, mw, fw))
return 0;
- if (!stringSelected(bv, searchstr, cs, mw, fw))
+ if (!searchAllowed(bv, searchstr) || bv->buffer().isReadonly())
return 0;
Cursor & cur = bv->cursor();
}
-docstring const replace2string(docstring const & search, docstring const & replace,
- bool casesensitive, bool matchword,
- bool all, bool forward)
+docstring const replace2string(docstring const & replace,
+ docstring const & search, bool casesensitive, bool matchword,
+ bool all, bool forward)
{
odocstringstream ss;
- ss << search << '\n'
- << replace << '\n'
+ ss << replace << '\n'
+ << search << '\n'
<< int(casesensitive) << ' '
<< int(matchword) << ' '
<< int(all) << ' '
// <casesensitive> <matchword> <all> <forward>"
docstring search;
docstring rplc;
- docstring howto = split(ev.argument(), search, '\n');
- howto = split(howto, rplc, '\n');
+ docstring howto = split(ev.argument(), rplc, '\n');
+ howto = split(howto, search, '\n');
bool casesensitive = parse_bool(howto);
bool matchword = parse_bool(howto);
int const replace_count = all
? replaceAll(bv, search, rplc, casesensitive, matchword)
: replace(bv, search, rplc, casesensitive, matchword, forward);
-
+
Buffer & buf = bv->buffer();
if (replace_count == 0) {
// emit message signal.
if (bv->cursor().selection()) {
// set the cursor at the beginning or at the end of the selection
// before searching. Otherwise, the current change will be found.
- if (next != bv->cursor().top() > bv->cursor().anchor())
+ if (next != (bv->cursor().top() > bv->cursor().anchor()))
bv->cursor().setCursorToAnchor();
}
DocIterator cur = bv->cursor();
+
+ // Are we within a change ? Then first search forward (backward),
+ // clear the selection and search the other way around (see the end
+ // of this function). This will avoid changes to be selected half.
+ bool search_both_sides = false;
+ if (cur.pos() > 1) {
+ Change change_next_pos
+ = cur.paragraph().lookupChange(cur.pos());
+ Change change_prev_pos
+ = cur.paragraph().lookupChange(cur.pos() - 1);
+ if (change_next_pos.isSimilarTo(change_prev_pos))
+ search_both_sides = true;
+ }
+
if (!findChange(cur, next))
return false;
break;
}
} else {
- for (; !tip.at_begin(); tip.backwardPos()) {
+ for (; !tip.at_begin();) {
+ tip.backwardPos();
Change change = tip.paragraph().lookupChange(tip.pos());
if (change != orig_change) {
// take a step forward to correctly set the selection
bv->cursor().setCursor(cur);
bv->cursor().setSelection();
+ if (search_both_sides) {
+ bv->cursor().setSelection(false);
+ findChange(bv, !next);
+ }
+
return true;
}
** @param at_begin
** If set, then match is searched only against beginning of text starting at cur.
** If unset, then match is searched anywhere in text starting at cur.
- **
+ **
** @return
** The length of the matching text, or zero if no match was found.
**/