]> 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 a2d49ef54b7d01494995be6f808b6a4ffcf937d3..e007e59174841ebf8b495e9b84ef8dd7ff804655 100644 (file)
@@ -570,7 +570,7 @@ string const write_attribute(string const & name, Tabular::idx_type const & i)
 template <>
 string const write_attribute(string const & name, Length const & value)
 {
-       // we write only the value if we really have one same reson as above.
+       // we write only the value if we really have one same reason as above.
        return value.zero() ? string() : write_attribute(name, value.asString());
 }
 
@@ -1013,7 +1013,7 @@ void Tabular::updateIndexes()
                                continue;
                        }
                        cell_info[row][column].inset->toggleMultiCol(false);
-                       // columnofcell needs to be called before setting width and aligment
+                       // columnofcell needs to be called before setting width and alignment
                        // multirow cells inherit the width from the column width
                        if (!isPartOfMultiRow(row, column)) {
                                columnofcell[i] = column;
@@ -1174,7 +1174,7 @@ bool Tabular::updateColumnWidths(MetricsInfo & mi)
        int restwidth = -1;
        if (!tab_width.zero()) {
                restwidth = mi.base.inPixels(tab_width);
-               // Substract the fixed widths from the table width
+               // Subtract the fixed widths from the table width
                for (auto const w : max_pwidth)
                        restwidth -= w.second;
        }
@@ -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;
 }
 
@@ -7206,6 +7221,22 @@ docstring InsetTabular::asString(idx_type stidx, idx_type enidx,
 }
 
 
+ParagraphList InsetTabular::asParList(idx_type stidx, idx_type enidx)
+{
+       LASSERT(stidx <= enidx, return ParagraphList());
+       ParagraphList retval;
+       col_type const col1 = tabular.cellColumn(stidx);
+       col_type const col2 = tabular.cellColumn(enidx);
+       row_type const row1 = tabular.cellRow(stidx);
+       row_type const row2 = tabular.cellRow(enidx);
+       for (col_type col = col1; col <= col2; col++)
+               for (row_type row = row1; row <= row2; row++)
+                       for (auto par : tabular.cellInset(row, col)->paragraphs())
+                               retval.push_back(par);
+       return retval;
+}
+
+
 void InsetTabular::getSelection(Cursor & cur,
        row_type & rs, row_type & re, col_type & cs, col_type & ce) const
 {