]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.C
gnome build removal, gtk build fix
[lyx.git] / src / CutAndPaste.C
index ab771cd5164d68fcee90830b66749ed0dcc3f883..af8912c0fdb78b3f5f791c07f3100d3440f25f78 100644 (file)
@@ -66,7 +66,8 @@ typedef limited_stack<pair<ParagraphList, textclass_type> > CutStack;
 
 CutStack theCuts(10);
 
-struct resetOwnerAndChanges : public std::unary_function<Paragraph, void> {
+class resetOwnerAndChanges : public std::unary_function<Paragraph, void> {
+public:
        void operator()(Paragraph & p) const {
                p.cleanChanges();
                p.setInsetOwner(0);
@@ -113,6 +114,22 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars,
        // Now remove all out of the pars which is NOT allowed in the
        // new environment and set also another font if that is required.
 
+       // Convert newline to paragraph break in ERT inset.
+       // This should not be here!
+       if (pars[pit].inInset() &&
+           pars[pit].inInset()->lyxCode() == InsetBase::ERT_CODE) {
+               for (ParagraphList::size_type i = 0; i < insertion.size(); ++i) {
+                       for (pos_type j = 0; j < insertion[i].size(); ++j) {
+                               if (insertion[i].isNewline(j)) {
+                                       insertion[i].erase(j);
+                                       breakParagraphConservative(
+                                                       buffer.params(),
+                                                       insertion, i, j);
+                               }
+                       }
+               }
+       }
+
        // Make sure there is no class difference.
        lyx::cap::SwitchLayoutsBetweenClasses(textclass, tc, insertion,
                                    errorlist);
@@ -144,15 +161,18 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars,
                // Set the inset owner of this paragraph.
                tmpbuf->setInsetOwner(pars[pit].inInset());
                for (pos_type i = 0; i < tmpbuf->size(); ++i) {
-                       if (tmpbuf->getChar(i) == Paragraph::META_INSET) {
-                               if (!pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode()))
-                                       tmpbuf->erase(i--);
-                       }
+                       if (tmpbuf->getChar(i) == Paragraph::META_INSET &&
+                           !pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode()))
+                               tmpbuf->erase(i--);
                }
        }
 
-       // Make the buf exactly the same layout as the cursor paragraph.
-       insertion.begin()->makeSameLayout(pars[pit]);
+       bool const empty = pars[pit].empty();
+       if (!empty) {
+               // Make the buf exactly the same layout as the cursor
+               // paragraph.
+               insertion.begin()->makeSameLayout(pars[pit]);
+       }
 
        // Prepare the paragraphs and insets for insertion.
        // A couple of insets store buffer references so need updating.
@@ -168,7 +188,7 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars,
 
                for (; lit != eit; ++lit) {
                        switch (lit->inset->lyxCode()) {
-                       case InsetOld::TABULAR_CODE: {
+                       case InsetBase::TABULAR_CODE: {
                                InsetTabular * it = static_cast<InsetTabular*>(lit->inset);
                                it->buffer(&buffer);
                                break;
@@ -182,15 +202,24 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars,
        std::swap(in.paragraphs(), insertion);
 
        // Split the paragraph for inserting the buf if necessary.
-       bool did_split = false;
-       if (pars[pit].size() || pit + 1 == pit_type(pars.size())) {
+       if (!empty)
                breakParagraphConservative(buffer.params(), pars, pit, pos);
-               did_split = true;
-       }
 
        // Paste it!
-       pars.insert(pars.begin() + pit + 1, insertion.begin(), insertion.end());
-       mergeParagraph(buffer.params(), pars, pit);
+       if (empty) {
+               pars.insert(pars.begin() + 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(pars.begin() + pit + 1, insertion.begin(),
+                           insertion.end());
+
+               // merge the first par of the insertion with the current par
+               mergeParagraph(buffer.params(), pars, pit);
+       }
 
        pit_type last_paste = pit + insertion.size() - 1;
 
@@ -199,7 +228,7 @@ pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars,
        pos = pars[last_paste].size();
 
        // Maybe some pasting.
-       if (did_split && last_paste + 1 != pit_type(pars.size())) {
+       if (!empty && last_paste + 1 != pit_type(pars.size())) {
                if (pars[last_paste + 1].hasSameLayout(pars[last_paste])) {
                        mergeParagraph(buffer.params(), pars, last_paste);
                } else if (pars[last_paste + 1].empty()) {
@@ -466,7 +495,6 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut)
                if (doclear)
                        text->paragraphs()[begpit].stripLeadingSpaces();
 
-               text->redoParagraphs(begpit, begpit + 1);
                // cutSelection can invalidate the cursor so we need to set
                // it anew. (Lgb)
                // we prefer the end for when tracking changes
@@ -475,7 +503,7 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut)
 
                // need a valid cursor. (Lgb)
                cur.clearSelection();
-               text->updateCounters();
+               updateCounters(cur.buffer());
        }
 
        if (cur.inMathed()) {
@@ -564,13 +592,11 @@ void pasteSelection(LCursor & cur, size_t sel_index)
                bufferErrors(cur.buffer(), el);
                cur.bv().showErrorList(_("Paste"));
 
-               text->redoParagraphs(cur.pit(), endpit);
-
                cur.clearSelection();
                cur.resetAnchor();
                text->setCursor(cur, ppp.first, ppp.second);
                cur.setSelection();
-               text->updateCounters();
+               updateCounters(cur.buffer());
        }
 
        if (cur.inMathed()) {
@@ -655,7 +681,7 @@ void eraseSelection(LCursor & cur)
                                for (InsetBase::col_type col = c1; col <= c2; ++col)
                                        p->cell(p->index(row, col)).clear();
                }
-               cur.back() = i1;
+               cur.top() = i1;
                cur.pos() = 0; // We've deleted the whole cell. Only pos 0 is valid.
                cur.resetAnchor();
        } else {