summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuong Nguyen <dnguyen>2008-08-20 21:36:46 +0000
committerDuong Nguyen <dnguyen>2008-08-20 21:36:46 +0000
commit193008c7f69b4eacf5f30227fd1a6e79da404ef9 (patch)
treeb62e25e8f742af9508a3112e479d0dac2a678c66
parent1963a7c563444717b269cec2785fd1215a827849 (diff)
downloadeclipse.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
-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/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
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;