/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.snippets; /* * Drag and Drop example snippet: define my own data transfer type * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.1 */ import java.io.*; import org.eclipse.swt.*; import org.eclipse.swt.dnd.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class Snippet79 { /* The data being transferred is an <bold>array of type MyType</bold> where MyType is define as: */ static class MyType { String fileName; long fileLength; long lastModified; } static class MyTransfer extends ByteArrayTransfer { private static final String MYTYPENAME = "name_for_my_type"; private static final int MYTYPEID = registerType (MYTYPENAME); private static MyTransfer _instance = new MyTransfer (); public static MyTransfer getInstance () { return _instance; } @Override public void javaToNative (Object object, TransferData transferData) { if (!checkMyType(object) || !isSupportedType (transferData)) { DND.error(DND.ERROR_INVALID_DATA); } MyType [] myTypes = (MyType []) 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].fileName.getBytes (); writeOut.writeInt (buffer.length); writeOut.write (buffer); writeOut.writeLong (myTypes [i].fileLength); writeOut.writeLong (myTypes [i].lastModified); } byte [] buffer = out.toByteArray (); writeOut.close (); super.javaToNative (buffer, transferData); } catch (IOException e) {} } @Override public Object nativeToJava (TransferData transferData) { if (isSupportedType (transferData)) { byte [] buffer = (byte []) super.nativeToJava (transferData); if (buffer == null) return null; MyType [] myData = new MyType [0]; try { ByteArrayInputStream in = new ByteArrayInputStream (buffer); DataInputStream readIn = new DataInputStream (in); while (readIn.available () > 20) { MyType datum = new MyType (); int size = readIn.readInt (); byte [] name = new byte [size]; readIn.read (name); datum.fileName = new String (name); datum.fileLength = readIn.readLong (); datum.lastModified = readIn.readLong (); MyType [] newMyData = new MyType [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; } @Override protected String [] getTypeNames () { return new String [] {MYTYPENAME}; } @Override protected int [] getTypeIds () { return new int [] {MYTYPEID}; } boolean checkMyType(Object object) { if (object == null || !(object instanceof MyType[]) || ((MyType[])object).length == 0) { return false; } MyType[] myTypes = (MyType[])object; for (int i = 0; i < myTypes.length; i++) { if (myTypes[i] == null || myTypes[i].fileName == null || myTypes[i].fileName.length() == 0) { return false; } } return true; } @Override protected boolean validate(Object object) { return checkMyType(object); } } public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); shell.setLayout (new FillLayout ()); final Label label1 = new Label (shell, SWT.BORDER | SWT.WRAP); label1.setText ("Drag Source for MyData[]"); final Label label2 = new Label (shell, SWT.BORDER | SWT.WRAP); label2.setText ("Drop Target for MyData[]"); DragSource source = new DragSource (label1, DND.DROP_COPY); source.setTransfer (new Transfer [] {MyTransfer.getInstance ()}); source.addDragListener (new DragSourceAdapter () { @Override public void dragSetData (DragSourceEvent event) { MyType myType1 = new MyType (); myType1.fileName = "C:\\abc.txt"; myType1.fileLength = 1000; myType1.lastModified = 12312313; MyType myType2 = new MyType (); myType2.fileName = "C:\\xyz.txt"; myType2.fileLength = 500; myType2.lastModified = 12312323; event.data = new MyType [] {myType1, myType2}; } }); DropTarget target = new DropTarget (label2, DND.DROP_COPY | DND.DROP_DEFAULT); target.setTransfer (new Transfer [] {MyTransfer.getInstance ()}); target.addDropListener (new DropTargetAdapter () { @Override public void dragEnter (DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { event.detail = DND.DROP_COPY; } } @Override public void dragOperationChanged (DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { event.detail = DND.DROP_COPY; } } @Override public void drop (DropTargetEvent event) { if (event.data != null) { MyType [] myTypes = (MyType []) event.data; if (myTypes != null) { String string = ""; for (int i = 0; i < myTypes.length; i++) { string += myTypes [i].fileName + " "; } label2.setText (string); } } } }); shell.setSize (200, 200); shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); } }