视图是可以浏览信息层次结构或显示对象属性的工作台部件。 在一个工作台页面中,只能打开任何给定视图的一个实例。 当用户在视图中进行选择或其它更改,这些更改会立即显示在工作台中。 提供视图通常是为了支持相应的编辑器。 例如,大纲视图显示编辑器中的信息的结构化视图。属性视图显示当前编辑的对象的属性。
扩展点 org.eclipse.ui.views 允许插件将视图添加到工作台中。添加视图的插件必须在它们的 plugin.xml 文件中注册该视图,并提供有关该视图的配置信息,例如,它的实现类、它所属的视图的类别(或组)以及应该用来在菜单和标号中描述该视图的名称和图标。
视图的接口是在 IViewPart 中定义的, 但是插件可以选择扩展 ViewPart 类而不是根据暂存区来实现 IViewPart。
我们已在 hello world 示例中实现了最小视图扩展。现在,我们将考察一个扩展, 它知道其它工作台视图,并响应工作台中的用户浏览和选择更改。首先,让我们考察 plugin.xml 中的扩展声明。
<extension point="org.eclipse.ui.views"> <category id="org.eclipse.ui.examples.readmetool" name="%Views.category"> </category> <view id="org.eclipse.ui.examples.readmetool.views.SectionsView" name="%Views.ReadmeSections" icon="icons/view16/sections.gif" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
这应该看起来相当熟悉。我们看到,向工作台添加了一个新视图 ReadmeSectionsView。视图标识、名称和类别是按我们以前已经看到的那样指定的。还为视图提供了图标,使用相对于插件的安装目录的路径。
让我们看一下 ReadmeSectionsView。可以通过选择窗口 -> 显示视图 -> 其它...,然后从显示视图列表中选择任何视图,以在工作台中显示该视图。
显示 ReadmeSectionsView 时,就会弹出一个具有列表的视图。在单击扩展名为 .readme 的文件之前,该列表是空的,在此情况下,将使用自述文件中的各个部分来填充该列表。
插件如何识别自述文件,插件又如何知道选择更改?如果我们可以知道这些问题的答案, 就能够更好地理解如何构建集成工作台插件。
我们将从熟悉的 createPartControl 方法开始。正如我们在 Hello World 示例中看到的那样,创建用来表示视图的小窗口就是在此处。开始时我们将忽略一些代码。
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... // add myself as a global selection listener getSite().getPage().addSelectionListener(this); // prime the selection selectionChanged(null, getSite().getPage().getSelection()); }
该视图创建和存储 ListViewer,并在它的页面上将它自己注册为选择监听器。它获取来自 IViewSite 的页面, 该页面包含有关视图的上下文的信息,例如,它的工作台窗口,它的包含页面和插件。当通知我们发生了选择更改时,将发生什么事情?将执行下列代码:
public void selectionChanged(IWorkbenchPart part, ISelection sel) { //if the selection is a readme file, get its sections. AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
它与 ReadmeModelFactory 类一样,都是负责将选择转换成自述文件部分, 并且这些选择是在 createPartControl 方法中创建的查看器的输入。
但是查看器如何填充它的列表小窗口?现在,假定一旦告诉查看器它的输入元素, 它就知道如何使用信息来填充列表小窗口 — 它毕竟是一个 ListViewer。 如果现在必须知道查看器的所有信息, 则转至查看器。
我们仍旧不知道如何检测到自述文件或文件的部分信息来源于何处。 快速查看一下 ReadmeModelFactory 将会有一些启示。
public AdaptableList getSections(ISelection sel) { // If sel is not a structured selection just return. if (!(sel instanceof IStructuredSelection)) return null; IStructuredSelection structured = (IStructuredSelection)sel; //if the selection is a readme file, get its sections. Object object = structured.getFirstElement(); if (object instanceof IFile) { IFile file = (IFile) object; String extension = file.getFileExtension(); if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) { return getSections(file); } } //the selected object is not a readme file return null; }
我们检查选择以便了解它是否是结构化(多个)选择。(结构化选择的概念来源于 JFace 查看器。)对于选择中的第一个对象,我们检查它以便了解它是否是文件(IFile)资源。如果它是文件资源,则检查它的扩展名,以便了解它是否与“.readme”扩展名相匹配。一旦知道我们具有自述文件,就可以使用其它方法来分析各部分。可以浏览 ReadmeModelFactory、MarkElement 和 DefaultSectionsParser 的其余部分以便获取有关文件分析的详细信息。
通过学习此扩展,我们已经了解了许多常见的工作台概念。现在,我们将继续了解一些其它工作台扩展,并检查插件可以如何向工作台用户界面进一步地添加内容。