Eclipse >> SWT >> Drag and drop
import org.eclipse.swt.dnd.*;
// Enable a table as a Drop Target
final Table dropTable = new Table(shell, SWT.BORDER);
for (int i = 0; i < 10; i++) {
TableItem item = new TableItem(dropTable, SWT.NONE);
item.setText("item" + I);
}
//*** Allow data to be copied or moved to the drop target
operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
DropTarget target = new DropTarget(dropTable, operations);
//*** Specify the types of data (Text or File) that can be received
final TextTransfer textTransfer = TextTransfer.getInstance();
final FileTransfer fileTransfer = FileTransfer.getInstance();
types = new Transfer[] {fileTransfer, textTransfer};
target.setTransfer(types);
target.addDropListener(new DropTargetListener() {
//*** Specify the drag over effect (a visual cue to the user about what kind
//of operation will be performed when the drop occurs): MOVE, COPY, LINK or NONE
//by setting the EVENT.DETAIL field
public void dragEnter(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT) {
//*** event.operations <=> bitwise OR of operations supported by the DragSource
if ((event.operations & DND.DROP_COPY) != 0) {
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
// will accept text but prefer to have files dropped
for (int i = 0; i < event.dataTypes.length; i++) {
if (fileTransfer.isSupportedType(event.dataTypes[i])){
//*** event.dataTypes <=> Source's transfer types
//*** event.currentDataType <=> target's preferred data type
event.currentDataType = event.dataTypes[i];
// files should only be copied
if (event.detail != DND.DROP_COPY) {
event.detail = DND.DROP_NONE;
}
break;
}
}
}
//*** Specify the drag under effect (some visual cue or action in the drop target widget
//that gives the user more detailed feedback about where the drop may occur
//by setting the event.feedback
public void dragOver(DropTargetEvent event) {
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if (textTransfer.isSupportedType(event.currentDataType)) {
// NOTE: on unsupported platforms this will return null
Object o = textTransfer.nativeToJava(event.currentDataType);
String t = (String)o;
if (t != null) System.out.println(t);
}
}
//*** Occurs when the user presses or releases a modifier key
public void dragOperationChanged(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT) {
if ((event.operations & DND.DROP_COPY) != 0) {
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
// allow text to be moved but files should only be copied
if (fileTransfer.isSupportedType(event.currentDataType)){
if (event.detail != DND.DROP_COPY) {
event.detail = DND.DROP_NONE;
}
}
}
public void dragLeave(DropTargetEvent event) {
}
public void dropAccept(DropTargetEvent event) {
}
//*** User releases the mouse over the drop target
public void drop(DropTargetEvent event) {
if (textTransfer.isSupportedType(event.currentDataType)) {
String text = (String)event.data;
TableItem item = new TableItem(dropTable, SWT.NONE);
item.setText(text);
}
if (fileTransfer.isSupportedType(event.currentDataType)){
String[] files = (String[])event.data;
for (int i = 0; i < files.length; i++) {
TableItem item = new TableItem(dropTable, SWT.NONE);
item.setText(files[i]);
}
}
}
})
import org.eclipse.swt.dnd.*;
final Label dragLabel = new Label(shell, SWT.BORDER);
dragLabel.setText("text to be transferred");
//*** Allow data to be copied or moved from the drag source
int operations = DND.DROP_MOVE | DND.DROP_COPY;
//*** Enable the label as a DRAG SOURCE
DragSource source = new DragSource(dragLabel, operations);
//*** Specify the types of data (Text) that can be transferred
Transfer[] types = new Transfer[] {TextTransfer.getInstance()};
source.setTransfer(types);
source.addDragListener(new DragSourceListener() {
//*** User has performed the action that initiates a Drag and Drop operation
public void dragStart(DragSourceEvent event) {
// Only start the drag if there is actually text in the Label
if (dragLabel.getText().length() == 0) {
event.doit = false;
}
}
public void dragSetData(DragSourceEvent event) {
//*** Provide the data of the requested type.
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = dragLabel.getText();
}
}
//*** Drag and drop operation is complete
public void dragFinished(DragSourceEvent event) {
// If a move operation has been performed, remove the data
// from the source
if (event.detail == DND.DROP_MOVE)
dragLabel.setText("");
}
}
Source: http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html