X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=c2ddae5c60dfcd7720ca3933fb553b34cf921502;hb=28902af06012253c7b5eb80e179a352aac17d6a5;hp=ca094a33e0bb260668b51bb1af69eda2dd87976b;hpb=51ed92d70c5020ee6215cceb4404b334d5724e2d;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index ca094a33e0..c2ddae5c60 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -6,6 +6,7 @@ * \author Jürgen Vigna * \author Lars Gullik Bjønnes * \author Alfredo Braunstein + * \author Michael Gerz * * Full author contact details are available in file CREDITS. */ @@ -75,26 +76,6 @@ CutStack theCuts(10); // when we (hopefully) have a one-for-all paste mechanism. bool dirty_tabular_stack_; -class resetParagraph : public std::unary_function { -public: - resetParagraph(Buffer const & b) : buffer_(b) {} - void operator()(Paragraph & p) const { - // FIXME: change tracking (MG) - // set p's text to INSERTED in CT mode; clear CT info otherwise - - // ERT paragraphs have the Language latex_language. - // This is invalid outside of ERT, so we need to change it - // to the buffer language. - if (p.ownerCode() == InsetBase::ERT_CODE) { - p.changeLanguage(buffer_.params(), latex_language, - buffer_.getLanguage()); - } - p.setInsetOwner(0); - } -private: - Buffer const & buffer_; -}; - void region(CursorSlice const & i1, CursorSlice const & i2, InsetBase::row_type & r1, InsetBase::row_type & r2, @@ -210,8 +191,8 @@ pasteSelectionHelper(LCursor & cur, ParagraphList const & parlist, tmpbuf->eraseChar(i--, false); } - // FIXME: Change tracking (MG) - // set tmpbuf's text to INSERTED in CT mode; clear CT info otherwise + tmpbuf->setChange(Change(buffer.params().trackChanges ? + Change::INSERTED : Change::UNCHANGED)); } bool const empty = pars[pit].empty(); @@ -229,8 +210,8 @@ pasteSelectionHelper(LCursor & cur, ParagraphList const & parlist, ParIterator fend = par_iterator_end(in); for (; fpit != fend; ++fpit) { - InsetList::iterator lit = fpit->insetlist.begin(); - InsetList::iterator eit = fpit->insetlist.end(); + InsetList::const_iterator lit = fpit->insetlist.begin(); + InsetList::const_iterator eit = fpit->insetlist.end(); for (; lit != eit; ++lit) { switch (lit->inset->lyxCode()) { @@ -307,28 +288,23 @@ PitPosPair eraseSelectionHelper(BufferParams const & params, return PitPosPair(endpit, endpos); // Start and end is inside same paragraph - if (endpit == pit_type(pars.size()) || - startpit == endpit) { - endpos -= pars[startpit].erase(startpos, endpos, false); + if (endpit == pit_type(pars.size()) || startpit == endpit) { + endpos -= pars[startpit].eraseChars(startpos, endpos, params.trackChanges); return PitPosPair(endpit, endpos); } - // A paragraph break has to be physically removed by merging, but - // only if either (1) change tracking is off, or (2) the para break - // is "blue" for (pit_type pit = startpit; pit != endpit + 1;) { - // FIXME: Change tracking (MG) - bool const merge = !params.trackChanges || - pars[pit].lookupChange(pars[pit].size()) == - Change(Change::INSERTED); - pos_type const left = ( pit == startpit ? startpos : 0 ); - pos_type const right = ( pit == endpit ? endpos : - pars[pit].size() + 1 ); - // Logical erase only: - pars[pit].erase(left, right, false); - // Separate handling of para break: + pos_type const left = (pit == startpit ? startpos : 0); + pos_type const right = (pit == endpit ? endpos : pars[pit].size() + 1); + + bool const merge = pars[pit].isMergedOnEndOfParDeletion(params.trackChanges); + + // Logically erase only, including the end-of-paragraph character + pars[pit].eraseChars(left, right, params.trackChanges); + + // Separate handling of paragraph break: if (merge && pit != endpit && - (pit + 1 != endpit || pars[pit].hasSameLayout(pars[pit + 1]))) { + (pit + 1 != endpit || pars[pit].hasSameLayout(pars[pit + 1]))) { pos_type const thissize = pars[pit].size(); if (doclear) pars[pit + 1].stripLeadingSpaces(); @@ -359,15 +335,29 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars, ParagraphList paragraphs(boost::next(pars.begin(), startpit), boost::next(pars.begin(), endpit + 1)); - for_each(paragraphs.begin(), paragraphs.end(), resetParagraph(buf)); + ParagraphList::iterator it = paragraphs.begin(); + ParagraphList::iterator it_end = paragraphs.end(); + + for (; it != it_end; it++) { + // ERT paragraphs have the Language latex_language. + // This is invalid outside of ERT, so we need to change it + // to the buffer language. + if (it->ownerCode() == InsetBase::ERT_CODE) { + it->changeLanguage(buf.params(), latex_language, + buf.getLanguage()); + } + it->setInsetOwner(0); + } // Cut out the end of the last paragraph. Paragraph & back = paragraphs.back(); - back.erase(end, back.size(), false); + // do not track deletion here; it is an internal action not visible to the user + back.eraseChars(end, back.size(), false); // Cut out the begin of the first paragraph Paragraph & front = paragraphs.front(); - front.erase(0, start, false); + // again, do not track deletion + front.eraseChars(0, start, false); theCuts.push(make_pair(paragraphs, tc)); } @@ -379,11 +369,11 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars, namespace cap { -string grabAndEraseSelection(LCursor & cur) +docstring grabAndEraseSelection(LCursor & cur) { if (!cur.selection()) - return string(); - string res = grabSelection(cur); + return docstring(); + docstring res = grabSelection(cur); eraseSelection(cur); return res; } @@ -602,12 +592,11 @@ void copySelection(LCursor & cur) if (cur.inMathed()) { //lyxerr << "copySelection in mathed" << endl; ParagraphList pars; - pars.push_back(Paragraph()); + Paragraph par; BufferParams const & bp = cur.buffer().params(); - pars.back().layout(bp.getLyXTextClass().defaultLayout()); - for_each(pars.begin(), pars.end(), resetParagraph(cur.buffer())); - // FIXME: change tracking (MG) - pars.back().insert(0, grabSelection(cur), LyXFont(), Change(Change::UNCHANGED)); + par.layout(bp.getLyXTextClass().defaultLayout()); + par.insert(0, grabSelection(cur), LyXFont(), Change(Change::UNCHANGED)); + pars.push_back(par); theCuts.push(make_pair(pars, bp.textclass)); } // tell tabular that a recent copy happened @@ -630,8 +619,6 @@ void pasteParagraphList(LCursor & cur, ParagraphList const & parlist, LyXText * text = cur.text(); BOOST_ASSERT(text); - recordUndo(cur); - pit_type endpit; PitPosPair ppp; @@ -654,6 +641,7 @@ void pasteSelection(LCursor & cur, ErrorList & errorList, size_t sel_index) if (!checkPastePossible(sel_index)) return; + recordUndo(cur); pasteParagraphList(cur, theCuts[sel_index].first, theCuts[sel_index].second, errorList); cur.setSelection(); @@ -748,10 +736,10 @@ void selClearOrDel(LCursor & cur) } -string grabSelection(LCursor const & cur) +docstring grabSelection(LCursor const & cur) { if (!cur.selection()) - return string(); + return docstring(); // FIXME: What is wrong with the following? #if 0 @@ -770,7 +758,7 @@ string grabSelection(LCursor const & cur) MathArray::const_iterator it = i1.cell().begin(); return asString(MathArray(it + i1.pos(), it + i2.pos())); } else { - return "unknown selection 1"; + return from_ascii("unknown selection 1"); } } @@ -778,7 +766,7 @@ string grabSelection(LCursor const & cur) InsetBase::col_type c1, c2; region(i1, i2, r1, r2, c1, c2); - string data; + docstring data; if (i1.inset().asInsetMath()) { for (InsetBase::row_type row = r1; row <= r2; ++row) { if (row > r1) @@ -791,7 +779,7 @@ string grabSelection(LCursor const & cur) } } } else { - data = "unknown selection 2"; + data = from_ascii("unknown selection 2"); } return data; }