Let LFUN_PASTE always paste the most recent clipboard (internal or system)

* src/insets/insettabular.C
	(InsetTabular::doDispatch): Only paste the tabular clipboard if the
	system clipboard is not newer, else let the current cell paste the
	system clipboard
	(InsetTabular::getStatus): Only decide whether to enable LFUN_PASTE
	if the tabular clipboard is not empty and the system clipboard is
	not newer, else let the current cell decide.

	* src/mathed/InsetMathGrid.C
	(InsetMathGrid::doDispatch): Use the system clipboard for LFUN_PASTE
	if it is newer.

	* src/mathed/InsetMathNest.C
	(InsetMathNest::doDispatch): Use the system clipboard for LFUN_PASTE
	if it is newer.

	* src/text3.C
	(doInsertInset): Add a "0" argument to LFUN_PASTE, because we always
	want to use the internal clipboard here
	(LyXText::dispatch): ditto (when handling mouse button 2 press)
	(LyXText::dispatch): Use the system clipboard for LFUN_PASTE if it
	is newer.
	(LyXText::getStatus): Also enable LFUN_PASTE if the system clipboard
	is owned by another application


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16498 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2007-01-04 12:05:24 +00:00
parent 9d1dbb6f61
commit 8f2243819a
4 changed files with 54 additions and 20 deletions

View File

@ -723,7 +723,7 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
} }
case LFUN_PASTE: case LFUN_PASTE:
if (tabularStackDirty()) { if (tabularStackDirty() && theClipboard().isInternal()) {
recordUndoInset(cur, Undo::INSERT); recordUndoInset(cur, Undo::INSERT);
pasteSelection(cur); pasteSelection(cur);
break; break;
@ -1033,7 +1033,7 @@ bool InsetTabular::getStatus(LCursor & cur, FuncRequest const & cmd,
} }
case LFUN_PASTE: case LFUN_PASTE:
if (tabularStackDirty()) { if (tabularStackDirty() && theClipboard().isInternal()) {
status.enabled(true); status.enabled(true);
return true; return true;
} else } else

View File

@ -25,6 +25,7 @@
#include "gettext.h" #include "gettext.h"
#include "undo.h" #include "undo.h"
#include "frontends/Clipboard.h"
#include "frontends/Painter.h" #include "frontends/Painter.h"
#include "insets/mailinset.h" #include "insets/mailinset.h"
@ -1210,11 +1211,19 @@ void InsetMathGrid::doDispatch(LCursor & cur, FuncRequest & cmd)
case LFUN_PASTE: { case LFUN_PASTE: {
cur.message(_("Paste")); cur.message(_("Paste"));
cap::replaceSelection(cur); cap::replaceSelection(cur);
istringstream is(to_utf8(cmd.argument())); docstring topaste;
if (cmd.argument().empty() && !theClipboard().isInternal())
topaste = theClipboard().get();
else {
idocstringstream is(cmd.argument());
int n = 0; int n = 0;
is >> n; is >> n;
topaste = cap::getSelection(cur.buffer(), n);
}
InsetMathGrid grid(1, 1); InsetMathGrid grid(1, 1);
mathed_parse_normal(grid, cap::getSelection(cur.buffer(), n)); if (!topaste.empty())
mathed_parse_normal(grid, topaste);
if (grid.nargs() == 1) { if (grid.nargs() == 1) {
// single cell/part of cell // single cell/part of cell
recordUndo(cur); recordUndo(cur);

View File

@ -50,6 +50,7 @@
#include "support/lstrings.h" #include "support/lstrings.h"
#include "frontends/Clipboard.h"
#include "frontends/Painter.h" #include "frontends/Painter.h"
#include "frontends/Selection.h" #include "frontends/Selection.h"
@ -437,11 +438,16 @@ void InsetMathNest::doDispatch(LCursor & cur, FuncRequest & cmd)
recordUndo(cur); recordUndo(cur);
cur.message(_("Paste")); cur.message(_("Paste"));
replaceSelection(cur); replaceSelection(cur);
docstring topaste;
if (cmd.argument().empty() && !theClipboard().isInternal())
topaste = theClipboard().get();
else {
size_t n = 0; size_t n = 0;
istringstream is(to_utf8(cmd.argument())); idocstringstream is(cmd.argument());
is >> n; is >> n;
docstring const selection = cap::getSelection(cur.buffer(), n); topaste = cap::getSelection(cur.buffer(), n);
cur.niceInsert(selection); }
cur.niceInsert(topaste);
cur.clearSelection(); // bug 393 cur.clearSelection(); // bug 393
cur.bv().switchKeyMap(); cur.bv().switchKeyMap();
finishUndo(); finishUndo();

View File

@ -267,7 +267,7 @@ bool doInsertInset(LCursor & cur, LyXText * text,
inset->edit(cur, true); inset->edit(cur, true);
if (gotsel && pastesel) { if (gotsel && pastesel) {
lyx::dispatch(FuncRequest(LFUN_PASTE)); lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
// reset first par to default // reset first par to default
if (cur.lastpit() != 0 || cur.lastpos() != 0) { if (cur.lastpit() != 0 || cur.lastpos() != 0) {
LyXLayout_ptr const layout = LyXLayout_ptr const layout =
@ -756,13 +756,16 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
case LFUN_PASTE: case LFUN_PASTE:
cur.message(_("Paste")); cur.message(_("Paste"));
cap::replaceSelection(cur); cap::replaceSelection(cur);
if (isStrUnsignedInt(to_utf8(cmd.argument()))) if (cmd.argument().empty() && !theClipboard().isInternal())
pasteSelection(cur, bv->buffer()->errorList("Paste"), pasteString(cur, theClipboard().get(), docstring());
convert<unsigned int>(to_utf8(cmd.argument()))); else {
else string const arg(to_utf8(cmd.argument()));
pasteSelection(cur, bv->buffer()->errorList("Paste"), pasteSelection(cur, bv->buffer()->errorList("Paste"),
isStrUnsignedInt(arg) ?
convert<unsigned int>(arg) :
0); 0);
bv->buffer()->errors("Paste"); bv->buffer()->errors("Paste");
}
cur.clearSelection(); // bug 393 cur.clearSelection(); // bug 393
bv->switchKeyMap(); bv->switchKeyMap();
finishUndo(); finishUndo();
@ -968,7 +971,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
// insert this // insert this
if (cmd.button() == mouse_button::button2) { if (cmd.button() == mouse_button::button2) {
if (paste_internally) if (paste_internally)
lyx::dispatch(FuncRequest(LFUN_PASTE)); lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
else else
lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph")); lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph"));
} }
@ -1721,7 +1724,23 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
break; break;
case LFUN_PASTE: case LFUN_PASTE:
// FIXME: This is not correct, but the correct code below is
// expensive
enable = cap::numberOfSelections() > 0 ||
!theClipboard().isInternal();
#if 0
if (cmd.argument().empty()) {
if (theClipboard().isInternal())
enable = cap::numberOfSelections() > 0; enable = cap::numberOfSelections() > 0;
else
enable = !theClipboard().get().empty();
} else if (isStrUnsignedInt(to_utf8(cmd.argument()))) {
int n = convert<unsigned int>(to_utf8(cmd.argument()));
enable = cap::numberOfSelections() > n;
} else
// unknown argument
enable = false;
#endif
break; break;
case LFUN_PARAGRAPH_MOVE_UP: case LFUN_PARAGRAPH_MOVE_UP: