(转)一篇很不错的介绍Eclipse插件Menu及其扩展点的文章

本文详细介绍了Eclipse菜单的种类,包括视图菜单、主菜单和上下文菜单,并探讨了如何通过扩展点(Commands、Actions、popupMenus)进行菜单扩展。此外,还讲解了菜单控制,如显示/隐藏、启用/禁用菜单项的方法,以及菜单控制的实现方式。
摘要由CSDN通过智能技术生成

原文在:http://tech.ddvip.com/2010-04/1271054623150507.html      

 

          菜单是各种软件及开发平台会提供的必备功能,Eclipse 也不例外,提供了丰富的菜单,包括主菜单(Main Menu),视图 / 编辑器菜单(ViewPart/Editor Menu)和上下文菜单(Context Menu)。在 Eclipse 中,几乎所有的 Workbench Part 提供了人性化的菜单,大大方便了用户的操作。因此,如何扩展 Eclipse 的菜单功能,并实现特定于我们自己插件的菜单,是插件开发者必须掌握的重要技能,同时,Eclipse 提供了丰富的扩展点供开发人员使用。本文将首先介绍 Eclipse 中的菜单,然后详细说明如何进行扩展,最后以一个实例的形式引导读者深入理解 Eclipse 的菜单功能。

  引言

  Eclipse 具有丰富的菜单功能,给开发人员提供了很好的用户体验。总体而言,Eclipse 菜单种类包括视图 / 编辑器菜单,主菜单(Main Menu),视图 / 编辑器菜单(ViewPart/EditorPart Menu)和上下文菜单(Context Menu)。插件开发人员通过灵活应用这些菜单,可以给用户提供很好的体验。由于视图和编辑器菜单功能类似,因此本文重点讲述视图菜单(视图下拉菜单及其工具栏菜单),除此之外,还将讲述主菜单和上下文菜单。

  如图 1 所示为 Project Explorer 视图的菜单,包括视图下拉菜单和工具栏菜单(折叠树节点)。通常而言,出现在视图工具栏的菜单都会出现在视图的下拉菜单,也就是说,比较常用的视图菜单放在视图的工具栏。

图 1. Project Explorer 视图的菜单 

  如图 2 所示为 Project Explorer 视图中的上下文菜单,只有当我们右键点击时才会出现。通常而言,出现频率较高的菜单项才会出现在菜单中。上下文菜单具有很强的灵活项,它可以随着我们点击的对象不同,弹出的菜单也会有相应的变化。

图 2. Project Explorer 视图中的上下文菜单 

  如图 3 所示为 Eclipse 的主菜单,包括最上面的主菜单项(不可移动)及其下面的工具栏菜单(可以移动,并且 Eclipse 提供了显示 / 不显示这些菜单的功能),Eclipse 并不建议我们为每一个插件都添加新的主菜单,这样容易造成冗余,而且不方便用户操作。通常,我们可以把菜单项添加到 Eclipse 已有的菜单,如插件的查找功能可以添加一个查找菜单项到 Eclipse 的 Search 主菜单上。

图 3. Eclipse 的主菜单 

  前面讲到 Eclipse 的各种菜单,那么,如何在开发插件或 RCP 应用程序的时候添加这些菜单?本文下面的篇幅将详细介绍如何扩展 Eclipse 的菜单功能,使读者深入了解 Eclipse 的菜单功能,并能够开发具有这些菜单的应用程序。因此,必须掌握三方面的内容:菜单种类,菜单的扩展点,菜单控制(显示 / 隐藏或启用 / 禁用菜单项)。下面从概念上介绍这三方面内容,下一小节将会进行详细介绍。

  菜单种类

  正如前面所讲到的,Eclipse 的菜单包括视图菜单,主菜单及上下文菜单三个种类。

  菜单项的扩展点

  Eclipse 提供了两种扩展点供用户添加菜单项到相应的位置。这两种扩展点为 org.eclipse.ui.commands(本文简称为 Commands 方式)和 org.eclipse.ui.actionSets(本文简称为 Actions 方式)。Actions 方式为界面上不同区域的表现方式提供了相应的扩展点,并且没有分离其界面表现和内在实现。恰恰相反,Commands 方式通过三步有效的达到界面表现和内部实现的分离:首先,通过 org.eclipse.ui.commands 扩展点创建命令和类别(Category),并且可以把某些命令放在一个类别(Category)中;然后,通过 org.eclipse.ui.menus 指定命令出现在界面的哪个区域(视图菜单 / 主菜单 / 上下文菜单);最后通过 org.eclipse.ui.handlers 指定命令的实现。因此,Eclipse 推荐新开发的插件使用 Commands 来创建您的界面菜单。当然,由于 Actions 在现有的插件中用得比较多,如果我们需要扩展或基于之前的插件开发,也需要对其进行了解。除此之外,针对上下文菜单,虽然 Commands 和 Actions 方式均可以创建上下文菜单,但是 Eclipse 还提供了另外一种创建上下文菜单的扩展点 org.eclipse.ui.popupMenus(本文简称为 popupMenus 方式),本文将就这三种扩展点做详细的介绍。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

菜单控制

  菜单控制是一个非常常见的功能,例如,随着选定的内容或当前窗口的不同,菜单中的菜单项会有相应的变化(显示 / 隐藏或启用 / 禁用菜单项),因此,如何控制菜单是插件开发人员必须掌握的知识。Eclipse 为菜单控制提供了两种方法,一种是通过扩展点;另一种是通过 API 的方式编写程序控制。

  Eclipse 菜单功能及其扩展点

  至此,我们对 Eclipse 菜单有了感观的认识。由上一节我们可知,要深入理解 Eclipse 菜单功能,我们需要从三个方面去掌握:菜单种类,菜单的扩展点和菜单控制。下面将进行详细讲述。

  菜单种类

  针对各种菜单,Eclipse 提供了相应的扩展点,因此,开发人员可以通过这些扩展点把菜单放到界面的不同区域,详细内容请参考 2.2 小节。

  菜单的扩展点

  视图菜单的扩展点

  采用 Commands 方式创建视图菜单,需要引入 org.eclipse.ui.menus 扩展点;而 Actions 方式需要引入 org.eclipse.ui.actionSets.

  1、视图菜单(Commands 方式):

  MenuContribution locationURI = “[Scheme]:[id]?[argument-list]”

  其中,Scheme 为该菜单项出现的区域,menu 为视图的下拉菜单,toolbar 为视图的工具栏菜单;id 为菜单区域 ID;argument-list 为该菜单项出现在指定菜单的位置。

  例如:在 ProbelmView 的下拉菜单加一个菜单项,其 MenuContribution 的 locationURI 应为:menu:org.eclipse.ui.views.ProblemView?after=additions;在 ProblemView 的工具栏菜单中加入一个菜单项,其 locationURI 应为:toolbar:org.eclipse.ui.views.ProblemView?after=additions。

  2、视图菜单(Actions 方式):

  采用 Actions 方式创建菜单,需要引入 org.eclipse.ui.actionSets 扩展点,并通过设定 action 的 menubarPath 指定下拉菜单 / 菜单项出现的位置;通过设定 action 的 toolbarPath 设定工具栏菜单 / 菜单项出现的位置。

  例如,添加一个下拉菜单项到 Problems 视图中,其 menubarPath 应为:

  org.eclipse.ui.views.ProblemView/additions

  主菜单的扩展点

  1、主菜单(Commands 方式)

  通过 Commands 方式把菜单项添加到主菜单及其工具栏上,和视图菜单一样,也是通过扩展点 org.eclipse.ui.menus 实现,需要设定其 menuContribution 的 locationURI。

  例如,添加一个菜单(菜单可以包含若干个菜单项)到主菜单一栏中,其 locationURI 为:

  menu:org.eclipse.ui.main.menu?after=additions

  添加一个菜单到工具栏之中,其 locationURI 为:

  toolbar:org.eclipse.ui.main.toolbar?after=additions

  当然,我们也可以把菜单项添加到已经存在的菜单当中,例如添加一个菜单项到 Eclipse 的 Search 主菜单当中,其 locationURI 为:

  menu:org.eclipse.search.menu?dialogGroup

  2、主菜单(Actions 方式)

  通过 Actions 方式把菜单项添加到主菜单及其工具栏上,和视图菜单一样,也是通过扩展点 org.eclipse.ui.actionSets 实现,需要设定 action 的 menubarPath 和 toolbarPath 实现。

  例如,添加一个菜单项到 Eclipse 的 Search 主菜单中,其 menubarPath 应为:

  org.eclipse.search.menu/dialogGroup

  注意:如果采用上述方式添加一个菜单项到 Search 主菜单,当我们运行时并没有出现添加的菜单项,这时候需要换一个 workspace,其原因是 Eclipse 缓存了与其相关的某些信息在 workspace 当中。

  上下文菜单的扩展点

  上下文菜单除了通过 Commands 和 Actions 方式添加,还可以使用扩展点 org.eclipse.ui.popupMenus 方式添加,下面分别进行介绍。

  1、上下文菜单(Commands 方式)

  Commands 方式与添加视图菜单和主菜单的方式一样,通过设定其 menuContribution 的 locationURI 来实现。

  例如,添加一个上下文菜单到 Problems 视图中,其 locationURI 为:

  popup:org.eclipse.ui.views.ProblemView?after=additions。

  如果我们想让某个上下文菜单项出现在任何区域,则可以使用下面的 locationURI:

  popup:org.eclipse.ui.popup.any?after=additions

  2、上下文菜单(Actions 方式)

  Actions 方式没有直接提供扩展点添加上下文菜单,但是我们可以通过编程的方式实现,如下代码清单 1 为 TreeViewer 添加上下文菜单,通过 IMenuManager 的 add 方法添加 actions。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

双击代码全选
1
2
3
4
5
6
7
8
9
private void hookContextMenu() { 
 IMenuManager fMenuMgr = new MenuManager(“#PopupMenu”); 
 fMenuMgr.setRemoveAllWhenShown(true); 
 // 添加 Actions 
 fMenuMgr.add(action … ) 
 fMenuMgr.createContextMenu(treeViewer.getControl()); 
 treeViewer.getControl().setMenu(fMenu); 
 getSite().registerContextMenu(fMenuMgr, treeViewer); 
} 

 

  3、上下文菜单(popupMenus 方式)

  通过 popupMenus 扩展点实现上下文菜单,需要设定 objectContribution 的 objectClass 属性把上下文菜单添加到相应的区域。

  例如,如果我们想当用户点击 Eclipse 中的资源时,弹出的上下文菜单包括某个菜单项,我们可以设定 objectClass 属性为:

  org.eclipse.core.resources.IResource

  通过 Commands 方式创建菜单项

  通过 Commands 方式创建菜单项,首先需要创建 Command,通过扩展点 org.eclipse.ui.commands,然后我们可以把这个 Command 放到任何区域,上一小节已经讲到,通过 org.eclipse.ui.menus 扩展点确定菜单创建的区域,最后通过扩展点 org.eclipse.ui.handlers 定义这个 command 的具体行为。

  在创建 Command 时,我们可以先创建一个 Category,并把相关的一些命令放到这个 Category 中,这样有利于管理。代码清单 2 创建一个 Command(“Show in Glossary Explorer”),并放到一个 Category 中,然后把该 Command 放到 BGSearchResultView 视图的上下文菜单中,最后通过扩展 org.eclipse.ui.handlers 定义该 Command 的实现类。

清单 2. 通过 Commands 方式添加菜单项

 

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- 添加 command -->  
< extension  
   point = "org.eclipse.ui.commands" > 
 < category  
   description = "Business Glossary"  
   id = "com.ibm.bg.ui.commands.category"  
   name = "%category.BusinessGlossary.name" > 
 </ category > 
 < command  
   categoryId = "com.ibm.bg.ui.commands.category"  
   description = "Show in Glossary Explorer"  
   id = "com.ibm.bg.ui.commands.BGShowInBrowser"  
   name = "%command.ShowInGE.name" > 
 </ command > 
</ extension > 
<!-- 把 Command 放到界面的对应区域 -->  
< extension  
    point = "org.eclipse.ui.menus" > 
 < menuContribution   locationURI = 
  "popup:com.ibm.bg.internal.ui.search.BGSearchResultView?after=additions" > 
  < command  
      commandId = "com.ibm.bg.ui.commands.BGShowInBrowser"  
      style = "push"  
      tooltip = "%command.ShowInGE.tooltip" > 
  </ command > 
 </ menuContribution > 
</ extension > 
<!-- 定义 command 的实现类 -->  
< extension  
   point = "org.eclipse.ui.handlers" > 
 < handler  
     class = "com.ibm.bg.internal.ui.handlers.BGShowInBrowser"  
     commandId = "com.ibm.bg.ui.commands.BGShowInBrowser" > 
 </ handler > 
</ extension > 

 

  通过 Actions 方式创建菜单项

  正如前面讲到,Actions 方式没有分离界面的表现和内部实现,因此,所有这些均通过 action 来完成。如下代码清单 3 为添加一个 Search 菜单项到 Eclipse 的 Search 主菜单(通过 action 的 menubarPath 指定)中,其中 class 对应的值为该 Action 的实现类,该类需要实现接口 IWorkbenchWindowActionDelegate。

清单 3. 通过 Actions 方式添加菜单项

 

双击代码全选
1
2
3
4
5
6
7
8
9
10
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse 插件开发扩展定义文档,提供给有需要的开发人员。 如下摘录: 视图 标识: org.eclipse.ui.views 描述: 此扩展用来为工作台定义更多视图。视图是工作台页面内的可视组件。通常用来浏览信息的层次结构(例如,工作空间)、打开编辑器或显示活动编辑器的属性。用户可以通过“窗口 > 显示视图”菜单显示视图,也可以从视图局部标题栏关闭视图。 为了减少“显示视图对话框”中的视觉混乱,应使用类别将视图分组。 配置标记: <!ELEMENT extension (category | view | stickyView)*> <!ATTLIST extension point CDATA #REQUIRED id CDATA #IMPLIED name CDATA #IMPLIED> point - 目标扩展的标准标识。 id - 扩展实例的可选标识。 name - 扩展实例的可选名称。 <!ELEMENT category EMPTY> <!ATTLIST category id CDATA #REQUIRED name CDATA #REQUIRED parentCategory CDATA #IMPLIED> id - 将用来标识此类别的唯一名称 name - 将用来在 UI 中表示此类别的可翻译名称 parentCategory - 由以“/”分隔的类别标识组成的可选路径。这样,您就可以创建类别层次结构。 <!ELEMENT view (description?)> <!ATTLIST view id CDATA #REQUIRED name CDATA #REQUIRED category CDATA #IMPLIED class CDATA #REQUIRED icon CDATA #IMPLIED fastViewWidthRatio CDATA #IMPLIED allowMultiple (true | false) > id - 将用来标识此视图的唯一名称 name - 将用来在 UI 中表示此视图的可翻译名称 category - 由以“/”分隔的类别标识组成的可选属性。引用的每个类别都必须在相应的 category 元素中声明。 class - 实现 org.eclipse.ui.IViewPart 的类的标准名称。常用的作法是成为 org.eclipse.ui.part.ViewPart 的子类以继承缺省功能。 icon - 将与视图相关联的图标的相对名称。 fastViewWidthRatio - 视图作为活动快速视图时占用工作台宽度的百分比。这必须定义为浮值且在 0.05 与 0.95 之间浮动。如果未提供任何值,则将使用缺省比率。 allowMultiple - 这是一个标志,用来指示此视图是否允许使用 IWorkbenchPage.showView(String id, String secondaryId) 来创建多个实例。缺省值为 false。 <!ELEMENT description (#PCDATA)> 一个可选的子元素,其主体应该包含为视图提供简短描述的文本。 <!ELEMENT stickyView EMPTY> <!ATTLIST stickyView id CDATA #REQUIRED location (RIGHT|LEFT|TOP|BOTTOM) closeable (true | false) moveable (true | false) > 粘滞视图是这样一种视图:缺省情况下,该视图将出现在所有透视图的一个窗口中,只要该窗口是打开的。它的初始位置是由位置属性管理的,但是用户可以自由移动或关闭它。使用此元素将只会导致创建视图的占位符,它将不会显示视图。请注意,使用此元素应该特别小心,并且只应将此元素应用于真正需要存在于透视图之间的那些视图。起始版本:3.0 id - 要使它成为粘滞视图的视图的标识。 location - 用来指定粘滞视图相对于编辑器区域的位置的可选属性。如果缺少此属性,则视图将放置在编辑器区域的右边。 closeable - 用来指定视图是否应该是可关闭的可选属性。如果缺少此属性,则视图将是可关闭的。 moveable - 用来指定视图是否应该是可移动的可选属性。如果缺少此属性,则视图将是可移动的。 示例: 以下是扩展的示例: <extension point="org.eclipse.ui.views"> <category id="com.xyz.views.XYZviews" name="XYZ"/> <view id="com.xyz.views.XYZView" name="XYZ View" category="com.xyz.views.XYZviews" class="com.xyz.views.XYZView" icon="icons/XYZ.gif"/> </extension> 以下是粘滞视图声明的一个示例: <extension point="org.eclipse.ui.views"> <stickyView id="com.xyz.views.XYZView" /> </extension> API 信息: class 属性的值必须是用来实现 org.eclipse.ui.IViewPart 的类的标准名称。最常见的做法是在开发新视图时成为 org.eclipse.ui.part.ViewPart 的子类。 提供的实现: Eclipse 平台提供了许多标准视图,包括“导航器”、“属性”、“大纲”和“任务”。从用户的角度看,这些视图与插件所提供的任何其他视图没有什么差别。可从“窗口”菜单的“显示视图”子菜单中显示所有视图。视图的位置是持久保存的:当关闭视图时会保存该位置,而在单个会话中重新打开视图时就会恢复它。该位置在各工作台会话之间也是不变的。 Copyright (c) 2002, 2006 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值