/******************************************************************************* | |
* Copyright (c) 2004-2008 Istvan Rath and Daniel Varro | |
* 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: | |
* Istvan Rath - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.viatra2.treeeditor.transfer; | |
import java.io.ByteArrayInputStream; | |
import java.io.ByteArrayOutputStream; | |
import java.io.DataInputStream; | |
import java.io.DataOutputStream; | |
import java.io.IOException; | |
import org.eclipse.swt.dnd.ByteArrayTransfer; | |
import org.eclipse.swt.dnd.TransferData; | |
public class ViatraTransfer extends ByteArrayTransfer { | |
private static ViatraTransfer iTransfer = new ViatraTransfer(); | |
private static final String VIATRATRANSFERTYPENAME = "VIATRA_TRANSFER"; | |
private static final int VIATRATRANSFERTYPEID = registerType(VIATRATRANSFERTYPENAME); | |
public static ViatraTransfer getInstance() { | |
return iTransfer; | |
} | |
private ViatraTransfer() { } | |
@Override | |
protected String[] getTypeNames() { | |
return new String[]{VIATRATRANSFERTYPENAME}; | |
} | |
@Override | |
protected int[] getTypeIds() { | |
return new int[]{VIATRATRANSFERTYPEID}; | |
} | |
@Override | |
protected void javaToNative(Object object, TransferData transferData) { | |
// System.out.println("javaToNative: "+object.toString()+", "+transferData.toString()); | |
if (object == null || !(object instanceof ViatraTransferData[])) return; | |
if (isSupportedType(transferData)) { | |
ViatraTransferData[] myTypes = (ViatraTransferData[]) object; | |
try { | |
// write data to a byte array and then ask super to convert to pMedium | |
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |
DataOutputStream writeOut = new DataOutputStream(out); | |
for (int i = 0, length = myTypes.length; i < length; i++){ | |
byte[] buffer = myTypes[i].fullyQualifiedName.getBytes(); | |
writeOut.writeInt(buffer.length); | |
writeOut.write(buffer); | |
} | |
byte[] buffer = out.toByteArray(); | |
writeOut.close(); | |
super.javaToNative(buffer, transferData); | |
} catch (IOException e) { | |
} | |
} | |
} | |
@Override | |
protected Object nativeToJava(TransferData transferData) { | |
// System.out.println("nativeToJava: "+transferData.toString()); | |
if (isSupportedType(transferData)) { | |
byte[] buffer = (byte[])super.nativeToJava(transferData); | |
if (buffer == null) return null; | |
ViatraTransferData[] myData = new ViatraTransferData[0]; | |
try { | |
ByteArrayInputStream in = new ByteArrayInputStream(buffer); | |
DataInputStream readIn = new DataInputStream(in); | |
while(readIn.available() > 0) { | |
ViatraTransferData datum = new ViatraTransferData(); | |
int size = readIn.readInt(); | |
byte[] name = new byte[size]; | |
readIn.read(name); | |
datum.fullyQualifiedName = new String(name); | |
ViatraTransferData[] newMyData = new ViatraTransferData[myData.length + 1]; | |
System.arraycopy(myData, 0, newMyData, 0, myData.length); | |
newMyData[myData.length] = datum; | |
myData = newMyData; | |
} | |
readIn.close(); | |
} catch (IOException ex) { | |
return null; | |
} | |
return myData; | |
} | |
return null; | |
} | |
} |