zoukankan      html  css  js  c++  java
  • RCP之病人信息系统开发总结(2):项目结构分析和重要类分析

    1.项目文档结构图
     
     
    2.分析包 com.yinger.patientims中的类
     
    (1)Activator 类
    重要的方法:getImageDescriptor
    package com.yinger.patientims; 

    import org.eclipse.jface.resource.ImageDescriptor;
    import org.eclipse.ui.plugin.AbstractUIPlugin;
    import org.osgi.framework.BundleContext;

    /**
     * The activator class controls the plug-in life cycle
     * 这个类(激活器)继承自AbstractUIPlugin(抽象UI插件)
     * 它用来控制插件的生命周期,存储插件的全局信息
     * 它是一个单例类,是用来存储插件里其他类的一些静态功能函数的方便位置
     * 在整个插件的生命周期中,Eclipse只使用这个插件类的实例,并不创建其他的实例
     * 在通常情况下,插件类声明一个静态字段,用于引用这个唯一的实例
     * 所以在需要的时候它可以方便的被插件的各个地方所共享
     * 通常情况下这个类不需要改动
     */

    public class Activator extends AbstractUIPlugin {

      // The plug-in ID
      public static final String PLUGIN_ID = "com.yinger.patientims"; //$NON-NLS-1$ //$NON-NLS-1$ 是用于国际化的,不能改动

      // The shared instance
      private static Activator plugin; //唯一的实例

      /**
       * The constructor
       */

      public Activator() {
      }

      /*
       * (non-Javadoc)
       * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
       */

      public void start(BundleContext context) throws Exception {
        super.start(context);
        plugin = this;
      }

      /*
       * (non-Javadoc)
       * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
       */

      public void stop(BundleContext context) throws Exception {
        plugin = null;
        super.stop(context);
      }

      /**
       * 得到唯一的实例
       * Returns the shared instance
       * @return the shared instance
       */

      public static Activator getDefault() {
        return plugin;
      }

      /**
       * 根据路径返回相对于插件类的ImageDescriptor,这个方法很重要
       * 很多时候设置图片或者ImageDescriptor都是调用这个方法
       * 有一个好处就是这种方法是采用相对路径得到的
       * 注意path的写法,如果是在项目下的icons目录中,应该是 /icons/XX.ico
       * Returns an image descriptor for the image file at the given plug-in relative path
       */

      public static ImageDescriptor getImageDescriptor(String path) {
    //    AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, imageFilePath)
        return imageDescriptorFromPlugin(PLUGIN_ID, path);
      }
    }
     
    (2)Application类
    可以在这个类中编写登录验证模块,详情见后文——对话框设计
    package com.yinger.patientims; 

    import org.eclipse.equinox.app.IApplication;
    import org.eclipse.equinox.app.IApplicationContext;
    import org.eclipse.jface.dialogs.IDialogConstants;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.ui.IWorkbench;
    import org.eclipse.ui.PlatformUI;

    import com.yinger.patientims.dialogs.LoginDialog;
    import com.yinger.patientims.model.Doctor;
    import com.yinger.patientims.util.DBUtil;

    /**
     * This class controls all aspects of the application's execution
     * Application类是RCP应用程序的主程序类,相当于控制器,类似于Main()方法
     * 该类负责创建一个工作台(Workbench),并且与ApplicationWorkbenchAdvisor类连接
     * 该类实现了IApplication接口,启动RCP应用程序之后该类首先被加载。 如果系统需要登录,通常是在这个类中插入登录模块 通常情况下这个类不需要改动
     */

    public class Application implements IApplication {

      /*
       * (non-Javadoc)
       * 
       * @see
       * org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.
       * IApplicationContext)
       */

      public Object start(IApplicationContext context) throws Exception {
        Display display = PlatformUI.createDisplay(); // 创建Display对象
        try {
          // 启动之前先进行登录操作
          if (!login()) {
            return IApplication.EXIT_OK; // 没有登陆成功就正常退出
          }
          // 启动工作台,从而打开应用程序窗口
          int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
          if (returnCode == PlatformUI.RETURN_RESTART)
            return IApplication.EXIT_RESTART;
          else
            return IApplication.EXIT_OK;
        } finally {
          display.dispose();
        }

      }

      /*
       * (non-Javadoc)
       * 
       * @see org.eclipse.equinox.app.IApplication#stop()
       */

      public void stop() {
        if (!PlatformUI.isWorkbenchRunning())
          return;
        final IWorkbench workbench = PlatformUI.getWorkbench();
        final Display display = workbench.getDisplay();
        display.syncExec(new Runnable() {
          public void run() {
            if (!display.isDisposed()) // 关闭窗口之前先判断display是否被销毁了
              workbench.close();
          }
        });
      }

      // 登录验证
      public boolean login() {
        boolean flag = false;// 标志
        int tryCount = 0;//登录的次数
        while (!flag) {
          LoginDialog loginDialog = new LoginDialog(null);// null是可以的!
          Doctor doctor = new Doctor();
          loginDialog.setDoctor(doctor);// 这里很重要
          if (tryCount == 3) {//尝试登录了三次没有成功就退出
    //        loginDialog.setErrorMessage("Wrong Login Information!");
            return false;
          }
          int res = loginDialog.open();// 注意,可能用户只是点击了关闭!
          if (res == IDialogConstants.ABORT_ID || res == IDialogConstants.CANCEL_ID) {
            return false; // 关闭或者退出了就直接退出程序
          }
          if (res == IDialogConstants.OK_ID) {// Dialog返回之前会设置好内部的doctor对象
            doctor = DBUtil.getLoginInfo(doctor);// 此时右边的doctor对象有了username和password
          }
          // doctor肯定不为null(每次都是new Doctor()),那么就要看doctor的属性
          if (doctor.getName() != null) {// 如果用户输入了name和password之后,但是信息无效就会提示这个或者用户直接点击了关闭登录
            // MessageDialog.openInformation(null,
            // "Error Information", "Wrong Login Information!");
            // loginDialog.setErrorMessage("Wrong Login Information!");
            flag = true;// 这种情况下才是登录成功,否则继续进行登录
          }else {
            tryCount++;
          }
        }
        return true;
      }

    }
     
    (3)ApplicationWorkbenchAdvisor 类
    设置默认的透视图
    package com.yinger.patientims; 

    import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
    import org.eclipse.ui.application.WorkbenchAdvisor;
    import org.eclipse.ui.application.WorkbenchWindowAdvisor;
    /**
     * Public base class for configuring the workbench. 
     * 该类继承了WorkbenchAdvisor类,在主程序Application类中引用了ApplicationWorkbenchAdvisor类
     * WorkbenchAdvisor类主要用于配置工作台,它告诉工作台如何显示,显示什么信息
     * WorkbenchAdvisor类主要初始化默认的透视图和使用WorkbenchWindowAdvisor类
     * 
     * 重要方法:
     * 1.initialize(IWorkbenchConfigurer configurer):在工作台启动之前进行初始化
     * 2.openWindows():用于在启动时打开工作台窗体
     * 3.postShutdown():用于在所有窗口关闭之后,关闭工作台之前调用,用来保存当前的应用程序的状态,清除初始化方法创建的内容
     * 4.preShutdown():工作台将要关闭之前
     * 5.postStartup():用于在工作台窗口关闭之后,在主循环事件运行之前调用
     * 6.preStartup():用于在初始化结束之后,第一个窗口打开之前调用
     * 7.getDefaultPageInput():返回默认的输入
     * 8.getInitialWindowPerspectiveId():用于为新的工作台窗口返回透视图ID
     * 9.getMainPreferencePageId():返回首选项ID
     */

    public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

      private static final String PERSPECTIVE_ID = "com.yinger.patientims.perspective"; //$NON-NLS-1$

        public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
            return new ApplicationWorkbenchWindowAdvisor(configurer);
        }

      public String getInitialWindowPerspectiveId() {
        return PERSPECTIVE_ID;
      }
    }
     
    (4)ApplicationWorkbenchWindowAdvisor 类
    重要方法:preWindowOpen
    可以在这个方法中设置各个组件的显示情况,同时可以设置整个程序的显示样式
    package com.yinger.patientims; 

    import org.eclipse.jface.preference.IPreferenceStore;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.ui.IWorkbenchPreferenceConstants;
    import org.eclipse.ui.application.ActionBarAdvisor;
    import org.eclipse.ui.application.IActionBarConfigurer;
    import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
    import org.eclipse.ui.application.WorkbenchWindowAdvisor;
    import org.eclipse.ui.internal.util.PrefUtil;
    /**
     * Public base class for configuring a workbench window. 
     * 该类继承了WorkbenchWindowAdvisor类,主要是对工作台窗口进行控制
     * 包括状态栏,工具栏,透视图栏,快速试图栏,窗口尺寸,标题等等
     * 该类还有一个重要的作用就是创建ActionBarAdvisor类
     * 这个类的方法在整个工作台的生命周期中起着重要作用
     *
     * 重要方法:
     * 1.createEmptyWindowContents(Composite composite):返回当窗口没有页面显示时要显示的控件
     * 2.createWindowContents(Shell shell):创建窗口内容
     * 3.getWindowConfigurer():返回工作台窗口配置
     * 4.openIntro():打开初始内容
     * 5.postWindowClose():在窗口关闭之后调用
     * 6.postWindowCreate():在窗口创建以后,打开之前调用 或者 窗口恢复到保存状态后,在执行postWindowRestor方法之后调用
     * 7.postWindowRestor():在窗口被恢复到保存状态之后,打开之前调用
     * 8.perWindowOpen():在窗口被打开之前调用
     * 9.preWindowShellClose():在窗口的Shell被关闭之前调用
     */

    public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

      //这个构造方法在ApplicationWorkbenchAdvisor中调用的
        public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
            super(configurer);
        }

        public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
            return new ApplicationActionBarAdvisor(configurer);
        }

        //这个方法是在窗口打开之前调用的,用来设置窗口的内容显示情况
        public void preWindowOpen() {
            IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
            //设置窗体的标题
            configurer.setTitle("Hospital Management System"); //$NON-NLS-1$
            //设置窗体的大小
            configurer.setInitialSize(new Point(800, 600));
            //设置菜单栏        
            configurer.setShowMenuBar(true);
            //设置工具栏
            configurer.setShowCoolBar(true);
            //设置状态线
            configurer.setShowStatusLine(true);
            //设置快速视图栏
            configurer.setShowFastViewBars(true);       

            //定制应用程序的外观
            IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
            //设置选项卡的样式,不是矩形的边框,而是弧形的
            preferenceStore.setValue(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS, false);
            //设置透视图按钮的位置,默认是左上角,改为放置在右上角
            preferenceStore.setValue(IWorkbenchPreferenceConstants.DOCK_PERSPECTIVE_BAR, IWorkbenchPreferenceConstants.TOP_RIGHT);

        }
    }
     

     

    (5)ApplicationActionBarAdvisor 类
    在这个类中定义菜单栏和工具栏中的操作
    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);

      }

    }

     



  • 相关阅读:
    mysql 8.0.18 mgr节点状态长时间处于RECOVERING 状态
    mgr安装 加入第二个节点报错-[ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the grou
    mgr安装-启动主节点报错-[ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Unable to announce tcp port
    sqlserver维护计划无法删除处理
    ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
    keepalived-2.0.15 编译安装报错
    论自由与素质
    乘法表
    python函数和方法
    python三引号的用法
  • 原文地址:https://www.cnblogs.com/yinger/p/2255637.html
Copyright © 2011-2022 走看看