~~~~~~~~~~~~~~~~~~~ ~~ Clipboard.java ~~~~~~~~~~~~~~~~~~~ ~~ Shows only the modifications. ~~ Unchanged code segments are indicated by "..." package org.eclipse.swt.dnd; ... public class Clipboard { private int preferredDropEffect = COM.DROPEFFECT_COPY; ... private int GetData(int pFormatetc, int pmedium) { ... if (transferData.type == CFSTR_PREFERREDDROPEFFECT) { ... OS.MoveMemory(stgmedium.unionField, new int[]{ preferredDropEffect }, 4); ... } } public void setContents(Object[] data, Transfer[] dataTypes) { setContents(DND.DROP_COPY, data, dataTypes, DND.CLIPBOARD); } public void setContents(int preferredDropEffect, Object[] data, Transfer[] dataTypes) { setContents(preferredDropEffect, data, dataTypes, DND.CLIPBOARD); } public void setContents(Object[] data, Transfer[] dataTypes, int clipboards) { setContents(DND.DROP_COPY, data, dataTypes, clipboards); } public void setContents(int preferredDropEffect, Object[] data, Transfer[] dataTypes, int clipboards) { if ((preferredDropEffect & DND.DROP_MOVE) != 0) preferredDropEffect = COM.DROPEFFECT_MOVE; else preferredDropEffect = COM.DROPEFFECT_COPY; this.preferredDropEffect = preferredDropEffect; ... the contents of the original method setContents(Object[], Transfer, int) } /** * Returns the preferred drop effect. If none is available DND.DROP_COPY * is returned. * * @return the preferred drop effect */ public int getPreferredDropEffect() { PreferredDropEffectTransfer pdet = PreferredDropEffectTransfer .getInstance(); Integer effect = (Integer) getContents(pdet); if (effect == null) return DND.DROP_COPY; else return effect.intValue(); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~ PreferredDropEffectTransfer.java ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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; /** * Used to read the preferred drop effect from the clipboard. * * @author Thomas Braun */ 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 needed. */ @Override public void javaToNative(Object object, TransferData transferData) { } /** * 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 res = 0; if (i1[0] < 100) { // i1 contains the preferred drop effect value res = i1[0]; } else { // i1 contains the address of the preferred drop // effect value int[] i2 = new int[1]; OS.MoveMemory(i2, i1[0], 4); res = i2[0]; } dataObject.Release(); if (transferData.result != COM.S_OK) return DND.DROP_COPY; else return osToOp(res); } @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; } }