GEF入門實例_總結_03_顯示菜單和工具欄

1、前言

本文承接上一節: GEF入門實例_總結_02_新建初始RCP空項目html

這一節,咱們來給咱們的插件加上菜單。app

 

2、基礎知識

1.action bar、menubar、coolbar

  含義
action bar 操做條
action 動做。單擊菜單、工具欄圖標按鈕或者按鍵時執行某項處理
menubar 菜單欄
coolbar 工具欄

 

 

2.菜單在哪裏加

還記得上一節咱們新建的類: 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

 

3.菜單怎麼加

注意到咱們在第一節中爲 ApplicationActionBarAdvisor 類重寫了三個方法,就是爲這裏準備的。ui

 

方法名 做用
makeActions 生成並註冊Action。Action只有註冊後才能添加到菜單中
fillMenuBar 填充菜單欄。用Action來填充菜單
fillCoolBar 填充工具欄。用Action來填充工具欄

 

3、準備Action

一、圖片

請前往GitHub下載源碼,拷貝圖片到此工程的icons文件夾下。   傳送門:GEF入門實例_總結_01_教程、源碼、開發環境準備this

注:

Eclipse插件開發時,圖片都默認保存在icons文件夾中,請不要修改文件夾名稱。

 

二、圖片常量類 IImageConstant

在包 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";
    

}
View Code

 

 

三、DiagramAction

準備一個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();
    }



}
View Code

 

4、填充菜單和工具欄

1. ApplicationActionBarAdvisor

接下來咱們將要重寫 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);
    }

    
}
View Code

 

 

2.設置顯示工具欄

在 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$
    }
}
View Code

 

5、效果圖

(1)如今運行程序,看到菜單欄File、Help ,已經加上去了,工具欄也加上去了。

可是 Run、Search 是什麼鬼。這裏我查了很久,都沒發現是什麼問題,但願讀者能爲我解惑!

 

 

 

(2)點擊 子菜單diagram 出現下圖文本對話框。

 

 (3)點擊打開以後

 

 

6、異常

1.多出來的Run、Search菜單項

(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>
View Code

 

相關文章
相關標籤/搜索