eclipse平臺允許我們通過插件擴展出另一個插件,與平臺緊密集成為用戶提供更好的體驗,本文將向您闡述如何向視圖和編輯器中添加動作(上下文菜單),并且允許為您自己定義的視圖和編輯器添加其他新的動作。文中的每一個示例將詳細的向您展示每一種不同應用的特征。

上面的圖片顯示了插件中能添加動作的眾多區域:
1、 在視圖和編輯器中添加上下文菜單
2、 在視圖上添加工具欄和下拉菜單
3、 在工作臺窗口的主工具欄和菜單上添加動作
本文將對上面的種種進行演示,并通過實例形式向您詳細講解。
我們假設您有插件開發的基礎,如果想獲得在eclipse平臺上開發插件的更多信息,請閱讀Jim Amsden的入門文章“Your First Plug-in”,該示例的運行結果,請點擊“running the examples”。
在上下文菜單中添加動作
可以在視圖和編輯器的上下文菜單中添加動作并緊密集成,比如,VCM插件在存在的視圖如Navigator或Packages中添加了許多新的動作,對資源進行版本管理.為了在上下文菜單中添加新的動作,eclipse提供了插件點org.eclipse.ui.popupMenus,包括兩種類型的動作,即能添加到視圖或編輯器的上下文菜單中,也能為指定的對象類型添加上下文菜單。下面的三個示例將為您詳細說明。
示例一:為默認的文本編輯器添加新的動作
讓我們看看如何向默認的文本編輯器添加一個動作:
①<viewerContribution
id="org.eclipse.ui.articles.action.contribution.popup.editor"
② targetID="#TextEditorContext">
③ <action
id="org.eclipse.ui.articles.action.contribution.editor.action1"
label="Editor Action 1"
icon="icons/red_dot.gif"
④ menubarPath="additions"
⑤ class="first.plugin.action.ContextMenuAction">
</action>
</viewerContribution>
</extension>
上面的xml向指定編輯器添加了一個上下文菜單,該擴展叫viewerContribution(①),可以用于視圖和編輯器。
targetID屬性(②)指定上下文菜單所依附的目標視圖和編輯器標識符,官方文檔提供了可用的標識符列表,如果您設置的標識符不存在,則上下文菜單不被注冊。一個視圖或編輯器可以有不只一個上下文菜單。
action(③)標記用于定義一個動作,id是該動作的標識符,label和icon表示菜單項的顯示文本和圖標,icon為可選項。menubarPath(④)屬性指定動作菜單項的位置,從上下文菜單的根開始,action將被添加到這里。在本示例中,“additions”其實是org.eclipse.ui.IWorkbenchActionConstants類的一個常量值(MB_ADDITIONS)。添加的動作獨立成組,在上述情況下,如果menubarPath屬性沒有指定,工作臺將首先添加到“additions”組中,如果additions不存在,動作將被添加到上下文菜單的末尾。
class(⑤)屬性是一個菜單項被用戶選中后將要執行的動作的類,如果是編輯器的上下文菜單,該類必須實現org.eclipse.ui.IEditorActionDelegate接口,如果是視圖的上下文菜單,則實現org.eclipse.ui.IViewActionDelegate接口。有一個非常重要的情況就是只有當用戶選擇了菜單項后該類才被工作臺加載,這就意味著很多初始化的邏輯必須在XML文件中描述。一旦該類被工作臺加載,該類將可以控制動作的啟用與禁用。如果動作被選中,將執行run()方法完成需要的功能。
下面是一個典型的實現類:
package first.plugin.action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
public class ContextMenuAction implements IEditorActionDelegate {
@Override
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
}
@Override
public void run(IAction action) {
MessageDialog.openInformation(null, "", "我是上下文菜單");
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
}