]> git.lyx.org Git - features.git/commitdiff
Fix pasting insets into math (bug #9302)
authorGeorg Baum <baum@lyx.org>
Mon, 19 Jan 2015 20:37:01 +0000 (21:37 +0100)
committerGeorg Baum <baum@lyx.org>
Mon, 19 Jan 2015 20:37:01 +0000 (21:37 +0100)
The problem was that the conversion to plain text (which is used as an
intermediate step) requires for some insets a valid buffer pointer, but
insets in the cut stack do not have one. Now we use the same temp buffer
business as for copying to the external clipboard.

src/CutAndPaste.cpp
src/CutAndPaste.h
src/mathed/InsetMathGrid.cpp
src/mathed/InsetMathNest.cpp

index f41ce3641830e5d2be38e554440ee7737410e5ec..6333892cd6cc6e2d1bfe6729a50657f46cc56fab 100644 (file)
@@ -480,8 +480,7 @@ PitPosPair eraseSelectionHelper(BufferParams const & params,
 }
 
 
-void putClipboard(ParagraphList const & paragraphs, 
-       DocumentClassConstPtr docclass, docstring const & plaintext)
+Buffer * copyToTempBuffer(ParagraphList const & paragraphs, DocumentClassConstPtr docclass)
 {
        // This used to need to be static to avoid a memory leak. It no longer needs
        // to be so, but the alternative is to construct a new one of these (with a
@@ -500,7 +499,7 @@ void putClipboard(ParagraphList const & paragraphs,
        // Use a clone for the complicated stuff so that we do not need to clean
        // up in order to avoid a crash.
        Buffer * buffer = staticbuffer->cloneBufferOnly();
-       LASSERT(buffer, return);
+       LASSERT(buffer, return 0);
 
        // This needs doing every time.
        // Since setDocumentClass() causes deletion of the old document class
@@ -522,6 +521,17 @@ void putClipboard(ParagraphList const & paragraphs,
        ErrorList el;
        pasteSelectionHelper(dit, paragraphs, docclass, buffer, el);
 
+       return buffer;
+}
+
+
+void putClipboard(ParagraphList const & paragraphs, 
+       DocumentClassConstPtr docclass, docstring const & plaintext)
+{
+       Buffer * buffer = copyToTempBuffer(paragraphs, docclass);
+       if (!buffer) // already asserted in copyToTempBuffer()
+               return;
+
        // We don't want to produce images that are not used. Therefore,
        // output formulas as MathML. Even if this is not understood by all
        // applications, the number that can parse it should go up in the future.
@@ -1051,11 +1061,16 @@ void clearCutStack()
 }
 
 
-docstring selection(size_t sel_index)
+docstring selection(size_t sel_index, DocumentClassConstPtr docclass)
 {
-       return sel_index < theCuts.size()
-               ? theCuts[sel_index].first.back().asString(AS_STR_INSETS | AS_STR_NEWLINES)
-               : docstring();
+       if (sel_index >= theCuts.size())
+               return docstring();
+
+       boost::scoped_ptr<Buffer> buffer(copyToTempBuffer(theCuts[sel_index].first, docclass));
+       if (!buffer)
+               return docstring();
+
+       return buffer->paragraphs().back().asString(AS_STR_INSETS | AS_STR_NEWLINES);
 }
 
 
index 4149f1983b135a0465d72e6e6a7041513f0baaa7..c332e0b725aa6572a3976fd6607d67d7b764a3e0 100644 (file)
@@ -39,7 +39,7 @@ std::vector<docstring> availableSelections(Buffer const *);
 /// Get the number of available elements in the cut buffer.
 size_type numberOfSelections();
 /// Get the sel_index-th element of the cut buffer in plain text format.
-docstring selection(size_t sel_index);
+docstring selection(size_t sel_index, DocumentClassConstPtr docclass);
 
 /**
  * Replace using the font of the first selected character and select
index 16e519c11f42544fbdae3e64b479221c9fb3af9b..07f0b2ce79d1efc099b57bfb129228addad6bae3 100644 (file)
@@ -20,6 +20,7 @@
 #include "MetricsInfo.h"
 
 #include "Buffer.h"
+#include "BufferParams.h"
 #include "BufferView.h"
 #include "CutAndPaste.h"
 #include "FuncStatus.h"
@@ -1339,7 +1340,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd)
                        idocstringstream is(cmd.argument());
                        int n = 0;
                        is >> n;
-                       topaste = cap::selection(n);
+                       topaste = cap::selection(n, buffer().params().documentClassPtr());
                }
                InsetMathGrid grid(buffer_, 1, 1);
                if (!topaste.empty())
index 26e23022c6ec3e44502271a2aa0b74669d22cc26..74ee70d141097a11dafded8494dfcb77e0090733 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "Bidi.h"
 #include "Buffer.h"
+#include "BufferParams.h"
 #include "BufferView.h"
 #include "CoordCache.h"
 #include "Cursor.h"
@@ -583,7 +584,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
                        size_t n = 0;
                        idocstringstream is(cmd.argument());
                        is >> n;
-                       topaste = cap::selection(n);
+                       topaste = cap::selection(n, buffer().params().documentClassPtr());
                }
                cur.niceInsert(topaste, parseflg, false);
                cur.clearSelection(); // bug 393