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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.ui.dnd;
\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
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
26 import sun.awt.datatransfer.DataTransferer;
\r
28 public class LocalObjectTransfer extends ByteArrayTransfer {
\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
35 private static int getMapping() {
\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
43 throw new Error("No mapping.");
\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
49 private static final LocalObjectTransfer INSTANCE = new LocalObjectTransfer();
\r
51 Object transferredObject;
\r
54 * Only the singleton instance of this class may be used.
\r
56 protected LocalObjectTransfer() {
\r
61 * Returns the singleton.
\r
63 * @return the singleton
\r
65 public static LocalObjectTransfer getTransfer() {
\r
70 * Tests whether native drop data matches this transfer type.
\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
76 private boolean isInvalidNativeType(Object result) {
\r
77 return !(result instanceof byte[])
\r
78 || !TYPE_NAME.equals(new String((byte[]) result));
\r
82 * Returns the type id used to identify this transfer.
\r
84 * @return the type id used to identify this transfer.
\r
86 protected int[] getTypeIds() {
\r
87 return new int[] { TYPEID };
\r
91 * Returns the type name used to identify this transfer.
\r
93 * @return the type name used to identify this transfer.
\r
95 protected String[] getTypeNames() {
\r
96 return new String[] { TYPE_NAME };
\r
100 * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(Object,
\r
102 * Only encode the transfer type name since the selection is read and
\r
103 * written in the same process.
\r
105 * @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)
\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
115 * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData).
\r
116 * Test if the native drop data matches this transfer type.
\r
118 * @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData)
\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
128 JFaceResources.getString("LocalObjectTransfer.errorMessage"), null)); //$NON-NLS-1$
\r
130 return transferredObject;
\r
133 public void clear() {
\r
134 //System.out.println("LocalObjectTransfer clear");
\r
135 transferredObject = null;
\r
138 public Object getObject() {
\r
139 //System.out.println("LocalObjectTransfer get " + transferredObject);
\r
140 return transferredObject;
\r
143 public void setObject(Object object) {
\r
144 //System.out.println("LocalObjectTransfer set " + object);
\r
145 transferredObject = object;
\r