001package org.vishia.gral.swt;
002
003import org.eclipse.swt.dnd.DND;
004import org.eclipse.swt.dnd.DragSource;
005import org.eclipse.swt.dnd.DragSourceAdapter;
006import org.eclipse.swt.dnd.DragSourceEvent;
007import org.eclipse.swt.dnd.DragSourceListener;
008import org.eclipse.swt.dnd.FileTransfer;
009import org.eclipse.swt.dnd.TextTransfer;
010import org.eclipse.swt.dnd.Transfer;
011import org.eclipse.swt.dnd.TransferData;
012import org.eclipse.swt.widgets.Control;
013import org.vishia.gral.base.GetGralWidget_ifc;
014import org.vishia.gral.base.GralWidget;
015import org.vishia.gral.ifc.GralUserAction;
016import org.vishia.util.KeyCode;
017
018public class SwtDragListener extends DragSourceAdapter
019{
020  /**This instance helps to check whether a Transfer can be done. */
021  private final FileTransfer fileTransfer;
022  
023  private final TextTransfer textTransfer;
024  
025  SwtDragListener(int dragType, Control control){
026    DragSource drag = new DragSource(control, DND.DROP_COPY);
027    drag.addDragListener(this);
028    switch(dragType){
029      case KeyCode.dragFiles:{
030        fileTransfer = FileTransfer.getInstance();
031        textTransfer = TextTransfer.getInstance();
032        Transfer[] transfers = new Transfer[2];
033        transfers[0]= fileTransfer;
034        transfers[1]= textTransfer;
035        drag.setTransfer(transfers);
036      } break;
037      case KeyCode.dragText:{
038        fileTransfer = FileTransfer.getInstance();
039        textTransfer = TextTransfer.getInstance();
040        Transfer[] transfers = new Transfer[1];
041        transfers[0]= textTransfer;
042        drag.setTransfer(transfers);
043      } break;
044      default: throw new IllegalArgumentException("unknown dragtype: "+ Integer.toHexString(dragType));
045    }
046
047  }
048
049
050  @Override
051  public void dragFinished(DragSourceEvent event)
052  {
053    // TODO Auto-generated method stub
054    stop();   
055    System.out.println("drag finished\n");
056  }
057
058
059  /**This method is called if the mouse button is released over the target.
060   * The possible data types of the receiver are known therefore: The receiver may accept
061   * a text transfer if it is a text editor, or a file transfer if it is a file browser etc.
062   * The type of transfer can be tested with event.dataType.
063   * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
064   */
065  @Override public void dragSetData(DragSourceEvent event)
066  {
067    DragSource drag = (DragSource)event.getSource();
068    Control widgetSwt = drag.getControl();
069    //the associated text field, should be identical with event.getSource()
070    GralWidget widgg = GralWidget.ImplAccess.gralWidgetFromImplData(widgetSwt.getData());
071    if(widgg!=null){
072      GralUserAction action = widgg.getActionDrag();
073      if(action !=null){
074        //call the action to get the data from drag
075        //ret is a array which references the necessary String[] for answer.
076        String[][] ret = new String[1][];
077        boolean bOk = action.userActionGui(KeyCode.dragFiles, widgg, (Object)ret);  //Note: 1 file per variable String argument
078        if(bOk && ret[0] !=null){
079          String[] data = ret[0];
080          TransferData transferData = event.dataType;
081          if(textTransfer.isSupportedType(transferData)){
082            //the call of fileTransfer.javaToNative(data, transferData) will be done       
083            event.data = data[0]; //transferData;
084            event.doit = true;
085          } else if(fileTransfer.isSupportedType(transferData)){
086            //the call of fileTransfer.javaToNative(data, transferData) will be done       
087            data[0] = data[0].replace('/', '\\');
088            event.data = data; //transferData;
089            event.doit = true;
090          } else {
091            //the destination does not support a file transfer.
092            event.doit = false;
093          }
094        } else {
095          //action will be prevent drag, no data:
096          event.doit = false;
097        }
098      } else throw new IllegalArgumentException("no action found for drop.");
099    } else throw new IllegalArgumentException("GralWidget as getData() of swt.Control expected.");
100    
101  }
102
103
104  @Override
105  public void dragStart(DragSourceEvent event)
106  {
107    // TODO Auto-generated method stub
108    stop();
109    event.doit = true;
110  }
111  
112  void stop(){}
113  
114}