SWT DND (Drag and Drop) comprehensive Example
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.HTMLTransfer;
import org.eclipse.swt.dnd.RTFTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class DNDExample {
private int dragOperation = 0;
private Transfer[] dragTypes = new Transfer[0];
private Control dragControl;
private int dragControlType = 0;
private DragSource dragSource;
private String dragDataText;
private String dragDataRTF;
private String dragDataHTML;
private String[] dragDataFiles;
private List fileList;
private boolean dragEnabled = false;
private int dropOperation = 0;
private int dropFeedback = 0;
private int dropDefaultOperation = 0;
private Transfer[] dropTypes = new Transfer[0];
private DropTarget dropTarget;
private Control dropControl;
private int dropControlType = 0;
private Composite defaultParent;
private boolean dropEnabled = false;
private Text dragConsole;
private boolean dragEventDetail = false;
private Text dropConsole;
private boolean dropEventDetail = false;
private static final int BUTTON_TOGGLE = 0;
private static final int BUTTON_RADIO = 1;
private static final int BUTTON_CHECK = 2;
private static final int CANVAS = 3;
private static final int LABEL = 4;
private static final int LIST = 5;
private static final int TABLE = 6;
private static final int TREE = 7;
private static final int TEXT = 8;
public static void main(String[] args) {
Display display = new Display();
DNDExample example = new DNDExample();
example.open(display);
display.dispose();
}
private void addDragTransfer(Transfer transfer) {
Transfer[] newTypes = new Transfer[dragTypes.length + 1];
System.arraycopy(dragTypes, 0, newTypes, 0, dragTypes.length);
newTypes[dragTypes.length] = transfer;
dragTypes = newTypes;
if (dragSource != null) {
dragSource.setTransfer(dragTypes);
}
}
private void addDropTransfer(Transfer transfer) {
Transfer[] newTypes = new Transfer[dropTypes.length + 1];
System.arraycopy(dropTypes, 0, newTypes, 0, dropTypes.length);
newTypes[dropTypes.length] = transfer;
dropTypes = newTypes;
if (dropTarget != null) {
dropTarget.setTransfer(dropTypes);
}
}
private void createDragOperations(Composite parent) {
parent.setLayout(new RowLayout(SWT.VERTICAL));
final Button moveButton = new Button(parent, SWT.CHECK);
moveButton.setText("DND.DROP_MOVE");
moveButton.setSelection(true);
dragOperation = DND.DROP_MOVE;
moveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dragOperation |= DND.DROP_MOVE;
} else {
dragOperation = dragOperation & ~DND.DROP_MOVE;
if (dragOperation == 0) {
dragOperation = DND.DROP_MOVE;
moveButton.setSelection(true);
}
}
if (dragEnabled) {
createDragSource();
}
}
});
Button b = new Button(parent, SWT.CHECK);
b.setText("DND.DROP_COPY");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dragOperation |= DND.DROP_COPY;
} else {
dragOperation = dragOperation & ~DND.DROP_COPY;
if (dragOperation == 0) {
dragOperation = DND.DROP_MOVE;
moveButton.setSelection(true);
}
}
if (dragEnabled) {
createDragSource();
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("DND.DROP_LINK");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dragOperation |= DND.DROP_LINK;
} else {
dragOperation = dragOperation & ~DND.DROP_LINK;
if (dragOperation == 0) {
dragOperation = DND.DROP_MOVE;
moveButton.setSelection(true);
}
}
if (dragEnabled) {
createDragSource();
}
}
});
}
private void createDragSource() {
if (dragSource != null)
dragSource.dispose();
dragSource = new DragSource(dragControl, dragOperation);
dragSource.setTransfer(dragTypes);
dragSource.addDragListener(new DragSourceListener() {
public void dragFinished(org.eclipse.swt.dnd.DragSourceEvent event) {
dragConsole.append(">>dragFinished\n");
printEvent(event);
dragDataText = dragDataRTF = dragDataHTML = null;
dragDataFiles = null;
if (event.detail == DND.DROP_MOVE) {
switch (dragControlType) {
case BUTTON_CHECK:
case BUTTON_TOGGLE:
case BUTTON_RADIO: {
Button b = (Button) dragControl;
b.setText("");
break;
}
case TABLE: {
Table table = (Table) dragControl;
TableItem[] items = table.getSelection();
for (int i = 0; i < items.length; i++) {
items[i].dispose();
}
break;
}
case TEXT: {
Text text = (Text) dragControl;
text.clearSelection();
break;
}
case TREE: {
Tree tree = (Tree) dragControl;
TreeItem[] items = tree.getSelection();
for (int i = 0; i < items.length; i++) {
items[i].dispose();
}
break;
}
case CANVAS: {
dragControl.setData("STRINGS", null);
dragControl.redraw();
break;
}
case LABEL: {
Label label = (Label) dragControl;
label.setText("");
break;
}
case LIST: {
List list = (List) dragControl;
int[] indices = list.getSelectionIndices();
list.remove(indices);
break;
}
}
}
}
public void dragSetData(org.eclipse.swt.dnd.DragSourceEvent event) {
dragConsole.append(">>dragSetData\n");
printEvent(event);
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = dragDataText;
}
if (RTFTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = dragDataRTF;
}
if (HTMLTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = dragDataHTML;
}
if (FileTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = dragDataFiles;
}
}
public void dragStart(org.eclipse.swt.dnd.DragSourceEvent event) {
dragConsole.append(">>dragStart\n");
printEvent(event);
dragDataFiles = fileList.getItems();
switch (dragControlType) {
case BUTTON_CHECK:
case BUTTON_TOGGLE:
case BUTTON_RADIO: {
Button b = (Button) dragControl;
dragDataText = b.getSelection() ? "true" : "false";
break;
}
case TABLE: {
Table table = (Table) dragControl;
TableItem[] items = table.getSelection();
if (items.length == 0) {
event.doit = false;
} else {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < items.length; i++) {
buffer.append(items[i].getText());
if (items.length > 1 && i < items.length - 1) {
buffer.append("\n");
}
}
dragDataText = buffer.toString();
}
break;
}
case TEXT: {
Text text = (Text) dragControl;
String s = text.getSelectionText();
if (s.length() == 0) {
event.doit = false;
} else {
dragDataText = s;
}
break;
}
case TREE: {
Tree tree = (Tree) dragControl;
TreeItem[] items = tree.getSelection();
if (items.length == 0) {
event.doit = false;
} else {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < items.length; i++) {
buffer.append(items[i].getText());
if (items.length > 1 && i < items.length - 1) {
buffer.append("\n");
}
}
dragDataText = buffer.toString();
}
break;
}
case CANVAS: {
String[] strings = (String[]) dragControl
.getData("STRINGS");
if (strings == null || strings.length == 0) {
event.doit = false;
} else {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < strings.length; i++) {
buffer.append(strings[i]);
if (strings.length > 1 && i < strings.length - 1) {
buffer.append("\n");
}
}
dragDataText = buffer.toString();
}
break;
}
case LABEL: {
Label label = (Label) dragControl;
String string = label.getText();
if (string.length() == 0) {
event.doit = false;
} else {
dragDataText = string;
}
break;
}
case LIST: {
List list = (List) dragControl;
String[] selection = list.getSelection();
if (selection.length == 0) {
event.doit = false;
} else {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < selection.length; i++) {
buffer.append(selection[i]);
if (selection.length > 1
&& i < selection.length - 1) {
buffer.append("\n");
}
}
dragDataText = buffer.toString();
}
break;
}
default:
throw new SWTError(SWT.ERROR_NOT_IMPLEMENTED);
}
if (dragDataText != null) {
dragDataRTF = "{\\rtf1{\\colortbl;\\red255\\green0\\blue0;}\\cf1\\b "
+ dragDataText + "}";
dragDataHTML = "<b>" + dragDataText + "</b>";
}
for (int i = 0; i < dragTypes.length; i++) {
if (dragTypes[i] instanceof TextTransfer
&& dragDataText == null) {
event.doit = false;
}
if (dragTypes[i] instanceof RTFTransfer
&& dragDataRTF == null) {
event.doit = false;
}
if (dragTypes[i] instanceof HTMLTransfer
&& dragDataHTML == null) {
event.doit = false;
}
if (dragTypes[i] instanceof FileTransfer
&& (dragDataFiles == null || dragDataFiles.length == 0)) {
event.doit = false;
}
}
}
});
}
private void createDragTypes(Composite parent) {
parent.setLayout(new GridLayout());
Button b = new Button(parent, SWT.CHECK);
b.setText("Text Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDragTransfer(TextTransfer.getInstance());
} else {
removeDragTransfer(TextTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("RTF Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDragTransfer(RTFTransfer.getInstance());
} else {
removeDragTransfer(RTFTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("HTML Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDragTransfer(HTMLTransfer.getInstance());
} else {
removeDragTransfer(HTMLTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("File Transfer");
b.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDragTransfer(FileTransfer.getInstance());
} else {
removeDragTransfer(FileTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.PUSH);
b.setText("Select File(s)");
b.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(fileList.getShell(),
SWT.OPEN | SWT.MULTI);
String result = dialog.open();
if (result != null && result.length() > 0) {
fileList.removeAll();
String separator = System.getProperty("file.separator");
String path = dialog.getFilterPath();
String[] names = dialog.getFileNames();
for (int i = 0; i < names.length; i++) {
fileList.add(path + separator + names[i]);
}
}
}
});
fileList = new List(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
GridData data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.BEGINNING;
fileList.setLayoutData(data);
}
private void createDragWidget(Composite parent) {
parent.setLayout(new FormLayout());
Combo combo = new Combo(parent, SWT.READ_ONLY);
combo.setItems(new String[] { "Toggle Button", "Radio Button",
"Checkbox", "Canvas", "Label", "List", "Table", "Tree" });
combo.select(LABEL);
dragControlType = combo.getSelectionIndex();
dragControl = createWidget(dragControlType, parent, "Drag Source");
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Object data = dragControl.getLayoutData();
Composite parent = dragControl.getParent();
dragControl.dispose();
Combo c = (Combo) e.widget;
dragControlType = c.getSelectionIndex();
dragControl = createWidget(dragControlType, parent,
"Drag Source");
dragControl.setLayoutData(data);
if (dragEnabled)
createDragSource();
parent.layout();
}
});
Button b = new Button(parent, SWT.CHECK);
b.setText("DragSource");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
dragEnabled = b.getSelection();
if (dragEnabled) {
createDragSource();
} else {
if (dragSource != null) {
dragSource.dispose();
}
dragSource = null;
}
}
});
FormData data = new FormData();
data.top = new FormAttachment(0, 10);
data.bottom = new FormAttachment(combo, -10);
data.left = new FormAttachment(0, 10);
data.right = new FormAttachment(100, -10);
dragControl.setLayoutData(data);
data = new FormData();
data.bottom = new FormAttachment(100, -10);
data.left = new FormAttachment(0, 10);
combo.setLayoutData(data);
data = new FormData();
data.bottom = new FormAttachment(100, -10);
data.left = new FormAttachment(combo, 10);
b.setLayoutData(data);
}
private void createDropOperations(Composite parent) {
parent.setLayout(new RowLayout(SWT.VERTICAL));
final Button moveButton = new Button(parent, SWT.CHECK);
moveButton.setText("DND.DROP_MOVE");
moveButton.setSelection(true);
dropOperation = DND.DROP_MOVE;
moveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropOperation |= DND.DROP_MOVE;
} else {
dropOperation = dropOperation & ~DND.DROP_MOVE;
if (dropOperation == 0
|| (dropDefaultOperation & DND.DROP_MOVE) != 0) {
dropOperation |= DND.DROP_MOVE;
moveButton.setSelection(true);
}
}
if (dropEnabled) {
createDropTarget();
}
}
});
final Button copyButton = new Button(parent, SWT.CHECK);
copyButton.setText("DND.DROP_COPY");
copyButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropOperation |= DND.DROP_COPY;
} else {
dropOperation = dropOperation & ~DND.DROP_COPY;
if (dropOperation == 0
|| (dropDefaultOperation & DND.DROP_COPY) != 0) {
dropOperation = DND.DROP_COPY;
copyButton.setSelection(true);
}
}
if (dropEnabled) {
createDropTarget();
}
}
});
final Button linkButton = new Button(parent, SWT.CHECK);
linkButton.setText("DND.DROP_LINK");
linkButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropOperation |= DND.DROP_LINK;
} else {
dropOperation = dropOperation & ~DND.DROP_LINK;
if (dropOperation == 0
|| (dropDefaultOperation & DND.DROP_LINK) != 0) {
dropOperation = DND.DROP_LINK;
linkButton.setSelection(true);
}
}
if (dropEnabled) {
createDropTarget();
}
}
});
Button b = new Button(parent, SWT.CHECK);
b.setText("DND.DROP_DEFAULT");
defaultParent = new Composite(parent, SWT.NONE);
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropOperation |= DND.DROP_DEFAULT;
defaultParent.setVisible(true);
} else {
dropOperation = dropOperation & ~DND.DROP_DEFAULT;
defaultParent.setVisible(false);
}
if (dropEnabled) {
createDropTarget();
}
}
});
defaultParent.setVisible(false);
GridLayout layout = new GridLayout();
layout.marginWidth = 20;
defaultParent.setLayout(layout);
Label label = new Label(defaultParent, SWT.NONE);
label.setText("Value for default operation is:");
b = new Button(defaultParent, SWT.RADIO);
b.setText("DND.DROP_MOVE");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropDefaultOperation = DND.DROP_MOVE;
dropOperation |= DND.DROP_MOVE;
moveButton.setSelection(true);
if (dropEnabled) {
createDropTarget();
}
}
}
});
b = new Button(defaultParent, SWT.RADIO);
b.setText("DND.DROP_COPY");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropDefaultOperation = DND.DROP_COPY;
dropOperation |= DND.DROP_COPY;
copyButton.setSelection(true);
if (dropEnabled) {
createDropTarget();
}
}
}
});
b = new Button(defaultParent, SWT.RADIO);
b.setText("DND.DROP_LINK");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropDefaultOperation = DND.DROP_LINK;
dropOperation |= DND.DROP_LINK;
linkButton.setSelection(true);
if (dropEnabled) {
createDropTarget();
}
}
}
});
b = new Button(defaultParent, SWT.RADIO);
b.setText("DND.DROP_NONE");
b.setSelection(true);
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropDefaultOperation = DND.DROP_NONE;
dropOperation &= ~DND.DROP_DEFAULT;
if (dropEnabled) {
createDropTarget();
}
}
}
});
}
private void createDropTarget() {
if (dropTarget != null)
dropTarget.dispose();
dropTarget = new DropTarget(dropControl, dropOperation);
dropTarget.setTransfer(dropTypes);
dropTarget.addDropListener(new DropTargetListener() {
public void dragEnter(DropTargetEvent event) {
dropConsole.append(">>dragEnter\n");
printEvent(event);
if (event.detail == DND.DROP_DEFAULT) {
event.detail = dropDefaultOperation;
}
event.feedback = dropFeedback;
}
public void dragLeave(DropTargetEvent event) {
dropConsole.append(">>dragLeave\n");
printEvent(event);
}
public void dragOperationChanged(DropTargetEvent event) {
dropConsole.append(">>dragOperationChanged\n");
printEvent(event);
if (event.detail == DND.DROP_DEFAULT) {
event.detail = dropDefaultOperation;
}
event.feedback = dropFeedback;
}
public void dragOver(DropTargetEvent event) {
dropConsole.append(">>dragOver\n");
printEvent(event);
event.feedback = dropFeedback;
}
public void drop(DropTargetEvent event) {
dropConsole.append(">>drop\n");
printEvent(event);
String[] strings = null;
if (TextTransfer.getInstance().isSupportedType(
event.currentDataType)
|| RTFTransfer.getInstance().isSupportedType(
event.currentDataType)
|| HTMLTransfer.getInstance().isSupportedType(
event.currentDataType)) {
strings = new String[] { (String) event.data };
}
if (FileTransfer.getInstance().isSupportedType(
event.currentDataType)) {
strings = (String[]) event.data;
}
if (strings == null || strings.length == 0) {
dropConsole.append("!!Invalid data dropped");
return;
}
if (strings.length == 1
&& (dropControlType == TABLE || dropControlType == TREE || dropControlType == LIST)) {
// convert string separated by "\n" into an array of strings
String string = strings[0];
int count = 0;
int offset = string.indexOf("\n", 0);
while (offset > 0) {
count++;
offset = string.indexOf("\n", offset + 1);
}
if (count > 0) {
strings = new String[count + 1];
int start = 0;
int end = string.indexOf("\n");
int index = 0;
while (start < end) {
strings[index++] = string.substring(start, end);
start = end + 1;
end = string.indexOf("\n", start);
if (end == -1)
end = string.length();
}
}
}
switch (dropControlType) {
case BUTTON_CHECK:
case BUTTON_TOGGLE:
case BUTTON_RADIO: {
Button b = (Button) dropControl;
b.setText(strings[0]);
break;
}
case TABLE: {
Table table = (Table) dropControl;
Point p = event.display.map(null, table, event.x, event.y);
TableItem dropItem = table.getItem(p);
int index = dropItem == null ? table.getItemCount() : table
.indexOf(dropItem);
for (int i = 0; i < strings.length; i++) {
TableItem item = new TableItem(table, SWT.NONE, index);
item.setText(0, strings[i]);
item.setText(1, "dropped item");
}
TableColumn[] columns = table.getColumns();
for (int i = 0; i < columns.length; i++) {
columns[i].pack();
}
break;
}
case TEXT: {
Text text = (Text) dropControl;
for (int i = 0; i < strings.length; i++) {
text.append(strings[i] + "\n");
}
break;
}
case TREE: {
Tree tree = (Tree) dropControl;
Point p = event.display.map(null, tree, event.x, event.y);
TreeItem parentItem = tree.getItem(p);
for (int i = 0; i < strings.length; i++) {
TreeItem item = parentItem != null ? new TreeItem(
parentItem, SWT.NONE) : new TreeItem(tree,
SWT.NONE);
item.setText(strings[i]);
}
break;
}
case CANVAS: {
dropControl.setData("STRINGS", strings);
dropControl.redraw();
break;
}
case LABEL: {
Label label = (Label) dropControl;
label.setText(strings[0]);
break;
}
case LIST: {
List list = (List) dropControl;
for (int i = 0; i < strings.length; i++) {
list.add(strings[i]);
}
break;
}
default:
throw new SWTError(SWT.ERROR_NOT_IMPLEMENTED);
}
}
public void dropAccept(DropTargetEvent event) {
dropConsole.append(">>dropAccept\n");
printEvent(event);
}
});
}
private void createFeedbackTypes(Group parent) {
parent.setLayout(new RowLayout(SWT.VERTICAL));
Button b = new Button(parent, SWT.CHECK);
b.setText("FEEDBACK_SELECT");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropFeedback |= DND.FEEDBACK_SELECT;
} else {
dropFeedback &= ~DND.FEEDBACK_SELECT;
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("FEEDBACK_SCROLL");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropFeedback |= DND.FEEDBACK_SCROLL;
} else {
dropFeedback &= ~DND.FEEDBACK_SCROLL;
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("FEEDBACK_INSERT_BEFORE");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropFeedback |= DND.FEEDBACK_INSERT_BEFORE;
} else {
dropFeedback &= ~DND.FEEDBACK_INSERT_BEFORE;
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("FEEDBACK_INSERT_AFTER");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropFeedback |= DND.FEEDBACK_INSERT_AFTER;
} else {
dropFeedback &= ~DND.FEEDBACK_INSERT_AFTER;
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("FEEDBACK_EXPAND");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
dropFeedback |= DND.FEEDBACK_EXPAND;
} else {
dropFeedback &= ~DND.FEEDBACK_EXPAND;
}
}
});
}
private void createDropTypes(Composite parent) {
parent.setLayout(new RowLayout(SWT.VERTICAL));
Button b = new Button(parent, SWT.CHECK);
b.setText("Text Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDropTransfer(TextTransfer.getInstance());
} else {
removeDropTransfer(TextTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("RTF Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDropTransfer(RTFTransfer.getInstance());
} else {
removeDropTransfer(RTFTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("HTML Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDropTransfer(HTMLTransfer.getInstance());
} else {
removeDropTransfer(HTMLTransfer.getInstance());
}
}
});
b = new Button(parent, SWT.CHECK);
b.setText("File Transfer");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (b.getSelection()) {
addDropTransfer(FileTransfer.getInstance());
} else {
removeDropTransfer(FileTransfer.getInstance());
}
}
});
}
private void createDropWidget(Composite parent) {
parent.setLayout(new FormLayout());
Combo combo = new Combo(parent, SWT.READ_ONLY);
combo
.setItems(new String[] { "Toggle Button", "Radio Button",
"Checkbox", "Canvas", "Label", "List", "Table", "Tree",
"Text" });
combo.select(LABEL);
dropControlType = combo.getSelectionIndex();
dropControl = createWidget(dropControlType, parent, "Drop Target");
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Object data = dropControl.getLayoutData();
Composite parent = dropControl.getParent();
dropControl.dispose();
Combo c = (Combo) e.widget;
dropControlType = c.getSelectionIndex();
dropControl = createWidget(dropControlType, parent,
"Drop Target");
dropControl.setLayoutData(data);
if (dropEnabled)
createDropTarget();
parent.layout();
}
});
Button b = new Button(parent, SWT.CHECK);
b.setText("DropTarget");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
dropEnabled = b.getSelection();
if (dropEnabled) {
createDropTarget();
} else {
if (dropTarget != null) {
dropTarget.dispose();
}
dropTarget = null;
}
}
});
FormData data = new FormData();
data.top = new FormAttachment(0, 10);
data.bottom = new FormAttachment(combo, -10);
data.left = new FormAttachment(0, 10);
data.right = new FormAttachment(100, -10);
dropControl.setLayoutData(data);
data = new FormData();
data.bottom = new FormAttachment(100, -10);
data.left = new FormAttachment(0, 10);
combo.setLayoutData(data);
data = new FormData();
data.bottom = new FormAttachment(100, -10);
data.left = new FormAttachment(combo, 10);
b.setLayoutData(data);
}
private Control createWidget(int type, Composite parent, String prefix) {
switch (type) {
case BUTTON_CHECK: {
Button button = new Button(parent, SWT.CHECK);
button.setText(prefix + " Check box");
return button;
}
case BUTTON_TOGGLE: {
Button button = new Button(parent, SWT.TOGGLE);
button.setText(prefix + " Toggle button");
return button;
}
case BUTTON_RADIO: {
Button button = new Button(parent, SWT.RADIO);
button.setText(prefix + " Radio button");
return button;
}
case TABLE: {
Table table = new Table(parent, SWT.BORDER | SWT.MULTI);
TableColumn column1 = new TableColumn(table, SWT.NONE);
TableColumn column2 = new TableColumn(table, SWT.NONE);
for (int i = 0; i < 10; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, prefix + " name " + i);
item.setText(1, prefix + " value " + i);
}
column1.pack();
column2.pack();
return table;
}
case TEXT: {
Text text = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL
| SWT.H_SCROLL);
text.setText(prefix + " Text");
return text;
}
case TREE: {
Tree tree = new Tree(parent, SWT.BORDER);
for (int i = 0; i < 3; i++) {
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText(prefix + " item " + i);
for (int j = 0; j < 3; j++) {
TreeItem subItem = new TreeItem(item, SWT.NONE);
subItem.setText(prefix + " item " + j);
for (int k = 0; k < 3; k++) {
TreeItem subsubItem = new TreeItem(subItem, SWT.NONE);
subsubItem.setText(prefix + " item " + k);
}
}
}
return tree;
}
case CANVAS: {
Canvas canvas = new Canvas(parent, SWT.BORDER);
canvas.setData("STRINGS",
new String[] { prefix + " Canvas widget" });
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Canvas c = (Canvas) e.widget;
Image image = (Image) c.getData("IMAGE");
if (image != null) {
e.gc.drawImage(image, 5, 5);
} else {
String[] strings = (String[]) c.getData("STRINGS");
if (strings != null) {
FontMetrics metrics = e.gc.getFontMetrics();
int height = metrics.getHeight();
int y = 5;
for (int i = 0; i < strings.length; i++) {
e.gc.drawString(strings[i], 5, y);
y += height + 5;
}
}
}
}
});
return canvas;
}
case LABEL: {
Label label = new Label(parent, SWT.BORDER);
label.setText(prefix + " Label");
return label;
}
case LIST: {
List list = new List(parent, SWT.BORDER);
list
.setItems(new String[] { prefix + " Item a",
prefix + " Item b", prefix + " Item c",
prefix + " Item d" });
return list;
}
default:
throw new SWTError(SWT.ERROR_NOT_IMPLEMENTED);
}
}
public void open(Display display) {
Shell shell = new Shell(display);
shell.setText("Drag and Drop Example");
shell.setLayout(new FillLayout());
ScrolledComposite sc = new ScrolledComposite(shell, SWT.H_SCROLL
| SWT.V_SCROLL);
Composite parent = new Composite(sc, SWT.NONE);
sc.setContent(parent);
parent.setLayout(new FormLayout());
Label dragLabel = new Label(parent, SWT.LEFT);
dragLabel.setText("Drag Source:");
Group dragWidgetGroup = new Group(parent, SWT.NONE);
dragWidgetGroup.setText("Widget");
createDragWidget(dragWidgetGroup);
Composite cLeft = new Composite(parent, SWT.NONE);
cLeft.setLayout(new GridLayout(2, false));
Group dragOperationsGroup = new Group(cLeft, SWT.NONE);
dragOperationsGroup.setLayoutData(new GridData(SWT.LEFT, SWT.FILL,
false, false, 1, 1));
dragOperationsGroup.setText("Allowed Operation(s):");
createDragOperations(dragOperationsGroup);
Group dragTypesGroup = new Group(cLeft, SWT.NONE);
dragTypesGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true,
false, 1, 1));
dragTypesGroup.setText("Transfer Type(s):");
createDragTypes(dragTypesGroup);
dragConsole = new Text(cLeft, SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL
| SWT.H_SCROLL | SWT.MULTI);
dragConsole.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true,
2, 1));
Menu menu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(menu, SWT.PUSH);
item.setText("Clear");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
dragConsole.setText("");
}
});
item = new MenuItem(menu, SWT.CHECK);
item.setText("Show Event detail");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MenuItem item = (MenuItem) e.widget;
dragEventDetail = item.getSelection();
}
});
dragConsole.setMenu(menu);
Label dropLabel = new Label(parent, SWT.LEFT);
dropLabel.setText("Drop Target:");
Group dropWidgetGroup = new Group(parent, SWT.NONE);
dropWidgetGroup.setText("Widget");
createDropWidget(dropWidgetGroup);
Composite cRight = new Composite(parent, SWT.NONE);
cRight.setLayout(new GridLayout(2, false));
Group dropOperationsGroup = new Group(cRight, SWT.NONE);
dropOperationsGroup.setLayoutData(new GridData(SWT.LEFT, SWT.FILL,
false, false, 1, 2));
dropOperationsGroup.setText("Allowed Operation(s):");
createDropOperations(dropOperationsGroup);
Group dropTypesGroup = new Group(cRight, SWT.NONE);
dropTypesGroup.setText("Transfer Type(s):");
createDropTypes(dropTypesGroup);
Group feedbackTypesGroup = new Group(cRight, SWT.NONE);
feedbackTypesGroup.setText("Feedback Type(s):");
createFeedbackTypes(feedbackTypesGroup);
dropConsole = new Text(cRight, SWT.READ_ONLY | SWT.BORDER
| SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
dropConsole.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true,
2, 1));
menu = new Menu(shell, SWT.POP_UP);
item = new MenuItem(menu, SWT.PUSH);
item.setText("Clear");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
dropConsole.setText("");
}
});
item = new MenuItem(menu, SWT.CHECK);
item.setText("Show Event detail");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MenuItem item = (MenuItem) e.widget;
dropEventDetail = item.getSelection();
}
});
dropConsole.setMenu(menu);
int height = 200;
FormData data = new FormData();
data.top = new FormAttachment(0, 10);
data.left = new FormAttachment(0, 10);
dragLabel.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(dragLabel, 10);
data.left = new FormAttachment(0, 10);
data.right = new FormAttachment(50, -10);
data.height = height;
dragWidgetGroup.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(dragWidgetGroup, 10);
data.left = new FormAttachment(0, 10);
data.right = new FormAttachment(50, -10);
data.bottom = new FormAttachment(100, -10);
cLeft.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(0, 10);
data.left = new FormAttachment(cLeft, 10);
dropLabel.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(dropLabel, 10);
data.left = new FormAttachment(cLeft, 10);
data.right = new FormAttachment(100, -10);
data.height = height;
dropWidgetGroup.setLayoutData(data);
data = new FormData();
data.top = new FormAttachment(dropWidgetGroup, 10);
data.left = new FormAttachment(cLeft, 10);
data.right = new FormAttachment(100, -10);
data.bottom = new FormAttachment(100, -10);
cRight.setLayoutData(data);
sc.setMinSize(parent.computeSize(SWT.DEFAULT, SWT.DEFAULT));
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
Point size = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Rectangle monitorArea = shell.getMonitor().getClientArea();
shell.setSize(Math.min(size.x, monitorArea.width - 20), Math.min(
size.y, monitorArea.height - 20));
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
private void printEvent(DragSourceEvent e) {
if (!dragEventDetail)
return;
StringBuffer sb = new StringBuffer();
sb.append("widget: ");
sb.append(e.widget);
sb.append(", time: ");
sb.append(e.time);
sb.append(", operation: ");
sb.append(e.detail);
sb.append(", type: ");
sb.append(e.dataType != null ? e.dataType.type : 0);
sb.append(", doit: ");
sb.append(e.doit);
sb.append(", data: ");
sb.append(e.data);
sb.append("\n");
dragConsole.append(sb.toString());
}
private void printEvent(DropTargetEvent e) {
if (!dropEventDetail)
return;
StringBuffer sb = new StringBuffer();
sb.append("widget; ");
sb.append(e.widget);
sb.append(", time: ");
sb.append(e.time);
sb.append(", x: ");
sb.append(e.x);
sb.append(", y: ");
sb.append(e.y);
sb.append(", item: ");
sb.append(e.item);
sb.append(", operations: ");
sb.append(e.operations);
sb.append(", operation: ");
sb.append(e.detail);
sb.append(", feedback: ");
sb.append(e.feedback);
if (e.dataTypes != null) {
for (int i = 0; i < e.dataTypes.length; i++) {
sb.append(", dataType ");
sb.append(i);
sb.append(": ");
sb.append(e.dataTypes[i].type);
}
} else {
sb.append(", dataTypes: none");
}
sb.append(", currentDataType: ");
sb.append(e.currentDataType);
sb.append(", data: ");
sb.append(e.data);
sb.append("\n");
dropConsole.append(sb.toString());
}
private void removeDragTransfer(Transfer transfer) {
if (dragTypes.length == 1) {
dragTypes = new Transfer[0];
} else {
int index = -1;
for (int i = 0; i < dragTypes.length; i++) {
if (dragTypes[i] == transfer) {
index = i;
break;
}
}
if (index == -1)
return;
Transfer[] newTypes = new Transfer[dragTypes.length - 1];
System.arraycopy(dragTypes, 0, newTypes, 0, index);
System.arraycopy(dragTypes, index + 1, newTypes, index,
dragTypes.length - index - 1);
dragTypes = newTypes;
}
if (dragSource != null) {
dragSource.setTransfer(dragTypes);
}
}
private void removeDropTransfer(Transfer transfer) {
if (dropTypes.length == 1) {
dropTypes = new Transfer[0];
} else {
int index = -1;
for (int i = 0; i < dropTypes.length; i++) {
if (dropTypes[i] == transfer) {
index = i;
break;
}
}
if (index == -1)
return;
Transfer[] newTypes = new Transfer[dropTypes.length - 1];
System.arraycopy(dropTypes, 0, newTypes, 0, index);
System.arraycopy(dropTypes, index + 1, newTypes, index,
dropTypes.length - index - 1);
dropTypes = newTypes;
}
if (dropTarget != null) {
dropTarget.setTransfer(dropTypes);
}
}
}
Related examples in the same category