Eclipse插件开发之拖拽功能

1 Eclipse拖拽概述

        操作系统支持文件拖拽等功能,我们可以将文件通过鼠标选中拖动到其他位置,实现移动或者复制等功能。Eclipse插件开发也可支持用户自定义的拖拽行为。平时我们见到的拖动eclipse的各个视图窗口,调整布局,将java文件直接拖动到本地某个目录。这些都是eclipse拖拽支持的表现。要想实现拖拽,可以对eclipse预先设定好的拖拽接口进行定制扩展,实现自己的拖拽功能。

2 实现拖拽的几个要点

        Eclipse的拖拽支持是对java SWT的拖拽功能的延伸,自己实现了一套拖拽的API ,我们如果需要实现拖拽,可以继承eclipse的拖拽相关类,部分不能满足我们自己的个性化需求,需要重写一些方法,实现特定的拖拽功能。拖拽需要明确几个要点,即将哪个对象拖拽到哪个对象,被拖拽的对象即拖拽源(DragSource),接受拖拽对象的对象即目标对象(DrogTarget),从拖拽源到目的地需要一个数据的传输载体即Tansfer,用于管理数据如何传递,限定拖拽的数据类型,并做好拖拽的数据校验,被选择拖拽的对象是否是合法的对象。同时还需要两个监听,一个是DragSourceListener,用户监听对象是否发生了拖拽事件,并处理发生改事件的逻辑,DropTargetListener用户监听是否发生了拖拽释放事件,并处理拖拽释放的逻辑。

 3 实现步骤说明

3.1 定义拖拽源dragSource

想要某个对象支持拖拽,需要为该对象添加DragSourceListener,在eclipse中一般是视图中的对象,当然,需要什么类型支持拖拽完全由你的transfer定义,被拖的对象类型与指定tansfer定义的类型一致就可以拖拽。

publicclass ComponentDragListenerimplements DragSourceListener {

publicvoiddragStart(DragSourceEvent event);

publicvoiddragSetData(DragSourceEvent event);

publicvoiddragFinished(DragSourceEvent event);

}

需要实现三个方法:

dragStart(DragSourceEventevent):鼠标进入开始拖动的行为定义,一般是拖动数据的初始化。

dragSetData(DragSourceEventevent):拖动过程的行为,一般是将被拖动对象的数据设置到事件源对象中。

dragFinished(DragSourceEventevent):拖动完成的后续处理。

3.2定义拖拽传输对象transfer

哪些对象可以被拖动需要做约束,当拖拽开始,数据如何做传递需要控制,Tansfer就是拖动源到目的地的桥梁。它与DragSourceListenerDrogTargetListner密切相关,每一个拖拽监听器接口必须要指定自己的Tansfer,定义Tansfer需要实现Transfer类,如下形式:

publicclass BrTransfer extends Transfer {

abstractpublic TransferData[] getSupportedTypes();

abstractpublicbooleanisSupportedType(TransferData transferData);

abstractprotectedint[] getTypeIds();

abstractprotected String[] getTypeNames();

abstractprotectedvoid javaToNative(Object object, TransferData transferData);

abstractprotected Object nativeToJava(TransferDatatransferData);

protectedboolean validate(Objectobject) {

     returntrue;

}

}

重点说明以下2个重要的方法,其他方法基本见名知意。主要是校验及判断拖拽对象的类型:

 javaToNative (Object object, TransferDatatransferData):拖源拽的数据进行流化处理

nativeToJava(TransferData transferData):将数据恢复到目的地并重新加载到接受拖拽的对象。

3.3定义拖拽释放目的地drogTarget

当某个对象接收到一个拖拽源,需要做出相应的处理,能够接受拖拽源的对象需要实现DropTargetListener,该接口源于java Swing 事件监听接口,如下所示:

publicclassComponentDropListener implements DropTargetListener {

publicvoid dragEnter(DropTargetEvent event);

publicvoid dragLeave(DropTargetEvent event);

publicvoid dragOperationChanged(DropTargetEvent event);

publicvoid dragOver(DropTargetEvent event);

publicvoid drop(DropTargetEvent event);

publicvoid dropAccept(DropTargetEvent event);

}

需要实现的接口方法较多,eclipse为我们提供了一些实现类DropTargetAdapter或者JdtViewerDropAdapter,JdtViewerDropAdapter又继承了DropTargetAdapter,可以通过继承该类简化一些实现方法。JdtViewerDropAdapter主要是针对视图拖拽支持的一个适配器。拖拽视图中的对象基本上继承该类,重写三个方法 performDrop validateDrop getActualTarget 即可。

3.4 拖拽行为定义

拖动事件发生,用户可能需要实现的行为是复制、粘贴、移动等,eclipse. org.eclipse.swt.dnd.DND定义了一些时间行为,

DROP_COPY     当拖进/出该control时,对象被拷贝。
DROP_MOVE     
对象被移出当前位置到被拖曳-投放到的位置。
DROP_LINK     
投放对象时生成一个原始位置上项目的链接。
DROP_NONE      
当对象被投放时,什么也不做

你可能感兴趣的:(Eclipse插件开发)