]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph_funcs.C
bug 2298: cursorTop/Bottom/Home/End does not redraw after dEPM
[lyx.git] / src / paragraph_funcs.C
index 36bed60fe606d3bc7e436d655f35f15f245cc165..b5b43d87d7860b2eda1db9f336764bdedf6b2590 100644 (file)
@@ -213,6 +213,9 @@ void breakParagraphConservative(BufferParams const & bparams,
                        if (moveItem(par, tmp, bparams, i, j - pos, change))
                                ++j;
                }
+               // Move over end-of-par change attr
+               tmp.setChange(tmp.size(), par.lookupChange(par.size()));
+
                // If tracking changes, set all the text that is to be
                // erased to Type::INSERTED.
                for (pos_type k = pos_end; k >= pos; --k) {
@@ -233,12 +236,28 @@ 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) {
                Change::Type change = next.lookupChange(i);
                if (moveItem(next, par, bparams, i, pos_insert + j, change))
                        ++j;
        }
+       // Move the change status of "carriage return" over
+       par.setChange(par.size(), cr);
 
        pars.erase(pars.begin() + par_offset + 1);
 }