capint
11/8/2015 - 9:44 AM

Eclipse >> SWT >> Drag and drop

Eclipse >> SWT >> Drag and drop

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

Source: http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html