Mercurial > projects > dwt-win
changeset 141:4e3f19210f93
RTFTransfer
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 13 Feb 2008 16:13:31 +0100 |
parents | 127a3e1fca05 |
children | c48567faeab1 |
files | dwt/dnd/RTFTransfer.d |
diffstat | 1 files changed, 46 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/dwt/dnd/RTFTransfer.d Wed Feb 13 16:03:59 2008 +0100 +++ b/dwt/dnd/RTFTransfer.d Wed Feb 13 16:13:31 2008 +0100 @@ -13,8 +13,19 @@ module dwt.dnd.RTFTransfer; 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>RTFTransfer</code> provides a platform specific mechanism * for converting text in RTF format represented as a java <code>String</code> @@ -30,9 +41,13 @@ */ public class RTFTransfer : ByteArrayTransfer { - private static RTFTransfer _instance = new RTFTransfer(); - private static final String CF_RTF = "Rich Text Format"; //$NON-NLS-1$ - private static final int CF_RTFID = registerType(CF_RTF); + private static RTFTransfer _instance; + private static const char[] CF_RTF = "Rich Text Format"; //$NON-NLS-1$ + private static const int CF_RTFID; + +static this(){ + CF_RTFID = registerType(CF_RTF); +} private this() {} @@ -42,6 +57,13 @@ * @return the singleton instance of the RTFTransfer class */ public static RTFTransfer getInstance () { + if( _instance is null ){ + synchronized { + if( _instance is null ){ + _instance = new RTFTransfer(); + } + } + } return _instance; } @@ -59,10 +81,8 @@ DND.error(DND.ERROR_INVALID_DATA); } // CF_RTF is stored as a null terminated byte array - String string = (String)object; - int count = string.length(); - char[] chars = new char[count + 1]; - string.getChars(0, count, chars, 0); + char[] string = (cast(ArrayWrapperString)object).array; + wchar* chars = StrToWCHARz(string); int codePage = OS.GetACP(); int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null); if (cchMultiByte is 0) { @@ -70,12 +90,12 @@ transferData.result = COM.DV_E_STGMEDIUM; return; } - int lpMultiByteStr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte); + auto lpMultiByteStr = cast(char*)OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte); OS.WideCharToMultiByte(codePage, 0, chars, -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; return; } @@ -91,26 +111,26 @@ * conversion was successful; otherwise null */ public Object nativeToJava(TransferData transferData){ - if (!isSupportedType(transferData) || transferData.pIDataObject is 0) return null; - IDataObject data = new IDataObject(transferData.pIDataObject); + if (!isSupportedType(transferData) || transferData.pIDataObject is null) return null; + IDataObject data = transferData.pIDataObject; data.AddRef(); - STGMEDIUM stgmedium = new STGMEDIUM(); - FORMATETC formatetc = transferData.formatetc; + STGMEDIUM* stgmedium = new STGMEDIUM(); + FORMATETC* formatetc = transferData.formatetc; 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 { - 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); } @@ -120,15 +140,18 @@ } protected int[] getTypeIds(){ - return new int[] {CF_RTFID}; + return [CF_RTFID]; } -protected String[] getTypeNames(){ - return new String[] {CF_RTF}; +protected char[][] getTypeNames(){ + return [CF_RTF]; } bool checkRTF(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) {