X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=f41ce3641830e5d2be38e554440ee7737410e5ec;hb=ca6fba31fbc44e4b4ed6457b16f3f0d2ee28b7f0;hp=ad3ad7e23843b0e8f9f1f552621f535319a0ecaf;hpb=54c2ab2732f8094c0c119618d5b0e9a625ffb262;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index ad3ad7e238..f41ce36418 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -125,7 +125,7 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, InsetText * target_inset = cur.inset().asInsetText(); if (!target_inset) { InsetTabular * it = cur.inset().asInsetTabular(); - target_inset = it? it->cell(cur.idx())->asInsetText() : 0; + target_inset = it ? it->cell(cur.idx())->asInsetText() : 0; } LASSERT(target_inset, return PasteReturnValue(pit, pos, need_update)); @@ -170,7 +170,8 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, if (forcePlainLayout || parLayout == defaultLayout) par->setLayout(plainLayout); } - } else { // check if we need to reset from plain layout + } else { + // check if we need to reset from plain layout Layout const & defaultLayout = newDocClass->defaultLayout(); Layout const & plainLayout = newDocClass->plainLayout(); ParagraphList::iterator const end = insertion.end(); @@ -502,6 +503,17 @@ void putClipboard(ParagraphList const & paragraphs, LASSERT(buffer, return); // This needs doing every time. + // Since setDocumentClass() causes deletion of the old document class + // we need to reset all layout pointers in paragraphs (otherwise they + // would be dangling). + ParIterator const end = buffer->par_iterator_end(); + for (ParIterator it = buffer->par_iterator_begin(); it != end; ++it) { + docstring const name = it->layout().name(); + if (docclass->hasLayout(name)) + it->setLayout((*docclass)[name]); + else + it->setPlainOrDefaultLayout(*docclass); + } buffer->params().setDocumentClass(docclass); // we will use pasteSelectionHelper to copy the paragraphs into the @@ -1254,31 +1266,43 @@ void eraseSelection(Cursor & cur) //lyxerr << "cap::eraseSelection begin: " << cur << endl; CursorSlice const & i1 = cur.selBegin(); CursorSlice const & i2 = cur.selEnd(); - if (i1.inset().asInsetMath()) { - saveSelection(cur); - cur.top() = i1; - if (i1.idx() == i2.idx()) { - i1.cell().erase(i1.pos(), i2.pos()); - // We may have deleted i1.cell(cur.pos()). - // Make sure that pos is valid. - if (cur.pos() > cur.lastpos()) - cur.pos() = cur.lastpos(); - } else { - InsetMath * p = i1.asInsetMath(); - Inset::row_type r1, r2; - Inset::col_type c1, c2; - region(i1, i2, r1, r2, c1, c2); - for (Inset::row_type row = r1; row <= r2; ++row) - for (Inset::col_type col = c1; col <= c2; ++col) - p->cell(p->index(row, col)).clear(); - // We've deleted the whole cell. Only pos 0 is valid. - cur.pos() = 0; - } - // need a valid cursor. (Lgb) - cur.clearSelection(); + if (!i1.asInsetMath()) { + LYXERR0("Can't erase this selection"); + return; + } + + saveSelection(cur); + cur.top() = i1; + InsetMath * p = i1.asInsetMath(); + if (i1.idx() == i2.idx()) { + i1.cell().erase(i1.pos(), i2.pos()); + // We may have deleted i1.cell(cur.pos()). + // Make sure that pos is valid. + if (cur.pos() > cur.lastpos()) + cur.pos() = cur.lastpos(); + } else if (p->nrows() > 0 && p->ncols() > 0) { + // This is a grid, delete a nice square region + Inset::row_type r1, r2; + Inset::col_type c1, c2; + region(i1, i2, r1, r2, c1, c2); + for (Inset::row_type row = r1; row <= r2; ++row) + for (Inset::col_type col = c1; col <= c2; ++col) + p->cell(p->index(row, col)).clear(); + // We've deleted the whole cell. Only pos 0 is valid. + cur.pos() = 0; } else { - lyxerr << "can't erase this selection 1" << endl; + Inset::idx_type idx1 = i1.idx(); + Inset::idx_type idx2 = i2.idx(); + if (idx1 > idx2) + swap(idx1, idx2); + for (Inset::idx_type idx = idx1 ; idx <= idx2; ++idx) + p->cell(idx).clear(); + // We've deleted the whole cell. Only pos 0 is valid. + cur.pos() = 0; } + + // need a valid cursor. (Lgb) + cur.clearSelection(); //lyxerr << "cap::eraseSelection end: " << cur << endl; }