`
javeye
  • 浏览: 329097 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RCP中采用actionSet配置菜单的方法总结

    博客分类:
  • RCP
阅读更多
最近学习了下如何通过org.eclipse.ui.actionSets来配置RCP中菜单的过程,总结一下。
首先,我们在工程中打开plugin.xml文件,选中Extensions这个选项卡。在org.eclipse.ui.views扩展点下新建一个view,id:com.travelsky.test.menu.view。name:testMenu。点击class创建该类,类名取为:ViewPart。代码如下:

import org.eclipse.swt.widgets.Composite;
public class ViewPart extends org.eclipse.ui.part.ViewPart {
		private static final String ID = "com.travelsky.test.menu.view";
//注意,设置其ID
	public ViewPart() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public void createPartControl(Composite parent) {
		// TODO Auto-generated method stub

	}
	@Override
	public void setFocus() {
		// TODO Auto-generated method stub
	}
}

该创建过程上传附件的图1:创建一个view

第二步,打开plugin.xml文件,选中Extensions这个选项卡。
添加扩展点:org.eclipse.ui.actionSets。
添加扩展点:org.eclipse.ui.actionSetPartAssociations。
第三部,
在actionSets扩展点中设置id="com.travelsky.test.menu.actionSet"
在actionSets扩展点中创建一个menu,设置vsible=true,设置ID为id="testMenu"
在menu下创建两个separator,用于对目录进行分组。取名分别为testGroup和testGroup2.
如果不需要分组,可以不用设置。
第四步,
在actionSets扩展点中建立三个action,取名称分别为目录测试1,目录测试3,录测试2。
对于目录测试1:设置其menubarPath为如下格式:
menu.ID/separator.ID
表明其放在menu.ID目录的separator.ID分组下。
这里设置为:menubarPath="testMenu/testGroup"表明在testMemu所在目录的testGroup组下面显示该项action。
同理,设置目录测试2: menubarPath="testMenu/testGroup2"
设置目录测试3:menubarPath="testMenu/testGroup2"
第五步,
在actionSetPartAssociations扩展点中,设置其targetID="com.travelsky.test.menu.actionSet"
在actionSetPartAssociations扩展点中,添加part,设置其id="com.travelsky.test.menu.view"。
以对应之前建立的view,将该菜单内容配置给此com.travelsky.test.menu.view。

好了,配置基本上完成了。此时的配置如附件图2:配置界面一览
选中plugin.xml选项卡,会看见生成类似如下代码到其中:
   <extension
         point="org.eclipse.ui.actionSets">
      <actionSet
            id="com.travelsky.test.menu.actionSet"
            label="Main"
            visible="true">
         <menu
               id="testMenu"
               label="目录测试">
            <separator
                  name="testGroup">
            </separator>
            <separator
                  name="testGroup2">
            </separator>
         </menu>
         <action
               id="com.travelsky.test.menu.action1"
               label="测试目录1"
               menubarPath="testMenu/testGroup">
         </action>
         <action
               id="com.travelsky.test.menu.action2"
               label="测试目录3"
               menubarPath="testMenu/testGroup2">
         </action>
         <action
               id="com.travelsky.test.menu.action3"
               label="测试目录2"
               menubarPath="testMenu/testGroup2">
         </action>
      </actionSet>
   </extension>

   <extension
         point="org.eclipse.ui.actionSetPartAssociations">
      <actionSetPartAssociation
            targetID="com.travelsky.test.menu.actionSet">
         <part
               id="com.travelsky.test.menu.view">
         </part>
      </actionSetPartAssociation>
   </extension>


最后,将view添加到perspective中。运行测试工程。我们会看见如附件图3:菜单配置运行效果所示
  • 描述: 图1:创建一个view
  • 大小: 66.2 KB
  • 描述: 图2:配置界面一览
  • 大小: 70.1 KB
  • 描述: 图3:菜单配置运行效果
  • 大小: 14.5 KB
分享到:
评论
3 楼 hachorse 2015-10-28  
楼主,请问有没有什么办法可以在Activator中获取你第二步中添加的action扩展点对象,如:
  <action 
            id="com.travelsky.test.menu.action1" 
            label="测试目录1" 
            menubarPath="testMenu/testGroup"> 
   </action>

这样子可以在代码中控制每一个action对应图标的样式,以及各action的可用和不可用状态。

2 楼 javeye 2009-04-15  
你描述的问题我理解得不是很清楚。如果你需要在自己创建的菜单中,选择菜单的某个选项(扩展点定义的一个action)打开一个创建好的视图,则需要对你的选项绑定一个Delegate类。该类负责处理当绑定的选项被选中时,做你要做的事情。
如:
         <action
               class="com.travelsky.test.action.OpenViewDelegate"
               id="com.travelsky.angel.client.cki.OpenViewAction"
               label="打开视图"
               menubarPath="testMenu/testGroup2">
         </action>


该Delegate类的代码类似这样:
public class OpenViewDelegate implements IWorkbenchWindowActionDelegate
{


    public void dispose()
    {

    }

    public void init(IWorkbenchWindow window)
    {

    }

    public void run(IAction action)
    {

//你需要在这里写需要处理的逻辑。比如打开一个view。则
		try {
			IViewPart findView = PlatformUI.getWorkbench()
					.getActiveWorkbenchWindow().getActivePage()
					.findView(viewID);//viewID就是要打开的veiw

			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
					.getActivePage().activate(findView);
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
    }

    public void selectionChanged(IAction action, ISelection selection)
    {
        // TODO 实现方法体

    }


要注意的是org.eclipse.ui.actionSetPartAssociations是用来设置菜单与某个view关联的,也即当这个view打开时,与他关联的菜单可见。而不是用来设置菜单点击时候打开那个view。
1 楼 dou85dou 2009-04-14  
您好,我完成了所有的步骤,但是我点击菜单中的选项,却无法打开创建好的视图。当我重新运行时,视图是可以打开的,说明视图的类是没有问题的,只是选项和打开视图没有联系上,不知道哪里有问题?

org.eclipse.ui.actionSetPartAssociations我也已经设置好了,还能有哪些问题呢?

谢谢解答

相关推荐

Global site tag (gtag.js) - Google Analytics