• 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方法是一样的,只是这样让用户多了一个选择,他可以选择菜单栏中的选项进行操作

     



  • 相关阅读:
    Leetcode929.Unique Email Addresses独特的电子邮件地址
    Leetcode914.X of a Kind in a Deck of Cards卡牌分组
    new Date()设置日期在IOS的兼容问题
    koa2 使用passport权限认证中间件
    当 better-scroll 遇见 Vue
    百度地图开发
    通过Ajax方式上传文件,使用FormData进行Ajax请求
    app中页面滑动,防止a链接误触
    js判断是微信、QQ内置浏览器打开页面
    百度天气预报接口介绍
  • 原文地址:https://www.cnblogs.com/yinger/p/2255655.html
Copyright © 2020-2023  润新知