天天看點

GEF入門執行個體_總結_03_顯示菜單和工具欄

一、前言

本文承接上一節: 

GEF入門執行個體_總結_02_建立初始RCP空項目

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

二、基礎知識

1.action bar、menubar、coolbar

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

2.菜單在哪裡加

還記得上一節我們建立的類: ApplicationActionBarAdvisor 嗎,這個類繼承自 ActionBarAdvisor。

我們打開 ActionBarAdvisor 源碼,看看它的類注釋:

/**
 * 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.      

翻譯過來就是:

(1) 用于配置工作台視窗的 action bars 的公共基類。

(2) 應用程式應該聲明ActionBarAdvisor的子類和重寫方法,以配置視窗的 action bar 來滿足特定應用程式的需要。

也就是說,我們需要在 ApplicationActionBarAdvisor  類中,通過重寫父類的方法,來填充菜單欄。

3.菜單怎麼加

注意到我們在第一節中為 ApplicationActionBarAdvisor 類重寫了三個方法,就是為這裡準備的。

方法名 作用
makeActions 生成并注冊Action。Action隻有注冊後才能添加到菜單中
fillMenuBar 填充菜單欄。用Action來填充菜單
fillCoolBar 填充工具欄。用Action來填充工具欄

三、準備Action

1、圖檔

請前往GitHub下載下傳源碼,拷貝圖檔到此工程的icons檔案夾下。   傳送門:

GEF入門執行個體_總結_01_教程、源碼、開發環境準備

注:

Eclipse插件開發時,圖檔都預設儲存在icons檔案夾中,請不要修改檔案夾名稱。

2、圖檔常量類 IImageConstant

在包 constant 下建立圖檔常量類 IImageConstant ,用來集中管理程式中用到的圖檔資源。

GEF入門執行個體_總結_03_顯示菜單和工具欄
GEF入門執行個體_總結_03_顯示菜單和工具欄
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

3、DiagramAction

準備一個Action,它的動作就是:點選的時候,打開一個檔案對話框。

建立一個 DiagramAction,

GEF入門執行個體_總結_03_顯示菜單和工具欄
GEF入門執行個體_總結_03_顯示菜單和工具欄
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";

    /**
     * 一、在構造方法中設定基本屬性
     * 
     * @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));

    }




    /**
     * 二、在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();
    }



}      

四、填充菜單和工具欄

1. ApplicationActionBarAdvisor

接下來我們将要重寫 ApplicationActionBarAdvisor  的三個方法來填充菜單和工具欄。

GEF入門執行個體_總結_03_顯示菜單和工具欄
GEF入門執行個體_總結_03_顯示菜單和工具欄
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);
    }

    
}      

2.設定顯示工具欄

在 ApplicationWorkbenchWindowAdvisor 類中的 preWindowOpen方法中有一句 configurer.setShowCoolBar(false);   

将false改為true即可顯示工具欄

ApplicationWorkbenchWindowAdvisor 

GEF入門執行個體_總結_03_顯示菜單和工具欄
GEF入門執行個體_總結_03_顯示菜單和工具欄
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 是什麼鬼。這裡我查了好久,都沒發現是什麼問題,希望讀者能為我解惑!

GEF入門執行個體_總結_03_顯示菜單和工具欄

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

GEF入門執行個體_總結_03_顯示菜單和工具欄

 (3)點選打開之後

GEF入門執行個體_總結_03_顯示菜單和工具欄

六、異常

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

(1)異常現象

運作程式後,發現多出了Run、Search菜單項

(2)異常解決

參考資料:

Remove Eclipse’s top menus

添加如下擴充點可隐藏Run菜單

GEF入門執行個體_總結_03_顯示菜單和工具欄
GEF入門執行個體_總結_03_顯示菜單和工具欄
<extension
         point="org.eclipse.ui.perspectiveExtensions">
      <perspectiveExtension
            targetID="gef.tutorial.step.perspective">
         <hiddenMenuItem
               id="org.eclipse.ui.run">
         </hiddenMenuItem>
      </perspectiveExtension>
   </extension>      
GEF入門執行個體_總結_03_顯示菜單和工具欄

繼續閱讀