if(event.detail==DND.DROP_DEFAULT){
//给event.detail赋的值必须是event.operations中的一个,event.operations中
//的操作都是DragSource所支持的.
if((event.operations&DND.DROP_COPY)!=0){
event.detail=DND.DROP_COPY;
}else{
event.detail=DND.DROP_NONE;
}
}
//drop target可以选择性的按照传输类型来处理.dragEnter event有两个属性
//event.currentType 是应用设置的默认类型,以TransferData对象形式表现,
//event.dataTypes 是drag source支持的所有类型的列表,以TransferData数组形式表现,
//我们可以将event.currentType设置成event.dataTypes中的任意一个。
//这些属性也可以在dragOver, dragOperationChanged以及dropAccept事件中设置。
for(int i=0;i<event.dataTypes.length;i++){
if(textTransfer.isSupportedType(event.dataTypes[i])){
event.currentDataType=event.dataTypes[i];
//只允许COPY
if(event.detail!=DND.DROP_COPY){
event.detail=DND.DROP_NONE;
}
break;
}
}
}
//dragOver event在光标进入drop target widget时会被重复不停的调用.
//如果光标是静止的,dragOver event依然会有规则的按一定时间间隔被调用.
//这个方法一般在drop target是table或tree时用得比较多,可以根据不同的item而改变操作.
public void dragOver(DropTargetEvent event){
//event.feedback设置当widget处于光标下时应该给用户一个什么样的feedback.
//dragOver event.feedback 值描述
//DND.FEEDBACK_SELECT 使光标下的item被选中,限于table and trees.
//DND.FEEDBACK_SCROLL 使widget可以滚动以便于用户可以drop在当前看不见的item上,限于table and trees.
//DND.FEEDBACK_EXPAND 使当前光标下的item展开以便于用户在sub item上drop,限于trees.
//DND.FEEDBACK_INSERT_BEFORE 在item处于光标下之前显示一个插入标记,限于tables and trees.
//DND.FEEDBACK_INSERT_AFTER 在item处于光标下之后显示一个插入标记,限于tables and trees.
//DND.FEEDBACK_NONE 没有任何效果.
event.feedback=DND.FEEDBACK_SELECT|DND.FEEDBACK_SCROLL;
if(textTransfer.isSupportedType(event.currentDataType)){
String t=(String)(textTransfer.nativeToJava(event.currentDataType));
if(t!=null){
System.out.println(t);
}
}
}
//当用户按下或放开辅助按键时,例如Ctrl, Shift, Command, Option。则dragOperationChanged事件发生。
//辅助按键可以改变即将进行的操作。例如:
//Ctrl key is down, a copy is requested,
//Ctrl and Shift keys are both down, a link is requested
//Shift key is down, a move is requested
//When no modifier keys are pressed, the default operation is requested.
public void dragOperationChanged(DropTargetEvent event){
if(event.detail==DND.DROP_DEFAULT){
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;
}
}
}
//当光标离开drop target widget时,dragLeave事件发生. 如果你在dragEnter中分配了一些资源,
//就应该在dragLeave中释放.dragLeave事件在用户通过Escape键取消Drag and Drop操作时也会发生
//刚好在drop操作被执行之前.
public void dragLeave(DropTargetEvent event){
}
//dropAccept事件为应用提供了最后一次定义数据类型的机会,定义的数据类型将被返回到drop事件.
//这些是通过向event.currentDataType赋event.dataTypes中的值来实现的.
public void dropAccept(DropTargetEvent event){
}
//如果在之前的事件中得到了有效的操作和currentDataType,那么当用户在drop target上松开鼠标时,drop事件会发生。
//event.data属性包含了请求到的数据,event.type包含了Transfer的类型.
//data是event.currentDataType中定义的类型.
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]);
}
}
}
}
public void fillTable(){
dropTable.setHeaderVisible(true);
dropTable.setLinesVisible(true);
TableColumn partName =new TableColumn(dropTable,SWT.LEFT);
partName.setResizable(true);
partName.setText("NAME");
partName.setWidth(250);
TableColumn employeeName=new TableColumn(dropTable,SWT.LEFT);
employeeName.setResizable(true);
employeeName.setText("SIZE");
employeeName.setWidth(120);
for(int i=0;i<10;i++){
TableItem item=new TableItem(dropTable,SWT.NONE);
item.setText(new String[]{"tableitem"+i,100+i+""});
}
}
public void setFocus(){
}
}