]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettabular.C
* BufferParams:
[lyx.git] / src / insets / insettabular.C
index 521806dea635cb2ab6c62b3e5d8b7269df850c3e..eaa5a72488f83268c9d9017e097547b0388473ea 100644 (file)
@@ -50,6 +50,7 @@ namespace lyx {
 
 using cap::dirtyTabularStack;
 using cap::tabularStackDirty;
+using cap::saveSelection;
 
 using graphics::PreviewLoader;
 
@@ -501,7 +502,17 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
                }
 
                if (cmd.button() == mouse_button::button2) {
-                       cmd = FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph");
+                       if (cap::selection()) {
+                               // See comment in LyXText::dispatch why we
+                               // do this
+                               // FIXME This does not use paste_tabular,
+                               // another reason why paste_tabular should go.
+                               cap::copySelectionToStack();
+                               cmd = FuncRequest(LFUN_PASTE, "0");
+                       } else {
+                               cmd = FuncRequest(LFUN_PRIMARY_SELECTION_PASTE,
+                                                 "paragraph");
+                       }
                        doDispatch(cur, cmd);
                }
                break;
@@ -526,8 +537,13 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_MOUSE_RELEASE:
                //lyxerr << "# InsetTabular::MouseRelease\n" << bvcur << endl;
                if (cmd.button() == mouse_button::button1) {
-                       if (bvcur.selection())
-                               theSelection().haveSelection(true);
+                       if (bvcur.selection()) {
+                               // Bug3238: disable persistent selection for table cells for now
+                               if (tablemode(bvcur))
+                                       theSelection().haveSelection(true);
+                               else
+                                       saveSelection(bvcur);
+                       }
                } else if (cmd.button() == mouse_button::button3)
                        InsetTabularMailer(*this).showDialog(&cur.bv());
                break;
@@ -535,11 +551,13 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_CELL_BACKWARD:
                movePrevCell(cur);
                cur.selection() = false;
+               saveSelection(cur);
                break;
 
        case LFUN_CELL_FORWARD:
                moveNextCell(cur);
                cur.selection() = false;
+               saveSelection(cur);
                break;
 
        case LFUN_CHAR_FORWARD_SELECT:
@@ -547,6 +565,8 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
                cell(cur.idx())->dispatch(cur, cmd);
                if (!cur.result().dispatched()) {
                        isRightToLeft(cur) ? movePrevCell(cur) : moveNextCell(cur);
+                       if (cmd.action == LFUN_CHAR_FORWARD_SELECT)
+                               saveSelection(cur);
                        if (sl == cur.top())
                                cmd = FuncRequest(LFUN_FINISHED_RIGHT);
                        else
@@ -559,6 +579,8 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
                cell(cur.idx())->dispatch(cur, cmd);
                if (!cur.result().dispatched()) {
                        isRightToLeft(cur) ? moveNextCell(cur) : movePrevCell(cur);
+                       if (cmd.action == LFUN_CHAR_BACKWARD_SELECT)
+                               saveSelection(cur);
                        if (sl == cur.top())
                                cmd = FuncRequest(LFUN_FINISHED_LEFT);
                        else
@@ -580,6 +602,13 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
                                TextMetrics const & tm =
                                        cur.bv().textMetrics(cell(cur.idx())->getText(0));
                                cur.pos() = tm.x2pos(cur.pit(), 0, cur.targetX());
+                               if (cmd.action == LFUN_DOWN_SELECT) {
+                                       // Bug3238: disable persistent selection for table cells for now
+                                       if (tablemode(cur))
+                                               theSelection().haveSelection(true);
+                                       else
+                                               saveSelection(cur);
+                               }
                        }
                if (sl == cur.top()) {
                        // we trick it to go to the RIGHT after leaving the
@@ -605,6 +634,13 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
                                ParagraphMetrics const & pm =
                                        tm.parMetrics(cur.lastpit());
                                cur.pos() = tm.x2pos(cur.pit(), pm.rows().size()-1, cur.targetX());
+                               if (cmd.action == LFUN_UP_SELECT) {
+                                       // Bug3238: disable persistent selection for table cells for now
+                                       if (tablemode(cur))
+                                               theSelection().haveSelection(true);
+                                       else
+                                               saveSelection(cur);
+                               }
                        }
                if (sl == cur.top()) {
                        cmd = FuncRequest(LFUN_FINISHED_UP);
@@ -661,12 +697,12 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
                break;
 
        // insert file functions
-       case LFUN_FILE_INSERT_ASCII_PARA:
-       case LFUN_FILE_INSERT_ASCII: {
+       case LFUN_FILE_INSERT_PLAINTEXT_PARA:
+       case LFUN_FILE_INSERT_PLAINTEXT: {
                // FIXME UNICODE
-               string const tmpstr = getContentsOfAsciiFile(&cur.bv(), to_utf8(cmd.argument()), false);
+               string const tmpstr = getContentsOfPlaintextFile(&cur.bv(), to_utf8(cmd.argument()), false);
                // FIXME: We don't know the encoding of the file
-               if (!tmpstr.empty() && !insertAsciiString(cur.bv(), from_utf8(tmpstr), false))
+               if (!tmpstr.empty() && !insertPlaintextString(cur.bv(), from_utf8(tmpstr), false))
                        cur.undispatched();
                break;
        }
@@ -705,14 +741,14 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_CLIPBOARD_PASTE:
        case LFUN_PRIMARY_SELECTION_PASTE: {
                docstring const clip = (cmd.action == LFUN_CLIPBOARD_PASTE) ?
-                       theClipboard().get() :
+                       theClipboard().getAsText() :
                        theSelection().get();
                if (clip.empty())
                        break;
-               // pass to InsertAsciiString, but
+               // pass to InsertPlaintextString, but
                // only if we have multi-cell content
                if (clip.find_first_of(from_ascii("\t\n")) != docstring::npos) {
-                       if (insertAsciiString(cur.bv(), clip, false)) {
+                       if (insertPlaintextString(cur.bv(), clip, false)) {
                                // content has been replaced,
                                // so cursor might be invalid
                                cur.pos() = cur.lastpos();
@@ -728,7 +764,7 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_PASTE:
                if (tabularStackDirty() && theClipboard().isInternal()) {
                        recordUndoInset(cur, Undo::INSERT);
-                       pasteSelection(cur);
+                       pasteClipboard(cur);
                        break;
                }
                cell(cur.idx())->dispatch(cur, cmd);
@@ -1057,22 +1093,24 @@ bool InsetTabular::getStatus(LCursor & cur, FuncRequest const & cmd,
 
 
 int InsetTabular::latex(Buffer const & buf, odocstream & os,
-                       OutputParams const & runparams) const
+                        OutputParams const & runparams) const
 {
        return tabular.latex(buf, os, runparams);
 }
 
 
 int InsetTabular::plaintext(Buffer const & buf, odocstream & os,
-                       OutputParams const & runparams) const
+                            OutputParams const & runparams) const
 {
-       int const dp = runparams.linelen ? runparams.depth : 0;
-       return tabular.plaintext(buf, os, runparams, dp, false, 0);
+       os << '\n'; // output table on a new line
+       int const dp = runparams.linelen > 0 ? runparams.depth : 0;
+       tabular.plaintext(buf, os, runparams, dp, false, 0);
+       return PLAINTEXT_NEWLINE;
 }
 
 
 int InsetTabular::docbook(Buffer const & buf, odocstream & os,
-                         OutputParams const & runparams) const
+                          OutputParams const & runparams) const
 {
        int ret = 0;
        InsetBase * master = 0;
@@ -1253,8 +1291,6 @@ void InsetTabular::resetPos(LCursor & cur) const
        }
 
        cur.updateFlags(Update::Force | Update::FitCursor);
-
-       InsetTabularMailer(*this).updateDialog(&bv);
 }
 
 
@@ -1742,8 +1778,6 @@ void InsetTabular::tabularFeatures(LCursor & cur,
        case LyXTabular::LAST_ACTION:
                break;
        }
-
-       InsetTabularMailer(*this).updateDialog(&bv);
 }
 
 
@@ -1794,19 +1828,22 @@ bool InsetTabular::copySelection(LCursor & cur)
                                    true, true);
 
        odocstringstream os;
-       OutputParams const runparams;
+       OutputParams const runparams(0);
        paste_tabular->plaintext(cur.buffer(), os, runparams, 0, true, '\t');
-       theClipboard().put(os.str());
+       // Needed for the "Edit->Paste recent" menu and the system clipboard.
+       cap::copySelection(cur, os.str());
+
        // mark tabular stack dirty
        // FIXME: this is a workaround for bug 1919. Should be removed for 1.5,
        // when we (hopefully) have a one-for-all paste mechanism.
+       // This must be called after cap::copySelection.
        dirtyTabularStack(true);
 
        return true;
 }
 
 
-bool InsetTabular::pasteSelection(LCursor & cur)
+bool InsetTabular::pasteClipboard(LCursor & cur)
 {
        if (!paste_tabular)
                return false;
@@ -1868,6 +1905,7 @@ void InsetTabular::cutSelection(LCursor & cur)
        if (cur.pos() > cur.lastpos())
                cur.pos() = cur.lastpos();
        cur.clearSelection();
+       theSelection().haveSelection(false);
 }
 
 
@@ -1915,17 +1953,17 @@ void InsetTabular::setChange(Change const & change)
 }
 
 
-void InsetTabular::acceptChanges()
+void InsetTabular::acceptChanges(BufferParams const & bparams)
 {
        for (idx_type idx = 0; idx < nargs(); ++idx)
-               cell(idx)->acceptChanges();
+               cell(idx)->acceptChanges(bparams);
 }
 
 
-void InsetTabular::rejectChanges()
+void InsetTabular::rejectChanges(BufferParams const & bparams)
 {
        for (idx_type idx = 0; idx < nargs(); ++idx)
-               cell(idx)->rejectChanges();
+               cell(idx)->rejectChanges(bparams);
 }
 
 
@@ -1935,7 +1973,7 @@ bool InsetTabular::forceDefaultParagraphs(idx_type cell) const
 }
 
 
-bool InsetTabular::insertAsciiString(BufferView & bv, docstring const & buf,
+bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf,
                                     bool usePaste)
 {
        if (buf.length() <= 0)