]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Amend 76cdca64223f
[lyx.git] / src / CutAndPaste.cpp
index 8e0a72d6dda5068d155af22cb8081521f1b8a120..09cedf8c4489d8313997c1ded4852fd3c3680813 100644 (file)
@@ -222,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);
                }
        }
 
@@ -466,17 +462,15 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
 
        // Paste it!
        if (empty) {
-               pars.insert(lyx::next(pars.begin(), pit),
-                           insertion.begin(),
-                           insertion.end());
+               pars.insert(pars.iterator_at(pit),
+                           insertion.begin(), insertion.end());
 
                // merge the empty par with the last par of the insertion
                mergeParagraph(buffer.params(), pars,
                               pit + insertion.size() - 1);
        } else {
-               pars.insert(lyx::next(pars.begin(), pit + 1),
-                           insertion.begin(),
-                           insertion.end());
+               pars.insert(pars.iterator_at(pit + 1),
+                           insertion.begin(), insertion.end());
 
                // merge the first par of the insertion with the current par
                mergeParagraph(buffer.params(), pars, pit);
@@ -608,7 +602,7 @@ Buffer * copyToTempBuffer(ParagraphList const & paragraphs, DocumentClassConstPt
 
 void putClipboard(ParagraphList const & paragraphs,
                  DocumentClassConstPtr docclass, docstring const & plaintext,
-                 BufferParams const bp)
+                 BufferParams const bp)
 {
        Buffer * buffer = copyToTempBuffer(paragraphs, docclass);
        if (!buffer) // already asserted in copyToTempBuffer()
@@ -687,8 +681,8 @@ void copySelectionHelper(Buffer const & buf, Text const & text,
        LASSERT(startpit != endpit || start <= end, return);
 
        // Clone the paragraphs within the selection.
-       ParagraphList copy_pars(lyx::next(pars.begin(), startpit),
-                               lyx::next(pars.begin(), endpit + 1));
+       ParagraphList copy_pars(pars.iterator_at(startpit),
+                               pars.iterator_at(endpit + 1));
 
        // Remove the end of the last paragraph; afterwards, remove the
        // beginning of the first paragraph. Keep this order - there may only
@@ -700,20 +694,17 @@ 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<Buffer &>(buf));
+               par.setInsetBuffers(const_cast<Buffer &>(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());
        }
 
@@ -729,10 +720,9 @@ void copySelectionHelper(Buffer const & buf, Text const & text,
 
        // 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(nullptr);
+       for (auto & par : copy_pars) {
+               par.resetBuffer();
+               par.setInsetOwner(nullptr);
        }
 
        cutstack.push(make_pair(copy_pars, dc));
@@ -894,17 +884,11 @@ vector<docstring> 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<Buffer &>(*buf));
                        textSel += par.asString(AS_STR_INSETS);
@@ -1103,17 +1087,42 @@ void copySelectionToTemp(Cursor & cur)
 
 void copySelection(Cursor const & cur, docstring const & plaintext)
 {
-       // In tablemode, because copy and paste actually use special table stack
-       // we do not attempt to get selected paragraphs under cursor. Instead, a
-       // paragraph with the plain text version is generated so that table cells
-       // can be pasted as pure text somewhere else.
+       // In tablemode, because copy and paste actually use a special table stack,
+       // we need to go through the cells and collect the paragraphs. 
+       // In math matrices, we generate a plain text version.
        if (cur.selBegin().idx() != cur.selEnd().idx()) {
                ParagraphList pars;
-               Paragraph par;
                BufferParams const & bp = cur.buffer()->params();
-               par.setLayout(bp.documentClass().plainLayout());
-               par.insert(0, plaintext, Font(), Change(Change::UNCHANGED));
-               pars.push_back(par);
+               if (cur.inMathed()) {
+                       Paragraph par;
+                       par.setLayout(bp.documentClass().plainLayout());
+                       // Replace (column-separating) tabs by space (#4449)
+                       docstring const clean_text = subst(plaintext, '\t', ' ');
+                       // For pasting into text, we set the language to the paragraph language
+                       // (rather than the default_language which is always English; see #11898)
+                       par.insert(0, clean_text, Font(sane_font, par.getParLanguage(bp)),
+                                  Change(Change::UNCHANGED));
+                       pars.push_back(par);
+               } else {
+                       // Get paragraphs from all cells
+                       InsetTabular * table = cur.inset().asInsetTabular();
+                       LASSERT(table, return);
+                       ParagraphList tplist = table->asParList(cur.selBegin().idx(), cur.selEnd().idx());
+                       for (auto & cpar : tplist) {
+                               cpar.setLayout(bp.documentClass().plainLayout());
+                               pars.push_back(cpar);
+                               // since the pars are merged later, we separate them by blank
+                               Paragraph epar;
+                               epar.insert(0, from_ascii(" "), Font(sane_font, epar.getParLanguage(bp)),
+                                           Change(Change::UNCHANGED));
+                               pars.push_back(epar);
+                       }
+                       // remove last empty par
+                       pars.pop_back();
+                       // merge all paragraphs to one
+                       while (pars.size() > 1)
+                               mergeParagraph(bp, pars, 0);
+               }
                theCuts.push(make_pair(pars, bp.documentClassPtr()));
        } else {
                copySelectionToStack(cur, theCuts);
@@ -1233,9 +1242,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();
@@ -1266,9 +1273,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)
@@ -1376,10 +1381,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);