Move contents of paragraph_funcs.* to Text.h and Text.cpp.

The goal is to simplify the code afterwards.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30955 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2009-08-09 17:30:41 +00:00
parent eef8720eca
commit 2b9e44cb01
23 changed files with 405 additions and 491 deletions

View File

@ -109,7 +109,6 @@ src_header_files = Split('''
paper.h
ParIterator.h
Paragraph.h
paragraph_funcs.h
ParagraphList.h
ParagraphMetrics.h
ParagraphParameters.h
@ -208,7 +207,6 @@ src_pre_files = Split('''
output_latex.cpp
output_plaintext.cpp
output_xhtml.cpp
paragraph_funcs.cpp
PDFOptions.cpp
ParIterator.cpp
Paragraph.cpp

View File

@ -49,7 +49,6 @@
#include "output_latex.h"
#include "output_xhtml.h"
#include "output_plaintext.h"
#include "paragraph_funcs.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"

View File

@ -41,7 +41,6 @@
#include "LyXRC.h"
#include "MetricsInfo.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
#include "Session.h"

View File

@ -28,7 +28,6 @@
#include "Language.h"
#include "LyXFunc.h" // only for setMessage()
#include "LyXRC.h"
#include "paragraph_funcs.h"
#include "Paragraph.h"
#include "ParIterator.h"
#include "Row.h"

View File

@ -33,7 +33,6 @@
#include "LyXRC.h"
#include "Text.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
#include "Undo.h"

View File

@ -147,7 +147,6 @@ SOURCEFILESCORE = \
OutputParams.cpp \
output_plaintext.cpp \
Paragraph.cpp \
paragraph_funcs.cpp \
ParagraphMetrics.cpp \
ParagraphParameters.cpp \
ParIterator.cpp \
@ -249,7 +248,6 @@ HEADERFILESCORE = \
OutputParams.h \
output_plaintext.h \
paper.h \
paragraph_funcs.h \
Paragraph.h \
ParagraphList.h \
ParagraphMetrics.h \

View File

@ -36,7 +36,6 @@
#include "OutputParams.h"
#include "output_latex.h"
#include "output_xhtml.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "SpellChecker.h"
#include "sgml.h"

View File

@ -31,7 +31,6 @@
#include "LyXRC.h"
#include "Row.h"
#include "OutputParams.h"
#include "paragraph_funcs.h"
#include "sgml.h"
#include "TextClass.h"
#include "TexRow.h"

View File

@ -34,13 +34,14 @@
#include "ErrorList.h"
#include "FuncRequest.h"
#include "factory.h"
#include "InsetList.h"
#include "Language.h"
#include "Layout.h"
#include "Length.h"
#include "Lexer.h"
#include "lyxfind.h"
#include "LyXRC.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
#include "TextClass.h"
@ -79,6 +80,260 @@ namespace lyx {
using cap::cutSelection;
using cap::pasteParagraphList;
static bool moveItem(Paragraph & fromPar, pos_type fromPos,
Paragraph & toPar, pos_type toPos, BufferParams const & params)
{
// Note: moveItem() does not honour change tracking!
// Therefore, it should only be used for breaking and merging paragraphs
// We need a copy here because the character at fromPos is going to be erased.
Font const tmpFont = fromPar.getFontSettings(params, fromPos);
Change const tmpChange = fromPar.lookupChange(fromPos);
if (Inset * tmpInset = fromPar.getInset(fromPos)) {
fromPar.releaseInset(fromPos);
// The inset is not in fromPar any more.
if (!toPar.insertInset(toPos, tmpInset, tmpFont, tmpChange)) {
delete tmpInset;
return false;
}
return true;
}
char_type const tmpChar = fromPar.getChar(fromPos);
fromPar.eraseChar(fromPos, false);
toPar.insertChar(toPos, tmpChar, tmpFont, tmpChange);
return true;
}
void breakParagraphConservative(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset, pos_type pos)
{
// create a new paragraph
Paragraph & tmp = *pars.insert(boost::next(pars.begin(), par_offset + 1),
Paragraph());
Paragraph & par = pars[par_offset];
tmp.setInsetOwner(&par.inInset());
tmp.makeSameLayout(par);
LASSERT(pos <= par.size(), /**/);
if (pos < par.size()) {
// move everything behind the break position to the new paragraph
pos_type pos_end = par.size() - 1;
for (pos_type i = pos, j = 0; i <= pos_end; ++i) {
if (moveItem(par, pos, tmp, j, bparams)) {
++j;
}
}
// Move over the end-of-par change information
tmp.setChange(tmp.size(), par.lookupChange(par.size()));
par.setChange(par.size(), Change(bparams.trackChanges ?
Change::INSERTED : Change::UNCHANGED));
}
}
void mergeParagraph(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset)
{
Paragraph & next = pars[par_offset + 1];
Paragraph & par = pars[par_offset];
pos_type pos_end = next.size() - 1;
pos_type pos_insert = par.size();
// the imaginary end-of-paragraph character (at par.size()) has to be
// marked as unmodified. Otherwise, its change is adopted by the first
// character of the next paragraph.
if (par.isChanged(par.size())) {
LYXERR(Debug::CHANGES,
"merging par with inserted/deleted end-of-par character");
par.setChange(par.size(), Change(Change::UNCHANGED));
}
Change change = next.lookupChange(next.size());
// move the content of the second paragraph to the end of the first one
for (pos_type i = 0, j = pos_insert; i <= pos_end; ++i) {
if (moveItem(next, 0, par, j, bparams)) {
++j;
}
}
// move the change of the end-of-paragraph character
par.setChange(par.size(), change);
pars.erase(boost::next(pars.begin(), par_offset + 1));
}
pit_type depthHook(pit_type pit, ParagraphList const & pars, depth_type depth)
{
pit_type newpit = pit;
if (newpit != 0)
--newpit;
while (newpit != 0 && pars[newpit].getDepth() > depth)
--newpit;
if (pars[newpit].getDepth() > depth)
return pit;
return newpit;
}
pit_type outerHook(pit_type par_offset, ParagraphList const & pars)
{
Paragraph const & par = pars[par_offset];
if (par.getDepth() == 0)
return pars.size();
return depthHook(par_offset, pars, depth_type(par.getDepth() - 1));
}
bool isFirstInSequence(pit_type par_offset, ParagraphList const & pars)
{
Paragraph const & par = pars[par_offset];
pit_type dhook_offset = depthHook(par_offset, pars, par.getDepth());
if (dhook_offset == par_offset)
return true;
Paragraph const & dhook = pars[dhook_offset];
return dhook.layout() != par.layout()
|| dhook.getDepth() != par.getDepth();
}
void setLabelWidthStringToSequence(pit_type const par_offset,
ParagraphList & pars, docstring const & s)
{
pit_type offset = par_offset;
// Find first of same layout in sequence
while (!isFirstInSequence(offset, pars)) {
offset = depthHook(offset, pars, pars[offset].getDepth());
}
// now apply label width string to every par
// in sequence
pit_type const end = pars.size();
depth_type const depth = pars[offset].getDepth();
Layout const & layout = pars[offset].layout();
for (pit_type pit = offset; pit != end; ++pit) {
while (pars[pit].getDepth() > depth)
++pit;
if (pars[pit].getDepth() < depth)
return;
if (pars[pit].layout() != layout)
return;
pars[pit].setLabelWidthString(s);
}
}
int getEndLabel(pit_type p, ParagraphList const & pars)
{
pit_type pit = p;
depth_type par_depth = pars[p].getDepth();
while (pit != pit_type(pars.size())) {
Layout const & layout = pars[pit].layout();
int const endlabeltype = layout.endlabeltype;
if (endlabeltype != END_LABEL_NO_LABEL) {
if (p + 1 == pit_type(pars.size()))
return endlabeltype;
depth_type const next_depth =
pars[p + 1].getDepth();
if (par_depth > next_depth ||
(par_depth == next_depth && layout != pars[p + 1].layout()))
return endlabeltype;
break;
}
if (par_depth == 0)
break;
pit = outerHook(pit, pars);
if (pit != pit_type(pars.size()))
par_depth = pars[pit].getDepth();
}
return END_LABEL_NO_LABEL;
}
Font const outerFont(pit_type par_offset, ParagraphList const & pars)
{
depth_type par_depth = pars[par_offset].getDepth();
FontInfo tmpfont = inherit_font;
// Resolve against environment font information
while (par_offset != pit_type(pars.size())
&& par_depth
&& !tmpfont.resolved()) {
par_offset = outerHook(par_offset, pars);
if (par_offset != pit_type(pars.size())) {
tmpfont.realize(pars[par_offset].layout().font);
par_depth = pars[par_offset].getDepth();
}
}
return Font(tmpfont);
}
bool isFullyDeleted(ParagraphList const & pars)
{
pit_type const pars_size = static_cast<pit_type>(pars.size());
// check all paragraphs
for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars[pit].empty()) // prevent assertion failure
if (!pars[pit].isDeleted(0, pars[pit].size()))
return false;
}
return true;
}
void acceptChanges(ParagraphList & pars, BufferParams const & bparams)
{
pit_type pars_size = static_cast<pit_type>(pars.size());
// first, accept changes within each individual paragraph
// (do not consider end-of-par)
for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars[pit].empty()) // prevent assertion failure
pars[pit].acceptChanges(0, pars[pit].size());
}
// next, accept imaginary end-of-par characters
for (pit_type pit = 0; pit < pars_size; ++pit) {
pos_type pos = pars[pit].size();
if (pars[pit].isInserted(pos)) {
pars[pit].setChange(pos, Change(Change::UNCHANGED));
} else if (pars[pit].isDeleted(pos)) {
if (pit == pars_size - 1) {
// we cannot remove a par break at the end of the last
// paragraph; instead, we mark it unchanged
pars[pit].setChange(pos, Change(Change::UNCHANGED));
} else {
mergeParagraph(bparams, pars, pit);
--pit;
--pars_size;
}
}
}
}
InsetText const & Text::inset() const
{
return *owner_;
@ -339,6 +594,105 @@ double Text::spacing(Paragraph const & par) const
}
/**
* This breaks a paragraph at the specified position.
* The new paragraph will:
* - Decrease depth by one (or change layout to default layout) when
* keep_layout == false
* - keep current depth and layout when keep_layout == true
*/
static void breakParagraph(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset, pos_type pos,
bool keep_layout)
{
// create a new paragraph, and insert into the list
ParagraphList::iterator tmp =
pars.insert(boost::next(pars.begin(), par_offset + 1),
Paragraph());
Paragraph & par = pars[par_offset];
// remember to set the inset_owner
tmp->setInsetOwner(&par.inInset());
// without doing that we get a crash when typing <Return> at the
// end of a paragraph
tmp->setPlainOrDefaultLayout(bparams.documentClass());
// layout stays the same with latex-environments
if (keep_layout) {
tmp->setLayout(par.layout());
tmp->setLabelWidthString(par.params().labelWidthString());
tmp->params().depth(par.params().depth());
} else if (par.params().depth() > 0) {
Paragraph const & hook = pars[outerHook(par_offset, pars)];
tmp->setLayout(hook.layout());
// not sure the line below is useful
tmp->setLabelWidthString(par.params().labelWidthString());
tmp->params().depth(hook.params().depth());
}
bool const isempty = (par.allowEmpty() && par.empty());
if (!isempty && (par.size() > pos || par.empty())) {
tmp->setLayout(par.layout());
tmp->params().align(par.params().align());
tmp->setLabelWidthString(par.params().labelWidthString());
tmp->params().depth(par.params().depth());
tmp->params().noindent(par.params().noindent());
// move everything behind the break position
// to the new paragraph
/* Note: if !keepempty, empty() == true, then we reach
* here with size() == 0. So pos_end becomes - 1. This
* doesn't cause problems because both loops below
* enforce pos <= pos_end and 0 <= pos
*/
pos_type pos_end = par.size() - 1;
for (pos_type i = pos, j = 0; i <= pos_end; ++i) {
if (moveItem(par, pos, *tmp, j, bparams)) {
++j;
}
}
}
// Move over the end-of-par change information
tmp->setChange(tmp->size(), par.lookupChange(par.size()));
par.setChange(par.size(), Change(bparams.trackChanges ?
Change::INSERTED : Change::UNCHANGED));
if (pos) {
// Make sure that we keep the language when
// breaking paragraph.
if (tmp->empty()) {
Font changed = tmp->getFirstFontSettings(bparams);
Font const & old = par.getFontSettings(bparams, par.size());
changed.setLanguage(old.language());
tmp->setFont(0, changed);
}
return;
}
if (!isempty) {
bool const soa = par.params().startOfAppendix();
par.params().clear();
// do not lose start of appendix marker (bug 4212)
par.params().startOfAppendix(soa);
par.setPlainOrDefaultLayout(bparams.documentClass());
}
// layout stays the same with latex-environments
if (keep_layout) {
par.setLayout(tmp->layout());
par.setLabelWidthString(tmp->params().labelWidthString());
par.params().depth(tmp->params().depth());
}
}
void Text::breakParagraph(Cursor & cur, bool inverse_logic)
{
LASSERT(this == cur.text(), /**/);

View File

@ -19,8 +19,11 @@
namespace lyx {
class Buffer;
class BufferParams;
class BufferView;
class CompletionList;
class Cursor;
class CursorSlice;
class DocIterator;
class ErrorList;
@ -29,12 +32,10 @@ class FontInfo;
class FuncRequest;
class FuncStatus;
class Inset;
class Cursor;
class Lexer;
class PainterInfo;
class Spacing;
/// This class encapsulates the main text data and operations in LyX
class Text {
public:
@ -357,6 +358,51 @@ private:
DocIterator macrocontext_position_;
};
///
void breakParagraphConservative(BufferParams const & bparams,
ParagraphList & paragraphs,
pit_type par,
pos_type pos);
/**
* Append the next paragraph onto the tail of this one.
* Be careful, this doesent make any check at all.
*/
void mergeParagraph(BufferParams const & bparams,
ParagraphList & paragraphs, pit_type par);
/// for the environments
pit_type depthHook(pit_type par,
ParagraphList const & plist, depth_type depth);
pit_type outerHook(pit_type par, ParagraphList const & plist);
/// Is it the first par with same depth and layout?
bool isFirstInSequence(pit_type par, ParagraphList const & plist);
/** Set Label Width string to all paragraphs of the same layout
and depth in a sequence */
void setLabelWidthStringToSequence(pit_type const par_offset,
ParagraphList & pars, docstring const & s);
/** Check if the current paragraph is the last paragraph in a
proof environment */
int getEndLabel(pit_type par, ParagraphList const & plist);
/**
* Get the font of the "environment" of paragraph \p par_offset in \p pars.
* All font changes of the paragraph are relative to this font.
*/
Font const outerFont(pit_type par_offset, ParagraphList const & pars);
/// accept the changes within the complete ParagraphList
void acceptChanges(ParagraphList & pars, BufferParams const & bparams);
/// return true if the whole ParagraphList is deleted
bool isFullyDeleted(ParagraphList const & pars);
} // namespace lyx
#endif // TEXT_H

View File

@ -40,7 +40,6 @@
#include "LyXFunc.h"
#include "LyXRC.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "TextClass.h"
#include "TextMetrics.h"

View File

@ -41,7 +41,6 @@
#include "Lexer.h"
#include "LyXRC.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "TextClass.h"
#include "TextMetrics.h"

View File

@ -34,7 +34,6 @@
#include "Length.h"
#include "LyXRC.h"
#include "MetricsInfo.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
#include "rowpainter.h"

View File

@ -28,7 +28,6 @@
#include "LyX.h"
#include "TextClass.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphList.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"

View File

@ -30,7 +30,6 @@
#include "output_latex.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "TextClass.h"
#include "TocBackend.h"

View File

@ -38,7 +38,6 @@
#include "LyXRC.h"
#include "MetricsInfo.h"
#include "OutputParams.h"
#include "paragraph_funcs.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"

View File

@ -40,7 +40,6 @@
#include "output_xhtml.h"
#include "OutputParams.h"
#include "output_plaintext.h"
#include "paragraph_funcs.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"

View File

@ -20,10 +20,10 @@
#include "Layout.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphList.h"
#include "ParagraphParameters.h"
#include "sgml.h"
#include "Text.h"
#include "TextClass.h"
#include "support/lassert.h"

View File

@ -21,7 +21,6 @@
#include "LyXRC.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "TextClass.h"
#include "TexRow.h"

View File

@ -21,10 +21,10 @@
#include "Layout.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphList.h"
#include "ParagraphParameters.h"
#include "sgml.h"
#include "Text.h"
#include "TextClass.h"
#include "support/lassert.h"

View File

@ -1,380 +0,0 @@
/**
* \file paragraph_funcs.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "paragraph_funcs.h"
#include "BufferParams.h"
#include "Changes.h"
#include "InsetList.h"
#include "Layout.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "Text.h"
#include "TextClass.h"
#include "support/debug.h"
#include "support/lassert.h"
#include <boost/next_prior.hpp>
using namespace std;
namespace lyx {
static bool moveItem(Paragraph & fromPar, pos_type fromPos,
Paragraph & toPar, pos_type toPos, BufferParams const & params)
{
// Note: moveItem() does not honour change tracking!
// Therefore, it should only be used for breaking and merging paragraphs
// We need a copy here because the character at fromPos is going to be erased.
Font const tmpFont = fromPar.getFontSettings(params, fromPos);
Change const tmpChange = fromPar.lookupChange(fromPos);
if (Inset * tmpInset = fromPar.getInset(fromPos)) {
fromPar.releaseInset(fromPos);
// The inset is not in fromPar any more.
if (!toPar.insertInset(toPos, tmpInset, tmpFont, tmpChange)) {
delete tmpInset;
return false;
}
return true;
}
char_type const tmpChar = fromPar.getChar(fromPos);
fromPar.eraseChar(fromPos, false);
toPar.insertChar(toPos, tmpChar, tmpFont, tmpChange);
return true;
}
void breakParagraph(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset, pos_type pos,
bool keep_layout)
{
// create a new paragraph, and insert into the list
ParagraphList::iterator tmp =
pars.insert(boost::next(pars.begin(), par_offset + 1),
Paragraph());
Paragraph & par = pars[par_offset];
// remember to set the inset_owner
tmp->setInsetOwner(&par.inInset());
// without doing that we get a crash when typing <Return> at the
// end of a paragraph
tmp->setPlainOrDefaultLayout(bparams.documentClass());
// layout stays the same with latex-environments
if (keep_layout) {
tmp->setLayout(par.layout());
tmp->setLabelWidthString(par.params().labelWidthString());
tmp->params().depth(par.params().depth());
} else if (par.params().depth() > 0) {
Paragraph const & hook = pars[outerHook(par_offset, pars)];
tmp->setLayout(hook.layout());
// not sure the line below is useful
tmp->setLabelWidthString(par.params().labelWidthString());
tmp->params().depth(hook.params().depth());
}
bool const isempty = (par.allowEmpty() && par.empty());
if (!isempty && (par.size() > pos || par.empty())) {
tmp->setLayout(par.layout());
tmp->params().align(par.params().align());
tmp->setLabelWidthString(par.params().labelWidthString());
tmp->params().depth(par.params().depth());
tmp->params().noindent(par.params().noindent());
// move everything behind the break position
// to the new paragraph
/* Note: if !keepempty, empty() == true, then we reach
* here with size() == 0. So pos_end becomes - 1. This
* doesn't cause problems because both loops below
* enforce pos <= pos_end and 0 <= pos
*/
pos_type pos_end = par.size() - 1;
for (pos_type i = pos, j = 0; i <= pos_end; ++i) {
if (moveItem(par, pos, *tmp, j, bparams)) {
++j;
}
}
}
// Move over the end-of-par change information
tmp->setChange(tmp->size(), par.lookupChange(par.size()));
par.setChange(par.size(), Change(bparams.trackChanges ?
Change::INSERTED : Change::UNCHANGED));
if (pos) {
// Make sure that we keep the language when
// breaking paragraph.
if (tmp->empty()) {
Font changed = tmp->getFirstFontSettings(bparams);
Font const & old = par.getFontSettings(bparams, par.size());
changed.setLanguage(old.language());
tmp->setFont(0, changed);
}
return;
}
if (!isempty) {
bool const soa = par.params().startOfAppendix();
par.params().clear();
// do not lose start of appendix marker (bug 4212)
par.params().startOfAppendix(soa);
par.setPlainOrDefaultLayout(bparams.documentClass());
}
// layout stays the same with latex-environments
if (keep_layout) {
par.setLayout(tmp->layout());
par.setLabelWidthString(tmp->params().labelWidthString());
par.params().depth(tmp->params().depth());
}
}
void breakParagraphConservative(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset, pos_type pos)
{
// create a new paragraph
Paragraph & tmp = *pars.insert(boost::next(pars.begin(), par_offset + 1),
Paragraph());
Paragraph & par = pars[par_offset];
tmp.setInsetOwner(&par.inInset());
tmp.makeSameLayout(par);
LASSERT(pos <= par.size(), /**/);
if (pos < par.size()) {
// move everything behind the break position to the new paragraph
pos_type pos_end = par.size() - 1;
for (pos_type i = pos, j = 0; i <= pos_end; ++i) {
if (moveItem(par, pos, tmp, j, bparams)) {
++j;
}
}
// Move over the end-of-par change information
tmp.setChange(tmp.size(), par.lookupChange(par.size()));
par.setChange(par.size(), Change(bparams.trackChanges ?
Change::INSERTED : Change::UNCHANGED));
}
}
void mergeParagraph(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset)
{
Paragraph & next = pars[par_offset + 1];
Paragraph & par = pars[par_offset];
pos_type pos_end = next.size() - 1;
pos_type pos_insert = par.size();
// the imaginary end-of-paragraph character (at par.size()) has to be
// marked as unmodified. Otherwise, its change is adopted by the first
// character of the next paragraph.
if (par.isChanged(par.size())) {
LYXERR(Debug::CHANGES,
"merging par with inserted/deleted end-of-par character");
par.setChange(par.size(), Change(Change::UNCHANGED));
}
Change change = next.lookupChange(next.size());
// move the content of the second paragraph to the end of the first one
for (pos_type i = 0, j = pos_insert; i <= pos_end; ++i) {
if (moveItem(next, 0, par, j, bparams)) {
++j;
}
}
// move the change of the end-of-paragraph character
par.setChange(par.size(), change);
pars.erase(boost::next(pars.begin(), par_offset + 1));
}
pit_type depthHook(pit_type pit, ParagraphList const & pars, depth_type depth)
{
pit_type newpit = pit;
if (newpit != 0)
--newpit;
while (newpit != 0 && pars[newpit].getDepth() > depth)
--newpit;
if (pars[newpit].getDepth() > depth)
return pit;
return newpit;
}
pit_type outerHook(pit_type par_offset, ParagraphList const & pars)
{
Paragraph const & par = pars[par_offset];
if (par.getDepth() == 0)
return pars.size();
return depthHook(par_offset, pars, depth_type(par.getDepth() - 1));
}
bool isFirstInSequence(pit_type par_offset, ParagraphList const & pars)
{
Paragraph const & par = pars[par_offset];
pit_type dhook_offset = depthHook(par_offset, pars, par.getDepth());
if (dhook_offset == par_offset)
return true;
Paragraph const & dhook = pars[dhook_offset];
return dhook.layout() != par.layout()
|| dhook.getDepth() != par.getDepth();
}
void setLabelWidthStringToSequence(pit_type const par_offset,
ParagraphList & pars, docstring const & s)
{
pit_type offset = par_offset;
// Find first of same layout in sequence
while (!isFirstInSequence(offset, pars)) {
offset = depthHook(offset, pars, pars[offset].getDepth());
}
// now apply label width string to every par
// in sequence
pit_type const end = pars.size();
depth_type const depth = pars[offset].getDepth();
Layout const & layout = pars[offset].layout();
for (pit_type pit = offset; pit != end; ++pit) {
while (pars[pit].getDepth() > depth)
++pit;
if (pars[pit].getDepth() < depth)
return;
if (pars[pit].layout() != layout)
return;
pars[pit].setLabelWidthString(s);
}
}
int getEndLabel(pit_type p, ParagraphList const & pars)
{
pit_type pit = p;
depth_type par_depth = pars[p].getDepth();
while (pit != pit_type(pars.size())) {
Layout const & layout = pars[pit].layout();
int const endlabeltype = layout.endlabeltype;
if (endlabeltype != END_LABEL_NO_LABEL) {
if (p + 1 == pit_type(pars.size()))
return endlabeltype;
depth_type const next_depth =
pars[p + 1].getDepth();
if (par_depth > next_depth ||
(par_depth == next_depth && layout != pars[p + 1].layout()))
return endlabeltype;
break;
}
if (par_depth == 0)
break;
pit = outerHook(pit, pars);
if (pit != pit_type(pars.size()))
par_depth = pars[pit].getDepth();
}
return END_LABEL_NO_LABEL;
}
Font const outerFont(pit_type par_offset, ParagraphList const & pars)
{
depth_type par_depth = pars[par_offset].getDepth();
FontInfo tmpfont = inherit_font;
// Resolve against environment font information
while (par_offset != pit_type(pars.size())
&& par_depth
&& !tmpfont.resolved()) {
par_offset = outerHook(par_offset, pars);
if (par_offset != pit_type(pars.size())) {
tmpfont.realize(pars[par_offset].layout().font);
par_depth = pars[par_offset].getDepth();
}
}
return Font(tmpfont);
}
bool isFullyDeleted(ParagraphList const & pars)
{
pit_type const pars_size = static_cast<pit_type>(pars.size());
// check all paragraphs
for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars[pit].empty()) // prevent assertion failure
if (!pars[pit].isDeleted(0, pars[pit].size()))
return false;
}
return true;
}
void acceptChanges(ParagraphList & pars, BufferParams const & bparams)
{
pit_type pars_size = static_cast<pit_type>(pars.size());
// first, accept changes within each individual paragraph
// (do not consider end-of-par)
for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars[pit].empty()) // prevent assertion failure
pars[pit].acceptChanges(0, pars[pit].size());
}
// next, accept imaginary end-of-par characters
for (pit_type pit = 0; pit < pars_size; ++pit) {
pos_type pos = pars[pit].size();
if (pars[pit].isInserted(pos)) {
pars[pit].setChange(pos, Change(Change::UNCHANGED));
} else if (pars[pit].isDeleted(pos)) {
if (pit == pars_size - 1) {
// we cannot remove a par break at the end of the last
// paragraph; instead, we mark it unchanged
pars[pit].setChange(pos, Change(Change::UNCHANGED));
} else {
mergeParagraph(bparams, pars, pit);
--pit;
--pars_size;
}
}
}
}
} // namespace lyx

View File

@ -1,87 +0,0 @@
// -*- C++ -*-
/**
* \file paragraph_funcs.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#ifndef PARAGRAPH_FUNCS_H
#define PARAGRAPH_FUNCS_H
#include "support/strfwd.h"
#include "support/types.h"
namespace lyx {
class Buffer;
class BufferParams;
class Inset;
class Font;
class Paragraph;
class ParagraphList;
/**
* This breaks a paragraph at the specified position.
* The new paragraph will:
* - Decrease depth by one (or change layout to default layout) when
* keep_layout == false
* - keep current depth and layout when keep_layout == true
*/
void breakParagraph(BufferParams const & bparams,
ParagraphList & paragraphs,
pit_type par,
pos_type pos,
bool keep_layout);
///
void breakParagraphConservative(BufferParams const & bparams,
ParagraphList & paragraphs,
pit_type par,
pos_type pos);
/**
* Append the next paragraph onto the tail of this one.
* Be careful, this doesent make any check at all.
*/
void mergeParagraph(BufferParams const & bparams,
ParagraphList & paragraphs, pit_type par);
/// for the environments
pit_type depthHook(pit_type par,
ParagraphList const & plist, depth_type depth);
pit_type outerHook(pit_type par, ParagraphList const & plist);
/// Is it the first par with same depth and layout?
bool isFirstInSequence(pit_type par, ParagraphList const & plist);
/** Set Label Width string to all paragraphs of the same layout
and depth in a sequence */
void setLabelWidthStringToSequence(pit_type const par_offset,
ParagraphList & pars, docstring const & s);
/** Check if the current paragraph is the last paragraph in a
proof environment */
int getEndLabel(pit_type par, ParagraphList const & plist);
/**
* Get the font of the "environment" of paragraph \p par_offset in \p pars.
* All font changes of the paragraph are relative to this font.
*/
Font const outerFont(pit_type par_offset, ParagraphList const & pars);
/// accept the changes within the complete ParagraphList
void acceptChanges(ParagraphList & pars, BufferParams const & bparams);
/// return true if the whole ParagraphList is deleted
bool isFullyDeleted(ParagraphList const & pars);
} // namespace lyx
#endif // PARAGRAPH_FUNCS_H

View File

@ -29,7 +29,6 @@
#include "MetricsInfo.h"
#include "Paragraph.h"
#include "ParagraphMetrics.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "TextMetrics.h"
#include "VSpace.h"