RCP之病人信息系统开发总结(8):MVC模式之View层—操作

一个系统包含的操作都是很多的,这里我总结一下我使用过的三类操作
1.一类是标准的系统内置的操作,可以直接使用的操作,下面从左到右依次是打开透视图,打开快速视图,打开视图,打开视图操作
      
     
2.一类是自定义的普通的操作类,任何时候它都可以看到(并不代表它一定是可以触发的),一般可以将之同时设置到菜单栏和工具栏
  例如这里的打开导航视图和打开搜索视图的工具栏操作按钮
 
3.另一个类是操作的代理类,它可以绑定到某一个特定的编辑器Editor上(EditorAction),或者是视图View上(ViewAction),它一般是不可复用的,它只是针对某个特定的对象
  例如这里的Edit菜单项,它只在右侧出现了病人信息管理时才有
 
实例一:标准操作,这些内容在ApplicationActionBarAdvisor 类中都有定义,因为这个类就是专门用来定义Action的
这些操作的实现一般都是,首先通过ActionFactory创建,然后注册这个action(注:打开视图列表的action不用注册,注册会报错)
// 定义“打开透视图”操作
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);
  }
}
 
实例二:继承自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());
      }
    }
  }

}
 
实例三:添加病人信息的操作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;
  }
}
 
这里的添加新的病人信息操作和上节中的那个Action的run方法是一样的,只是这样让用户多了一个选择,他可以选择菜单栏中的选项进行操作

 



原文地址:https://www.cnblogs.com/yinger/p/2255655.html