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

    几条参考链接:
    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

  • 相关阅读:
    ccf 201604-3 路径解析
    ccf 201609-3 炉石传说
    ccf 201612-3 权限查询
    ccf 201709-3 JSON查询
    ccf 201703-3 Markdown
    POJ 3259 -- Wormholes
    Bellman-Ford 单源最短路径算法
    【oracle】oracle启动和关闭步骤
    【Excel】Excel根据单元格背景色求和
    【Oracle】Oracle时间日期格式
  • 原文地址:https://www.cnblogs.com/bjzhanghao/p/896499.html
Copyright © 2020-2023  润新知