]> git.lyx.org Git - features.git/commitdiff
Fixed Undo/Redo, from Changelog:
authorJürgen Vigna <jug@sad.it>
Wed, 19 Dec 2001 08:59:15 +0000 (08:59 +0000)
committerJürgen Vigna <jug@sad.it>
Wed, 19 Dec 2001 08:59:15 +0000 (08:59 +0000)
* 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

src/ChangeLog
src/undo_funcs.C

index 9a6982a59bdef25b8756a25f0bfbad0ceb7ba4d7..90d9b9f1953df963432e06af2b8c30724faaff9b 100644 (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
index d8b76866fc884b1fd22e3413474c69227eb7e84d..2a8120d762f6bd8df3684dee1bbe0877a3f52321 100644 (file)
 #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);