eclipse平台允许我们通过插件扩展出另一个插件,与平台紧密集成为用户提供更好的体验,本文将向您阐述如何向视图和编辑器中添加动作(上下文菜单),并且允许为您自己定义的视图和编辑器添加其他新的动作。文中的每一个示例将详细的向您展示每一种不同应用的特征。
上面的图片显示了插件中能添加动作的众多区域:
1、 在视图和编辑器中添加上下文菜单
2、 在视图上添加工具栏和下拉菜单
3、 在工作台窗口的主工具栏和菜单上添加动作
本文将对上面的种种进行演示,并通过实例形式向您详细讲解。
我们假设您有插件开发的基础,如果想获得在eclipse平台上开发插件的更多信息,请阅读Jim Amsden的入门文章“Your First Plug-in”,该示例的运行结果,请点击“running the examples”。
在上下文菜单中添加动作
可以在视图和编辑器的上下文菜单中添加动作并紧密集成,比如,VCM插件在存在的视图如Navigator或Packages中添加了许多新的动作,对资源进行版本管理.为了在上下文菜单中添加新的动作,eclipse提供了插件点org.eclipse.ui.popupMenus,包括两种类型的动作,即能添加到视图或编辑器的上下文菜单中,也能为指定的对象类型添加上下文菜单。下面的三个示例将为您详细说明。
示例一:为默认的文本编辑器添加新的动作
让我们看看如何向默认的文本编辑器添加一个动作:
①<viewerContribution
id="org.eclipse.ui.articles.action.contribution.popup.editor"
② targetID="#TextEditorContext">
③ <action
id="org.eclipse.ui.articles.action.contribution.editor.action1"
label="Editor Action 1"
icon="icons/red_dot.gif"
④ menubarPath="additions"
⑤ class="first.plugin.action.ContextMenuAction">
</action>
</viewerContribution>
</extension>
上面的xml向指定编辑器添加了一个上下文菜单,该扩展叫viewerContribution(①),可以用于视图和编辑器。
targetID属性(②)指定上下文菜单所依附的目标视图和编辑器标识符,官方文档提供了可用的标识符列表,如果您设置的标识符不存在,则上下文菜单不被注册。一个视图或编辑器可以有不只一个上下文菜单。
action(③)标记用于定义一个动作,id是该动作的标识符,label和icon表示菜单项的显示文本和图标,icon为可选项。menubarPath(④)属性指定动作菜单项的位置,从上下文菜单的根开始,action将被添加到这里。在本示例中,“additions”其实是org.eclipse.ui.IWorkbenchActionConstants类的一个常量值(MB_ADDITIONS)。添加的动作独立成组,在上述情况下,如果menubarPath属性没有指定,工作台将首先添加到“additions”组中,如果additions不存在,动作将被添加到上下文菜单的末尾。
class(⑤)属性是一个菜单项被用户选中后将要执行的动作的类,如果是编辑器的上下文菜单,该类必须实现org.eclipse.ui.IEditorActionDelegate接口,如果是视图的上下文菜单,则实现org.eclipse.ui.IViewActionDelegate接口。有一个非常重要的情况就是只有当用户选择了菜单项后该类才被工作台加载,这就意味着很多初始化的逻辑必须在XML文件中描述。一旦该类被工作台加载,该类将可以控制动作的启用与禁用。如果动作被选中,将执行run()方法完成需要的功能。
下面是一个典型的实现类:
package first.plugin.action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
public class ContextMenuAction implements IEditorActionDelegate {
@Override
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
}
@Override
public void run(IAction action) {
MessageDialog.openInformation(null, "", "我是上下文菜单");
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
}