X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=af8912c0fdb78b3f5f791c07f3100d3440f25f78;hb=87cd77d1fc819bc8f14982fc6b20091720c011f5;hp=acdc5e763811bcb931af3cd68dbbd3dd43f12fd0;hpb=13c24dd556a8b1998a29f9a88f2ceda5c5365590;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index acdc5e7638..af8912c0fd 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -45,7 +45,7 @@ #include using lyx::pos_type; -using lyx::par_type; +using lyx::pit_type; using lyx::textclass_type; using lyx::support::bformat; @@ -60,13 +60,14 @@ using std::string; namespace { -typedef std::pair PitPosPair; +typedef std::pair PitPosPair; 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); @@ -96,9 +97,9 @@ bool checkPastePossible(int index) } -pair +pair pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, - par_type pit, int pos, + pit_type pit, int pos, textclass_type tc, size_t cut_index, ErrorList & errorlist) { if (!checkPastePossible(cut_index)) @@ -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. @@ -168,7 +188,7 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, for (; lit != eit; ++lit) { switch (lit->inset->lyxCode()) { - case InsetOld::TABULAR_CODE: { + case InsetBase::TABULAR_CODE: { InsetTabular * it = static_cast(lit->inset); it->buffer(&buffer); break; @@ -182,24 +202,33 @@ 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 == par_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()); - par_type last_paste = pit + insertion.size() - 1; + // merge the first par of the insertion with the current par + mergeParagraph(buffer.params(), pars, pit); + } + + pit_type last_paste = pit + insertion.size() - 1; // Store the new cursor position. pit = last_paste; pos = pars[last_paste].size(); // Maybe some pasting. - if (did_split && last_paste + 1 != par_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()) { @@ -220,14 +249,14 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars, PitPosPair eraseSelectionHelper(BufferParams const & params, ParagraphList & pars, - par_type startpit, par_type endpit, + pit_type startpit, pit_type endpit, int startpos, int endpos, bool doclear) { - if (startpit == par_type(pars.size()) || + if (startpit == pit_type(pars.size()) || (startpos > pars[startpit].size())) return PitPosPair(endpit, endpos); - if (endpit == par_type(pars.size()) || + if (endpit == pit_type(pars.size()) || startpit == endpit) { endpos -= pars[startpit].erase(startpos, endpos); return PitPosPair(endpit, endpos); @@ -245,7 +274,7 @@ PitPosPair eraseSelectionHelper(BufferParams const & params, all_erased = false; // Loop through the deleted pars if any, erasing as needed - for (par_type pit = startpit + 1; pit != endpit;) { + for (pit_type pit = startpit + 1; pit != endpit;) { // "erase" the contents of the par pars[pit].erase(0, pars[pit].size()); if (!pars[pit].size()) { @@ -267,7 +296,7 @@ PitPosPair eraseSelectionHelper(BufferParams const & params, } #endif - if (startpit + 1 == par_type(pars.size())) + if (startpit + 1 == pit_type(pars.size())) return PitPosPair(endpit, endpos); if (doclear) { @@ -290,7 +319,7 @@ PitPosPair eraseSelectionHelper(BufferParams const & params, void copySelectionHelper(ParagraphList & pars, - par_type startpit, par_type endpit, + pit_type startpit, pit_type endpit, int start, int end, textclass_type tc) { BOOST_ASSERT(0 <= start && start <= pars[startpit].size()); @@ -315,7 +344,7 @@ void copySelectionHelper(ParagraphList & pars, PitPosPair cutSelectionHelper(BufferParams const & params, - ParagraphList & pars, par_type startpit, par_type endpit, + ParagraphList & pars, pit_type startpit, pit_type endpit, int startpos, int endpos, textclass_type tc, bool doclear) { copySelectionHelper(pars, startpit, endpit, startpos, endpos, tc); @@ -442,8 +471,8 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut) // make sure that the depth behind the selection are restored, too recordUndoSelection(cur); - par_type begpit = cur.selBegin().par(); - par_type endpit = cur.selEnd().par(); + pit_type begpit = cur.selBegin().pit(); + pit_type endpit = cur.selEnd().pit(); int endpos = cur.selEnd().pos(); @@ -466,16 +495,15 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut) 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 cur.pos() = endpos; - cur.par() = endpit; + cur.pit() = endpit; // need a valid cursor. (Lgb) cur.clearSelection(); - text->updateCounters(); + updateCounters(cur.buffer()); } if (cur.inMathed()) { @@ -506,13 +534,13 @@ void copySelection(LCursor & cur) // copy behind a space if there is one ParagraphList & pars = text->paragraphs(); pos_type pos = cur.selBegin().pos(); - par_type par = cur.selBegin().par(); + pit_type par = cur.selBegin().pit(); while (pos < pars[par].size() && pars[par].isLineSeparator(pos) - && (par != cur.selEnd().par() || pos < cur.selEnd().pos())) + && (par != cur.selEnd().pit() || pos < cur.selEnd().pos())) ++pos; - copySelectionHelper(pars, par, cur.selEnd().par(), + copySelectionHelper(pars, par, cur.selEnd().pit(), pos, cur.selEnd().pos(), cur.buffer().params().textclass); } @@ -550,7 +578,7 @@ void pasteSelection(LCursor & cur, size_t sel_index) recordUndo(cur); - par_type endpit; + pit_type endpit; PitPosPair ppp; ErrorList el; @@ -558,19 +586,17 @@ void pasteSelection(LCursor & cur, size_t sel_index) boost::tie(ppp, endpit) = pasteSelectionHelper(cur.buffer(), text->paragraphs(), - cur.par(), cur.pos(), + cur.pit(), cur.pos(), cur.buffer().params().textclass, sel_index, el); bufferErrors(cur.buffer(), el); cur.bv().showErrorList(_("Paste")); - text->redoParagraphs(cur.par(), endpit); - cur.clearSelection(); cur.resetAnchor(); text->setCursor(cur, ppp.first, ppp.second); cur.setSelection(); - text->updateCounters(); + updateCounters(cur.buffer()); } if (cur.inMathed()) { @@ -601,7 +627,7 @@ void replaceSelectionWithString(LCursor & cur, string const & str) // Get font setting before we cut pos_type pos = cur.selEnd().pos(); - Paragraph & par = text->getPar(cur.selEnd().par()); + Paragraph & par = text->getPar(cur.selEnd().pit()); LyXFont const font = par.getFontSettings(cur.buffer().params(), cur.selBegin().pos()); @@ -655,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 {