本文承接上一节: GEF入门实例_总结_02_新建初始RCP空项目
这一节,我们来给我们的插件加上菜单。
| 含义 |
---|---|
action bar | 操作条 |
action | 动作。单击菜单、工具栏图标按钮或者按键时执行某项处理 |
menubar | 菜单栏 |
coolbar | 工具栏 |
还记得上一节我们新建的类: 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 类中,通过重写父类的方法,来填充菜单栏。
注意到我们在第一节中为 ApplicationActionBarAdvisor 类重写了三个方法,就是为这里准备的。
方法名 | 作用 |
---|---|
makeActions | 生成并注册Action。Action只有注册后才能添加到菜单中 |
fillMenuBar | 填充菜单栏。用Action来填充菜单 |
fillCoolBar | 填充工具栏。用Action来填充工具栏 |
请前往GitHub下载源码,拷贝图片到此工程的icons文件夹下。 传送门:GEF入门实例_总结_01_教程、源码、开发环境准备
注:
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";
/**
* 一、在构造方法中设置基本属性
*
* @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();
}
}
接下来我们将要重写 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>