#include "lyxfind.h"
#include "Buffer.h"
+#include "BufferParams.h"
#include "Cursor.h"
#include "CutAndPaste.h"
#include "buffer_funcs.h"
#include "BufferView.h"
+#include "Changes.h"
#include "debug.h"
#include "FuncRequest.h"
#include "gettext.h"
-#include "LyXText.h"
+#include "Text.h"
#include "Paragraph.h"
#include "ParIterator.h"
-#include "Undo.h"
-#include "frontends/Alert.h"
+#include "frontends/alert.h"
#include "support/convert.h"
#include "support/docstream.h"
{}
// returns true if the specified string is at the specified position
- bool operator()(Paragraph const & par, pos_type pos) const
+ // del specifies whether deleted strings in ct mode will be considered
+ bool operator()(Paragraph const & par, pos_type pos, bool del = true) const
{
docstring::size_type const size = str.length();
pos_type i = 0;
break;
if (!cs && uppercase(str[i]) != uppercase(par.getChar(pos + i)))
break;
+ if (!del && par.isDeleted(pos + i))
+ break;
}
if (size != docstring::size_type(i))
};
-bool findForward(DocIterator & cur, MatchString const & match)
+bool findForward(DocIterator & cur, MatchString const & match,
+ bool find_del = true)
{
for (; cur; cur.forwardChar())
- if (cur.inTexted() && match(cur.paragraph(), cur.pos()))
+ if (cur.inTexted() &&
+ match(cur.paragraph(), cur.pos(), find_del))
return true;
return false;
}
-bool findBackwards(DocIterator & cur, MatchString const & match)
+bool findBackwards(DocIterator & cur, MatchString const & match,
+ bool find_del = true)
{
while (cur) {
cur.backwardChar();
- if (cur.inTexted() && match(cur.paragraph(), cur.pos()))
+ if (cur.inTexted() &&
+ match(cur.paragraph(), cur.pos(), find_del))
return true;
}
return false;
{
if (str.empty()) {
frontend::Alert::error(_("Search error"),
- _("Search string is empty"));
+ _("Search string is empty"));
return false;
}
- return bv->buffer();
+ return true;
}
-bool find(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool fw)
+bool find(BufferView * bv, docstring const & searchstr, bool cs, bool mw, bool fw,
+ bool find_del = true)
{
if (!searchAllowed(bv, searchstr))
return false;
MatchString const match(searchstr, cs, mw);
- bool found = fw ? findForward(cur, match) : findBackwards(cur, match);
+ bool found = fw ? findForward(cur, match, find_del) :
+ findBackwards(cur, match, find_del);
if (found)
bv->putSelectionAt(cur, searchstr.length(), !fw);
docstring const & searchstr, docstring const & replacestr,
bool cs, bool mw)
{
- Buffer & buf = *bv->buffer();
+ Buffer & buf = bv->buffer();
if (!searchAllowed(bv, searchstr) || buf.isReadonly())
return 0;
- recordUndoFullDocument(bv);
+ bv->cursor().recordUndoFullDocument();
MatchString const match(searchstr, cs, mw);
int num = 0;
int const ssize = searchstr.size();
DocIterator cur = doc_iterator_begin(buf.inset());
- while (findForward(cur, match)) {
+ while (findForward(cur, match, false)) {
pos_type pos = cur.pos();
- LyXFont const font
+ Font const font
= cur.paragraph().getFontSettings(buf.params(), pos);
int striked = ssize - cur.paragraph().eraseChars(pos, pos + ssize,
buf.params().trackChanges);
cur.paragraph().insert(pos, replacestr, font,
- Change(buf.params().trackChanges ?
- Change::INSERTED : Change::UNCHANGED));
+ Change(buf.params().trackChanges ?
+ Change::INSERTED : Change::UNCHANGED));
for (int i = 0; i < rsize + striked; ++i)
cur.forwardChar();
++num;
int replace(BufferView * bv, docstring const & searchstr,
docstring const & replacestr, bool cs, bool mw, bool fw)
{
- if (!searchAllowed(bv, searchstr) || bv->buffer()->isReadonly())
+ if (!searchAllowed(bv, searchstr) || bv->buffer().isReadonly())
return 0;
if (!stringSelected(bv, searchstr, cs, mw, fw))
Cursor & cur = bv->cursor();
cap::replaceSelectionWithString(cur, replacestr, fw);
- bv->buffer()->markDirty();
- find(bv, searchstr, cs, mw, fw);
- bv->update();
+ bv->buffer().markDirty();
+ find(bv, searchstr, cs, mw, fw, false);
+ bv->processUpdateFlags(Update::Force | Update::FitCursor);
return 1;
}
}
-void replace(BufferView * bv, FuncRequest const & ev)
+void replace(BufferView * bv, FuncRequest const & ev, bool has_deleted)
{
if (!bv || ev.action != LFUN_WORD_REPLACE)
return;
bool all = parse_bool(howto);
bool forward = parse_bool(howto);
- Buffer * buf = bv->buffer();
-
- int const replace_count = all
- ? replaceAll(bv, search, rplc, casesensitive, matchword)
- : replace(bv, search, rplc, casesensitive, matchword, forward);
-
- if (replace_count == 0) {
- // emit message signal.
- buf->message(_("String not found!"));
- } else {
- if (replace_count == 1) {
+ if (!has_deleted) {
+ 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.
- buf->message(_("String has been replaced."));
+ buf.message(_("String not found!"));
} else {
- docstring str = convert<docstring>(replace_count);
- str += _(" strings have been replaced.");
- // emit message signal.
- buf->message(str);
+ if (replace_count == 1) {
+ // emit message signal.
+ buf.message(_("String has been replaced."));
+ } else {
+ docstring str = convert<docstring>(replace_count);
+ str += _(" strings have been replaced.");
+ // emit message signal.
+ buf.message(str);
+ }
}
+ } else {
+ // if we have deleted characters, we do not replace at all, but
+ // rather search for the next occurence
+ bool const found = find(bv, search,
+ casesensitive, matchword, forward);
+
+ if (!found)
+ // emit message signal.
+ bv->message(_("String not found!"));
}
}
bool findNextChange(BufferView * bv)
{
- if (!bv->buffer())
- return false;
-
DocIterator cur = bv->cursor();
if (!findChange(cur))
Change orig_change = cur.paragraph().lookupChange(cur.pos());
- DocIterator et = doc_iterator_end(cur.inset());
- DocIterator ok = cur; // see below
- for (; cur != et; cur.forwardPosNoDescend()) {
- ok = cur;
- Change change = cur.paragraph().lookupChange(cur.pos());
- if (change != orig_change) {
+ CursorSlice & tip = cur.top();
+ for (; !tip.at_end(); tip.forwardPos()) {
+ Change change = tip.paragraph().lookupChange(tip.pos());
+ if (change != orig_change)
break;
- }
}
-
// avoid crash (assertion violation) if the imaginary end-of-par
- // character of the last paragraph of the document is marked as changed
- if (cur == et) {
- cur = ok;
- }
+ // character of the last paragraph of the document is marked as changed
+ if (tip.at_end())
+ tip.backwardPos();
// Now put cursor to end of selection:
bv->cursor().setCursor(cur);