GMF里实现contributionItemProvider扩展点

简介:

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")

本文转自博客园八进制的博客,原文链接:GMF里实现contributionItemProvider扩展点,如需转载请自行联系原博主。

相关文章
|
C# 开发工具
[UWP]理解及扩展Expander
原文:[UWP]理解及扩展Expander 1. 前言 最近在自定义Expander的样式,顺便看了看它的源码。 Expander控件是一个ContentControl,它通过IsExpanded属性或者通过点击Header中的ToggleButton控制内容展开或隐藏。
864 0
|
Go C# 图形学
Unity3D中对系统类进行扩展教程(简化代码逻辑)
Unity中对系统类进行扩展的方法 Unity扩展系统类,简化代码 本文提供全流程,中文翻译。 助力快速完成 Unity 对系统类进行扩展,添加函 新建一个脚本,名称随意 类必须设为静态 Static ,函数同样(这样才能通过其他类,直接访问到扩展函数) 形参为 this + 需要扩展的类 此时,我们通过 transform.
1455 0
|
XML Java Android开发
由模型生成GEF应用程序:Merlin
接触和使用过EMF的朋友都知道,只要定义好ecore模型,就能够利用EMF的代码生成工具得到一个可用编辑器,而ecore模型可以从rose模型、java接口或xml schema很方便的转换生成。不过,虽然得到的编辑器从功能上来说是足够了,但针对不同的需求还须要进行定制,这里的工作并不少,如果想定制为图形化编辑器要改的就更多了,基本上相当于重写的工作量。
1335 0
|
Java 测试技术
EMF介绍系列(三、定制应用程序的基本方法)
借助EMF的帮助,不用亲自编写一行代码就可以生成一个完整的应用程序,你是不是对EMF有些感兴趣了?不过生成的应用程序看起来都像是从同一个模子里出来的,即 一个多页编辑器,一个大纲视图和属性页,这当然无法满足所有人的需求。
1258 0