X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=9507b2b57f1fb70b7160da88b25ad212b3366d6d;hb=7950ace3d96543e3099aa3bde823f970a1ce6a86;hp=f611d59395b8b9681b5a0d20c89435f1c684c52e;hpb=8b0280d216ea879b75b5152a68c8ce6f2115c15b;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index f611d59395..9507b2b57f 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -40,6 +40,7 @@ #include "insets/InsetBibitem.h" #include "insets/InsetBranch.h" +#include "insets/InsetCitation.h" #include "insets/InsetCommand.h" #include "insets/InsetFlex.h" #include "insets/InsetGraphics.h" @@ -141,6 +142,14 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, // Now remove all out of the pars which is NOT allowed in the // new environment and set also another font if that is required. + // Merge paragraphs that are to be pasted into a text inset + // that does not allow multiple pars. + InsetText * inset_text = target_inset->asInsetText(); + if (inset_text && !inset_text->allowMultiPar()) { + while (insertion.size() > 1) + mergeParagraph(buffer.params(), insertion, 0); + } + // Convert newline to paragraph break in ParbreakIsNewline if (target_inset->getLayout().parbreakIsNewline() || pars[pit].layout().parbreak_is_newline) { @@ -168,6 +177,9 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, for (size_t i = 0; i != insertion.size(); ++i) { pos_type end = insertion[i].size(); for (pos_type j = 0; j != end; ++j) { + // skip insets + if (insertion[i].isInset(j)) + continue; char_type const c = insertion[i].getChar(j); if (!e->encodable(c)) { // do not track deletion @@ -357,6 +369,16 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist, break; } + case CITE_CODE: { + InsetCitation & cit = static_cast(*it); + // This actually only needs to be done if the cite engine + // differs, but we do it in general. + cit.redoLabel(); + // We need to update the list of citations. + need_update = true; + break; + } + case BIBITEM_CODE: { // check for duplicates InsetBibitem & bib = static_cast(*it); @@ -805,11 +827,11 @@ void switchBetweenClasses(DocumentClassConstPtr oldone, // character styles and hidden table cells InsetIterator const i_end = inset_iterator_end(in); - for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) { - InsetCode const code = it->lyxCode(); + for (InsetIterator iit = inset_iterator_begin(in); iit != i_end; ++iit) { + InsetCode const code = iit->lyxCode(); if (code == FLEX_CODE) { // FIXME: Should we verify all InsetCollapsible? - docstring const layoutName = it->layoutName(); + docstring const layoutName = iit->layoutName(); docstring const & n = newone->insetLayout(layoutName).name(); bool const is_undefined = n.empty() || n == DocumentClass::plainInsetLayout().name(); @@ -830,14 +852,14 @@ void switchBetweenClasses(DocumentClassConstPtr oldone, // To warn the user that something had to be done. errorlist.push_back(ErrorItem( _("Undefined flex inset"), s, - {it.paragraph().id(), it.pos()}, - {it.paragraph().id(), it.pos()+1})); + {iit.paragraph().id(), iit.pos()}, + {iit.paragraph().id(), iit.pos() + 1})); } else if (code == TABULAR_CODE) { // The recursion above does not catch paragraphs in "hidden" cells, // i.e., ones that are part of a multirow or multicolum. So we need // to handle those separately. // This is the cause of bug #9049. - InsetTabular * table = it->asInsetTabular(); + InsetTabular * table = iit->asInsetTabular(); table->setLayoutForHiddenCells(newtc); } } @@ -883,7 +905,7 @@ size_type numberOfSelections() namespace { -void cutSelectionHelper(Cursor & cur, CutStack & cuts, bool doclear, bool realcut, bool putclip) +void cutSelectionHelper(Cursor & cur, CutStack & cuts, bool realcut, bool putclip) { // This doesn't make sense, if there is no selection if (!cur.selection()) @@ -932,11 +954,6 @@ void cutSelectionHelper(Cursor & cur, CutStack & cuts, bool doclear, bool realcu cur.pos() = endpos; cur.pit() = endpit; - // sometimes necessary - if (doclear - && text->paragraphs()[begpit].stripLeadingSpaces(bp.track_changes)) - cur.fixIfBroken(); - // need a valid cursor. (Lgb) cur.clearSelection(); @@ -968,15 +985,15 @@ void cutSelectionHelper(Cursor & cur, CutStack & cuts, bool doclear, bool realcu } // namespace -void cutSelection(Cursor & cur, bool doclear, bool realcut) +void cutSelection(Cursor & cur, bool realcut) { - cutSelectionHelper(cur, theCuts, doclear, realcut, true); + cutSelectionHelper(cur, theCuts, realcut, true); } -void cutSelectionToTemp(Cursor & cur, bool doclear, bool realcut) +void cutSelectionToTemp(Cursor & cur, bool realcut) { - cutSelectionHelper(cur, tempCut, doclear, realcut, false); + cutSelectionHelper(cur, tempCut, realcut, false); } @@ -1037,7 +1054,10 @@ void copySelectionToStack(Cursor const & cur, CutStack & cutstack) BufferParams const & bp = cur.buffer()->params(); // FIXME This should be the plain layout...right? par.setLayout(bp.documentClass().plainLayout()); - par.insert(0, grabSelection(cur), Font(), Change(Change::UNCHANGED)); + // For pasting into text, we set the language to the paragraph language + // (rather than the default_language which is always English; see #2596) + par.insert(0, grabSelection(cur), Font(sane_font, par.getParLanguage(bp)), + Change(Change::UNCHANGED)); pars.push_back(par); cutstack.push(make_pair(pars, bp.documentClassPtr())); } @@ -1053,6 +1073,12 @@ void copySelectionToStack() } +void copySelectionToTemp(Cursor & cur) +{ + copySelectionToStack(cur, tempCut); +} + + void copySelection(Cursor const & cur, docstring const & plaintext) { // In tablemode, because copy and paste actually use special table stack @@ -1225,6 +1251,10 @@ bool pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs, if (available) available = !buffer.paragraphs().empty(); if (available && !buffer.paragraphs()[0].empty()) { + // TeX2lyx (also used in the HTML chain) assumes English as document language + // if no language is explicitly set (as is the case here). + // We thus reset the temp buffer's language to the context language + buffer.changeLanguage(buffer.language(), cur.getFont().language()); cur.recordUndo(); pasteParagraphList(cur, buffer.paragraphs(), buffer.params().documentClassPtr(), errorList); @@ -1273,7 +1303,7 @@ void pasteSimpleText(Cursor & cur, bool asParagraphs) return; cur.recordUndo(); - cutSelection(cur, true, false); + cutSelection(cur, false); if (asParagraphs) cur.text()->insertStringAsParagraphs(cur, text, cur.current_font); else @@ -1329,14 +1359,14 @@ void replaceSelectionWithString(Cursor & cur, docstring const & str) par.insertChar(pos, *cit, font, cur.buffer()->params().track_changes); // Cut the selection - cutSelection(cur, true, false); + cutSelection(cur, false); } void replaceSelection(Cursor & cur) { if (cur.selection()) - cutSelection(cur, true, false); + cutSelection(cur, false); }