GMF里的contributionItemProvider扩展点的功能与org.eclipse.ui.editorActions类似,即为指定editor增加Action,但用contributionItemProvider还可以为view添加Action,以及实现添加popupMenu等多种功能,相当于eclipse提供的多种与Action有关的扩展点的集合。现以为editor增加Action为例介绍一下如何使用contributionItemProvider。
首先当然是在plugin.xml里描述contributionItemProvider扩展点的实现方式。在下面的xml代码里,首先用contributionItemProvider元素指定了实现类为com.my.MyContributionItemProvider,这个实现类可以有两种情况:一般它继承自GMF提供的AbstractContributionItemProvider;也可以直接实现IContributionItemProvider,后者情况就不需要再定义contributionItemProvider元素下的其他元素了,全部Action都可以用java代码在contributeToActionBars()和contributeToPopupMenu()方法里构造。
<extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders"> <contributionItemProvider checkPluginLoaded="false" class="com.my.MyContributionItemProvider"> <Priority name="Low"/> <partContribution id="com.my.RuleDiagramEditorID"> <partAction id="showConsole" menubarPath="/window/views"> </partAction> </partContribution> </contributionItemProvider> </extension>
现在讨论继承AbstractContributionItemProvider的情况,我们需要实现createAction()方法,这个方法接受actionId作为参数。actionId参数是在plugin.xml里指定的,如上面的xml片段里,首先用partContribution元素指定要把Action添加到哪个editor上,然后用partAction元素指定希望添加的Action的id和menubarpath位置等其他参数。
实际上AbstractContributionItemProvider的主要功能就是解析contributionItemProvider下的xml元素,并根据这些元素内容调用createAction()方法,所以在createAction()方法里我们可以得到actionId并根据它创建实际的Action类。下面是对应上面xml片段的MyContributionItemProvider代码:
public class MyContributionItemProvider extends AbstractContributionItemProvider { @Override protected IAction createAction(String actionId, IWorkbenchPartDescriptor partDescriptor) { if (actionId.equals("showConsole")) { IAction action = new ShowViewAction("&Console", "console.view.id"); action.setImageDescriptor(); return action; } return super.createAction(actionId, partDescriptor); } class ShowViewAction extends Action{ } }
最后要注意一点,如果editor和contributionItemProvider不在同一个plugin里,则一定要在plugin.xml里指定contributionItemProvider元素的checkPluginLoaded属性为false,否则这个contributionItemProvider不会被加载。(补充08/01/02: 如果menuPath设置不正确也可能导致contributionItemProvider不被加载,一个正确的menuPath是"/file/print")
几条参考链接:
http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg06035.html
http://dev.eclipse.org/newslists/news.eclipse.technology.gmf/msg04270.html
http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00757.html
http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg08196.html