]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph_funcs.cpp
'using namespace std' instead of 'using std::xxx'
[lyx.git] / src / paragraph_funcs.cpp
index cbac6caee1b9a5a15ea01bc2627186d9e23f19f9..2f87daf5b59d553417418371384dfc34fcdc7750 100644 (file)
 #include "paragraph_funcs.h"
 
 #include "BufferParams.h"
-#include "debug.h"
-#include "Text.h"
+#include "Changes.h"
+#include "support/debug.h"
+#include "InsetList.h"
+#include "Layout.h"
 #include "Paragraph.h"
 #include "ParagraphParameters.h"
+#include "Text.h"
+#include "TextClass.h"
 
+#include <boost/next_prior.hpp>
 
-namespace lyx {
-
-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,19 +34,17 @@ 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);
+       char_type const tmpChar = fromPar.getChar(fromPos);
        Font const tmpFont = fromPar.getFontSettings(params, fromPos);
        Change const tmpChange = fromPar.lookupChange(fromPos);
 
-       if (tmpChar == Paragraph::META_INSET) {
+       if (fromPar.isInset(fromPos)) {
                Inset * tmpInset = 0;
                if (fromPar.getInset(fromPos)) {
                        // the inset is not in the paragraph any more
-                       tmpInset = fromPar.insetlist.release(fromPos);
+                       tmpInset = fromPar.releaseInset(fromPos);
                }
 
-               fromPar.eraseChar(fromPos, false);
-
                if (!toPar.insetAllowed(tmpInset->lyxCode())) {
                        delete tmpInset;
                        return false;
@@ -60,7 +61,8 @@ static bool moveItem(Paragraph & fromPar, pos_type fromPos,
 
 
 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 =
@@ -76,7 +78,7 @@ void breakParagraph(BufferParams const & bparams,
        tmp->setInsetOwner(par.inInset());
 
        // layout stays the same with latex-environments
-       if (flag) {
+       if (keep_layout) {
                tmp->layout(par.layout());
                tmp->setLabelWidthString(par.params().labelWidthString());
                tmp->params().depth(par.params().depth());
@@ -90,7 +92,7 @@ void breakParagraph(BufferParams const & bparams,
 
        bool const isempty = (par.allowEmpty() && par.empty());
 
-       if (!isempty && (par.size() > pos || par.empty() || flag == 2)) {
+       if (!isempty && (par.size() > pos || par.empty())) {
                tmp->layout(par.layout());
                tmp->params().align(par.params().align());
                tmp->setLabelWidthString(par.params().labelWidthString());
@@ -118,7 +120,7 @@ void breakParagraph(BufferParams const & bparams,
        // 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));
+                                          Change::INSERTED : Change::UNCHANGED));
 
        if (pos) {
                // Make sure that we keep the language when
@@ -134,12 +136,15 @@ void breakParagraph(BufferParams const & bparams,
        }
 
        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.layout(bparams.getTextClass().defaultLayout());
        }
 
        // layout stays the same with latex-environments
-       if (flag) {
+       if (keep_layout) {
                par.layout(tmp->layout());
                par.setLabelWidthString(tmp->params().labelWidthString());
                par.params().depth(tmp->params().depth());
@@ -171,7 +176,7 @@ void breakParagraphConservative(BufferParams const & bparams,
                // 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));
+                                          Change::INSERTED : Change::UNCHANGED));
        }
 }
 
@@ -189,8 +194,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));
        }
 
@@ -258,7 +263,7 @@ 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_ptr const & layout = pars[pit].layout();
+               LayoutPtr const & layout = pars[pit].layout();
                int const endlabeltype = layout->endlabeltype;
 
                if (endlabeltype != END_LABEL_NO_LABEL) {
@@ -285,7 +290,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())
@@ -298,22 +303,39 @@ Font const outerFont(pit_type par_offset, ParagraphList const & pars)
                }
        }
 
-       return tmpfont;
+       return Font(tmpfont);
 }
 
 
-/// return the number of InsetOptArg in a paragraph
-int numberOfOptArgs(Paragraph const & par)
+void acceptChanges(ParagraphList & pars, BufferParams const & bparams)
 {
-       int num = 0;
+       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(bparams, 0, pars[pit].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;
+       // 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;
+                       }
+               }
        }
-       return num;
 }