]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.ui/src/org/simantics/ui/dnd/LocalObjectTransfer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / dnd / LocalObjectTransfer.java
diff --git a/bundles/org.simantics.ui/src/org/simantics/ui/dnd/LocalObjectTransfer.java b/bundles/org.simantics.ui/src/org/simantics/ui/dnd/LocalObjectTransfer.java
new file mode 100644 (file)
index 0000000..0e32e87
--- /dev/null
@@ -0,0 +1,148 @@
+/*******************************************************************************\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