]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Use QProxyStyle instead of QMacStyle. QMacStyle is not available anymore with At5...
[lyx.git] / src / CutAndPaste.cpp
index c168ca517002158ddbe67020fdaef5a59af41094..ad3ad7e23843b0e8f9f1f552621f535319a0ecaf 100644 (file)
@@ -60,6 +60,7 @@
 #include "support/lassert.h"
 #include "support/limited_stack.h"
 #include "support/lstrings.h"
+#include "support/TempFile.h"
 
 #include "frontends/alert.h"
 #include "frontends/Clipboard.h"
@@ -117,22 +118,23 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
        pit_type pit = cur.pit();
        pos_type pos = cur.pos();
        bool need_update = false;
+
+       if (parlist.empty())
+               return PasteReturnValue(pit, pos, need_update);
+
        InsetText * target_inset = cur.inset().asInsetText();
        if (!target_inset) {
                InsetTabular * it = cur.inset().asInsetTabular();
                target_inset = it? it->cell(cur.idx())->asInsetText() : 0;
        }
        LASSERT(target_inset, return PasteReturnValue(pit, pos, need_update));
-       ParagraphList & pars = target_inset->paragraphs();
 
-       if (parlist.empty())
-               return PasteReturnValue(pit, pos, need_update);
-
-       BOOST_ASSERT (pos <= pars[pit].size());
+       ParagraphList & pars = target_inset->paragraphs();
+       LASSERT(pos <= pars[pit].size(),
+                       return PasteReturnValue(pit, pos, need_update));
 
        // Make a copy of the CaP paragraphs.
        ParagraphList insertion = parlist;
-       DocumentClassConstPtr newDocClass = buffer.params().documentClassPtr();
 
        // Now remove all out of the pars which is NOT allowed in the
        // new environment and set also another font if that is required.
@@ -156,6 +158,7 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
        }
 
        // set the paragraphs to plain layout if necessary
+       DocumentClassConstPtr newDocClass = buffer.params().documentClassPtr();
        if (cur.inset().usePlainLayout()) {
                bool forcePlainLayout = cur.inset().forcePlainLayout();
                Layout const & plainLayout = newDocClass->plainLayout();
@@ -167,7 +170,7 @@ pasteSelectionHelper(DocIterator const & cur, ParagraphList const & parlist,
                        if (forcePlainLayout || parLayout == defaultLayout)
                                par->setLayout(plainLayout);
                }
-       } else { // check if we need to reset from plain layout
+       }       else { // check if we need to reset from plain layout
                Layout const & defaultLayout = newDocClass->defaultLayout();
                Layout const & plainLayout = newDocClass->plainLayout();
                ParagraphList::iterator const end = insertion.end();
@@ -484,8 +487,10 @@ void putClipboard(ParagraphList const & paragraphs,
        // new temporary directory, etc) every time, and then to destroy it. So maybe
        // it's worth just keeping this one around.
        // FIXME THREAD
+       static TempFile tempfile("clipboard.internal");
+       tempfile.setAutoRemove(false);
        static Buffer * staticbuffer = theBufferList().newInternalBuffer(
-               FileName::tempName("clipboard.internal").absFileName());
+                       tempfile.name().absFileName());
 
        // These two things only really need doing the first time.
        staticbuffer->setUnnamed(true);
@@ -732,35 +737,42 @@ void switchBetweenClasses(DocumentClassConstPtr oldone,
                        it->setLayout(newtc[name]);
        }
 
-       // character styles
+       // character styles and hidden table cells
        InsetIterator const i_end = inset_iterator_end(in);
        for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
-               if (it->lyxCode() != FLEX_CODE)
+               InsetCode const code = it->lyxCode();
+               if (code == FLEX_CODE) {
                        // FIXME: Should we verify all InsetCollapsable?
-                       continue;
-
-               docstring const layoutName = it->layoutName();
-               docstring const & n = newone->insetLayout(layoutName).name();
-               bool const is_undefined = n.empty() ||
-                       n == DocumentClass::plainInsetLayout().name();
-               if (!is_undefined)
-                       continue;
-
-               // The flex inset is undefined in newtc
-               docstring const oldname = from_utf8(oldtc.name());
-               docstring const newname = from_utf8(newtc.name());
-               docstring s;
-               if (oldname == newname)
-                       s = bformat(_("Flex inset %1$s is undefined after "
-                               "reloading `%2$s' layout."), layoutName, oldname);
-               else
-                       s = bformat(_("Flex inset %1$s is undefined because of "
-                               "conversion from `%2$s' layout to `%3$s'."),
-                               layoutName, oldname, newname);
-               // To warn the user that something had to be done.
-               errorlist.push_back(ErrorItem(
-                               _("Undefined flex inset"),
-                               s, it.paragraph().id(), it.pos(), it.pos() + 1));
+                       docstring const layoutName = it->layoutName();
+                       docstring const & n = newone->insetLayout(layoutName).name();
+                       bool const is_undefined = n.empty() ||
+                               n == DocumentClass::plainInsetLayout().name();
+                       if (!is_undefined)
+                               continue;
+       
+                       // The flex inset is undefined in newtc
+                       docstring const oldname = from_utf8(oldtc.name());
+                       docstring const newname = from_utf8(newtc.name());
+                       docstring s;
+                       if (oldname == newname)
+                               s = bformat(_("Flex inset %1$s is undefined after "
+                                       "reloading `%2$s' layout."), layoutName, oldname);
+                       else
+                               s = bformat(_("Flex inset %1$s is undefined because of "
+                                       "conversion from `%2$s' layout to `%3$s'."),
+                                       layoutName, oldname, newname);
+                       // To warn the user that something had to be done.
+                       errorlist.push_back(ErrorItem(
+                                       _("Undefined flex inset"),
+                                       s, it.paragraph().id(), it.pos(), it.pos() + 1));
+               } else if (code == TABULAR_CODE) {
+                       // The recursion above does not catch paragraphs in "hidden" cells,
+                       // i.e., ones that are part of a multirow or multicolum. So we need
+                       // to handle those separately.
+                       // This is the cause of bug #9049.
+                       InsetTabular * table = it->asInsetTabular();
+                       table->setLayoutForHiddenCells(newtc);
+               }
        }
 }