Mercurial > projects > dwt-win
annotate dwt/dnd/URLTransfer.d @ 213:36f5cb12e1a2
Update to SWT 3.4M7
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 17 May 2008 17:34:28 +0200 |
parents | ab60f3309436 |
children | e2affbeb686d |
rev | line source |
---|---|
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1 /******************************************************************************* |
213 | 2 * Copyright (c) 2000, 20007 IBM Corporation and others. |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3 * All rights reserved. This program and the accompanying materials |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
4 * are made available under the terms of the Eclipse Public License v1.0 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
5 * which accompanies this distribution, and is available at |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
6 * http://www.eclipse.org/legal/epl-v10.html |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
7 * |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
8 * Contributors: |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
9 * IBM Corporation - initial API and implementation |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
10 * Port to the D programming language: |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 * Frank Benoit <benoit@tionex.de> |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
12 *******************************************************************************/ |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
13 module dwt.dnd.URLTransfer; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
14 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 import dwt.internal.ole.win32.COM; |
145 | 16 import dwt.internal.ole.win32.OBJIDL; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
17 import dwt.internal.win32.OS; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
18 |
145 | 19 import dwt.dnd.ByteArrayTransfer; |
20 import dwt.dnd.TransferData; | |
21 import dwt.dnd.DND; | |
22 | |
23 import dwt.dwthelper.utils; | |
24 static import tango.text.Text; | |
25 alias tango.text.Text.Text!(char) StringBuffer; | |
26 | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
27 /** |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
28 * The class <code>URLTransfer</code> provides a platform specific mechanism |
213 | 29 * for converting text in URL format represented as a java <code>String</code> |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
30 * to a platform specific representation of the data and vice versa. See |
213 | 31 * <code>Transfer</code> for additional information. The string |
32 * must contain a fully specified url. | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 * |
213 | 34 * <p>An example of a java <code>String</code> containing a URL is shown |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 * below:</p> |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 * |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
37 * <code><pre> |
213 | 38 * String url = "http://www.eclipse.org"; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
39 * </code></pre> |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
40 */ |
213 | 41 public class URLTransfer : ByteArrayTransfer { |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
42 |
145 | 43 static URLTransfer _instance; |
212
ab60f3309436
reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents:
197
diff
changeset
|
44 static const String CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$ |
145 | 45 static const int CFSTR_INETURLID; |
46 | |
47 static this(){ | |
48 CFSTR_INETURLID = registerType(CFSTR_INETURL); | |
49 } | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
51 private this() {} |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
52 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
53 /** |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 * Returns the singleton instance of the URLTransfer class. |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
55 * |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
56 * @return the singleton instance of the URLTransfer class |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
57 */ |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
58 public static URLTransfer getInstance () { |
145 | 59 if( _instance is null ){ |
60 synchronized { | |
61 if( _instance is null ){ | |
62 _instance = new URLTransfer(); | |
63 } | |
64 } | |
65 } | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
66 return _instance; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
67 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
68 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 /** |
213 | 70 * This implementation of <code>javaToNative</code> converts a URL |
71 * represented by a java <code>String</code> to a platform specific representation. | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
72 * For additional information see <code>Transfer#javaToNative</code>. |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
73 * |
213 | 74 * @param object a java <code>String</code> containing a URL |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
75 * @param transferData an empty <code>TransferData</code> object; this |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
76 * object will be filled in on return with the platform specific format of the data |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
77 */ |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
78 public void javaToNative (Object object, TransferData transferData){ |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
79 if (!checkURL(object) || !isSupportedType(transferData)) { |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 DND.error(DND.ERROR_INVALID_DATA); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 transferData.result = COM.E_FAIL; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 // URL is stored as a null terminated byte array |
213 | 84 String url = (cast(ArrayWrapperString)object).array; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 int codePage = OS.GetACP(); |
145 | 86 wchar[] chars = StrToWCHARs(codePage, url, true ); |
87 int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, null, 0, null, null); | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 if (cchMultiByte is 0) { |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 transferData.stgmedium = new STGMEDIUM(); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 transferData.result = COM.DV_E_STGMEDIUM; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
91 return; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
92 } |
145 | 93 auto lpMultiByteStr = cast(char*)OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); |
94 OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, lpMultiByteStr, cchMultiByte, null, null); | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
95 transferData.stgmedium = new STGMEDIUM(); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
96 transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
97 transferData.stgmedium.unionField = lpMultiByteStr; |
145 | 98 transferData.stgmedium.pUnkForRelease = null; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
99 transferData.result = COM.S_OK; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 return; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 /** |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
104 * This implementation of <code>nativeToJava</code> converts a platform specific |
213 | 105 * representation of a URL to a java <code>String</code>. |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
106 * For additional information see <code>Transfer#nativeToJava</code>. |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
107 * |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
108 * @param transferData the platform specific representation of the data to be |
213 | 109 * converted |
110 * @return a java <code>String</code> containing a URL if the | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
111 * conversion was successful; otherwise null |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
112 */ |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
113 public Object nativeToJava(TransferData transferData){ |
145 | 114 if (!isSupportedType(transferData) || transferData.pIDataObject is null) return null; |
115 IDataObject data = transferData.pIDataObject; | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
116 data.AddRef(); |
145 | 117 STGMEDIUM* stgmedium = new STGMEDIUM(); |
118 FORMATETC* formatetc = transferData.formatetc; | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
119 stgmedium.tymed = COM.TYMED_HGLOBAL; |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
120 transferData.result = data.GetData(formatetc, stgmedium); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
121 data.Release(); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
122 if (transferData.result !is COM.S_OK) return null; |
145 | 123 auto hMem = stgmedium.unionField; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
124 try { |
145 | 125 auto lpMultiByteStr = cast(char*)OS.GlobalLock(hMem); |
126 if (lpMultiByteStr is null) return null; | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
127 try { |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
128 int codePage = OS.GetACP(); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
129 int cchWideChar = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
130 if (cchWideChar is 0) return null; |
145 | 131 wchar[] lpWideCharStr = new wchar [cchWideChar - 1]; |
132 OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length); | |
213 | 133 return new ArrayWrapperString( WCHARzToStr( lpWideCharStr.ptr) ); |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
134 } finally { |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
135 OS.GlobalUnlock(hMem); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
136 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
137 } finally { |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
138 OS.GlobalFree(hMem); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
139 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
140 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
141 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
142 protected int[] getTypeIds(){ |
145 | 143 return [CFSTR_INETURLID]; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
144 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
145 |
212
ab60f3309436
reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents:
197
diff
changeset
|
146 protected String[] getTypeNames(){ |
145 | 147 return [CFSTR_INETURL]; |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
148 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
149 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
150 bool checkURL(Object object) { |
213 | 151 return object !is null && (null !is cast(ArrayWrapperString)object) && (cast(ArrayWrapperString)object).array.length > 0; |
152 | |
135
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
153 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
154 |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
155 protected bool validate(Object object) { |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
156 return checkURL(object); |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
157 } |
242e33c0e383
Added dnd source, ByteArrayTransfer,Clipboard completed
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
158 } |