]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Properly fix handling of title layouts within insets (#11787)
[lyx.git] / src / insets / InsetTabular.cpp
index 4dcb1c2bbaacb4cba263684c3ac60f250e82b164..e007e59174841ebf8b495e9b84ef8dd7ff804655 100644 (file)
@@ -5184,6 +5184,16 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                        break;
                                }
                        }
+                       else if (theClipboard().hasTextContents(Clipboard::LyXTextType)) {
+                               // This might be tabular data from another LyX instance. Check!
+                               docstring const clip =
+                                       theClipboard().getAsText(Clipboard::PlainTextType);
+                               if (clip.find_first_of(from_ascii("\t\n")) != docstring::npos) {
+                                       FuncRequest ncmd = FuncRequest(LFUN_CLIPBOARD_PASTE, cmd.argument());
+                                       doDispatch(cur, ncmd);
+                                       break;
+                               }
+                       }
                        if (!cur.selIsMultiCell())
                                cell(cur.idx())->dispatch(cur, cmd);
                        break;
@@ -7107,12 +7117,15 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
                getSelection(cur, actrow, re, actcol, ce);
        }
 
-       for (row_type r1 = 0, r2 = actrow;
-            r1 < paste_tabular->nrows() && r2 < tabular.nrows();
-            ++r1, ++r2) {
-               for (col_type c1 = 0, c2 = actcol;
-                   c1 < paste_tabular->ncols() && c2 < tabular.ncols();
-                   ++c1, ++c2) {
+       col_type const oldncols = tabular.ncols();
+       for (row_type r1 = 0, r2 = actrow; r1 < paste_tabular->nrows(); ++r1, ++r2) {
+               // Append rows if needed
+               if (r2 == tabular.nrows())
+                       tabular.insertRow(r2 - 1, false);
+               for (col_type c1 = 0, c2 = actcol; c1 < paste_tabular->ncols(); ++c1, ++c2) {
+                       // Append columns if needed
+                       if (c2 == tabular.ncols())
+                               tabular.insertColumn(c2 - 1, false);
                        if (paste_tabular->isPartOfMultiColumn(r1, c1) &&
                              tabular.isPartOfMultiColumn(r2, c2))
                                continue;
@@ -7140,6 +7153,8 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
                        cur.pit() = 0;
                }
        }
+       // amend cursor position if cols have been appended
+       cur.idx() += actrow * (tabular.ncols() - oldncols);
        return true;
 }