mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-31 07:45:44 +00:00
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:
parent
eef8720eca
commit
2b9e44cb01
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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 \
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
356
src/Text.cpp
356
src/Text.cpp
@ -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(), /**/);
|
||||
|
50
src/Text.h
50
src/Text.h
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include "output_latex.h"
|
||||
#include "OutputParams.h"
|
||||
#include "Paragraph.h"
|
||||
#include "paragraph_funcs.h"
|
||||
#include "TextClass.h"
|
||||
#include "TocBackend.h"
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
@ -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
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user