001package org.vishia.gral.swt;
002
003import org.eclipse.swt.dnd.DND;
004import org.eclipse.swt.dnd.DropTarget;
005import org.eclipse.swt.dnd.DropTargetEvent;
006import org.eclipse.swt.dnd.DropTargetListener;
007import org.eclipse.swt.dnd.FileTransfer;
008import org.eclipse.swt.dnd.TextTransfer;
009import org.eclipse.swt.dnd.Transfer;
010import org.eclipse.swt.dnd.TransferData;
011import org.eclipse.swt.widgets.Control;
012import org.vishia.gral.base.GralWidget;
013import org.vishia.gral.ifc.GralUserAction;
014import org.vishia.util.KeyCode;
015
016public class SwtDropListener implements DropTargetListener
017{
018  /**A special from org.eclipse.swt.dnd.FileTransfer. 
019   * Depending on droptype in ctor either fileTransfer or {@link #textTransfer} is set. */
020  private final FileTransfer fileTransfer;
021  
022  /**A special from org.eclipse.swt.dnd.TextTransfer. 
023   * Depending on droptype in ctor either {@link #fileTransfer} or textTransfer is set. */
024  private final TextTransfer textTransfer;
025  
026
027  SwtDropListener(int dropType, Control control){
028    DropTarget drop = new DropTarget(control, DND.DROP_COPY);
029    drop.addDropListener(this);
030    switch(dropType){
031      case KeyCode.dropFiles:{
032        textTransfer = null;
033        fileTransfer = FileTransfer.getInstance();
034        Transfer[] transfers = new Transfer[1];
035        transfers[0]= fileTransfer;
036        drop.setTransfer(transfers);
037      } break;
038      case KeyCode.dropText: {
039        fileTransfer = null;
040        textTransfer = TextTransfer.getInstance();
041        Transfer[] transfers = new Transfer[1];
042        transfers[0]= textTransfer;
043        drop.setTransfer(transfers);
044      } break;
045      default: throw new IllegalArgumentException("unknown droptype: "+ Integer.toHexString(dropType));
046    }
047
048  }
049  
050  
051  @Override
052  public void dragEnter(DropTargetEvent event)
053  {
054    TransferData data = event.currentDataType;
055    if(fileTransfer !=null && fileTransfer.isSupportedType(data)){
056      event.detail = DND.DROP_COPY;
057    } else if(textTransfer !=null && textTransfer.isSupportedType(data)){
058      event.detail = DND.DROP_COPY;
059    } else {
060      event.detail = DND.DROP_NONE;
061    }
062  }
063
064  @Override
065  public void dragLeave(DropTargetEvent event)
066  {
067    // TODO Auto-generated method stub
068    stop();
069    
070  }
071
072  @Override
073  public void dragOperationChanged(DropTargetEvent event)
074  {
075    // TODO Auto-generated method stub
076    stop();
077    
078  }
079
080  @Override
081  public void dragOver(DropTargetEvent event)
082  {
083    // TODO Auto-generated method stub
084    stop();
085    
086  }
087
088  @Override
089  public void drop(DropTargetEvent event)
090  { DropTarget drop = (DropTarget)event.getSource();
091    Control widgetSwt = drop.getControl();
092    Object oData = widgetSwt.getData();  //the associated text field, should be identical with event.getSource()
093    if(oData!=null && oData instanceof SwtTextFieldWrapper){
094      SwtTextFieldWrapper swtgral = (SwtTextFieldWrapper) oData;
095      
096      GralWidget widgg = swtgral.widgg; //getGralWidget();
097      GralUserAction action = widgg.getActionDrop();
098      if(action !=null){
099        Object gralTransferData;
100        TransferData data = event.currentDataType;
101        if(fileTransfer !=null && fileTransfer.isSupportedType(data)) { //a file is droped to a file Transfer field
102          Object oDropData = fileTransfer.nativeToJava(data);      
103          String[] files = (String[])oDropData;
104            //call the action to apply the data from drop:
105          for(int ix = 0; ix < files.length; ++ix){
106            files[ix] = files[ix].replace('\\', '/');  //at user level: use slash only, on windows too!
107          }
108          widgg.setText(files[0]);  //write the file path
109          action.userActionGui(KeyCode.dropFiles, widgg, (Object[])files);  //Note: 1 file per variable String argument
110        } 
111        else if(textTransfer !=null && textTransfer.isSupportedType(data)){
112          Object oDropData = textTransfer.nativeToJava(data);      
113          action.userActionGui(KeyCode.dropText, widgg, oDropData);  //Note: 1 file per variable String argument
114        } 
115        
116      } else throw new IllegalArgumentException("no action found for drop.");
117    } else throw new IllegalArgumentException("SwtTextFieldWrapper as getData() of swt.Control expected.");
118  }
119
120  @Override
121  public void dropAccept(DropTargetEvent event)
122  {
123    // TODO Auto-generated method stub
124    stop();
125    
126  }
127  
128  
129  
130  void stop(){}
131  
132}