]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
fix msvc warning, somehow msvc thinks !line[0] is a boolean
[lyx.git] / src / CutAndPaste.cpp
index 4cc10d59f4dee15e200be9cd59320eb9244c6cc6..99f8383e6b027abf14a4fa222942e182cb34ccf8 100644 (file)
@@ -35,8 +35,9 @@
 #include "Paragraph.h"
 #include "ParagraphParameters.h"
 #include "ParIterator.h"
-#include "Undo.h"
+#include "TextClass.h"
 
+#include "insets/InsetBibitem.h"
 #include "insets/InsetBranch.h"
 #include "insets/InsetCommand.h"
 #include "insets/InsetFlex.h"
@@ -96,7 +97,7 @@ bool checkPastePossible(int index)
 
 
 pair<PitPosPair, pit_type>
-pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
+pasteSelectionHelper(Cursor const & cur, ParagraphList const & parlist,
                     DocumentClass const * const oldDocClass, ErrorList & errorlist)
 {
        Buffer const & buffer = *cur.buffer();
@@ -123,10 +124,9 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
        // 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!
-       InsetCode const code = target_inset->lyxCode();
-       if (code == ERT_CODE || code == LISTINGS_CODE) {
+       // Convert newline to paragraph break in ParbreakIsNewline
+       if (target_inset->getLayout().parbreakIsNewline()
+           || pars[pit].layout().parbreak_is_newline) {
                for (size_t i = 0; i != insertion.size(); ++i) {
                        for (pos_type j = 0; j != insertion[i].size(); ++j) {
                                if (insertion[i].isNewline(j)) {
@@ -234,14 +234,16 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
 
                case MATH_HULL_CODE: {
                        // check for equation labels and resolve duplicates
-                       InsetMathHull & ins = static_cast<InsetMathHull &>(*it);
-                       std::vector<InsetLabel *> labels = ins.getLabels();
+                       InsetMathHull * ins = it->asInsetMath()->asHullInset();
+                       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);
+                               // We need to update the buffer reference cache.
+                               cur.forceBufferUpdate();
                                docstring const newname = lab->getParam("name");
                                if (oldname == newname)
                                        continue;
@@ -249,19 +251,17 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                                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);
+                                               InsetCommand * ref = itt->asInsetCommand();
+                                               if (ref->getParam("reference") == oldname)
+                                                       ref->setParam("reference", newname);
                                        } else if (itt->lyxCode() == MATH_REF_CODE) {
-                                               InsetMathHull & mi =
-                                                       static_cast<InsetMathHull &>(*itt);
+                                               InsetMathHull * mi = itt->asInsetMath()->asHullInset();
                                                // 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);
+                                               // FIXME audit setBuffer calls
+                                               mi->setBuffer(const_cast<Buffer &>(buffer));
+                                               if (mi->asRefInset()->getTarget() == oldname)
+                                                       mi->asRefInset()->changeTarget(newname);
                                        }
                                }
                        }
@@ -270,9 +270,11 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
 
                case LABEL_CODE: {
                        // check for duplicates
-                       InsetCommand & lab = static_cast<InsetCommand &>(*it);
+                       InsetLabel & lab = static_cast<InsetLabel &>(*it);
                        docstring const oldname = lab.getParam("name");
                        lab.updateCommand(oldname, false);
+                       // We need to update the buffer reference cache.
+                       cur.forceBufferUpdate();
                        docstring const newname = lab.getParam("name");
                        if (oldname == newname)
                                break;
@@ -287,7 +289,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                                                static_cast<InsetMathHull &>(*itt);
                                        // this is necessary to prevent an uninitialized
                                        // buffer when the RefInset is in a MathBox.
-                                       // FIXME audit setBuffer/updateBuffer calls
+                                       // FIXME audit setBuffer calls
                                        mi.setBuffer(const_cast<Buffer &>(buffer));
                                        if (mi.asRefInset()->getTarget() == oldname)
                                                mi.asRefInset()->changeTarget(newname);
@@ -299,14 +301,18 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                case INCLUDE_CODE: {
                        InsetInclude & inc = static_cast<InsetInclude &>(*it);
                        inc.updateCommand();
+                       // We need to update the list of included files.
+                       cur.forceBufferUpdate();
                        break;
                }
 
                case BIBITEM_CODE: {
                        // check for duplicates
-                       InsetCommand & bib = static_cast<InsetCommand &>(*it);
+                       InsetBibitem & bib = static_cast<InsetBibitem &>(*it);
                        docstring const oldkey = bib.getParam("key");
                        bib.updateCommand(oldkey, false);
+                       // We need to update the buffer reference cache.
+                       cur.forceBufferUpdate();
                        docstring const newkey = bib.getParam("key");
                        if (oldkey == newkey)
                                break;
@@ -314,10 +320,9 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                        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);
+                                       InsetCommand * ref = itt->asInsetCommand();
+                                       if (ref->getParam("key") == oldkey)
+                                               ref->setParam("key", newkey);
                                }
                        }
                        break;
@@ -345,6 +350,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
                                          text, 0, 1, _("&Add"), _("&Don't Add")) != 0)
                                break;
                        lyx::dispatch(FuncRequest(LFUN_BRANCH_ADD, name));
+                       // We need to update the list of branches.
+                       cur.forceBufferUpdate();
                        break;
                }
 
@@ -530,7 +537,7 @@ void copySelectionHelper(Buffer const & buf, Text const & text,
                // PassThru paragraphs have the Language
                // latex_language. This is invalid for others, so we
                // need to change it to the buffer language.
-               if (text.inset().getLayout().isPassThru())
+               if (it->isPassThru())
                        it->changeLanguage(buf.params(), 
                                           latex_language, buf.language());
        }
@@ -539,6 +546,8 @@ void copySelectionHelper(Buffer const & buf, Text const & text,
        // deleted, unless the whole selection was deleted
        if (!isFullyDeleted(copy_pars))
                acceptChanges(copy_pars, buf.params());
+       else
+               rejectChanges(copy_pars, buf.params());
 
 
        // do some final cleanup now, to make sure that the paragraphs
@@ -754,7 +763,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut)
                }
 
                if (begpit != endpit)
-                       cur.updateFlags(Update::Force | Update::FitCursor);
+                       cur.screenUpdateFlags(Update::Force | Update::FitCursor);
 
                boost::tie(endpit, endpos) =
                        eraseSelectionHelper(bp,
@@ -775,6 +784,11 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut)
 
                // need a valid cursor. (Lgb)
                cur.clearSelection();
+
+               // After a cut operation, we must make sure that the Buffer is updated
+               // because some further operation might need updated label information for
+               // example. So we cannot just use "cur.forceBufferUpdate()" here.
+               // This fixes #7071.
                cur.buffer()->updateBuffer();
 
                // tell tabular that a recent copy happened
@@ -953,7 +967,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist,
 
                boost::tie(ppp, endpit) =
                        pasteSelectionHelper(cur, parlist, docclass, errorList);
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                cur.clearSelection();
                text->setCursor(cur, ppp.first, ppp.second);
        }
@@ -1027,7 +1041,7 @@ void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */,
        // create inset for graphic
        InsetGraphics * inset = new InsetGraphics(cur.buffer());
        InsetGraphicsParams params;
-       params.filename = support::DocFileName(filename.absFileName());
+       params.filename = support::DocFileName(filename.absFileName(), false);
        inset->setParams(params);
        cur.recordUndo();
        cur.insert(inset);