changeset 320:da968414c383

Merge changes SWT 3.4.1
author Frank Benoit <benoit@tionex.de>
date Mon, 03 Nov 2008 21:58:40 +0100
parents 71b78d56f01f
children a3b84f877e63
files dwt/custom/CCombo.d dwt/dnd/ByteArrayTransfer.d dwt/dnd/FileTransfer.d dwt/dnd/HTMLTransfer.d dwt/dnd/ImageTransfer.d dwt/dnd/RTFTransfer.d dwt/dnd/TextTransfer.d dwt/dnd/Transfer.d dwt/dnd/URLTransfer.d dwt/internal/Library.d dwt/internal/win32/OS.d dwt/widgets/Composite.d dwt/widgets/Decorations.d dwt/widgets/MessageBox.d dwt/widgets/ProgressBar.d dwt/widgets/Table.d
diffstat 16 files changed, 61 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/dwt/custom/CCombo.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/custom/CCombo.d	Mon Nov 03 21:58:40 2008 +0100
@@ -532,7 +532,7 @@
     list.deselectAll ();
 }
 void dropDown (bool drop) {
-    if (drop is isDropped () || !isVisible()) return;
+    if (drop is isDropped ()) return;
     if (!drop) {
         popup.setVisible (false);
         if (!isDisposed () && isFocusControl()) {
@@ -540,7 +540,7 @@
         }
         return;
     }
-
+    if (!isVisible()) return;
     if (getShell() !is popup.getParent ()) {
         String[] items = list.getItems ();
         int selectionIndex = list.getSelectionIndex ();
--- a/dwt/dnd/ByteArrayTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/ByteArrayTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -202,7 +202,7 @@
     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 !is COM.S_OK) return null;
     auto hMem = stgmedium.unionField;
--- a/dwt/dnd/FileTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/FileTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -138,7 +138,7 @@
     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 !is COM.S_OK) return null;
     // How many files are there?
--- a/dwt/dnd/HTMLTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/HTMLTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -161,7 +161,7 @@
     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 !is COM.S_OK) return null;
     auto hMem = stgmedium.unionField;
--- a/dwt/dnd/ImageTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/ImageTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -157,7 +157,7 @@
     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 !is COM.S_OK) return null;
     HANDLE hMem = stgmedium.unionField;
--- a/dwt/dnd/RTFTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/RTFTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -118,7 +118,7 @@
     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 !is COM.S_OK) return null;
     auto hMem = stgmedium.unionField;
--- a/dwt/dnd/TextTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/TextTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -135,7 +135,7 @@
     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 !is COM.S_OK) return null;
     auto hMem = stgmedium.unionField;
--- a/dwt/dnd/Transfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/Transfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -35,6 +35,29 @@
  */
 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) is COM.S_OK) return COM.S_OK;
+    try {Thread.sleep(0.050);} catch (Exception t) {}
+    int result = dataObject.GetData(pFormatetc, pmedium);
+    int retryCount = 0;
+    while (result !is 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(0.050);} catch (Exception 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.
--- a/dwt/dnd/URLTransfer.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/dnd/URLTransfer.d	Mon Nov 03 21:58:40 2008 +0100
@@ -118,7 +118,7 @@
     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 !is COM.S_OK) return null;
     auto hMem = stgmedium.unionField;
--- a/dwt/internal/Library.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/internal/Library.d	Mon Nov 03 21:58:40 2008 +0100
@@ -34,7 +34,7 @@
     /**
      * DWT Minor version number (must be in the range 0..999)
      */
-    static const int MINOR_VERSION = 448;
+    static const int MINOR_VERSION = 449;
 
     /**
      * DWT revision number (must be >= 0)
--- a/dwt/internal/win32/OS.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/internal/win32/OS.d	Mon Nov 03 21:58:40 2008 +0100
@@ -1346,6 +1346,7 @@
     public static const int MB_OKCANCEL = 0x1;
     public static const int MB_PRECOMPOSED = 0x1;
     public static const int MB_RETRYCANCEL = 0x5;
+    public static const int MB_RIGHT = 0x00080000;
     public static const int MB_RTLREADING = 0x100000;
     public static const int MB_SYSTEMMODAL = 0x1000;
     public static const int MB_TASKMODAL = 0x2000;
--- a/dwt/widgets/Composite.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/widgets/Composite.d	Mon Nov 03 21:58:40 2008 +0100
@@ -910,7 +910,7 @@
         defer = false;
     }
     if (!defer && (state & CANVAS) !is 0) {
-        state &= ~RESIZE_OCCURRED | MOVE_OCCURRED;
+        state &= ~(RESIZE_OCCURRED | MOVE_OCCURRED);
         state |= RESIZE_DEFERRED | MOVE_DEFERRED;
     }
     super.setBounds (x, y, width, height, flags, defer);
--- a/dwt/widgets/Decorations.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/widgets/Decorations.d	Mon Nov 03 21:58:40 2008 +0100
@@ -1405,7 +1405,18 @@
                 oldWidth = rect.width;
                 oldHeight = rect.height;
             }
-            OS.UpdateWindow (handle);
+            /*
+            * Bug in Windows.  On Vista using the Classic theme, 
+            * when the window is hung and UpdateWindow() is called,
+            * nothing is drawn, and outstanding WM_PAINTs are cleared.
+            * This causes pixel corruption.  The fix is to avoid calling
+            * update on hung windows.  
+            */
+            bool update = true;
+            if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0) && !OS.IsAppThemed ()) {
+                update = !OS.IsHungAppWindow (handle);
+            }
+            if (update) OS.UpdateWindow (handle);
         }
     } else {
         static if (!OS.IsWinCE) {
--- a/dwt/widgets/MessageBox.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/widgets/MessageBox.d	Mon Nov 03 21:58:40 2008 +0100
@@ -176,10 +176,10 @@
     }
 
     int bits = buttonBits | iconBits | modalBits;
-    if ((style & DWT.RIGHT_TO_LEFT) !is 0) bits |= OS.MB_RTLREADING;
+    if ((style & DWT.RIGHT_TO_LEFT) !is 0) bits |= OS.MB_RTLREADING | OS.MB_RIGHT;
     if ((style & (DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT)) is 0) {
         if (parent !is null && (parent.style & DWT.MIRRORED) !is 0) {
-            bits |= OS.MB_RTLREADING;
+            bits |= OS.MB_RTLREADING | OS.MB_RIGHT;
         }
     }
 
--- a/dwt/widgets/ProgressBar.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/widgets/ProgressBar.d	Mon Nov 03 21:58:40 2008 +0100
@@ -340,19 +340,26 @@
     checkWidget ();
     /*
     * Feature in Vista.  When the progress bar is not in
-    * a normal state, PBM_SETPOS does not set the position.
+    * a normal state, PBM_SETPOS does not set the position
+    * of the bar when the selection is equal to the minimum.
     * This is undocumented.  The fix is to temporarily
     * set the state to PBST_NORMAL, set the position, then
     * reset the state.
     */
     int /*long*/ state = 0;
+    bool fixSelection = false;
     if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) {
-        state = OS.SendMessage (handle, OS.PBM_GETSTATE, 0, 0);
-        OS.SendMessage (handle, OS.PBM_SETSTATE, OS.PBST_NORMAL, 0);
+        int /*long*/ minumum = OS.SendMessage (handle, OS.PBM_GETRANGE, 1, 0);
+        int /*long*/ selection = OS.SendMessage (handle, OS.PBM_GETPOS, 0, 0);
+        if (selection is minumum) {
+            fixSelection = true;
+            state = OS.SendMessage (handle, OS.PBM_GETSTATE, 0, 0);
+            OS.SendMessage (handle, OS.PBM_SETSTATE, OS.PBST_NORMAL, 0);
+        }
     }
     OS.SendMessage (handle, OS.PBM_SETPOS, value, 0);
     if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) {
-        OS.SendMessage (handle, OS.PBM_SETSTATE, state, 0);
+        if (fixSelection) OS.SendMessage (handle, OS.PBM_SETSTATE, state, 0);
     }
 }
 
--- a/dwt/widgets/Table.d	Thu Oct 23 23:41:09 2008 +0200
+++ b/dwt/widgets/Table.d	Mon Nov 03 21:58:40 2008 +0100
@@ -5440,7 +5440,7 @@
         * 
         * The fix for both cases is to create the image using PrintWindow(). 
         */
-        if ((!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) || hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) {
+        if ((!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) || (style & DWT.VIRTUAL) !is 0 || hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) {
             int topIndex = OS.SendMessage (handle, OS.LVM_GETTOPINDEX, 0, 0);
             int selection = OS.SendMessage (handle, OS.LVM_GETNEXTITEM, topIndex - 1, OS.LVNI_SELECTED);
             if (selection is -1) return 0;