Fixed Undo/Redo, from Changelog:

* undo_funcs.C (textHandleUndo): fixed setting of inset_owner of
	the paragraphs if the replaced paragraph is not the first one!
	Tried to delete not used paragraphs but does not work yet so for
	now it's inside #ifdef's and by default off!


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@3244 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Vigna 2001-12-19 08:59:15 +00:00
parent 0e5b6f557b
commit 03a76a07ce
2 changed files with 57 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2001-12-19 Juergen Vigna <jug@sad.it>
* undo_funcs.C (textHandleUndo): fixed setting of inset_owner of
the paragraphs if the replaced paragraph is not the first one!
Tried to delete not used paragraphs but does not work yet so for
now it's inside #ifdef's and by default off!
2001-12-18 Jean-Marc Lasgouttes <lasgouttes@freesurf.fr>
* MenuBackend.C: include "lyx_main.h" instead of declaring

View File

@ -21,6 +21,13 @@
#include "debug.h"
#include "support/LAssert.h"
#include "iterators.h"
//#define DELETE_UNUSED_PARAGRAPHS 1
#ifdef DELETE_UNUSED_PARAGRAPHS
#include <vector>
#endif
/// the flag used by FinishUndo();
bool undo_finished;
/// a flag
@ -121,17 +128,29 @@ bool textHandleUndo(BufferView * bv, Undo * undo)
// replace the paragraphs with the undo informations
Paragraph * tmppar3 = undo->par;
undo->par = 0; // otherwise the undo destructor would
// delete the paragraph
undo->par = 0; /* otherwise the undo destructor would
delete the paragraph */
// get last undo par
// get last undo par and set the right(new) inset-owner of the
// paragraph if there is any. This is not needed if we don't have
// a paragraph before because then in is automatically done in the
// function which assigns the first paragraph to an InsetText. (Jug)
Paragraph * tmppar4 = tmppar3;
if (tmppar4) {
while (tmppar4->next())
Inset * in = 0;
if (before)
in = before->inInset();
tmppar4->setInsetOwner(in);
while (tmppar4->next()) {
tmppar4 = tmppar4->next();
}
tmppar4->setInsetOwner(in);
}
}
// now remove the old text if there is any
#ifdef DELETE_UNUSED_PARAGRAPHS
std::vector<Paragraph *> vvpar;
#endif
if (before != behind || (!behind && !before)) {
if (before)
tmppar5 = before->next();
@ -139,6 +158,9 @@ bool textHandleUndo(BufferView * bv, Undo * undo)
tmppar5 = firstUndoParagraph(bv, undo->number_of_inset_id);
tmppar2 = tmppar3;
while (tmppar5 && tmppar5 != behind) {
#ifdef DELETE_UNUSED_PARAGRAPHS
vvpar.push_back(tmppar5);
#endif
tmppar = tmppar5;
tmppar5 = tmppar5->next();
// a memory optimization for edit:
@ -147,7 +169,9 @@ bool textHandleUndo(BufferView * bv, Undo * undo)
// the text informations.
if (undo->kind == Undo::EDIT) {
tmppar2->setContentsFromPar(tmppar);
#ifndef DELETE_UNUSED_PARAGRAPHS
tmppar->clearContents();
#endif
tmppar2 = tmppar2->next();
}
}
@ -215,16 +239,35 @@ bool textHandleUndo(BufferView * bv, Undo * undo)
if (tmppar) {
LyXText * t;
Inset * it = tmppar->inInset();
if (it)
if (it) {
it->edit(bv);
t = it->getLyXText(bv);
else
} else {
t = bv->text;
}
t->setCursorIntern(bv, tmppar, undo->cursor_pos);
t->updateCounters(bv, t->cursor.row());
}
}
result = true;
delete undo;
#ifdef DELETE_UNUSED_PARAGRAPHS
// And here it's save enough to delete all removed paragraphs
std::vector<Paragraph *>::iterator pit = vvpar.begin();
if (pit != vvpar.end()) {
lyxerr << "DEL: ";
for(;pit != vvpar.end(); ++pit) {
lyxerr << *pit << " ";
delete (*pit);
}
lyxerr << endl << "PARS:";
ParIterator end = bv->buffer()->par_iterator_end();
ParIterator it = bv->buffer()->par_iterator_begin();
for (; it != end; ++it)
lyxerr << *it << " ";
lyxerr << endl;
}
#endif
}
finishUndo();
bv->text->status(bv, LyXText::NEED_MORE_REFRESH);