X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=af8912c0fdb78b3f5f791c07f3100d3440f25f78;hb=87cd77d1fc819bc8f14982fc6b20091720c011f5;hp=1d567c022fb5d50d9033cb9273a1e66c8029d96c;hpb=a2cd656e256fa50aec3f03851b63a4bc6cdd666d;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index 1d567c022f..af8912c0fd 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -66,7 +66,8 @@ typedef limited_stack > CutStack; CutStack theCuts(10); -struct resetOwnerAndChanges : public std::unary_function { +class resetOwnerAndChanges : public std::unary_function { +public: void operator()(Paragraph & p) const { p.cleanChanges(); p.setInsetOwner(0); @@ -113,6 +114,22 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, // Now remove all out of the pars which is NOT allowed in the // new environment and set also another font if that is required. + // Convert newline to paragraph break in ERT inset. + // This should not be here! + if (pars[pit].inInset() && + pars[pit].inInset()->lyxCode() == InsetBase::ERT_CODE) { + for (ParagraphList::size_type i = 0; i < insertion.size(); ++i) { + for (pos_type j = 0; j < insertion[i].size(); ++j) { + if (insertion[i].isNewline(j)) { + insertion[i].erase(j); + breakParagraphConservative( + buffer.params(), + insertion, i, j); + } + } + } + } + // Make sure there is no class difference. lyx::cap::SwitchLayoutsBetweenClasses(textclass, tc, insertion, errorlist); @@ -144,15 +161,18 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, // Set the inset owner of this paragraph. tmpbuf->setInsetOwner(pars[pit].inInset()); for (pos_type i = 0; i < tmpbuf->size(); ++i) { - if (tmpbuf->getChar(i) == Paragraph::META_INSET) { - if (!pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode())) - tmpbuf->erase(i--); - } + if (tmpbuf->getChar(i) == Paragraph::META_INSET && + !pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode())) + tmpbuf->erase(i--); } } - // Make the buf exactly the same layout as the cursor paragraph. - insertion.begin()->makeSameLayout(pars[pit]); + bool const empty = pars[pit].empty(); + if (!empty) { + // Make the buf exactly the same layout as the cursor + // paragraph. + insertion.begin()->makeSameLayout(pars[pit]); + } // Prepare the paragraphs and insets for insertion. // A couple of insets store buffer references so need updating. @@ -182,15 +202,24 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, std::swap(in.paragraphs(), insertion); // Split the paragraph for inserting the buf if necessary. - bool did_split = false; - if (pars[pit].size() || pit + 1 == pit_type(pars.size())) { + if (!empty) breakParagraphConservative(buffer.params(), pars, pit, pos); - did_split = true; - } // Paste it! - pars.insert(pars.begin() + pit + 1, insertion.begin(), insertion.end()); - mergeParagraph(buffer.params(), pars, pit); + if (empty) { + pars.insert(pars.begin() + pit, insertion.begin(), + insertion.end()); + + // merge the empty par with the last par of the insertion + mergeParagraph(buffer.params(), pars, + pit + insertion.size() - 1); + } else { + pars.insert(pars.begin() + pit + 1, insertion.begin(), + insertion.end()); + + // merge the first par of the insertion with the current par + mergeParagraph(buffer.params(), pars, pit); + } pit_type last_paste = pit + insertion.size() - 1; @@ -199,7 +228,7 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, pos = pars[last_paste].size(); // Maybe some pasting. - if (did_split && last_paste + 1 != pit_type(pars.size())) { + if (!empty && last_paste + 1 != pit_type(pars.size())) { if (pars[last_paste + 1].hasSameLayout(pars[last_paste])) { mergeParagraph(buffer.params(), pars, last_paste); } else if (pars[last_paste + 1].empty()) { @@ -474,7 +503,7 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut) // need a valid cursor. (Lgb) cur.clearSelection(); - text->updateCounters(); + updateCounters(cur.buffer()); } if (cur.inMathed()) { @@ -567,7 +596,7 @@ void pasteSelection(LCursor & cur, size_t sel_index) cur.resetAnchor(); text->setCursor(cur, ppp.first, ppp.second); cur.setSelection(); - text->updateCounters(); + updateCounters(cur.buffer()); } if (cur.inMathed()) { @@ -652,7 +681,7 @@ void eraseSelection(LCursor & cur) for (InsetBase::col_type col = c1; col <= c2; ++col) p->cell(p->index(row, col)).clear(); } - cur.back() = i1; + cur.top() = i1; cur.pos() = 0; // We've deleted the whole cell. Only pos 0 is valid. cur.resetAnchor(); } else {