/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.ui.dnd; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.FlavorTable; import java.awt.datatransfer.SystemFlavorMap; import java.util.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.Policy; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.TransferData; import sun.awt.datatransfer.DataTransferer; public class LocalObjectTransfer extends ByteArrayTransfer { // First attempt to create a UUID for the type name to make sure that // different Eclipse applications use different "types" of // LocalSelectionTransfer public static final String TYPE_NAME = SystemFlavorMap.encodeJavaMIMEType(LocalObjectTransferable.TYPE_NAME); private static int getMapping() { for(Map.Entry entry : SystemFlavorMap.getDefaultFlavorMap().getNativesForFlavors(new DataFlavor[] { LocalObjectTransferable.FLAVOR }).entrySet()) { for(long l : DataTransferer.getInstance().getFormatsForFlavorAsArray(entry.getKey(), (FlavorTable)SystemFlavorMap.getDefaultFlavorMap())) { return (int)l; } } throw new Error("No mapping."); } // In Linux (Ubuntu 14.04) using SystemFlavorMap to get the type id gives different result than what is received with drop data (TransferData.type) private static final int TYPEID = registerType(TYPE_NAME);//getMapping(); private static final LocalObjectTransfer INSTANCE = new LocalObjectTransfer(); Object transferredObject; /** * Only the singleton instance of this class may be used. */ protected LocalObjectTransfer() { // do nothing } /** * Returns the singleton. * * @return the singleton */ public static LocalObjectTransfer getTransfer() { return INSTANCE; } /** * Tests whether native drop data matches this transfer type. * * @param result result of converting the native drop data to Java * @return true if the native drop data does not match this transfer type. * false otherwise. */ private boolean isInvalidNativeType(Object result) { return !(result instanceof byte[]) || !TYPE_NAME.equals(new String((byte[]) result)); } /** * Returns the type id used to identify this transfer. * * @return the type id used to identify this transfer. */ protected int[] getTypeIds() { return new int[] { TYPEID }; } /** * Returns the type name used to identify this transfer. * * @return the type name used to identify this transfer. */ protected String[] getTypeNames() { return new String[] { TYPE_NAME }; } /** * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(Object, * TransferData). * Only encode the transfer type name since the selection is read and * written in the same process. * * @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData) */ public void javaToNative(Object object, TransferData transferData) { //System.out.println("javaToNative " + object); transferredObject = object; byte[] check = TYPE_NAME.getBytes(); super.javaToNative(check, transferData); } /** * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData). * Test if the native drop data matches this transfer type. * * @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData) */ public Object nativeToJava(TransferData transferData) { //System.out.println("nativeToJava " + transferredObject); Object result = super.nativeToJava(transferData); if (isInvalidNativeType(result)) { Policy.getLog().log(new Status( IStatus.ERROR, Policy.JFACE, IStatus.ERROR, JFaceResources.getString("LocalObjectTransfer.errorMessage"), null)); //$NON-NLS-1$ } return transferredObject; } public void clear() { //System.out.println("LocalObjectTransfer clear"); transferredObject = null; } public Object getObject() { //System.out.println("LocalObjectTransfer get " + transferredObject); return transferredObject; } public void setObject(Object object) { //System.out.println("LocalObjectTransfer set " + object); transferredObject = object; } }