annotate org.eclipse.swt.gtk.linux.x86/src/org/eclipse/swt/dnd/DragSource.d @ 47:65761bc28ab2

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