]> git.lyx.org Git - lyx.git/blobdiff - src/toc.C
Fix bug 2485 and crash on middle mouse paste on math
[lyx.git] / src / toc.C
index 0a17d5a2c175585dc6818505331066651e1812bb..7759f4cfaff4e024659701af0aacd72ffbf707e3 100644 (file)
--- a/src/toc.C
+++ b/src/toc.C
@@ -19,7 +19,6 @@
 #include "funcrequest.h"
 #include "LyXAction.h"
 #include "paragraph.h"
-#include "pariterator.h"
 
 #include "frontends/LyXView.h"
 
@@ -122,7 +121,8 @@ TocList const getTocList(Buffer const & buf)
 
                /// now the toc entry for the paragraph
                int const toclevel = pit->layout()->toclevel;
-               if (toclevel >= min_toclevel
+               if (toclevel != LyXLayout::NOT_IN_TOC
+                   && toclevel >= min_toclevel
                    && toclevel <= bufparams.tocdepth) {
                        // insert this into the table of contents
                        if (tocstring.empty())
@@ -166,5 +166,106 @@ void asciiTocList(string const & type, Buffer const & buffer, ostream & os)
 }
 
 
+void outline(OutlineOp mode, Buffer * buf, pit_type & pit)
+{
+       ParagraphList & pars = buf->text().paragraphs();
+       ParagraphList::iterator bgn = pars.begin();
+       ParagraphList::iterator s = boost::next(bgn, pit);
+       ParagraphList::iterator p = s;
+       ParagraphList::iterator end = pars.end();
+
+       LyXTextClass::const_iterator lit =
+               buf->params().getLyXTextClass().begin();
+       LyXTextClass::const_iterator const lend =
+               buf->params().getLyXTextClass().end();
+
+       int const thistoclevel = s->layout()->toclevel;
+       int toclevel;
+       switch (mode) {
+               case UP: {
+                       if (p != end)
+                               ++p;
+                       for (; p != end; ++p) {
+                               toclevel = p->layout()->toclevel;
+                               if (toclevel != LyXLayout::NOT_IN_TOC
+                                   && toclevel <= thistoclevel) {
+                                       break;
+                               }
+                       }
+                       ParagraphList::iterator q = s;
+                       if (q != bgn)
+                               --q;
+                       else
+                               break;
+                       for (; q != bgn; --q) {
+                               toclevel = q->layout()->toclevel;
+                               if (toclevel != LyXLayout::NOT_IN_TOC
+                                   && toclevel <= thistoclevel) {
+                                       break;
+                               }
+                       }
+                       pit_type const newpit = std::distance(pars.begin(), q);
+                       pit_type const len = std::distance(s, p);
+                       pit += len;
+                       pars.insert(q, s, p);
+                       s = boost::next(pars.begin(), pit);
+                       ParagraphList::iterator t = boost::next(s, len);
+                       pit = newpit;
+                       pars.erase(s, t);
+               break;
+               }
+               case DOWN: {
+                          if (p != end)
+                               ++p;
+                       for (; p != end; ++p) {
+                               toclevel = p->layout()->toclevel;
+                               if (toclevel != LyXLayout::NOT_IN_TOC
+                                   && toclevel <= thistoclevel) {
+                                       break;
+                               }
+                       }
+                       ParagraphList::iterator q = p;
+                       if (q != end)
+                               ++q;
+                       else
+                               break;
+                       for (; q != end; ++q) {
+                               toclevel = q->layout()->toclevel;
+                               if (toclevel != LyXLayout::NOT_IN_TOC
+                                   && toclevel <= thistoclevel) {
+                                       break;
+                               }
+                       }
+                       pit_type const newpit = std::distance(pars.begin(), q);
+                       pit_type const len = std::distance(s, p);
+                       pars.insert(q, s, p);
+                       s = boost::next(pars.begin(), pit);
+                       ParagraphList::iterator t = boost::next(s, len);
+                       pit = newpit - len;
+                       pars.erase(s, t);
+               break;
+               }
+               case IN:
+                       for (; lit != lend; ++lit) {
+                               if ((*lit)->toclevel == thistoclevel + 1) {
+                                       s->layout((*lit));
+                                       break;
+                               }
+                       }
+               break;
+               case OUT:
+                       for (; lit != lend; ++lit) {
+                               if ((*lit)->toclevel == thistoclevel - 1) {
+                                       s->layout((*lit));
+                                       break;
+                               }
+                       }
+               break;
+               default:
+               break;
+       }
+}
+
+
 } // namespace toc
 } // namespace lyx