插件开发—— 透过插件扩展工作台

插件开发—— 通过插件扩展工作台

        现在,你应该对工作台的操作和怎样使用视图和编辑器展示信息非常熟悉了,如果不熟悉的话,阅读下面关于工作台的快速指南。在此之后的各个章节将会从API 的角度关注工作台用户界面,展示插件如何向平台UI 添加新的功能。

 

1. 工作台快速指南

        工作台是导航插件提供的各种功能的场所,通过工作台,我们可以导航资源,并且可以查看和便捷这些资源的内容和属性。当打开工作台展示一组项目时,效果如下图所示:

插件开发—— 透过插件扩展工作台

 

工作台就是一个呈现各种可视化部件的窗口,这些部件可以分为两个主要分类:视图和编辑器:

 

  • 编辑器(Editor) 让用户可以在工作台进行编辑,编辑器是以文档为中心的,就像一个文件系统编辑器一样。类似于文件系统编辑器,它们遵循 打开-保存-关闭 的生命周期。和系统编辑器不一样的是,这些编辑器和工作台联系紧密。
  • 视图(View) 展示用户在工作台中使用到的一些对象的信息。当用户选择工作台中不同对象时,视图会改变显示的内容。视图通常通为活动编辑器中的内容提供相关信息来支持编辑器。
视图
工作台提供了一些标准的视图,帮助用户导航或者查看所需要的内容,例如,项目浏览器可以帮助用户导航工作区和选择资源。
插件开发—— 透过插件扩展工作台
 
编辑器
编辑器帮助用户打开、编辑和保存对象,工作台为文本资源提供了一个标准编辑器:
插件开发—— 透过插件扩展工作台
更多的插件,例如Java 代码编辑器或者HTML编辑器,可以由插件提供。 

2. 工作台背后的工作机制
        工作台为创建复杂用户界面提供了很多类和接口,但是并不需要理解所有的这些类和接口就能实现一些简单的功能,我们先看一下工作台用户界面中的一些概念和隐藏在背后的对应结构。
插件开发—— 透过插件扩展工作台
        在后面的讨论中,当使用“工作台”这个术语时,是指工作台窗口(IWorkbenchWindow)。工作台窗口是一个工作台中的*窗口,是包含菜单栏、工具栏、状态栏、快捷栏和页面的窗口。通常不需要对工作台窗口对象编程,仅需要知道工作台个概念就可以了。

注:可以打开多个工作台窗口,但是,每个工作台窗口都是一个自包含的由编辑器和视图组成的整体,所以我们只能同时注于一个单一的工作台窗口。

从用户的角度来看,工作台包含一些视图和编辑器,还有其他一些类用于实现工作台窗口。

页面(Pages)
         在工作台窗口中可以看到一个包含几个部分的页面(IWorkbenchPage),页面是分组所包含的不同部分的一种实现机制。通常不需要对页面编程,但是将会在编程和调试上下文环境中看到它。

透视图(Perspectives)
        透视图自工作台页面中提供了一个附加层,透视图定义了一个视图的集合、视图的布局和适用于给定用户任务的动作(action)。用户完成多个任务时可以在不同透视图之间进行切换。从视图的实现角度看,用户的活动透视图控制那些视图显示到工作台页面上以及它们的位置和大小,编辑器不受透视图变化的影响。

视图和编辑器(Views and Editors)
        视图和编辑器涉及到插件编程的具体细节,在向工作台添加一个可视化组件是,必须决定是否需要实现一个视图或者编辑器,如何确定呢?
  • 视图通常用来导航层级数据,打开一个编辑器,或者显示活动编辑器的属性信息,例如,项目导航器视图用来导航工作区的层级,属性和大纲视图显示活动编辑器中的一个对象的信息,视图中作出测任何修改(例如修改一个属性值)都会被立即保存。
  • 编辑器通常用来编辑或者浏览一个文档或者输入对象,在编辑器中做出的修改遵循 打开-保存-关闭 模式,就像一个外部的文件系统编辑器一样。平台中的文本编辑器和Java 编辑器都是工作台中编辑器的例子。
无论是哪一种情况,都要根据一个通用的过程创建所需要的视图和编辑器。
  • 实现createPartControl 方法,创建表示可视化组件的SWT 小部件,确定使用哪些小部件,回收在视图或编辑器中显示的UI 资源。
  • 当视图或编辑器获得焦点时,将会收到一个setFocus 通知,可以用来设置小部件获得焦点。
  • 当视图或编辑器关闭时,将会收到一个dispose 消息,表示视图或编辑器被销毁了,这时,在createPartControl  方法中创建的控件已经被销毁了,但是不许销毁任何在视图或编辑器中创建的图片资源(例如鼠标指针、图片或字体)。
在整个生命周期中,将会从工作台页面触发事件,通知相关的部件,视图和编辑器被打开、激活、失去激活状态和关闭。

下面是一个例子,展示了工作台视图和编辑器的优雅之处。它们仅仅是小部件容器,可以根据需要实现简单或者复杂的功能。
   package org.eclipse.examples.helloworld;

   import org.eclipse.swt.widgets.Composite;
   import org.eclipse.swt.widgets.Label;
   import org.eclipse.swt.SWT;
   import org.eclipse.ui.part.ViewPart;

   public class HelloWorldView extends ViewPart {
      Label label;
      public HelloWorldView() {
      }
      public void createPartControl(Composite parent) {
         label = new Label(parent, SWT.WRAP);
         label.setText("Hello World");
      }
      public void setFocus() {
         // set focus to my widget.  For a label, this doesn't
         // make much sense, but for more complex sets of widgets
         // you would decide which one gets the focus.
      }
   }
         请注意,dispose() 方法不是必须要实现的,因为我们除了在 createPartControl(parent) 方法创建了一个标签(Label),没有做任何事情。如果我们创建了任何UI 资源,例如图片或者字体,就应该在dispose() 方法中销毁它们。由于我们扩展了ViewPart 类,就继承了dispose() 方法的空的实现。