X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettabular.C;h=202ac6fa44bb8495781e2a56dd4919f2a87029ff;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=38e15117994909797d16ab706683a785a6ae26aa;hpb=129f5b6431e03f799446c919680acff580bc39d4;p=lyx.git diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 38e1511799..202ac6fa44 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -501,7 +501,17 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd) } if (cmd.button() == mouse_button::button2) { - cmd = FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph"); + if (bvcur.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(bvcur); + cmd = FuncRequest(LFUN_PASTE, "0"); + } else { + cmd = FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, + "paragraph"); + } doDispatch(cur, cmd); } break; @@ -525,7 +535,10 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd) case LFUN_MOUSE_RELEASE: //lyxerr << "# InsetTabular::MouseRelease\n" << bvcur << endl; - if (cmd.button() == mouse_button::button3) + if (cmd.button() == mouse_button::button1) { + if (bvcur.selection()) + theSelection().haveSelection(true); + } else if (cmd.button() == mouse_button::button3) InsetTabularMailer(*this).showDialog(&cur.bv()); break; @@ -544,6 +557,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) + theSelection().haveSelection(cur.selection()); if (sl == cur.top()) cmd = FuncRequest(LFUN_FINISHED_RIGHT); else @@ -556,6 +571,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) + theSelection().haveSelection(cur.selection()); if (sl == cur.top()) cmd = FuncRequest(LFUN_FINISHED_LEFT); else @@ -577,6 +594,8 @@ 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) + theSelection().haveSelection(cur.selection()); } if (sl == cur.top()) { // we trick it to go to the RIGHT after leaving the @@ -602,6 +621,8 @@ 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) + theSelection().haveSelection(cur.selection()); } if (sl == cur.top()) { cmd = FuncRequest(LFUN_FINISHED_UP); @@ -658,12 +679,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; } @@ -702,14 +723,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(); @@ -723,7 +744,7 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd) } case LFUN_PASTE: - if (tabularStackDirty()) { + if (tabularStackDirty() && theClipboard().isInternal()) { recordUndoInset(cur, Undo::INSERT); pasteSelection(cur); break; @@ -1033,10 +1054,11 @@ bool InsetTabular::getStatus(LCursor & cur, FuncRequest const & cmd, } case LFUN_PASTE: - if (tabularStackDirty()) { + if (tabularStackDirty() && theClipboard().isInternal()) { status.enabled(true); return true; - } + } else + return cell(cur.idx())->getStatus(cur, cmd, status); case LFUN_INSET_MODIFY: if (translate(cmd.getArg(0)) == TABULAR_CODE) { @@ -1249,8 +1271,6 @@ void InsetTabular::resetPos(LCursor & cur) const } cur.updateFlags(Update::Force | Update::FitCursor); - - InsetTabularMailer(*this).updateDialog(&bv); } @@ -1430,7 +1450,7 @@ void InsetTabular::tabularFeatures(LCursor & cur, case LyXTabular::SET_SPECIAL_COLUMN: case LyXTabular::SET_SPECIAL_MULTI: - tabular.setAlignSpecial(cur.idx(),value,feature); + tabular.setAlignSpecial(cur.idx(), from_utf8(value), feature); break; case LyXTabular::APPEND_ROW: @@ -1738,8 +1758,6 @@ void InsetTabular::tabularFeatures(LCursor & cur, case LyXTabular::LAST_ACTION: break; } - - InsetTabularMailer(*this).updateDialog(&bv); } @@ -1792,10 +1810,13 @@ bool InsetTabular::copySelection(LCursor & cur) odocstringstream os; OutputParams const runparams; 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; @@ -1864,6 +1885,7 @@ void InsetTabular::cutSelection(LCursor & cur) if (cur.pos() > cur.lastpos()) cur.pos() = cur.lastpos(); cur.clearSelection(); + theSelection().haveSelection(false); } @@ -1931,7 +1953,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)