diff dwt/dnd/TableDragSourceEffect.d @ 213:36f5cb12e1a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Sat, 17 May 2008 17:34:28 +0200
parents 3afcd4ddcf90
children fd9c62a2998e
line wrap: on
line diff
--- a/dwt/dnd/TableDragSourceEffect.d	Mon May 05 00:12:38 2008 +0200
+++ b/dwt/dnd/TableDragSourceEffect.d	Sat May 17 17:34:28 2008 +0200
@@ -14,6 +14,8 @@
 
 import dwt.DWT;
 import dwt.graphics.Image;
+import dwt.graphics.ImageData;
+import dwt.graphics.PaletteData;
 import dwt.graphics.Rectangle;
 import dwt.internal.win32.OS;
 import dwt.widgets.Display;
@@ -87,10 +89,78 @@
     Image getDragSourceImage(DragSourceEvent event) {
         if (dragSourceImage !is null) dragSourceImage.dispose();
         dragSourceImage = null;
+        if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) {
+            SHDRAGIMAGE shdi;
+            int DI_GETDRAGIMAGE = OS.RegisterWindowMessage ( "ShellGetDragImage"w.ptr ); //$NON-NLS-1$
+            if (OS.SendMessage (control.handle, DI_GETDRAGIMAGE, 0, &shdi) !is 0) {
+                event.x += shdi.ptOffset.x;
+                event.y += shdi.ptOffset.y;
+                auto hImage = shdi.hbmpDragImage;
+                if (hImage !is null) {
+                    BITMAP bm;
+                    OS.GetObject (hImage, BITMAP.sizeof, &bm);
+                    int srcWidth = bm.bmWidth;
+                    int srcHeight = bm.bmHeight;
+
+                    /* Create resources */
+                    auto hdc = OS.GetDC (null);
+                    auto srcHdc = OS.CreateCompatibleDC (hdc);
+                    auto oldSrcBitmap = OS.SelectObject (srcHdc, hImage);
+                    auto memHdc = OS.CreateCompatibleDC (hdc);
+                    BITMAPINFOHEADER bmiHeader;
+                    bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
+                    bmiHeader.biWidth = srcWidth;
+                    bmiHeader.biHeight = -srcHeight;
+                    bmiHeader.biPlanes = 1;
+                    bmiHeader.biBitCount = 32;
+                    bmiHeader.biCompression = OS.BI_RGB;
+                    void* pBits;
+                    auto memDib = OS.CreateDIBSection (null, cast(BITMAPINFO*)&bmiHeader, OS.DIB_RGB_COLORS, &pBits, null, 0);
+                    if (memDib is null) DWT.error (DWT.ERROR_NO_HANDLES);
+                    auto oldMemBitmap = OS.SelectObject (memHdc, memDib);
+
+                    BITMAP dibBM;
+                    OS.GetObject (memDib, BITMAP.sizeof, &dibBM);
+                    int sizeInBytes = dibBM.bmWidthBytes * dibBM.bmHeight;
+
+                    /* Get the foreground pixels */
+                    OS.BitBlt (memHdc, 0, 0, srcWidth, srcHeight, srcHdc, 0, 0, OS.SRCCOPY);
+                    //byte[] srcData = new byte [sizeInBytes];
+                    //OS.MoveMemory (srcData, dibBM.bmBits, sizeInBytes);
+                    byte[] srcData = (cast(byte*) dibBM.bmBits)[ 0 .. BITMAPINFOHEADER.sizeof ];
+
+                    byte[] alphaData = new byte[srcWidth * srcHeight];
+                    int spinc = dibBM.bmWidthBytes - srcWidth * 4;
+                    int ap = 0, sp = 3;
+                    for (int y = 0; y < srcHeight; ++y) {
+                        for (int x = 0; x < srcWidth; ++x) {
+                            alphaData [ap++] = srcData [sp];
+                            sp += 4;
+                        }
+                        sp += spinc;
+                    }
+                    PaletteData palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000);
+                    ImageData data = new ImageData(srcWidth, srcHeight, bm.bmBitsPixel, palette, bm.bmWidthBytes, srcData);
+                    data.alphaData = alphaData;
+                    data.transparentPixel = shdi.crColorKey;
+                    dragSourceImage = new Image(control.getDisplay(), data);
+                    OS.SelectObject (memHdc, oldMemBitmap);
+                    OS.DeleteDC (memHdc);
+                    OS.DeleteObject (memDib);
+                    OS.SelectObject (srcHdc, oldSrcBitmap);
+                    OS.DeleteDC (srcHdc);
+                    OS.ReleaseDC (null, hdc);
+                    return dragSourceImage;
+                }
+            }
+            return null;
+        }
         Table table = cast(Table) control;
+        //TEMPORARY CODE
+        if (table.isListening (DWT.EraseItem) || table.isListening (DWT.PaintItem)) return null;
         TableItem[] selection = table.getSelection();
         if (selection.length is 0) return null;
-        int tableImageList = OS.SendMessage (table.handle, OS.LVM_GETIMAGELIST, OS.LVSIL_SMALL, 0);
+        int /*long*/ tableImageList = OS.SendMessage (table.handle, OS.LVM_GETIMAGELIST, OS.LVSIL_SMALL, 0);
         if (tableImageList !is 0) {
             int count = Math.min(selection.length, 10);
             Rectangle bounds = selection[0].getBounds(0);