從SWT控件中托拽對象到GEF編輯器中
一般情況下GEF程序都是采用如下的界面:
新建對象的操作時通過拖拽Palette中元素到編輯而獲得。但是有時候可能需要從SWT,操作系統(tǒng)拖一些元素到GEF編輯器中來。
下面我就把創(chuàng)建這樣的拖拽過程大概的描述一下:
1、定義拖拽源(DragSource)。
2、定義拖拽目標(biāo)的監(jiān)聽(DropTarget)。
到這里對于一般的拖拽其實是可以完工了。
這個部分可以參考weidagang2046的專欄的《DND入門學(xué)習(xí)》
但是要能讓GraphicalViewer這個對象扮演起DropTarget我們還需要做點其他的工作。GraphicalViewer這個類本身提供了一個addDropTargetListener方法。看到這個方法是不是一陣狂喜啊。如果有也是應(yīng)該的,因為這個方法就是我們解決前面提出問題的關(guān)鍵。
好了看看他的聲明吧!
public void addDropTargetListener(TransferDropTargetListener?listener)
他這個參數(shù)居然不是
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.
偷下懶,就不翻譯了。
創(chuàng)建如下類來實現(xiàn)這個接口:
public
class
TreeNodeTransferDropTargetListener extends
AbstractTransferDropTargetListener
{
public
TreeNodeTransferDropTargetListener(EditPartViewer editPartViewer) {
//
改類默認(rèn)是處理
TextTransfer
類型的拖拽事件
super
(editPartViewer,TextTransfer.getInstance());
//
TODO
Auto-generated constructor stub
}
@Override
protected
void
updateTargetRequest() {
}
}
我們這個拖拽想是讓他執(zhí)行一個
create
命令。所以下面就是要重載他的
createTargetRequest()
用來處理
create
對象的請求(
CreateRequestion
)。
CreateRequetion
需要使用到一個類,幫助我們創(chuàng)建對象的工廠類。
GEF
給了我們這樣的一個接口
CreationFactory
。下面我們?nèi)崿F(xiàn)他就好了。
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
是返回要創(chuàng)建類的一個對象實例。
GetObjectType
需要返回需要創(chuàng)建對象的類。這個可不要搞反了。
這樣我們就可以把我們的
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://m.tkk7.com/weidagang2046/archive/2006/09/05/67707.html
http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html