Posted on 2008-02-23 10:37
鬼谷子 阅读(1473)
评论(0) 编辑 收藏 所属分类:
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