RCP开发中,顶级菜单/顶级工具栏多出了一些无关的项?

来源:互联网 发布:支付宝支付端口 编辑:程序博客网 时间:2024/04/20 15:57
今天小组里面同志写的RCP demo中顶级菜单上出现了一些无关项,Help菜单下面无故多出了Key Assit,Software Updates项。工具栏也多出了一些无关的项。如图:

怎么办?

一检查,其RCP应用中添加了org.eclipse.ui.ide依赖,很显然,这些项是由此插件产生的。
而且很可能是通过org.eclipse.ui.actionSets扩展点配置的menuBarPath产生的。

我们知道,RCP应用的顶级菜单栏,工具栏,状态栏等都是由ActionBarAdvisor的实现类决定的。
好吧。去看看这个类的实现。

 protected void fillMenuBar(IMenuManager menuBar) {
       MenuManager mHelp = new MenuManager("Help",IWorkbenchActionConstants.M_HELP);//请注意这里,第二个参数(MenuManger的id)
     mHelp.add(aboutAction);
     menuBar.add(mHelp);
}

fillCoolBar是空实现。

上面标有注释的MenuManager的id正是Eclipse IDE中内置的帮助菜单的ID(help)。
想想,是不是因为此id与内置id相同,而且,因为此内置的MenuManager中添加了很多点位符(插入点)而造成的呢?
试图将其id修改了一下()MenuManager("Help",IWorkbenchActionConstants.M_HELP + "1")。
运行,发现help下的无关菜单都没有了。

但Search,run以及工具栏上的无关项仍然存在。
想了下,是不是可以在WorkbenchWindow打开后将这些项给删掉呢?
也许是一个方法,立即行动。

重写WorkbenchWindowAdvisor实现类的postWindowOpen方法。


@Override
 public void postWindowOpen() {
  IMenuManager menuManager = getWindowConfigurer().getActionBarConfigurer().getMenuManager();
  IContributionItem[] items = menuManager.getItems();
  for(int i=0; i<items.length; i++){
   System.out.println(items[i].getId());//先将所有contribution的id枚举出来
  }
  menuManager.remove("org.eclipse.search.menu");//逐个删除
  menuManager.remove("org.eclipse.ui.run");
  menuManager.update(true);//核心
  
  //针对CoolBar我采取了同样的方式。
  ICoolBarManager coolManager = getWindowConfigurer().getActionBarConfigurer().getCoolBarManager();
  IContributionItem[] items2 = coolManager.getItems();
  for(int i=0; i<items2.length; i++){
   System.out.println(items2[i].getId());
  }
  
  
  问题立解。
  实际上,由于Eclipse平台的开放性(允许各个插件contribution),当RCP项目变得比较大时,此类情况还是出现
  得比较多的,以前就碰到过在首选项中出现了无关项。这一类问题均可能通过这种先枚举出id,然后删除的方式去
  解决。
  
    需要进一步了解的问题,这些无关面是在什么时候给加上去的呢?等研究清楚了再写博文呈上。