]> git.lyx.org Git - lyx.git/blobdiff - src/toc.C
Small formatting and comment cleanup.
[lyx.git] / src / toc.C
index f4485aaf7287edd6e958ca028bf82343b58a1184..26d537e2d5b0f1fb13efc9d4b6bfc97e60366bcb 100644 (file)
--- a/src/toc.C
+++ b/src/toc.C
 
 #include "buffer.h"
 #include "bufferparams.h"
-#include "FloatList.h"
 #include "funcrequest.h"
+#include "lyxtext.h"
 #include "LyXAction.h"
 #include "paragraph.h"
+#include "pariterator.h"
 #include "cursor.h"
 #include "debug.h"
 #include "undo.h"
 
-#include "insets/insetfloat.h"
-#include "insets/insetoptarg.h"
-#include "insets/insetwrap.h"
-
-#include "support/convert.h"
-
-#include <iostream>
-#include <map>
-
-using std::map;
-using std::pair;
-using std::make_pair;
-using std::vector;
-using std::max;
-using std::ostream;
-using std::string;
-using std::cout;
-using std::endl;
 
 namespace lyx {
 namespace toc {
 
-typedef map<Buffer const *, lyx::TocBackend> TocMap;
-static TocMap toc_backend_;
-
-///////////////////////////////////////////////////////////////////////////
-// Interface to toc_backend_
-
-void updateToc(Buffer const & buf)
-{
-       TocMap::iterator it = toc_backend_.find(&buf);
-       if (it == toc_backend_.end()) {
-               pair<TocMap::iterator, bool> result
-                       = toc_backend_.insert(make_pair(&buf, TocBackend(&buf)));
-               if (!result.second)
-                       return;
-
-               it = result.first;
-       }
-
-       it->second.update();
-}
-
-
-TocList const & getTocList(Buffer const & buf)
-{
-       return toc_backend_[&buf].tocs();
-}
-
-
-Toc const & getToc(Buffer const & buf, std::string const & type)
-{
-       return toc_backend_[&buf].toc(type);
-}
-
-
-TocIterator const getCurrentTocItem(Buffer const & buf, LCursor const & cur,
-                                                               std::string const & type)
-{
-       return toc_backend_[&buf].item(type, ParConstIterator(cur));
-}
-
-
-vector<string> const & getTypes(Buffer const & buf)
-{
-       return toc_backend_[&buf].types();
-}
-
-
-void asciiTocList(string const & type, Buffer const & buf, ostream & os)
-{
-       toc_backend_[&buf].asciiTocList(type, os);
-}
-
-///////////////////////////////////////////////////////////////////////////
-// Other functions
-
-string const getType(string const & cmdName)
-{
-       // special case
-       if (cmdName == "tableofcontents")
-               return "TOC";
-       else
-               return cmdName;
-}
-
-
-string const getGuiName(string const & type, Buffer const & buffer)
-{
-       FloatList const & floats =
-               buffer.params().getLyXTextClass().floats();
-       if (floats.typeExist(type))
-               return floats.getType(type).name();
-       else
-               return type;
-}
-
-
 void outline(OutlineOp mode,  LCursor & cur)
 {
-       recordUndo(cur);
        Buffer * buf = & cur.buffer();
        pit_type & pit = cur.pit();
        ParagraphList & pars = buf->text().paragraphs();
        ParagraphList::iterator bgn = pars.begin();
-       ParagraphList::iterator s = boost::next(bgn, pit);
-       ParagraphList::iterator p = s;
+       // The first paragraph of the area to be copied:
+       ParagraphList::iterator start = boost::next(bgn, pit);
+       // The final paragraph of area to be copied:
+       ParagraphList::iterator finish = start;
        ParagraphList::iterator end = pars.end();
 
        LyXTextClass::const_iterator lit =
@@ -138,86 +46,101 @@ void outline(OutlineOp mode,  LCursor & cur)
        LyXTextClass::const_iterator const lend =
                buf->params().getLyXTextClass().end();
 
-       int const thistoclevel = s->layout()->toclevel;
+       int const thistoclevel = start->layout()->toclevel;
        int toclevel;
        switch (mode) {
                case Up: {
-                       if (p != end)
-                               ++p;
-                       for (; p != end; ++p) {
-                               toclevel = p->layout()->toclevel;
+                       // Move out (down) from this section header
+                       if (finish != end)
+                               ++finish;
+                       // Seek the one (on same level) below
+                       for (; finish != end; ++finish) {
+                               toclevel = finish->layout()->toclevel;
                                if (toclevel != LyXLayout::NOT_IN_TOC
                                    && toclevel <= thistoclevel) {
                                        break;
                                }
                        }
-                       ParagraphList::iterator q = s;
-                       if (q != bgn)
-                               --q;
+                       ParagraphList::iterator dest = start;
+                       // Move out (up) from this header
+                       if (dest != bgn)
+                               --dest;
                        else
                                break;
-                       for (; q != bgn; --q) {
-                               toclevel = q->layout()->toclevel;
+                       // Search previous same-level header above
+                       for (; dest != bgn; --dest) {
+                               toclevel = dest->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);
+                       // Not found; do nothing
+                       if (dest == bgn)
+                               break;
+                       pit_type const newpit = std::distance(bgn, dest);
+                       pit_type const len = std::distance(start, finish);
                        pit += len;
-                       pars.insert(q, s, p);
-                       s = boost::next(pars.begin(), pit);
-                       ParagraphList::iterator t = boost::next(s, len);
+                       pit = std::min(pit, cur.lastpit());
+                       recordUndo(cur, Undo::ATOMIC, newpit, pit);
+                       pars.insert(dest, start, finish);
+                       start = boost::next(bgn, pit);
                        pit = newpit;
-                       pars.erase(s, t);
+                       pars.erase(start, finish);
                break;
                }
                case Down: {
-                          if (p != end)
-                               ++p;
-                       for (; p != end; ++p) {
-                               toclevel = p->layout()->toclevel;
+                       // Go down out of current header:
+                       if (finish != end)
+                               ++finish;
+                       // Find next same-level header:
+                       for (; finish != end; ++finish) {
+                               toclevel = finish->layout()->toclevel;
                                if (toclevel != LyXLayout::NOT_IN_TOC
                                    && toclevel <= thistoclevel) {
                                        break;
                                }
                        }
-                       ParagraphList::iterator q = p;
-                       if (q != end)
-                               ++q;
+                       ParagraphList::iterator dest = finish;
+                       // Go one down from *this* header:
+                       if (dest != end)
+                               ++dest;
                        else
                                break;
-                       for (; q != end; ++q) {
-                               toclevel = q->layout()->toclevel;
+                       // Go further down to find header to insert in front of:
+                       for (; dest != end; ++dest) {
+                               toclevel = dest->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);
+                       // One such was found:
+                       pit_type newpit = std::distance(bgn, dest);
+                       pit_type const len = std::distance(start, finish);
+                       recordUndo(cur, Undo::ATOMIC, pit, newpit -1);
+                       pars.insert(dest, start, finish);
+                       start = boost::next(bgn, pit);
                        pit = newpit - len;
-                       pars.erase(s, t);
+                       pars.erase(start, finish);
                break;
                }
                case In:
+                       recordUndo(cur);
                        for (; lit != lend; ++lit) {
                                if ((*lit)->toclevel == thistoclevel + 1 &&
-                                   s->layout()->labeltype == (*lit)->labeltype) {
-                                       s->layout((*lit));
+                                   start->layout()->labeltype == (*lit)->labeltype) {
+                                       start->layout((*lit));
                                        break;
                                }
                        }
                break;
                case Out:
+                       recordUndo(cur);
                        for (; lit != lend; ++lit) {
                                if ((*lit)->toclevel == thistoclevel - 1 &&
-                                   s->layout()->labeltype == (*lit)->labeltype) {
-                                       s->layout((*lit));
+                                   start->layout()->labeltype == (*lit)->labeltype) {
+                                       start->layout((*lit));
                                        break;
                                }
                        }