/******************************************************************************* * Copyright (c) 2008, 2009 Andrew Gvozdev. * 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: * Andrew Gvozdev (Quoin Inc.) - Initial implementation *******************************************************************************/ package org.eclipse.cdt.make.internal.ui.dnd; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin; import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransferData.MakeTargetData; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; /** * This class can be used to transfer an instance of * {@link MakeTargetTransferData} between two parts in a workbench in a drag and * drop or clipboard copy/paste operation. * * @see ByteArrayTransfer * @see Transfer * @see org.eclipse.swt.dnd.DropTarget * @see org.eclipse.swt.dnd.DragSource */ public class MakeTargetTransfer extends ByteArrayTransfer { private static final String TYPE_NAME = "make-target-transfer-format";//$NON-NLS-1$ private static final int TYPEID = registerType(TYPE_NAME); /** * Singleton instance. */ private static MakeTargetTransfer instance = new MakeTargetTransfer(); /** * Creates a new transfer object. */ private MakeTargetTransfer() { super(); } /** * @return the singleton instance. */ public static MakeTargetTransfer getInstance() { return instance; } /** * @return ids of the data types that can be converted using this transfer * agent. * * @see Transfer#getTypeIds() */ @Override protected int[] getTypeIds() { return new int[] { TYPEID }; } /** * @return the list of type names that can be converted using this transfer * agent. * * @see Transfer#getTypeNames() */ @Override protected String[] getTypeNames() { return new String[] { TYPE_NAME }; } /** * Converts a java representation of data to a platform specific * representation of the data. * * @param object - a java representation of the data to be converted. * @param transferData - an empty TransferData object; this object will be * filled in on return with the platform specific representation of * the data. * * @exception org.eclipse.swt.SWTException {@code ERROR_INVALID_DATA} - if * object doesn't contain data in a valid format or {@code null}. * * @see Transfer#javaToNative(Object object, TransferData transferData) */ @Override protected void javaToNative(Object object, TransferData transferData) { if (object instanceof MakeTargetTransferData) { MakeTargetTransferData realData = (MakeTargetTransferData) object; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(out); dataOut.writeInt(realData.getMakeTargetDataList().size()); for (MakeTargetData mtd : realData.getMakeTargetDataList()) { dataOut.writeUTF(mtd.getName()); dataOut.writeBoolean(mtd.runAllBuilders()); dataOut.writeBoolean(mtd.appendProjectEnvironment()); dataOut.writeUTF(mtd.getBuildTarget()); dataOut.writeUTF(mtd.getBuildCommand()); dataOut.writeUTF(mtd.getBuildArguments()); dataOut.writeBoolean(mtd.isStopOnError()); dataOut.writeBoolean(mtd.isDefaultBuildCmd()); dataOut.writeBoolean(mtd.appendEnvironment()); } dataOut.close(); super.javaToNative(out.toByteArray(), transferData); } catch (IOException e) { MakeUIPlugin.log(e); } } } /** * Converts a platform specific representation of data to a java * representation. * * @param transferData - the platform specific representation of the data to * be converted. * * @return a java representation of the converted data if the conversion was * successful; otherwise {@code null}. If transferData is {@code * null} then {@code null} is returned. The type of Object that is * returned is dependent on the {@link Transfer} subclass. * * @see Transfer#nativeToJava(TransferData transferData) */ @Override protected Object nativeToJava(TransferData transferData) { byte[] bytes = (byte[]) super.nativeToJava(transferData); ByteArrayInputStream in = new ByteArrayInputStream(bytes); DataInputStream dataIn = new DataInputStream(in); try { MakeTargetTransferData mttd = new MakeTargetTransferData(); int size = dataIn.readInt(); for (int i = 0; i < size; i++) { String name = dataIn.readUTF(); boolean runAllBuilders = dataIn.readBoolean(); boolean appendProjectEnvironment = dataIn.readBoolean(); String buildTarget = dataIn.readUTF(); String buildCommand = dataIn.readUTF(); String buildArguments = dataIn.readUTF(); boolean stopOnError = dataIn.readBoolean(); boolean useDefaultBuildCmd = dataIn.readBoolean(); boolean appendEnvironment = dataIn.readBoolean(); mttd.addMakeTarget(name, runAllBuilders, appendProjectEnvironment, buildTarget, buildCommand, buildArguments, stopOnError, useDefaultBuildCmd, appendEnvironment); } return mttd; } catch (IOException e) { MakeUIPlugin.log(e); } return null; } }