annotate dwt/dnd/DragSource.d @ 259:c0d810de7093

Update SWT 3.4M7 to 3.4
author Frank Benoit <benoit@tionex.de>
date Sun, 29 Jun 2008 14:33:38 +0200
parents ce446666f5a2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
17f8449522fd overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
1 /*******************************************************************************
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
2 * Copyright (c) 2000, 2008 IBM Corporation and others.
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
108
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 92
diff changeset
10 * Port to the D programming language:
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 92
diff changeset
11 * Frank Benoit <benoit@tionex.de>
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.dnd.DragSource;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.DWT;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.DWTError;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.DWTException;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.graphics.Image;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.graphics.ImageData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.internal.gtk.OS;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.widgets.Control;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.widgets.Display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.widgets.Event;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.widgets.Listener;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.widgets.Table;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.widgets.Tree;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.widgets.Widget;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwt.dnd.Transfer;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwt.dnd.DragSourceEffect;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 import dwt.dnd.DragSourceListener;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 import dwt.dnd.DND;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 import dwt.dnd.TreeDragSourceEffect;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 import dwt.dnd.TableDragSourceEffect;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 import dwt.dnd.DNDListener;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 import dwt.dnd.DNDEvent;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 import dwt.dnd.TransferData;
200
08789b28bdf3 import dwt.dwthelper.utils now explicit
Frank Benoit <benoit@tionex.de>
parents: 192
diff changeset
39 import dwt.dwthelper.utils;
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 import tango.core.Thread;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 * <code>DragSource</code> defines the source object for a drag and drop transfer.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 * <p>IMPORTANT: This class is <em>not</em> intended to be subclassed.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * <p>A drag source is the object which originates a drag and drop operation. For the specified widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * it defines the type of data that is available for dragging and the set of operations that can
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * be performed on that data. The operations can be any bit-wise combination of DND.MOVE, DND.COPY or
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * DND.LINK. The type of data that can be transferred is specified by subclasses of Transfer such as
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 * TextTransfer or FileTransfer. The type of data transferred can be a predefined system type or it
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * can be a type defined by the application. For instructions on how to define your own transfer type,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 * refer to <code>ByteArrayTransfer</code>.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * <p>You may have several DragSources in an application but you can only have one DragSource
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * per Control. Data dragged from this DragSource can be dropped on a site within this application
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * or it can be dropped on another application such as an external Text editor.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 * <p>The application supplies the content of the data being transferred by implementing the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * <code>DragSourceListener</code> and associating it with the DragSource via DragSource#addDragListener.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 * <p>When a successful move operation occurs, the application is required to take the appropriate
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * action to remove the data from its display and remove any associated operating system resources or
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * internal references. Typically in a move operation, the drop target makes a copy of the data
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * and the drag source deletes the original. However, sometimes copying the data can take a long
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 * time (such as copying a large file). Therefore, on some platforms, the drop target may actually
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * move the data in the operating system rather than make a copy. This is usually only done in
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * file transfers. In this case, the drag source is informed in the DragEnd event that a
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * DROP_TARGET_MOVE was performed. It is the responsibility of the drag source at this point to clean
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * up its displayed information. No action needs to be taken on the operating system resources.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * <p> The following example shows a Label widget that allows text to be dragged from it.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 * <code><pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * // Enable a label as a Drag Source
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * Label label = new Label(shell, DWT.NONE);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 * // This example will allow text to be dragged
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 * Transfer[] types = new Transfer[] {TextTransfer.getInstance()};
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 * // This example will allow the text to be copied or moved to the drop target
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 * int operations = DND.DROP_MOVE | DND.DROP_COPY;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 * DragSource source = new DragSource(label, operations);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 * source.setTransfer(types);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 * source.addDragListener(new DragSourceListener() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * public void dragStart(DragSourceEvent e) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 * // Only start the drag if there is actually text in the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 * // label - this text will be what is dropped on the target.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 * if (label.getText().length() is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 * event.doit = false;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 * }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 * };
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 * public void dragSetData(DragSourceEvent event) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 * // A drop has been performed, so provide the data of the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 * // requested type.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * // (Checking the type of the requested data is only
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 * // necessary if the drag source supports more than
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 * // one data type but is shown here as an example).
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * if (TextTransfer.getInstance().isSupportedType(event.dataType)){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 * event.data = label.getText();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * public void dragFinished(DragSourceEvent event) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * // A Move operation has been performed so remove the data
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 * // from the source
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 * if (event.detail is DND.DROP_MOVE)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 * label.setText("");
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 * });
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 * </pre></code>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 * <dl>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 * <dt><b>Styles</b></dt> <dd>DND.DROP_NONE, DND.DROP_COPY, DND.DROP_MOVE, DND.DROP_LINK</dd>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 * <dt><b>Events</b></dt> <dd>DND.DragStart, DND.DragSetData, DND.DragEnd</dd>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 * </dl>
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
118 *
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
119 * @see <a href="http://www.eclipse.org/swt/snippets/#dnd">Drag and Drop snippets</a>
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
120 * @see <a href="http://www.eclipse.org/swt/examples.php">DWT Example: DNDExample</a>
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
121 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 public class DragSource : Widget {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 // info for registering as a drag source
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 Control control;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 Listener controlListener;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 Transfer[] transferAgents;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 DragSourceEffect dragEffect;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 void* targetList;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 //workaround - remember action performed for DragEnd
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 bool moveData = false;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
136 static const String DEFAULT_DRAG_SOURCE_EFFECT = "DEFAULT_DRAG_SOURCE_EFFECT"; //$NON-NLS-1$
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 // static Callback DragGetData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 // static Callback DragEnd;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 // static Callback DragDataDelete;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 // static this() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 // DragGetData = new Callback(DragSource.class, "DragGetData", 5); //$NON-NLS-1$
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 // if (DragGetData.getAddress() is 0) DWT.error(DWT.ERROR_NO_MORE_CALLBACKS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 // DragEnd = new Callback(DragSource.class, "DragEnd", 2); //$NON-NLS-1$
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 // if (DragEnd.getAddress() is 0) DWT.error(DWT.ERROR_NO_MORE_CALLBACKS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 // DragDataDelete = new Callback(DragSource.class, "DragDataDelete", 2); //$NON-NLS-1$
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 // if (DragDataDelete.getAddress() is 0) DWT.error(DWT.ERROR_NO_MORE_CALLBACKS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 // }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 * Creates a new <code>DragSource</code> to handle dragging from the specified <code>Control</code>.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 * Creating an instance of a DragSource may cause system resources to be allocated depending on the platform.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 * It is therefore mandatory that the DragSource instance be disposed when no longer required.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 * @param control the <code>Control</code> that the user clicks on to initiate the drag
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 * @param style the bitwise OR'ing of allowed operations; this may be a combination of any of
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 * DND.DROP_NONE, DND.DROP_COPY, DND.DROP_MOVE, DND.DROP_LINK
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 * @exception DWTError <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * <li>ERROR_CANNOT_INIT_DRAG - unable to initiate drag source; this will occur if more than one
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 * drag source is created for a control or if the operating system will not allow the creation
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * of the drag source</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 * <p>NOTE: ERROR_CANNOT_INIT_DRAG should be an DWTException, since it is a
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * recoverable error, but can not be changed due to backward compatibility.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 * @see Widget#dispose
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * @see DragSource#checkSubclass
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * @see DND#DROP_NONE
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * @see DND#DROP_COPY
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 * @see DND#DROP_MOVE
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 * @see DND#DROP_LINK
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 public this(Control control, int style) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 super (control, checkStyle(style));
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 this.control = control;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 // if (DragGetData is null || DragEnd is null || DragDataDelete is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 // DND.error(DND.ERROR_CANNOT_INIT_DRAG);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 // }
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
185 if (control.getData(DND.DRAG_SOURCE_KEY) !is null) {
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 DND.error(DND.ERROR_CANNOT_INIT_DRAG);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 }
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
188 control.setData(DND.DRAG_SOURCE_KEY, this);
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 OS.g_signal_connect(control.handle, OS.drag_data_get.ptr, cast(GCallback)&DragGetData, null);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 OS.g_signal_connect(control.handle, OS.drag_end.ptr, cast(GCallback)&DragEnd, null);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 OS.g_signal_connect(control.handle, OS.drag_data_delete.ptr, cast(GCallback)&DragDataDelete, null);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 controlListener = new class() Listener {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 public void handleEvent (Event event) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 if (event.type is DWT.Dispose) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 if (!this.outer.isDisposed()) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 this.outer.dispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 if (event.type is DWT.DragDetect) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 if (!this.outer.isDisposed()) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 this.outer.drag(event);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 };
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 control.addListener (DWT.Dispose, controlListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 control.addListener (DWT.DragDetect, controlListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 Object effect = control.getData(DEFAULT_DRAG_SOURCE_EFFECT);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 if ( auto de = cast(DragSourceEffect)effect ) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 dragEffect = de;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 } else if ( auto tree = cast(Tree)control) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 dragEffect = new TreeDragSourceEffect(tree);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 } else if ( auto table = cast(Table)control ) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 dragEffect = new TableDragSourceEffect(table);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 this.addListener(DWT.Dispose, new class() Listener {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 public void handleEvent(Event e) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 onDispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 });
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 static int checkStyle (int style) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 if (style is DWT.NONE) return DND.DROP_MOVE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 return style;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 private static extern(C) void DragDataDelete(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 GtkWidget *widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 GdkDragContext *drag_context,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 void* user_data )
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 DragSource source = FindDragSource(widget);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 if (source is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 source.dragDataDelete(widget, drag_context);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 private static extern(C) void DragEnd (
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 GtkWidget *widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 GdkDragContext *drag_context,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 void* user_data)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 DragSource source = FindDragSource(widget);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 if (source is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 source.dragEnd(widget, drag_context);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 private static extern(C) void DragGetData(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 GtkWidget *widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 GdkDragContext *context,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 GtkSelectionData *selection_data,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 uint info,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 uint time,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 void* user_data )
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 DragSource source = FindDragSource(widget);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 if (source is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 source.dragGetData(widget, context, selection_data, cast(int)/*64*/info, cast(int)/*64*/time);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 static DragSource FindDragSource(GtkWidget* handle) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 Display display = Display.findDisplay(Thread.getThis());
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 if (display is null || display.isDisposed()) return null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 Widget widget = display.findWidget(handle);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 if (widget is null) return null;
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
273 return cast(DragSource)widget.getData(DND.DRAG_SOURCE_KEY);
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 * Adds the listener to the collection of listeners who will
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 * be notified when a drag and drop operation is in progress, by sending
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 * it one of the messages defined in the <code>DragSourceListener</code>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 * interface.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 * <p><ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 * <li><code>dragStart</code> is called when the user has begun the actions required to drag the widget.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 * This event gives the application the chance to decide if a drag should be started.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 * <li><code>dragSetData</code> is called when the data is required from the drag source.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 * <li><code>dragFinished</code> is called when the drop has successfully completed (mouse up
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 * over a valid target) or has been terminated (such as hitting the ESC key). Perform cleanup
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 * such as removing data from the source side on a successful move operation.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 * </ul></p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 * @param listener the listener which should be notified
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 * @exception IllegalArgumentException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 * @see DragSourceListener
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
302 * @see #getDragListeners
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 * @see #removeDragListener
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 * @see DragSourceEvent
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 public void addDragListener(DragSourceListener listener) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 if (listener is null) DND.error (DWT.ERROR_NULL_ARGUMENT);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 DNDListener typedListener = new DNDListener (listener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 typedListener.dndWidget = this;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 addListener (DND.DragStart, typedListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 addListener (DND.DragSetData, typedListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 addListener (DND.DragEnd, typedListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314
152
17f8449522fd overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
315 protected override void checkSubclass () {
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
316 String name = this.classinfo.name;
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
317 String validName = DragSource.classinfo.name;
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 if ( validName !=/*eq*/ name ) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 DND.error (DWT.ERROR_INVALID_SUBCLASS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 void drag(Event dragEvent) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 moveData = false;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 DNDEvent event = new DNDEvent();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 event.widget = this;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 event.x = dragEvent.x;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 event.y = dragEvent.y;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 event.time = dragEvent.time;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 event.doit = true;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 notifyListeners(DND.DragStart, event);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 if (!event.doit || transferAgents is null || transferAgents.length is 0) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 if (targetList is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 int actions = opToOsOp(getStyle());
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 Image image = event.image;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 auto context = OS.gtk_drag_begin(control.handle, targetList, actions, 1, null);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 if (context !is null && image !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 auto pixbuf = createPixbuf(image);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 OS.gtk_drag_set_icon_pixbuf(context, pixbuf, 0, 0);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 OS.g_object_unref(pixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 void dragEnd(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 GtkWidget *widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 GdkDragContext *context )
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 /*
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 * Bug in GTK. If a drag is initiated using gtk_drag_begin and the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 * mouse is released immediately, the mouse and keyboard remain
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 * grabbed. The fix is to release the grab on the mouse and keyboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 * whenever the drag is terminated.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 * NOTE: We believe that it is never an error to ungrab when
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 * a drag is finished.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 OS.gdk_pointer_ungrab(OS.GDK_CURRENT_TIME);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 OS.gdk_keyboard_ungrab(OS.GDK_CURRENT_TIME);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 int operation = DND.DROP_NONE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 if (context !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 GdkDragContext* gdkDragContext = context;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 if (gdkDragContext.dest_window !is null) { //NOTE: if dest_window is 0, drag was aborted
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 if (moveData) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 operation = DND.DROP_MOVE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 } else {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 operation = osOpToOp(gdkDragContext.action);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 if (operation is DND.DROP_MOVE) operation = DND.DROP_NONE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 DNDEvent event = new DNDEvent();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 event.widget = this;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 //event.time = ???
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 event.doit = operation !is 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 event.detail = operation;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 notifyListeners(DND.DragEnd, event);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 moveData = false;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 void dragGetData(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 GtkWidget *widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 GdkDragContext *context,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 GtkSelectionData *gtkSelectionData,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 uint info,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 uint time )
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 if (gtkSelectionData is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 if (gtkSelectionData.target is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 TransferData transferData = new TransferData();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 transferData.type = gtkSelectionData.target;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 transferData.pValue = gtkSelectionData.data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 transferData.length = gtkSelectionData.length;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 transferData.format = gtkSelectionData.format;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 DNDEvent event = new DNDEvent();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 event.widget = this;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 event.time = time;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 event.dataType = transferData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 notifyListeners(DND.DragSetData, event);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 Transfer transfer = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 for (int i = 0; i < transferAgents.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 Transfer transferAgent = transferAgents[i];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 if (transferAgent !is null && transferAgent.isSupportedType(transferData)) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 transfer = transferAgent;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 break;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 if (transfer is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 transfer.javaToNative(event.data, transferData);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 if (transferData.result !is 1) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 OS.gtk_selection_data_set(gtkSelectionData, transferData.type, transferData.format, transferData.pValue, transferData.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 OS.g_free(transferData.pValue);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 void dragDataDelete(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 GtkWidget *widget,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 GdkDragContext *drag_context)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 moveData = true;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 * Returns the Control which is registered for this DragSource. This is the control that the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 * user clicks in to initiate dragging.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 * @return the Control which is registered for this DragSource
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 public Control getControl () {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 return control;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 /**
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
439 * Returns an array of listeners who will be notified when a drag and drop
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
440 * operation is in progress, by sending it one of the messages defined in
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
441 * the <code>DragSourceListener</code> interface.
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
442 *
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
443 * @return the listeners who will be notified when a drag and drop
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
444 * operation is in progress
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
445 *
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
446 * @exception DWTException <ul>
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
447 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
448 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
449 * </ul>
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
450 *
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
451 * @see DragSourceListener
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
452 * @see #addDragListener
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
453 * @see #removeDragListener
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
454 * @see DragSourceEvent
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
455 *
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
456 * @since 3.4
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
457 */
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
458 public DragSourceListener[] getDragListeners() {
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
459 Listener[] listeners = getListeners(DND.DragStart);
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
460 int length = listeners.length;
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
461 DragSourceListener[] dragListeners = new DragSourceListener[length];
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
462 int count = 0;
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
463 for (int i = 0; i < length; i++) {
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
464 Listener listener = listeners[i];
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
465 if ( auto l = cast(DNDListener)listener ) {
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
466 dragListeners[count] = cast(DragSourceListener) (l.getEventListener());
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
467 count++;
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
468 }
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
469 }
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
470 if (count is length) return dragListeners;
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
471 DragSourceListener[] result = new DragSourceListener[count];
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
472 SimpleType!(DragSourceListener).arraycopy(dragListeners, 0, result, 0, count);
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
473 return result;
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
474 }
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
475
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
476 /**
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 * Returns the drag effect that is registered for this DragSource. This drag
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * effect will be used during a drag and drop operation.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 * @return the drag effect that is registered for this DragSource
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 * @since 3.3
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 public DragSourceEffect getDragSourceEffect() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 return dragEffect;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 * Returns the list of data types that can be transferred by this DragSource.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 * @return the list of data types that can be transferred by this DragSource
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 public Transfer[] getTransfer(){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 return transferAgents;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 void onDispose() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 if (control is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 if (targetList !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 OS.gtk_target_list_unref(targetList);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 targetList = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 if (controlListener !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 control.removeListener(DWT.Dispose, controlListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 control.removeListener(DWT.DragDetect, controlListener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 controlListener = null;
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
508 control.setData(DND.DRAG_SOURCE_KEY, null);
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 control = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 transferAgents = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 int opToOsOp(int operation){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 int osOperation = 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 if ((operation & DND.DROP_COPY) is DND.DROP_COPY)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 osOperation |= OS.GDK_ACTION_COPY;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 if ((operation & DND.DROP_MOVE) is DND.DROP_MOVE)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 osOperation |= OS.GDK_ACTION_MOVE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 if ((operation & DND.DROP_LINK) is DND.DROP_LINK)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 osOperation |= OS.GDK_ACTION_LINK;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 return osOperation;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 int osOpToOp(int osOperation){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 int operation = DND.DROP_NONE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 if ((osOperation & OS.GDK_ACTION_COPY) is OS.GDK_ACTION_COPY)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 operation |= DND.DROP_COPY;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 if ((osOperation & OS.GDK_ACTION_MOVE) is OS.GDK_ACTION_MOVE)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 operation |= DND.DROP_MOVE;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 if ((osOperation & OS.GDK_ACTION_LINK) is OS.GDK_ACTION_LINK)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 operation |= DND.DROP_LINK;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 return operation;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 * Removes the listener from the collection of listeners who will
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 * be notified when a drag and drop operation is in progress.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 *
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
543 * @param listener the listener which should no longer be notified
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 * @exception IllegalArgumentException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 * @see DragSourceListener
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 * @see #addDragListener
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 240
diff changeset
555 * @see #getDragListeners
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 public void removeDragListener(DragSourceListener listener) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 if (listener is null) DND.error (DWT.ERROR_NULL_ARGUMENT);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 removeListener (DND.DragStart, listener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 removeListener (DND.DragSetData, listener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 removeListener (DND.DragEnd, listener);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 * Specifies the drag effect for this DragSource. This drag effect will be
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 * used during a drag and drop operation.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 * @param effect the drag effect that is registered for this DragSource
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 * @since 3.3
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 public void setDragSourceEffect(DragSourceEffect effect) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 dragEffect = effect;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 * Specifies the list of data types that can be transferred by this DragSource.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 * The application must be able to provide data to match each of these types when
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 * a successful drop has occurred.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 * @param transferAgents a list of Transfer objects which define the types of data that can be
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 * dragged from this source
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 public void setTransfer(Transfer[] transferAgents){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 if (targetList !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 OS.gtk_target_list_unref(targetList);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 targetList = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 this.transferAgents = transferAgents;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 if (transferAgents is null || transferAgents.length is 0) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 GtkTargetEntry*[] targets;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 for (int i = 0; i < transferAgents.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 Transfer transfer = transferAgents[i];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 if (transfer !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 int[] typeIds = transfer.getTypeIds();
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
597 String[] typeNames = transfer.getTypeNames();
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 for (int j = 0; j < typeIds.length; j++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 GtkTargetEntry* entry = new GtkTargetEntry();
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
600 String type = typeNames[j];
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 entry.target = cast(char*)OS.g_malloc(type.length+1);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 entry.target[ 0 .. type.length ] = type[];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 entry.target[ type.length ] = '\0';
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 entry.info = typeIds[j];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 GtkTargetEntry*[] newTargets = new GtkTargetEntry*[targets.length + 1];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 SimpleType!(GtkTargetEntry*).arraycopy(targets, 0, newTargets, 0, targets.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 newTargets[targets.length] = entry;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 targets = newTargets;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 void* pTargets = OS.g_malloc(targets.length * GtkTargetEntry.sizeof);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 for (int i = 0; i < targets.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 tango.stdc.string.memmove(pTargets + i*GtkTargetEntry.sizeof, targets[i], GtkTargetEntry.sizeof);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 targetList = OS.gtk_target_list_new(pTargets, targets.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 for (int i = 0; i < targets.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 OS.g_free(targets[i].target);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 static GdkDrawable* createPixbuf(Image image) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 int w, h;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 OS.gdk_drawable_get_size (image.pixmap, &w, &h);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 auto colormap = OS.gdk_colormap_get_system ();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 void* pixbuf;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 bool hasMask = image.mask !is null && OS.gdk_drawable_get_depth (image.mask) is 1;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 if (hasMask) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 pixbuf = OS.gdk_pixbuf_new (OS.GDK_COLORSPACE_RGB, true, 8, w, h);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 if (pixbuf is null) DWT.error (DWT.ERROR_NO_HANDLES);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 OS.gdk_pixbuf_get_from_drawable (pixbuf, image.pixmap, colormap, 0, 0, 0, 0, w , h);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 auto maskPixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, false, 8, w , h );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 if (maskPixbuf is null) DWT.error (DWT.ERROR_NO_HANDLES);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 OS.gdk_pixbuf_get_from_drawable(maskPixbuf, image.mask, null, 0, 0, 0, 0, w , h );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 int stride = OS.gdk_pixbuf_get_rowstride(pixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 auto pixels = OS.gdk_pixbuf_get_pixels(pixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 byte[] line = new byte[stride];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 int maskStride = OS.gdk_pixbuf_get_rowstride(maskPixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 auto maskPixels = OS.gdk_pixbuf_get_pixels(maskPixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 byte[] maskLine = new byte[maskStride];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 for (int y=0; y<h; y++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 auto offset = pixels + (y * stride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645 tango.stdc.string.memmove(line.ptr, offset, stride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 auto maskOffset = maskPixels + (y * maskStride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 tango.stdc.string.memmove(maskLine.ptr, maskOffset, maskStride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 for (int x=0; x<w; x++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 if (maskLine[x * 3] is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 line[x * 4 + 3] = 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 tango.stdc.string.memmove(offset, line.ptr, stride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 OS.g_object_unref(maskPixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 } else {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 ImageData data = image.getImageData ();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 bool hasAlpha = data.getTransparencyType () is DWT.TRANSPARENCY_ALPHA;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 pixbuf = OS.gdk_pixbuf_new (OS.GDK_COLORSPACE_RGB, hasAlpha, 8, w , h );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 if (pixbuf is null) DWT.error (DWT.ERROR_NO_HANDLES);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 OS.gdk_pixbuf_get_from_drawable (pixbuf, image.pixmap, colormap, 0, 0, 0, 0, w , h );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 if (hasAlpha) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 byte [] alpha = data.alphaData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664 int stride = OS.gdk_pixbuf_get_rowstride (pixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 auto pixels = OS.gdk_pixbuf_get_pixels (pixbuf);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 byte [] line = new byte [stride];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
667 for (int y = 0; y < h ; y++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 auto offset = pixels + (y * stride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 tango.stdc.string.memmove (line.ptr, offset, stride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 for (int x = 0; x < w ; x++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 line [x*4+3] = alpha [y*w +x];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
673 tango.stdc.string.memmove (offset, line.ptr, stride);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 return cast(GdkDrawable*)pixbuf;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 }