]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.C
Make lyx2lyx output the new external inset format.
[lyx.git] / src / CutAndPaste.C
index 10ba8fb70c668f17645c530f7a063e3ac38b8dc8..076d6eca7b8eac83d5403c3e5db9bb98c8a97376 100644 (file)
@@ -13,6 +13,7 @@
 #include "CutAndPaste.h"
 #include "BufferView.h"
 #include "buffer.h"
+#include "errorlist.h"
 #include "paragraph.h"
 #include "ParagraphParameters.h"
 #include "lyxtext.h"
@@ -23,8 +24,8 @@
 #include "gettext.h"
 #include "paragraph_funcs.h"
 #include "debug.h"
-
-#include "insets/inseterror.h"
+#include "insets/insetinclude.h"
+#include "insets/insettabular.h"
 
 #include "support/LAssert.h"
 #include "support/lstrings.h"
@@ -197,15 +198,17 @@ bool CutAndPaste::copySelection(ParagraphList::iterator startpit,
 pair<PitPosPair, ParagraphList::iterator>
 CutAndPaste::pasteSelection(ParagraphList & pars,
                            ParagraphList::iterator pit, int pos,
-                           textclass_type tc)
+                           textclass_type tc,
+                           ErrorList & errorlist)
 {
-       return pasteSelection(pars, pit, pos, tc, 0);
+       return pasteSelection(pars, pit, pos, tc, 0, errorlist);
 }
 
 pair<PitPosPair, ParagraphList::iterator>
 CutAndPaste::pasteSelection(ParagraphList & pars,
                            ParagraphList::iterator pit, int pos,
-                           textclass_type tc, size_t cut_index)
+                           textclass_type tc, size_t cut_index,
+                           ErrorList & errorlist)
 {
        if (!checkPastePossible())
                return make_pair(PitPosPair(pit, pos), pit);
@@ -220,7 +223,8 @@ CutAndPaste::pasteSelection(ParagraphList & pars,
        // new environment and set also another font if that is required.
 
        // Make sure there is no class difference.
-       SwitchLayoutsBetweenClasses(textclass, tc, simple_cut_clone);
+       SwitchLayoutsBetweenClasses(textclass, tc, simple_cut_clone,
+                                   errorlist);
 
        ParagraphList::iterator tmpbuf = simple_cut_clone.begin();
        int depth_delta = pit->params().depth() - tmpbuf->params().depth();
@@ -269,6 +273,38 @@ CutAndPaste::pasteSelection(ParagraphList & pars,
        // the cursor paragraph.
        simple_cut_clone.begin()->makeSameLayout(*pit);
 
+       // Prepare the paragraphs and insets for insertion
+       // A couple of insets store buffer references so need
+       // updating
+       ParIterator fpit(simple_cut_clone.begin(), simple_cut_clone);
+       ParIterator fend(simple_cut_clone.end(), simple_cut_clone);
+
+       for (; fpit != fend; ++fpit) {
+               InsetList::iterator lit = fpit->insetlist.begin();
+               InsetList::iterator eit = fpit->insetlist.end();
+
+               for (; lit != eit; ++lit) {
+                       switch (lit->inset->lyxCode()) {
+                       case Inset::INCLUDE_CODE: {
+                               InsetInclude * ii = static_cast<InsetInclude*>(lit->inset);
+                               InsetInclude::Params ip = ii->params();
+                               ip.masterFilename_ = current_view->buffer()->fileName();
+                               ii->set(ip);
+                               break;
+                       }
+                               
+                       case Inset::TABULAR_CODE: {
+                               InsetTabular * it = static_cast<InsetTabular*>(lit->inset);
+                               it->buffer(current_view->buffer());
+                               break;
+                       }
+                               
+                       default:
+                               break; // nothing
+                       }
+               }
+       }
+
        bool paste_the_end = false;
 
        // Open the paragraph for inserting the buf
@@ -329,21 +365,20 @@ int CutAndPaste::nrOfParagraphs()
 
 int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1,
                                             textclass_type c2,
-                                            ParagraphList & pars)
+                                            ParagraphList & pars,
+                                            ErrorList & errorlist)
 {
        lyx::Assert(!pars.empty());
 
-       Paragraph * par = &*pars.begin();
-
        int ret = 0;
        if (c1 == c2)
                return ret;
 
        LyXTextClass const & tclass1 = textclasslist[c1];
        LyXTextClass const & tclass2 = textclasslist[c2];
-       ParIterator end = ParIterator();
-       for (ParIterator it = ParIterator(par); it != end; ++it) {
-               par = *it;
+       ParIterator end = ParIterator(pars.end(), pars);
+       for (ParIterator it = ParIterator(pars.begin(), pars); it != end; ++it) {
+               Paragraph * par = &*(*it);
                string const name = par->layout()->name();
                bool hasLayout = tclass2.hasLayout(name);
 
@@ -359,7 +394,9 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1,
                                "because of class conversion from\n%3$s to %4$s"),
                         name, par->layout()->name(), tclass1.name(), tclass2.name());
                        // To warn the user that something had to be done.
-                       par->insertInset(0, new InsetError(s));
+                       errorlist.push_back(ErrorItem("Changed Layout", s,
+                                                     par->id(), 0,
+                                                     par->size()));
                }
        }
        return ret;