/* This file is part of
- * ======================================================
- *
+ * ======================================================
+ *
* LyX, The Document Processor
- *
+ *
* Copyright 1995-2001 The LyX Team.
*
* ====================================================== */
#include "iterators.h"
-//#define DELETE_UNUSED_PARAGRAPHS 1
+#define DELETE_UNUSED_PARAGRAPHS 1
#ifdef DELETE_UNUSED_PARAGRAPHS
#include <vector>
#endif
+using std::vector;
+
+
/// the flag used by FinishUndo();
bool undo_finished;
/// a flag
if (first) {
bv->buffer()->redostack.push(
createUndo(bv, undo->kind, first,
- bv->buffer()->getParFromID(undo->number_of_behind_par)));
+ bv->buffer()->getParFromID(undo->number_of_behind_par)));
}
}
}
if (first) {
bv->buffer()->undostack.push(
createUndo(bv, undo->kind, first,
- bv->buffer()->getParFromID(undo->number_of_behind_par)));
+ bv->buffer()->getParFromID(undo->number_of_behind_par)));
}
}
}
bool result = false;
if (undo) {
Paragraph * before =
- bv->buffer()->getParFromID(undo->number_of_before_par);
+ bv->buffer()->getParFromID(undo->number_of_before_par);
Paragraph * behind =
- bv->buffer()->getParFromID(undo->number_of_behind_par);
+ bv->buffer()->getParFromID(undo->number_of_behind_par);
Paragraph * tmppar;
Paragraph * tmppar2;
Paragraph * tmppar5;
// 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 and set the right(new) inset-owner of the
// paragraph if there is any. This is not needed if we don't have
Inset * in = 0;
if (before)
in = before->inInset();
+ else if (undo->number_of_inset_id >= 0)
+ in = bv->buffer()->getInsetFromID(undo->number_of_inset_id);
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;
+ vector<Paragraph *> vvpar;
#endif
if (before != behind || (!behind && !before)) {
if (before)
tmppar = tmppar5;
tmppar5 = tmppar5->next();
// a memory optimization for edit:
- // Only layout information
+ // Only layout information
// is stored in the undo. So restore
- // the text informations.
+ // the text informations.
if (undo->kind == Undo::EDIT) {
tmppar2->setContentsFromPar(tmppar);
#ifndef DELETE_UNUSED_PARAGRAPHS
}
}
}
-
+
// put the new stuff in the list if there is one
- if (tmppar3){
+ if (tmppar3) {
if (before)
before->next(tmppar3);
else
- bv->text->ownerParagraph(tmppar3->id(),
+ bv->text->ownerParagraph(firstUndoParagraph(bv, undo->number_of_inset_id)->id(),
tmppar3);
tmppar3->previous(before);
} else {
- // Do we really enter here ??? (Jug)
+ // We enter here on DELETE undo operations where we have to
+ // substitue the second paragraph with the first if the removed
+ // one is the first!
if (!before && behind) {
- bv->text->ownerParagraph(behind);
+ bv->text->ownerParagraph(firstUndoParagraph(bv, undo->number_of_inset_id)->id(),
+ behind);
tmppar3 = behind;
}
}
if (behind)
behind->previous(tmppar4);
}
-
-
+
+
// Set the cursor for redoing
if (before) {
Inset * it = before->inInset();
it = static_cast<UpdatableInset*>(tmppar3->inInset());
if (it) {
it->getLyXText(bv)->redoParagraphs(bv,
- it->getLyXText(bv)->cursor,
- endpar);
- LyXFont font;
- it->update(bv, font, false);
- // we now would have to rebreak the whole paragraph the
- // undo-par was in. How we do it here is not really true.
- // We would have to save this information in the undo-struct
- // and then we could do the right rebreak. Here we only
- // handle the case where this was in the actual paragraph,
- // which not always is true.
- bv->text->redoParagraphs(bv, bv->text->cursor,
- bv->text->cursor.par());
- if (tmppar){
+ it->getLyXText(bv)->cursor,
+ endpar);
+ if (tmppar) {
it = static_cast<UpdatableInset*>(tmppar->inInset());
LyXText * t;
if (it) {
}
t->setCursorIntern(bv, tmppar, undo->cursor_pos);
t->updateCounters(bv, t->cursor.row());
+ bv->fitCursor();
}
+ bv->updateInset(it, false);
bv->text->setCursorIntern(bv, bv->text->cursor.par(),
- bv->text->cursor.pos());
+ bv->text->cursor.pos());
} else {
bv->text->redoParagraphs(bv, bv->text->cursor, endpar);
if (tmppar) {
delete undo;
#ifdef DELETE_UNUSED_PARAGRAPHS
// And here it's save enough to delete all removed paragraphs
- std::vector<Paragraph *>::iterator pit = vvpar.begin();
+ vector<Paragraph *>::iterator pit = vvpar.begin();
if (pit != vvpar.end()) {
+#if 0
+ lyxerr << endl << "PARS BEFORE:";
+ ParIterator end = bv->buffer()->par_iterator_end();
+ ParIterator it = bv->buffer()->par_iterator_begin();
+ for (; it != end; ++it)
+ lyxerr << (*it)->previous() << "<- " << (*it) << " ->" << (*it)->next() << endl;
lyxerr << "DEL: ";
+#endif
for(;pit != vvpar.end(); ++pit) {
- lyxerr << *pit << " ";
+// lyxerr << *pit << " ";
+ (*pit)->previous(0);
+ (*pit)->next(0);
delete (*pit);
}
- lyxerr << endl << "PARS:";
- ParIterator end = bv->buffer()->par_iterator_end();
- ParIterator it = bv->buffer()->par_iterator_begin();
+#if 0
+ lyxerr << endl << "PARS AFTER:";
+ end = bv->buffer()->par_iterator_end();
+ it = bv->buffer()->par_iterator_begin();
for (; it != end; ++it)
- lyxerr << *it << " ";
- lyxerr << endl;
+ lyxerr << (*it)->previous() << "<- " << (*it) << " ->" << (*it)->next() << endl;
+#endif
}
#endif
}
void setUndo(BufferView * bv, Undo::undo_kind kind,
- Paragraph const * first, Paragraph const * behind)
+ Paragraph const * first, Paragraph const * behind)
{
if (!undo_frozen) {
bv->buffer()->undostack.push(createUndo(bv, kind, first, behind));
void setRedo(BufferView * bv, Undo::undo_kind kind,
- Paragraph const * first, Paragraph const * behind)
+ Paragraph const * first, Paragraph const * behind)
{
bv->buffer()->redostack.push(createUndo(bv, kind, first, behind));
}
Undo * createUndo(BufferView * bv, Undo::undo_kind kind,
- Paragraph const * first, Paragraph const * behind)
+ Paragraph const * first, Paragraph const * behind)
{
lyx::Assert(first);
// Undo::EDIT and Undo::FINISH are
// always finished. (no overlapping there)
- // overlapping only with insert and delete inside one paragraph:
+ // overlapping only with insert and delete inside one paragraph:
// Nobody wants all removed character
- // appear one by one when undoing.
+ // appear one by one when undoing.
// EDIT is special since only layout information, not the
// contents of a paragaph are stored.
- if (!undo_finished && (kind != Undo::EDIT) && (kind != Undo::FINISH)){
+ if (!undo_finished && (kind != Undo::EDIT) && (kind != Undo::FINISH)) {
// check wether storing is needed
- if (!bv->buffer()->undostack.empty() &&
+ if (!bv->buffer()->undostack.empty() &&
bv->buffer()->undostack.top()->kind == kind &&
bv->buffer()->undostack.top()->number_of_before_par == before_number &&
bv->buffer()->undostack.top()->number_of_behind_par == behind_number) {
{
Paragraph * tmppar = start;
Paragraph * tmppar2 = new Paragraph(*tmppar, true);
-
+
// a memory optimization: Just store the layout information
// when only edit
if (kind == Undo::EDIT) {
}
undopar = tmppar2;
-
+
while (tmppar != end && tmppar->next()) {
tmppar = tmppar->next();
+#if 0
tmppar2->next(new Paragraph(*tmppar, true));
+#else
+ Paragraph * ptmp = new Paragraph(*tmppar, true);
+ tmppar2->next(ptmp);
+#endif
// a memory optimization: Just store the layout
// information when only edit
if (kind == Undo::EDIT) {
tmppar2->clearContents();
}
tmppar2->next()->previous(tmppar2);
+
tmppar2 = tmppar2->next();
}
tmppar2->next(0);
int cursor_par = undoCursor(bv).par()->id();
int cursor_pos = undoCursor(bv).pos();
-
+
Undo * undo = new Undo(kind, inset_id,
- before_number, behind_number,
- cursor_par, cursor_pos, undopar);
-
+ before_number, behind_number,
+ cursor_par, cursor_pos, undopar);
+
undo_finished = false;
return undo;
}
void setCursorParUndo(BufferView * bv)
{
setUndo(bv, Undo::FINISH, bv->text->cursor.par(),
- bv->text->cursor.par()->next());
+ bv->text->cursor.par()->next());
}