annotate dwt/dnd/DragSource.d @ 212:ab60f3309436

reverted the char[] to String and use the an alias.
author Frank Benoit <benoit@tionex.de>
date Mon, 05 May 2008 00:12:38 +0200
parents 3afcd4ddcf90
children 36f5cb12e1a2
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$
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 194
diff changeset
145 static const String DRAGSOURCEID = "DragSource"; //$NON-NLS-1$
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
146 static const int CFSTR_PERFORMEDDROPEFFECT;
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
147 static final TCHAR[] WindowClass = "#32770\0";
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
148 static this(){
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
149 CFSTR_PERFORMEDDROPEFFECT = Transfer.registerType("Performed DropEffect"); //$NON-NLS-1$
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
150 }
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 * 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
153 * 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
154 * 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
155 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 * @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
157 * @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
158 * 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
159 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 * @exception DWTException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * <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
162 * <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
163 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * @exception DWTError <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 * <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
166 * 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
167 * of the drag source</li>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * <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
171 * 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
172 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * @see Widget#dispose
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * @see DragSource#checkSubclass
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * @see DND#DROP_NONE
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 * @see DND#DROP_COPY
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 * @see DND#DROP_MOVE
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 * @see DND#DROP_LINK
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 public this(Control control, int style) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 super(control, checkStyle(style));
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 this.control = control;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 if (control.getData(DRAGSOURCEID) !is null) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 DND.error(DND.ERROR_CANNOT_INIT_DRAG);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 control.setData(DRAGSOURCEID, this);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 createCOMInterfaces();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 this.AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
190 controlListener = new class() Listener {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 public void handleEvent(Event event) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 if (event.type is DWT.Dispose) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
193 if (!this.outer.isDisposed()) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
194 this.outer.dispose();
135
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 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 if (event.type is DWT.DragDetect) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
198 if (!this.outer.isDisposed()) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
199 this.outer.drag(event);
135
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 };
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 control.addListener(DWT.Dispose, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 control.addListener(DWT.DragDetect, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
207 this.addListener(DWT.Dispose, new class() Listener {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 public void handleEvent(Event e) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
209 this.outer.onDispose();
135
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
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 Object effect = control.getData(DEFAULT_DRAG_SOURCE_EFFECT);
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
214 if ( auto dse = cast(DragSourceEffect)effect ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
215 dragEffect = dse;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
216 } else if ( auto tree = cast(Tree)control ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
217 dragEffect = new TreeDragSourceEffect(tree);
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
218 } else if ( auto table = cast(Table)control ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
219 dragEffect = new TableDragSourceEffect(table);
135
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
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 static int checkStyle(int style) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 if (style is DWT.NONE) return DND.DROP_MOVE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 return style;
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 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 * 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
230 * 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
231 * 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
232 * interface.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 * <p><ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 * <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
236 * 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
237 * <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
238 * <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
239 * 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
240 * 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
241 * </ul></p>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 * @param listener the listener which should be notified
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 * @exception IllegalArgumentException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 * <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
247 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 * @exception DWTException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 * <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
250 * <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
251 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 * @see DragSourceListener
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);
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
305 display.setData(key, new ValueWrapperBool(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 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * 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
479 * 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
480 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 * @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
482 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 * @since 3.3
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 public DragSourceEffect getDragSourceEffect() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 return dragEffect;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 * 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
491 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 * @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
493 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 public Transfer[] getTransfer(){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 return transferAgents;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
498 package .LRESULT GiveFeedback(DWORD dwEffect) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 return COM.DRAGDROP_S_USEDEFAULTCURSORS;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
502 package .LRESULT QueryContinueDrag(int fEscapePressed, DWORD grfKeyState) {
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
503 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
504 if (fEscapePressed !is 0){
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
505 if (hwndDrag !is null) OS.ImageList_DragLeave(hwndDrag);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 return COM.DRAGDROP_S_CANCEL;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 /*
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 * 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
510 * 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
511 * 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
512 * for the extra buttons only when they exist.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 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
515 // 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
516 if ((grfKeyState & mask) is 0) {
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
517 if (hwndDrag !is null) OS.ImageList_DragLeave(hwndDrag);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 return COM.DRAGDROP_S_DROP;
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
194
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
521 if (hwndDrag !is null) {
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
522 POINT pt;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
523 OS.GetCursorPos (&pt);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
524 RECT rect;
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
525 OS.GetWindowRect (hwndDrag, &rect);
3afcd4ddcf90 Update to SWT 3.3.2
Frank Benoit <benoit@tionex.de>
parents: 136
diff changeset
526 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
527 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 private void onDispose() {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 if (control is null) return;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 this.Release();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 if (controlListener !is null){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 control.removeListener(DWT.Dispose, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 control.removeListener(DWT.DragDetect, controlListener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 controlListener = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 control.setData(DRAGSOURCEID, null);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 control = null;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 transferAgents = null;
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 private int opToOs(int operation) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 int osOperation = 0;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 if ((operation & DND.DROP_COPY) !is 0){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 osOperation |= COM.DROPEFFECT_COPY;
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 if ((operation & DND.DROP_LINK) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 osOperation |= COM.DROPEFFECT_LINK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 if ((operation & DND.DROP_MOVE) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 osOperation |= COM.DROPEFFECT_MOVE;
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 return osOperation;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 private int osToOp(int osOperation){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 int operation = 0;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 if ((osOperation & COM.DROPEFFECT_COPY) !is 0){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 operation |= DND.DROP_COPY;
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 if ((osOperation & COM.DROPEFFECT_LINK) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 operation |= DND.DROP_LINK;
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 if ((osOperation & COM.DROPEFFECT_MOVE) !is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 operation |= DND.DROP_MOVE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 return operation;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
572 private .LRESULT QueryGetData(FORMATETC* pFormatetc) {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 if (transferAgents is null) return COM.E_FAIL;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 TransferData transferData = new TransferData();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 transferData.formatetc = new FORMATETC();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 COM.MoveMemory(transferData.formatetc, pFormatetc, FORMATETC.sizeof);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 transferData.type = transferData.formatetc.cfFormat;
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 // is this type supported by the transfer agent?
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 for (int i = 0; i < transferAgents.length; i++){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 Transfer transfer = transferAgents[i];
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 if (transfer !is null && transfer.isSupportedType(transferData))
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 return COM.DV_E_FORMATETC;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 /* QueryInterface([in] riid, [out] ppvObject)
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 * 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
591 * 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
592 */
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
593 private HRESULT QueryInterface(REFIID riid, void** ppvObject) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
594 if (riid is null || ppvObject is null)
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 return COM.E_INVALIDARG;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
597 if (COM.IsEqualGUID(riid, &COM.IIDIUnknown) || COM.IsEqualGUID(riid, &COM.IIDIDropSource)) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
598 *ppvObject = cast(void*)cast(IUnknown) iDropSource;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
603 if (COM.IsEqualGUID(riid, &COM.IIDIDataObject) ) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
604 *ppvObject = cast(void*)cast(IDataObject) iDataObject;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 AddRef();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
609 *ppvObject = null;
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 return COM.E_NOINTERFACE;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
613 private ULONG Release() {
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 refCount--;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 if (refCount is 0) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 disposeCOMInterfaces();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 COM.CoFreeUnusedLibraries();
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 return refCount;
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
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 * 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
624 * 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
625 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 * @param listener the listener which should be notified
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 * @exception IllegalArgumentException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 * <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
630 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 * @exception DWTException <ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 * <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
633 * <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
634 * </ul>
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 * @see DragSourceListener
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 * @see #addDragListener
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 public void removeDragListener(DragSourceListener listener) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 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
641 removeListener(DND.DragStart, listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 removeListener(DND.DragSetData, listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 removeListener(DND.DragEnd, listener);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
646 .LRESULT SetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium, int fRelease) {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
647 if (pFormatetc is null || pmedium is null) return COM.E_INVALIDARG;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
648 FORMATETC* formatetc = new FORMATETC();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 COM.MoveMemory(formatetc, pFormatetc, FORMATETC.sizeof);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 if (formatetc.cfFormat is CFSTR_PERFORMEDDROPEFFECT && formatetc.tymed is COM.TYMED_HGLOBAL) {
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
651 STGMEDIUM* stgmedium = new STGMEDIUM();
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 COM.MoveMemory(stgmedium, pmedium,STGMEDIUM.sizeof);
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
653 int[1] ptrEffect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
654 OS.MoveMemory(ptrEffect.ptr, stgmedium.unionField,4);
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
655 int[1] effect;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
656 OS.MoveMemory(effect.ptr, ptrEffect[0],4);
135
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 dataEffect = osToOp(effect[0]);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 if (fRelease is 1) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 COM.ReleaseStgMedium(pmedium);
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 return COM.S_OK;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 * 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
667 * used during a drag and drop operation.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 * @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
670 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 * @since 3.3
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
673 public void setDragSourceEffect(DragSourceEffect effect) {
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 dragEffect = effect;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 /**
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 * 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
679 * 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
680 * a successful drop has occurred.
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
681 *
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
682 * @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
683 * dragged from this source
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
684 */
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 public void setTransfer(Transfer[] transferAgents){
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
686 this.transferAgents = transferAgents;
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
687 }
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688
242e33c0e383 Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
689 }
136
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
690
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
691
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
692 private class _IDropSourceImpl : IDropSource {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
693
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
694 DragSource parent;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
695 this(DragSource p) { parent = p; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
696 extern (Windows):
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
697 // interface of IUnknown
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
698 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
699 ULONG AddRef() { return parent.AddRef(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
700 ULONG Release() { return parent.Release(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
701
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
702 // interface of IDropSource
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
703 HRESULT QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) { return parent.QueryContinueDrag(fEscapePressed, grfKeyState); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
704 HRESULT GiveFeedback(DWORD dwEffect) { return parent.GiveFeedback(dwEffect);}
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
705 }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
706
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
707 private class _IDataObjectImpl : IDataObject {
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
708
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
709 DragSource parent;
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
710 this(DragSource p) { parent = p; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
711 extern (Windows):
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
712 // interface of IUnknown
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
713 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
714 ULONG AddRef() { return parent.AddRef(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
715 ULONG Release() { return parent.Release(); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
716
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
717
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
718 // interface IDataObject
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
719 LRESULT GetData( FORMATETC *pFormatetc, STGMEDIUM *pmedium) { return parent.GetData(pFormatetc, pmedium); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
720 LRESULT GetDataHere(FORMATETC * pFormatetc, STGMEDIUM * pmedium) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
721 LRESULT QueryGetData(FORMATETC* pFormatetc) { return parent.QueryGetData(pFormatetc); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
722 LRESULT GetCanonicalFormatEtc(FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
723 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
724 LRESULT EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC * ppenumFormatetc) { return parent.EnumFormatEtc(dwDirection, ppenumFormatetc); }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
725 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
726 LRESULT DUnadvise(DWORD dwConnection) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
727 LRESULT EnumDAdvise(IEnumSTATDATA * ppenumAdvise) { return COM.E_NOTIMPL; }
04e357b8343d DragSource
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
728 }