从SWT控件中托拽对象到GEF编辑器中
一般情况下GEF程序都是采用如下的界面:
新建对象的操作时通过拖拽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