Changeset 137:3665cb9211b2
- Timestamp:
- 02/13/08 08:52:31
(1 year ago)
- Author:
- Frank Benoit <benoit@tionex.de>
- branch:
- default
- Message:
DropTarget?
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r136 |
r137 |
|
| 36 | 36 | import dwt.dnd.DNDEvent; |
|---|
| 37 | 37 | import dwt.dnd.DND; |
|---|
| | 38 | import dwt.dnd.TableDropTargetEffect; |
|---|
| | 39 | import dwt.dnd.TreeDropTargetEffect; |
|---|
| | 40 | |
|---|
| | 41 | import dwt.dwthelper.utils; |
|---|
| 38 | 42 | |
|---|
| 39 | 43 | /** |
|---|
| … | … | |
| 155 | 159 | this.AddRef(); |
|---|
| 156 | 160 | |
|---|
| 157 | | if (COM.CoLockObjectExternal(iDropTarget.getAddress(), true, true) !is COM.S_OK) |
|---|
| | 161 | if (COM.CoLockObjectExternal(iDropTarget, true, true) !is COM.S_OK) |
|---|
| 158 | 162 | DND.error(DND.ERROR_CANNOT_INIT_DROP); |
|---|
| 159 | | if (COM.RegisterDragDrop( control.handle, iDropTarget.getAddress()) !is COM.S_OK) |
|---|
| | 163 | if (COM.RegisterDragDrop( control.handle, iDropTarget) !is COM.S_OK) |
|---|
| 160 | 164 | DND.error(DND.ERROR_CANNOT_INIT_DROP); |
|---|
| 161 | 165 | |
|---|
| … | … | |
| 234 | 238 | } |
|---|
| 235 | 239 | |
|---|
| 236 | | int AddRef() { |
|---|
| | 240 | ULONG AddRef() { |
|---|
| 237 | 241 | refCount++; |
|---|
| 238 | 242 | return refCount; |
|---|
| … | … | |
| 256 | 260 | } |
|---|
| 257 | 261 | |
|---|
| 258 | | int DragEnter(int pDataObject, int grfKeyState, int pt_x, int pt_y, int pdwEffect) { |
|---|
| | 262 | HRESULT DragEnter(IDataObject pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) { |
|---|
| 259 | 263 | selectedDataType = null; |
|---|
| 260 | 264 | selectedOperation = DND.DROP_NONE; |
|---|
| … | … | |
| 263 | 267 | |
|---|
| 264 | 268 | DNDEvent event = new DNDEvent(); |
|---|
| 265 | | if (!setEventData(event, pDataObject, grfKeyState, pt_x, pt_y, pdwEffect)) { |
|---|
| | 269 | if (!setEventData(event, pDataObject, grfKeyState, pt, pdwEffect)) { |
|---|
| 266 | 270 | *pdwEffect = COM.DROPEFFECT_NONE; |
|---|
| 267 | 271 | return COM.S_FALSE; |
|---|
| … | … | |
| 269 | 273 | |
|---|
| 270 | 274 | // Remember the iDataObject because it is not passed into the DragOver callback |
|---|
| 271 | | iDataObject = new IDataObject(pDataObject); |
|---|
| | 275 | iDataObject = pDataObject; |
|---|
| 272 | 276 | iDataObject.AddRef(); |
|---|
| 273 | 277 | |
|---|
| … | … | |
| 298 | 302 | } |
|---|
| 299 | 303 | |
|---|
| 300 | | int DragLeave() { |
|---|
| | 304 | HRESULT DragLeave() { |
|---|
| 301 | 305 | keyOperation = -1; |
|---|
| 302 | 306 | |
|---|
| … | … | |
| 315 | 319 | } |
|---|
| 316 | 320 | |
|---|
| 317 | | int DragOver(int grfKeyState, int pt_x, int pt_y, int pdwEffect) { |
|---|
| | 321 | HRESULT DragOver(int grfKeyState, POINTL pt, DWORD* pdwEffect) { |
|---|
| 318 | 322 | if (iDataObject is null) return COM.S_FALSE; |
|---|
| 319 | 323 | int oldKeyOperation = keyOperation; |
|---|
| 320 | 324 | |
|---|
| 321 | 325 | DNDEvent event = new DNDEvent(); |
|---|
| 322 | | if (!setEventData(event, iDataObject.getAddress(), grfKeyState, pt_x, pt_y, pdwEffect)) { |
|---|
| | 326 | if (!setEventData(event, iDataObject, grfKeyState, pt, pdwEffect)) { |
|---|
| 323 | 327 | keyOperation = -1; |
|---|
| 324 | 328 | *pdwEffect = COM.DROPEFFECT_NONE; |
|---|
| … | … | |
| 361 | 365 | } |
|---|
| 362 | 366 | |
|---|
| 363 | | int Drop(int pDataObject, int grfKeyState, int pt_x, int pt_y, int pdwEffect) { |
|---|
| | 367 | HRESULT Drop(IDataObject pDataObject, int grfKeyState, POINTL pt, DWORD* pdwEffect) { |
|---|
| 364 | 368 | DNDEvent event = new DNDEvent(); |
|---|
| 365 | 369 | event.widget = this; |
|---|
| 366 | 370 | event.time = OS.GetMessageTime(); |
|---|
| 367 | 371 | if (dropEffect !is null) { |
|---|
| 368 | | event.item = dropEffect.getItem(pt_x, pt_y); |
|---|
| | 372 | event.item = dropEffect.getItem(pt.x, pt.y); |
|---|
| 369 | 373 | } |
|---|
| 370 | 374 | event.detail = DND.DROP_NONE; |
|---|
| … | … | |
| 373 | 377 | |
|---|
| 374 | 378 | event = new DNDEvent(); |
|---|
| 375 | | if (!setEventData(event, pDataObject, grfKeyState, pt_x, pt_y, pdwEffect)) { |
|---|
| | 379 | if (!setEventData(event, pDataObject, grfKeyState, pt, pdwEffect)) { |
|---|
| 376 | 380 | keyOperation = -1; |
|---|
| 377 | 381 | *pdwEffect = COM.DROPEFFECT_NONE; |
|---|
| … | … | |
| 494 | 498 | control = null; |
|---|
| 495 | 499 | |
|---|
| 496 | | COM.CoLockObjectExternal(iDropTarget.getAddress(), false, true); |
|---|
| | 500 | COM.CoLockObjectExternal(iDropTarget, false, true); |
|---|
| 497 | 501 | |
|---|
| 498 | 502 | this.Release(); |
|---|
| … | … | |
| 533 | 537 | * must be incremented before returning. Caller is responsible for releasing ppvObject. |
|---|
| 534 | 538 | */ |
|---|
| 535 | | int QueryInterface(int riid, int ppvObject) { |
|---|
| | 539 | HRESULT QueryInterface(REFIID riid, void ** ppvObject) { |
|---|
| 536 | 540 | |
|---|
| 537 | 541 | if (riid is null || ppvObject is null) |
|---|
| 538 | 542 | return COM.E_INVALIDARG; |
|---|
| 539 | 543 | if (COM.IsEqualGUID(riid, &COM.IIDIUnknown) || COM.IsEqualGUID(riid, &COM.IIDIDropTarget)) { |
|---|
| 540 | | *ppvObject = cast(void*)cast(IUnknown) iDropTarget.getAddress(); |
|---|
| | 544 | *ppvObject = cast(void*)cast(IDropTarget) iDropTarget; |
|---|
| 541 | 545 | AddRef(); |
|---|
| 542 | 546 | return COM.S_OK; |
|---|
| … | … | |
| 547 | 551 | } |
|---|
| 548 | 552 | |
|---|
| 549 | | int Release() { |
|---|
| | 553 | ULONG Release() { |
|---|
| 550 | 554 | refCount--; |
|---|
| 551 | 555 | |
|---|
| … | … | |
| 560 | 564 | void refresh() { |
|---|
| 561 | 565 | if (control is null || control.isDisposed()) return; |
|---|
| 562 | | int handle = control.handle; |
|---|
| | 566 | auto handle = control.handle; |
|---|
| 563 | 567 | RECT lpRect; |
|---|
| 564 | 568 | if (OS.GetUpdateRect(handle, &lpRect, false)) { |
|---|
| 565 | 569 | OS.ImageList_DragShowNolock(false); |
|---|
| 566 | | OS.RedrawWindow(handle, *lpRect, 0, OS.RDW_UPDATENOW | OS.RDW_INVALIDATE); |
|---|
| | 570 | OS.RedrawWindow(handle, &lpRect, null, OS.RDW_UPDATENOW | OS.RDW_INVALIDATE); |
|---|
| 567 | 571 | OS.ImageList_DragShowNolock(true); |
|---|
| 568 | 572 | } |
|---|
| … | … | |
| 609 | 613 | } |
|---|
| 610 | 614 | |
|---|
| 611 | | bool setEventData(DNDEvent event, int pDataObject, int grfKeyState, int pt_x, int pt_y, int pdwEffect) { |
|---|
| 612 | | if (pDataObject is 0 || pdwEffect is 0) return false; |
|---|
| | 615 | bool setEventData(DNDEvent event, IDataObject pDataObject, int grfKeyState, POINTL pt, DWORD* pdwEffect) { |
|---|
| | 616 | if (pDataObject is null || pdwEffect is null) return false; |
|---|
| 613 | 617 | |
|---|
| 614 | 618 | // get allowed operations |
|---|
| … | … | |
| 632 | 636 | // Get allowed transfer types |
|---|
| 633 | 637 | TransferData[] dataTypes = new TransferData[0]; |
|---|
| 634 | | IDataObject dataObject = new IDataObject(pDataObject); |
|---|
| | 638 | IDataObject dataObject = pDataObject; |
|---|
| 635 | 639 | dataObject.AddRef(); |
|---|
| 636 | 640 | try { |
|---|
| 637 | | int[1] address; |
|---|
| | 641 | IEnumFORMATETC[1] address; |
|---|
| 638 | 642 | if (dataObject.EnumFormatEtc(COM.DATADIR_GET, address.ptr) !is COM.S_OK) { |
|---|
| 639 | 643 | return false; |
|---|
| 640 | 644 | } |
|---|
| 641 | | IEnumFORMATETC enumFormatetc = new IEnumFORMATETC(address[0]); |
|---|
| | 645 | IEnumFORMATETC enumFormatetc = address[0]; |
|---|
| 642 | 646 | try { |
|---|
| 643 | 647 | // Loop over enumerator and save any types that match what we are looking for |
|---|
| 644 | | int rgelt = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, FORMATETC.sizeof); |
|---|
| | 648 | auto rgelt = cast(FORMATETC*) OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, FORMATETC.sizeof); |
|---|
| 645 | 649 | try { |
|---|
| 646 | | int[] pceltFetched = new int[1]; |
|---|
| | 650 | uint[1] pceltFetched; |
|---|
| 647 | 651 | enumFormatetc.Reset(); |
|---|
| 648 | | while (enumFormatetc.Next(1, rgelt, pceltFetched) is COM.S_OK && pceltFetched[0] is 1) { |
|---|
| | 652 | while (enumFormatetc.Next(1, rgelt, pceltFetched.ptr) is COM.S_OK && pceltFetched[0] is 1) { |
|---|
| 649 | 653 | TransferData transferData = new TransferData(); |
|---|
| 650 | 654 | transferData.formatetc = new FORMATETC(); |
|---|
| … | … | |
| 675 | 679 | |
|---|
| 676 | 680 | event.widget = this; |
|---|
| 677 | | event.x = pt_x; |
|---|
| 678 | | event.y = pt_y; |
|---|
| | 681 | event.x = pt.x; |
|---|
| | 682 | event.y = pt.y; |
|---|
| 679 | 683 | event.time = OS.GetMessageTime(); |
|---|
| 680 | 684 | event.feedback = DND.FEEDBACK_SELECT; |
|---|
| … | … | |
| 682 | 686 | event.dataType = dataTypes[0]; |
|---|
| 683 | 687 | if (dropEffect !is null) { |
|---|
| 684 | | event.item = dropEffect.getItem(pt_x, pt_y); |
|---|
| | 688 | event.item = dropEffect.getItem(pt.x, pt.y); |
|---|
| 685 | 689 | } |
|---|
| 686 | 690 | event.operations = operations[0]; |
|---|
| … | … | |
| 718 | 722 | ULONG Release() { return parent.Release(); } |
|---|
| 719 | 723 | |
|---|
| 720 | | HRESULT DragEnter( IDataObject pDataObj, DWORD grfKeyState, POINT pt, DWORD *pdwEffect ) { |
|---|
| | 724 | HRESULT DragEnter( IDataObject pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect ) { |
|---|
| 721 | 725 | return parent.DragEnter(pDataObj, grfKeyState, pt, pdwEffect); |
|---|
| 722 | 726 | } |
|---|
| 723 | | HRESULT DragOver( DWORD grfKeyState, POINT pt, DWORD *pdwEffect ) { |
|---|
| | 727 | HRESULT DragOver( DWORD grfKeyState, POINTL pt, DWORD *pdwEffect ) { |
|---|
| 724 | 728 | return parent.DragOver(grfKeyState, pt, pdwEffect); |
|---|
| 725 | 729 | } |
|---|
| 726 | 730 | HRESULT DragLeave(){ return parent.DragLeave(); } |
|---|
| 727 | | HRESULT Drop(IDataObject pDataObj,DWORD grfKeyState,POINT pt,DWORD *pdwEffect){ |
|---|
| | 731 | HRESULT Drop(IDataObject pDataObj,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect){ |
|---|
| 728 | 732 | return parent.Drop(pDataObj, grfKeyState, pt, pdwEffect); |
|---|
| 729 | 733 | } |
|---|
| r135 |
r137 |
|
| 17 | 17 | import dwt.widgets.Table; |
|---|
| 18 | 18 | import dwt.widgets.TableItem; |
|---|
| | 19 | |
|---|
| | 20 | import dwt.dnd.DropTargetEffect; |
|---|
| | 21 | import dwt.dnd.DropTargetEvent; |
|---|
| 19 | 22 | |
|---|
| 20 | 23 | /** |
|---|
| … | … | |
| 106 | 109 | */ |
|---|
| 107 | 110 | public void dragLeave(DropTargetEvent event) { |
|---|
| 108 | | Table table = (Table) control; |
|---|
| | 111 | Table table = cast(Table) control; |
|---|
| 109 | 112 | int handle = table.handle; |
|---|
| 110 | 113 | if (dropHighlight !is null) { |
|---|
| … | … | |
| 136 | 139 | */ |
|---|
| 137 | 140 | public void dragOver(DropTargetEvent event) { |
|---|
| 138 | | Table table = (Table) getControl(); |
|---|
| | 141 | Table table = cast(Table) getControl(); |
|---|
| 139 | 142 | int effect = checkEffect(event.feedback); |
|---|
| 140 | 143 | int handle = table.handle; |
|---|
| r135 |
r137 |
|
| 17 | 17 | import dwt.widgets.Tree; |
|---|
| 18 | 18 | import dwt.widgets.TreeItem; |
|---|
| | 19 | |
|---|
| | 20 | import dwt.dnd.DropTargetEffect; |
|---|
| | 21 | import dwt.dnd.DropTargetEvent; |
|---|
| 19 | 22 | |
|---|
| 20 | 23 | /** |
|---|
| … | … | |
| 117 | 120 | */ |
|---|
| 118 | 121 | public void dragLeave(DropTargetEvent event) { |
|---|
| 119 | | Tree tree = (Tree) control; |
|---|
| | 122 | Tree tree = cast(Tree) control; |
|---|
| 120 | 123 | int handle = tree.handle; |
|---|
| 121 | 124 | if (dropIndex !is -1) { |
|---|
| … | … | |
| 157 | 160 | */ |
|---|
| 158 | 161 | public void dragOver(DropTargetEvent event) { |
|---|
| 159 | | Tree tree = (Tree) getControl(); |
|---|
| | 162 | Tree tree = cast(Tree) getControl(); |
|---|
| 160 | 163 | int effect = checkEffect(event.feedback); |
|---|
| 161 | 164 | int handle = tree.handle; |
|---|
| … | … | |
| 258 | 261 | * use the Tree API rather than calling the OS directly. |
|---|
| 259 | 262 | */ |
|---|
| 260 | | TreeItem item = (TreeItem)tree.getDisplay().findWidget(tree.handle, hItem); |
|---|
| | 263 | TreeItem item = cast(TreeItem)tree.getDisplay().findWidget(tree.handle, hItem); |
|---|
| 261 | 264 | if (item !is null) { |
|---|
| 262 | 265 | if (item !is insertItem || before !is insertBefore) { |
|---|
| r136 |
r137 |
|
| 4660 | 4660 | alias WINAPI.ImageList_DragLeave ImageList_DragLeave; |
|---|
| 4661 | 4661 | alias WINAPI.ImageList_DragMove ImageList_DragMove; |
|---|
| | 4662 | alias WINAPI.ImageList_DragShowNolock ImageList_DragShowNolock; |
|---|
| 4662 | 4663 | alias WINAPI.ImageList_EndDrag ImageList_EndDrag; |
|---|
| 4663 | 4664 | alias WINAPI.ImageList_GetIcon ImageList_GetIcon; |
|---|
| r136 |
r137 |
|
| 1606 | 1606 | WINBOOL ImageList_DragMove(int, int); |
|---|
| 1607 | 1607 | // WINBOOL ImageList_SetDragCursorImage(HIMAGELIST, int, int, int); |
|---|
| 1608 | | // WINBOOL ImageList_DragShowNolock(WINBOOL); |
|---|
| | 1608 | WINBOOL ImageList_DragShowNolock(WINBOOL); |
|---|
| 1609 | 1609 | // HIMAGELIST ImageList_GetDragImage(POINT*, POINT*); |
|---|
| 1610 | 1610 | // WINBOOL ImageList_GetIconSize(HIMAGELIST, int*, int*); |
|---|