CutStack theCuts(10);
-struct resetOwnerAndChanges : public std::unary_function<Paragraph, void> {
+class resetOwnerAndChanges : public std::unary_function<Paragraph, void> {
+public:
void operator()(Paragraph & p) const {
p.cleanChanges();
p.setInsetOwner(0);
// 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);
// 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.
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;
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()) {
if (doclear)
text->paragraphs()[begpit].stripLeadingSpaces();
- text->redoParagraphs(begpit, begpit + 1);
// cutSelection can invalidate the cursor so we need to set
// it anew. (Lgb)
// we prefer the end for when tracking changes
// need a valid cursor. (Lgb)
cur.clearSelection();
- text->updateCounters();
+ updateCounters(cur.buffer());
}
if (cur.inMathed()) {
bufferErrors(cur.buffer(), el);
cur.bv().showErrorList(_("Paste"));
- text->redoParagraphs(cur.pit(), endpit);
-
cur.clearSelection();
cur.resetAnchor();
text->setCursor(cur, ppp.first, ppp.second);
cur.setSelection();
- text->updateCounters();
+ updateCounters(cur.buffer());
}
if (cur.inMathed()) {
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 {