I don't think that a single function that's only use once should have a

pair of files of its own


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20599 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2007-09-29 20:25:50 +00:00
parent cd72af583f
commit 83cf9ed0a9
4 changed files with 134 additions and 198 deletions

View File

@ -49,7 +49,6 @@
#include "TexRow.h"
#include "Text.h"
#include "TextClass.h"
#include "toc.h"
#include "Undo.h"
#include "VSpace.h"
#include "WordLangTuple.h"
@ -203,9 +202,139 @@ void gotoInset(BufferView * bv, Inset_code code, bool same_content)
}
/// the type of outline operation
enum OutlineOp {
OutlineUp, // Move this header with text down
OutlineDown, // Move this header with text up
OutlineIn, // Make this header deeper
OutlineOut // Make this header shallower
};
void outline(OutlineOp mode, Cursor & cur)
{
Buffer & buf = cur.buffer();
pit_type & pit = cur.pit();
ParagraphList & pars = buf.text().paragraphs();
ParagraphList::iterator bgn = pars.begin();
// 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();
TextClass::const_iterator lit =
buf.params().getTextClass().begin();
TextClass::const_iterator const lend =
buf.params().getTextClass().end();
int const thistoclevel = start->layout()->toclevel;
int toclevel;
switch (mode) {
case OutlineUp: {
// 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 != Layout::NOT_IN_TOC
&& toclevel <= thistoclevel) {
break;
}
}
ParagraphList::iterator dest = start;
// Move out (up) from this header
if (dest == bgn)
break;
// Search previous same-level header above
do {
--dest;
toclevel = dest->layout()->toclevel;
} while(dest != bgn
&& (toclevel == Layout::NOT_IN_TOC
|| toclevel > thistoclevel));
// Not found; do nothing
if (toclevel == Layout::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(start, finish);
break;
}
case OutlineDown: {
// 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 != Layout::NOT_IN_TOC && toclevel <= thistoclevel)
break;
}
ParagraphList::iterator dest = finish;
// Go one down from *this* header:
if (dest != end)
++dest;
else
break;
// Go further down to find header to insert in front of:
for (; dest != end; ++dest) {
toclevel = dest->layout()->toclevel;
if (toclevel != Layout::NOT_IN_TOC && toclevel <= thistoclevel)
break;
}
// 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(start, finish);
break;
}
case OutlineIn:
recordUndo(cur);
for (; lit != lend; ++lit) {
if ((*lit)->toclevel == thistoclevel + 1 &&
start->layout()->labeltype == (*lit)->labeltype) {
start->layout((*lit));
break;
}
}
break;
case OutlineOut:
recordUndo(cur);
for (; lit != lend; ++lit) {
if ((*lit)->toclevel == thistoclevel - 1 &&
start->layout()->labeltype == (*lit)->labeltype) {
start->layout((*lit));
break;
}
}
break;
default:
break;
}
}
} // anon namespace
/////////////////////////////////////////////////////////////////////
//
// BufferView
//
/////////////////////////////////////////////////////////////////////
BufferView::BufferView(Buffer & buf)
: width_(0), height_(0), buffer_(buf), wh_(0),
cursor_(*this),
@ -831,21 +960,21 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
}
case LFUN_OUTLINE_UP:
toc::outline(toc::Up, cursor_);
outline(OutlineUp, cursor_);
cursor_.text()->setCursor(cursor_, cursor_.pit(), 0);
updateLabels(buffer_);
break;
case LFUN_OUTLINE_DOWN:
toc::outline(toc::Down, cursor_);
outline(OutlineDown, cursor_);
cursor_.text()->setCursor(cursor_, cursor_.pit(), 0);
updateLabels(buffer_);
break;
case LFUN_OUTLINE_IN:
toc::outline(toc::In, cursor_);
outline(OutlineIn, cursor_);
updateLabels(buffer_);
break;
case LFUN_OUTLINE_OUT:
toc::outline(toc::Out, cursor_);
outline(OutlineOut, cursor_);
updateLabels(buffer_);
break;

View File

@ -261,8 +261,6 @@ liblyxcore_la_SOURCES = \
TextMetrics.h \
TocBackend.cpp \
TocBackend.h \
toc.cpp \
toc.h \
ToolbarBackend.cpp \
ToolbarBackend.h \
Trans.cpp \

View File

@ -1,153 +0,0 @@
/**
* \file toc.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Jean-Marc Lasgouttes
* \author Angus Leeming
* \author Abdelrazak Younes
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "toc.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "Cursor.h"
#include "debug.h"
#include "FuncRequest.h"
#include "Layout.h"
#include "LyXAction.h"
#include "Paragraph.h"
#include "ParIterator.h"
#include "Text.h"
#include "Undo.h"
namespace lyx {
namespace toc {
void outline(OutlineOp mode, Cursor & cur)
{
Buffer & buf = cur.buffer();
pit_type & pit = cur.pit();
ParagraphList & pars = buf.text().paragraphs();
ParagraphList::iterator bgn = pars.begin();
// 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();
TextClass::const_iterator lit =
buf.params().getTextClass().begin();
TextClass::const_iterator const lend =
buf.params().getTextClass().end();
int const thistoclevel = start->layout()->toclevel;
int toclevel;
switch (mode) {
case Up: {
// 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 != Layout::NOT_IN_TOC
&& toclevel <= thistoclevel) {
break;
}
}
ParagraphList::iterator dest = start;
// Move out (up) from this header
if (dest == bgn)
break;
// Search previous same-level header above
do {
--dest;
toclevel = dest->layout()->toclevel;
} while(dest != bgn
&& (toclevel == Layout::NOT_IN_TOC
|| toclevel > thistoclevel));
// Not found; do nothing
if (toclevel == Layout::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(start, finish);
break;
}
case Down: {
// 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 != Layout::NOT_IN_TOC
&& toclevel <= thistoclevel) {
break;
}
}
ParagraphList::iterator dest = finish;
// Go one down from *this* header:
if (dest != end)
++dest;
else
break;
// Go further down to find header to insert in front of:
for (; dest != end; ++dest) {
toclevel = dest->layout()->toclevel;
if (toclevel != Layout::NOT_IN_TOC
&& toclevel <= thistoclevel) {
break;
}
}
// 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(start, finish);
break;
}
case In:
recordUndo(cur);
for (; lit != lend; ++lit) {
if ((*lit)->toclevel == thistoclevel + 1 &&
start->layout()->labeltype == (*lit)->labeltype) {
start->layout((*lit));
break;
}
}
break;
case Out:
recordUndo(cur);
for (; lit != lend; ++lit) {
if ((*lit)->toclevel == thistoclevel - 1 &&
start->layout()->labeltype == (*lit)->labeltype) {
start->layout((*lit));
break;
}
}
break;
default:
break;
}
}
} // namespace toc
} // namespace lyx

View File

@ -1,38 +0,0 @@
// -*- C++ -*-
/**
* \file toc.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Jean-Marc Lasgouttes
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*
* Nice functions and objects to handle TOCs
*/
#ifndef TOC_H
#define TOC_H
class Cursor;
namespace lyx {
namespace toc {
/// the type of outline operation
enum OutlineOp {
Up, // Move this header with text down
Down, // Move this header with text up
In, // Make this header deeper
Out // Make this header shallower
};
void outline(OutlineOp, Cursor &);
} // namespace toc
} // namespace lyx
#endif // CONTROLTOC_H