一个系统包含的操作都是很多的,这里我总结一下我使用过的三类操作
1.一类是标准的系统内置的操作,可以直接使用的操作,下面从左到右依次是打开透视图,打开快速视图,打开视图,打开视图操作
2.一类是自定义的普通的操作类,任何时候它都可以看到(并不代表它一定是可以触发的),一般可以将之同时设置到菜单栏和工具栏
例如这里的打开导航视图和打开搜索视图的工具栏操作按钮
3.另一个类是操作的代理类,它可以绑定到某一个特定的编辑器Editor上(EditorAction),或者是视图View上(ViewAction),它一般是不可复用的,它只是针对某个特定的对象
例如这里的Edit菜单项,它只在右侧出现了病人信息管理时才有
实例一:标准操作,这些内容在ApplicationActionBarAdvisor 类中都有定义,因为这个类就是专门用来定义Action的
这些操作的实现一般都是,首先通过ActionFactory创建,然后注册这个action(注:打开视图列表的action不用注册,注册会报错)
// 定义“打开透视图”操作
perspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
register(perspectiveAction);
perspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
register(perspectiveAction);
package com.yinger.patientims;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import com.yinger.patientims.actions.OpenExpenseInfoViewAction;
import com.yinger.patientims.actions.OpenNavigatorViewAction;
import com.yinger.patientims.actions.OpenPatientInfoViewAction;
import com.yinger.patientims.actions.OpenSearchViewAction;
/**
* Public base class for configuring the action bars of a workbench window.
* 该类继承了ActionBarAdvisor类,负责创建RCP应用程序窗体的菜单,工具栏,状态栏等等 以及添加相应的操作
*
* 重要的方法: 1.makeActions(IWorkbenchWindow window):填充方法 2.fillMenuBar(IMenuManager
* menuBar):填充主菜单栏 3.fillCoolBar(ICoolBarManager coolBarManager):填充工具栏
* 4.fillStatusLine(IStatusLineManager statusLineManager):填充状态栏
* 5.isApplicationMenu():返回是否是给定窗体的给定菜单的ID的应用程序菜单
*/
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction newWindowAction;
private IWorkbenchAction exitAction;
private IWorkbenchAction perspectiveAction;
private IWorkbenchAction aboutAction;
private IContributionItem showViewAction;
private OpenNavigatorViewAction openNavigatorViewAction;
private OpenPatientInfoViewAction openPatientInfoViewAction;
private OpenExpenseInfoViewAction openExpenseInfoViewAction;
private OpenSearchViewAction openSearchViewAction;
private IWorkbenchAction preferenceAction;
// 这个构造方法在 ApplicationWorkbenchWindowAdvisor类中调用
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
// 这个方法很重要,用于设置窗体中的操作
protected void makeActions(IWorkbenchWindow window) {
// ActionFactory:工作台操作工厂对象 Access to standard actions provided by
// the workbench.
// ActionFactory.OPEN_NEW_WINDOW :具体化了的用于创建“新建窗口”操作的操作工厂对象
// 定义“新建窗口”操作
newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
newWindowAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_DEF_VIEW));
// 注册操作
register(newWindowAction);
// 定义“退出”操作
exitAction = ActionFactory.QUIT.create(window);
exitAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
register(exitAction);
// 定义“打开透视图”操作
perspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
register(perspectiveAction);
// 定义“关于”操作
aboutAction = ActionFactory.ABOUT.create(window);
// aboutAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
aboutAction.setImageDescriptor(Activator.getImageDescriptor("/icons/small/about.gif"));
register(aboutAction);
// 定义“显示视图列表”操作
showViewAction = ContributionItemFactory.VIEWS_SHORTLIST.create(window);
// ((IAction) showViewAction).setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_ELEMENT));
// register(showViewAction); //注意,这类视图不用注册,register方法会报错!
// 定义打开“首选项”操作
preferenceAction = ActionFactory.PREFERENCES.create(window);
// preferenceAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ETOOL_HOME_NAV));
preferenceAction.setImageDescriptor(Activator.getImageDescriptor("/icons/Home.ico"));
register(preferenceAction);
// 自定义的操作类,分别用来打开相应的视图
openNavigatorViewAction = new OpenNavigatorViewAction(window);
openExpenseInfoViewAction = new OpenExpenseInfoViewAction(window);
openPatientInfoViewAction = new OpenPatientInfoViewAction(window);
openSearchViewAction = new OpenSearchViewAction(window);
}
protected void fillMenuBar(IMenuManager menuBar) {
// IWorkbenchActionConstants:Action ids for standard actions, groups
// in the workbench menu bar, and global actions.
// 定义File菜单
MenuManager fileManager = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
// 在File菜单中添加退出菜单项
fileManager.add(exitAction);
// 添加File菜单到菜单栏
menuBar.add(fileManager);
// Window菜单
MenuManager windowManager = new MenuManager("&Window", IWorkbenchActionConstants.M_WINDOW);
windowManager.add(newWindowAction);
windowManager.add(perspectiveAction);
windowManager.add(preferenceAction);
// Window菜单的子菜单Show View菜单,创建二级菜单
MenuManager showViewManager = new MenuManager("&Show View", "showView");
// showViewManager.add(openExpenseInfoViewAction);
// showViewManager.add(openNavigatorViewAction);
// showViewManager.add(openPatientInfoViewAction);
// showViewManager.add(openSearchViewAction);
// 包含一个“other”,用于打开未显示的视图
//TODO:很奇怪的是 show view会自己显示一部分的view,这些view是当前的窗口已经显示出来的view
showViewManager.add(showViewAction);
windowManager.add(showViewManager);
menuBar.add(windowManager);
// Help菜单
MenuManager helpManager = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
helpManager.add(aboutAction);
menuBar.add(helpManager);
}
@Override
protected void fillCoolBar(ICoolBarManager coolBar) {
// Creates a tool bar manager with the given SWT [button style]
IToolBarManager toolbar1 = new ToolBarManager(coolBar.getStyle());
// 在这个toolbar上面添加一个操作按钮
toolbar1.add(openNavigatorViewAction);
// 把这个toolbar添加到coolbar上面
coolBar.add(toolbar1);
IToolBarManager toolbar2 = new ToolBarManager(coolBar.getStyle());
toolbar2.add(openSearchViewAction);
coolBar.add(toolbar2);
IToolBarManager toolbar3 = new ToolBarManager(coolBar.getStyle());
toolbar3.add(perspectiveAction);
coolBar.add(toolbar3);
}
}
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import com.yinger.patientims.actions.OpenExpenseInfoViewAction;
import com.yinger.patientims.actions.OpenNavigatorViewAction;
import com.yinger.patientims.actions.OpenPatientInfoViewAction;
import com.yinger.patientims.actions.OpenSearchViewAction;
/**
* Public base class for configuring the action bars of a workbench window.
* 该类继承了ActionBarAdvisor类,负责创建RCP应用程序窗体的菜单,工具栏,状态栏等等 以及添加相应的操作
*
* 重要的方法: 1.makeActions(IWorkbenchWindow window):填充方法 2.fillMenuBar(IMenuManager
* menuBar):填充主菜单栏 3.fillCoolBar(ICoolBarManager coolBarManager):填充工具栏
* 4.fillStatusLine(IStatusLineManager statusLineManager):填充状态栏
* 5.isApplicationMenu():返回是否是给定窗体的给定菜单的ID的应用程序菜单
*/
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction newWindowAction;
private IWorkbenchAction exitAction;
private IWorkbenchAction perspectiveAction;
private IWorkbenchAction aboutAction;
private IContributionItem showViewAction;
private OpenNavigatorViewAction openNavigatorViewAction;
private OpenPatientInfoViewAction openPatientInfoViewAction;
private OpenExpenseInfoViewAction openExpenseInfoViewAction;
private OpenSearchViewAction openSearchViewAction;
private IWorkbenchAction preferenceAction;
// 这个构造方法在 ApplicationWorkbenchWindowAdvisor类中调用
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
// 这个方法很重要,用于设置窗体中的操作
protected void makeActions(IWorkbenchWindow window) {
// ActionFactory:工作台操作工厂对象 Access to standard actions provided by
// the workbench.
// ActionFactory.OPEN_NEW_WINDOW :具体化了的用于创建“新建窗口”操作的操作工厂对象
// 定义“新建窗口”操作
newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
newWindowAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_DEF_VIEW));
// 注册操作
register(newWindowAction);
// 定义“退出”操作
exitAction = ActionFactory.QUIT.create(window);
exitAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
register(exitAction);
// 定义“打开透视图”操作
perspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
register(perspectiveAction);
// 定义“关于”操作
aboutAction = ActionFactory.ABOUT.create(window);
// aboutAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
aboutAction.setImageDescriptor(Activator.getImageDescriptor("/icons/small/about.gif"));
register(aboutAction);
// 定义“显示视图列表”操作
showViewAction = ContributionItemFactory.VIEWS_SHORTLIST.create(window);
// ((IAction) showViewAction).setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_ELEMENT));
// register(showViewAction); //注意,这类视图不用注册,register方法会报错!
// 定义打开“首选项”操作
preferenceAction = ActionFactory.PREFERENCES.create(window);
// preferenceAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ETOOL_HOME_NAV));
preferenceAction.setImageDescriptor(Activator.getImageDescriptor("/icons/Home.ico"));
register(preferenceAction);
// 自定义的操作类,分别用来打开相应的视图
openNavigatorViewAction = new OpenNavigatorViewAction(window);
openExpenseInfoViewAction = new OpenExpenseInfoViewAction(window);
openPatientInfoViewAction = new OpenPatientInfoViewAction(window);
openSearchViewAction = new OpenSearchViewAction(window);
}
protected void fillMenuBar(IMenuManager menuBar) {
// IWorkbenchActionConstants:Action ids for standard actions, groups
// in the workbench menu bar, and global actions.
// 定义File菜单
MenuManager fileManager = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
// 在File菜单中添加退出菜单项
fileManager.add(exitAction);
// 添加File菜单到菜单栏
menuBar.add(fileManager);
// Window菜单
MenuManager windowManager = new MenuManager("&Window", IWorkbenchActionConstants.M_WINDOW);
windowManager.add(newWindowAction);
windowManager.add(perspectiveAction);
windowManager.add(preferenceAction);
// Window菜单的子菜单Show View菜单,创建二级菜单
MenuManager showViewManager = new MenuManager("&Show View", "showView");
// showViewManager.add(openExpenseInfoViewAction);
// showViewManager.add(openNavigatorViewAction);
// showViewManager.add(openPatientInfoViewAction);
// showViewManager.add(openSearchViewAction);
// 包含一个“other”,用于打开未显示的视图
//TODO:很奇怪的是 show view会自己显示一部分的view,这些view是当前的窗口已经显示出来的view
showViewManager.add(showViewAction);
windowManager.add(showViewManager);
menuBar.add(windowManager);
// Help菜单
MenuManager helpManager = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
helpManager.add(aboutAction);
menuBar.add(helpManager);
}
@Override
protected void fillCoolBar(ICoolBarManager coolBar) {
// Creates a tool bar manager with the given SWT [button style]
IToolBarManager toolbar1 = new ToolBarManager(coolBar.getStyle());
// 在这个toolbar上面添加一个操作按钮
toolbar1.add(openNavigatorViewAction);
// 把这个toolbar添加到coolbar上面
coolBar.add(toolbar1);
IToolBarManager toolbar2 = new ToolBarManager(coolBar.getStyle());
toolbar2.add(openSearchViewAction);
coolBar.add(toolbar2);
IToolBarManager toolbar3 = new ToolBarManager(coolBar.getStyle());
toolbar3.add(perspectiveAction);
coolBar.add(toolbar3);
}
}
实例二:继承自Action类的OpenPatientInfoViewAction操作,其他的类似的操作还有OpenNavigatorViewAction类等等
操作Action中一般都会有一个IWorkbenchWindow window引用,然后在构造方法中初始化,设置text和image
主要方法就是run,执行对应的操作
package com.yinger.patientims.actions;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchWindow;
import com.yinger.patientims.Activator;
import com.yinger.patientims.util.PluginUtil;
//自定义的action
public class OpenPatientInfoViewAction extends Action {
private final IWorkbenchWindow window;
public OpenPatientInfoViewAction(IWorkbenchWindow window){
this.window = window;
//设置菜单项文本,并给该菜单项添加快捷键以及键绑定
this.setText("&PatientInfo@Ctrl+P");
//工具栏上提示性信息
this.setToolTipText("Open PatientInfo View");
//添加工具栏图形按钮
this.setImageDescriptor(Activator.getImageDescriptor("/icons/User.ico"));
}
public void run(){
if (window!=null) {
try {
//打开视图
window.getActivePage().showView(PluginUtil.PatientInfoView_ID);
} catch (Exception e) {
//创建错误对话框
MessageDialog.openError(window.getShell(), "Error", "Error in opening view :"+e.getLocalizedMessage());
}
}
}
}
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchWindow;
import com.yinger.patientims.Activator;
import com.yinger.patientims.util.PluginUtil;
//自定义的action
public class OpenPatientInfoViewAction extends Action {
private final IWorkbenchWindow window;
public OpenPatientInfoViewAction(IWorkbenchWindow window){
this.window = window;
//设置菜单项文本,并给该菜单项添加快捷键以及键绑定
this.setText("&PatientInfo@Ctrl+P");
//工具栏上提示性信息
this.setToolTipText("Open PatientInfo View");
//添加工具栏图形按钮
this.setImageDescriptor(Activator.getImageDescriptor("/icons/User.ico"));
}
public void run(){
if (window!=null) {
try {
//打开视图
window.getActivePage().showView(PluginUtil.PatientInfoView_ID);
} catch (Exception e) {
//创建错误对话框
MessageDialog.openError(window.getShell(), "Error", "Error in opening view :"+e.getLocalizedMessage());
}
}
}
}
实例三:添加病人信息的操作Action
在扩展中添加一个editorActions扩展,新建一个editorContributor,然后新建一个menu,再添加一个action
注意editorContributor的targetID属性,这个是很有用的,用于指定是只有在这个editor有效时才会有action有效的!
指定的ActionDelegate类,动作代理类
package com.yinger.patientims.editors.editorActionDelegate;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import com.yinger.patientims.sigleton.PatientFactory;
import com.yinger.patientims.wizards.AddPatientInfoWizard;
/**
* 编辑器动作的代理类
*
* 具体的设置在plugin.xml文件中
* 设置了action在菜单栏,工具栏的位置,以及要调用的动作代理类(也就是本类)
* 它不是一个action,但是作用相当于一个action,它可以关联到一个编辑器
* 当这个编辑器editor激活时,相应的动作action就会呈现出来,具体的执行操作还是在这里实现的
*
* TODO:内有一个IEditorPart对象,但是具体的作用?
*
*/
public class PatientEditorActionDelegate implements IEditorActionDelegate {
private IEditorPart editorPart;
@Override
public void run(IAction action) {
//创建自定义的向导
AddPatientInfoWizard wizard = new AddPatientInfoWizard();
//注意:每次打开向导页面时都要对PatientFactory的instance进行设置,不然会出现紊乱
PatientFactory.setInstance(null);
//显示向导对话框
WizardDialog dialog = new WizardDialog(Display.getDefault().getShells()[0], wizard);
//设置对话框大小
dialog.setPageSize(-1, 150);//注意:高度要足够的大
//打开
dialog.open();
// editorPart.getEditorInput().
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
@Override
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
this.editorPart = targetEditor;
}
}
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import com.yinger.patientims.sigleton.PatientFactory;
import com.yinger.patientims.wizards.AddPatientInfoWizard;
/**
* 编辑器动作的代理类
*
* 具体的设置在plugin.xml文件中
* 设置了action在菜单栏,工具栏的位置,以及要调用的动作代理类(也就是本类)
* 它不是一个action,但是作用相当于一个action,它可以关联到一个编辑器
* 当这个编辑器editor激活时,相应的动作action就会呈现出来,具体的执行操作还是在这里实现的
*
* TODO:内有一个IEditorPart对象,但是具体的作用?
*
*/
public class PatientEditorActionDelegate implements IEditorActionDelegate {
private IEditorPart editorPart;
@Override
public void run(IAction action) {
//创建自定义的向导
AddPatientInfoWizard wizard = new AddPatientInfoWizard();
//注意:每次打开向导页面时都要对PatientFactory的instance进行设置,不然会出现紊乱
PatientFactory.setInstance(null);
//显示向导对话框
WizardDialog dialog = new WizardDialog(Display.getDefault().getShells()[0], wizard);
//设置对话框大小
dialog.setPageSize(-1, 150);//注意:高度要足够的大
//打开
dialog.open();
// editorPart.getEditorInput().
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
@Override
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
this.editorPart = targetEditor;
}
}
这里的添加新的病人信息操作和上节中的那个Action的run方法是一样的,只是这样让用户多了一个选择,他可以选择菜单栏中的选项进行操作