本文承接上一節: GEF入門實例_總結_02_新建初始RCP空項目html
這一節,咱們來給咱們的插件加上菜單。app
含義 | |
action bar | 操做條 |
action | 動做。單擊菜單、工具欄圖標按鈕或者按鍵時執行某項處理 |
menubar | 菜單欄 |
coolbar | 工具欄 |
還記得上一節咱們新建的類: ApplicationActionBarAdvisor 嗎,這個類繼承自 ActionBarAdvisor。eclipse
咱們打開 ActionBarAdvisor 源碼,看看它的類註釋:ide
/** * Public base class for configuring the action bars of a workbench window. * <p> * An application should declare a subclass of <code>ActionBarAdvisor</code> * and override methods to configure a window's action bars to suit the needs of the * particular application.
翻譯過來就是:wordpress
(1) 用於配置工做臺窗口的 action bars 的公共基類。函數
(2) 應用程序應該聲明ActionBarAdvisor的子類和重寫方法,以配置窗口的 action bar 來知足特定應用程序的須要。工具
也就是說,咱們須要在 ApplicationActionBarAdvisor 類中,經過重寫父類的方法,來填充菜單欄。post
注意到咱們在第一節中爲 ApplicationActionBarAdvisor 類重寫了三個方法,就是爲這裏準備的。ui
方法名 | 做用 |
makeActions | 生成並註冊Action。Action只有註冊後才能添加到菜單中 |
fillMenuBar | 填充菜單欄。用Action來填充菜單 |
fillCoolBar | 填充工具欄。用Action來填充工具欄 |
請前往GitHub下載源碼,拷貝圖片到此工程的icons文件夾下。 傳送門:GEF入門實例_總結_01_教程、源碼、開發環境準備this
注:
Eclipse插件開發時,圖片都默認保存在icons文件夾中,請不要修改文件夾名稱。
在包 constant 下新建圖片常量類 IImageConstant ,用來集中管理程序中用到的圖片資源。
package gef.tutorial.step.constant; public interface IImageConstant { public static final String EDITORTITLE = "icons/example.gif"; public static final String NEWHELLOMODEL = "icons/newModel.gif"; public static final String NEWCONNECTION = "icons/newConnection.gif"; public static final String ARROWCONNECTION = "icons/arrowConnection.gif"; }
準備一個Action,它的動做就是:點擊的時候,打開一個文件對話框。
新建一個 DiagramAction,
package gef.tutorial.step.action; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.IWorkbenchWindow; import gef.tutorial.step.app.Activator; import gef.tutorial.step.constant.IImageConstant; /** * DiagramAction * * @author shirayner * */ public class DiagramAction extends Action { private final IWorkbenchWindow window; public final static String ID = "gef.tutorial.step.action.DiagramAction"; /** * 1、在構造方法中設置基本屬性 * * @param window */ public DiagramAction(IWorkbenchWindow window) { this.window = window; //1.定義該Action的ID. 每個Action須要一個惟一的ID號 setId(ID); //2.設置該Action的文字。該文字也就是菜單上的文字。"@ALT+D"用來設置該Action的快捷鍵 setText("&Diagram@ALT+D"); //3.設置工具欄的提示文本 setToolTipText("Draw the GEF diagram."); //4.設置該Action的圖片。該方法使用 AbstractUIPlugin 抽象類的 imageDescriptorFromPlugin() 方法快捷地獲取圖像。 //imageDescriptorFromPlugin()方法須要兩個參數:項目ID、圖片文件名。 setImageDescriptor(Activator.imageDescriptorFromPlugin( Activator.PLUGIN_ID, IImageConstant.EDITORTITLE)); } /** * 2、在Run方法中設置要執行的動做。 * 單擊菜單、工具欄圖標按鈕或者按鍵時會執行Action的run方法 * */ @Override public void run() { String path = openFileDialog(); if (path != null) { //彈出一個對話框 MessageDialog.openInformation(window.getShell(), "舒適提示", "文件保存路徑爲:"+path); } } /** 打開一個文件對話框 * * @return * String 文件路徑 */ private String openFileDialog(){ FileDialog dialog = new FileDialog(window.getShell(),SWT.OPEN); dialog.setText("文件保存到"); dialog.setFilterExtensions(new String[] { ".diagram" }); return dialog.open(); } }
接下來咱們將要重寫 ApplicationActionBarAdvisor 的三個方法來填充菜單和工具欄。
package gef.tutorial.step.app; import org.eclipse.jface.action.ICoolBarManager; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.swt.SWT; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import gef.tutorial.step.action.DiagramAction; public class ApplicationActionBarAdvisor extends ActionBarAdvisor { private IWorkbenchAction exitAction; private IWorkbenchAction aboutAction; private DiagramAction diagramAction; public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) { super(configurer); } /** * 1.生成並註冊Action。Action只有註冊後才能添加到菜單中。 * */ @Override protected void makeActions(IWorkbenchWindow window) { //退出 exitAction = ActionFactory.QUIT.create(window); register(exitAction); //關於 aboutAction = ActionFactory.ABOUT.create(window); register(aboutAction); //繪圖 diagramAction = new DiagramAction(window); register(diagramAction); } /** * 2.填充菜單欄。用Action來填充菜單 * * (1) 菜單管理器負責管理菜單項、設置菜單行爲、建立級聯菜單或者對菜單項進行分組。 * (2) MenuManager構造函數:菜單項文本、菜單項ID * (3) new Separator() 爲一條分割線 */ @Override protected void fillMenuBar(IMenuManager menuBar) { //(1)一級菜單 File MenuManager fileMenuManager= new MenuManager("File", "fileMenuManager"); //加入繪圖動做,是葉子節點菜單,也是二級菜單。點擊以後將執行Action的run方法 fileMenuManager.add(diagramAction); //加入分隔符 fileMenuManager.add(new Separator()); //加入退出動做 fileMenuManager.add(exitAction); //(2)一級菜單 Help MenuManager helpMenuManager = new MenuManager("Help", "helpMenuManager"); helpMenuManager.add(aboutAction); //加入二級菜單 helpMenuManager.add(fileMenuManager); //(3)將菜單加入菜單欄 menuBar.add(fileMenuManager); menuBar.add(helpMenuManager); } /** * 3.填充工具欄。用Action來填充工具欄 * (1) 工具欄默認是不顯示。在 ApplicationWorkbenchWindowAdvisor 類中的 * preWindowOpen方法中有一句 configurer.setShowCoolBar(false);將false改成true便可顯示工具欄 * (2) 工具欄管理器負責工具欄的分類管理 * (3) SWT.FLAT將工具欄設置成平滑方式,SWT.SHADOW_OUT用於在工具欄和菜單欄之間加一條分割線 * */ @Override protected void fillCoolBar(ICoolBarManager coolBar) { //1.生成工具欄 ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT | SWT.SHADOW_OUT); //2.將工具放入工具欄 toolBarManager.add(diagramAction); //3.將工具欄放入 coolBar.add(toolBarManager); } }
在 ApplicationWorkbenchWindowAdvisor 類中的 preWindowOpen方法中有一句 configurer.setShowCoolBar(false);
將false改成true便可顯示工具欄
ApplicationWorkbenchWindowAdvisor
package gef.tutorial.step.app; import org.eclipse.swt.graphics.Point; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { super(configurer); } @Override public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { return new ApplicationActionBarAdvisor(configurer); } @Override public void preWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); //1.設置窗口初始化大小 configurer.setInitialSize(new Point(700, 550)); //2.顯示工具欄 configurer.setShowCoolBar(true); //3.不顯示狀態欄 configurer.setShowStatusLine(false); //4.設置窗口標題 configurer.setTitle("GEF入門實例"); //$NON-NLS-1$ } }
(1)如今運行程序,看到菜單欄File、Help ,已經加上去了,工具欄也加上去了。
可是 Run、Search 是什麼鬼。這裏我查了很久,都沒發現是什麼問題,但願讀者能爲我解惑!
(2)點擊 子菜單diagram 出現下圖文本對話框。
(3)點擊打開以後
(1)異常現象
運行程序後,發現多出了Run、Search菜單項
(2)異常解決
參考資料:Remove Eclipse’s top menus
添加以下擴展點可隱藏Run菜單
<extension point="org.eclipse.ui.perspectiveExtensions"> <perspectiveExtension targetID="gef.tutorial.step.perspective"> <hiddenMenuItem id="org.eclipse.ui.run"> </hiddenMenuItem> </perspectiveExtension> </extension>