annotate dwt/dnd/DragSource.d @ 213:36f5cb12e1a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Sat, 17 May 2008 17:34:28 +0200
parents ab60f3309436
children fd9c62a2998e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2007 IBM Corporation and others.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D programming language:
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.dnd.DragSource;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.DWT;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.DWTError;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.DWTException;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.graphics.Image;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.graphics.Point;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.internal.ImageList;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.internal.ole.win32.COM;
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
23 import dwt.internal.ole.win32.OLEIDL;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
24 import dwt.internal.ole.win32.OBJIDL;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
25 import dwt.internal.ole.win32.ifs;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
26 import dwt.internal.ole.win32.extras;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.internal.win32.OS;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.widgets.Composite;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.widgets.Control;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwt.widgets.Display;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwt.widgets.Event;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 import dwt.widgets.Listener;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 import dwt.widgets.Table;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 import dwt.widgets.Tree;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 import dwt.widgets.Widget;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
37 import dwt.dnd.DragSourceEffect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
38 import dwt.dnd.DragSourceListener;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
39 import dwt.dnd.Transfer;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
40 import dwt.dnd.TransferData;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
41 import dwt.dnd.DND;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
42 import dwt.dnd.DNDListener;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
43 import dwt.dnd.DNDEvent;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
44 import dwt.dnd.TreeDragSourceEffect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
45 import dwt.dnd.TableDragSourceEffect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
46 import dwt.dnd.OleEnumFORMATETC;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
47
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
48 import dwt.dwthelper.utils;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
49
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * <code>DragSource</code> defines the source object for a drag and drop transfer.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * <p>IMPORTANT: This class is <em>not</em> intended to be subclassed.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 * <p>A drag source is the object which originates a drag and drop operation. For the specified widget,
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * it defines the type of data that is available for dragging and the set of operations that can
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * be performed on that data. The operations can be any bit-wise combination of DND.MOVE, DND.COPY or
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * DND.LINK. The type of data that can be transferred is specified by subclasses of Transfer such as
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 * TextTransfer or FileTransfer. The type of data transferred can be a predefined system type or it
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 * can be a type defined by the application. For instructions on how to define your own transfer type,
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * refer to <code>ByteArrayTransfer</code>.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 * <p>You may have several DragSources in an application but you can only have one DragSource
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * per Control. Data dragged from this DragSource can be dropped on a site within this application
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * or it can be dropped on another application such as an external Text editor.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 * <p>The application supplies the content of the data being transferred by implementing the
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * <code>DragSourceListener</code> and associating it with the DragSource via DragSource#addDragListener.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * <p>When a successful move operation occurs, the application is required to take the appropriate
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * action to remove the data from its display and remove any associated operating system resources or
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * internal references. Typically in a move operation, the drop target makes a copy of the data
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * and the drag source deletes the original. However, sometimes copying the data can take a long
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * time (such as copying a large file). Therefore, on some platforms, the drop target may actually
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 * move the data in the operating system rather than make a copy. This is usually only done in
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * file transfers. In this case, the drag source is informed in the DragEnd event that a
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * DROP_TARGET_MOVE was performed. It is the responsibility of the drag source at this point to clean
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 * up its displayed information. No action needs to be taken on the operating system resources.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 * <p> The following example shows a Label widget that allows text to be dragged from it.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 * <code><pre>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 * // Enable a label as a Drag Source
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 * Label label = new Label(shell, DWT.NONE);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 * // This example will allow text to be dragged
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * Transfer[] types = new Transfer[] {TextTransfer.getInstance()};
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 * // This example will allow the text to be copied or moved to the drop target
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 * int operations = DND.DROP_MOVE | DND.DROP_COPY;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 * DragSource source = new DragSource(label, operations);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 * source.setTransfer(types);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 * source.addDragListener(new DragSourceListener() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 * public void dragStart(DragSourceEvent e) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 * // Only start the drag if there is actually text in the
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 * // label - this text will be what is dropped on the target.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * if (label.getText().length() is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 * event.doit = false;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 * }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * };
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 * public void dragSetData(DragSourceEvent event) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * // A drop has been performed, so provide the data of the
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * // requested type.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * // (Checking the type of the requested data is only
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * // necessary if the drag source supports more than
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 * // one data type but is shown here as an example).
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 * if (TextTransfer.getInstance().isSupportedType(event.dataType)){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 * event.data = label.getText();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 * }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 * public void dragFinished(DragSourceEvent event) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 * // A Move operation has been performed so remove the data
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 * // from the source
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 * if (event.detail is DND.DROP_MOVE)
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 * label.setText("");
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 * }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 * });
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 * </pre></code>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 * <dl>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 * <dt><b>Styles</b></dt> <dd>DND.DROP_NONE, DND.DROP_COPY, DND.DROP_MOVE, DND.DROP_LINK</dd>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 * <dt><b>Events</b></dt> <dd>DND.DragStart, DND.DragSetData, DND.DragEnd</dd>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 * </dl>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 public class DragSource : Widget {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 // info for registering as a drag source
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 Control control;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 Listener controlListener;
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
131 Transfer[] transferAgents;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 DragSourceEffect dragEffect;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 Composite topControl;
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
134 HWND hwndDrag;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 // ole interfaces
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
137 _IDropSourceImpl iDropSource;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
138 _IDataObjectImpl iDataObject;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 int refCount;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 //workaround - track the operation performed by the drop target for DragEnd event
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 int dataEffect = DND.DROP_NONE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 194
diff changeset
144 static const String DEFAULT_DRAG_SOURCE_EFFECT = "DEFAULT_DRAG_SOURCE_EFFECT"; //$NON-NLS-1$
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
145 static const int CFSTR_PERFORMEDDROPEFFECT;
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
146 static final TCHAR[] WindowClass = "#32770\0";
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
147 static this(){
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
148 CFSTR_PERFORMEDDROPEFFECT = Transfer.registerType("Performed DropEffect"); //$NON-NLS-1$
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
149 }
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 * Creates a new <code>DragSource</code> to handle dragging from the specified <code>Control</code>.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 * Creating an instance of a DragSource may cause system resources to be allocated depending on the platform.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 * It is therefore mandatory that the DragSource instance be disposed when no longer required.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 * @param control the <code>Control</code> that the user clicks on to initiate the drag
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 * @param style the bitwise OR'ing of allowed operations; this may be a combination of any of
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 * DND.DROP_NONE, DND.DROP_COPY, DND.DROP_MOVE, DND.DROP_LINK
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 * @exception DWTException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 * @exception DWTError <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * <li>ERROR_CANNOT_INIT_DRAG - unable to initiate drag source; this will occur if more than one
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 * drag source is created for a control or if the operating system will not allow the creation
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * of the drag source</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 * <p>NOTE: ERROR_CANNOT_INIT_DRAG should be an DWTException, since it is a
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * recoverable error, but can not be changed due to backward compatibility.</p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 * @see Widget#dispose
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * @see DragSource#checkSubclass
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * @see DND#DROP_NONE
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * @see DND#DROP_COPY
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 * @see DND#DROP_MOVE
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 * @see DND#DROP_LINK
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 public this(Control control, int style) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 super(control, checkStyle(style));
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 this.control = control;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
182 if (control.getData(DND.DRAG_SOURCE_KEY) !is null) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 DND.error(DND.ERROR_CANNOT_INIT_DRAG);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
185 control.setData(DND.DRAG_SOURCE_KEY, this);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 createCOMInterfaces();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 this.AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
189 controlListener = new class() Listener {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 public void handleEvent(Event event) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 if (event.type is DWT.Dispose) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
192 if (!this.outer.isDisposed()) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
193 this.outer.dispose();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 if (event.type is DWT.DragDetect) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
197 if (!this.outer.isDisposed()) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
198 this.outer.drag(event);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 };
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 control.addListener(DWT.Dispose, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 control.addListener(DWT.DragDetect, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
206 this.addListener(DWT.Dispose, new class() Listener {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 public void handleEvent(Event e) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
208 this.outer.onDispose();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 });
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 Object effect = control.getData(DEFAULT_DRAG_SOURCE_EFFECT);
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
213 if ( auto dse = cast(DragSourceEffect)effect ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
214 dragEffect = dse;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
215 } else if ( auto tree = cast(Tree)control ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
216 dragEffect = new TreeDragSourceEffect(tree);
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
217 } else if ( auto table = cast(Table)control ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
218 dragEffect = new TableDragSourceEffect(table);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 static int checkStyle(int style) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 if (style is DWT.NONE) return DND.DROP_MOVE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 return style;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 * Adds the listener to the collection of listeners who will
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 * be notified when a drag and drop operation is in progress, by sending
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 * it one of the messages defined in the <code>DragSourceListener</code>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 * interface.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 * <p><ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 * <li><code>dragStart</code> is called when the user has begun the actions required to drag the widget.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 * This event gives the application the chance to decide if a drag should be started.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 * <li><code>dragSetData</code> is called when the data is required from the drag source.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 * <li><code>dragFinished</code> is called when the drop has successfully completed (mouse up
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 * over a valid target) or has been terminated (such as hitting the ESC key). Perform cleanup
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 * such as removing data from the source side on a successful move operation.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 * </ul></p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 * @param listener the listener which should be notified
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 * @exception IllegalArgumentException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 * @exception DWTException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 * @see DragSourceListener
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
253 * @see #getDragListeners
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 * @see #removeDragListener
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 * @see DragSourceEvent
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 public void addDragListener(DragSourceListener listener) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 if (listener is null) DND.error(DWT.ERROR_NULL_ARGUMENT);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 DNDListener typedListener = new DNDListener(listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 typedListener.dndWidget = this;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 addListener(DND.DragStart, typedListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 addListener(DND.DragSetData, typedListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 addListener(DND.DragEnd, typedListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 private int AddRef() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 refCount++;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 return refCount;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 private void createCOMInterfaces() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 // register each of the interfaces that this object implements
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
273 iDropSource = new _IDropSourceImpl(this);
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
274 iDataObject = new _IDataObjectImpl(this);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 protected void checkSubclass() {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 194
diff changeset
278 String name = this.classinfo.name;
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 194
diff changeset
279 String validName = DragSource.classinfo.name;
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
280 if (validName!=/*eq*/name) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 DND.error(DWT.ERROR_INVALID_SUBCLASS);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 private void disposeCOMInterfaces() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 iDropSource = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 iDataObject = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 private void drag(Event dragEvent) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 DNDEvent event = new DNDEvent();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 event.widget = this;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 event.x = dragEvent.x;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 event.y = dragEvent.y;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 event.time = OS.GetMessageTime();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 event.doit = true;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 notifyListeners(DND.DragStart,event);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 if (!event.doit || transferAgents is null || transferAgents.length is 0 ) return;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
300 uint[1] pdwEffect;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 int operations = opToOs(getStyle());
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 Display display = control.getDisplay();
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 194
diff changeset
303 String key = "dwt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 Object oldValue = display.getData(key);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
305 display.setData(key, new Boolean(true));
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 ImageList imagelist = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 Image image = event.image;
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
308 hwndDrag = null;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
309 topControl = null;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 if (image !is null) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 imagelist = new ImageList(DWT.NONE);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 imagelist.add(image);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 topControl = control.getShell();
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
314 /*
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
315 * Bug in Windows. The image is inverted if the shell is RIGHT_TO_LEFT.
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
316 * The fix is to create a transparent window that covers the shell client
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
317 * area and use it during the drag to prevent the image from being inverted.
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
318 * On XP if the shell is RTL, the image is not displayed.
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
319 */
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
320 int offset = 0;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
321 hwndDrag = topControl.handle;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
322 if ((topControl.getStyle() & DWT.RIGHT_TO_LEFT) !is 0) {
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
323 offset = image.getBounds().width;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
324 RECT rect;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
325 OS.GetClientRect (topControl.handle, &rect);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
326 hwndDrag = OS.CreateWindowEx (
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
327 OS.WS_EX_TRANSPARENT | OS.WS_EX_NOINHERITLAYOUT,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
328 WindowClass.ptr,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
329 null,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
330 OS.WS_CHILD | OS.WS_CLIPSIBLINGS,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
331 0, 0,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
332 rect.right - rect.left, rect.bottom - rect.top,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
333 topControl.handle,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
334 null,
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
335 OS.GetModuleHandle (null),
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
336 null);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
337 OS.ShowWindow (hwndDrag, OS.SW_SHOW);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
338 }
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
339 OS.ImageList_BeginDrag(imagelist.getHandle(), 0, offset, 0);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 /*
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 * Feature in Windows. When ImageList_DragEnter() is called,
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 * it takes a snapshot of the screen If a drag is started
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 * when another window is in front, then the snapshot will
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 * contain part of the other window, causing pixel corruption.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 * The fix is to force all paints to be delivered before
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 * calling ImageList_DragEnter().
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 if (OS.IsWinCE) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 OS.UpdateWindow (topControl.handle);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 } else {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 int flags = OS.RDW_UPDATENOW | OS.RDW_ALLCHILDREN;
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
352 OS.RedrawWindow (topControl.handle, null, null, flags);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 }
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
354 POINT pt;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
355 pt.x = dragEvent.x;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
356 pt.y = dragEvent.y;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
357 OS.MapWindowPoints (control.handle, null, &pt, 1);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
358 RECT rect;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
359 OS.GetWindowRect (hwndDrag, &rect);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
360 OS.ImageList_DragEnter(hwndDrag, pt.x - rect.left, pt.y - rect.top);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 }
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
362 int result = COM.DRAGDROP_S_CANCEL;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
363 try {
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
364 result = COM.DoDragDrop(iDataObject, iDropSource, operations, pdwEffect.ptr);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
365 } finally {
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
366 // ensure that we don't leave transparent window around
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
367 if (hwndDrag !is null) {
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
368 OS.ImageList_DragLeave(hwndDrag);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
369 OS.ImageList_EndDrag();
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
370 imagelist.dispose();
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
371 if (hwndDrag !is topControl.handle) OS.DestroyWindow(hwndDrag);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
372 hwndDrag = null;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
373 topControl = null;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
374 }
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
375 display.setData(key, oldValue);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 int operation = osToOp(pdwEffect[0]);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 if (dataEffect is DND.DROP_MOVE) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 operation = (operation is DND.DROP_NONE || operation is DND.DROP_COPY) ? DND.DROP_TARGET_MOVE : DND.DROP_MOVE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 } else {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 if (dataEffect !is DND.DROP_NONE) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 operation = dataEffect;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 event = new DNDEvent();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 event.widget = this;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 event.time = OS.GetMessageTime();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 event.doit = (result is COM.DRAGDROP_S_DROP);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 event.detail = operation;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 notifyListeners(DND.DragEnd,event);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 dataEffect = DND.DROP_NONE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 /*
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 * EnumFormatEtc([in] dwDirection, [out] ppenumFormatetc)
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 * Ownership of ppenumFormatetc transfers from callee to caller so reference count on ppenumFormatetc
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 * must be incremented before returning. Caller is responsible for releasing ppenumFormatetc.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 */
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
398 private int EnumFormatEtc(int dwDirection, IEnumFORMATETC* ppenumFormatetc) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 // only allow getting of data - SetData is not currently supported
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 if (dwDirection is COM.DATADIR_SET) return COM.E_NOTIMPL;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 // what types have been registered?
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 TransferData[] allowedDataTypes = new TransferData[0];
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 for (int i = 0; i < transferAgents.length; i++){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 Transfer transferAgent = transferAgents[i];
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 if (transferAgent !is null) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 TransferData[] formats = transferAgent.getSupportedTypes();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 TransferData[] newAllowedDataTypes = new TransferData[allowedDataTypes.length + formats.length];
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 System.arraycopy(allowedDataTypes, 0, newAllowedDataTypes, 0, allowedDataTypes.length);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 System.arraycopy(formats, 0, newAllowedDataTypes, allowedDataTypes.length, formats.length);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 allowedDataTypes = newAllowedDataTypes;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 OleEnumFORMATETC enumFORMATETC = new OleEnumFORMATETC();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 enumFORMATETC.AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
418 FORMATETC*[] formats = new FORMATETC*[allowedDataTypes.length];
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 for (int i = 0; i < formats.length; i++){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 formats[i] = allowedDataTypes[i].formatetc;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 enumFORMATETC.setFormats(formats);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
424 *ppenumFormatetc = enumFORMATETC.getAddress();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 * Returns the Control which is registered for this DragSource. This is the control that the
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 * user clicks in to initiate dragging.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 * @return the Control which is registered for this DragSource
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 public Control getControl() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 return control;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
437 .LRESULT GetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 /* Called by a data consumer to obtain data from a source data object.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 The GetData method renders the data described in the specified FORMATETC
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 structure and transfers it through the specified STGMEDIUM structure.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 The caller then assumes responsibility for releasing the STGMEDIUM structure.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 */
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
443 if (pFormatetc is null || pmedium is null) return COM.E_INVALIDARG;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 if (QueryGetData(pFormatetc) !is COM.S_OK) return COM.DV_E_FORMATETC;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 TransferData transferData = new TransferData();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 transferData.formatetc = new FORMATETC();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 COM.MoveMemory(transferData.formatetc, pFormatetc, FORMATETC.sizeof);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 transferData.type = transferData.formatetc.cfFormat;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 transferData.stgmedium = new STGMEDIUM();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 transferData.result = COM.E_FAIL;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 DNDEvent event = new DNDEvent();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 event.widget = this;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 event.time = OS.GetMessageTime();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 event.dataType = transferData;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 notifyListeners(DND.DragSetData,event);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 // get matching transfer agent to perform conversion
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 Transfer transfer = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 for (int i = 0; i < transferAgents.length; i++){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 Transfer transferAgent = transferAgents[i];
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 if (transferAgent !is null && transferAgent.isSupportedType(transferData)){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 transfer = transferAgent;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 break;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 if (transfer is null) return COM.DV_E_FORMATETC;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 transfer.javaToNative(event.data, transferData);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 if (transferData.result !is COM.S_OK) return transferData.result;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 COM.MoveMemory(pmedium, transferData.stgmedium, STGMEDIUM.sizeof);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 return transferData.result;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 /**
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
478 * Returns an array of listeners who will be notified when a drag and drop
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
479 * operation is in progress, by sending it one of the messages defined in
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
480 * the <code>DragSourceListener</code> interface.
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
481 *
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
482 * @exception DWTException <ul>
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
483 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
484 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
485 * </ul>
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
486 *
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
487 * @see DragSourceListener
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
488 * @see #addDragListener
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
489 * @see #removeDragListener
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
490 * @see DragSourceEvent
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
491 *
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
492 * @since 3.4
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
493 */
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
494 public DragSourceListener[] getDragListeners() {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
495 Listener[] listeners = getListeners(DND.DragStart);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
496 int length = listeners.length;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
497 DragSourceListener[] dragListeners = new DragSourceListener[length];
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
498 int count = 0;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
499 for (int i = 0; i < length; i++) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
500 Listener listener = listeners[i];
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
501 if ( auto l = cast(DNDListener)listener ) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
502 dragListeners[count] = cast(DragSourceListener) (l.getEventListener());
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
503 count++;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
504 }
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
505 }
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
506 if (count is length) return dragListeners;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
507 DragSourceListener[] result = new DragSourceListener[count];
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
508 SimpleType!(DragSourceListener).arraycopy(dragListeners, 0, result, 0, count);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
509 return result;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
510 }
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
511
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
512 /**
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 * Returns the drag effect that is registered for this DragSource. This drag
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 * effect will be used during a drag and drop operation.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 * @return the drag effect that is registered for this DragSource
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 * @since 3.3
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 public DragSourceEffect getDragSourceEffect() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 return dragEffect;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 * Returns the list of data types that can be transferred by this DragSource.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 * @return the list of data types that can be transferred by this DragSource
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 public Transfer[] getTransfer(){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 return transferAgents;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
533 package .LRESULT GiveFeedback(DWORD dwEffect) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 return COM.DRAGDROP_S_USEDEFAULTCURSORS;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
537 package .LRESULT QueryContinueDrag(int fEscapePressed, DWORD grfKeyState) {
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
538 if (topControl !is null && topControl.isDisposed()) return COM.DRAGDROP_S_CANCEL;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 if (fEscapePressed !is 0){
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
540 if (hwndDrag !is null) OS.ImageList_DragLeave(hwndDrag);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 return COM.DRAGDROP_S_CANCEL;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 /*
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 * Bug in Windows. On some machines that do not have XBUTTONs,
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 * the MK_XBUTTON1 and OS.MK_XBUTTON2 bits are sometimes set,
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * causing mouse capture to become stuck. The fix is to test
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * for the extra buttons only when they exist.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 int mask = OS.MK_LBUTTON | OS.MK_MBUTTON | OS.MK_RBUTTON;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 // if (display.xMouse) mask |= OS.MK_XBUTTON1 | OS.MK_XBUTTON2;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 if ((grfKeyState & mask) is 0) {
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
552 if (hwndDrag !is null) OS.ImageList_DragLeave(hwndDrag);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 return COM.DRAGDROP_S_DROP;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
556 if (hwndDrag !is null) {
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
557 POINT pt;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
558 OS.GetCursorPos (&pt);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
559 RECT rect;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
560 OS.GetWindowRect (hwndDrag, &rect);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
561 OS.ImageList_DragMove (pt.x - rect.left, pt.y - rect.top);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 private void onDispose() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 if (control is null) return;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 this.Release();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 if (controlListener !is null){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 control.removeListener(DWT.Dispose, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 control.removeListener(DWT.DragDetect, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 controlListener = null;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
574 control.setData(DND.DRAG_SOURCE_KEY, null);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 control = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 transferAgents = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 private int opToOs(int operation) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 int osOperation = 0;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 if ((operation & DND.DROP_COPY) !is 0){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 osOperation |= COM.DROPEFFECT_COPY;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 if ((operation & DND.DROP_LINK) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 osOperation |= COM.DROPEFFECT_LINK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 if ((operation & DND.DROP_MOVE) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 osOperation |= COM.DROPEFFECT_MOVE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 return osOperation;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 private int osToOp(int osOperation){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 int operation = 0;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 if ((osOperation & COM.DROPEFFECT_COPY) !is 0){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 operation |= DND.DROP_COPY;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 if ((osOperation & COM.DROPEFFECT_LINK) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 operation |= DND.DROP_LINK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 if ((osOperation & COM.DROPEFFECT_MOVE) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 operation |= DND.DROP_MOVE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 return operation;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
607 private .LRESULT QueryGetData(FORMATETC* pFormatetc) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 if (transferAgents is null) return COM.E_FAIL;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 TransferData transferData = new TransferData();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 transferData.formatetc = new FORMATETC();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 COM.MoveMemory(transferData.formatetc, pFormatetc, FORMATETC.sizeof);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 transferData.type = transferData.formatetc.cfFormat;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 // is this type supported by the transfer agent?
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 for (int i = 0; i < transferAgents.length; i++){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 Transfer transfer = transferAgents[i];
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 if (transfer !is null && transfer.isSupportedType(transferData))
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 return COM.DV_E_FORMATETC;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 /* QueryInterface([in] riid, [out] ppvObject)
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 * Ownership of ppvObject transfers from callee to caller so reference count on ppvObject
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 * must be incremented before returning. Caller is responsible for releasing ppvObject.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 */
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
628 private HRESULT QueryInterface(REFIID riid, void** ppvObject) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
629 if (riid is null || ppvObject is null)
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 return COM.E_INVALIDARG;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
632 if (COM.IsEqualGUID(riid, &COM.IIDIUnknown) || COM.IsEqualGUID(riid, &COM.IIDIDropSource)) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
633 *ppvObject = cast(void*)cast(IUnknown) iDropSource;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
638 if (COM.IsEqualGUID(riid, &COM.IIDIDataObject) ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
639 *ppvObject = cast(void*)cast(IDataObject) iDataObject;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
644 *ppvObject = null;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645 return COM.E_NOINTERFACE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
648 private ULONG Release() {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 refCount--;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 if (refCount is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 disposeCOMInterfaces();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 COM.CoFreeUnusedLibraries();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 return refCount;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 * Removes the listener from the collection of listeners who will
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 * be notified when a drag and drop operation is in progress.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 * @param listener the listener which should be notified
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 * @exception IllegalArgumentException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664 * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 * @exception DWTException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
667 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 * @see DragSourceListener
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 * @see #addDragListener
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
673 * @see #getDragListeners
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675 public void removeDragListener(DragSourceListener listener) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676 if (listener is null) DND.error(DWT.ERROR_NULL_ARGUMENT);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 removeListener(DND.DragStart, listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 removeListener(DND.DragSetData, listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 removeListener(DND.DragEnd, listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
680 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
681
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
682 .LRESULT SetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium, int fRelease) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
683 if (pFormatetc is null || pmedium is null) return COM.E_INVALIDARG;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
684 FORMATETC* formatetc = new FORMATETC();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 COM.MoveMemory(formatetc, pFormatetc, FORMATETC.sizeof);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
686 if (formatetc.cfFormat is CFSTR_PERFORMEDDROPEFFECT && formatetc.tymed is COM.TYMED_HGLOBAL) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
687 STGMEDIUM* stgmedium = new STGMEDIUM();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688 COM.MoveMemory(stgmedium, pmedium,STGMEDIUM.sizeof);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
689 //TODO - this should be GlobalLock()
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
690 int[1] ptrEffect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
691 OS.MoveMemory(ptrEffect.ptr, stgmedium.unionField,4);
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
692 int[1] effect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
693 OS.MoveMemory(effect.ptr, ptrEffect[0],4);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
694 dataEffect = osToOp(effect[0]);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
695 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
696 if (fRelease is 1) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
697 COM.ReleaseStgMedium(pmedium);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
698 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
699 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
700 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
701
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
702 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
703 * Specifies the drag effect for this DragSource. This drag effect will be
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
704 * used during a drag and drop operation.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
705 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
706 * @param effect the drag effect that is registered for this DragSource
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
707 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
708 * @since 3.3
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
709 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
710 public void setDragSourceEffect(DragSourceEffect effect) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
711 dragEffect = effect;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
712 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
713
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
714 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
715 * Specifies the list of data types that can be transferred by this DragSource.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
716 * The application must be able to provide data to match each of these types when
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
717 * a successful drop has occurred.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
718 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
719 * @param transferAgents a list of Transfer objects which define the types of data that can be
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
720 * dragged from this source
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
721 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
722 public void setTransfer(Transfer[] transferAgents){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
723 this.transferAgents = transferAgents;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
724 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
725
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
726 }
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
727
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
728
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
729 private class _IDropSourceImpl : IDropSource {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
730
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
731 DragSource parent;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
732 this(DragSource p) { parent = p; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
733 extern (Windows):
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
734 // interface of IUnknown
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
735 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
736 ULONG AddRef() { return parent.AddRef(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
737 ULONG Release() { return parent.Release(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
738
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
739 // interface of IDropSource
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
740 HRESULT QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) { return parent.QueryContinueDrag(fEscapePressed, grfKeyState); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
741 HRESULT GiveFeedback(DWORD dwEffect) { return parent.GiveFeedback(dwEffect);}
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
742 }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
743
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
744 private class _IDataObjectImpl : IDataObject {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
745
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
746 DragSource parent;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
747 this(DragSource p) { parent = p; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
748 extern (Windows):
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
749 // interface of IUnknown
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
750 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
751 ULONG AddRef() { return parent.AddRef(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
752 ULONG Release() { return parent.Release(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
753
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
754
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
755 // interface IDataObject
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
756 LRESULT GetData( FORMATETC *pFormatetc, STGMEDIUM *pmedium) { return parent.GetData(pFormatetc, pmedium); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
757 LRESULT GetDataHere(FORMATETC * pFormatetc, STGMEDIUM * pmedium) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
758 LRESULT QueryGetData(FORMATETC* pFormatetc) { return parent.QueryGetData(pFormatetc); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
759 LRESULT GetCanonicalFormatEtc(FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
760 LRESULT SetData(FORMATETC* pFormatetc, STGMEDIUM * pmedium, BOOL fRelease) { return parent.SetData(pFormatetc, pmedium, fRelease); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
761 LRESULT EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC * ppenumFormatetc) { return parent.EnumFormatEtc(dwDirection, ppenumFormatetc); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
762 LRESULT DAdvise(FORMATETC* pFormatetc, DWORD advf, IAdviseSink pAdvSink, DWORD* pdwConnection) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
763 LRESULT DUnadvise(DWORD dwConnection) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
764 LRESULT EnumDAdvise(IEnumSTATDATA * ppenumAdvise) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
765 }