]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.ui.dnd;\r
13 \r
14 import java.awt.datatransfer.DataFlavor;\r
15 import java.awt.datatransfer.FlavorTable;\r
16 import java.awt.datatransfer.SystemFlavorMap;\r
17 import java.util.Map;\r
18 \r
19 import org.eclipse.core.runtime.IStatus;\r
20 import org.eclipse.core.runtime.Status;\r
21 import org.eclipse.jface.resource.JFaceResources;\r
22 import org.eclipse.jface.util.Policy;\r
23 import org.eclipse.swt.dnd.ByteArrayTransfer;\r
24 import org.eclipse.swt.dnd.TransferData;\r
25 \r
26 import sun.awt.datatransfer.DataTransferer;\r
27 \r
28 public class LocalObjectTransfer extends ByteArrayTransfer {\r
29 \r
30     // First attempt to create a UUID for the type name to make sure that\r
31     // different Eclipse applications use different "types" of\r
32     // <code>LocalSelectionTransfer</code>\r
33         public static final String TYPE_NAME = SystemFlavorMap.encodeJavaMIMEType(LocalObjectTransferable.TYPE_NAME);\r
34         \r
35         private static int getMapping() {\r
36 \r
37                 for(Map.Entry<DataFlavor, String> entry : SystemFlavorMap.getDefaultFlavorMap().getNativesForFlavors(new DataFlavor[] { LocalObjectTransferable.FLAVOR }).entrySet()) {\r
38                         for(long l : DataTransferer.getInstance().getFormatsForFlavorAsArray(entry.getKey(), (FlavorTable)SystemFlavorMap.getDefaultFlavorMap())) {\r
39                                 return (int)l;\r
40                         }\r
41                 }\r
42                 \r
43                 throw new Error("No mapping.");\r
44                 \r
45         }\r
46         // 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
47     private static final int TYPEID = registerType(TYPE_NAME);//getMapping();\r
48     \r
49         private static final LocalObjectTransfer INSTANCE = new LocalObjectTransfer();\r
50 \r
51     Object transferredObject;\r
52 \r
53     /**\r
54      * Only the singleton instance of this class may be used. \r
55      */\r
56     protected LocalObjectTransfer() {\r
57         // do nothing\r
58     }\r
59 \r
60     /**\r
61      * Returns the singleton.\r
62      * \r
63      * @return the singleton\r
64      */\r
65     public static LocalObjectTransfer getTransfer() {\r
66         return INSTANCE;\r
67     }\r
68 \r
69     /**\r
70      * Tests whether native drop data matches this transfer type.\r
71      * \r
72      * @param result result of converting the native drop data to Java\r
73      * @return true if the native drop data does not match this transfer type.\r
74      *  false otherwise.\r
75      */\r
76     private boolean isInvalidNativeType(Object result) {\r
77         return !(result instanceof byte[])\r
78                 || !TYPE_NAME.equals(new String((byte[]) result));\r
79     }\r
80 \r
81     /**\r
82      * Returns the type id used to identify this transfer.\r
83      * \r
84      * @return the type id used to identify this transfer.\r
85      */\r
86     protected int[] getTypeIds() {\r
87         return new int[] { TYPEID };\r
88     }\r
89 \r
90     /**\r
91      * Returns the type name used to identify this transfer.\r
92      * \r
93      * @return the type name used to identify this transfer.\r
94      */\r
95     protected String[] getTypeNames() {\r
96         return new String[] { TYPE_NAME };\r
97     }\r
98 \r
99     /**\r
100      * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(Object,\r
101      * TransferData).\r
102      * Only encode the transfer type name since the selection is read and\r
103      * written in the same process.\r
104      * \r
105      * @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)\r
106      */\r
107     public void javaToNative(Object object, TransferData transferData) {\r
108         //System.out.println("javaToNative " + object);\r
109         transferredObject = object;\r
110         byte[] check = TYPE_NAME.getBytes();\r
111         super.javaToNative(check, transferData);\r
112     }\r
113 \r
114     /**\r
115      * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData).\r
116      * Test if the native drop data matches this transfer type.\r
117      * \r
118      * @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData)\r
119      */\r
120     public Object nativeToJava(TransferData transferData) {\r
121         //System.out.println("nativeToJava " + transferredObject);\r
122         Object result = super.nativeToJava(transferData);\r
123         if (isInvalidNativeType(result)) {\r
124             Policy.getLog().log(new Status(\r
125                             IStatus.ERROR,\r
126                             Policy.JFACE,\r
127                             IStatus.ERROR,\r
128                             JFaceResources.getString("LocalObjectTransfer.errorMessage"), null)); //$NON-NLS-1$\r
129         }\r
130         return transferredObject;\r
131     }\r
132     \r
133     public void clear() {\r
134         //System.out.println("LocalObjectTransfer clear");\r
135         transferredObject = null;\r
136     }\r
137     \r
138     public Object getObject() {\r
139         //System.out.println("LocalObjectTransfer get " + transferredObject);\r
140         return transferredObject;\r
141     }\r
142     \r
143     public void setObject(Object object) {\r
144         //System.out.println("LocalObjectTransfer set " + object);\r
145         transferredObject = object;\r
146     }\r
147     \r
148 }\r