diff options
author | Duong Nguyen | 2008-07-21 21:00:10 +0000 |
---|---|---|
committer | Duong Nguyen | 2008-07-21 21:00:10 +0000 |
commit | afc1b788fbddcdd8231d3fd558befedc61c9e191 (patch) | |
tree | 2378f143894b51955adedd515f0235d6f433e8b5 | |
parent | eff47360c716fb7feca3a4b5c89fcc38497dde8e (diff) | |
download | eclipse.platform.swt-afc1b788fbddcdd8231d3fd558befedc61c9e191.tar.gz eclipse.platform.swt-afc1b788fbddcdd8231d3fd558befedc61c9e191.tar.xz eclipse.platform.swt-afc1b788fbddcdd8231d3fd558befedc61c9e191.zip |
Bug 200743 - [Clipboard] Copy/Paste intermittently doesn't work for a line of text
9 files changed, 34 insertions, 10 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/Clipboard.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Clipboard.java index 1f0cca1cc1..100a3d985d 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Clipboard.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Clipboard.java @@ -28,7 +28,7 @@ import org.eclipse.swt.internal.ole.win32.*; */ public class Clipboard { - private static final int RETRY_LIMIT = 100; + private static final int RETRY_LIMIT = 10; private Display display; // ole interfaces @@ -499,7 +499,7 @@ public void setContents(Object[] data, Transfer[] dataTypes, int clipboards) { * message sends. */ int retryCount = 0; - while (result != COM.S_OK && retryCount++ < 10) { + while (result != COM.S_OK && retryCount++ < RETRY_LIMIT) { try {Thread.sleep(50);} catch (Throwable t) {} MSG msg = new MSG(); OS.PeekMessage(msg, 0, 0, 0, OS.PM_NOREMOVE | OS.PM_NOYIELD); 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; |