Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuong Nguyen2008-07-21 21:00:10 +0000
committerDuong Nguyen2008-07-21 21:00:10 +0000
commitafc1b788fbddcdd8231d3fd558befedc61c9e191 (patch)
tree2378f143894b51955adedd515f0235d6f433e8b5
parenteff47360c716fb7feca3a4b5c89fcc38497dde8e (diff)
downloadeclipse.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
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ByteArrayTransfer.java2
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Clipboard.java4
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/FileTransfer.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/ImageTransfer.java2
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java2
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/TextTransfer.java2
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/Transfer.java26
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/URLTransfer.java2
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;

Back to the top