X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=2450e0fc5cbfa5dc5eec958adf8341ecf0ac7fe4;hb=dfd786e6a0cb8d2d9548d1a0ef17eb47b0752e1b;hp=f657d57cbde9d0a876bc52c623142cb96964902f;hpb=cf333f5ab43c057d1433c490213bde1b9c4a681f;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index f657d57cbd..2450e0fc5c 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -1,4 +1,4 @@ -/* +/** * \file CutAndPaste.cpp * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. @@ -15,6 +15,7 @@ #include "CutAndPaste.h" +#include "BaseClassList.h" #include "Buffer.h" #include "buffer_funcs.h" #include "BufferParams.h" @@ -30,7 +31,6 @@ #include "LyXFunc.h" #include "LyXRC.h" #include "Text.h" -#include "TextClassList.h" #include "Paragraph.h" #include "paragraph_funcs.h" #include "ParagraphParameters.h" @@ -120,18 +120,18 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // Make a copy of the CaP paragraphs. ParagraphList insertion = parlist; - TextClassPtr const tc = buffer.params().getTextClassPtr(); + TextClassPtr const tc = buffer.params().textClassPtr(); // 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() == ERT_CODE || - pars[pit].inInset()->lyxCode() == LISTINGS_CODE)) { - for (ParagraphList::size_type i = 0; i < insertion.size(); ++i) { - for (pos_type j = 0; j < insertion[i].size(); ++j) { + Inset * inset = pars[pit].inInset(); + if (inset && (inset->lyxCode() == ERT_CODE || + inset->lyxCode() == LISTINGS_CODE)) { + for (size_t i = 0; i != insertion.size(); ++i) { + for (pos_type j = 0; j != insertion[i].size(); ++j) { if (insertion[i].isNewline(j)) { // do not track deletion of newline insertion[i].eraseChar(j, false); @@ -143,15 +143,16 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, } } - // If we are in an inset which returns forceDefaultParagraphs, - // set the paragraphs to default - if (cur.inset().forceDefaultParagraphs(cur.idx())) { + // set the paragraphs to empty layout if necessary + // note that we are doing this if the empty layout is + // supposed to be the default, not just if it is forced + if (cur.inset().useEmptyLayout()) { LayoutPtr const layout = - buffer.params().getTextClass().defaultLayout(); + buffer.params().textClass().emptyLayout(); ParagraphList::iterator const end = insertion.end(); for (ParagraphList::iterator par = insertion.begin(); par != end; ++par) - par->layout(layout); + par->setLayout(layout); } // Make sure there is no class difference. @@ -191,10 +192,10 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // Set the inset owner of this paragraph. tmpbuf->setInsetOwner(pars[pit].inInset()); for (pos_type i = 0; i < tmpbuf->size(); ++i) { - if (tmpbuf->isInset(i) && - !pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode())) - // do not track deletion of invalid insets - tmpbuf->eraseChar(i--, false); + // do not track deletion of invalid insets + if (Inset * inset = tmpbuf->getInset(i)) + if (!pars[pit].insetAllowed(inset->lyxCode())) + tmpbuf->eraseChar(i--, false); } tmpbuf->setChange(Change(buffer.params().trackChanges ? @@ -216,21 +217,10 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, ParIterator fend = par_iterator_end(in); for (; fpit != fend; ++fpit) { - InsetList::const_iterator lit = fpit->insetList().begin(); - InsetList::const_iterator eit = fpit->insetList().end(); - - for (; lit != eit; ++lit) { - switch (lit->inset->lyxCode()) { - case TABULAR_CODE: { - InsetTabular * it = static_cast(lit->inset); - it->buffer(&buffer); - break; - } - - default: - break; // nothing - } - } + InsetList::const_iterator it = fpit->insetList().begin(); + InsetList::const_iterator et = fpit->insetList().end(); + for (; it != et; ++it) + it->inset->setBuffer(const_cast(&buffer)); } insertion.swap(in.paragraphs()); @@ -309,7 +299,9 @@ PitPosPair eraseSelectionHelper(BufferParams const & params, // Separate handling of paragraph break: if (merge && pit != endpit && - (pit + 1 != endpit || pars[pit].hasSameLayout(pars[endpit]))) { + (pit + 1 != endpit + || pars[pit].hasSameLayout(pars[endpit]) + || pars[endpit].size() == endpos)) { if (pit + 1 == endpit) endpos += pars[pit].size(); mergeParagraph(params, pars, pit); @@ -400,35 +392,35 @@ docstring grabAndEraseSelection(Cursor & cur) } -void switchBetweenClasses(TextClassPtr const & c1, - TextClassPtr const & c2, InsetText & in, ErrorList & errorlist) +void switchBetweenClasses(TextClassPtr const & oldone, + TextClassPtr const & newone, InsetText & in, ErrorList & errorlist) { errorlist.clear(); BOOST_ASSERT(!in.paragraphs().empty()); - if (c1 == c2) + if (oldone == newone) return; - TextClass const & tclass1 = *c1; - TextClass const & tclass2 = *c2; + TextClass const & oldtc = *oldone; + TextClass const & newtc = *newone; // layouts ParIterator end = par_iterator_end(in); for (ParIterator it = par_iterator_begin(in); it != end; ++it) { docstring const name = it->layout()->name(); - bool hasLayout = tclass2.hasLayout(name); + bool hasLayout = newtc.hasLayout(name); if (hasLayout) - it->layout(tclass2[name]); + it->setLayout(newtc[name]); else - it->layout(tclass2.defaultLayout()); + it->setLayout(newtc.defaultLayout()); - if (!hasLayout && name != tclass1.defaultLayoutName()) { + if (!hasLayout && name != oldtc.defaultLayoutName()) { 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"), name, it->layout()->name(), - from_utf8(tclass1.name()), from_utf8(tclass2.name())); + from_utf8(oldtc.name()), from_utf8(newtc.name())); // To warn the user that something had to be done. errorlist.push_back(ErrorItem(_("Changed Layout"), s, it->id(), 0, @@ -445,18 +437,16 @@ void switchBetweenClasses(TextClassPtr const & c1, if (inset->lyxCode() != FLEX_CODE) // FIXME: Should we verify all InsetCollapsable? continue; - docstring const name = inset->name(); - InsetLayout const & il = tclass2.insetlayout(name); - inset->setLayout(il); - if (il.labelstring != from_utf8("UNDEFINED")) + inset->setLayout(newone); + if (!inset->undefined()) continue; - // The flex inset is undefined in tclass2 + // The flex inset is undefined in newtc docstring const s = bformat(_( "Flex inset %1$s is " "undefined because of class " "conversion from\n%2$s to %3$s"), - name, from_utf8(tclass1.name()), - from_utf8(tclass2.name())); + inset->name(), from_utf8(oldtc.name()), + from_utf8(newtc.name())); // To warn the user that something had to be done. errorlist.push_back(ErrorItem( _("Undefined flex inset"), @@ -528,7 +518,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) text->paragraphs(), begpit, endpit, cur.selBegin().pos(), endpos, - bp.getTextClassPtr(), theCuts); + bp.textClassPtr(), theCuts); // Stuff what we got on the clipboard. // Even if there is no selection. putClipboard(theCuts[0].first, theCuts[0].second, @@ -612,7 +602,7 @@ void copySelectionToStack(Cursor & cur, CutStack & cutstack) copySelectionHelper(cur.buffer(), pars, par, cur.selEnd().pit(), pos, cur.selEnd().pos(), - cur.buffer().params().getTextClassPtr(), cutstack); + cur.buffer().params().textClassPtr(), cutstack); dirtyTabularStack(false); } @@ -621,10 +611,10 @@ void copySelectionToStack(Cursor & cur, CutStack & cutstack) ParagraphList pars; Paragraph par; BufferParams const & bp = cur.buffer().params(); - par.layout(bp.getTextClass().defaultLayout()); + par.setLayout(bp.textClass().defaultLayout()); par.insert(0, grabSelection(cur), Font(), Change(Change::UNCHANGED)); pars.push_back(par); - cutstack.push(make_pair(pars, bp.getTextClassPtr())); + cutstack.push(make_pair(pars, bp.textClassPtr())); } } @@ -648,10 +638,10 @@ void copySelection(Cursor & cur, docstring const & plaintext) ParagraphList pars; Paragraph par; BufferParams const & bp = cur.buffer().params(); - par.layout(bp.getTextClass().defaultLayout()); + par.setLayout(bp.textClass().defaultLayout()); par.insert(0, plaintext, Font(), Change(Change::UNCHANGED)); pars.push_back(par); - theCuts.push(make_pair(pars, bp.getTextClassPtr())); + theCuts.push(make_pair(pars, bp.textClassPtr())); } else { copySelectionToStack(cur, theCuts); } @@ -712,8 +702,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, PitPosPair ppp; boost::tie(ppp, endpit) = - pasteSelectionHelper(cur, parlist, - textclass, errorList); + pasteSelectionHelper(cur, parlist, textclass, errorList); updateLabels(cur.buffer()); cur.clearSelection(); text->setCursor(cur, ppp.first, ppp.second); @@ -756,7 +745,7 @@ void pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs) if (buffer.readString(lyx)) { cur.recordUndo(); pasteParagraphList(cur, buffer.paragraphs(), - buffer.params().getTextClassPtr(), errorList); + buffer.params().textClassPtr(), errorList); cur.setSelection(); return; } @@ -775,7 +764,7 @@ void pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs) } -void pasteClipboardGraphics(Cursor & cur, ErrorList & errorList, +void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */, Clipboard::GraphicsType preferedType) { BOOST_ASSERT(theClipboard().hasGraphicsContents(preferedType));