X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftoc.C;h=26d537e2d5b0f1fb13efc9d4b6bfc97e60366bcb;hb=024275f0690b41634e26dabe8758e3dc6cd31ee2;hp=f4485aaf7287edd6e958ca028bf82343b58a1184;hpb=b171e5f1501c0ef1ab724e0631200488bd3658a3;p=lyx.git diff --git a/src/toc.C b/src/toc.C index f4485aaf72..26d537e2d5 100644 --- a/src/toc.C +++ b/src/toc.C @@ -16,121 +16,29 @@ #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 -#include - -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 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 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 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; } }