]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Merge remote-tracking branch 'features/properpaint' into 2.3.2-staging
[lyx.git] / src / CutAndPaste.cpp
index 05f9b90bca42f3430bed0512f019c195ddbf18ff..f611d59395b8b9681b5a0d20c89435f1c684c52e 100644 (file)
@@ -159,6 +159,38 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
                }
        }
 
+       // Prevent to paste uncodable characters in verbatim and ERT.
+       // The encoding is inherited from the context here.
+       docstring uncodable_content;
+       if (target_inset->getLayout().isPassThru() && cur.getEncoding()) {
+               odocstringstream res;
+               Encoding const * e = cur.getEncoding();
+               for (size_t i = 0; i != insertion.size(); ++i) {
+                       pos_type end = insertion[i].size();
+                       for (pos_type j = 0; j != end; ++j) {
+                               char_type const c = insertion[i].getChar(j);
+                               if (!e->encodable(c)) {
+                                       // do not track deletion
+                                       res.put(c);
+                                       insertion[i].eraseChar(j, false);
+                                       --end;
+                                       --j;
+                               }
+                       }
+               }
+               docstring const uncodable = res.str();
+               if (!uncodable.empty()) {
+                       if (uncodable.size() == 1)
+                               uncodable_content = bformat(_("The character \"%1$s\" is uncodable in this verbatim context "
+                                                     "and thus has not been pasted."),
+                                                   uncodable);
+                       else
+                               uncodable_content = bformat(_("The characters \"%1$s\" are uncodable in this verbatim context "
+                                                     "and thus have not been pasted."),
+                                                   uncodable);
+               }
+       }
+
        // set the paragraphs to plain layout if necessary
        DocumentClassConstPtr newDocClass = buffer.params().documentClassPtr();
        if (cur.inset().usePlainLayout()) {
@@ -194,6 +226,9 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
        // want to invalidate them.
        insertion.swap(in.paragraphs());
        cap::switchBetweenClasses(oldDocClass, newDocClass, in, errorlist);
+       // Do this here since switchBetweenClasses clears the errorlist
+       if (!uncodable_content.empty())
+               errorlist.push_back(ErrorItem(_("Uncodable content"), uncodable_content));
        insertion.swap(in.paragraphs());
 
        ParagraphList::iterator tmpbuf = insertion.begin();
@@ -773,7 +808,7 @@ void switchBetweenClasses(DocumentClassConstPtr oldone,
        for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
                InsetCode const code = it->lyxCode();
                if (code == FLEX_CODE) {
-                       // FIXME: Should we verify all InsetCollapsable?
+                       // FIXME: Should we verify all InsetCollapsible?
                        docstring const layoutName = it->layoutName();
                        docstring const & n = newone->insetLayout(layoutName).name();
                        bool const is_undefined = n.empty() ||