diff dwt/dnd/DropTarget.d @ 136:04e357b8343d

DragSource
author Frank Benoit <benoit@tionex.de>
date Wed, 13 Feb 2008 14:24:54 +0100
parents 242e33c0e383
children 3665cb9211b2
line wrap: on
line diff
--- a/dwt/dnd/DropTarget.d	Wed Feb 13 04:51:22 2008 +0100
+++ b/dwt/dnd/DropTarget.d	Wed Feb 13 14:24:54 2008 +0100
@@ -16,6 +16,10 @@
 import dwt.DWTError;
 import dwt.DWTException;
 import dwt.internal.ole.win32.COM;
+import dwt.internal.ole.win32.extras;
+import dwt.internal.ole.win32.OBJIDL;
+import dwt.internal.ole.win32.OLEIDL;
+import dwt.internal.ole.win32.ifs;
 import dwt.internal.win32.OS;
 import dwt.widgets.Control;
 import dwt.widgets.Event;
@@ -24,6 +28,14 @@
 import dwt.widgets.Tree;
 import dwt.widgets.Widget;
 
+import dwt.dnd.Transfer;
+import dwt.dnd.DropTargetEffect;
+import dwt.dnd.TransferData;
+import dwt.dnd.DropTargetListener;
+import dwt.dnd.DNDListener;
+import dwt.dnd.DNDEvent;
+import dwt.dnd.DND;
+
 /**
  *
  * Class <code>DropTarget</code> defines the target object for a drag and drop transfer.
@@ -79,7 +91,7 @@
 
     Control control;
     Listener controlListener;
-    Transfer[] transferAgents = new Transfer[0];
+    Transfer[] transferAgents;
     DropTargetEffect dropEffect;
 
     // Track application selections
@@ -95,11 +107,11 @@
     IDataObject iDataObject;
 
     // interfaces
-    COMObject iDropTarget;
+    _IDropTargetImpl iDropTarget;
     int refCount;
 
-    static final String DEFAULT_DROP_TARGET_EFFECT = "DEFAULT_DROP_TARGET_EFFECT"; //$NON-NLS-1$
-    static final String DROPTARGETID = "DropTarget"; //$NON-NLS-1$
+    static final char[] DEFAULT_DROP_TARGET_EFFECT = "DEFAULT_DROP_TARGET_EFFECT"; //$NON-NLS-1$
+    static final char[] DROPTARGETID = "DropTarget"; //$NON-NLS-1$
 
 /**
  * Creates a new <code>DropTarget</code> to allow data to be dropped on the specified
@@ -147,28 +159,28 @@
     if (COM.RegisterDragDrop( control.handle, iDropTarget.getAddress()) !is COM.S_OK)
         DND.error(DND.ERROR_CANNOT_INIT_DROP);
 
-    controlListener = new Listener () {
+    controlListener = new class() Listener {
         public void handleEvent (Event event) {
-            if (!DropTarget.this.isDisposed()){
-                DropTarget.this.dispose();
+            if (!this.outer.isDisposed()){
+                this.outer.dispose();
             }
         }
     };
     control.addListener (DWT.Dispose, controlListener);
 
-    this.addListener(DWT.Dispose, new Listener () {
+    this.addListener(DWT.Dispose, new class() Listener {
         public void handleEvent (Event event) {
             onDispose();
         }
     });
 
     Object effect = control.getData(DEFAULT_DROP_TARGET_EFFECT);
-    if (effect instanceof DropTargetEffect) {
-        dropEffect = (DropTargetEffect) effect;
-    } else if (control instanceof Table) {
-        dropEffect = new TableDropTargetEffect((Table) control);
-    } else if (control instanceof Tree) {
-        dropEffect = new TreeDropTargetEffect((Tree) control);
+    if ( auto dte = cast(DropTargetEffect) effect ) {
+        dropEffect = dte;
+    } else if ( auto table = cast(Table)control ) {
+        dropEffect = new TableDropTargetEffect(table);
+    } else if ( auto tree = cast(Tree)control ) {
+        dropEffect = new TreeDropTargetEffect(tree);
     }
 }
 
@@ -227,30 +239,19 @@
 }
 
 protected void checkSubclass () {
-    String name = getClass().getName ();
-    String validName = DropTarget.class.getName();
-    if (!validName.equals(name)) {
+    char[] name = this.classinfo.name;
+    char[] validName = DropTarget.classinfo.name;
+    if (validName!=/*eq*/name) {
         DND.error (DWT.ERROR_INVALID_SUBCLASS);
     }
 }
 
 void createCOMInterfaces() {
     // register each of the interfaces that this object implements
-    iDropTarget = new COMObject(new int[]{2, 0, 0, 5, 4, 0, 5}){
-        public int method0(int[] args) {return QueryInterface(args[0], args[1]);}
-        public int method1(int[] args) {return AddRef();}
-        public int method2(int[] args) {return Release();}
-        public int method3(int[] args) {return DragEnter(args[0], args[1], args[2], args[3], args[4]);}
-        public int method4(int[] args) {return DragOver(args[0], args[1], args[2], args[3]);}
-        public int method5(int[] args) {return DragLeave();}
-        public int method6(int[] args) {return Drop(args[0], args[1], args[2], args[3], args[4]);}
-    };
-
+    iDropTarget = new _IDropTargetImpl(this);
 }
 
 void disposeCOMInterfaces() {
-    if (iDropTarget !is null)
-        iDropTarget.dispose();
     iDropTarget = null;
 }
 
@@ -262,7 +263,7 @@
 
     DNDEvent event = new DNDEvent();
     if (!setEventData(event, pDataObject, grfKeyState, pt_x, pt_y, pdwEffect)) {
-        OS.MoveMemory(pdwEffect, new int[] {COM.DROPEFFECT_NONE}, 4);
+        *pdwEffect = COM.DROPEFFECT_NONE;
         return COM.S_FALSE;
     }
 
@@ -292,7 +293,7 @@
         selectedOperation = event.detail;
     }
 
-    OS.MoveMemory(pdwEffect, new int[] {opToOs(selectedOperation)}, 4);
+    *pdwEffect = opToOs(selectedOperation);
     return COM.S_OK;
 }
 
@@ -320,7 +321,7 @@
     DNDEvent event = new DNDEvent();
     if (!setEventData(event, iDataObject.getAddress(), grfKeyState, pt_x, pt_y, pdwEffect)) {
         keyOperation = -1;
-        OS.MoveMemory(pdwEffect, new int[] {COM.DROPEFFECT_NONE}, 4);
+        *pdwEffect = COM.DROPEFFECT_NONE;
         return COM.S_FALSE;
     }
 
@@ -355,7 +356,7 @@
         selectedOperation = event.detail;
     }
 
-    OS.MoveMemory(pdwEffect, new int[] {opToOs(selectedOperation)}, 4);
+    *pdwEffect = opToOs(selectedOperation);
     return COM.S_OK;
 }
 
@@ -373,7 +374,7 @@
     event = new DNDEvent();
     if (!setEventData(event, pDataObject, grfKeyState, pt_x, pt_y, pdwEffect)) {
         keyOperation = -1;
-        OS.MoveMemory(pdwEffect, new int[] {COM.DROPEFFECT_NONE}, 4);
+        *pdwEffect = COM.DROPEFFECT_NONE;
         return COM.S_FALSE;
     }
     keyOperation = -1;
@@ -398,7 +399,7 @@
     }
 
     if (selectedOperation is DND.DROP_NONE){
-        OS.MoveMemory(pdwEffect, new int[] {COM.DROPEFFECT_NONE}, 4);
+        *pdwEffect = COM.DROPEFFECT_NONE;
         return COM.S_OK;
     }
 
@@ -430,7 +431,7 @@
         selectedOperation = event.detail;
     }
     //notify source of action taken
-    OS.MoveMemory(pdwEffect, new int[] {opToOs(selectedOperation)}, 4);
+    *pdwEffect = opToOs(selectedOperation);
     return COM.S_OK;
 }
 
@@ -533,17 +534,15 @@
  */
 int QueryInterface(int riid, int ppvObject) {
 
-    if (riid is 0 || ppvObject is 0)
+    if (riid is null || ppvObject is null)
         return COM.E_INVALIDARG;
-    GUID guid = new GUID();
-    COM.MoveMemory(guid, riid, GUID.sizeof);
-    if (COM.IsEqualGUID(guid, COM.IIDIUnknown) || COM.IsEqualGUID(guid, COM.IIDIDropTarget)) {
-        OS.MoveMemory(ppvObject, new int[] {iDropTarget.getAddress()}, 4);
+    if (COM.IsEqualGUID(riid, &COM.IIDIUnknown) || COM.IsEqualGUID(riid, &COM.IIDIDropTarget)) {
+        *ppvObject = cast(void*)cast(IUnknown) iDropTarget.getAddress();
         AddRef();
         return COM.S_OK;
     }
 
-    OS.MoveMemory(ppvObject, new int[] {0}, 4);
+    *ppvObject = null;
     return COM.E_NOINTERFACE;
 }
 
@@ -561,10 +560,10 @@
 void refresh() {
     if (control is null || control.isDisposed()) return;
     int handle = control.handle;
-    RECT lpRect = new RECT();
-    if (OS.GetUpdateRect(handle, lpRect, false)) {
+    RECT lpRect;
+    if (OS.GetUpdateRect(handle, &lpRect, false)) {
         OS.ImageList_DragShowNolock(false);
-        OS.RedrawWindow(handle, lpRect, 0, OS.RDW_UPDATENOW | OS.RDW_INVALIDATE);
+        OS.RedrawWindow(handle, *lpRect, 0, OS.RDW_UPDATENOW | OS.RDW_INVALIDATE);
         OS.ImageList_DragShowNolock(true);
     }
 }
@@ -614,8 +613,8 @@
 
     // get allowed operations
     int style = getStyle();
-    int[] operations = new int[1];
-    OS.MoveMemory(operations, pdwEffect, 4);
+    int[1] operations;
+    OS.MoveMemory(operations.ptr, pdwEffect, 4);
     operations[0] = osToOp(operations[0]) & style;
     if (operations[0] is DND.DROP_NONE) return false;
 
@@ -635,8 +634,8 @@
     IDataObject dataObject = new IDataObject(pDataObject);
     dataObject.AddRef();
     try {
-        int[] address = new int[1];
-        if (dataObject.EnumFormatEtc(COM.DATADIR_GET, address) !is COM.S_OK) {
+        int[1] address;
+        if (dataObject.EnumFormatEtc(COM.DATADIR_GET, address.ptr) !is COM.S_OK) {
             return false;
         }
         IEnumFORMATETC enumFormatetc = new IEnumFORMATETC(address[0]);
@@ -707,3 +706,27 @@
     this.transferAgents = transferAgents;
 }
 }
+
+class _IDropTargetImpl : IDropTarget {
+
+    DropTarget  parent;
+    this(DropTarget p) { parent = p; }
+extern (Windows):
+    // interface of IUnknown
+    HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
+    ULONG AddRef()  { return parent.AddRef(); }
+    ULONG Release() { return parent.Release(); }
+
+    HRESULT DragEnter( IDataObject pDataObj, DWORD grfKeyState, POINT pt, DWORD *pdwEffect ) {
+        return parent.DragEnter(pDataObj, grfKeyState, pt, pdwEffect);
+    }
+    HRESULT DragOver( DWORD grfKeyState, POINT pt, DWORD *pdwEffect ) {
+        return parent.DragOver(grfKeyState, pt, pdwEffect);
+    }
+    HRESULT DragLeave(){ return parent.DragLeave(); }
+    HRESULT Drop(IDataObject pDataObj,DWORD grfKeyState,POINT pt,DWORD *pdwEffect){
+        return parent.Drop(pDataObj, grfKeyState, pt, pdwEffect);
+    }
+}
+
+