从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