X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=1f4633008774d4a66f043b933d9cc7fc8cb5b1c8;hb=02e59530b15d223c0978ecacfb7379f7bec986f4;hp=0fe6757a98659c3941295f79dac975666937a47d;hpb=06d72d6ca095dfa08c3c7aeb40a71ec4875b4d29;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 0fe6757a98..1f46330087 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,7 +485,7 @@ 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. - Buffer * staticbuffer = theBufferList().newInternalBuffer( + static Buffer * staticbuffer = theBufferList().newInternalBuffer( FileName::tempName("clipboard.internal").absFileName()); // These two things only really need doing the first time. @@ -497,33 +504,38 @@ 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); + 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; - // 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); + // 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 delete buffer; @@ -685,7 +697,7 @@ void switchBetweenClasses(DocumentClassConstPtr oldone, { errorlist.clear(); - LBUFERR(!in.paragraphs().empty(), from_ascii("")); + LBUFERR(!in.paragraphs().empty()); if (oldone == newone) return; @@ -803,7 +815,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) if (cur.inTexted()) { Text * text = cur.text(); - LBUFERR(text, _("Invalid cursor!")); + LBUFERR(text); saveSelection(cur); @@ -912,7 +924,7 @@ void copySelectionToStack(Cursor const & cur, CutStack & cutstack) if (cur.inTexted()) { Text * text = cur.text(); - LBUFERR(text, _("Invalid cursor!")); + LBUFERR(text); // ok we have a selection. This is always between cur.selBegin() // and sel_end cursor @@ -1026,12 +1038,11 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, { if (cur.inTexted()) { Text * text = cur.text(); - LBUFERR(text, _("Invalid cursor!")); + 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); }