mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 13:18:28 +00:00
Rewrite of change-related helpers
lyxfind.cpp(findNextChange, findPreviousChange, findChange, selectChange): factor the change-selection part out of the change-finding part Text.cpp (acceptOrRejectChanges): call only selectChange
This commit is contained in:
parent
59a9e4c306
commit
8f821dba70
@ -1276,8 +1276,7 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
|
||||
LBUFERR(this == cur.text());
|
||||
|
||||
if (!cur.selection()) {
|
||||
bool const changed = cur.paragraph().isChanged(cur.pos());
|
||||
if (!(changed && findNextChange(&cur.bv())))
|
||||
if (!selectChange(cur))
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1293,7 +1292,6 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
|
||||
bool endsBeforeEndOfPar = (endPos < pars_[endPit].size());
|
||||
|
||||
// first, accept/reject changes within each individual paragraph (do not consider end-of-par)
|
||||
|
||||
for (pit_type pit = begPit; pit <= endPit; ++pit) {
|
||||
pos_type parSize = pars_[pit].size();
|
||||
|
||||
@ -1369,11 +1367,8 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
|
||||
}
|
||||
|
||||
// finally, invoke the DEPM
|
||||
|
||||
deleteEmptyParagraphMechanism(begPit, endPit, cur.buffer()->params().track_changes);
|
||||
|
||||
//
|
||||
|
||||
cur.finishUndo();
|
||||
cur.clearSelection();
|
||||
setCursorIntern(cur, begPit, begPos);
|
||||
|
121
src/lyxfind.cpp
121
src/lyxfind.cpp
@ -390,96 +390,70 @@ bool lyxreplace(BufferView * bv,
|
||||
}
|
||||
|
||||
|
||||
namespace {
|
||||
bool findChange(DocIterator & cur, bool next)
|
||||
bool findNextChange(DocIterator & cur)
|
||||
{
|
||||
if (!next)
|
||||
cur.backwardPos();
|
||||
for (; cur; next ? cur.forwardPos() : cur.backwardPos())
|
||||
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos())) {
|
||||
if (!next)
|
||||
// if we search backwards, take a step forward
|
||||
// to correctly set the anchor
|
||||
cur.top().forwardPos();
|
||||
for (; cur; cur.forwardPos())
|
||||
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool findChange(BufferView * bv, bool next)
|
||||
bool findPreviousChange(DocIterator & cur)
|
||||
{
|
||||
Cursor cur(*bv);
|
||||
cur.setCursor(next ? bv->cursor().selectionEnd()
|
||||
: bv->cursor().selectionBegin());
|
||||
|
||||
// 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;
|
||||
Cursor tmpcur = cur;
|
||||
// Find enclosing text cursor
|
||||
while (tmpcur.inMathed())
|
||||
tmpcur.pop_back();
|
||||
Change change_next_pos
|
||||
= tmpcur.paragraph().lookupChange(tmpcur.pos());
|
||||
if (change_next_pos.changed()) {
|
||||
if (cur.inMathed()) {
|
||||
cur = tmpcur;
|
||||
search_both_sides = true;
|
||||
} else if (tmpcur.pos() > 0 && tmpcur.inTexted()) {
|
||||
Change change_prev_pos
|
||||
= tmpcur.paragraph().lookupChange(tmpcur.pos() - 1);
|
||||
if (change_next_pos.isSimilarTo(change_prev_pos))
|
||||
search_both_sides = true;
|
||||
}
|
||||
for (cur.backwardPos(); cur; cur.backwardPos()) {
|
||||
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// find the next change
|
||||
if (!findChange(cur, next))
|
||||
|
||||
bool selectChange(Cursor & cur, bool forward)
|
||||
{
|
||||
if (!cur.inTexted() || !cur.paragraph().isChanged(cur.pos()))
|
||||
return false;
|
||||
Change ch = cur.paragraph().lookupChange(cur.pos());
|
||||
|
||||
bv->mouseSetCursor(cur, false);
|
||||
|
||||
CursorSlice & tip = cur.top();
|
||||
|
||||
if (!next && tip.pos() > 0)
|
||||
// take a step into the change
|
||||
tip.backwardPos();
|
||||
|
||||
Change orig_change = tip.paragraph().lookupChange(tip.pos());
|
||||
|
||||
if (next) {
|
||||
for (; tip.pit() < tip.lastpit() || tip.pos() < tip.lastpos(); tip.forwardPos()) {
|
||||
Change change = tip.paragraph().lookupChange(tip.pos());
|
||||
if (!change.isSimilarTo(orig_change))
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
for (; tip.pit() > 0 || tip.pos() > 0;) {
|
||||
tip.backwardPos();
|
||||
Change change = tip.paragraph().lookupChange(tip.pos());
|
||||
if (!change.isSimilarTo(orig_change)) {
|
||||
// take a step forward to correctly set the selection
|
||||
tip.forwardPos();
|
||||
break;
|
||||
}
|
||||
CursorSlice tip1 = cur.top();
|
||||
for (; tip1.pit() < tip1.lastpit() || tip1.pos() < tip1.lastpos(); tip1.forwardPos()) {
|
||||
Change ch2 = tip1.paragraph().lookupChange(tip1.pos());
|
||||
if (!ch2.isSimilarTo(ch))
|
||||
break;
|
||||
}
|
||||
CursorSlice tip2 = cur.top();
|
||||
for (; tip2.pit() > 0 || tip2.pos() > 0;) {
|
||||
tip2.backwardPos();
|
||||
Change ch2 = tip2.paragraph().lookupChange(tip2.pos());
|
||||
if (!ch2.isSimilarTo(ch)) {
|
||||
// take a step forward to correctly set the selection
|
||||
tip2.forwardPos();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!search_both_sides) {
|
||||
// Now set the selection.
|
||||
bv->mouseSetCursor(cur, true);
|
||||
} else {
|
||||
bv->mouseSetCursor(cur, false);
|
||||
findChange(bv, !next);
|
||||
}
|
||||
|
||||
if (forward)
|
||||
swap(tip1, tip2);
|
||||
cur.top() = tip1;
|
||||
cur.bv().mouseSetCursor(cur, false);
|
||||
cur.top() = tip2;
|
||||
cur.bv().mouseSetCursor(cur, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
|
||||
bool findChange(BufferView * bv, bool forward)
|
||||
{
|
||||
Cursor cur(*bv);
|
||||
cur.setCursor(forward ? bv->cursor().selectionEnd()
|
||||
: bv->cursor().selectionBegin());
|
||||
forward ? findNextChange(cur) : findPreviousChange(cur);
|
||||
return selectChange(cur, forward);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool findNextChange(BufferView * bv)
|
||||
{
|
||||
@ -493,6 +467,7 @@ bool findPreviousChange(BufferView * bv)
|
||||
}
|
||||
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
typedef vector<pair<string, string> > Escapes;
|
||||
|
@ -26,6 +26,7 @@ namespace lyx {
|
||||
|
||||
|
||||
class Buffer;
|
||||
class Cursor;
|
||||
class BufferView;
|
||||
class DocIterator;
|
||||
class FuncRequest;
|
||||
@ -72,6 +73,10 @@ bool findNextChange(BufferView * bv);
|
||||
/// find the previous change in the buffer
|
||||
bool findPreviousChange(BufferView * bv);
|
||||
|
||||
/// select change under the cursor
|
||||
bool selectChange(Cursor & cur, bool forward = true);
|
||||
|
||||
|
||||
class FindAndReplaceOptions {
|
||||
public:
|
||||
typedef enum {
|
||||
|
Loading…
Reference in New Issue
Block a user