扩展Eclipse视图弹出菜单 - 路大侠

时间:2024-02-22 13:21:17

扩展Eclipse视图弹出菜单

 

转自:http://cnfree2000.spaces.live.com/blog/cns!6201144F025F9D77!426.entry

Eclipse里每种编辑器都有它自己的视图,有时候我们需要在上面添加自己的功能,扩充视图弹出菜单则是必不可少的工作之一。

在一个视图的Popup Menu里增加一个菜单项,含有2种方式:

1、viewerContribution,也就是通过视图的id。这样只有视图id和给定的id一致的时候,它的弹出菜单才会增加我们定义的菜单项。

2、objectContribution,通过对象类型。当在视图里选定的对象类型和给定的一致时,在视图的弹出菜单增加我们定义的菜单项。

菜单项的Action需要继承org.eclipse.ui.actions.ActionDelegate,然后实现特殊的View的ActionDelegate接口。比如要扩展Java编辑器:

public class FinderActionDelegate extends ActionDelegate implements
        IEditorActionDelegate {

来看看插件的Plugin.xml的组成部分:

viewerContribution形式:
   <extension
         point="org.eclipse.ui.popupMenus">
      <viewerContribution
            targetID="#TextEditorContext"
            id="com.cnfree.finder.editor">
         <action
               label="查找最大ID"
               icon="icon/search.gif"
               helpContextId="com.cnfree.finder.finderaction"
               class="com.cnfree.finder.FinderActionDelegate"
               menubarPath="additions"
               enablesFor="+"
               id="com.cnfree.finder">
         </action>
      </viewerContribution>
      <viewerContribution
            targetID="#CompilationUnitEditorContext"
            id="com.cnfree.finder.editor">
         <action
               label="查找最大ID"
               icon="icon/search.gif"
               helpContextId="com.cnfree.finder.finderaction"
               class="com.cnfree.finder.FinderActionDelegate"
               menubarPath="additions"
               enablesFor="*"
               id="com.cnfree.finder">
         </action>
      </viewerContribution>
   </extension> < br />   <extension
         point="org.eclipse.ui.editorActions">
   </extension>

这里我们需要知道扩展的视图它的菜单项在Eclipse插件注册表里定义的id(稍后我会附上Eclipse插件菜单项ID注册表)。比如Java编辑器对应的ID为:
#TextEditorContext 和 #CompilationUnitEditorContext,我们定义好 targetID,就把我们的插件id指向视图菜单的id了。这样Java编辑器就会添加我们的菜单项了。

<!ATTLIST action
   id            CDATA #REQUIRED
   label         CDATA #REQUIRED
   menubarPath   CDATA #IMPLIED
   toolbarPath   CDATA #IMPLIED
   icon          CDATA #IMPLIED
   disabledIcon  CDATA #IMPLIED
   hoverIcon     CDATA #IMPLIED
   tooltip       CDATA #IMPLIED
   helpContextId CDATA #IMPLIED
   style         (push|radio|toggle) "push"
   state         (true | false) 
   class         CDATA #REQUIRED
   enablesFor    CDATA #IMPLIED>
< br />此元素定义用户可在用户界面中调用的操作。


  • id - 用作此操作的引用的唯一标识。 
  • label - 用作菜单项文本或工具栏按钮标签的可翻译名称。此名称可包括助记符信息。
  • menubarPath - 用来指定下拉菜单中此操作位置的以斜杠(“/”)定界的路径。路径中的每个标记(最后一个标记除外)都必须表示层次结构中现有菜单的有效标识。最后一个标记表示要将操作添加到其中的命名组。如果省略了路径,则此操作将不会出现在下拉菜单中。 
  • toolbarPath - 目标视图的本地工具栏内的命名组。如果该组不存在,则将创建它。如果省略该项,则操作将不会出现在本地工具栏中。 
  • icon - 用来在操作的上下文中可视地表示操作的图标的相对路径。如果省略该项且操作出现在工具栏中,则“工作台”将使用占位符图标。该路径是相对于添加插件的 plugin.xml 文件的位置的。图标将出现在工具栏中,但是不会出现在下拉菜单中。
  • disabledIcon - 当禁用操作时,用于在操作的上下文中可视地表示操作的图标的相对路径。如果省略该项,则正常图标将变灰。该路径是相对于添加插件的 plugin.xml 文件的位置的。禁用的图标将出现在工具栏中,但是不会出现在下拉菜单中。
  • hoverIcon - 当鼠标指针位于操作上时,用来在操作的上下文中可视地表示操作的图标的相对路径。如果省略此项,则将使用正常图标。该路径是相对于添加插件的 plugin.xml 文件的位置的。
  • tooltip - 表示操作的工具提示的可翻译文本。仅当操作出现在工具栏中时才使用。
  • helpContextId - 一个指示此操作的帮助上下文的唯一标识。如果操作作为菜单项出现,则在突出显示该菜单项时按 F1 键将显示帮助。
  • style - 用来定义操作的用户界面样式类型的可选属性。如果定义了此项,则属性值将是下列其中一项: 
       push - 作为普通菜单项或工具项。 
       radio - 作为单选样式菜单项或工具项。同一菜单或工具栏组内具有单选样式的操作相当于单选按钮集。初始值由 state 属性指定。
       toggle - 作为复选样式菜单项或切换工具项。初始值由 state 属性指定。 
  • state - 指示初始状态(true 或 false)的可选属性,当 style 属性具有值 radio 或 toggle 时使用。
  • class - 实现 org.eclipse.ui.IViewActionDelegate 的标准类的名称。
  • enablesFor - 指示必须满足才能启用操作的选择计数的值。如果指定了此属性并且满足条件,则启用操作。如果条件不满足,则禁用操作。如果没有指定任何属性,则对选择了任意数目的项启用操作。下列属性格式受支持: ! - 选择了零项  
       ? - 选择了零项或一项  
       + - 选择了一项或多项 
       multiple, 2+ - 选择了两项或多项 
       n - 选择了精确数目的项。例如:nablesFor=" 4" 仅当选择了 4 个项时才启用操作。 
       * - 选择了任意数目的项

objectContribution形式:

   <objectContribution objectClass="com.cnfree.action.IOpenable" >
      <action
            id="com.cnfree.open"
            menubarPath="new.ext"
            definitionID="com.cnfree.open.selection"
            label="&Open@Ctrl+O"
            tooltip="Open the selected item(s)"
            helpContextId="com.cnfree.open.selection"
            icon="icon/open.gif"
            class="com.cnfree.action.Op enSelectedActionDelegate"
            enablesFor="+">
      </action>
   </objectContribution>

action Open实现了IOpenable,这样就意味着,所有包含了IOpenable对象的视图,当我们选中其中的IOpenable对象时,它的弹出菜单都会增加我们自定义的菜单项。

附带的例子:
cnfree editor plugin

使用说明:建立一个Java文件,在它的注释里添加 xxx.yyy ,xxx为一个类名,yyy为一个三位数ID,比如cnfee.100,cnfree.101,cnfree.102,在Java透视图里打开这个Java文件,右键菜单会有一个选项:查找最大ID,打开后输入cnfree,它就会自动找到cnfree.102,并将该字符串高亮显示。

Eclipse插件菜单ID注册表参考:http://www.jdg2e.com/ch21.actions.table/doc/

参考资料:
http://www.eclipsesource.com/EN_ARCHIVE/etips_07072004.html 
Eclipse帮助:org.eclipse.platform.doc.isv/guide/workbench_basicext_popupMenus.htm