插件开发——基于Action的基本平台扩充点 二 : viewActions

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

org.eclipse.ui.viewActions

通过插件向工作台中已经存在的视图添加扩展功能是很常见的,这是通过org.eclipse.ui.viewActions 扩展点实现的,这个扩展点允许插件在已有视图的下拉菜单和工具栏上添加菜单项、子菜单和工具栏对象。

 

通过org.eclipse.ui.menus 扩展点也可以实现向视图添加菜单,这个扩展点通过命令对象向视图的下拉菜单和工具栏贡献菜单项或者工具栏对象。更过信息查看org.eclipse.ui.menus 。

 

可以看到,当选中一个自述文件时,项目浏览器工具栏中的一项变成可使用状态,它也出现在项目浏览器的下拉菜单中,这些action 的出现是因为自述文件工具插件是通过viewActions 扩展点创建它们的。

插件开发——基于Action的基本平台扩充点 二 : viewActions

 

plugin.xml 中的相关声明如下:

 

<extension
    point = "org.eclipse.ui.viewActions">
      <viewContribution 
         id="org.eclipse.ui.examples.readmetool.vc1" 
         targetID="org.eclipse.ui.navigator.ProjectExplorer">        
	   <action id="org.eclipse.ui.examples.readmetool.va1" 
              label="%PopupMenu.ResourceNav.label" 
	      menubarPath="additions"
              toolbarPath="additions" 
              icon="icons/obj16/editor.png" 
              tooltip="%PopupMenu.ResourceNav.tooltip" 
   	      helpContextId="org.eclipse.ui.examples.readmetool.view_action_context"
              class="org.eclipse.ui.examples.readmetool.ViewActionDelegate" 
              enablesFor="1"> 
		<selection class="org.eclipse.core.resources.IFile" name="*.readme"/> 
	   </action>
      </viewContribution>
 </extension>

 
首先为视图扩展设定了一个唯一的id, 目标视图是通过targetID 设定的,我们扩展了项目浏览器视图的菜单,为新的action 设定了标签和在菜单栏与工具栏中的位置。(关于菜单和工具栏位置的完整的讨论,请看 Menu and toolbar paths)。

 

我们也设定了action 的可用的条件,可以看到,当一个带有".readme"后缀 (name="*.readme")一个 (enablesFor="1") IFile 类型 (class="org.eclipse.core.resources.IFile") 的文件被选中时,这个action就会处于可用状态。毫无疑问,这些正是当你在项目浏览器视图点击的时候所发生的过程。

 

plugin.xml中的这些信息是添加菜单项和工具栏项所需要的全部信息,插件代码会仅当选择了这个action时运行。为了提供action的功能行为,在plugin.xml 中配额的实现类必须实现 IViewActionDelegate 接口。

 

在这个例子中,readme 插件提供了ViewActionDelegate 类来实现action 的行为,浏览这个类,你可以看到它包括了获取所属的视图、处理选择更新、调用本省行为的方法。当调用这个action时,仅仅是打开一个对话框,表示执行了这个action。

 

 public void run(org.eclipse.jface.action.IAction action) {
	MessageDialog.openInformation(view.getSite().getShell(),
		MessageUtil.getString("Readme_Editor"),  
		MessageUtil.getString("View_Action_executed")); 
}

 

尽管这个action比较简单,但是展示了怎样通过这种方式做更多的工作。