RCP菜单栏,工具栏实现方法及RCP记事本例子
file->new->other->plug-ins project,创建一个名为org.test.menuAndToolbar的工程:
选择创建RCP hello world 模板的项目,点击finish完成创建项目:
点击plugin.xml文件,打开extensions页:
可以看到,Extentions本来已经有两个扩展包含在里面了,现在我们要添加一个actionSets扩展,点击“add”按钮,添加org.eclipse.ui.actionSets:
添加进org.eclipse.ui.actionSets后会默认有一个actionSet,要把它的visible设置为true,一定要设置为true,否则看不到菜单栏:
给menu新建一个separator,命名为separator1:
在label(actionSet)上右键新建一个action:
这个action的Label设置为“打开”,menubarPath设置为:org.test.menuAndToolbar.menu1/separator1。Class设置为:actions.OpenFileAction。
设置好以后点击class超链接,会提示新建一个类,选择默认设置,直接点击finish:
这个类会默认实现IWorkbenchWindowActionDelegate接口,具体代码如下:
package actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class OpenFileAction implements IWorkbenchWindowActionDelegate {
@Override
public void run(IAction action) {
// TODO Auto-generated method stub
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void init(IWorkbenchWindow window) {
// TODO Auto-generated method stub
}
}
点击“打开”菜单时,将会触发run(IAction action) 函数的事件,我们可以修改它的代码查看点击效果:
public void run(IAction action) {
// TODO Auto-generated method stub
MessageDialog.openInformation(null, "测试 ", "点击了打开菜单");
}
为了更好的表示菜单,可以再给label(actionSet)右键添加一个action,命名为“退出”,添加的步骤跟上面“打开”一样。修改退出action中的run方法:
@Override
public void run(IAction action) {
// TODO Auto-generated method stub
//RCP程序退出代码
PlatformUI.getWorkbench().getActiveWorkbenchWindow().close();
}
点击overview中的launch an eclipse application查看效果:
我们添加菜单项的顺序是先添加“打开”再添加“退出”,但是这里却显示退出在打开上方,实际上菜单在定义时应该将其设置为与出现的顺序相反。(可以在extensions中使用up ,down按钮调整他们的顺序)。
一个很简单的方法,就是把刚才所设置的菜单栏的菜单项显示成工具栏上。只需要在extensions中将各个action的toolbarPath属性设置成additions(它是Eclipse内置的标准工具栏插入点),不过创建的RCP工程默认是不显示工具栏的,所以我们要先在ApplicationWorkbenchWindowAdvisor.java文件里先吧setShowCoolBar设置成true
configurer.setShowCoolBar(true);
设置好以后可以运行查看效果:
上面“退出”、“打开”在同一个actionSet中,所以他们在工具栏里显示在同一组中,而“工具”action在另一个新建的actionSet中。工具栏的按钮可以不显示在菜单栏中,只要设置menubarPath设置为空的就可以了。
在extensions中add进org.eclipse.ui.commands扩展,如下图:
New一个command,name设置为“测试工具栏”,其它默认:
把org.eclipse.ui.handlers中默认有的一个handler的commandId设置为:org.test.menuAndToolbar.command1,即为刚才添加的command的ID:
设置它的class为:commands.Command1。点击class超链接,创建这个类,并让它继承AbstractHandler。得到Command1代码如下:
package commands;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.handlers.HandlerUtil;
public class Command1 extends AbstractHandler implements IHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
// TODO Auto-generated method stub
return null;
}
}
点击这个工具栏的时候将触发excute函数,所以可以在里面添加一个提示信息查看效果:
public Object execute(ExecutionEvent event) throws ExecutionException {
// TODO Auto-generated method stub
MessageDialog.openInformation(HandlerUtil.getActiveShell(event), "测试", "测试command");
return null;
}
在org.eclipse.ui.menus上右键new一个menuContribution,它的locationURI设置为:menu:org.eclipse.ui.main.menu (它是eclipse标准菜单扩展位置),然后在它上面右键新建menu:
这个menu的name和ID可以自定义设置,这里我们设置成:
然后在测试菜单栏上右键新建command,将它的ID指向刚才在commands扩展下建的command1即可(将commandId设置为command1的ID):
到这里我们已经完成了菜单栏的创建。但是我们还可以把command1添加到工具栏上。它的步骤为:
在org.eclipse.ui.menus扩展上右键new一个menuContribution,将它的locationURI设置为:toolbar:org.eclipse.ui.main.toolbar(它是eclipse的标准工具栏扩展位置)。
在它上面右键new一个toolbar,id可以自定义。然后在这个toolbar上new一个command,将它的commandId指向刚才创建的comman1的ID即可:
到这里我们可以运行调试,可以看到用以上两种方法创建的菜单栏和工具栏都显示在RCP程序上:
为了综合的理解和使用菜单栏和工具栏,特意写了一个RCP记事本工具,它能够打开txt文本,能够搜索字符串,能够进行编辑,能够保存编辑后的文件,它也使用了text,list,radio button等常用控件。
使用了左右两边布局的最常见的布局方式,viewpart布局的设置文件在perspective.java文件中,我的程序代码如下:
public void createInitialLayout(IPageLayout layout) {
layout.setEditorAreaVisible(false);
String editArea=layout.getEditorArea();
layout.addView(FirstView.ID, IPageLayout.LEFT, 0.25f, editArea);
layout.addView(TextEditor.ID, IPageLayout.RIGHT, 0.75f, editArea);
}
不同viewpart之间可以互相调用一些方法,比如我在“工作区”这个viewpart里面想要调用“编辑区”的东西,可以使用下面的方法:
IViewPart findView = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("views.TextEditor");
TextEditor textEditor=(TextEditor)findView;
int index = textEditor.getEditorText().indexOf(text.getText());
其中,getEditorText()为“编辑区”viewPart中定义的方法。
打开文件:
搜索字符串,点击list中记录的下标可以使查找的字符串选择显示:
保存文件: