Mercurial > projects > dwt-win
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); + } +} + +