]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Continue working on the embedding feature. An additional parameter updateFile is...
[lyx.git] / src / CutAndPaste.cpp
index 77652d611d8aed9ed05f41dffa65f5d4ecc7bb41..bd0b3baaa7cdddfa974b49b52897f687ba0dd97d 100644 (file)
@@ -37,6 +37,7 @@
 #include "Undo.h"
 
 #include "insets/InsetFlex.h"
+#include "insets/InsetCommand.h"
 #include "insets/InsetGraphics.h"
 #include "insets/InsetGraphicsParams.h"
 #include "insets/InsetTabular.h"
@@ -146,7 +147,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
        // note that we are doing this if the empty layout is
        // supposed to be the default, not just if it is forced
        if (cur.inset().useEmptyLayout()) {
-               LayoutPtr const layout =
+               Layout const & layout =
                        buffer.params().documentClass().emptyLayout();
                ParagraphList::iterator const end = insertion.end();
                for (ParagraphList::iterator par = insertion.begin();
@@ -212,14 +213,55 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
        // A couple of insets store buffer references so need updating.
        insertion.swap(in.paragraphs());
 
-       ParIterator fpit = par_iterator_begin(in);
-       ParIterator fend = par_iterator_end(in);
+       InsetIterator const i_end = inset_iterator_end(in);
+
+       for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
+
+               it->setBuffer(const_cast<Buffer &>(buffer));
+
+               switch (it->lyxCode()) {
+               case LABEL_CODE: {
+                       // check for duplicates
+                       InsetCommand & lab = static_cast<InsetCommand &>(*it);
+                       docstring const oldname = lab.getParam("name");
+                       lab.updateCommand(oldname, false);
+                       docstring const newname = lab.getParam("name");
+                       if (oldname != newname) {
+                               // adapt the references
+                               for (InsetIterator itt = inset_iterator_begin(in); itt != i_end; ++itt) {
+                                       if (itt->lyxCode() == REF_CODE) {
+                                               InsetCommand & ref = dynamic_cast<InsetCommand &>(*itt);
+                                               if (ref.getParam("reference") == oldname)
+                                                       ref.setParam("reference", newname);
+                                       }
+                               }
+                       }
+                       break;
+               }
+
+               case BIBITEM_CODE: {
+                       // check for duplicates
+                       InsetCommand & bib = static_cast<InsetCommand &>(*it);
+                       docstring const oldkey = bib.getParam("key");
+                       bib.updateCommand(oldkey, false);
+                       docstring const newkey = bib.getParam("key");
+                       if (oldkey != newkey) {
+                               // adapt the references
+                               for (InsetIterator itt = inset_iterator_begin(in); itt != i_end; ++itt) {
+                                       if (itt->lyxCode() == CITE_CODE) {
+                                               InsetCommand & ref = dynamic_cast<InsetCommand &>(*itt);
+                                               if (ref.getParam("key") == oldkey)
+                                                       ref.setParam("key", newkey);
+                                       }
+                               }
+                       }
+                       break;
+               }
 
-       for (; fpit != fend; ++fpit) {
-               InsetList::const_iterator it = fpit->insetList().begin();
-               InsetList::const_iterator et = fpit->insetList().end();
-               for (; it != et; ++it)
-                               it->inset->setBuffer(const_cast<Buffer &>(buffer));
+               default:
+                       break; // nothing
+               }
        }
        insertion.swap(in.paragraphs());
 
@@ -407,7 +449,7 @@ void switchBetweenClasses(DocumentClass const * const oldone,
        // layouts
        ParIterator end = par_iterator_end(in);
        for (ParIterator it = par_iterator_begin(in); it != end; ++it) {
-               docstring const name = it->layout()->name();
+               docstring const name = it->layout().name();
                bool hasLayout = newtc.hasLayout(name);
 
                if (in.useEmptyLayout())
@@ -421,7 +463,7 @@ void switchBetweenClasses(DocumentClass const * const oldone,
                        docstring const s = bformat(
                                                 _("Layout had to be changed from\n%1$s to %2$s\n"
                                                "because of class conversion from\n%3$s to %4$s"),
-                        name, it->layout()->name(),
+                        name, it->layout().name(),
                         from_utf8(oldtc.name()), from_utf8(newtc.name()));
                        // To warn the user that something had to be done.
                        errorlist.push_back(ErrorItem(_("Changed Layout"), s,