package org.eclipse.swt.dnd; import org.eclipse.swt.internal.ole.win32.COM; import org.eclipse.swt.internal.ole.win32.FORMATETC; import org.eclipse.swt.internal.ole.win32.IDataObject; import org.eclipse.swt.internal.ole.win32.STGMEDIUM; import org.eclipse.swt.internal.win32.OS; /** * The class provides a platform specific mechanism for reading and writing * the preffered drop effect (copy or paste) from and to the clipboard.
* This class is intended to be used in addition to {@link FileTransfer}. * See {@link Transfer} for additional information. *

* An example is shown below: *

*
 * PreferredDropEffectTransfer pdet = PreferredDropEffectTransfer.getInstance();
 * FileTransfer ft = FileTransfer.getInstance();
 * String[] files = (String[]) clipboard.getContents(ft);
 * int effect = ((Integer) clipboard.getContents(pdet)).intValue();
 * // copy files
 * if ((effect & DND.DROP_MOVE) != 0)
 *     for (int i = 0; i < files.length; i++)
 *         new File(files[i]).delete();
 * 
* * @author Thomas Braun */ public class PreferredDropEffectTransfer extends ByteArrayTransfer { private static PreferredDropEffectTransfer _instance = new PreferredDropEffectTransfer(); private static final String CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect"; //$NON-NLS-1$ private static final int CF_ID = registerType(CFSTR_PREFERREDDROPEFFECT); private PreferredDropEffectTransfer() {} /** * Returns the singleton instance of the class. * * @return the singleton instance of the class */ public static PreferredDropEffectTransfer getInstance() { return _instance; } /** * Not emplemented because the transfer type "Preferred DropEffect" * generated by windows seems not compatible to the one of SWT. */ @Override public void javaToNative(Object object, TransferData transferData) { if (!validate(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } // ... } /** * The method returns the preferred drop operation as integer object. * The default result is DND.DROP_COPY. * * @see DND#DROP_COPY * @see DND#DROP_LINK * @see DND#DROP_MOVE * @return an Integer containing the preferred drop operation */ @Override public Object nativeToJava(TransferData transferData) { if (!isSupportedType(transferData) || transferData.pIDataObject == 0) return DND.DROP_COPY; IDataObject dataObject = new IDataObject(transferData.pIDataObject); dataObject.AddRef(); FORMATETC formatetc = new FORMATETC(); formatetc.cfFormat = CF_ID; formatetc.ptd = 0; formatetc.dwAspect = COM.DVASPECT_CONTENT; formatetc.lindex = -1; formatetc.tymed = COM.TYMED_HGLOBAL; STGMEDIUM stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; transferData.result = dataObject.GetData(formatetc, stgmedium); int[] i1 = new int[1]; OS.MoveMemory(i1, stgmedium.unionField, 4); int[] i2 = new int[1]; OS.MoveMemory(i2, i1[0], 4); dataObject.Release(); if (transferData.result != COM.S_OK) return DND.DROP_COPY; else return osToOp(i2[0]); } @Override protected int[] getTypeIds() { return new int[]{ CF_ID }; } private int osToOp(int osOperation) { int operation = 0; if ((osOperation & COM.DROPEFFECT_COPY) != 0) { operation |= DND.DROP_COPY; } if ((osOperation & COM.DROPEFFECT_LINK) != 0) { operation |= DND.DROP_LINK; } if ((osOperation & COM.DROPEFFECT_MOVE) != 0) { operation |= DND.DROP_MOVE; } return operation; } @Override protected String[] getTypeNames() { return new String[]{ CFSTR_PREFERREDDROPEFFECT }; } @Override protected boolean validate(Object object) { return object instanceof Integer; } }