Mercurial > projects > dwt-win
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) {