轉自: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,然后實現(xiàn)特殊的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 - 用來指定下拉菜單中此操作位置的以斜杠(“/”)定界的路徑。路徑中的每個標記(最后一個標記除外)都必須表示層次結構中現(xiàn)有菜單的有效標識。最后一個標記表示要將操作添加到其中的命名組。如果省略了路徑,則此操作將不會出現(xiàn)在下拉菜單中。
- toolbarPath - 目標視圖的本地工具欄內的命名組。如果該組不存在,則將創(chuàng)建它。如果省略該項,則操作將不會出現(xiàn)在本地工具欄中。
- icon - 用來在操作的上下文中可視地表示操作的圖標的相對路徑。如果省略該項且操作出現(xiàn)在工具欄中,則“工作臺”將使用占位符圖標。該路徑是相對于添加插件的 plugin.xml 文件的位置的。圖標將出現(xiàn)在工具欄中,但是不會出現(xiàn)在下拉菜單中。
- disabledIcon - 當禁用操作時,用于在操作的上下文中可視地表示操作的圖標的相對路徑。如果省略該項,則正常圖標將變灰。該路徑是相對于添加插件的 plugin.xml 文件的位置的。禁用的圖標將出現(xiàn)在工具欄中,但是不會出現(xiàn)在下拉菜單中。
- hoverIcon - 當鼠標指針位于操作上時,用來在操作的上下文中可視地表示操作的圖標的相對路徑。如果省略此項,則將使用正常圖標。該路徑是相對于添加插件的 plugin.xml 文件的位置的。
- tooltip - 表示操作的工具提示的可翻譯文本。僅當操作出現(xiàn)在工具欄中時才使用。
- helpContextId - 一個指示此操作的幫助上下文的唯一標識。如果操作作為菜單項出現(xiàn),則在突出顯示該菜單項時按 F1 鍵將顯示幫助。
- style - 用來定義操作的用戶界面樣式類型的可選屬性。如果定義了此項,則屬性值將是下列其中一項:
push - 作為普通菜單項或工具項。
radio - 作為單選樣式菜單項或工具項。同一菜單或工具欄組內具有單選樣式的操作相當于單選按鈕集。初始值由 state 屬性指定。
toggle - 作為復選樣式菜單項或切換工具項。初始值由 state 屬性指定。
- state - 指示初始狀態(tài)(true 或 false)的可選屬性,當 style 屬性具有值 radio 或 toggle 時使用。
- class - 實現(xiàn) org.eclipse.ui.IViewActionDelegate 的標準類的名稱。
- enablesFor - 指示必須滿足才能啟用操作的選擇計數(shù)的值。如果指定了此屬性并且滿足條件,則啟用操作。如果條件不滿足,則禁用操作。如果沒有指定任何屬性,則對選擇了任意數(shù)目的項啟用操作。下列屬性格式受支持: ! - 選擇了零項
? - 選擇了零項或一項
+ - 選擇了一項或多項
multiple, 2+ - 選擇了兩項或多項
n - 選擇了精確數(shù)目的項。例如:nablesFor=" 4" 僅當選擇了 4 個項時才啟用操作。
* - 選擇了任意數(shù)目的項
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實現(xiàn)了IOpenable,這樣就意味著,所有包含了IOpenable對象的視圖,當我們選中其中的IOpenable對象時,它的彈出菜單都會增加我們自定義的菜單項。
附帶的例子:
cnfree editor plugin
使用說明:建立一個Java文件,在它的注釋里添加 xxx.yyy ,xxx為一個類名,yyy為一個三位數(shù)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