#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 *, 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, odocstream & 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 =
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;
- else
+ ParagraphList::iterator dest = start;
+ // Move out (up) from this header
+ if (dest == bgn)
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);
+ // Search previous same-level header above
+ do {
+ --dest;
+ toclevel = dest->layout()->toclevel;
+ } while(dest != bgn
+ && (toclevel == LyXLayout::NOT_IN_TOC
+ || toclevel > thistoclevel));
+ // Not found; do nothing
+ if (toclevel == LyXLayout::NOT_IN_TOC
+ || toclevel > thistoclevel)
+ break;
+ pit_type const newpit = std::distance(bgn, dest);
+ pit_type const len = std::distance(start, finish);
+ pit_type const deletepit = pit + len;
+ recordUndo(cur, Undo::ATOMIC, newpit, deletepit - 1);
+ pars.insert(dest, start, finish);
+ start = boost::next(pars.begin(), deletepit);
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;
}
}