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="%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”扩展名相匹配。一旦知道我们具有自述文件,就可以使用其它方法来分析各部分。可以浏览 ReadmeModelFactoryMarkElementDefaultSectionsParser 的其余部分以便获取有关文件分析的详细信息。

通过学习此扩展,我们已经了解了许多常见的工作台概念。现在,我们将继续了解一些其它工作台扩展,并检查插件可以如何向工作台用户界面进一步地添加内容。

Copyright IBM Corporation and others 2000, 2003.