]> 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 d207636526dfc41171830281c734ef064358689a..7759f4cfaff4e024659701af0aacd72ffbf707e3 100644 (file)
--- a/src/toc.C
+++ b/src/toc.C
 #include "bufferparams.h"
 #include "FloatList.h"
 #include "funcrequest.h"
-#include "gettext.h"
 #include "LyXAction.h"
 #include "paragraph.h"
-#include "pariterator.h"
 
 #include "frontends/LyXView.h"
 
@@ -61,20 +59,20 @@ string const getType(string const & cmdName)
 {
        // special case
        if (cmdName == "tableofcontents")
-               return _("TOC");
+               return "TOC";
        else
                return cmdName;
 }
 
 
-string const getGuiName(string const & cmdName, Buffer const & buffer)
+string const getGuiName(string const & type, Buffer const & buffer)
 {
        FloatList const & floats =
                buffer.params().getLyXTextClass().floats();
-       if (floats.typeExist(cmdName))
-               return _(floats.getType(cmdName).name());
+       if (floats.typeExist(type))
+               return floats.getType(type).name();
        else
-               return getType(cmdName);
+               return type;
 }
 
 
@@ -123,14 +121,15 @@ 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())
                                tocstring = pit->asString(buf, true);
                        TocItem const item(pit->id(), toclevel - min_toclevel,
                                           tocstring);
-                       toclist[_("TOC")].push_back(item);
+                       toclist["TOC"].push_back(item);
                }
        }
        return toclist;
@@ -167,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