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 "FuncRequest.h"
21 #include "LyXAction.h"
22 #include "Paragraph.h"
23 #include "ParIterator.h"
32 void outline(OutlineOp mode, Cursor & cur)
34 Buffer & buf = cur.buffer();
35 pit_type & pit = cur.pit();
36 ParagraphList & pars = buf.text().paragraphs();
37 ParagraphList::iterator bgn = pars.begin();
38 // The first paragraph of the area to be copied:
39 ParagraphList::iterator start = boost::next(bgn, pit);
40 // The final paragraph of area to be copied:
41 ParagraphList::iterator finish = start;
42 ParagraphList::iterator end = pars.end();
44 TextClass::const_iterator lit =
45 buf.params().getTextClass().begin();
46 TextClass::const_iterator const lend =
47 buf.params().getTextClass().end();
49 int const thistoclevel = start->layout()->toclevel;
53 // Move out (down) from this section header
56 // Seek the one (on same level) below
57 for (; finish != end; ++finish) {
58 toclevel = finish->layout()->toclevel;
59 if (toclevel != Layout::NOT_IN_TOC
60 && toclevel <= thistoclevel) {
64 ParagraphList::iterator dest = start;
65 // Move out (up) from this header
68 // Search previous same-level header above
71 toclevel = dest->layout()->toclevel;
73 && (toclevel == Layout::NOT_IN_TOC
74 || toclevel > thistoclevel));
75 // Not found; do nothing
76 if (toclevel == Layout::NOT_IN_TOC
77 || toclevel > thistoclevel)
79 pit_type const newpit = std::distance(bgn, dest);
80 pit_type const len = std::distance(start, finish);
81 pit_type const deletepit = pit + len;
82 recordUndo(cur, Undo::ATOMIC, newpit, deletepit - 1);
83 pars.insert(dest, start, finish);
84 start = boost::next(pars.begin(), deletepit);
86 pars.erase(start, finish);
90 // Go down out of current header:
93 // Find next same-level header:
94 for (; finish != end; ++finish) {
95 toclevel = finish->layout()->toclevel;
96 if (toclevel != Layout::NOT_IN_TOC
97 && toclevel <= thistoclevel) {
101 ParagraphList::iterator dest = finish;
102 // Go one down from *this* header:
107 // Go further down to find header to insert in front of:
108 for (; dest != end; ++dest) {
109 toclevel = dest->layout()->toclevel;
110 if (toclevel != Layout::NOT_IN_TOC
111 && toclevel <= thistoclevel) {
115 // One such was found:
116 pit_type newpit = std::distance(bgn, dest);
117 pit_type const len = std::distance(start, finish);
118 recordUndo(cur, Undo::ATOMIC, pit, newpit - 1);
119 pars.insert(dest, start, finish);
120 start = boost::next(bgn, pit);
122 pars.erase(start, finish);
127 for (; lit != lend; ++lit) {
128 if ((*lit)->toclevel == thistoclevel + 1 &&
129 start->layout()->labeltype == (*lit)->labeltype) {
130 start->layout((*lit));
137 for (; lit != lend; ++lit) {
138 if ((*lit)->toclevel == thistoclevel - 1 &&
139 start->layout()->labeltype == (*lit)->labeltype) {
140 start->layout((*lit));