3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Jean-Marc Lasgouttes
7 * \author Angus Leeming
8 * \author Abdelrazak Younes
10 * Full author contact details are available in file CREDITS.
18 #include "bufferparams.h"
19 #include "FloatList.h"
20 #include "funcrequest.h"
22 #include "LyXAction.h"
23 #include "paragraph.h"
24 #include "pariterator.h"
29 #include "support/convert.h"
45 typedef map<Buffer const *, TocBackend> TocMap;
46 static TocMap toc_backend_;
48 ///////////////////////////////////////////////////////////////////////////
49 // Interface to toc_backend_
51 void updateToc(Buffer const & buf)
53 TocMap::iterator it = toc_backend_.find(&buf);
54 if (it == toc_backend_.end()) {
55 pair<TocMap::iterator, bool> result
56 = toc_backend_.insert(make_pair(&buf, TocBackend(&buf)));
67 TocList const & getTocList(Buffer const & buf)
69 return toc_backend_[&buf].tocs();
73 Toc const & getToc(Buffer const & buf, std::string const & type)
75 return toc_backend_[&buf].toc(type);
79 TocIterator const getCurrentTocItem(Buffer const & buf, LCursor const & cur,
80 std::string const & type)
82 return toc_backend_[&buf].item(type, ParConstIterator(cur));
86 vector<string> const & getTypes(Buffer const & buf)
88 return toc_backend_[&buf].types();
92 void asciiTocList(string const & type, Buffer const & buf, odocstream & os)
94 toc_backend_[&buf].asciiTocList(type, os);
97 ///////////////////////////////////////////////////////////////////////////
100 string const getType(string const & cmdName)
103 if (cmdName == "tableofcontents")
110 string const getGuiName(string const & type, Buffer const & buffer)
112 FloatList const & floats =
113 buffer.params().getLyXTextClass().floats();
114 if (floats.typeExist(type))
115 return floats.getType(type).name();
121 void outline(OutlineOp mode, LCursor & cur)
124 Buffer * buf = & cur.buffer();
125 pit_type & pit = cur.pit();
126 ParagraphList & pars = buf->text().paragraphs();
127 ParagraphList::iterator bgn = pars.begin();
128 ParagraphList::iterator s = boost::next(bgn, pit);
129 ParagraphList::iterator p = s;
130 ParagraphList::iterator end = pars.end();
132 LyXTextClass::const_iterator lit =
133 buf->params().getLyXTextClass().begin();
134 LyXTextClass::const_iterator const lend =
135 buf->params().getLyXTextClass().end();
137 int const thistoclevel = s->layout()->toclevel;
143 for (; p != end; ++p) {
144 toclevel = p->layout()->toclevel;
145 if (toclevel != LyXLayout::NOT_IN_TOC
146 && toclevel <= thistoclevel) {
150 ParagraphList::iterator q = s;
155 for (; q != bgn; --q) {
156 toclevel = q->layout()->toclevel;
157 if (toclevel != LyXLayout::NOT_IN_TOC
158 && toclevel <= thistoclevel) {
162 pit_type const newpit = std::distance(pars.begin(), q);
163 pit_type const len = std::distance(s, p);
165 pars.insert(q, s, p);
166 s = boost::next(pars.begin(), pit);
167 ParagraphList::iterator t = boost::next(s, len);
175 for (; p != end; ++p) {
176 toclevel = p->layout()->toclevel;
177 if (toclevel != LyXLayout::NOT_IN_TOC
178 && toclevel <= thistoclevel) {
182 ParagraphList::iterator q = p;
187 for (; q != end; ++q) {
188 toclevel = q->layout()->toclevel;
189 if (toclevel != LyXLayout::NOT_IN_TOC
190 && toclevel <= thistoclevel) {
194 pit_type const newpit = std::distance(pars.begin(), q);
195 pit_type const len = std::distance(s, p);
196 pars.insert(q, s, p);
197 s = boost::next(pars.begin(), pit);
198 ParagraphList::iterator t = boost::next(s, len);
204 for (; lit != lend; ++lit) {
205 if ((*lit)->toclevel == thistoclevel + 1 &&
206 s->layout()->labeltype == (*lit)->labeltype) {
213 for (; lit != lend; ++lit) {
214 if ((*lit)->toclevel == thistoclevel - 1 &&
215 s->layout()->labeltype == (*lit)->labeltype) {