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