简单RCP框架源码分析
<script></script>
在我们新建一个RCP应用程序框架时,eclipse会为我们自动生成若干个类:
网上也有很多关于“Hello RCP”的分析说明,但都聚集在类功能分析,没有源代码的分析。下面着重分析一下其中的某些不易理解的类以及其中涉及到的其它类的源代码。
- Application类: 是RCP应用程序的入口点,你可以把它想象成程序的控制器,类似于Model2架构中的控制器。它很简短,而且在不同的项目中变化不大;它所做的就是创建 一个工作台Workbench,同时将其于一个WorkbenchAdvisor联系起来。Workbench是RCP框架的一部分,一个RCP应用对应 一个Workbench,但一个 Workbench可以有多个Workbench窗口。
- ApplicationWorkbenchAdvisor类:继承了WorkbenchAdvisor类,提供了两个方法,其中createWorkbenchWindowAdvisor方法将创建窗口的工作交给了ApplicationWorkbenchWindowAdvisor类。
- WorkbenchAdvisor类: 该类不是一个接口,而是一个抽象类,它不包含任何的功能实现,因为将来很有可能在其中添加其它方法。Eclipse的设计者们希望每个RCP应用都实现 它,由平台来调用。Workbench和Workbench Window生命周期中的有一些重要事件,这些事件在WorkbenchAdvisor中都 有相应的方法,Platform调用这些方法从而执行你的定制代码。
表1. WorkbenchAdvisor提供的事件处理方法
方法 描述 参数 initialize 第一个被调用,用来初始化,比如解析命令行,注册适配器,声明图像等。 IWorkbenchConfigurer
preStartup 在初始化结束,但是在第一个窗口打开前调用。可以被用来设置一些选项来影响初始打开的编辑器和视图。 postStartup 在所有窗口已经被打开或恢复后,但是在事件循环开始前调用。它可以被用来启动自动处理器,打开提示或其他窗口。 preShutdown 在事件循环结束后,但在任何窗口被关闭前调用。 postShutdown 在关闭Workbench过程中,所有窗口被关闭后调用。它可以被用来存储当前的应用状态和清理任何由initialize创建的东西。 表2. WorkbenchAdvisor提供的事件循环钩子
方法 描述 参数 eventLoopException 在事件循环中如果有未检测的异常则调用给方法。默认的实现将记录错误信息。 Throwable
eventLoopIdle 时间循环时什么也不做时调用 Display
表3. WorkbenchAdvisor提供的信息获取方法,你可以在子类中覆盖
上面的WorkbenchAdvisor事件对大多数应用来说是足够了,但是在某些情况,RCP又提供了两个方法来控制你的应用窗口和控件如何被创建。它们被列在表4,但是我觉得很多程序不需要用到这些。方法 描述 参数 getDefaultPageInput 返回新的Workbench页面的缺省输入,缺省值是null。 getInitialWindowPerspectiveId 返回新创建的Workbench Window的初始透视图。这个方法必须提供。 getMainPreferencePageId 返回第一个显示的首选参数页。缺省为null意味着首选参数页按字母顺序排序。
表4. WorkbenchAdvisor提供的高级方法
方法 描述 参数 openWindows 在启动时打开所有Workbench Window。缺省实现会恢复前面存储的Workbench状态。
其它的方法在eclipse3.1后都被覆盖了。 - ApplicationWorkbenchWindowAdvisor类:用来控制状态栏,工具栏,标题和窗口的大小等。但它将创建工具栏的任务交给了ApplicationActionBarAdvisor类。
- WorkbenchWindowAdvisor类:查阅Javadoc文档可知,它是配置workbench窗口的公共基类。当窗口被创建时,该类就会被创建,用来配置窗口。用户应该继承该类并覆盖其中的某些方法来满足特定的需求。
表5. WorkbenchWindowAdvisor提供的生命事件点
方法 描述 参数 preWindowOpen 在Workbench Window的构造器中调用。可以使用这个方法来指定窗口是否有菜单栏。然而,窗口的widget还没有创建,因此在这个方法中不能引用它们。 postWindowRestore 当一个窗口从保存的状态恢复时,但在打开前,被调用。 postWindowCreate 在窗口从保存状态恢复,或从scratch中创建后,但在打开前,被调用。 openIntro 在窗口打开前一刻被调用,它用来创建introduction组件(如果有的话)。 postWindowOpen 紧接着Workbench Window被打开后调用。它被用来组装窗口的widget,例如设置标题或修改它的大小。 preWindowShellClose 在Workbench Window被关闭前调用(从技术上来说,是在它的shell被关闭前)。这是唯一能够终止关闭动作的方法,所以,它可以用来显示“你确定吗”这样的对话框。 postWindowClose 在Workbench Window关闭后调用。它被用来清理任何由preWindowOpen创建的资源。 表5. WorkbenchWindowAdvisor提供高级方法
方法 描述 参数 createWindowContents 创建窗口的内容,覆盖该方法来定义用户自己的内容和布局。 Shell
createEmptyWindowContents 用来创建空页面的窗口,覆盖该方法来改变默认窗口背景 Composite
- IWorkbenchWindowConfigurer接 口:为配置workbench窗口提供了专门的方法,Window configurer类和要配置的workbench是一对一对应的,用户可以用get/set方法将任意状态和window configurer类相连。注意这些类只供主应用程序使用,该接口不能被实现。
- ApplicationActionBarAdvisor类:继承了ActionBarAdvisor类
- ActionBarAdvisor类:是配置工作台窗口action bars的公用基类。用户应该继承该类并覆盖其中的某些方法来满足特定的需求。
表7. ActionBarAdvisor提供的可以覆盖的方法
方法 描述 参数 makeActions 创建actions,供fill方法使用 IWorkbenchWindow
fillMenuBar 用主菜单填充menubar,添加窗口的主菜单 IMenuManager
fillCoolBar 用工具栏填充coolbar,添加窗口的工具栏 ICoolBarManager
fillStatusLine 用状态栏填充statusline,添加窗口的状态栏 IStatusLineManager
isApplicationMenu 返回是否是你创建的菜单 String
- Activator类:是一个单例类,用来存储插件的全局信息,也可以有一些其他类会用到的实用方法。