From 2b9e44cb0110201ca4d6320266e6550160ee99b3 Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Sun, 9 Aug 2009 17:30:41 +0000 Subject: [PATCH] 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 --- development/scons/scons_manifest.py | 2 - src/Buffer.cpp | 1 - src/BufferView.cpp | 1 - src/Cursor.cpp | 1 - src/CutAndPaste.cpp | 1 - src/Makefile.am | 2 - src/Paragraph.cpp | 1 - src/ParagraphMetrics.cpp | 1 - src/Text.cpp | 356 +++++++++++++++++++++++++- src/Text.h | 50 +++- src/Text2.cpp | 1 - src/Text3.cpp | 1 - src/TextMetrics.cpp | 1 - src/buffer_funcs.cpp | 1 - src/insets/InsetCaption.cpp | 1 - src/insets/InsetTabular.cpp | 1 - src/insets/InsetText.cpp | 1 - src/output_docbook.cpp | 2 +- src/output_latex.cpp | 1 - src/output_xhtml.cpp | 2 +- src/paragraph_funcs.cpp | 380 ---------------------------- src/paragraph_funcs.h | 87 ------- src/rowpainter.cpp | 1 - 23 files changed, 405 insertions(+), 491 deletions(-) delete mode 100644 src/paragraph_funcs.cpp delete mode 100644 src/paragraph_funcs.h diff --git a/development/scons/scons_manifest.py b/development/scons/scons_manifest.py index 1c398eafcf..6e1ddb8547 100644 --- a/development/scons/scons_manifest.py +++ b/development/scons/scons_manifest.py @@ -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 diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 168f579797..b3137ad4b7 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.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" diff --git a/src/BufferView.cpp b/src/BufferView.cpp index ee5fffa53a..ec1f157040 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -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" diff --git a/src/Cursor.cpp b/src/Cursor.cpp index b4aee4cf69..3edf97065d 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -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" diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 3174104976..1efca23341 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -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" diff --git a/src/Makefile.am b/src/Makefile.am index 306d801a79..6bcfca1e4e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index a6041d06c7..6dce930e9a 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -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" diff --git a/src/ParagraphMetrics.cpp b/src/ParagraphMetrics.cpp index 16f2fb2713..d0822312fb 100644 --- a/src/ParagraphMetrics.cpp +++ b/src/ParagraphMetrics.cpp @@ -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" diff --git a/src/Text.cpp b/src/Text.cpp index 103c71ac73..153685cc9e 100644 --- a/src/Text.cpp +++ b/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(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(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 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(), /**/); diff --git a/src/Text.h b/src/Text.h index 1a3808fec3..47860104a4 100644 --- a/src/Text.h +++ b/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 diff --git a/src/Text2.cpp b/src/Text2.cpp index d83e85a41b..080fdc0c46 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -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" diff --git a/src/Text3.cpp b/src/Text3.cpp index a9b1e30f09..a84c4a05e8 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -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" diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 89dbbdc0ac..fe9cb92947 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -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" diff --git a/src/buffer_funcs.cpp b/src/buffer_funcs.cpp index 7d23306d2b..ee52fc68ec 100644 --- a/src/buffer_funcs.cpp +++ b/src/buffer_funcs.cpp @@ -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" diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp index 4b19a6d3bf..db95f060b9 100644 --- a/src/insets/InsetCaption.cpp +++ b/src/insets/InsetCaption.cpp @@ -30,7 +30,6 @@ #include "output_latex.h" #include "OutputParams.h" #include "Paragraph.h" -#include "paragraph_funcs.h" #include "TextClass.h" #include "TocBackend.h" diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index a576d2685a..1738869e18 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -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" diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index ed39b2558d..52644f8b57 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -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" diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index 535d507c63..cfb6980336 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -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" diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 59c1140423..1ff05aa98b 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -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" diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp index 1c61421c7f..a5f36fa0ba 100644 --- a/src/output_xhtml.cpp +++ b/src/output_xhtml.cpp @@ -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" diff --git a/src/paragraph_funcs.cpp b/src/paragraph_funcs.cpp deleted file mode 100644 index dfc895d1f1..0000000000 --- a/src/paragraph_funcs.cpp +++ /dev/null @@ -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 - -#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 - -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 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(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(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 diff --git a/src/paragraph_funcs.h b/src/paragraph_funcs.h deleted file mode 100644 index 33e9a3766b..0000000000 --- a/src/paragraph_funcs.h +++ /dev/null @@ -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 diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index 930c44cd69..fffba14109 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -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" -- 2.39.2