Java/SWT JFace Eclipse/Drag Drop

Материал из Java эксперт
Перейти к: навигация, поиск

Drag and Drop: determine data types available (win32 only)

/*
 * 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;
  }
}





Drag and Drop: determine native data types available (motif only)

/*******************************************************************************
 * 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();
  }
}





Drag and Drop example snippet: define a default operation (in this example, Copy)

 
/*
 * 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();
}
}





Drag and Drop example snippet: define my own data transfer type

/*
 * 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();
  }
}





Drag and Drop example snippet: drag leaf items in a tree

/*
 * 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();
  }
}





Drag and Drop example snippet: drag text between two labels

/*
 * 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);
      }
    });
  }
}





Illustrates dragging

//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();
  }
}





Simple DND (Drag and Drop) Example

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();
  }
}





SWT DnD (Drag and drop) Composite

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
      }
    });
  }
}





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.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 = "<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.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);
    }
  }
}





Word Jumbles

/*******************************************************************************
 * 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");
  }
}