X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=ecb4cbcafbaddca26dd6d71779a35775eea70975;hb=4df7d8ab1ae443119057562fb76c2e438c053eef;hp=0d36390baea21dda2fce2df9dfd807a133b1347a;hpb=6192345f60bd77c9223c1649956d6814d48ca26b;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 0d36390bae..ecb4cbcafb 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -41,6 +41,7 @@ #include "insets/InsetCommand.h" #include "insets/InsetGraphics.h" #include "insets/InsetGraphicsParams.h" +#include "insets/InsetInclude.h" #include "insets/InsetTabular.h" #include "mathed/MathData.h" @@ -216,17 +217,16 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, } // Prepare the paragraphs and insets for insertion. - // A couple of insets store buffer references so need updating. insertion.swap(in.paragraphs()); InsetIterator const i_end = inset_iterator_end(in); - for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) { - + // Even though this will also be done later, it has to be done here + // since, e.g., InsetLabel::updateCommand() is going to try to access + // the buffer() member. it->setBuffer(const_cast(buffer)); - switch (it->lyxCode()) { - + case LABEL_CODE: { // check for duplicates InsetCommand & lab = static_cast(*it); @@ -246,6 +246,12 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, break; } + case INCLUDE_CODE: { + InsetInclude & inc = static_cast(*it); + inc.updateCommand(); + break; + } + case BIBITEM_CODE: { // check for duplicates InsetCommand & bib = static_cast(*it); @@ -292,16 +298,19 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // merge the first par of the insertion with the current par mergeParagraph(buffer.params(), pars, pit); } - //FIXME: We should call setBuffer() on each inserted paragraph. - // instead, we call setBuffer() for the main inset at the beginning - // of updateLabels() - - pit_type last_paste = pit + insertion.size() - 1; // Store the new cursor position. + pit_type last_paste = pit + insertion.size() - 1; + pit_type startpit = pit; pit = last_paste; pos = pars[last_paste].size(); + // FIXME Should we do it here, or should we let updateLabels() do it? + // Set paragraph buffers. It's important to do this right away + // before something calls Inset::buffer() and causes a crash. + for (pit_type p = startpit; p <= pit; ++p) + pars[p].setBuffer(const_cast(buffer)); + // Join (conditionally) last pasted paragraph with next one, i.e., // the tail of the spliced document paragraph if (!empty && last_paste + 1 != pit_type(pars.size())) { @@ -422,14 +431,16 @@ void copySelectionHelper(Buffer const & buf, ParagraphList const & pars, // 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() == ERT_CODE || it->ownerCode() == LISTINGS_CODE) { + if (it->ownerCode() == ERT_CODE || it->ownerCode() == LISTINGS_CODE) it->changeLanguage(buf.params(), latex_language, buf.language()); - } + it->setInsetOwner(0); } - // do not copy text (also nested in insets) which is marked as deleted - acceptChanges(copy_pars, buf.params()); + // do not copy text (also nested in insets) which is marked as deleted, + // unless the whole selection was deleted + if (!isFullyDeleted(copy_pars)) + acceptChanges(copy_pars, buf.params()); DocumentClass * d = const_cast(dc); cutstack.push(make_pair(copy_pars, d)); @@ -731,7 +742,11 @@ void copySelectionToStack(Cursor const & cur, CutStack & cutstack) copySelectionHelper(*cur.buffer(), pars, par, cur.selEnd().pit(), pos, cur.selEnd().pos(), cur.buffer()->params().documentClassPtr(), cutstack); - dirtyTabularStack(false); + + // Reset the dirty_tabular_stack_ flag only when something + // is copied to the clipboard (not to the selectionBuffer). + if (&cutstack == &theCuts) + dirtyTabularStack(false); } if (cur.inMathed()) {