org.eclipse.ui.views

视图是工作台部件,它可以浏览信息的层次结构或者显示对象的特性。提供视图通常是为了支持相应的编辑器。例如,轮廓视图显示编辑器中的信息的结构化视图。特性视图显示当前所编辑的对象的特性。

当用户在视图中进行选择或者执行更改时,更改会立即在用户界面的其他相关部件中反映出来。在工作台页面中,只能打开任何给定视图的一个实例。

扩展点 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="&amp;Readme">
    </category>
    <view
        id="org.eclipse.ui.examples.readmetool.views.SectionsView"
        name="Readme Sections"
        icon="icons/basic/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);
    ...
    // 添加自己作为全局选择侦听器
    getSite().getPage().addSelectionListener(this);

    // 加上选择
    selectionChanged(null, getSite().getPage().getSelection());
}

该视图创建和存储 ListViewer,并在它的页面上将它自己注册为选择侦听器。它包含来自于 IViewSite 的页面, 该页面包含有关视图的上下文的信息,例如,它的工作台窗口,包含页面和插件。当通知我们发生了选择更改时,将发生什么事情?将执行下列代码:

public void selectionChanged(IWorkbenchPart part, ISelection sel) {
    //如果选择是自述文件,则获取它的各个部分。
    AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
    viewer.setInput(input);
}

它与 ReadmeModelFactory 类一样都涉及到将选择转换成自述文件部分, 它被理解为我们在 createPartControl 方法中创建的查看器的输入。

我们知道,视图将它感兴趣的内容注册到选择更改中。选择以某种方式转换成查看器的相应输入。而查看器执行一些步骤来填充列表小窗口。

如果必须立即知道此查看器是什么,则转至查看器。现在我们只能说,一旦告诉查看器它的输入元素, 它就知道如何利用信息来填充列表小窗口。(它毕竟是一个 ListViewer)。但是,我们如何知道我们何时具有自述文件,以及查看器的部分信息来自何处?快速查看 ReadmeModelFactory 就可以搞清楚。

public AdaptableList getSections(ISelection sel) {
    // 如果 sel 不是结构化选择,就立即返回。
    if (!(sel instanceof IStructuredSelection))
        return null;
    IStructuredSelection structured = (IStructuredSelection)sel;

    //如果选择是自述文件,则获取它的各个部分。
    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);
        }
    }

    //选择的对象不是自述文件
    return null;
}

我们检查选择以便了解它是否是结构化(多个)选择。(结构化选择的概念来源于 JFace 查看器。)对于选择中的第一个对象,我们检查它以便了解它是否是文件(IFile)资源。如果它是文件资源,则检查它的扩展名,以便了解它是否与“.readme”扩展名相匹配。一旦知道我们具有自述文件,就可以使用其他方法来分析各部分。 可以浏览 ReadmeModelFactoryMarkElementDefaultSectionsParser 的其余部分以便获取有关文件分析的详细信息。

通过学习此扩展,我们已经了解了许多常见的工作台概念。现在,我们将继续了解一些其他工作台扩展,并了解插件可以如何为工作台 UI 添加进一步的内容。