mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 13:18:28 +00:00
Create proper undo groups for advanced find and replace
Create new helper class UndoGroupHelper, which simplifies a lot the handling of undo groups in cases like this one. The class tracks open undo buffers and allows to switch buffers transparently. Using the class for advanced search and replace is trivial. THe class may be useful in some other classes. Fixes ticket #8658
This commit is contained in:
parent
c444fddc0b
commit
7760c5ccf2
13
src/Undo.cpp
13
src/Undo.cpp
@ -617,5 +617,18 @@ void Undo::recordUndoFullBuffer(CursorData const & cur)
|
|||||||
endUndoGroup();
|
endUndoGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// UndoGroupHelper class stuff
|
||||||
|
|
||||||
|
void UndoGroupHelper::resetBuffer(Buffer * buf)
|
||||||
|
{
|
||||||
|
if (buf == buffer_)
|
||||||
|
return;
|
||||||
|
if (buffer_)
|
||||||
|
buffer_->undo().endUndoGroup();
|
||||||
|
buffer_ = buf;
|
||||||
|
if (buffer_)
|
||||||
|
buffer_->undo().beginUndoGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
28
src/Undo.h
28
src/Undo.h
@ -117,6 +117,34 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Helper class to simplify the use of undo groups across several buffers.
|
||||||
|
*
|
||||||
|
* The undo group is created when the object is instanciated; it is
|
||||||
|
* then ended as the object goes out of scope or the buffer is reset
|
||||||
|
* (see below)
|
||||||
|
*/
|
||||||
|
class UndoGroupHelper {
|
||||||
|
public:
|
||||||
|
UndoGroupHelper(Buffer * buf) : buffer_(0)
|
||||||
|
{
|
||||||
|
resetBuffer(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
~UndoGroupHelper()
|
||||||
|
{
|
||||||
|
resetBuffer(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Close the current undo group if necessary and create a new one
|
||||||
|
* for buffer \c buf.
|
||||||
|
*/
|
||||||
|
void resetBuffer(Buffer * buf);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Buffer * buffer_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
|
||||||
|
@ -340,6 +340,8 @@ bool FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt, bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UndoGroupHelper helper(buf);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
LYXERR(Debug::FIND, "Dispatching LFUN_WORD_FINDADV");
|
LYXERR(Debug::FIND, "Dispatching LFUN_WORD_FINDADV");
|
||||||
dispatch(cmd);
|
dispatch(cmd);
|
||||||
@ -384,6 +386,9 @@ bool FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt, bool
|
|||||||
if (buf != &view_.documentBufferView()->buffer())
|
if (buf != &view_.documentBufferView()->buffer())
|
||||||
lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
|
lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
|
||||||
buf->absFileName()));
|
buf->absFileName()));
|
||||||
|
|
||||||
|
helper.resetBuffer(buf);
|
||||||
|
|
||||||
bv = view_.documentBufferView();
|
bv = view_.documentBufferView();
|
||||||
if (opt.forward) {
|
if (opt.forward) {
|
||||||
bv->cursor().clear();
|
bv->cursor().clear();
|
||||||
@ -397,6 +402,7 @@ bool FindAndReplaceWidget::findAndReplaceScope(FindAndReplaceOptions & opt, bool
|
|||||||
}
|
}
|
||||||
bv->clearSelection();
|
bv->clearSelection();
|
||||||
} while (wrap_answer != 1);
|
} while (wrap_answer != 1);
|
||||||
|
|
||||||
if (buf_orig != &view_.documentBufferView()->buffer())
|
if (buf_orig != &view_.documentBufferView()->buffer())
|
||||||
lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
|
lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
|
||||||
buf_orig->absFileName()));
|
buf_orig->absFileName()));
|
||||||
|
Loading…
Reference in New Issue
Block a user