X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=c34fc5d230d1dd5094fee2acd0d4ad6ed7d37a29;hb=cadae068974fb25e97c5b2c38774a73ee23e92fc;hp=85c6b122f7ec214b6b4cbd2c8154ae41260f2b9f;hpb=897436efbb9bd641b61467d185a2dfae9839e575;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 85c6b122f7..c34fc5d230 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -18,6 +18,7 @@ #include "Buffer.h" #include "buffer_funcs.h" #include "BufferParams.h" +#include "BufferView.h" #include "Cursor.h" #include "debug.h" #include "ErrorList.h" @@ -388,12 +389,7 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars, } // do not copy text (also nested in insets) which is marked as deleted - // acceptChanges() is defined for Text rather than ParagraphList - // Thus we must wrap copy_pars into a Text object and cross our fingers - Text lt; - copy_pars.swap(lt.paragraphs()); - lt.acceptChanges(buf.params()); - copy_pars.swap(lt.paragraphs()); + acceptChanges(copy_pars, buf.params()); cutstack.push(make_pair(copy_pars, tc)); } @@ -418,6 +414,8 @@ docstring grabAndEraseSelection(Cursor & cur) void switchBetweenClasses(textclass_type c1, textclass_type c2, InsetText & in, ErrorList & errorlist) { + errorlist.clear(); + BOOST_ASSERT(!in.paragraphs().empty()); if (c1 == c2) return; @@ -428,7 +426,7 @@ void switchBetweenClasses(textclass_type c1, textclass_type c2, // layouts ParIterator end = par_iterator_end(in); for (ParIterator it = par_iterator_begin(in); it != end; ++it) { - string const name = it->layout()->name(); + docstring const name = it->layout()->name(); bool hasLayout = tclass2.hasLayout(name); if (hasLayout) @@ -440,7 +438,7 @@ void switchBetweenClasses(textclass_type c1, textclass_type c2, docstring const s = bformat( _("Layout had to be changed from\n%1$s to %2$s\n" "because of class conversion from\n%3$s to %4$s"), - from_utf8(name), from_utf8(it->layout()->name()), + name, it->layout()->name(), from_utf8(tclass1.name()), from_utf8(tclass2.name())); // To warn the user that something had to be done. errorlist.push_back(ErrorItem(_("Changed Layout"), s, @@ -529,6 +527,8 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) Text * text = cur.text(); BOOST_ASSERT(text); + saveSelection(cur); + // make sure that the depth behind the selection are restored, too recordUndoSelection(cur); pit_type begpit = cur.selBegin().pit(); @@ -570,7 +570,6 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) // need a valid cursor. (Lgb) cur.clearSelection(); updateLabels(cur.buffer()); - theSelection().haveSelection(false); // tell tabular that a recent copy happened dirtyTabularStack(false); @@ -607,6 +606,10 @@ void copySelectionToStack(Cursor & cur, CutStack & cutstack) if (!cur.selection()) return; + // copySelection can not yet handle the case of cross idx selection + if (cur.selBegin().idx() != cur.selEnd().idx()) + return; + if (cur.inTexted()) { Text * text = cur.text(); BOOST_ASSERT(text); @@ -624,6 +627,7 @@ void copySelectionToStack(Cursor & cur, CutStack & cutstack) copySelectionHelper(cur.buffer(), pars, par, cur.selEnd().pit(), pos, cur.selEnd().pos(), cur.buffer().params().textclass, cutstack); + dirtyTabularStack(false); } if (cur.inMathed()) { @@ -672,14 +676,17 @@ void copySelection(Cursor & cur, docstring const & plaintext) void saveSelection(Cursor & cur) { - LYXERR(Debug::ACTION) << BOOST_CURRENT_FUNCTION << ": `" - << to_utf8(cur.selectionAsString(true)) << "'." - << endl; - - if (cur.selection()) + // This function is called, not when a selection is formed, but when + // a selection is cleared. Therefore, multiple keyboard selection + // will not repeatively trigger this function (bug 3877). + if (cur.selection() + && cur.selBegin() == cur.bv().cursor().selBegin() + && cur.selEnd() == cur.bv().cursor().selEnd()) { + LYXERR(Debug::ACTION) << BOOST_CURRENT_FUNCTION << ": `" + << to_utf8(cur.selectionAsString(true)) << "'." + << endl; copySelectionToStack(cur, selectionBuffer); - // tell X whether we now have a valid selection - theSelection().haveSelection(cur.selection()); + } } @@ -718,7 +725,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, textclass, errorList); updateLabels(cur.buffer()); cur.clearSelection(); - text->setCursor(cur.top(), ppp.first, ppp.second); + text->setCursor(cur, ppp.first, ppp.second); } // mathed is handled in InsetMathNest/InsetMathGrid @@ -736,7 +743,6 @@ void pasteFromStack(Cursor & cur, ErrorList & errorList, size_t sel_index) pasteParagraphList(cur, theCuts[sel_index].first, theCuts[sel_index].second, errorList); cur.setSelection(); - saveSelection(cur); } @@ -815,7 +821,6 @@ void replaceSelectionWithString(Cursor & cur, docstring const & str, bool backwa cur.setSelection(selbeg, -int(str.length())); } else cur.setSelection(selbeg, str.length()); - saveSelection(cur); } @@ -832,6 +837,7 @@ void eraseSelection(Cursor & cur) 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()); @@ -852,7 +858,6 @@ void eraseSelection(Cursor & cur) } // need a valid cursor. (Lgb) cur.clearSelection(); - theSelection().haveSelection(false); } else { lyxerr << "can't erase this selection 1" << endl; }