-}
-
-
-// Returns false if no undo possible.
-bool textUndoOrRedo(BufferView & bv,
- limited_stack<Undo> & stack, limited_stack<Undo> & otherstack)
-{
- if (stack.empty()) {
- // Nothing to do.
- finishUndo();
- return false;
- }
-
- //
- // Adjust undo stack and get hold of current undo data.
- //
- Undo undo = stack.top();
- stack.pop();
- finishUndo();
-
-
- //
- // This implements redo.
- //
-
- // The cursor will be placed at cur_dit after
- // the ongoing undo operation.
- DocIterator cur_dit =
- undo.cursor.asDocIterator(&bv.buffer()->inset());
-
- // This is the place the cursor is currently located.
- LCursor & cur = bv.cursor();
- DocIterator cell_dit = cur;
-
- // If both places have the same depth we stay in the same
- // cell and store paragraphs from this cell. Otherwise we
- // will drop slices from the more nested iterator and
- // create an undo item from a single paragraph of the common
- // ancestor.
- DocIterator ancestor_dit = cur_dit;
- while (ancestor_dit.size() > cur.size())
- ancestor_dit.pop_back();
-
- if (cur_dit.size() == cell_dit.size()) {
- recordUndo(Undo::ATOMIC, cell_dit,
- cell_dit.pit(), cur_dit.pit(),
- cur_dit, otherstack);
- }
- else {
- recordUndo(Undo::ATOMIC, ancestor_dit,
- ancestor_dit.pit(),
- ancestor_dit.pit(),
- cur_dit, otherstack);
- }