zoukankan      html  css  js  c++  java
  • 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 ,用来集中管理程序中用到的图片资源。

    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,

    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();
        }
    
    
    
    }
    View Code

    四、填充菜单和工具栏

    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

    五、效果图

    (1)现在运行程序,看到菜单栏File、Help ,已经加上去了,工具栏也加上去了。

    但是 Run、Search 是什么鬼。这里我查了好久,都没发现是什么问题,希望读者能为我解惑!

    (2)点击 子菜单diagram 出现下图文本对话框。

     (3)点击打开之后

    六、异常

    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

  • 相关阅读:
    【原创】NOR FLASH Block Unprotection
    虚拟机:Snapshot
    Struts2:简单登陆验证DAO VO ACTION
    Cocos2dx:安装
    LoadRunner:Socket+Http协议
    LoadRunner中添加外部文件(md5.h),使用MD5
    Javascript实现网页水印(非图片水印)
    ASP.NET网站限制访问频率
    再谈“ASP.NET网站限制恶意访问”
    【新闻】“赢在淘宝”b比赛 30强、10强火热出炉~!
  • 原文地址:https://www.cnblogs.com/shirui/p/9154700.html
Copyright © 2011-2022 走看看