X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=88fbbb6141900187a35658d9131614bb2bbb425f;hb=0049b4d3e46a36bd4d5ce07a54555cfba2295cfd;hp=71d700aadc000501d334894543d2de31e5ca8194;hpb=b08f5ad69ececc94791bdd42e9a2d878f7393494;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index 71d700aadc..88fbbb6141 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -48,14 +48,11 @@ #include -using lyx::docstring; -using lyx::pos_type; -using lyx::pit_type; -using lyx::textclass_type; -using lyx::support::bformat; +namespace lyx { -using lyx::frontend::Clipboard; +using support::bformat; +using frontend::Clipboard; using std::endl; using std::for_each; @@ -67,7 +64,7 @@ using std::string; namespace { -typedef std::pair PitPosPair; +typedef std::pair PitPosPair; typedef limited_stack > CutStack; @@ -78,26 +75,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, @@ -150,7 +127,7 @@ pasteSelectionHelper(LCursor & cur, ParagraphList const & parlist, for (pos_type j = 0; j < insertion[i].size(); ++j) { if (insertion[i].isNewline(j)) { // do not track deletion of newline - insertion[i].erase(j, false); + insertion[i].eraseChar(j, false); breakParagraphConservative( buffer.params(), insertion, i, j); @@ -177,13 +154,13 @@ pasteSelectionHelper(LCursor & cur, ParagraphList const & parlist, // since we store pointers to insets at some places and we don't // want to invalidate them. insertion.swap(in.paragraphs()); - lyx::cap::switchBetweenClasses(textclass, tc, in, errorlist); + cap::switchBetweenClasses(textclass, tc, in, errorlist); insertion.swap(in.paragraphs()); ParagraphList::iterator tmpbuf = insertion.begin(); int depth_delta = pars[pit].params().depth() - tmpbuf->params().depth(); - Paragraph::depth_type max_depth = pars[pit].getMaxDepthAfter(); + depth_type max_depth = pars[pit].getMaxDepthAfter(); for (; tmpbuf != insertion.end(); ++tmpbuf) { // If we have a negative jump so that the depth would @@ -210,11 +187,11 @@ pasteSelectionHelper(LCursor & cur, ParagraphList const & parlist, if (tmpbuf->getChar(i) == Paragraph::META_INSET && !pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode())) // do not track deletion of invalid insets - tmpbuf->erase(i--, false); + 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(); @@ -310,9 +287,8 @@ 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); + if (endpit == pit_type(pars.size()) || startpit == endpit) { + endpos -= pars[startpit].eraseChars(startpos, endpos, params.trackChanges); return PitPosPair(endpit, endpos); } @@ -322,13 +298,12 @@ PitPosPair eraseSelectionHelper(BufferParams const & params, 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); + pars[pit].isInserted(pars[pit].size()); 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); + pars[pit].eraseChars(left, right, false); // Separate handling of para break: if (merge && pit != endpit && (pit + 1 != endpit || pars[pit].hasSameLayout(pars[pit + 1]))) { @@ -362,15 +337,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()); + // 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); + // again, do not track deletion + front.eraseChars(0, start, false); theCuts.push(make_pair(paragraphs, tc)); } @@ -380,14 +369,13 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars, -namespace lyx { 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; } @@ -418,8 +406,8 @@ 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"), - lyx::from_utf8(name), lyx::from_utf8(it->layout()->name()), - lyx::from_utf8(tclass1.name()), lyx::from_utf8(tclass2.name())); + from_utf8(name), from_utf8(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, it->id(), 0, @@ -443,8 +431,8 @@ void switchBetweenClasses(textclass_type c1, textclass_type c2, "Character style %1$s is " "undefined because of class " "conversion from\n%2$s to %3$s"), - lyx::from_utf8(name), lyx::from_utf8(tclass1.name()), - lyx::from_utf8(tclass2.name())); + from_utf8(name), from_utf8(tclass1.name()), + from_utf8(tclass2.name())); // To warn the user that something had to be done. errorlist.push_back(ErrorItem( _("Undefined character style"), @@ -476,7 +464,7 @@ std::vector const availableSelections(Buffer const & buffer) asciiSel += pit->asString(buffer, false); if (asciiSel.size() > 25) { asciiSel.replace(22, docstring::npos, - lyx::from_ascii("...")); + from_ascii("...")); break; } } @@ -488,7 +476,7 @@ std::vector const availableSelections(Buffer const & buffer) } -lyx::size_type numberOfSelections() +size_type numberOfSelections() { return theCuts.size(); } @@ -606,12 +594,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 @@ -634,8 +621,6 @@ void pasteParagraphList(LCursor & cur, ParagraphList const & parlist, LyXText * text = cur.text(); BOOST_ASSERT(text); - recordUndo(cur); - pit_type endpit; PitPosPair ppp; @@ -658,6 +643,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(); @@ -688,7 +674,7 @@ void replaceSelectionWithString(LCursor & cur, string const & str, bool backward // select the replacement if (backwards) { selbeg.pos() += str.length(); - cur.setSelection(selbeg, -str.length()); + cur.setSelection(selbeg, -int(str.length())); } else cur.setSelection(selbeg, str.length()); } @@ -752,10 +738,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 @@ -774,7 +760,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"); } } @@ -782,7 +768,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) @@ -795,7 +781,7 @@ string grabSelection(LCursor const & cur) } } } else { - data = "unknown selection 2"; + data = from_ascii("unknown selection 2"); } return data; } @@ -814,4 +800,5 @@ bool tabularStackDirty() } // namespace cap + } // namespace lyx