import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class DNDExample {

public static void main(String[] args) {
	Shell shell = new Shell();
	shell.setLayout(new FillLayout());

	// Create the tree and some tree items
	final Tree tree = new Tree(shell, SWT.NONE);
	TreeItem item1 = new TreeItem(tree, SWT.NONE);
	item1.setText("Item 1");
	TreeItem item2 = new TreeItem(tree, SWT.NONE);
	item2.setText("Item 2");
	TreeItem item3 = new TreeItem(tree, SWT.NONE);
	item3.setText("Item 3");
	TreeItem item4 = new TreeItem(tree, SWT.NONE);
	item4.setText("Item 4");
	
	// Create the drag source on the tree
	DragSource ds = new DragSource(tree, DND.DROP_MOVE);
	ds.setTransfer(new Transfer[] {TextTransfer.getInstance()});
	ds.addDragListener(new DragSourceAdapter() {
		public void dragSetData(DragSourceEvent event) {
			// Set the data to be the first selected item's text
			event.data = tree.getSelection()[0].getText();
		}
	});
	
	// Create the button
	final Button button = new Button(shell, SWT.FLAT);
	button.setText("Button");
	button.setAlignment(SWT.CENTER);
	
	// Create the drop target on the button
	DropTarget dt = new DropTarget(button, DND.DROP_MOVE);
	dt.setTransfer(new Transfer[] {TextTransfer.getInstance()});
	dt.addDropListener(new DropTargetAdapter() {
		public void drop(DropTargetEvent event) {
			// Set the buttons text to be the text being dropped
			button.setText((String)event.data);
		}
	});
	
	shell.pack();
	shell.open();
	Display display = Display.getDefault();
	while (!shell.isDisposed())
		if (!display.readAndDispatch())
			display.sleep();
	display.dispose();
}

}
