X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=c8c084a7aac39ff08d44ca21dfeb1c3a0bb6e573;hb=b9e29418471d0d275650c52f976da300f4f42501;hp=0f269b27e49e7423238fed5d614f4cb6f62e08d6;hpb=e4dba53232bc71d5a577466e7fb4a3251944d9d8;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 0f269b27e4..c8c084a7aa 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -125,10 +125,23 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, if (parlist.empty()) return PasteReturnValue(pit, pos, need_update); + // Check whether we paste into an inset that does not + // produce output (needed for label duplicate check) + bool in_active_inset = cur.paragraph().inInset().producesOutput(); + if (in_active_inset) { + for (size_type sl = 0 ; sl < cur.depth() ; ++sl) { + Paragraph const & outer_par = cur[sl].paragraph(); + if (!outer_par.inInset().producesOutput()) { + in_active_inset = false; + break; + } + } + } + InsetText * target_inset = cur.inset().asInsetText(); if (!target_inset) { InsetTabular * it = cur.inset().asInsetTabular(); - target_inset = it ? it->cell(cur.idx())->asInsetText() : 0; + target_inset = it ? it->cell(cur.idx())->asInsetText() : nullptr; } LASSERT(target_inset, return PasteReturnValue(pit, pos, need_update)); @@ -209,23 +222,19 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, bool forcePlainLayout = target_inset->forcePlainLayout(); Layout const & plainLayout = newDocClass->plainLayout(); Layout const & defaultLayout = newDocClass->defaultLayout(); - ParagraphList::iterator const end = insertion.end(); - ParagraphList::iterator par = insertion.begin(); - for (; par != end; ++par) { - Layout const & parLayout = par->layout(); + for (auto & par : insertion) { + Layout const & parLayout = par.layout(); if (forcePlainLayout || parLayout == defaultLayout) - par->setLayout(plainLayout); + par.setLayout(plainLayout); } } else { // check if we need to reset from plain layout Layout const & defaultLayout = newDocClass->defaultLayout(); Layout const & plainLayout = newDocClass->plainLayout(); - ParagraphList::iterator const end = insertion.end(); - ParagraphList::iterator par = insertion.begin(); - for (; par != end; ++par) { - Layout const & parLayout = par->layout(); + for (auto & par : insertion) { + Layout const & parLayout = par.layout(); if (parLayout == plainLayout) - par->setLayout(defaultLayout); + par.setLayout(defaultLayout); } } @@ -274,8 +283,9 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, tmpbuf->eraseChar(i--, false); } - tmpbuf->setChange(Change(buffer.params().track_changes ? - Change::INSERTED : Change::UNCHANGED)); + if (lyxrc.ct_markup_copied) + tmpbuf->setChange(Change(buffer.params().track_changes ? + Change::INSERTED : Change::UNCHANGED)); } bool const empty = pars[pit].empty(); @@ -291,8 +301,7 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, InsetIterator const i_end = inset_iterator_end(in); for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) { // Even though this will also be done later, it has to be done here - // since some inset might going to try to access - // the buffer() member. + // since some inset might try to access the buffer() member. it->setBuffer(const_cast(buffer)); switch (it->lyxCode()) { @@ -305,7 +314,7 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, continue; InsetLabel * lab = labels[i]; docstring const oldname = lab->getParam("name"); - lab->updateLabel(oldname); + lab->updateLabel(oldname, in_active_inset); // We need to update the buffer reference cache. need_update = true; docstring const newname = lab->getParam("name"); @@ -336,7 +345,7 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, // check for duplicates InsetLabel & lab = static_cast(*it); docstring const oldname = lab.getParam("name"); - lab.updateLabel(oldname); + lab.updateLabel(oldname, in_active_inset); // We need to update the buffer reference cache. need_update = true; docstring const newname = lab.getParam("name"); @@ -567,7 +576,7 @@ Buffer * copyToTempBuffer(ParagraphList const & paragraphs, DocumentClassConstPt // 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 0); + LASSERT(buffer, return nullptr); // This needs doing every time. // Since setDocumentClass() causes deletion of the old document class @@ -594,7 +603,8 @@ Buffer * copyToTempBuffer(ParagraphList const & paragraphs, DocumentClassConstPt void putClipboard(ParagraphList const & paragraphs, - DocumentClassConstPtr docclass, docstring const & plaintext) + DocumentClassConstPtr docclass, docstring const & plaintext, + BufferParams const bp) { Buffer * buffer = copyToTempBuffer(paragraphs, docclass); if (!buffer) // already asserted in copyToTempBuffer() @@ -605,6 +615,12 @@ void putClipboard(ParagraphList const & paragraphs, // applications, the number that can parse it should go up in the future. buffer->params().html_math_output = BufferParams::MathML; + if (lyxrc.ct_markup_copied) { + // Copy authors to the params. We need those pointers. + for (Author const & a : bp.authors()) + buffer->params().authors().record(a); + } + // Make sure MarkAsExporting is deleted before buffer is { // The Buffer is being used to export. This is necessary so that the @@ -680,37 +696,35 @@ void copySelectionHelper(Buffer const & buf, Text const & text, Paragraph & front = copy_pars.front(); front.eraseChars(0, start, false); - ParagraphList::iterator it = copy_pars.begin(); - ParagraphList::iterator it_end = copy_pars.end(); - - for (; it != it_end; ++it) { + for (auto & par : copy_pars) { // Since we have a copy of the paragraphs, the insets // do not have a proper buffer reference. It makes // sense to add them temporarily, because the // operations below depend on that (acceptChanges included). - it->setInsetBuffers(const_cast(buf)); + par.setInsetBuffers(const_cast(buf)); // PassThru paragraphs have the Language // latex_language. This is invalid for others, so we // need to change it to the buffer language. - if (it->isPassThru()) - it->changeLanguage(buf.params(), + if (par.isPassThru()) + par.changeLanguage(buf.params(), latex_language, buf.language()); } // do not copy text (also nested in insets) which is marked as // deleted, unless the whole selection was deleted - if (!isFullyDeleted(copy_pars)) - acceptChanges(copy_pars, buf.params()); - else - rejectChanges(copy_pars, buf.params()); + if (!lyxrc.ct_markup_copied) { + if (!isFullyDeleted(copy_pars)) + acceptChanges(copy_pars, buf.params()); + else + rejectChanges(copy_pars, buf.params()); + } // do some final cleanup now, to make sure that the paragraphs // are not linked to something else. - it = copy_pars.begin(); - for (; it != it_end; ++it) { - it->resetBuffer(); - it->setInsetOwner(0); + for (auto & par : copy_pars) { + par.resetBuffer(); + par.setInsetOwner(nullptr); } cutstack.push(make_pair(copy_pars, dc)); @@ -872,17 +886,11 @@ vector availableSelections(Buffer const * buf) if (!buf) return selList; - CutStack::const_iterator cit = theCuts.begin(); - CutStack::const_iterator end = theCuts.end(); - for (; cit != end; ++cit) { - // we do not use cit-> here because gcc 2.9x does not - // like it (JMarc) - ParagraphList const & pars = (*cit).first; + for (auto const & cut : theCuts) { + ParagraphList const & pars = cut.first; docstring textSel; - ParagraphList::const_iterator pit = pars.begin(); - ParagraphList::const_iterator pend = pars.end(); - for (; pit != pend; ++pit) { - Paragraph par(*pit, 0, 46); + for (auto const & para : pars) { + Paragraph par(para, 0, 46); // adapt paragraph to current buffer. par.setInsetBuffers(const_cast(*buf)); textSel += par.asString(AS_STR_INSETS); @@ -938,7 +946,7 @@ void cutSelectionHelper(Cursor & cur, CutStack & cuts, bool realcut, bool putcli // Even if there is no selection. if (putclip) putClipboard(cuts[0].first, cuts[0].second, - cur.selectionAsString(true)); + cur.selectionAsString(true, true), bp); } if (begpit != endpit) @@ -999,7 +1007,7 @@ void cutSelectionToTemp(Cursor & cur, bool realcut) void copySelection(Cursor const & cur) { - copySelection(cur, cur.selectionAsString(true)); + copySelection(cur, cur.selectionAsString(true, true)); } @@ -1015,7 +1023,7 @@ void copyInset(Cursor const & cur, Inset * inset, docstring const & plaintext) theCuts.push(make_pair(pars, bp.documentClassPtr())); // stuff the selection onto the X clipboard, from an explicit copy request - putClipboard(theCuts[0].first, theCuts[0].second, plaintext); + putClipboard(theCuts[0].first, theCuts[0].second, plaintext, bp); } @@ -1098,7 +1106,8 @@ void copySelection(Cursor const & cur, docstring const & plaintext) } // stuff the selection onto the X clipboard, from an explicit copy request - putClipboard(theCuts[0].first, theCuts[0].second, plaintext); + putClipboard(theCuts[0].first, theCuts[0].second, plaintext, + cur.buffer()->params()); } @@ -1110,7 +1119,7 @@ void saveSelection(Cursor const & cur) if (cur.selection() && cur.selBegin() == cur.bv().cursor().selBegin() && cur.selEnd() == cur.bv().cursor().selEnd()) { - LYXERR(Debug::SELECTION, "saveSelection: '" << cur.selectionAsString(true) << "'"); + LYXERR(Debug::SELECTION, "saveSelection: '" << cur.selectionAsString(true, true) << "'"); copySelectionToStack(cur, selectionBuffer); } } @@ -1150,8 +1159,8 @@ docstring selection(size_t sel_index, DocumentClassConstPtr docclass) void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, - DocumentClassConstPtr docclass, ErrorList & errorList, - cap::BranchAction branchAction) + DocumentClassConstPtr docclass, ErrorList & errorList, + cap::BranchAction branchAction) { if (cur.inTexted()) { Text * text = cur.text(); @@ -1210,9 +1219,7 @@ bool pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs, theClipboard().hasTextContents(Clipboard::LyXTextType)) { string lyx = theClipboard().getAsLyX(); if (!lyx.empty()) { - // For some strange reason gcc 3.2 and 3.3 do not accept - // Buffer buffer(string(), false); - Buffer buffer("", false); + Buffer buffer(string(), false); buffer.setUnnamed(true); if (buffer.readString(lyx)) { cur.recordUndo(); @@ -1243,9 +1250,7 @@ bool pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs, docstring text = theClipboard().getAsText(types[i]); available = !text.empty(); if (available) { - // For some strange reason gcc 3.2 and 3.3 do not accept - // Buffer buffer(string(), false); - Buffer buffer("", false); + Buffer buffer(string(), false); buffer.setUnnamed(true); available = buffer.importString(names[i], text, errorList); if (available) @@ -1353,10 +1358,10 @@ void replaceSelectionWithString(Cursor & cur, docstring const & str) // Insert the new string pos_type pos = cur.selEnd().pos(); Paragraph & par = cur.selEnd().paragraph(); - docstring::const_iterator cit = str.begin(); - docstring::const_iterator end = str.end(); - for (; cit != end; ++cit, ++pos) - par.insertChar(pos, *cit, font, cur.buffer()->params().track_changes); + for (auto const & c : str) { + par.insertChar(pos, c, font, cur.buffer()->params().track_changes); + ++pos; + } // Cut the selection cutSelection(cur, false);