/** * This implementation of <code>javaToNative</code> converts a list of file names represented by a * java <code>String[]</code> to a platform specific representation. Each <code>String</code> in * the array contains the absolute path for a single file or directory. For additional information * see <code>Transfer#javaToNative</code>. * * @param object a java <code>String[]</code> containing the file names to be converted * @param transferData an empty <code>TransferData</code> object; this object will be filled in on * return with the platform specific format of the data */ public void javaToNative(Object object, TransferData transferData) { if (!checkFile(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } String[] fileNames = (String[]) object; StringBuffer allFiles = new StringBuffer(); for (int i = 0; i < fileNames.length; i++) { allFiles.append(fileNames[i]); allFiles.append(CF_HDROP_SEPARATOR); // each name is null terminated } TCHAR buffer = new TCHAR( 0, allFiles.toString(), true); // there is an extra null terminator at the very end DROPFILES dropfiles = new DROPFILES(); dropfiles.pFiles = DROPFILES.sizeof; dropfiles.pt_x = dropfiles.pt_y = 0; dropfiles.fNC = 0; dropfiles.fWide = OS.IsUnicode ? 1 : 0; // Allocate the memory because the caller (DropTarget) has not handed it in // The caller of this method must release the data when it is done with it. int byteCount = buffer.length() * TCHAR.sizeof; int /*long*/ newPtr = OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, DROPFILES.sizeof + byteCount); OS.MoveMemory(newPtr, dropfiles, DROPFILES.sizeof); OS.MoveMemory(newPtr + DROPFILES.sizeof, buffer, byteCount); transferData.stgmedium = new STGMEDIUM(); transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; transferData.stgmedium.unionField = newPtr; transferData.stgmedium.pUnkForRelease = 0; transferData.result = COM.S_OK; }
int parseMnemonics(char[] buffer, int start, int end, StringBuffer result) { int mnemonic = -1, index = start; while (index < end) { if (buffer[index] == '&') { if (index + 1 < end && buffer[index + 1] == '&') { result.append(buffer[index]); index++; } else { mnemonic = result.length(); } } else { result.append(buffer[index]); } index++; } return mnemonic; }