Java/SWT JFace Eclipse/Drag Drop — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Текущая версия на 08:57, 1 июня 2010
Содержание
- 1 Drag and Drop: determine data types available (win32 only)
- 2 Drag and Drop: determine native data types available (motif only)
- 3 Drag and Drop example snippet: define a default operation (in this example, Copy)
- 4 Drag and Drop example snippet: define my own data transfer type
- 5 Drag and Drop example snippet: drag leaf items in a tree
- 6 Drag and Drop example snippet: drag text between two labels
- 7 Illustrates dragging
- 8 Simple DND (Drag and Drop) Example
- 9 SWT DnD (Drag and drop) Composite
- 10 SWT DND (Drag and Drop) comprehensive Example
- 11 Word Jumbles
Drag and Drop: determine data types available (win32 only)
<source lang="java">
/*
* Drag and Drop example snippet: determine data types available (win32 only) * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */
import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.internal.ole.win32.ru; import org.eclipse.swt.internal.win32.TCHAR; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; public class Snippet83 extends ByteArrayTransfer {
private static Snippet83 _instance = new Snippet83(); private int[] ids; private String[] names; public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Table control = new Table(shell, SWT.NONE); TableItem item = new TableItem(control, SWT.NONE); item .setText("Drag data over this site to see the native transfer type."); DropTarget target = new DropTarget(control, DND.DROP_DEFAULT | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_MOVE); target.setTransfer(new Transfer[] { Snippet83.getInstance() }); target.addDropListener(new DropTargetAdapter() { public void dragEnter(DropTargetEvent event) { String ops = ""; if ((event.operations & DND.DROP_COPY) != 0) ops += "Copy;"; if ((event.operations & DND.DROP_MOVE) != 0) ops += "Move;"; if ((event.operations & DND.DROP_LINK) != 0) ops += "Link;"; control.removeAll(); TableItem item1 = new TableItem(control, SWT.NONE); item1.setText("Allowed Operations are " + ops); if (event.detail == DND.DROP_DEFAULT) { if ((event.operations & DND.DROP_COPY) != 0) { event.detail = DND.DROP_COPY; } else if ((event.operations & DND.DROP_LINK) != 0) { event.detail = DND.DROP_LINK; } else if ((event.operations & DND.DROP_MOVE) != 0) { event.detail = DND.DROP_MOVE; } } TransferData[] data = event.dataTypes; for (int i = 0; i < data.length; i++) { int id = data[i].type; String name = getNameFromId(id); TableItem item2 = new TableItem(control, SWT.NONE); item2.setText("Data type is " + id + " " + name); } } }); shell.setSize(400, 400); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static Snippet83 getInstance() { return _instance; } Snippet83() { ids = new int[80000]; names = new String[80000]; for (int i = 0; i < ids.length; i++) { ids[i] = i; names[i] = getNameFromId(i); } } public void javaToNative(Object object, TransferData transferData) { } public Object nativeToJava(TransferData transferData) { return "Hello World"; } protected String[] getTypeNames() { return names; } protected int[] getTypeIds() { return ids; } static String getNameFromId(int id) { String name = null; int maxSize = 128; TCHAR buffer = new TCHAR(0, maxSize); int size = COM.GetClipboardFormatName(id, buffer, maxSize); String type = null; if (size != 0) { name = buffer.toString(0, size); } else { switch (id) { case COM.CF_HDROP: name = "CF_HDROP"; break; case COM.CF_TEXT: name = "CF_TEXT"; break; case COM.CF_BITMAP: name = "CF_BITMAP"; break; case COM.CF_METAFILEPICT: name = "CF_METAFILEPICT"; break; case COM.CF_SYLK: name = "CF_SYLK"; break; case COM.CF_DIF: name = "CF_DIF"; break; case COM.CF_TIFF: name = "CF_TIFF"; break; case COM.CF_OEMTEXT: name = "CF_OEMTEXT"; break; case COM.CF_DIB: name = "CF_DIB"; break; case COM.CF_PALETTE: name = "CF_PALETTE"; break; case COM.CF_PENDATA: name = "CF_PENDATA"; break; case COM.CF_RIFF: name = "CF_RIFF"; break; case COM.CF_WAVE: name = "CF_WAVE"; break; case COM.CF_UNICODETEXT: name = "CF_UNICODETEXT"; break; case COM.CF_ENHMETAFILE: name = "CF_ENHMETAFILE"; break; case COM.CF_LOCALE: name = "CF_LOCALE"; break; case COM.CF_MAX: name = "CF_MAX"; break; } } return name; }
}
</source>
Drag and Drop: determine native data types available (motif only)
<source lang="java">
/*******************************************************************************
* 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: determine native data types available (motif * only) * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */
import org.eclipse.swt.*; import org.eclipse.swt.dnd.*; import org.eclipse.swt.internal.*; import org.eclipse.swt.internal.motif.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class Snippet158 extends ByteArrayTransfer {
private static Snippet158 _instance = new Snippet158(); private int[] ids; private String[] names; public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Table control = new Table(shell, SWT.NONE); TableItem item = new TableItem(control, SWT.NONE); item .setText("Drag data over this site to see the native transfer type."); DropTarget target = new DropTarget(control, DND.DROP_DEFAULT | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_MOVE); target.setTransfer(new Transfer[] { Snippet158.getInstance() }); target.addDropListener(new DropTargetAdapter() { public void dragEnter(DropTargetEvent event) { String ops = ""; if ((event.operations & DND.DROP_COPY) != 0) ops += "Copy;"; if ((event.operations & DND.DROP_MOVE) != 0) ops += "Move;"; if ((event.operations & DND.DROP_LINK) != 0) ops += "Link;"; control.removeAll(); TableItem item1 = new TableItem(control, SWT.NONE); item1.setText("Allowed Operations are " + ops); if (event.detail == DND.DROP_DEFAULT) { if ((event.operations & DND.DROP_COPY) != 0) { event.detail = DND.DROP_COPY; } else if ((event.operations & DND.DROP_LINK) != 0) { event.detail = DND.DROP_LINK; } else if ((event.operations & DND.DROP_MOVE) != 0) { event.detail = DND.DROP_MOVE; } } TransferData[] data = event.dataTypes; for (int i = 0; i < data.length; i++) { int id = data[i].type; String name = getNameFromId(id); TableItem item2 = new TableItem(control, SWT.NONE); item2.setText("Data type is " + id + " " + name); } } }); shell.setSize(400, 400); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static Snippet158 getInstance() { return _instance; } Snippet158() { } public void javaToNative(Object object, TransferData transferData) { } public Object nativeToJava(TransferData transferData) { return "Hello World"; } protected String[] getTypeNames() { return names; } static int shellHandle; protected int[] getTypeIds() { if (ids == null) { Display display = Display.getCurrent(); int widgetClass = OS.topLevelShellWidgetClass(); shellHandle = OS.XtAppCreateShell(null, null, widgetClass, display.xDisplay, null, 0); OS.XtSetMappedWhenManaged(shellHandle, false); OS.XtRealizeWidget(shellHandle); ids = new int[840]; names = new String[840]; for (int i = 0; i < ids.length; i++) { ids[i] = i + i; names[i] = getNameFromId(i + 1); } } return ids; } static String getNameFromId(int id) { int xDisplay = OS.XtDisplay(shellHandle); int ptr = 0; try { ptr = OS.XmGetAtomName(xDisplay, id); } catch (Throwable t) { } if (ptr == 0) return "invalid " + id; int length = OS.strlen(ptr); byte[] nameBuf = new byte[length]; OS.memmove(nameBuf, ptr, length); OS.XFree(ptr); return new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase(); }
}
</source>
Drag and Drop example snippet: define a default operation (in this example, Copy)
<source lang="java">
/*
* Drag and Drop example snippet: define a default operation (in this example, Copy) * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */
import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class Snippet84 {
public static void main(String[] args) {
Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Label label = new Label(shell, SWT.BORDER); label.setText("Drag Source"); DragSource source = new DragSource(label, DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK); source.setTransfer(new Transfer[] {TextTransfer.getInstance()}); source.addDragListener(new DragSourceAdapter() { public void dragSetData(DragSourceEvent event) { event.data = "Text Transferred"; } public void dragFinished(DragSourceEvent event) { if (event.doit) { String operation = null; switch (event.detail) { case DND.DROP_MOVE: operation = "moved"; break; case DND.DROP_COPY: operation = "copied"; break; case DND.DROP_LINK: operation = "linked"; break; case DND.DROP_NONE: operation = "disallowed"; break; default: operation = "unknown"; break; } label.setText("Drag Source (data "+operation+")"); } else { label.setText("Drag Source (drag cancelled)"); } } }); final Text text = new Text(shell, SWT.BORDER | SWT.MULTI); text.setText("Drop Target"); DropTarget target = new DropTarget(text, DND.DROP_DEFAULT | DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK); target.setTransfer(new Transfer[] {TextTransfer.getInstance()}); target.addDropListener(new DropTargetAdapter() { public void dragEnter(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) event.detail = DND.DROP_COPY; } public void dragOperationChanged(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) event.detail = DND.DROP_COPY; } public void drop(DropTargetEvent event) { String operation = null; switch (event.detail) { case DND.DROP_MOVE: operation = "moved"; break; case DND.DROP_COPY: operation = "copied"; break; case DND.DROP_LINK: operation = "linked"; break; case DND.DROP_NONE: operation = "disallowed"; break; default: operation = "unknown"; break; } text.append("\n"+operation+(String)event.data); } }); shell.setSize(400, 400); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose();
} }
</source>
Drag and Drop example snippet: define my own data transfer type
<source lang="java">
/*
* Drag and Drop example snippet: define my own data transfer type * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; 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; } 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) { } } 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; } protected String[] getTypeNames() { return new String[] { MYTYPENAME }; } 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; } 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() { 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() { public void dragEnter(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { event.detail = DND.DROP_COPY; } } public void dragOperationChanged(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { event.detail = DND.DROP_COPY; } } 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(); }
}
</source>
Drag and Drop example snippet: drag leaf items in a tree
<source lang="java">
/*
* Drag and Drop example snippet: drag leaf items in a tree * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */
import org.eclipse.swt.SWT; 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.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public class Snippet91 {
public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Tree tree = new Tree(shell, SWT.BORDER); for (int i = 0; i < 3; i++) { TreeItem item = new TreeItem(tree, SWT.NONE); item.setText("item " + i); for (int j = 0; j < 3; j++) { TreeItem subItem = new TreeItem(item, SWT.NONE); subItem.setText("item " + i + " " + j); for (int k = 0; k < 3; k++) { TreeItem subsubItem = new TreeItem(subItem, SWT.NONE); subsubItem.setText("item " + i + " " + j + " " + k); } } } Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK; final DragSource source = new DragSource(tree, operations); source.setTransfer(types); final TreeItem[] dragSourceItem = new TreeItem[1]; source.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0 && selection[0].getItemCount() == 0) { event.doit = true; dragSourceItem[0] = selection[0]; } else { event.doit = false; } }; public void dragSetData(DragSourceEvent event) { event.data = dragSourceItem[0].getText(); } public void dragFinished(DragSourceEvent event) { if (event.detail == DND.DROP_MOVE) dragSourceItem[0].dispose(); dragSourceItem[0] = null; } }); DropTarget target = new DropTarget(tree, operations); target.setTransfer(types); target.addDropListener(new DropTargetAdapter() { public void dragOver(DropTargetEvent event) { event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL; if (event.item != null) { TreeItem item = (TreeItem) event.item; Point pt = display.map(null, tree, event.x, event.y); Rectangle bounds = item.getBounds(); if (pt.y < bounds.y + bounds.height / 3) { event.feedback |= DND.FEEDBACK_INSERT_BEFORE; } else if (pt.y > bounds.y + 2 * bounds.height / 3) { event.feedback |= DND.FEEDBACK_INSERT_AFTER; } else { event.feedback |= DND.FEEDBACK_SELECT; } } } public void drop(DropTargetEvent event) { if (event.data == null) { event.detail = DND.DROP_NONE; return; } String text = (String) event.data; if (event.item == null) { TreeItem item = new TreeItem(tree, SWT.NONE); item.setText(text); } else { TreeItem item = (TreeItem) event.item; Point pt = display.map(null, tree, event.x, event.y); Rectangle bounds = item.getBounds(); TreeItem parent = item.getParentItem(); if (parent != null) { TreeItem[] items = parent.getItems(); int index = 0; for (int i = 0; i < items.length; i++) { if (items[i] == item) { index = i; break; } } if (pt.y < bounds.y + bounds.height / 3) { TreeItem newItem = new TreeItem(parent, SWT.NONE, index); newItem.setText(text); } else if (pt.y > bounds.y + 2 * bounds.height / 3) { TreeItem newItem = new TreeItem(parent, SWT.NONE, index + 1); newItem.setText(text); } else { TreeItem newItem = new TreeItem(item, SWT.NONE); newItem.setText(text); } } else { TreeItem[] items = tree.getItems(); int index = 0; for (int i = 0; i < items.length; i++) { if (items[i] == item) { index = i; break; } } if (pt.y < bounds.y + bounds.height / 3) { TreeItem newItem = new TreeItem(tree, SWT.NONE, index); newItem.setText(text); } else if (pt.y > bounds.y + 2 * bounds.height / 3) { TreeItem newItem = new TreeItem(tree, SWT.NONE, index + 1); newItem.setText(text); } else { TreeItem newItem = new TreeItem(item, SWT.NONE); newItem.setText(text); } } } } }); shell.setSize(400, 400); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}
</source>
Drag and Drop example snippet: drag text between two labels
<source lang="java">
/*
* Drag and Drop example snippet: drag text between two labels * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */
import org.eclipse.swt.SWT; 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.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; public class Snippet78 {
public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Label label1 = new Label(shell, SWT.BORDER); label1.setText("TEXT"); final Label label2 = new Label(shell, SWT.BORDER); setDragDrop(label1); setDragDrop(label2); shell.setSize(200, 200); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void setDragDrop(final Label label) { Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK; final DragSource source = new DragSource(label, operations); source.setTransfer(types); source.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { event.doit = (label.getText().length() != 0); } public void dragSetData(DragSourceEvent event) { event.data = label.getText(); } public void dragFinished(DragSourceEvent event) { if (event.detail == DND.DROP_MOVE) label.setText(""); } }); DropTarget target = new DropTarget(label, operations); target.setTransfer(types); target.addDropListener(new DropTargetAdapter() { public void drop(DropTargetEvent event) { if (event.data == null) { event.detail = DND.DROP_NONE; return; } label.setText((String) event.data); } }); }
}
</source>
Illustrates dragging
<source lang="java">
//Send questions, comments, bug reports, etc. to the authors: //Rob Warner (rwarner@interspatial.ru) //Robert Harris (rbrt_harris@yahoo.ru) import org.eclipse.swt.*; import org.eclipse.swt.dnd.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /**
* This program illustrates dragging */
public class SnippetBoard {
/** * Runs the application */ public void run() { Display display = new Display(); Shell shell = new Shell(display); createContents(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private void createContents(Shell shell) { shell.setLayout(new FillLayout()); Table table = new Table(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); // Create the types Transfer[] types = new Transfer[] { TextTransfer.getInstance()}; // Create the drag source DragSource source = new DragSource(table, DND.DROP_MOVE | DND.DROP_COPY); source.setTransfer(types); source.addDragListener(new DragSourceAdapter() { public void dragSetData(DragSourceEvent event) { // Get the selected items in the drag source DragSource ds = (DragSource) event.widget; Table table = (Table) ds.getControl(); TableItem[] selection = table.getSelection(); // Create a buffer to hold the selected items and fill it StringBuffer buff = new StringBuffer(); for (int i = 0, n = selection.length; i < n; i++) { buff.append(selection[i].getText()); } // Put the data into the event event.data = buff.toString(); } }); // Create the drop target DropTarget target = new DropTarget(table, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT); target.setTransfer(types); target.addDropListener(new DropTargetAdapter() { public void dragEnter(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { event.detail = (event.operations & DND.DROP_COPY) != 0 ? DND.DROP_COPY : DND.DROP_NONE; } // Allow dropping text only for (int i = 0, n = event.dataTypes.length; i < n; i++) { if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) { event.currentDataType = event.dataTypes[i]; } } } public void dragOver(DropTargetEvent event) { // Provide visual feedback event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL; } public void drop(DropTargetEvent event) { // If any text was dropped . . . if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) { // Get the dropped data DropTarget target = (DropTarget) event.widget; Table table = (Table) target.getControl(); String data = (String) event.data; // Create a new item in the table to hold the dropped data TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[] { data}); table.redraw(); } } }); TableColumn column = new TableColumn(table, SWT.NONE); // Seed the table TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[] { "private static final int"}); item = new TableItem(table, SWT.NONE); item.setText(new String[] { "String"}); item = new TableItem(table, SWT.BORDER); item.setText(new String[] { "private static void main(String[] args) {"}); column.pack(); } /** * The application entry point * @param args the command line arguments */ public static void main(String[] args) { new SnippetBoard().run(); }
}
</source>
Simple DND (Drag and Drop) Example
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public class SimpleDNDExample {
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(); }
}
</source>
SWT DnD (Drag and drop) Composite
<source lang="java">
import org.eclipse.swt.SWT; 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.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.ruposite; import org.eclipse.swt.widgets.Text; public class Ch12DnDComposite extends Composite {
public Ch12DnDComposite(Composite parent) { super(parent, SWT.NONE); FillLayout layout = new FillLayout(); setLayout(layout); Text leftText = new Text(this, SWT.MULTI); Text rightText = new Text(this, SWT.MULTI); createDragSource(leftText); createDragSource(rightText); createDropTarget(leftText); createDropTarget(rightText); } private void createDropTarget(final Text targetText) { Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; DropTarget dropTarget = new DropTarget(targetText, DND.DROP_COPY); dropTarget.setTransfer(types); dropTarget.addDropListener(new DropTargetListener() { public void dragEnter(DropTargetEvent event) { } public void dragLeave(DropTargetEvent event) { } public void dragOperationChanged(DropTargetEvent event) { } public void dragOver(DropTargetEvent event) { } public void drop(DropTargetEvent event) { String data = (String) event.data; targetText.append(data); } public void dropAccept(DropTargetEvent event) { } }); } private void createDragSource(final Text sourceText) { Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; DragSource dragSource = new DragSource(sourceText, DND.DROP_COPY); dragSource.setTransfer(types); dragSource.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { if (sourceText.getSelectionText().length() > 0) { event.doit = true; } } public void dragSetData(DragSourceEvent event) { event.data = sourceText.getSelection(); } public void dragFinished(DragSourceEvent event) { //do nothing } }); }
}
</source>
SWT DND (Drag and Drop) comprehensive Example
<source lang="java">
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.rubo; import org.eclipse.swt.widgets.ruposite; 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 = "" + dragDataText + ""; } 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.ruputeSize(SWT.DEFAULT, SWT.DEFAULT)); sc.setExpandHorizontal(true); sc.setExpandVertical(true); Point size = shell.ruputeSize(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); } }
}
</source>
Word Jumbles
<source lang="java">
/*******************************************************************************
* All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie * * Created on 2004-4-26 15:46:26 by JACK $Id$ * ******************************************************************************/
import org.eclipse.swt.SWT; 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.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; public class WordJumbles {
Display display = new Display(); Shell shell = new Shell(display); String word; Label[] labelsRowOne; Label[] labelsRowTwo; Font font = new Font(display, "Arial", 18, SWT.BOLD); public void setDragSource(final Label label) { // Allows text to be moved only. int operations = DND.DROP_MOVE; final DragSource dragSource = new DragSource(label, operations); // Data should be transfered in plain text format. Transfer[] formats = new Transfer[] { TextTransfer.getInstance()}; dragSource.setTransfer(formats); dragSource.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { // Disallows drags if text is not available. if (label.getText().length() == 0) event.doit = false; } public void dragSetData(DragSourceEvent event) { // Provides the text data. if (TextTransfer.getInstance().isSupportedType(event.dataType)) event.data = label.getText(); } public void dragFinished(DragSourceEvent event) { // Removes the text after the move operation. if (event.doit == true || event.detail == DND.DROP_MOVE) { label.setText(""); } } }); label.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { dragSource.dispose(); } }); } public void setDropTarget(final Label label) { int operations = DND.DROP_MOVE; final DropTarget dropTarget = new DropTarget(label, operations); // Data should be transfered in plain text format. Transfer[] formats = new Transfer[] { TextTransfer.getInstance()}; dropTarget.setTransfer(formats); dropTarget.addDropListener(new DropTargetListener() { public void dragEnter(DropTargetEvent event) { // Does not accept any drop if the label has text on it. if(label.getText().length() != 0) event.detail = DND.DROP_NONE; } public void dragLeave(DropTargetEvent event) { } public void dragOperationChanged(DropTargetEvent event) { } public void dragOver(DropTargetEvent event) { } public void drop(DropTargetEvent event) { if (TextTransfer .getInstance() .isSupportedType(event.currentDataType)) { String text = (String) event.data; label.setText(text); // Checks the result. check(); } } public void dropAccept(DropTargetEvent event) { } }); label.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { dropTarget.dispose(); } }); } private void check() { for(int i=0; i<word.length(); i++) { if(! labelsRowTwo[i].getText().equals(word.charAt(i) + "")) return; } MessageBox messageBox = new MessageBox(shell); messageBox.setMessage("Success!"); messageBox.open(); } public WordJumbles(String word) { this.word = word; shell.setText("Word Jumbles"); labelsRowOne = new Label[word.length()]; labelsRowTwo = new Label[word.length()]; int width = 40; // In the production version, you need to implement random permutation // generation. // Apache Jakarta Commons provides this function, see // org.apache.rumons.math.random.RandomDataImpl int[] randomPermutation = { 5, 2, 6, 3, 1, 4, 0 }; for (int i = 0; i < word.length(); i++) { final Label labelRowOne = new Label(shell, SWT.BORDER); labelsRowOne[i] = labelRowOne; labelRowOne.setBounds(10 + width * i, 10, width - 5, width - 5); labelRowOne.setFont(font); labelRowOne.setText(word.charAt(randomPermutation[i]) + ""); labelRowOne.setAlignment(SWT.CENTER); setDragSource(labelRowOne); //setDropTarget(labelRowOne); final Label labelRowTwo = new Label(shell, SWT.BORDER); labelsRowTwo[i] = labelRowTwo; labelRowTwo.setBounds( 10 + width * i, 20 + width, width - 5, width - 5); labelRowTwo.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); labelRowTwo.setFont(font); labelRowTwo.setAlignment(SWT.CENTER); setDragSource(labelRowTwo); //setDropTarget(labelRowTwo); } shell.pack(); shell.open(); //textUser.forceFocus(); // Set up the event loop. while (!shell.isDisposed()) { if (!display.readAndDispatch()) { // If no more entries in event queue display.sleep(); } } display.dispose(); } public static void main(String[] args) { new WordJumbles("ECLIPSE"); }
}
</source>