mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-19 05:53:35 +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 (cherry picked from commit 8f821dba70647b1547473aa44926eb1e6819b7a0) Conflicts: src/Text.cpp
This commit is contained in:
parent
c966875ece
commit
d91035d89f
@ -1275,8 +1275,7 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
|
|||||||
LBUFERR(this == cur.text());
|
LBUFERR(this == cur.text());
|
||||||
|
|
||||||
if (!cur.selection()) {
|
if (!cur.selection()) {
|
||||||
bool const changed = cur.paragraph().isChanged(cur.pos());
|
if (!selectChange(cur))
|
||||||
if (!(changed && findNextChange(&cur.bv())))
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1292,7 +1291,6 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
|
|||||||
bool endsBeforeEndOfPar = (endPos < pars_[endPit].size());
|
bool endsBeforeEndOfPar = (endPos < pars_[endPit].size());
|
||||||
|
|
||||||
// first, accept/reject changes within each individual paragraph (do not consider end-of-par)
|
// first, accept/reject changes within each individual paragraph (do not consider end-of-par)
|
||||||
|
|
||||||
for (pit_type pit = begPit; pit <= endPit; ++pit) {
|
for (pit_type pit = begPit; pit <= endPit; ++pit) {
|
||||||
pos_type parSize = pars_[pit].size();
|
pos_type parSize = pars_[pit].size();
|
||||||
|
|
||||||
@ -1368,11 +1366,8 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// finally, invoke the DEPM
|
// finally, invoke the DEPM
|
||||||
|
|
||||||
deleteEmptyParagraphMechanism(begPit, endPit, cur.buffer()->params().trackChanges);
|
deleteEmptyParagraphMechanism(begPit, endPit, cur.buffer()->params().trackChanges);
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
cur.finishUndo();
|
cur.finishUndo();
|
||||||
cur.clearSelection();
|
cur.clearSelection();
|
||||||
setCursorIntern(cur, begPit, begPos);
|
setCursorIntern(cur, begPit, begPos);
|
||||||
|
121
src/lyxfind.cpp
121
src/lyxfind.cpp
@ -390,96 +390,70 @@ bool lyxreplace(BufferView * bv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
bool findNextChange(DocIterator & cur)
|
||||||
bool findChange(DocIterator & cur, bool next)
|
|
||||||
{
|
{
|
||||||
if (!next)
|
for (; cur; cur.forwardPos())
|
||||||
cur.backwardPos();
|
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
|
||||||
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();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool findChange(BufferView * bv, bool next)
|
bool findPreviousChange(DocIterator & cur)
|
||||||
{
|
{
|
||||||
Cursor cur(*bv);
|
for (cur.backwardPos(); cur; cur.backwardPos()) {
|
||||||
cur.setCursor(next ? bv->cursor().selectionEnd()
|
if (cur.inTexted() && cur.paragraph().isChanged(cur.pos()))
|
||||||
: bv->cursor().selectionBegin());
|
return true;
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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;
|
return false;
|
||||||
|
Change ch = cur.paragraph().lookupChange(cur.pos());
|
||||||
|
|
||||||
bv->mouseSetCursor(cur, false);
|
CursorSlice tip1 = cur.top();
|
||||||
|
for (; tip1.pit() < tip1.lastpit() || tip1.pos() < tip1.lastpos(); tip1.forwardPos()) {
|
||||||
CursorSlice & tip = cur.top();
|
Change ch2 = tip1.paragraph().lookupChange(tip1.pos());
|
||||||
|
if (!ch2.isSimilarTo(ch))
|
||||||
if (!next && tip.pos() > 0)
|
break;
|
||||||
// take a step into the change
|
}
|
||||||
tip.backwardPos();
|
CursorSlice tip2 = cur.top();
|
||||||
|
for (; tip2.pit() > 0 || tip2.pos() > 0;) {
|
||||||
Change orig_change = tip.paragraph().lookupChange(tip.pos());
|
tip2.backwardPos();
|
||||||
|
Change ch2 = tip2.paragraph().lookupChange(tip2.pos());
|
||||||
if (next) {
|
if (!ch2.isSimilarTo(ch)) {
|
||||||
for (; tip.pit() < tip.lastpit() || tip.pos() < tip.lastpos(); tip.forwardPos()) {
|
// take a step forward to correctly set the selection
|
||||||
Change change = tip.paragraph().lookupChange(tip.pos());
|
tip2.forwardPos();
|
||||||
if (!change.isSimilarTo(orig_change))
|
break;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (forward)
|
||||||
if (!search_both_sides) {
|
swap(tip1, tip2);
|
||||||
// Now set the selection.
|
cur.top() = tip1;
|
||||||
bv->mouseSetCursor(cur, true);
|
cur.bv().mouseSetCursor(cur, false);
|
||||||
} else {
|
cur.top() = tip2;
|
||||||
bv->mouseSetCursor(cur, false);
|
cur.bv().mouseSetCursor(cur, true);
|
||||||
findChange(bv, !next);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 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)
|
bool findNextChange(BufferView * bv)
|
||||||
{
|
{
|
||||||
@ -493,6 +467,7 @@ bool findPreviousChange(BufferView * bv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
typedef vector<pair<string, string> > Escapes;
|
typedef vector<pair<string, string> > Escapes;
|
||||||
|
@ -26,6 +26,7 @@ namespace lyx {
|
|||||||
|
|
||||||
|
|
||||||
class Buffer;
|
class Buffer;
|
||||||
|
class Cursor;
|
||||||
class BufferView;
|
class BufferView;
|
||||||
class DocIterator;
|
class DocIterator;
|
||||||
class FuncRequest;
|
class FuncRequest;
|
||||||
@ -72,6 +73,10 @@ bool findNextChange(BufferView * bv);
|
|||||||
/// find the previous change in the buffer
|
/// find the previous change in the buffer
|
||||||
bool findPreviousChange(BufferView * bv);
|
bool findPreviousChange(BufferView * bv);
|
||||||
|
|
||||||
|
/// select change under the cursor
|
||||||
|
bool selectChange(Cursor & cur, bool forward = true);
|
||||||
|
|
||||||
|
|
||||||
class FindAndReplaceOptions {
|
class FindAndReplaceOptions {
|
||||||
public:
|
public:
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user