自定义Eclipse菜单项:去除多余的UI图标
创始人
2024-04-21 07:10:32
0

Eclipse的扩展机制是其一个重要特色,但随着Eclipse功能越做越强,插件越来越多,你会发现GUI上的图标越来越多,Menu,toolbar,context menu都被占满了,其实很多item并不是我们需要的,但是contribute这些item的插件我们是需要的,那怎么去掉它们扩展的那些菜单项呢?

自定义Eclipse菜单项:在Plugin.xml中定制

这是最简单的办法,很多时候我们自己想写代码来去掉一些菜单项,但效果并不好.所以能在Plugin.xml中定制的,我们就 尽量写在plugin.xml里面.下面举一个右键菜单的例子:

扩展右键菜单需要扩展org.eclipse.ui.popupMenus扩展点,我们一般都在它下面new一个action,但这个action扩展之后不管在  任何界面都会出现,如果我们想在某些条件下隐藏掉它该怎么办?仔细观察下org.eclipse.ui.popupMenus扩展点,其实我们还可以新建objectContribution扩展

  1. < extension 
  2.       point="org.eclipse.ui.popupMenus"> 
  3. < objectContribution 
  4.          id="my.example.objectContribution" 
  5.          nameFilter="*example*" 
  6.          objectClass="java.io.File"> 
  7.       < action 
  8.             class="my.example.MyAction" 
  9.             id="my.example.MyAction" 
  10.             label="Exe" 
  11.             menubarPath="additional"> 
  12.       < /action> 
  13.    < /objectContribution> 
  14.  < /extension> 

objectContribution里面也包含一个action,但这个action在popupmenu里出现是有条件的:我们给它定义了一个nameFilter, 只有当selection()的path中包含了"example"才会显示,否则这个action是不会出现在 popupmenu里的.这里的selection假设选中的是一个File,如果选中的是你自己写的类,那namefilter会在你的类的toString方法里面找keyword.

自定义Eclipse菜单项.使用Eclipse的Activities扩展

plugin.xml并不能解决所有问题,当我们实在没有办法在plugin.xml中限制某些extension的出现的时候,可以考虑使用Eclipse的Activities.Activities的官方定义大家可以google一下eclipse的help.我个人的理解就是它可以和perspective一样控制UI的显示,但是Perspective设计的太易于扩展了,假如Plugin A在perspective上扩展了一个UI,那么Plugin B在每次进入这个perspective的时候就一定可以看得见它,而且在Eclipse的扩展机制下,Plugin B是没有权利去删了Plugin A的contribution的(Eclipse的ExtensionRegistry倒是提供了一个removeExtension方法,但运行的时候会报错).在这样的情况下,Activities的价值就体现出来了,你只要给它一个Extension的id,它就可以帮你把这个Extension disable掉.例如:

  1. < extension 
  2.          point="org.eclipse.ui.activities"> 
  3.       < activity 
  4.             id="my.example.activity" 
  5.             name="WizardActivity"> 
  6.       < /activity> 
  7.       < activityPatternBinding 
  8.             activityId="my.example.activity" 
  9.             pattern="my\.example/mywizard"> 
  10.       < /activityPatternBinding> 
  11.  < /extension> 

比较重要的是activityPatternBinding中的pattern属性,它是由plugin id + "/" + local-id组成.比如在插件my.example中扩展了 org.eclipse.ui.newWizards,id是mywizard,那么上面这个activityPatternBinding就会disable掉my.example的mywizard扩展,你在 GUI中就看不见这个wizard了.pattern是支持正则表达式的,所以如果有"."的话需要用转义字符\.注意,这里的disable的意思并不是说我把mywizard这个扩展删掉了,而是屏蔽了它,mywizard仍然在 ExtensionRegistry中.

自定义Eclipse菜单项.用代码来动态控制UI

方法2只是隐藏掉一些扩展,但是有一些需求并不是简单的隐藏就可以了,我最近碰到的一个需求就是:有一个flag,只有当flag==1的时候扩展是可见的,否则是不可见的,需要disable这个扩展.这时就必须要加一些代码才能实现了,还是以方法2中的mywizard为例:

  1. IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();   
  2.  IActivityManager activityManager = workbenchActivitySupport.getActivityManager();  
  3.  Set enabledActivityIds = new HashSet(activityManager.getEnabledActivityIds());   
  4.        if(flag==1)  
  5.  {  
  6.          if (enabledActivityIds.add("my.example.activity"))   
  7.              workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);    
  8.  }  
  9.  else{  
  10.           if(enabledActivityIds.remove("my.example.activity"))  
  11.              workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);  
  12.  }  

Activities可以是enable或者disable的,当你在plugin.xml中定义好了一个Activity,缺省它是disable的,就是说activityPatternBinding 匹配的扩展是会被disable的,但你也可以把Activities设成enable的(在plugin.xml或者用代码都可以设置),它匹配的扩展是可以正常使用的.

在上面的code sample中,我们通过activityManager.getEnabledActivityIds()得到所有enable的Activities.如果flag==1,那my.example.activity 也应该被加入到enable Activities中,这样mywizard就可以显示在界面上,反之,就要在enable Activities中remove掉my.example.activity,它就变成 disable,会把mywizard隐藏.

【编辑推荐】

  1. 六大便捷Eclipse JDT特性一览
  2. 部署Eclipse RAP到Tomcat的步骤详解
  3. Eclipse 3.5插件安装与卸载的10个小窍门
  4. Eclipse平台应用与开发专题
  5. Eclipse 3.5年度稳定版现已公开测试

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...