/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ 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; import com.hundsun.ares.studio.core.ARESCore; import com.hundsun.ares.studio.core.IARESElement; /** * Ĭ�ϵ�ARESElementTransfer��ʵ�֡� * @author sundl */ public class ARESElementTransfer extends ByteArrayTransfer { private static final ARESElementTransfer instance= new ARESElementTransfer(); // Create a unique ID to make sure that different Eclipse // applications use different "types" of <code>ARESElementTransfer</code> private static final String TYPE_NAME= "ares-element-transfer-format:" + System.currentTimeMillis() + ":" + instance.hashCode(); //$NON-NLS-2$//$NON-NLS-1$ private static final int TYPE_ID = registerType(TYPE_NAME); public static ARESElementTransfer getInstance() { return instance; } private ARESElementTransfer() {} /* (non-Javadoc) * @see org.eclipse.swt.dnd.Transfer#getTypeIds() */ @Override protected int[] getTypeIds() { return new int[] {TYPE_ID}; } /* (non-Javadoc) * @see org.eclipse.swt.dnd.Transfer#getTypeNames() */ @Override protected String[] getTypeNames() { return new String[] {TYPE_NAME}; } protected void javaToNative(Object data, TransferData transferData) { if (!(data instanceof IARESElement[])) { return; } IARESElement[] aresElements = (IARESElement[]) data; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(out); // write the number of elements dataOut.writeInt(aresElements.length); // write each element for (IARESElement element : aresElements) { writeARESElement(dataOut, element); } dataOut.close(); out.close(); byte[] bytes = out.toByteArray(); super.javaToNative(bytes, transferData); } catch (IOException e) { /// do nothing } } protected Object nativeToJava(TransferData transferData) { byte[] bytes = (byte[]) super.nativeToJava(transferData); if (bytes == null) { return null; } DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); try { int count = in.readInt(); IARESElement[] results = new IARESElement[count]; for (int i = 0; i < count; i++) { results[i] = readARESElement(in); } return results; } catch (IOException e) { return null; } } private IARESElement readARESElement(DataInputStream dataIn) throws IOException { String handleIdentifier = dataIn.readUTF(); return ARESCore.create(handleIdentifier); } private static void writeARESElement(DataOutputStream dataOut, IARESElement element) throws IOException { dataOut.writeUTF(element.getHandleIdentifier()); } }