给GEF拖放功能

我们知道SWT支持Native的拖放。GEF使用SWT的拖放来实现自己的拖放功能。不过不需要像SWT中需要定义DragSource和DropTarget。在GEF中,我们只需要继承AbstractTransferDragSourceListener来实现拖放源;继承AbstractTransferDropTargetListener来实现放置地。

 

这里以放置地为例!

 

首先,写一个继承类FileDropTargetListener,如下:

public class FileDropTargetListener extends AbstractTransferDropTargetListener {

	public FileDropTargetListener(EditPartViewer viewer, Transfer xfer) {
		super(viewer, xfer);
	}

	public FileDropTargetListener(EditPartViewer viewer) {
		super(viewer, FileTransfer.getInstance());
	}

	@Override
	protected void updateTargetRequest() {

	}
}

 

上面我们已经说过:GEF中的拖放是借助SWT中的拖放来实现的,而在SWT中,我们需要给出拖放所支持的Transfer的类型。所以需要注意的是,我们在构造函数中也要给出Transfer类型。

 

OK,接下来,我们首先要做的就是创建一个request。我们知道GEF中都是通过处理一个个request来完成model的修改的。我们的目的是每拖进一个文件,就在放置的位置点上创建一个Homuncule模型。

 

在FileDropTargetListener中,重写以下方法:

	@Override
	protected Request createTargetRequest() {
		CreateRequest request = new CreateRequest();
		request.setFactory(factory);
		return request;
	}

 

这里之所以需要一个CreateRequest,是因为在getCreateCommand(CreateRequest)中需要一个CreateRequest参数。

 

request中有五个set方法,不过这里我只需要setFactory(Factory)方法。这里的factory需要继承自:CreationFactory。

 

所以接下来实现我们的CreationFactory,如下:

public class HomunculeCreateFactory implements CreationFactory {

	String text;
	public Object getNewObject() {
		Homuncule homuncule = new Homuncule(ColorConstants.red,text);
		return homuncule;
	}

	public Object getObjectType() {
		return Homuncule.class;
	}

	public void setText(String text){
		this.text = text;
	}
}

 这里getNewObject()就返回一个新建的对象,我们知道通过在getCreateCommand()方法中,会调到request.getNewObject(),那个返回的对象就是这个factory中返回的对象。(不过在我的例子中其实可以不用的,因为我的对象是在command实现中自己构建的)

 

在FileDropTargetListener的createTargetRequest()方法中,用到了一个变量factory,现在我们就可以给出这个factory了,如下:

private HomunculeCreateFactory factory = new HomunculeCreateFactory();

 

 最后在我们的Editor的configureGraphicalViewer()中加上一条:

getGraphicalViewer().addDropTargetListener(
				new FileDropTargetListener(getGraphicalViewer()));

 

OK,我们已经完成了一个GEF拖放的实现。

 

补充:

 

你可以通过重写DragTarget里提供的那几个drop方法来修改你的拖放方式、拖放后的实现等等!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值