从SWT控件中托拽对象到GEF编辑器中

从SWT控件中托拽对象到GEF编辑器中

从SWT控件中托拽对象到GEF编辑器中

一般情况下GEF程序都是采用如下的界面:


gef.jpg

新建对象的操作时通过拖拽Palette中元素到编辑而获得。但是有时候可能需要从SWT,操作系统拖一些元素到GEF编辑器中来。

下面我就把创建这样的拖拽过程大概的描述一下:

1、定义拖拽源(DragSource)。

2、定义拖拽目标的监听(DropTarget)。

到这里对于一般的拖拽其实是可以完工了。

这个部分可以参考weidagang2046的专栏的《DND入门学习》

但是要能让GraphicalViewer这个对象扮演起DropTarget我们还需要做点其他的工作。GraphicalViewer这个类本身提供了一个addDropTargetListener方法。看到这个方法是不是一阵狂喜啊。如果有也是应该的,因为这个方法就是我们解决前面提出问题的关键。

好了看看他的声明吧!

				
						 public void addDropTargetListener(TransferDropTargetListener listener) 
				
		

他这个参数居然不是 DropTargetListener 。这个 TransferDropTargetListener 是一个什么玩意啊!

在 help 中查到:

public interface TransferDropTargetListener
extends TransferDropTargetListener

A DropTragetListener that handles one type of SWT Transfer. The purpose of a TransferDropTargetListener is to:

  • Determine enablement for a Drop operation. Enablement is often a function drop location, and/or criteria.

  • When enabled, optionally showing feedback on the DropTarget.

  • Performing the actualy Drop

DelegatingDropAdapter allows these functions to be implemented separately for unrelated types of Drags. DelegatingDropAdapter then combines the function of each TransferDropTargetListener, while allowing them to be implemented as if they were the only DragSourceListener.

偷下懒,就不翻译了。

创建如下类来实现这个接口:

public class TreeNodeTransferDropTargetListener extends

AbstractTransferDropTargetListener {


public TreeNodeTransferDropTargetListener(EditPartViewer editPartViewer) {

// 改类默认是处理 TextTransfer 类型的拖拽事件

super (editPartViewer,TextTransfer.getInstance());

// TODO Auto-generated constructor stub

}


@Override

protected void updateTargetRequest() {

}


}

我们这个拖拽想是让他执行一个 create 命令。所以下面就是要重载他的 createTargetRequest() 用来处理 create 对象的请求( CreateRequestion )。 CreateRequetion 需要使用到一个类,帮助我们创建对象的工厂类。 GEF 给了我们这样的一个接口 CreationFactory 。下面我们取实现他就好了。


package org.eclipse.gef.examples.shapes.rcp.views;


import org.eclipse.gef.examples.shapes.model.EllipticalShape;

import org.eclipse.gef.requests.CreationFactory;


public class TypeCreationFactory implements CreationFactory {


public Object getNewObject() {

// TODO Auto-generated method stub

EllipticalShape label = new EllipticalShape();

return label;

}


public Object getObjectType() {

return EllipticalShape. class ;

}


}


注意:这里的 getNewObject 是返回要创建类的一个对象实例。 GetObjectType 需要返回需要创建对象的类。这个可不要搞反了。

这样我们就可以把我们的 TreeNodeTransferDropTargetListener 类中的 createTargetRequest 方法加上了。


private TypeCreationFactory factory = new TypeCreationFactory();

protected Request createTargetRequest() {

CreateRequest request = new CreateRequest();

request.setFactory( factory );

return request;

}


好了这个时候不要客气了,加上

protected void handleDragOver() {

getCurrentEvent(). detail = DND. DROP_MOVE |DND. DROP_COPY ;

super .handleDragOver();

}


@Override

protected void handleDrop() {

//String s = (String)getCurrentEvent().data;

//factory.setText(s);

super .handleDrop();

}

这样的方法吧。

这样这个功能就完成了。


参考文献:

http://www.blogjava.net/weidagang2046/archive/2006/09/05/67707.html

http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html


你可能感兴趣的:(从SWT控件中托拽对象到GEF编辑器中)