]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Properly restore the file encoding after a LaTeX environment with local scope.
[lyx.git] / src / CutAndPaste.cpp
index f92d74dca222c95c6352030a787097a05780e5f6..91d5321325465bea0c442fd73947d7a0597f2145 100644 (file)
@@ -456,20 +456,33 @@ void copySelectionHelper(Buffer const & buf, ParagraphList const & pars,
        ParagraphList::iterator it_end = copy_pars.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() == ERT_CODE || it->ownerCode() == LISTINGS_CODE)
-                       it->changeLanguage(buf.params(), latex_language, buf.language());
-
-               it->setInsetOwner(0);
+               // Since we have a copy of the paragraphs, the insets
+               // do not have a proper buffer reference. It makes
+               // sense to add them temporarily, because the
+               // operations below depend on that (acceptChanges included).
+               it->setBuffer(const_cast<Buffer &>(buf));
+               // PassThru paragraphs have the Language
+               // latex_language. This is invalid for others, so we
+               // need to change it to the buffer language.
+               if (it->inInset().getLayout().isPassThru())
+                       it->changeLanguage(buf.params(), 
+                                          latex_language, buf.language());
        }
 
-       // do not copy text (also nested in insets) which is marked as deleted,
-       // unless the whole selection was deleted
+       // 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());
 
+
+       // do some final cleanup now, to make sure that the paragraphs
+       // are not linked to something else.
+       it = copy_pars.begin();
+       for (; it != it_end; it++) {
+               it->setBuffer(*static_cast<Buffer *>(0));
+               it->setInsetOwner(0);
+       }
+
        DocumentClass * d = const_cast<DocumentClass *>(dc);
        cutstack.push(make_pair(copy_pars, d));
 }
@@ -576,20 +589,17 @@ void switchBetweenClasses(DocumentClass const * const oldone,
        // character styles
        InsetIterator const i_end = inset_iterator_end(in);
        for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
-               InsetCollapsable * inset = it->asInsetCollapsable();
-               if (!inset)
-                       continue;
-               if (inset->lyxCode() != FLEX_CODE)
+               if (it->lyxCode() != FLEX_CODE)
                        // FIXME: Should we verify all InsetCollapsable?
                        continue;
-               if (!inset->undefined())
+               if (!it->undefined())
                        continue;
                // 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"),
-                       inset->name(), from_utf8(oldtc.name()),
+                       it->name(), from_utf8(oldtc.name()),
                        from_utf8(newtc.name()));
                // To warn the user that something had to be done.
                errorlist.push_back(ErrorItem(