快捷搜索:

拖放 Eclipse Workbench 标签

在本文中,我们将进修一种经由过程编程定制 Eclipse 中的编辑器和视图标签的拖放行径的技巧。我们应用了一个示例来展示这种技巧,该示例将编辑器与转移类型 org.eclipse.ui.part.EditorInputTransfer 进行关联。可以经由过程实现对这种转移类型的支持来支持编辑器的拖放行径。我们还为视图标签供给了一个类似的展示。本文假设您认识 SWT 的拖放技巧。

定制意味着什么?

Eclipse Workbench 中的编辑器和视图标签可以支持默认拖放行径,默认拖放行径支持:

视图在 Workbench 内部的移动和停靠 在有标签的记事本内部从新安排视图或编辑器的顺序 创建快速视图 为了并排查看源代码,在编辑器区域并排显示几个编辑器

只管这是一个异常令人振奋的功能列表,但在我去年从事的一个项目中,仍旧必要更多的功能。用户必要能够对编辑器和视图标签进行拖放,将它们放到一个特殊的视图上。当用户这样做时,我们要做的是截获所拖放编辑器的 editor-id 和 input,以及所拖放视图的 view-id,然后在一个特殊的视图中显示相同的内容。下面的 图 1 和 图 2 将展示这种功能。

图 1 给出了一个标题为 .project 的编辑器,该编辑器被拖放到一个标题为 Drop Window 的特殊视图中。一旦拖放到如 图 2 所示的位置处,这个特殊的视图就会显示所拖放编辑器的 editor-id 和 input。

图 1. 正被拖放到特殊视图中的编辑器标签

图 2. 被拖放到特殊视图上的编辑器标签

与我们在这个项目中的要求类似,还可能存在其他一些必要对编辑器或视图标签的默认拖放行径进行定制的环境。例如,有人可能会盼望容许 Eclipse 用户将编辑器标签从事情台窗口中拖出,将它放到相同 Eclipse 实例的别的一个窗口中。本文中先容的技巧也可以在这种环境下应用。

下面让我们来进修定制拖放行径所涉及的步骤,详细地说,这些步骤是针对编辑器标签的,但它们同样适用于视图标签。

定制编辑器标签的拖放行径

当 Eclipse 用户拖动一个编辑器标签时,要实现如 图 1 和 图 2 所示的定制拖放功能,并内部履行以下两个主要义务或操作:

操作 1 捕获底层编辑器的 IEditorInput 和 editor-id,前者包孕有关正在编辑的文件的信息;后者包孕有关编辑正在应用的编辑器的类型信息。  操作 2 将 editor-input 和 editor-id 放到 EditorInputTransfer.EditorInputData 工具中,并将其设置为拖放历程中正在转移的工具。这种操作可以让 SWT 认真实现另外的拖放操作,例如将编辑器标签放到应用 EditorInputTransfer 作为转移类型的控件上。

因为编辑器标签平日放在 CTabFolder 容器中,是以我们必要为寄放编辑器的 CTabFolder 容器创建一个 DragSource,并在这个 DragSource 的 dragSetData() 措施中履行 操作 1 和 操作 2。假设我们可以捕获寄放编辑器的 CTabFolder 容器,那么创建所需拖放源的义务就异常简单,如下所示:

清单 1. 为 Tab folder 创建拖放源

CTabFolder tabFolder = ;

int operations = DND.DROP_COPY | DND.DROP_DEFAULT;

DragSource dragSource = new DragSource(tabFolder, operations);

Transfer[] transferTypes = new Transfer[] {EditorInputTransfer.getInstance()};

dragSource.setTransfer(transferTypes);

dragSource.addDragListener(new DragSourceListener()

{

public void dragStart(DragSourceEvent dsEvent) { }

public void dragSetData(DragSourceEvent dsEvent)

{

//code to perform operation-1 and operation-2

}

public void dragFinished(DragSourceEvent dsEvent) { }

});

此处别的一个异常紧张的假设是:CTabFolder 容器并没有已经创建好的拖放源。否则,代码 DragSource dragSource = new DragSource(tabFolder, operations); 就会触发一个 SWTError 差错,这是由于我们不能为同一个控件创建多个拖放源。

一种创建拖放源的新措施

下面让我们为 Display 添加一个拖放检测 监听 器(用来 监听 SWT.DragDetect 类型的事故),如下所示:

清单 2. 为 Display 添加拖放 监听 器

PlatformUI.getWorkbench().getDisplay().addFilter(SWT.DragDetect, new Listener()

{

public void handleEvent(Event event)

{

}

});

不论何时发生拖放操作时,都邑调用这个 监听 器的 handleEvent() 措施,此中 event.widget 指向孕育发生这个事故的控件。在拖动编辑器标签时,event.widget 指向寄放这个拖放编辑器标签的 CTabFolder 容器。这样我们现在就可以为这个 CTabFolder 容器创建一个拖放源,如下所示:

清单 3. 捕获寄放编辑器的 Tab 文件夹

PlatformUI.getWorkbench().getDisplay().addFilter(SWT.DragDetect, new Listener()

{

public void handleEvent(Event event)

{

//ignore drag of widgets other than tab-folders (which host editor and view tabs)

if(!(event.widget instanceof CTabFolder))

return;

CTabFolder draggedFolder = (CTabFolder)event.widget;

int operations = DND.DROP_COPY | DND.DROP_DEFAULT;

final DragSource dragSource = new DragSource(draggedFolder, operations);

Transfer[] transferTypes = new Transfer[] {EditorInputTransfer.getInstance()};

dragSource.setTransfer(transferTypes);

dragSource.addDragListener(new DragSourceListener()

{

public void dragStart(DragSourceEvent dsEvent) { }

public void dragSetData(DragSourceEvent dsEvent)

{

//code to perform operation-1 and operation-2

}

public void dragFinished(DragSourceEvent dsEvent)

{

dragSource.dispose();

}

});

}

});

现在我们主要关心的是在开始拖放操作之后创建了一个新的拖放源。在开始拖放操作之后创建一个拖放源,这样做是否能够确保这个新的拖放源可以接管现在发生的拖放操作的看护?

下图以图形要领显示了这些操作:

图 3. 拖放编辑器标签的序列图

留意,在 dragFinished() 措施中(拜见上面的 清单 3),我们对在 CTabFolder 容器上创建的 drag-source 进行了处置惩罚。实际上这是由于为每次拖放操作都创建了一个 drag-source,我们并没有对原本的 drag-source 进行处置惩罚,这会使问题变得加倍繁杂。对 drag-source 的处置惩罚还从 CTabFolder 的事故 监听 器表中删除了 drag-listener-x(它是在创建 drag-source 时添加的),如上面的 图 3 所示。

若何捕获所拖放编辑器的 IEditorInput 和 Editor ID?

下面让我们来看一下如何在 dragSetData() 措施中实现 操作 1 和 操作 2。

因为编辑器与包孕它的 CTabFolder 之间的映射并没有公开,是以可以寄托 IWorkbenchPage.getActivePart() 来得到正在拖放的事情台部分,从中可以很轻易地提掏出所需的信息,如下面的代码所示:

清单 4. 捕获所拖放编辑器的 editor-input 和 editor-id

public void dragSetData(DragSourceEvent dsEvent)

{

IWorkbenchWindow workbenchWindow =

PlatformUI.getWorkbench().getActiveWorkbenchWindow();

IWorkbenchPart workbenchPartBeingDragged =

workbenchWindow.getActivePage().getActivePart();

if(workbenchPartBeingDragged instanceof IEditorPart)

{

String editorId = workbenchPartBeingDragged.getSite().getId();

IEditorInput editorInput =

((IEditorPart)workbenchPartBeingDragged).getEditorInput();

EditorInputTransfer.EditorInputData data =

EditorInputTransfer.createEditorInputData(editorId, editorInput);

dsEvent.data = new EditorInputTransfer.EditorInputData[] { data };

}

}

限定 tab 文件夹的默认拖放 监听 器的行径

您可能还会对下面的文章感兴趣: