annotate dwt/dnd/Clipboard.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 5a30aa9820f3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
146
a3471c255cd2 bugfixes
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: 255
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.Clipboard;
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.internal.Converter;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.internal.gtk.OS;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.widgets.Display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.dnd.Transfer;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.dnd.TransferData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.dnd.DND;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.dnd.ClipboardProxy;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.dwthelper.utils;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import tango.core.Thread;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 static import tango.stdc.string;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 * The <code>Clipboard</code> provides a mechanism for transferring data from one
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 * application to another or within an application.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 * <p>IMPORTANT: This class is <em>not</em> intended to be subclassed.</p>
259
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 255
diff changeset
38 *
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 255
diff changeset
39 * @see <a href="http://www.eclipse.org/swt/snippets/#clipboard">Clipboard snippets</a>
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 255
diff changeset
40 * @see <a href="http://www.eclipse.org/swt/examples.php">DWT Example: ClipboardExample</a>
c0d810de7093 Update SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 255
diff changeset
41 * @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
42 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 public class Clipboard {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 private Display display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46
146
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
47 private static void* GTKCLIPBOARD;
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
48 private static void* GTKPRIMARYCLIPBOARD;
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 private static void* TARGET;
146
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
50 private static bool static_this_completed = false;
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
51 private static void static_this(){
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
52 if( !static_this_completed ){
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
53 GTKCLIPBOARD = OS.gtk_clipboard_get( cast(void*)OS.GDK_NONE);
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
54 auto primary = OS.gdk_atom_intern("PRIMARY".ptr, false);
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
55 GTKPRIMARYCLIPBOARD = OS.gtk_clipboard_get(primary);
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
56 TARGET = OS.gdk_atom_intern("TARGETS".ptr, false);
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
57 static_this_completed = true;
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
58 }
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * Constructs a new instance of this class. Creating an instance of a Clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 * may cause system resources to be allocated depending on the platform. It is therefore
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 * mandatory that the Clipboard instance be disposed when no longer required.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * @param display the display on which to allocate the clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * <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
70 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * @see Clipboard#dispose
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * @see Clipboard#checkSubclass
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 public this(Display display) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 checkSubclass ();
146
a3471c255cd2 bugfixes
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
78 static_this();
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 if (display is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 display = Display.getCurrent();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 if (display is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 display = Display.getDefault();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 if (display.getThread() !is Thread.getThis()) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 DND.error(DWT.ERROR_THREAD_INVALID_ACCESS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 this.display = display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 * Checks that this class can be subclassed.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 * <p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 * The DWT class library is intended to be subclassed
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 * only at specific, controlled points. This method enforces this
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 * rule unless it is overridden.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * </p><p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 * <em>IMPORTANT:</em> By providing an implementation of this
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 * method that allows a subclass of a class which does not
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * normally allow subclassing to be created, the implementer
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 * agrees to be fully responsible for the fact that any such
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * subclass will likely fail between DWT releases and will be
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * strongly platform specific. No support is provided for
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * user-written classes which are implemented in this fashion.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * </p><p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 * The ability to subclass outside of the allowed DWT classes
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 * is intended purely to enable those not on the DWT development
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 * team to implement patches in order to get around specific
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * limitations in advance of when those limitations can be
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 * addressed by the team. Subclassing should not be attempted
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 * without an intimate and detailed understanding of the hierarchy.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 * </p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 protected void checkSubclass () {
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 158
diff changeset
119 String name = this.classinfo.name;
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 158
diff changeset
120 String validName = Clipboard.classinfo.name;
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 if ( validName !=/*eq*/ name ) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 DND.error (DWT.ERROR_INVALID_SUBCLASS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 * Throws an <code>DWTException</code> if the receiver can not
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 * be accessed by the caller. This may include both checks on
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 * the state of the receiver and more generally on the entire
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 * execution context. This method <em>should</em> be called by
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 * widget implementors to enforce the standard DWT invariants.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 * <p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 * Currently, it is an error to invoke any method (other than
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 * <code>isDisposed()</code>) on a widget that has had its
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 * <code>dispose()</code> method called. It is also an error
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 * to call widget methods from any thread that is different
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 * from the thread that created the widget.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 * </p><p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 * In future releases of DWT, there may be more or fewer error
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 * checks and exceptions may be thrown for different reasons.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 * </p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 * <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
145 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 protected void checkWidget () {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 Display display = this.display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 if (display is null) DND.error (DWT.ERROR_WIDGET_DISPOSED);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 if (display.getThread() !is Thread.getThis ()) DND.error (DWT.ERROR_THREAD_INVALID_ACCESS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 if (display.isDisposed()) DND.error(DWT.ERROR_WIDGET_DISPOSED);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 * If this clipboard is currently the owner of the data on the system clipboard,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 * clear the contents. If this clipboard is not the owner, then nothing is done.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 * Note that there are clipboard assistant applications that take ownership of
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 * data or make copies of data when it is placed on the clipboard. In these
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 * cases, it may not be possible to clear the clipboard.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 * <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
164 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * @since 3.1
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 public void clearContents() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 clearContents(DND.CLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * If this clipboard is currently the owner of the data on the specified
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * clipboard, clear the contents. If this clipboard is not the owner, then
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * nothing is done.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 * <p>Note that there are clipboard assistant applications that take ownership
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 * of data or make copies of data when it is placed on the clipboard. In these
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 * cases, it may not be possible to clear the clipboard.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 * <p>The clipboards value is either one of the clipboard constants defined in
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 * class <code>DND</code>, or must be built by <em>bitwise OR</em>'ing together
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 * (that is, using the <code>int</code> "|" operator) two or more
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 * of those <code>DND</code> clipboard constants.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 * @param clipboards to be cleared
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 * <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
191 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 * @see DND#CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 * @see DND#SELECTION_CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 * @since 3.1
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 public void clearContents(int clipboards) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 checkWidget();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 ClipboardProxy proxy = ClipboardProxy._getInstance(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 proxy.clear(this, clipboards);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 * Disposes of the operating system resources associated with the clipboard.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 * The data will still be available on the system clipboard after the dispose
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 * method is called.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 * <p>NOTE: On some platforms the data will not be available once the application
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 * has exited or the display has been disposed.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 * <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
214 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 public void dispose () {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 if (isDisposed()) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 if (display.getThread() !is Thread.getThis()) DND.error(DWT.ERROR_THREAD_INVALID_ACCESS);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 display = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 * Retrieve the data of the specified type currently available on the system
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 * clipboard. Refer to the specific subclass of <code>Transfer</code> to
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 * determine the type of object returned.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 * <p>The following snippet shows text and RTF text being retrieved from the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 * clipboard:</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 * <code><pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 * Clipboard clipboard = new Clipboard(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 * TextTransfer textTransfer = TextTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 * String textData = (String)clipboard.getContents(textTransfer);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 * if (textData !is null) System.out.println("Text is "+textData);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 * RTFTransfer rtfTransfer = RTFTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 * String rtfData = (String)clipboard.getContents(rtfTransfer);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 * if (rtfData !is null) System.out.println("RTF Text is "+rtfData);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 * clipboard.dispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 * </code></pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 * @param transfer the transfer agent for the type of data being requested
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 * @return the data obtained from the clipboard or null if no data of this type is available
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 * <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
247 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 * @exception IllegalArgumentException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 * <li>ERROR_NULL_ARGUMENT - if transfer is null</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 * @see Transfer
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 public Object getContents(Transfer transfer) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 return getContents(transfer, DND.CLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 * Retrieve the data of the specified type currently available on the specified
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 * clipboard. Refer to the specific subclass of <code>Transfer</code> to
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 * determine the type of object returned.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 * <p>The following snippet shows text and RTF text being retrieved from the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 * clipboard:</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 * <code><pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 * Clipboard clipboard = new Clipboard(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 * TextTransfer textTransfer = TextTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 * String textData = (String)clipboard.getContents(textTransfer);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 * if (textData !is null) System.out.println("Text is "+textData);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 * RTFTransfer rtfTransfer = RTFTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 * String rtfData = (String)clipboard.getContents(rtfTransfer, DND.CLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 * if (rtfData !is null) System.out.println("RTF Text is "+rtfData);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 * clipboard.dispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 * </code></pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 * <p>The clipboards value is either one of the clipboard constants defined in
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 * class <code>DND</code>, or must be built by <em>bitwise OR</em>'ing together
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 * (that is, using the <code>int</code> "|" operator) two or more
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 * of those <code>DND</code> clipboard constants.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 * @param transfer the transfer agent for the type of data being requested
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 * @param clipboards on which to look for data
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 * @return the data obtained from the clipboard or null if no data of this type is available
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 * <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
290 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 * @exception IllegalArgumentException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 * <li>ERROR_NULL_ARGUMENT - if transfer is null</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 * @see Transfer
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 * @see DND#CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 * @see DND#SELECTION_CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 * @since 3.1
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 public Object getContents(Transfer transfer, int clipboards) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 checkWidget();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 if (transfer is null) DND.error(DWT.ERROR_NULL_ARGUMENT);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 GtkSelectionData* selection_data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 auto typeIds = transfer.getTypeIds();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 for (int i = 0; i < typeIds.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 if ((clipboards & DND.CLIPBOARD) !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 selection_data = gtk_clipboard_wait_for_contents(GTKCLIPBOARD, cast(void*)typeIds[i]);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 if (selection_data !is null) break;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 if ((clipboards & DND.SELECTION_CLIPBOARD) !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 selection_data = gtk_clipboard_wait_for_contents(GTKPRIMARYCLIPBOARD, cast(void*)typeIds[i]);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 if (selection_data is null) return null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 GtkSelectionData* gtkSelectionData = selection_data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 TransferData tdata = new TransferData();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 tdata.type = gtkSelectionData.type;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 tdata.pValue = gtkSelectionData.data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 tdata.length = gtkSelectionData.length;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 tdata.format = gtkSelectionData.format;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 Object result = transfer.nativeToJava(tdata);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 OS.gtk_selection_data_free(selection_data);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 return result;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 * Returns <code>true</code> if the clipboard has been disposed,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 * and <code>false</code> otherwise.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 * <p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 * This method gets the dispose state for the clipboard.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 * When a clipboard has been disposed, it is an error to
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 * invoke any other method using the clipboard.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 * </p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 * @return <code>true</code> when the widget is disposed and <code>false</code> otherwise
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 * @since 3.0
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 public bool isDisposed () {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 return (display is null);
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 * Place data of the specified type on the system clipboard. More than one type
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 * of data can be placed on the system clipboard at the same time. Setting the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 * data clears any previous data from the system clipboard, regardless of type.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 * <p>NOTE: On some platforms, the data is immediately copied to the system
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 * clipboard but on other platforms it is provided upon request. As a result,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 * if the application modifies the data object it has set on the clipboard, that
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 * modification may or may not be available when the data is subsequently
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 * requested.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 * <p>The following snippet shows text and RTF text being set on the copy/paste
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 * clipboard:
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 * </p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 * <code><pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 * Clipboard clipboard = new Clipboard(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 * String textData = "Hello World";
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 * String rtfData = "{\\rtf1\\b\\i Hello World}";
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 * TextTransfer textTransfer = TextTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 * RTFTransfer rtfTransfer = RTFTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 * Transfer[] transfers = new Transfer[]{textTransfer, rtfTransfer};
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 * Object[] data = new Object[]{textData, rtfData};
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 * clipboard.setContents(data, transfers);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 * clipboard.dispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 * </code></pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 * @param data the data to be set in the clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 * @param dataTypes the transfer agents that will convert the data to its
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 * platform specific format; each entry in the data array must have a
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 * corresponding dataType
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 * @exception IllegalArgumentException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 * <li>ERROR_INVALID_ARGUMENT - if data is null or datatypes is null
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 * or the length of data is not the same as the length of dataTypes</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 * <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
383 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 * @exception DWTError <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 * <li>ERROR_CANNOT_SET_CLIPBOARD - if the clipboard is locked or otherwise unavailable</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 * <p>NOTE: ERROR_CANNOT_SET_CLIPBOARD should be an DWTException, since it is a
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 * recoverable error, but can not be changed due to backward compatibility.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 public void setContents(Object[] data, Transfer[] dataTypes) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 setContents(data, dataTypes, DND.CLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 * Place data of the specified type on the specified clipboard. More than one
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 * type of data can be placed on the specified clipboard at the same time.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 * Setting the data clears any previous data from the specified
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 * clipboard, regardless of type.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 * <p>NOTE: On some platforms, the data is immediately copied to the specified
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 * clipboard but on other platforms it is provided upon request. As a result,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 * if the application modifies the data object it has set on the clipboard, that
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 * modification may or may not be available when the data is subsequently
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 * requested.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 * <p>The clipboards value is either one of the clipboard constants defined in
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 * class <code>DND</code>, or must be built by <em>bitwise OR</em>'ing together
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 * (that is, using the <code>int</code> "|" operator) two or more
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 * of those <code>DND</code> clipboard constants.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 * <p>The following snippet shows text and RTF text being set on the copy/paste
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 * clipboard:
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 * </p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 * <code><pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 * Clipboard clipboard = new Clipboard(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 * String textData = "Hello World";
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 * String rtfData = "{\\rtf1\\b\\i Hello World}";
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 * TextTransfer textTransfer = TextTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 * RTFTransfer rtfTransfer = RTFTransfer.getInstance();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 * Transfer[] transfers = new Transfer[]{textTransfer, rtfTransfer};
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 * Object[] data = new Object[]{textData, rtfData};
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 * clipboard.setContents(data, transfers, DND.CLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 * clipboard.dispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 * </code></pre>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 * @param data the data to be set in the clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 * @param dataTypes the transfer agents that will convert the data to its
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 * platform specific format; each entry in the data array must have a
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 * corresponding dataType
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 * @param clipboards on which to set the data
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 * @exception IllegalArgumentException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 * <li>ERROR_INVALID_ARGUMENT - if data is null or datatypes is null
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 * or the length of data is not the same as the length of dataTypes</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 * <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
441 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 * @exception DWTError <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 * <li>ERROR_CANNOT_SET_CLIPBOARD - if the clipboard is locked or otherwise unavailable</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 * <p>NOTE: ERROR_CANNOT_SET_CLIPBOARD should be an DWTException, since it is a
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 * recoverable error, but can not be changed due to backward compatibility.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 * @see DND#CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 * @see DND#SELECTION_CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 * @since 3.1
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 public void setContents(Object[] data, Transfer[] dataTypes, int clipboards) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 checkWidget();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 if (data is null || dataTypes is null || data.length !is dataTypes.length || data.length is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 DND.error(DWT.ERROR_INVALID_ARGUMENT);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 for (int i = 0; i < data.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 if (data[i] is null || dataTypes[i] is null || !dataTypes[i].validate(data[i])) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 DND.error(DWT.ERROR_INVALID_ARGUMENT);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 ClipboardProxy proxy = ClipboardProxy._getInstance(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 if (!proxy.setData(this, data, dataTypes, clipboards)) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 DND.error(DND.ERROR_CANNOT_SET_CLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 * Returns an array of the data types currently available on the system
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 * clipboard. Use with Transfer.isSupportedType.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 * @return array of data types currently available on the system clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * <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
479 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 * @see Transfer#isSupportedType
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 * @since 3.0
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 public TransferData[] getAvailableTypes() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 return getAvailableTypes(DND.CLIPBOARD);
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 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 * Returns an array of the data types currently available on the specified
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 * clipboard. Use with Transfer.isSupportedType.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 * <p>The clipboards value is either one of the clipboard constants defined in
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 * class <code>DND</code>, or must be built by <em>bitwise OR</em>'ing together
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 * (that is, using the <code>int</code> "|" operator) two or more
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 * of those <code>DND</code> clipboard constants.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 * @param clipboards from which to get the data types
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 * @return array of data types currently available on the specified clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 * <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
504 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 * @see Transfer#isSupportedType
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 * @see DND#CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 * @see DND#SELECTION_CLIPBOARD
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 * @since 3.1
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 public TransferData[] getAvailableTypes(int clipboards) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 checkWidget();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 TransferData[] result = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 if ((clipboards & DND.CLIPBOARD) !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 auto types = getAvailableClipboardTypes();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 result = new TransferData[types.length];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 for (int i = 0; i < types.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 result[i] = new TransferData();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 result[i].type = types[i];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 if ((clipboards & DND.SELECTION_CLIPBOARD) !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 auto types = getAvailablePrimaryTypes();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 int offset = 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 if (result !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 TransferData[] newResult = new TransferData[result.length + types.length];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 System.arraycopy(result,0, newResult, 0, result.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 offset = result.length;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 result = newResult;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 } else {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 result = new TransferData[types.length];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 for (int i = 0; i < types.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 result[offset+i] = new TransferData();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 result[offset+i].type = types[i];
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 return result is null ? new TransferData[0] : result;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 * Returns a platform specific list of the data types currently available on the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 * system clipboard.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * <p>Note: <code>getAvailableTypeNames</code> is a utility for writing a Transfer
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * sub-class. It should NOT be used within an application because it provides
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * platform specific information.</p>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * @return a platform specific list of the data types currently available on the
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 * system clipboard
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 * @exception DWTException <ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 * <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
556 * </ul>
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 */
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 158
diff changeset
558 public String[] getAvailableTypeNames() {
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 checkWidget();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 auto types1 = getAvailableClipboardTypes();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 auto types2 = getAvailablePrimaryTypes();
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 158
diff changeset
562 String[] result = new String[types1.length + types2.length];
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 int count = 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 for (int i = 0; i < types1.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 auto pName = OS.gdk_atom_name(types1[i]);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 if (pName is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 continue;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 }
255
5a30aa9820f3 removed tango.stdc.stringz imports and allow null for arrays and string arguments.
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
569 String buffer = fromStringz( pName ).dup;
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 OS.g_free (pName);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 result[count++] = "GTKCLIPBOARD "~buffer;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 for (int i = 0; i < types2.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 auto pName = OS.gdk_atom_name(types2[i]);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 if (pName is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 continue;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 }
255
5a30aa9820f3 removed tango.stdc.stringz imports and allow null for arrays and string arguments.
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
578 String buffer = fromStringz( pName ).dup;
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 OS.g_free (pName);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 result[count++] = "GTKPRIMARYCLIPBOARD "~buffer;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 if (count < result.length){
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 158
diff changeset
583 String[] temp = new String[count];
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 System.arraycopy(result, 0, temp, 0, count);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 result = temp;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 return result;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 private void*[] getAvailablePrimaryTypes() {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 void*[] types;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 auto selection_data = gtk_clipboard_wait_for_contents(GTKPRIMARYCLIPBOARD, TARGET);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 if (selection_data !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 try {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 GtkSelectionData* gtkSelectionData = selection_data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 if (gtkSelectionData.length !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 types = cast(void*[])new int[gtkSelectionData.length * 8 / gtkSelectionData.format];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 tango.stdc.string.memmove( cast(void*)types.ptr, gtkSelectionData.data, gtkSelectionData.length );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 } finally {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 OS.gtk_selection_data_free(selection_data);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 return types;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 private void*[] getAvailableClipboardTypes () {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 void*[] types;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 auto selection_data = gtk_clipboard_wait_for_contents(GTKCLIPBOARD, TARGET);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 if (selection_data !is null) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 try {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 GtkSelectionData* gtkSelectionData = selection_data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 if (gtkSelectionData.length !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 types = cast(void*[])new int[gtkSelectionData.length * 8 / gtkSelectionData.format];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 tango.stdc.string.memmove( cast(void*)types, gtkSelectionData.data, gtkSelectionData.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 } finally {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 OS.gtk_selection_data_free(selection_data);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 return types;
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 GtkSelectionData* gtk_clipboard_wait_for_contents(void* clipboard, void* target) {
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 158
diff changeset
624 String key = "org.eclipse.swt.internal.gtk.dispatchEvent";
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 Display display = this.display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 ArrayWrapperInt arr = new ArrayWrapperInt( [ OS.GDK_PROPERTY_NOTIFY, OS.GDK_SELECTION_CLEAR, OS.GDK_SELECTION_REQUEST, OS.GDK_SELECTION_NOTIFY ] );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 display.setData(key, arr );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 GtkSelectionData* selection_data = OS.gtk_clipboard_wait_for_contents(clipboard, target);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 display.setData(key, null);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 return selection_data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 }