diff options
author | Duong Nguyen <dnguyen> | 2008-08-20 21:36:46 +0000 |
---|---|---|
committer | Duong Nguyen <dnguyen> | 2008-08-20 21:36:46 +0000 |
commit | 193008c7f69b4eacf5f30227fd1a6e79da404ef9 (patch) | |
tree | b62e25e8f742af9508a3112e479d0dac2a678c66 | |
parent | 1963a7c563444717b269cec2785fd1215a827849 (diff) | |
download | eclipse.platform.swt-193008c7f69b4eacf5f30227fd1a6e79da404ef9.tar.gz eclipse.platform.swt-193008c7f69b4eacf5f30227fd1a6e79da404ef9.tar.xz eclipse.platform.swt-193008c7f69b4eacf5f30227fd1a6e79da404ef9.zip |
Bug 200743 - [Clipboard] Copy/Paste intermittently doesn't work for a line of text - back port for 3.4.1
8 files changed, 32 insertions, 8 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ByteArrayTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ByteArrayTransfer.java index 14c330839d..d33f8815ae 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ByteArrayTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ByteArrayTransfer.java @@ -193,7 +193,7 @@ protected Object nativeToJava(TransferData transferData) { FORMATETC formatetc = transferData.formatetc; STGMEDIUM stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result != COM.S_OK) return null; int /*long*/ hMem = stgmedium.unionField; diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/FileTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/FileTransfer.java index 57176f7691..8acb6456d1 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/FileTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/FileTransfer.java @@ -117,7 +117,7 @@ public Object nativeToJava(TransferData transferData) { formatetc.tymed = COM.TYMED_HGLOBAL; STGMEDIUM stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = dataObject.GetData(formatetc, stgmedium); + transferData.result = getData(dataObject, formatetc, stgmedium); dataObject.Release(); if (transferData.result != COM.S_OK) return null; // How many files are there? diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java index 45319d6337..9664d49d67 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java @@ -134,7 +134,7 @@ public Object nativeToJava(TransferData transferData){ STGMEDIUM stgmedium = new STGMEDIUM(); FORMATETC formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result != COM.S_OK) return null; int /*long*/ hMem = stgmedium.unionField; diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ImageTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ImageTransfer.java index 45295ff8ad..96bb239570 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ImageTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ImageTransfer.java @@ -143,7 +143,7 @@ public Object nativeToJava(TransferData transferData) { formatetc.tymed = COM.TYMED_HGLOBAL; STGMEDIUM stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = dataObject.GetData(formatetc, stgmedium); + transferData.result = getData(dataObject, formatetc, stgmedium); if (transferData.result != COM.S_OK) return null; int /*long*/ hMem = stgmedium.unionField; diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java index 1b09d64cf3..f8da4986c4 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java @@ -97,7 +97,7 @@ public Object nativeToJava(TransferData transferData){ STGMEDIUM stgmedium = new STGMEDIUM(); FORMATETC formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result != COM.S_OK) return null; int /*long*/ hMem = stgmedium.unionField; diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/TextTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/TextTransfer.java index 6d00e849ff..94b3cf0fed 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/TextTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/TextTransfer.java @@ -118,7 +118,7 @@ public Object nativeToJava(TransferData transferData){ FORMATETC formatetc = transferData.formatetc; STGMEDIUM stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result != COM.S_OK) return null; int /*long*/ hMem = stgmedium.unionField; diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Transfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Transfer.java index e05f6de3b9..4a7f318b21 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Transfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Transfer.java @@ -11,6 +11,7 @@ package org.eclipse.swt.dnd; +import org.eclipse.swt.internal.ole.win32.*; import org.eclipse.swt.internal.win32.*; /** @@ -29,7 +30,30 @@ import org.eclipse.swt.internal.win32.*; * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> */ public abstract class Transfer { - + +private static final int RETRY_LIMIT = 10; +/* + * Feature in Windows. When another application has control + * of the clipboard, the clipboard is locked and it's not + * possible to retrieve data until the other application is + * finished. To allow other applications to get the + * data, use PeekMessage() to enable cross thread + * message sends. + */ +int getData(IDataObject dataObject, FORMATETC pFormatetc, STGMEDIUM pmedium) { + if (dataObject.GetData(pFormatetc, pmedium) == COM.S_OK) return COM.S_OK; + try {Thread.sleep(50);} catch (Throwable t) {} + int result = dataObject.GetData(pFormatetc, pmedium); + int retryCount = 0; + while (result != COM.S_OK && retryCount++ < RETRY_LIMIT) { + MSG msg = new MSG(); + OS.PeekMessage(msg, 0, 0, 0, OS.PM_NOREMOVE | OS.PM_NOYIELD); + try {Thread.sleep(50);} catch (Throwable t) {} + result = dataObject.GetData(pFormatetc, pmedium); + } + return result; +} + /** * Returns a list of the platform specific data types that can be converted using * this transfer agent. diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/URLTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/URLTransfer.java index d023efc328..71935b45ad 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/URLTransfer.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/URLTransfer.java @@ -98,7 +98,7 @@ public Object nativeToJava(TransferData transferData){ STGMEDIUM stgmedium = new STGMEDIUM(); FORMATETC formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result != COM.S_OK) return null; int /*long*/ hMem = stgmedium.unionField; |