Changeset 142:c48567faeab1

Show
Ignore:
Timestamp:
02/13/08 10:26:35 (1 year ago)
Author:
Frank Benoit <benoit@tionex.de>
branch:
default
Message:

TextTransfer?

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • dwt/dnd/TextTransfer.d

    r135 r142  
    1414 
    1515import dwt.internal.ole.win32.COM; 
     16import dwt.internal.ole.win32.OBJIDL; 
    1617import dwt.internal.win32.OS; 
     18 
     19import dwt.dnd.ByteArrayTransfer; 
     20import dwt.dnd.TransferData; 
     21import dwt.dnd.DND; 
     22 
     23import dwt.dwthelper.Integer; 
     24import dwt.dwthelper.utils; 
     25static import tango.text.Text; 
     26alias tango.text.Text.Text!(char) StringBuffer; 
    1727 
    1828/** 
     
    3242public class TextTransfer : ByteArrayTransfer { 
    3343 
    34     private static TextTransfer _instance = new TextTransfer()
    35     private static final String CF_UNICODETEXT = "CF_UNICODETEXT"; //$NON-NLS-1$ 
    36     private static final String CF_TEXT = "CF_TEXT"; //$NON-NLS-1$ 
    37     private static final int CF_UNICODETEXTID = COM.CF_UNICODETEXT; 
    38     private static final int CF_TEXTID = COM.CF_TEXT; 
     44    private static TextTransfer _instance
     45    private static const char[] CF_UNICODETEXT = "CF_UNICODETEXT"; //$NON-NLS-1$ 
     46    private static const char[] CF_TEXT = "CF_TEXT"; //$NON-NLS-1$ 
     47    private static const int CF_UNICODETEXTID = COM.CF_UNICODETEXT; 
     48    private static const int CF_TEXTID = COM.CF_TEXT; 
    3949 
    4050private this() {} 
     
    4656 */ 
    4757public static TextTransfer getInstance () { 
     58    if( _instance is null ){ 
     59        synchronized { 
     60            if( _instance is null ){ 
     61                _instance = new TextTransfer(); 
     62            } 
     63        } 
     64    } 
    4865    return _instance; 
    4966} 
     
    6481    } 
    6582    transferData.result = COM.E_FAIL; 
    66     String string = (String)object
     83    char[] string = (cast(ArrayWrapperString)object).array
    6784    switch (transferData.type) { 
    6885        case COM.CF_UNICODETEXT: { 
    69             int charCount = string.length (); 
    70             char[] chars = new char[charCount+1]; 
    71             string.getChars (0, charCount, chars, 0); 
     86            wchar[] chars = StrToWCHARs(0,string, true); 
     87            int charCount = chars.length; 
    7288            int byteCount = chars.length * 2; 
    73             int newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, byteCount); 
    74             OS.MoveMemory(newPtr, chars, byteCount); 
     89            auto newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, byteCount); 
     90            OS.MoveMemory(newPtr, chars.ptr, byteCount); 
    7591            transferData.stgmedium = new STGMEDIUM(); 
    7692            transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; 
    7793            transferData.stgmedium.unionField = newPtr; 
    78             transferData.stgmedium.pUnkForRelease = 0
     94            transferData.stgmedium.pUnkForRelease = null
    7995            transferData.result = COM.S_OK; 
    8096            break; 
    8197        } 
    8298        case COM.CF_TEXT: { 
    83             int count = string.length(); 
    84             char[] chars = new char[count + 1]; 
    85             string.getChars(0, count, chars, 0); 
     99            wchar[] chars = StrToWCHARs(0,string, true); 
     100            int count = chars.length; 
    86101            int codePage = OS.GetACP(); 
    87             int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null); 
     102            int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, null, 0, null, null); 
    88103            if (cchMultiByte is 0) { 
    89104                transferData.stgmedium = new STGMEDIUM(); 
     
    91106                return; 
    92107            } 
    93             int lpMultiByteStr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte); 
    94             OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr, cchMultiByte, null, null); 
     108            auto lpMultiByteStr = cast(char*)OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte); 
     109            OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, lpMultiByteStr, cchMultiByte, null, null); 
    95110            transferData.stgmedium = new STGMEDIUM(); 
    96111            transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; 
    97112            transferData.stgmedium.unionField = lpMultiByteStr; 
    98             transferData.stgmedium.pUnkForRelease = 0
     113            transferData.stgmedium.pUnkForRelease = null
    99114            transferData.result = COM.S_OK; 
    100115            break; 
     
    114129 */ 
    115130public Object nativeToJava(TransferData transferData){ 
    116     if (!isSupportedType(transferData) || transferData.pIDataObject is 0) return null; 
    117  
    118     IDataObject data = new IDataObject(transferData.pIDataObject)
     131    if (!isSupportedType(transferData) || transferData.pIDataObject is null) return null; 
     132 
     133    IDataObject data = transferData.pIDataObject
    119134    data.AddRef(); 
    120     FORMATETC formatetc = transferData.formatetc; 
    121     STGMEDIUM stgmedium = new STGMEDIUM(); 
     135    FORMATETC* formatetc = transferData.formatetc; 
     136    STGMEDIUM* stgmedium = new STGMEDIUM(); 
    122137    stgmedium.tymed = COM.TYMED_HGLOBAL; 
    123138    transferData.result = data.GetData(formatetc, stgmedium); 
    124139    data.Release(); 
    125140    if (transferData.result !is COM.S_OK) return null; 
    126     int hMem = stgmedium.unionField; 
     141    auto hMem = stgmedium.unionField; 
    127142    try { 
    128143        switch (transferData.type) { 
     
    131146                int size = OS.GlobalSize(hMem) / 2 * 2; 
    132147                if (size is 0) return null; 
    133                 char[] chars = new char[size/2]; 
    134                 int ptr = OS.GlobalLock(hMem); 
    135                 if (ptr is 0) return null; 
     148                wchar[] chars = new wchar[size/2]; 
     149                auto ptr = OS.GlobalLock(hMem); 
     150                if (ptr is null) return null; 
    136151                try { 
    137                     OS.MoveMemory(chars, ptr, size); 
    138                     int length = chars.length; 
     152                    OS.MoveMemory(chars.ptr, ptr, size); 
     153                    int length_ = chars.length; 
    139154                    for (int i=0; i<chars.length; i++) { 
    140155                        if (chars [i] is '\0') { 
    141                             length = i; 
     156                            length_ = i; 
    142157                            break; 
    143158                        } 
    144159                    } 
    145                     return new String (chars, 0, length); 
     160                    return new ArrayWrapperString (WCHARsToStr(chars[ 0 .. length_])); 
    146161                } finally { 
    147162                    OS.GlobalUnlock(hMem); 
     
    149164            } 
    150165            case CF_TEXTID: { 
    151                 int lpMultiByteStr = OS.GlobalLock(hMem); 
    152                 if (lpMultiByteStr is 0) return null; 
     166                auto lpMultiByteStr = cast(char*)OS.GlobalLock(hMem); 
     167                if (lpMultiByteStr is null) return null; 
    153168                try { 
    154169                    int codePage = OS.GetACP(); 
    155170                    int cchWideChar = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0); 
    156171                    if (cchWideChar is 0) return null; 
    157                     char[] lpWideCharStr = new char [cchWideChar - 1]; 
    158                     OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, lpWideCharStr.length); 
    159                     return new String(lpWideCharStr); 
     172                    wchar[] lpWideCharStr = new wchar [cchWideChar - 1]; 
     173                    OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length); 
     174                    return new ArrayWrapperString( WCHARzToStr(lpWideCharStr.ptr)); 
    160175                } finally { 
    161176                    OS.GlobalUnlock(hMem); 
     
    170185 
    171186protected int[] getTypeIds(){ 
    172     return new int[] {CF_UNICODETEXTID, CF_TEXTID}
    173 } 
    174  
    175 protected String[] getTypeNames(){ 
    176     return new String[] {CF_UNICODETEXT, CF_TEXT}
     187    return [CF_UNICODETEXTID, CF_TEXTID]
     188} 
     189 
     190protected char[][] getTypeNames(){ 
     191    return [CF_UNICODETEXT, CF_TEXT]
    177192} 
    178193 
    179194bool checkText(Object object) { 
    180     return (object !is null  && object instanceof String && ((String)object).length() > 0); 
     195    if( auto s = cast(ArrayWrapperString)object ){ 
     196        return s.array.length > 0; 
     197    } 
     198    return false; 
    181199} 
    182200