X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=ce6164d4ad09b2dbb251100e40eda5419d9e5aef;hb=4db3e641ed6765e005343010cb90ee8af26f8f99;hp=d346361a6de1ff6a64dbc89e3e906a52dc61cd39;hpb=db358a431549c90ccade9202bd8a98e8edab394a;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index d346361a6d..ce6164d4ad 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -110,7 +110,8 @@ struct PasteReturnValue { PasteReturnValue pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, - DocumentClassConstPtr oldDocClass, ErrorList & errorlist) + DocumentClassConstPtr oldDocClass, Buffer * tmpbuffer, + ErrorList & errorlist) { Buffer const & buffer = *cur.buffer(); pit_type pit = cur.pit(); @@ -352,15 +353,21 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, || (is_child && (branchlist.find(name) || buffer.masterBuffer()->params().branchlist().find(name)))) break; - // FIXME: add an option to add the branch to the master's BranchList. - docstring text = bformat( + if (tmpbuffer) { + // This is for a temporary buffer, so simply create the branch. + // Must not use lyx::dispatch(), since tmpbuffer has no view. + DispatchResult dr; + tmpbuffer->dispatch(FuncRequest(LFUN_BRANCH_ADD, name), dr); + } else { + docstring text = bformat( _("The pasted branch \"%1$s\" is undefined.\n" "Do you want to add it to the document's branch list?"), name); - if (frontend::Alert::prompt(_("Unknown branch"), + if (frontend::Alert::prompt(_("Unknown branch"), text, 0, 1, _("&Add"), _("&Don't Add")) != 0) - break; - lyx::dispatch(FuncRequest(LFUN_BRANCH_ADD, name)); + break; + lyx::dispatch(FuncRequest(LFUN_BRANCH_ADD, name)); + } // We need to update the list of branches. need_update = true; break; @@ -478,12 +485,17 @@ void putClipboard(ParagraphList const & paragraphs, // to be so, but the alternative is to construct a new one of these (with a // new temporary directory, etc) every time, and then to destroy it. So maybe // it's worth just keeping this one around. - static Buffer * buffer = theBufferList().newInternalBuffer( + static Buffer * staticbuffer = theBufferList().newInternalBuffer( FileName::tempName("clipboard.internal").absFileName()); // These two things only really need doing the first time. - buffer->setUnnamed(true); - buffer->inset().setBuffer(*buffer); + staticbuffer->setUnnamed(true); + staticbuffer->inset().setBuffer(*staticbuffer); + + // 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); // This needs doing every time. buffer->params().setDocumentClass(docclass); @@ -492,31 +504,41 @@ void putClipboard(ParagraphList const & paragraphs, // temporary Buffer, since it does a lot of things to fix them up. DocIterator dit = doc_iterator_begin(buffer, &buffer->inset()); ErrorList el; - pasteSelectionHelper(dit, paragraphs, docclass, el); - - // The Buffer is being used to export. This is necessary so that the - // updateMacros call will record the needed information. - MarkAsExporting mex(buffer); - - buffer->updateBuffer(Buffer::UpdateMaster, OutputUpdate); - buffer->updateMacros(); - buffer->updateMacroInstances(OutputUpdate); - - // LyX's own format - string lyx; - ostringstream oslyx; - if (buffer->write(oslyx)) - lyx = oslyx.str(); - - // XHTML format - odocstringstream oshtml; - OutputParams runparams(encodings.fromLyXName("utf8")); - buffer->writeLyXHTMLSource(oshtml, runparams, Buffer::FullSource); - - theClipboard().put(lyx, oshtml.str(), plaintext); + pasteSelectionHelper(dit, paragraphs, docclass, buffer, el); + + // 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. + buffer->params().html_math_output = BufferParams::MathML; + + // Make sure MarkAsExporting is deleted before buffer is + { + // The Buffer is being used to export. This is necessary so that the + // updateMacros call will record the needed information. + MarkAsExporting mex(buffer); + + buffer->updateBuffer(Buffer::UpdateMaster, OutputUpdate); + buffer->updateMacros(); + buffer->updateMacroInstances(OutputUpdate); + + // LyX's own format + string lyx; + ostringstream oslyx; + if (buffer->write(oslyx)) + lyx = oslyx.str(); + + // XHTML format + odocstringstream oshtml; + OutputParams runparams(encodings.fromLyXName("utf8")); + // We do not need to produce images, etc. + runparams.dryrun = true; + buffer->writeLyXHTMLSource(oshtml, runparams, Buffer::FullSource); + + theClipboard().put(lyx, oshtml.str(), plaintext); + } // Save that memory - buffer->paragraphs().clear(); + delete buffer; } @@ -541,9 +563,12 @@ void copySelectionHelper(Buffer const & buf, Text const & text, { ParagraphList const & pars = text.paragraphs(); - LASSERT(0 <= start && start <= pars[startpit].size(), /**/); - LASSERT(0 <= end && end <= pars[endpit].size(), /**/); - LASSERT(startpit != endpit || start <= end, /**/); + // In most of these cases, we can try to recover. + LASSERT(0 <= start, start = 0); + LASSERT(start <= pars[startpit].size(), start = pars[startpit].size()); + LASSERT(0 <= end, end = 0); + LASSERT(end <= pars[endpit].size(), end = pars[endpit].size()); + LASSERT(startpit != endpit || start <= end, return); // Clone the paragraphs within the selection. ParagraphList copy_pars(boost::next(pars.begin(), startpit), @@ -672,7 +697,7 @@ void switchBetweenClasses(DocumentClassConstPtr oldone, { errorlist.clear(); - LASSERT(!in.paragraphs().empty(), /**/); + LBUFERR(!in.paragraphs().empty()); if (oldone == newone) return; @@ -790,7 +815,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) if (cur.inTexted()) { Text * text = cur.text(); - LASSERT(text, /**/); + LBUFERR(text); saveSelection(cur); @@ -876,7 +901,8 @@ void copyInset(Cursor const & cur, Inset * inset, docstring const & plaintext) Paragraph par; BufferParams const & bp = cur.buffer()->params(); par.setLayout(bp.documentClass().plainLayout()); - par.insertInset(0, inset, Change(Change::UNCHANGED)); + Font font(inherit_font, bp.language); + par.insertInset(0, inset, font, Change(Change::UNCHANGED)); pars.push_back(par); theCuts.push(make_pair(pars, bp.documentClassPtr())); @@ -899,7 +925,7 @@ void copySelectionToStack(Cursor const & cur, CutStack & cutstack) if (cur.inTexted()) { Text * text = cur.text(); - LASSERT(text, /**/); + LBUFERR(text); // ok we have a selection. This is always between cur.selBegin() // and sel_end cursor @@ -1013,18 +1039,17 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, { if (cur.inTexted()) { Text * text = cur.text(); - LASSERT(text, /**/); + LBUFERR(text); PasteReturnValue prv = - pasteSelectionHelper(cur, parlist, docclass, errorList); - if (prv.needupdate) - cur.forceBufferUpdate(); + pasteSelectionHelper(cur, parlist, docclass, 0, errorList); + cur.forceBufferUpdate(); cur.clearSelection(); text->setCursor(cur, prv.par, prv.pos); } // mathed is handled in InsetMathNest/InsetMathGrid - LASSERT(!cur.inMathed(), /**/); + LATTEST(!cur.inMathed()); } @@ -1152,7 +1177,7 @@ void pasteSimpleText(Cursor & cur, bool asParagraphs) void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */, Clipboard::GraphicsType preferedType) { - LASSERT(theClipboard().hasGraphicsContents(preferedType), /**/); + LASSERT(theClipboard().hasGraphicsContents(preferedType), return); // get picture from clipboard FileName filename = theClipboard().getAsGraphics(cur, preferedType);