邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

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


posted on 2006-09-12 17:16 Jet Geng 阅读(3494) 评论(7)  编辑  收藏 所属分类: EclipseGEF

Feedback

# re: 从SWT控件中托拽对象到GEF编辑器中 2006-12-29 15:27 过客[匿名]
如何将视图中TreeViewer的节点(每个节点都有相应的模型对应)拖入到编辑器中呢?  回复  更多评论
  

# re: 从SWT控件中托拽对象到GEF编辑器中 2006-12-29 16:31 过客[匿名]
org.eclipse.gef.examples.shapes.model.EllipticalShape,这个包在哪个jar下面,我一直没有找到,而且在plugin.xml中的"依赖项"中导入了 org.eclipse.gef.examples.shapes,但是,确没有EllipticalShape这个类.  回复  更多评论
  

# re: 从SWT控件中托拽对象到GEF编辑器中 2007-01-02 21:39 Jet Geng
org.eclipse.gef.examples.shapes.model.EllipticalShape 这个是org.eclipse.gef.examples.shapes中的模型。你在这里http://dev.eclipse.org/viewcvs/indextools.cgi/org.eclipse.gef.examples.shapes/src/org/eclipse/gef/examples/shapes/model/
可以看到这个类  回复  更多评论
  

# re: 从SWT控件中托拽对象到GEF编辑器中 2007-01-02 21:44 Jet Geng
@过客[匿名]
你可以看看
http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html 中的代码  回复  更多评论
  

# re: 从SWT控件中托拽对象到GEF编辑器中 2007-01-04 17:28 过客[匿名]
多谢,examples例子我从CVS下载过来了

对了,你写的那两个类主要实现从SWT,操作系统拖一些元素到GEF编辑器中来吧;我按你的例子copy了一份,把handleDragOver和handleDrop方法,加在TreeNodeTransferDropTargetListener类中

在 ShapesEditor 的configureGraphicalViewer()方法中加入,
viewer.addDropTargetListener(new TreeNodeTransferDropTargetListener(viewer));

可是还是不能实现元素能拖入到编辑器中啊  回复  更多评论
  

# re: 从SWT控件中托拽对象到GEF编辑器中 2007-01-22 15:46 过客[匿名]
TextTransfer类型,可以用别的类型么?如支持图片拖放  回复  更多评论
  

# re: 从SWT控件中托拽对象到GEF编辑器中[未登录] 2007-08-14 09:51 fly
在哪里下载例子源码呀  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: