From c5782ff4bbf0129b8ef95c92b33560d67e593024 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Mon, 19 Jan 2015 21:37:01 +0100 Subject: [PATCH] Fix pasting insets into math (bug #9302) 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 | 29 ++++++++++++++++++++++------- src/CutAndPaste.h | 2 +- src/mathed/InsetMathGrid.cpp | 3 ++- src/mathed/InsetMathNest.cpp | 3 ++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index f41ce36418..6333892cd6 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -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(copyToTempBuffer(theCuts[sel_index].first, docclass)); + if (!buffer) + return docstring(); + + return buffer->paragraphs().back().asString(AS_STR_INSETS | AS_STR_NEWLINES); } diff --git a/src/CutAndPaste.h b/src/CutAndPaste.h index 4149f1983b..c332e0b725 100644 --- a/src/CutAndPaste.h +++ b/src/CutAndPaste.h @@ -39,7 +39,7 @@ std::vector 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 diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index 16e519c11f..07f0b2ce79 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -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()) diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 26e23022c6..74ee70d141 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -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