八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  244 随笔 :: 0 文章 :: 3241 评论 :: 14 引用

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

posted on 2007-09-17 23:42 八进制 阅读(4397) 评论(18)  编辑 收藏 网摘 所属分类: EclipseGMF

评论

怎么才可以下载一个完整的gmf啊?可以给我详细说说吗?
  回复  引用    

#2楼[楼主] 2007-10-03 15:04 八进制      
在这里下载:http://download.eclipse.org/modeling/gmf/downloads/index.php" target="_new">http://download.eclipse.org/modeling/gmf/downloads/index.php
  回复  引用  查看    

#3楼 2007-12-05 16:08 z[未注册用户]
plugin中的代码是:
<extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
<contributionItemProvider
checkPluginLoaded="false"
class="test01.DeleteRList">
<Priority
name="Highest">
</Priority>
</contributionItemProvider>
</extension>
DeleteRList的代码是:
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IWorkbenchPart;

public class DeleteRList extends DiagramContextMenuProvider {

public DeleteRList(IWorkbenchPart part, EditPartViewer viewer) {
super(part, viewer);
// TODO Auto-generated constructor stub
System.out.println("^^^^^^^^^^^^^^^^^^^^^6");
}



public void buildContextMenu(IMenuManager menu) {

super.buildContextMenu(menu);
}

public IContributionItem[] getItems() {
IContributionItem[] ic = super.getItems();
filterSystemPopMenu(ic);
for (int i = 0; i < ic.length; i++) {
System.out.println(ic[i]+" llllllllll';" );
}

return ic;
}



private void filterSystemPopMenu(IContributionItem[] ic) {
// TODO Auto-generated method stub

for (int j = 0; j < ic.length; j++) {
if (ic[j].equals("compareWithMenu")) {
ic[j].setVisible(false);
}

}

}

想请教下为什么启动rcp时,不执行。哪里有问题,希望可以帮忙看下

  回复  引用    

#4楼 2007-12-19 20:21 soda[未注册用户]
请问如何以扩展contributeItemProvider的方式将action添加到eclipse默认toolbar的某个组内?
比如我要在默认工具栏的打印区里面添加一个按钮,以往的实现方式是扩展org.eclipse.ui.actionSets,添加一个action,然后通过指定其toolbar path = org.eclipse.ui.workbench.file/print.ext
现在扩展contributeItemProvider如何指定一个自定义partAction的toolbar path?谢谢。

  回复  引用    

#5楼 2008-01-17 14:12 ste[未注册用户]
你好啊,碰到一个很奇怪的问题,GMF中为什么不能给连线的figure加上颜色?
给连线 setForgroundColor 为其他颜色了为什么还是没有出现颜色的效果?

我很确定,在gef中测试了一下代码是可以有颜色改变的效果的,为什么gmf不行?

难道在gmf中定制化连线的视图 还要有什么前提 ?

  回复  引用    

#6楼 2008-01-22 17:45 scs[未注册用户]
请问如何加如GMF的新闻组啊?它的服务器是多少?谢谢了。:)
  回复  引用    

#7楼[楼主] 2008-01-27 16:50 八进制      
订阅news.eclipse.org,在订阅列表里选eclipse.modeling.gmf
  回复  引用  查看    

#8楼 2008-02-25 11:09 uuu[未注册用户]
很奇怪,我做一个了 compartment ,有了cmopartment的基本效果了,就是三角号出不来,所以cmopartment就不能收缩了,我试了很久多没有成功出现三角号,请问是什么原因呢??我漏掉了哪里了? 谢谢了!!
  回复  引用    

#9楼[楼主] 2008-02-25 13:08 八进制      
一个可能:在xxx.gmfgen里找到Gen Compartment项,看Can Collapse属性是否为true
  回复  引用  查看    

#10楼 2008-03-04 17:58 uuu[未注册用户]
八进制兄,你是说 只有这个可能还是其中一个可能?

当然我已经设置 “Can Collapse属性是否为true ”,可能问题不在这里,我很奇怪,几乎在map文件等什么文件我都几乎遍地翻找过原因了。

ps: Can Collapse属性就算为false,好像那个三角号还是出现的,不过双击这个三角号是没有反应的。好像gmf自带一个例子 什么topic 就是这样的。

八进制兄 可否留意一下呢? 谢谢!

三角号 出不来,太奇怪了。

  回复  引用    

#11楼[楼主] 2008-03-06 18:12 八进制      
是我想到的一个可能,当然也可能是其他原因。另外必要时把生成的代码删除再重新生成一遍。
  回复  引用  查看    

#12楼 2008-03-10 10:11 777[未注册用户]
我看到一个GMF工程,可以把一个文件拖入到diagram中,diagram会弹出一个菜单。
但是我模仿试着做做看,但是发现拖入文件时,鼠标的标志是禁止拖入的状态,无法弹出菜单。
想请问问,这个怎么让鼠标的状态不是禁止的,并且调用弹出菜单的command?
多谢八进制兄

  回复  引用    

#13楼[楼主] 2008-03-12 10:59 八进制      
to uuu, 不知道这个有没有帮助:
“10、让Compartment在容纳不下子图形时自动显示滚动箭头

在genmodel的GenDiagram元素里改Units属性为“himetric”(经测试对GMF1.0不起作用),见https://bugs.eclipse.org/bugs/show_bug.cgi?id=140789" target="_new">https://bugs.eclipse.org/bugs/show_bug.cgi?id=140789

  回复  引用  查看    

#14楼[楼主] 2008-03-12 11:01 八进制      
to 777: 我觉得在生成的xxxDiagramEditor的initializeGraphicalViewer()方法里,需要修改getDiagramGraphicalViewer().addDropTargetListener(...)以便让editpartviewer能接受文件类型。
  回复  引用  查看    

你好:八进制
我想问一下上下文菜单中有一个Add Menu 我想把它里面的Acion 去掉,例如note,text 等 怎么作

  回复  引用    

#16楼[楼主] 2008-04-26 00:44 八进制      
这篇文章里有关于定制上下文菜单的内容:
http://www.ibm.com/developerworks/cn/opensource/os-ecl-gmfextend/index.html" target="_new">http://www.ibm.com/developerworks/cn/opensource/os-ecl-gmfextend/index.html

  回复  引用  查看    

谢谢 八进制,
我的问题已经解决,
我是一个GMF出学习者,
你的文章是我看过的最好的,
很 希望你新的大作出现!!!

  回复  引用    

#18楼[楼主] 2008-04-29 11:34 八进制      
谢谢你的关注。因为时间关系现在少有单独的帖子,新的内容主要用简短文字添加到“GMF常见问题”里。类似列表还有“Palm OS开发常见问题和技巧”。
  回复  引用  查看    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 896499


相关文章:

相关链接: