]> git.lyx.org Git - lyx.git/blobdiff - src/ParagraphList.C
don't rm emergency saves ever
[lyx.git] / src / ParagraphList.C
index 65f1e0ebcec71d1ff9fc2631b4414f378b53d60c..d87634c74cacf79bb25fe34271ef96c12cb465f0 100644 (file)
@@ -86,13 +86,35 @@ bool operator!=(ParagraphList::iterator const & i1,
        return !(i1 == i2);
 }
 
-
+//////////
 ////////// The ParagraphList proper
+//////////
+
 ParagraphList::ParagraphList()
        : parlist(0)
 {}
 
 
+ParagraphList::ParagraphList(ParagraphList const & pl)
+       : parlist(0)
+{
+       // Deep copy.
+       ParagraphList::iterator it = pl.begin();
+       ParagraphList::iterator end = pl.end();
+       for (; it != end; ++it) {
+               push_back(new Paragraph(*it, false));
+       }
+}
+
+
+ParagraphList & ParagraphList::operator=(ParagraphList const & rhs)
+{
+       ParagraphList tmp(rhs);
+       std::swap(parlist, tmp.parlist);
+       return *this;
+}
+
+
 ParagraphList::iterator
 ParagraphList::insert(ParagraphList::iterator it, Paragraph * par)
 {
@@ -120,7 +142,7 @@ ParagraphList::insert(ParagraphList::iterator it, Paragraph * par)
                par->next_par_ = &*it;
                par->prev_par_ = prev;
                prev->next_par_ = par;
-               it->prev_ par_= par;
+               it->prev_par_= par;
        } else if (parlist == 0) {
                parlist = par;
        } else {
@@ -136,6 +158,87 @@ ParagraphList::insert(ParagraphList::iterator it, Paragraph * par)
 }
 
 
+
+void ParagraphList::insert(iterator pos, iterator beg, iterator end)
+{
+       for (; beg != end; ++beg) {
+               insert(pos, new Paragraph(*beg, false));
+       }
+}
+
+
+void ParagraphList::assign(iterator beg, iterator end)
+{
+       clear();
+       for (; beg != end; ++beg) {
+               push_back(new Paragraph(*beg, false));
+       }
+}
+
+
+void ParagraphList::splice(iterator pos, ParagraphList & pl)
+{
+       if (pl.parlist == 0)
+               return;
+
+       Paragraph * first = pl.parlist;
+       Paragraph * last = first;
+#ifndef NO_NEXT
+       while (last->next_)
+               last = last->next_;
+
+       if (pos == end()) {
+               if (parlist == 0) {
+                       parlist = first;
+               } else {
+                       Paragraph * last_par = &back();
+                       last_par->next_ = first;
+                       first->previous_ = last_par;
+               }
+       } else if (pos == begin()) {
+               last->next_ = parlist;
+               parlist->previous_ = last;
+               parlist = first;
+       } else {
+               Paragraph * pos_par = &*pos;
+               Paragraph * before_pos = pos_par->previous_;
+
+               before_pos->next_ = first;
+               first->previous_ = before_pos;
+               last->next_ = pos_par;
+               pos_par->previous_ = last;
+       }
+       pl.parlist = 0;
+#else
+       while (last->next_par_)
+               last = last->next_par_;
+
+       if (pos == end()) {
+               if (parlist == 0) {
+                       parlist = first;
+               } else {
+                       Paragraph * last_par = &back();
+                       last_par->next_par_ = first;
+                       first->prev_par_ = last_par;
+               }
+       } else if (pos == begin()) {
+               last->next_par_ = parlist;
+               parlist->prev_par_ = last;
+               parlist = first;
+       } else {
+               Paragraph * pos_par = &*pos;
+               Paragraph * before_pos = pos_par->prev_par_;
+
+               before_pos->next_par_ = first;
+               first->prev_par_ = before_pos;
+               last->next_par_ = pos_par;
+               pos_par->prev_par_ = last;
+       }
+       pl.parlist = 0;
+#endif
+}
+
+
 void ParagraphList::clear()
 {
 #ifndef NO_NEXT
@@ -168,6 +271,8 @@ void ParagraphList::erase(ParagraphList::iterator it)
        if (next)
                next->previous_ = prev;
 
+       it->previous_ = 0;
+       it->next_ = 0;
        delete &*it;
 #else
        Paragraph * prev = it->prev_par_;