]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph_funcs.C
Fix bug 2485 and crash on middle mouse paste on math
[lyx.git] / src / paragraph_funcs.C
index ff134379b254041af21ac7601d2c666b942e677d..5f67d40469a94e6a207dc4588ee97baf34d46e3c 100644 (file)
@@ -96,7 +96,8 @@ void breakParagraph(BufferParams const & bparams,
 {
        // create a new paragraph, and insert into the list
        ParagraphList::iterator tmp =
-               pars.insert(pars.begin() + par_offset + 1, Paragraph());
+               pars.insert(boost::next(pars.begin(), par_offset + 1),
+                           Paragraph());
 
        Paragraph & par = pars[par_offset];
 
@@ -119,6 +120,7 @@ void breakParagraph(BufferParams const & bparams,
        if (flag) {
                tmp->layout(par.layout());
                tmp->setLabelWidthString(par.params().labelWidthString());
+               tmp->params().depth(par.params().depth());
        }
 
        bool const isempty = (par.allowEmpty() && par.empty());
@@ -166,11 +168,11 @@ void breakParagraph(BufferParams const & bparams,
                return;
        }
 
-        if (!isempty) {
-                par.params().clear();
-                par.layout(bparams.getLyXTextClass().defaultLayout());
-        }
-        
+       if (!isempty) {
+               par.params().clear();
+               par.layout(bparams.getLyXTextClass().defaultLayout());
+       }
+
        // layout stays the same with latex-environments
        if (flag) {
                par.layout(tmp->layout());
@@ -193,7 +195,8 @@ void breakParagraphConservative(BufferParams const & bparams,
        ParagraphList & pars, pit_type par_offset, pos_type pos)
 {
        // create a new paragraph
-       Paragraph & tmp = *pars.insert(pars.begin() + par_offset + 1, Paragraph());
+       Paragraph & tmp = *pars.insert(boost::next(pars.begin(), par_offset + 1),
+                                      Paragraph());
        Paragraph & par = pars[par_offset];
 
        if (bparams.tracking_changes)
@@ -236,6 +239,19 @@ void mergeParagraph(BufferParams const & bparams,
        pos_type pos_end = next.size() - 1;
        pos_type pos_insert = par.size();
 
+       // What happens is the following. Later on, moveItem() will copy
+       // over characters from the next paragraph to be inserted into this
+       // position. Now, if the first char to be so copied is "red" (i.e.,
+       // marked deleted) and the paragraph break is marked "blue",
+       // insertChar will trigger (eventually, through record(), and see
+       // del() and erase() in changes.C) a "hard" character deletion.
+       // Which doesn't make sense of course at this pos, but the effect is
+       // to shorten the change range to which this para break belongs, by
+       // one. It will (should) remain "orphaned", having no CT info to it,
+       // and check() in changes.C will assert. Setting the para break
+       // forcibly to "black" prevents this scenario. -- MV 13.3.2006
+       par.setChange(par.size(), Change::UNCHANGED);
+
        Change::Type cr = next.lookupChange(next.size());
        // ok, now copy the paragraph
        for (pos_type i = 0, j = 0; i <= pos_end; ++i) {
@@ -246,7 +262,7 @@ void mergeParagraph(BufferParams const & bparams,
        // Move the change status of "carriage return" over
        par.setChange(par.size(), cr);
 
-       pars.erase(pars.begin() + par_offset + 1);
+       pars.erase(boost::next(pars.begin(), par_offset + 1));
 }