changeset 142:c48567faeab1

TextTransfer
author Frank Benoit <benoit@tionex.de>
date Wed, 13 Feb 2008 16:26:35 +0100
parents 4e3f19210f93
children 45172b7a0ee6
files dwt/dnd/TextTransfer.d
diffstat 1 files changed, 58 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/dwt/dnd/TextTransfer.d	Wed Feb 13 16:13:31 2008 +0100
+++ b/dwt/dnd/TextTransfer.d	Wed Feb 13 16:26:35 2008 +0100
@@ -13,8 +13,18 @@
 module dwt.dnd.TextTransfer;
 
 import dwt.internal.ole.win32.COM;
+import dwt.internal.ole.win32.OBJIDL;
 import dwt.internal.win32.OS;
 
+import dwt.dnd.ByteArrayTransfer;
+import dwt.dnd.TransferData;
+import dwt.dnd.DND;
+
+import dwt.dwthelper.Integer;
+import dwt.dwthelper.utils;
+static import tango.text.Text;
+alias tango.text.Text.Text!(char) StringBuffer;
+
 /**
  * The class <code>TextTransfer</code> provides a platform specific mechanism
  * for converting plain text represented as a java <code>String</code>
@@ -31,11 +41,11 @@
  */
 public class TextTransfer : ByteArrayTransfer {
 
-    private static TextTransfer _instance = new TextTransfer();
-    private static final String CF_UNICODETEXT = "CF_UNICODETEXT"; //$NON-NLS-1$
-    private static final String CF_TEXT = "CF_TEXT"; //$NON-NLS-1$
-    private static final int CF_UNICODETEXTID = COM.CF_UNICODETEXT;
-    private static final int CF_TEXTID = COM.CF_TEXT;
+    private static TextTransfer _instance;
+    private static const char[] CF_UNICODETEXT = "CF_UNICODETEXT"; //$NON-NLS-1$
+    private static const char[] CF_TEXT = "CF_TEXT"; //$NON-NLS-1$
+    private static const int CF_UNICODETEXTID = COM.CF_UNICODETEXT;
+    private static const int CF_TEXTID = COM.CF_TEXT;
 
 private this() {}
 
@@ -45,6 +55,13 @@
  * @return the singleton instance of the TextTransfer class
  */
 public static TextTransfer getInstance () {
+    if( _instance is null ){
+        synchronized {
+            if( _instance is null ){
+                _instance = new TextTransfer();
+            }
+        }
+    }
     return _instance;
 }
 
@@ -63,39 +80,37 @@
         DND.error(DND.ERROR_INVALID_DATA);
     }
     transferData.result = COM.E_FAIL;
-    String string = (String)object;
+    char[] string = (cast(ArrayWrapperString)object).array;
     switch (transferData.type) {
         case COM.CF_UNICODETEXT: {
-            int charCount = string.length ();
-            char[] chars = new char[charCount+1];
-            string.getChars (0, charCount, chars, 0);
+            wchar[] chars = StrToWCHARs(0,string, true);
+            int charCount = chars.length;
             int byteCount = chars.length * 2;
-            int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, byteCount);
-            OS.MoveMemory(newPtr, chars, byteCount);
+            auto newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, byteCount);
+            OS.MoveMemory(newPtr, chars.ptr, byteCount);
             transferData.stgmedium = new STGMEDIUM();
             transferData.stgmedium.tymed = COM.TYMED_HGLOBAL;
             transferData.stgmedium.unionField = newPtr;
-            transferData.stgmedium.pUnkForRelease = 0;
+            transferData.stgmedium.pUnkForRelease = null;
             transferData.result = COM.S_OK;
             break;
         }
         case COM.CF_TEXT: {
-            int count = string.length();
-            char[] chars = new char[count + 1];
-            string.getChars(0, count, chars, 0);
+            wchar[] chars = StrToWCHARs(0,string, true);
+            int count = chars.length;
             int codePage = OS.GetACP();
-            int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null);
+            int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, null, 0, null, null);
             if (cchMultiByte is 0) {
                 transferData.stgmedium = new STGMEDIUM();
                 transferData.result = COM.DV_E_STGMEDIUM;
                 return;
             }
-            int lpMultiByteStr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte);
-            OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr, cchMultiByte, null, null);
+            auto lpMultiByteStr = cast(char*)OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte);
+            OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, lpMultiByteStr, cchMultiByte, null, null);
             transferData.stgmedium = new STGMEDIUM();
             transferData.stgmedium.tymed = COM.TYMED_HGLOBAL;
             transferData.stgmedium.unionField = lpMultiByteStr;
-            transferData.stgmedium.pUnkForRelease = 0;
+            transferData.stgmedium.pUnkForRelease = null;
             transferData.result = COM.S_OK;
             break;
         }
@@ -113,50 +128,50 @@
  * @see Transfer#nativeToJava
  */
 public Object nativeToJava(TransferData transferData){
-    if (!isSupportedType(transferData) || transferData.pIDataObject is 0) return null;
+    if (!isSupportedType(transferData) || transferData.pIDataObject is null) return null;
 
-    IDataObject data = new IDataObject(transferData.pIDataObject);
+    IDataObject data = transferData.pIDataObject;
     data.AddRef();
-    FORMATETC formatetc = transferData.formatetc;
-    STGMEDIUM stgmedium = new STGMEDIUM();
+    FORMATETC* formatetc = transferData.formatetc;
+    STGMEDIUM* stgmedium = new STGMEDIUM();
     stgmedium.tymed = COM.TYMED_HGLOBAL;
     transferData.result = data.GetData(formatetc, stgmedium);
     data.Release();
     if (transferData.result !is COM.S_OK) return null;
-    int hMem = stgmedium.unionField;
+    auto hMem = stgmedium.unionField;
     try {
         switch (transferData.type) {
             case CF_UNICODETEXTID: {
                 /* Ensure byteCount is a multiple of 2 bytes */
                 int size = OS.GlobalSize(hMem) / 2 * 2;
                 if (size is 0) return null;
-                char[] chars = new char[size/2];
-                int ptr = OS.GlobalLock(hMem);
-                if (ptr is 0) return null;
+                wchar[] chars = new wchar[size/2];
+                auto ptr = OS.GlobalLock(hMem);
+                if (ptr is null) return null;
                 try {
-                    OS.MoveMemory(chars, ptr, size);
-                    int length = chars.length;
+                    OS.MoveMemory(chars.ptr, ptr, size);
+                    int length_ = chars.length;
                     for (int i=0; i<chars.length; i++) {
                         if (chars [i] is '\0') {
-                            length = i;
+                            length_ = i;
                             break;
                         }
                     }
-                    return new String (chars, 0, length);
+                    return new ArrayWrapperString (WCHARsToStr(chars[ 0 .. length_]));
                 } finally {
                     OS.GlobalUnlock(hMem);
                 }
             }
             case CF_TEXTID: {
-                int lpMultiByteStr = OS.GlobalLock(hMem);
-                if (lpMultiByteStr is 0) return null;
+                auto lpMultiByteStr = cast(char*)OS.GlobalLock(hMem);
+                if (lpMultiByteStr is null) return null;
                 try {
                     int codePage = OS.GetACP();
                     int cchWideChar = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0);
                     if (cchWideChar is 0) return null;
-                    char[] lpWideCharStr = new char [cchWideChar - 1];
-                    OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, lpWideCharStr.length);
-                    return new String(lpWideCharStr);
+                    wchar[] lpWideCharStr = new wchar [cchWideChar - 1];
+                    OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length);
+                    return new ArrayWrapperString( WCHARzToStr(lpWideCharStr.ptr));
                 } finally {
                     OS.GlobalUnlock(hMem);
                 }
@@ -169,15 +184,18 @@
 }
 
 protected int[] getTypeIds(){
-    return new int[] {CF_UNICODETEXTID, CF_TEXTID};
+    return [CF_UNICODETEXTID, CF_TEXTID];
 }
 
-protected String[] getTypeNames(){
-    return new String[] {CF_UNICODETEXT, CF_TEXT};
+protected char[][] getTypeNames(){
+    return [CF_UNICODETEXT, CF_TEXT];
 }
 
 bool checkText(Object object) {
-    return (object !is null  && object instanceof String && ((String)object).length() > 0);
+    if( auto s = cast(ArrayWrapperString)object ){
+        return s.array.length > 0;
+    }
+    return false;
 }
 
 protected bool validate(Object object) {