插件开发——基于Action的基本平台扩展点

        工作台定义了一定数量的扩展点,帮助插件向已经存在的视图和编辑器添加新的行为或者实现新的视图和编辑器。基于命令(Commands)的基本平台扩展点将会在别的章节讲解。在这里我们将会通过一个称为“自述工具”的工作台实例程序,看一看是向扩展点贡献功能的。

 

        这个自述工具是一个插件,提供了对以 .readme 为后缀的文件的自定义编辑和导航功能。这个例子展示了多个使用扩展实现专门工具的具有代表性(但是不简单)的方法。

 

        自述工具向导航视图添加了菜单,在工作台菜单和工具栏中添加了和编辑器相关的菜单项或工具栏按钮,定义了一个自定制视图和内容大纲,定义了标签和标签解析。下面的图展示了自述工具向平台添加的一些定制的特性。

自述工具也向工作台添加首选项和属性页面,后面我们也将会在 对话框和向导 部分讲解是如果扩展向导的。

 

        自述工具包含在org.eclipse.ui.examples.readmetool 包,可以在插件目录下面的org.eclipse.ui.examples.readmetool 目录下找到eadmetool.jar 和 plugin.xml ,之前必须确保已经安装了平台实例。(查看 Examples Guide 获得更多信息。

 

        自述工具实现了很多不同的平台扩展,下面将会从一个最简单的工作台扩展点——视图——开始,之后会陆续讲解自述工具实现的更多的扩展。

 

1. 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,被添加到了工作台。在声明中设定了视图的ID、名称和所属的分类,使用相对插件安装目录的路径为视图提供了一个图标。

 

        现在来看一下ReadmeSectionsView 的显示效果,可以通过在工作台中选择 Window > Show View > Other... 并在 显示视图 列表中选择一个视图打开视图。

 

        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 的输入。

 

       但是ListViewer 是如何填充内容的呢,现在我们假设一旦为Viewer 提供了输入元素,它自己知道如何在列表中填充数据, 毕竟它是一个ListViewer。如果你现在想了解更多关于viewer的内容,请阅读Viewers

 

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;
   }
  

        首先检查选择对象是不是一个结构化的选择对象,检查选择对象的首个元素对象是不是一个文件资源,如果是的话,检查它的后缀是不是“.readme”,当我们能够确认获得了一个自述文件时,就可以使用其他方法来解析器其中的内容了。

 

2. org.eclipse.ui.viewActions

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值