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.png"
	   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”扩展相匹配。一旦知道具有自述文件,就可以使用其它方法来对各个部分进行解析。可浏览 ReadmeModelFactoryMarkElement DefaultSectionsParser 的余下部分以获取有关文件解析的详细信息。

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