在Eclipse中去掉多余的UI组件的几个方法

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

1.在Plugin.xml中定制

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

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

<extension point="org.eclipse.ui.popupMenus">
    <objectContribution
             id="my.example.objectContribution"
             nameFilter="*example*"
             objectClass="java.io.File">
          <action
                class="my.example.MyAction"
                id="my.example.MyAction"
                label="Exe"
                menubarPath="additional">
          </action>
       </objectContribution>
     </extension>

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

2.使用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掉.例如:

<extension
          point="org.eclipse.ui.activities">
       <activity
             id="my.example.activity"
             name="WizardActivity">
       </activity>
       <activityPatternBinding
             activityId="my.example.activity"
             pattern="my\.example/mywizard">
       </activityPatternBinding>
  </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中.

3.用代码来动态控制UI

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

IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
   IActivityManager activityManager = workbenchActivitySupport.getActivityManager();
   Set enabledActivityIds = new HashSet(activityManager.getEnabledActivityIds());
         if(flag==1)
   {
           if (enabledActivityIds.add("my.example.activity")) 
               workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);
   }
   else{
            if(enabledActivityIds.remove("my.example.activity"))
               workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);
   }

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隐藏.

时间: 2024-09-17 04:54:11

在Eclipse中去掉多余的UI组件的几个方法的相关文章

Eclipse中Android公共库的正确建立及调用方法

Eclipse中Android公共库的正确建立及调用方法 引言 之前一直头痛于没有办法在多个程序中共享资源,用作公共类库的方法也是使用的导出jar再导入的办法,现在终于初步搞明白了,可算解脱了~,分享出来. 建立公共库 首先建立公共库的Android项目,名为MyCoreLib: 完成后在左侧包浏览器里右键点选我们新建的这个项目,选择Properties项: 左侧选择Android分类,右侧勾选Is Library选项: 完成后在包资源管理器中删除默认生成的资源,以避免以后被引用时冲突: 打开A

详解Android中通过Intent类实现组件间调用的方法_Android

Intent是Android中用来调用其它组件的类,通过Intent,我们可以非常方便的调用Activity,Broadcast Receiver和Service. Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); 上面这段代码可以用来调用第三方的Activity(启动第三方浏览器来打开百度首页

Zend studio for eclipse中使php可以调用mysql相关函数的设置方法_php技巧

如果直接调用mysql_connect会出现:Fatal error: Call to undefined function mysql_connect() 的错误 解决办法, 找到zend studio php.ini所在的位置 我的zend studio安装在D:\Program Files\ 所以php.ini所在位置为:D:\Program Files\Zend\Zend Studio for Eclipse - 6.0.0\plugins\org.zend.php.debug.debu

asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)_实用技巧

在Web开发中,有很多可以上传的组件模块,利用HTML的File控件的上传也是一种办法,不过这种方式,需要处理的细节比较多,而且只能支持单文件的操作.在目前Web开发中用的比较多的,可能uploadify(参考http://www.uploadify.com/)也算一个吧,不过这个版本一直在变化,他们的脚本调用也有很大的不同,甚至调用及参数都一直在变化,很早的时候,那个Flash的按钮文字还没法变化,本篇随笔主要根据项目实际,介绍一下3.1版本的uploadify的控件使用,这版本目前还是最新的

详解Android中通过Intent类实现组件间调用的方法

Intent是Android中用来调用其它组件的类,通过Intent,我们可以非常方便的调用Activity,Broadcast Receiver和Service. Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); 上面这段代码可以用来调用第三方的Activity(启动第三方浏览器来打开百度首页

Win7系统注册表中删除多余开机启动项键值的方法

  1.首先点击开始菜单,然后在搜索框中输入regedit,然后再搜索结果中输入右击选择"以管理员身份运行"选项; 2.然后依次展开注册表并找到下列键值:(这里涉及修改注册表,为了安全起见建议事先备份注册表) HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx HKEY_CURRE

eclipse中写文档注释修改作者名称

问题描述 eclipse中写文档注释修改作者名称 和方法创建的时间和它的格式,修改完后就是用快捷键它自己都能出来 解决方案 eclipse设置过程如下,按自己的喜好设置就好了. 解决方案二: 怎样修改Eclipse注释的作者修改eclipse 注释的作者Eclipse怎么修改文档注释样式 解决方案三: 我一般这样 /** @author :某某 **/ 此连接就是你找的方法 http://mobile.51cto.com/abased-387443.htm 解决方案四: 根据毕小宝图片说的,把下

关于Eclipse中UI程序的线程的讨论

程序 虽然各个操作系统之间的线程机制是不一样的,但是大致是相同的.当用户使用GUI程序时,如果点鼠标或按下键盘上的键等时,操作系统会产生对应的GUI事件,它来决定哪个窗口或程序来接受每一个事件并且放到程序的事件队列中.       任何GUI程序的底层结构就是一个事件循环.程序首先初始化事件循环,并开始循环,这个循环会从事件队列依次接收GUI事件并一一做出相应的反应.程序应该对事件做出快速的反应使程序一直对用户有响应,举个例子,用户点了一下程序里的一个按钮结果程序就没反应了,那么这个程序应该算是

iView 1.0 正式版 ,43 个 UI 组件助力中后台业务开发

iView 已经从最初的高质量 UI 组件库,逐步过渡到了从工程构建.主题定制.多语言.设计规范的一整套的前端解决方案.主要服务于中后台业务,目的就是让网站快速成型上线. 1.0 都有哪些新特性 先看一下目前支持的组件情况: 常用的组件包括了:Grid 栅格.提醒类(Message.Notice).模态 Modal.表格 Table.级联选择.输入框.表单验证.单选.多选.下拉选择.滑块.上传.日期时间选择.分页.导航菜单等. 除了基本组件外,1.0 还加了很多新东西: 常用布局 Layout