]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Get rid of all-insets-toggle and explain how to replace it with inset-forall.
[lyx.git] / src / CutAndPaste.cpp
index 1efca23341064d63d4f91d4294ed68194abbe0e8..f70096b442c7fb48df84915efdd5cb603ea3451f 100644 (file)
@@ -29,7 +29,7 @@
 #include "InsetIterator.h"
 #include "InsetList.h"
 #include "Language.h"
-#include "LyXFunc.h"
+#include "LyX.h"
 #include "LyXRC.h"
 #include "Text.h"
 #include "Paragraph.h"
 #include "insets/InsetGraphics.h"
 #include "insets/InsetGraphicsParams.h"
 #include "insets/InsetInclude.h"
+#include "insets/InsetLabel.h"
 #include "insets/InsetTabular.h"
 
 #include "mathed/MathData.h"
 #include "mathed/InsetMath.h"
+#include "mathed/InsetMathHull.h"
+#include "mathed/InsetMathRef.h"
 #include "mathed/MathSupport.h"
 
 #include "support/debug.h"
@@ -163,7 +166,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                }
        }
 
-       InsetText in(buffer);
+       InsetText in(cur.buffer());
        // Make sure there is no class difference.
        in.paragraphs().clear();
        // This works without copying any paragraph data because we have
@@ -229,20 +232,65 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                it->setBuffer(const_cast<Buffer &>(buffer));
                switch (it->lyxCode()) {
 
+               case MATH_HULL_CODE: {
+                       // check for equation labels and resolve duplicates
+                       InsetMathHull & ins = static_cast<InsetMathHull &>(*it);
+                       std::vector<InsetLabel *> labels = ins.getLabels();
+                       for (size_t i = 0; i != labels.size(); ++i) {
+                               if (!labels[i])
+                                       continue;
+                               InsetLabel * lab = labels[i];
+                               docstring const oldname = lab->getParam("name");
+                               lab->updateCommand(oldname, false);
+                               docstring const newname = lab->getParam("name");
+                               if (oldname == newname)
+                                       continue;
+                               // adapt the references
+                               for (InsetIterator itt = inset_iterator_begin(in);
+                                     itt != i_end; ++itt) {
+                                       if (itt->lyxCode() == REF_CODE) {
+                                               InsetCommand & ref =
+                                                       static_cast<InsetCommand &>(*itt);
+                                               if (ref.getParam("reference") == oldname)
+                                                       ref.setParam("reference", newname);
+                                       } else if (itt->lyxCode() == MATH_REF_CODE) {
+                                               InsetMathHull & mi =
+                                                       static_cast<InsetMathHull &>(*itt);
+                                               // this is necessary to prevent an uninitialized
+                                               // buffer when the RefInset is in a MathBox.
+                                               // FIXME audit setBuffer/updateBuffer calls
+                                               mi.setBuffer(const_cast<Buffer &>(buffer));
+                                               if (mi.asRefInset()->getTarget() == oldname)
+                                                       mi.asRefInset()->changeTarget(newname);
+                                       }
+                               }
+                       }
+                       break;
+               }
+
                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);
-                                       }
+                       if (oldname == newname)
+                               break;
+                       // adapt the references
+                       for (InsetIterator itt = inset_iterator_begin(in); itt != i_end; ++itt) {
+                               if (itt->lyxCode() == REF_CODE) {
+                                       InsetCommand & ref = static_cast<InsetCommand &>(*itt);
+                                       if (ref.getParam("reference") == oldname)
+                                               ref.setParam("reference", newname);
+                               } else if (itt->lyxCode() == MATH_REF_CODE) {
+                                       InsetMathHull & mi =
+                                               static_cast<InsetMathHull &>(*itt);
+                                       // this is necessary to prevent an uninitialized
+                                       // buffer when the RefInset is in a MathBox.
+                                       // FIXME audit setBuffer/updateBuffer calls
+                                       mi.setBuffer(const_cast<Buffer &>(buffer));
+                                       if (mi.asRefInset()->getTarget() == oldname)
+                                               mi.asRefInset()->changeTarget(newname);
                                }
                        }
                        break;
@@ -260,14 +308,16 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                        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);
-                                       }
+                       if (oldkey == newkey)
+                               break;
+                       // adapt the references
+                       for (InsetIterator itt = inset_iterator_begin(in);
+                            itt != i_end; ++itt) {
+                               if (itt->lyxCode() == CITE_CODE) {
+                                       InsetCommand & ref =
+                                               static_cast<InsetCommand &>(*itt);
+                                       if (ref.getParam("key") == oldkey)
+                                               ref.setParam("key", newkey);
                                }
                        }
                        break;
@@ -332,7 +382,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
        pit = last_paste;
        pos = pars[last_paste].size();
 
-       // FIXME Should we do it here, or should we let updateLabels() do it?
+       // FIXME Should we do it here, or should we let updateBuffer() do it?
        // Set paragraph buffers. It's important to do this right away
        // before something calls Inset::buffer() and causes a crash.
        for (pit_type p = startpit; p <= pit; ++p)
@@ -429,6 +479,21 @@ void putClipboard(ParagraphList const & paragraphs,
 }
 
 
+/// return true if the whole ParagraphList is deleted
+static bool isFullyDeleted(ParagraphList const & pars)
+{
+       pit_type const pars_size = static_cast<pit_type>(pars.size());
+
+       // check all paragraphs
+       for (pit_type pit = 0; pit < pars_size; ++pit) {
+               if (!pars[pit].empty())   // prevent assertion failure
+                       if (!pars[pit].isDeleted(0, pars[pit].size()))
+                               return false;
+       }
+       return true;
+}
+
+
 void copySelectionHelper(Buffer const & buf, Text const & text,
        pit_type startpit, pit_type endpit,
        int start, int end, DocumentClass const * const dc, CutStack & cutstack)
@@ -593,7 +658,10 @@ void switchBetweenClasses(DocumentClass const * const oldone,
                if (it->lyxCode() != FLEX_CODE)
                        // FIXME: Should we verify all InsetCollapsable?
                        continue;
-               if (!it->undefined())
+               docstring const & n = newone->insetLayout(it->name()).name();
+               bool const is_undefined = n.empty() ||
+                       n == DocumentClass::plainInsetLayout().name();
+               if (!is_undefined)
                        continue;
                // The flex inset is undefined in newtc
                docstring const s = bformat(_(
@@ -707,7 +775,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut)
 
                // need a valid cursor. (Lgb)
                cur.clearSelection();
-               cur.buffer()->updateLabels();
+               cur.buffer()->updateBuffer();
 
                // tell tabular that a recent copy happened
                dirtyTabularStack(false);
@@ -885,7 +953,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist,
 
                boost::tie(ppp, endpit) =
                        pasteSelectionHelper(cur, parlist, docclass, errorList);
-               cur.buffer()->updateLabels();
+               cur.buffer()->updateBuffer();
                cur.clearSelection();
                text->setCursor(cur, ppp.first, ppp.second);
        }
@@ -957,7 +1025,7 @@ void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */,
                return;
 
        // create inset for graphic
-       InsetGraphics * inset = new InsetGraphics(*cur.buffer());
+       InsetGraphics * inset = new InsetGraphics(cur.buffer());
        InsetGraphicsParams params;
        params.filename = support::DocFileName(filename.absFilename());
        inset->setParams(params);
@@ -1086,7 +1154,8 @@ docstring grabSelection(Cursor const & cur)
        if (i1.idx() == i2.idx()) {
                if (i1.inset().asInsetMath()) {
                        MathData::const_iterator it = i1.cell().begin();
-                       return asString(MathData(it + i1.pos(), it + i2.pos()));
+                       Buffer * buf = cur.buffer();
+                       return asString(MathData(buf, it + i1.pos(), it + i2.pos()));
                } else {
                        return from_ascii("unknown selection 1");
                }