/*******************************************************************************
 * 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;
	}

}
