/**
* Դ�������ƣ�EObjectTransfer.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.ui
* ����˵����JRES Studio�Ľ���չ�ֻ�����ܺͱ༭��ع���
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.ui.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.swt.dnd.ByteArrayTransfer;
import org.eclipse.swt.dnd.TransferData;
import com.hundsun.ares.studio.jres.modelconvert.ModelConverterUtils;
/**
*
* �����������<code> {@link EObject[]}</code>
* @author gongyf
*
*/
public class EObjectTransfer extends ByteArrayTransfer {
private static final String TYPE_NAME = "com.hundsun.ares.jres.emf"; //$NON-NLS-1$
private static final int TYPE_ID = registerType(TYPE_NAME);
private static EObjectTransfer instance;
/**
* @return the instance
*/
public static EObjectTransfer getInstance() {
if (instance == null) {
instance = new EObjectTransfer();
}
return instance;
}
/* (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};
}
/* (non-Javadoc)
* @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)
*/
@Override
protected void javaToNative(Object object, TransferData transferData) {
if (isSupportedType(transferData)) {
if (object instanceof EObject[]) {
Collection<EObject> copied = EcoreUtil.copyAll(Arrays.asList((EObject[])object));
Resource resource = new XMIResourceImpl();
resource.getContents().addAll(copied);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
resource.save(bos, ModelConverterUtils.EMF_SAVE_OPTIONS);
super.javaToNative(bos.toByteArray(), transferData);
} catch (IOException e) {
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(org.eclipse.swt.dnd.TransferData)
*/
@Override
protected Object nativeToJava(TransferData transferData) {
if (isSupportedType(transferData)) {
byte[] bytes = (byte[]) super.nativeToJava(transferData);
if (!ArrayUtils.isEmpty(bytes)) {
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
Resource resource = new XMIResourceImpl();
try {
resource.load(bis, ModelConverterUtils.EMF_LOAD_OPTIONS);
Collection<EObject> copied = EcoreUtil.copyAll(resource.getContents());
return copied.toArray(new EObject[copied.size()]);
} catch (IOException e) {
}
}
}
return null;
}
}