blob: 6e3cb944361cbd1803f91b2d30f727233a511ecd [file] [log] [blame]
/*******************************************************************************
* 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;
}
}