天天看点

swt组件到GEF编辑器的拖动支持

       最近在项目中,需要完成从资源管理器(navigator)向GEF编辑器中拖放结点的功能。

现总结个人体会如下(具体的实现流程,请参考http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html):

1.       GEF封装了底层的SWT拖放。无需自己定义DragSource和DropTarget。

2.       GEF的拖拽功能需要

(1).一个可以注册在GEF 中上的监听器,该监听器需实现TransferDropTargetListener接口,一般来讲,直接继承AbstractTransferDropTargetListener类会更好些。

public class FileTransferDropTargetListener

extends AbstractTransferDropTargetListener {

//初始化命令所需要的工厂,第二步创建

private FileLabelFactory factory = new FileLabelFactory();

public FileTransferDropTargetListener(EditPartViewer viewer, Transfer xfer) {

super(viewer, xfer);

}

//红色字体应特别注意,这是拖放是否被接受的关键,他是拖放数据的注册类型。

//应根据需求选择自己的类型,默认为处理文本拖放的TextTransfer

public FileTransferDropTargetListener(EditPartViewer viewer) {

super(viewer,FileTransfer.getInstance());

}

/*

*返回GEF中创建模型所需要的request,对request的设置采用工厂模式

*/

protected Request createTargetRequest() {

CreateRequest request = new CreateRequest();

request.setFactory(factory);

return request;

}

protected void updateTargetRequest() {}

}

(2).一个生成拖放数据的工厂类,该类需实现CreationFactory 接口。      

public class FileLabelFactory implements CreationFactory {

private String text = "";

/*该方法返回拖拽所产生的数据,应根据项目需求进行更改。一个可行的改良建

*议是在该工程类中创建template字段,并在构造函数中初始化,该方法根据

*template返回新的类型

*/

public Object getNewObject() {

LogicLabel label = new LogicLabel();

label.setLabelContents(text);

return label;

}

/*该方法返回拖拽所产生数据的类型

*GEF中,将该数据的类型,设置到request中。从而帮助在对应的Editpart中完成*操作

*/

public Object getObjectType() {

return LogicLabel.class;

}

public void setText(String s) {

text = s;

}

(3).在GEF编辑器中,为GraphicalViewer注册该监听器,一般在initializeGraphicalViewer()方法中添加      
getGraphicalViewer().addDropTargetListener(	new FileTransferDropTargetListener(getGraphicalViewer()));      

3.       DND拖放参数

一般在监听器中的处理拖动方法中,对拖动的操作类型进行设置。如:

protected void handleDragOver() {

   getCurrentEvent().detail = DND.DROP_COPY;

   super.handleDragOver();

}

Description      
DND.DROP_COPY      
拖放创建一个新的copy      
DND.DROP_LINK      
拖放创建一个链接      
DND.DROP_MOVE      
拖放创建一个移动      

4.       Transfer

Transfer是拖放的关键。不同类型的拖放数据,应在监听器的初始化时,选择合适的。

swt组件到GEF编辑器的拖动支持

其中,TextTransfer默认处理文本拖动,FileTransfer默认处理文件拖动,在我的项目中,我采用的是LocalSelectionTransfer。