]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Fix bug #4952: Multiple cells pasting fails if cells are selected.
[lyx.git] / src / insets / InsetTabular.cpp
index 39ecb09d923d68ec1cf87e3ce30b28e66019e2f6..ba30546a07415df46ed645dff5dc9738b0e1a43f 100644 (file)
@@ -2096,7 +2096,7 @@ int Tabular::TeXLongtableHeaderFooter(odocstream & os,
        }
        // output first header info
        // first header must be output before the header, otherwise the
-       // correct caption placement becomes really wierd
+       // correct caption placement becomes really weird
        if (haveLTFirstHead()) {
                if (endfirsthead.topDL) {
                        os << "\\hline\n";
@@ -3605,23 +3605,24 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        // insert file functions
        case LFUN_FILE_INSERT_PLAINTEXT_PARA:
-       case LFUN_FILE_INSERT_PLAINTEXT: {
+       case LFUN_FILE_INSERT_PLAINTEXT:
                // FIXME UNICODE
-               docstring const tmpstr = cur.bv().contentsOfPlaintextFile(
-                       FileName(to_utf8(cmd.argument())));
-               if (tmpstr.empty())
-                       break;
-               cur.recordUndoInset(INSERT_UNDO);
-               if (insertPlaintextString(cur.bv(), tmpstr, false)) {
-                       // content has been replaced,
-                       // so cursor might be invalid
-                       cur.pos() = cur.lastpos();
-                       cur.pit() = cur.lastpit();
-                       bvcur.setCursor(cur);
-               } else
-                       cur.undispatched();
+               if (FileName::isAbsolute(to_utf8(cmd.argument()))) {
+                       docstring const tmpstr = cur.bv().contentsOfPlaintextFile(
+                               FileName(to_utf8(cmd.argument())));
+                       if (tmpstr.empty())
+                               break;
+                       cur.recordUndoInset(INSERT_UNDO);
+                       if (insertPlaintextString(cur.bv(), tmpstr, false)) {
+                               // content has been replaced,
+                               // so cursor might be invalid
+                               cur.pos() = cur.lastpos();
+                               cur.pit() = cur.lastpit();
+                               bvcur.setCursor(cur);
+                       } else
+                               cur.undispatched();
+               }
                break;
-       }
 
        case LFUN_CUT:
                if (cur.selIsMultiCell()) {
@@ -3629,8 +3630,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                cur.recordUndoInset(DELETE_UNDO);
                                cutSelection(cur);
                        }
-               }
-               else
+               } else
                        cell(cur.idx())->dispatch(cur, cmd);
                break;
 
@@ -3689,7 +3689,8 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_PASTE:
                if (!tabularStackDirty()) {
-                       cell(cur.idx())->dispatch(cur, cmd);
+                       if (!cur.selIsMultiCell())
+                               cell(cur.idx())->dispatch(cur, cmd);
                        break;
                }
                if (theClipboard().isInternal() ||
@@ -3935,7 +3936,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
 
                // every row can only be one thing:
                // either a footer or header or caption
-               case Tabular::SET_LTFIRSTHEAD:                  
+               case Tabular::SET_LTFIRSTHEAD:
                        status.setEnabled(sel_row_start == sel_row_end
                                && !tabular.getRowOfLTHead(sel_row_start, dummyltt)
                                && !tabular.getRowOfLTFoot(sel_row_start, dummyltt)
@@ -4066,15 +4067,22 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                return true;
 
        case LFUN_PASTE:
-               if (cur.selIsMultiCell()) {
-                       status.setEnabled(false);
-                       status.message(_("You cannot paste into a multicell selection."));
-                       return true;
-               }
                if (tabularStackDirty() && theClipboard().isInternal()) {
-                       status.setEnabled(true);
+                       if (cur.selIsMultiCell()) {
+                               row_type rs, re;
+                               col_type cs, ce;
+                               getSelection(cur, rs, re, cs, ce);
+                               if (paste_tabular && paste_tabular->column_info.size() == ce - cs + 1
+                                         && paste_tabular->row_info.size() == re - rs + 1)
+                                       status.setEnabled(true);        
+                               else {
+                                       status.setEnabled(false);
+                                       status.message(_("Selection size should match clipboard content."));
+                               }
+                       } else
+                               status.setEnabled(true);
                        return true;
-               } 
+               }
                return cell(cur.idx())->getStatus(cur, cmd, status);
 
        case LFUN_INSET_SETTINGS:
@@ -4922,8 +4930,15 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
 {
        if (!paste_tabular)
                return false;
-       col_type const actcol = tabular.cellColumn(cur.idx());
-       row_type const actrow = tabular.cellRow(cur.idx());
+       col_type actcol = tabular.cellColumn(cur.idx());
+       row_type actrow = tabular.cellRow(cur.idx());
+
+       if (cur.selIsMultiCell()) {
+               row_type re;
+               col_type ce;
+               getSelection(cur, actrow, re, actcol, ce);
+       }
+
        for (row_type r1 = 0, r2 = actrow;
             r1 < paste_tabular->row_info.size() && r2 < tabular.row_info.size();
             ++r1, ++r2) {
@@ -4931,7 +4946,7 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
                    c1 < paste_tabular->column_info.size() && c2 < tabular.column_info.size();
                    ++c1, ++c2) {
                        if (paste_tabular->isPartOfMultiColumn(r1, c1) &&
-                           tabular.isPartOfMultiColumn(r2, c2))
+                             tabular.isPartOfMultiColumn(r2, c2))
                                continue;
                        if (paste_tabular->isPartOfMultiColumn(r1, c1)) {
                                --c2;