7.1 概述
顾名思义,Drag and Drop Support指的就是节点的拖放操作。在CNF中提供了标准的拖拽操作支持,与其他功能不同,这个功能是由两个扩展点共同实现的。
7.2 扩展点
7.2.1 Drag
扩展点org.eclipse.ui.navigator.viewer/dragAssistant,这个扩展点提供“拖”操作的支持,位于org.eclipse.ui.navigator.viewer扩展点下。
这两个属性很简单,分别为指定的实现类和对应的视图的ID。类必须继承自org.eclipse.ui.navigator.CommonDragAdapterAssistant,主要方法为:
- getSupportedTransferTypes():指定支持的操作资源类型
- setDragData(DragSourceEvent anEvent, IStructuredSelection aSelection),根据选择的节点设置拖的内容
7.2.2 Drop
扩展点org.eclipse.ui.navigator.navigatorContent/navigatorContent/dropAssistant,这个扩展点只能在navigatorContent里面声明,大概是因为Drop操作不能在不同的navigatorContent之间共享的缘故。
与Drag类似,需要指定实现的类和ID,类必须继承自org.eclipse.ui.navigator.CommonDropAdapterAssistant,主要方法为:
- validateDrop(Object target, int operation, TransferData transferType):校验“放”的状态
- handleDrop(CommonDropAdapter aDropAdapter,
DropTargetEvent aDropTargetEvent, Object aTarget):处理放的操作。
7.3 Eclipse实现
Eclipse中的Explorer Viewer实现了拖放操作的支持,对应的实现代码位于插件“org.eclipse.ui.navigator.resources”中。
Drag的实现代码类为org.eclipse.ui.navigator.resources.ResourceDragAdapterAssistant ,Drop的实现代码为org.eclipse.ui.navigator.resources.ResourceDropAdapterAssistant 。
简单的提一下,它们是通过IResource进行交互的,每次将Drag时候选中的节点(ISelection),封装为TransferData,然后交由Drop的类处理。对于实现细节,就不再进行一一描述了,自己去看看代码。
7.4 说明
Drag是在org.eclipse.ui.navigator.viewer中声明的,而且还需要一个Viewer的ID,而Drop在org.eclipse.ui.navigator.navigatorContent/navigatorContent中声明,这说明,一个提供了Drag支持的Viewer,允许有多个不同的Drop实现的navigatorContent。