package com.hundsun.ares.studio.ui;
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 ARESClipboardDataTransfer extends ByteArrayTransfer {
private static ARESClipboardDataTransfer instance = new ARESClipboardDataTransfer();
private static final String TYPE_NAME = "ares-clipbord-data"; //$NON-NLS-1$
private static final int TYPE_ID = registerType(TYPE_NAME);
private ARESClipboardDataTransfer() {
}
public static ARESClipboardDataTransfer getInstance() {
return instance;
}
public void javaToNative(Object object, TransferData transferData) {
if (object == null || !(object instanceof IARESClipboardData[]))
return;
if (isSupportedType(transferData)) {
IARESClipboardData[] myTypes = (IARESClipboardData[]) 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);
/* The serialization format is:
* (int) number of elements
* Then, the following for each element:
* (String) format type
* (byte[]) data
*/
writeOut.writeInt(myTypes.length);
byte[] array = null;
for (int i = 0; i < myTypes.length; i++) {
writeOut.writeUTF(myTypes[i].getFormatType());
array = myTypes[i].getData();
writeOut.writeInt(array.length);
writeOut.write(array);
}
byte[] buffer = out.toByteArray();
writeOut.close();
super.javaToNative(buffer, transferData);
} catch (IOException e) {
// TODO
}
}
}
public Object nativeToJava(TransferData transferData) {
if (isSupportedType(transferData)) {
byte[] buffer = (byte[]) super.nativeToJava(transferData);
if (buffer == null) {
return null;
}
try {
ByteArrayInputStream in = new ByteArrayInputStream(buffer);
DataInputStream readIn = new DataInputStream(in);
int count = readIn.readInt();
IARESClipboardData[] myData = new IARESClipboardData[count];
String type = null;
byte[] array = null;
for (int i = 0; i < count; i++) {
type = readIn.readUTF();
array = new byte[readIn.readInt()];
readIn.read(array);
myData[i] = new ARESClipboardData(type, array);
}
readIn.close();
return myData;
} catch (IOException ex) {
return null;
}
}
return null;
}
@Override
protected int[] getTypeIds() {
return new int[]{TYPE_ID};
}
@Override
protected String[] getTypeNames() {
return new String[]{TYPE_NAME};
}
}