X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph_funcs.cpp;h=0d626e3d64f11dac0cbebadce2aee3d76a7a3092;hb=834bfe5e2143179ac3ccb6dd9a0618d349bf6958;hp=ff4812cfceebae1d8d26551b00da5a6c782318f5;hpb=6e974a3d42b1e14daf2cdaac65d33aad4876063a;p=lyx.git diff --git a/src/paragraph_funcs.cpp b/src/paragraph_funcs.cpp index ff4812cfce..0d626e3d64 100644 --- a/src/paragraph_funcs.cpp +++ b/src/paragraph_funcs.cpp @@ -3,7 +3,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ @@ -13,17 +13,22 @@ #include "paragraph_funcs.h" #include "BufferParams.h" -#include "debug.h" -#include "Text.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" -namespace lyx { +#include "support/lassert.h" +#include -using std::string; -using std::endl; +using namespace std; +namespace lyx { static bool moveItem(Paragraph & fromPar, pos_type fromPos, Paragraph & toPar, pos_type toPos, BufferParams const & params) @@ -31,36 +36,30 @@ static bool moveItem(Paragraph & fromPar, pos_type fromPos, // Note: moveItem() does not honour change tracking! // Therefore, it should only be used for breaking and merging paragraphs - Paragraph::value_type const tmpChar = fromPar.getChar(fromPos); + // 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 (tmpChar == Paragraph::META_INSET) { - Inset * tmpInset = 0; - if (fromPar.getInset(fromPos)) { - // the inset is not in the paragraph any more - tmpInset = fromPar.insetlist.release(fromPos); - } - - fromPar.eraseChar(fromPos, false); - - if (!toPar.insetAllowed(tmpInset->lyxCode())) { + 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; } - - toPar.insertInset(toPos, tmpInset, tmpFont, tmpChange); - } else { - fromPar.eraseChar(fromPos, false); - toPar.insertChar(toPos, tmpChar, tmpFont, tmpChange); + 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, int flag) + ParagraphList & pars, pit_type par_offset, pos_type pos, + bool keep_layout) { // create a new paragraph, and insert into the list ParagraphList::iterator tmp = @@ -69,20 +68,20 @@ void breakParagraph(BufferParams const & bparams, 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->layout(bparams.getTextClass().defaultLayout()); - // remember to set the inset_owner - tmp->setInsetOwner(par.inInset()); + tmp->setPlainOrDefaultLayout(bparams.documentClass()); // layout stays the same with latex-environments - if (flag) { - tmp->layout(par.layout()); + 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->layout(hook.layout()); + tmp->setLayout(hook.layout()); // not sure the line below is useful tmp->setLabelWidthString(par.params().labelWidthString()); tmp->params().depth(hook.params().depth()); @@ -90,8 +89,8 @@ void breakParagraph(BufferParams const & bparams, bool const isempty = (par.allowEmpty() && par.empty()); - if (!isempty && (par.size() > pos || par.empty() || flag == 2)) { - tmp->layout(par.layout()); + if (!isempty && (par.size() > pos || par.empty())) { + tmp->setLayout(par.layout()); tmp->params().align(par.params().align()); tmp->setLabelWidthString(par.params().labelWidthString()); @@ -125,7 +124,7 @@ void breakParagraph(BufferParams const & bparams, // breaking paragraph. if (tmp->empty()) { Font changed = tmp->getFirstFontSettings(bparams); - Font old = par.getFontSettings(bparams, par.size()); + Font const & old = par.getFontSettings(bparams, par.size()); changed.setLanguage(old.language()); tmp->setFont(0, changed); } @@ -138,12 +137,12 @@ void breakParagraph(BufferParams const & bparams, par.params().clear(); // do not lose start of appendix marker (bug 4212) par.params().startOfAppendix(soa); - par.layout(bparams.getTextClass().defaultLayout()); + par.setPlainOrDefaultLayout(bparams.documentClass()); } // layout stays the same with latex-environments - if (flag) { - par.layout(tmp->layout()); + if (keep_layout) { + par.setLayout(tmp->layout()); par.setLabelWidthString(tmp->params().labelWidthString()); par.params().depth(tmp->params().depth()); } @@ -158,9 +157,10 @@ void breakParagraphConservative(BufferParams const & bparams, Paragraph()); Paragraph & par = pars[par_offset]; + tmp.setInsetOwner(&par.inInset()); tmp.makeSameLayout(par); - BOOST_ASSERT(pos <= par.size()); + LASSERT(pos <= par.size(), /**/); if (pos < par.size()) { // move everything behind the break position to the new paragraph @@ -192,8 +192,8 @@ void mergeParagraph(BufferParams const & bparams, // marked as unmodified. Otherwise, its change is adopted by the first // character of the next paragraph. if (par.lookupChange(par.size()).type != Change::UNCHANGED) { - LYXERR(Debug::CHANGES) << - "merging par with inserted/deleted end-of-par character" << endl; + LYXERR(Debug::CHANGES, + "merging par with inserted/deleted end-of-par character"); par.setChange(par.size(), Change(Change::UNCHANGED)); } @@ -256,13 +256,40 @@ bool isFirstInSequence(pit_type par_offset, ParagraphList const & pars) } +void setLabelWidthStringToSequence(pit_type par_offset, + ParagraphList & pars, docstring const & s) +{ + Paragraph & par = pars[par_offset]; + // Find first of same layout in sequence + while (!isFirstInSequence(par_offset, pars)) { + par_offset = depthHook(par_offset, pars, par.getDepth()); + par = pars[par_offset]; + } + + // now apply label width string to every par + // in sequence + pit_type const end = pars.size(); + depth_type const depth = par.getDepth(); + Layout const & layout = par.layout(); + for (pit_type pit = par_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())) { - LayoutPtr const & layout = pars[pit].layout(); - int const endlabeltype = layout->endlabeltype; + Layout const & layout = pars[pit].layout(); + int const endlabeltype = layout.endlabeltype; if (endlabeltype != END_LABEL_NO_LABEL) { if (p + 1 == pit_type(pars.size())) @@ -288,7 +315,7 @@ int getEndLabel(pit_type p, ParagraphList const & pars) Font const outerFont(pit_type par_offset, ParagraphList const & pars) { depth_type par_depth = pars[par_offset].getDepth(); - Font tmpfont(Font::ALL_INHERIT); + FontInfo tmpfont = inherit_font; // Resolve against environment font information while (par_offset != pit_type(pars.size()) @@ -296,27 +323,26 @@ Font const outerFont(pit_type par_offset, ParagraphList const & pars) && !tmpfont.resolved()) { par_offset = outerHook(par_offset, pars); if (par_offset != pit_type(pars.size())) { - tmpfont.realize(pars[par_offset].layout()->font); + tmpfont.realize(pars[par_offset].layout().font); par_depth = pars[par_offset].getDepth(); } } - return tmpfont; + return Font(tmpfont); } -/// return the number of InsetOptArg in a paragraph -int numberOfOptArgs(Paragraph const & par) +bool isFullyDeleted(ParagraphList const & pars) { - int num = 0; + pit_type const pars_size = static_cast(pars.size()); - InsetList::const_iterator it = par.insetlist.begin(); - InsetList::const_iterator end = par.insetlist.end(); - for (; it != end ; ++it) { - if (it->inset->lyxCode() == Inset::OPTARG_CODE) - ++num; + // check all paragraphs + for (pit_type pit = 0; pit < pars_size; ++pit) { + if (!pars[pit].empty()) // prevent assertion failure + if (!pars[pit].isFullyDeleted(0, pars[pit].size())) + return false; } - return num; + return true; }