1、第第2121章章 基于基于RCPRCP的产品开发的产品开发经过前面的学习,读者对于开发经过前面的学习,读者对于开发Eclipse的插件产品应的插件产品应该是非常熟悉了。在实际的应用中,大家肯定不满足于仅仅该是非常熟悉了。在实际的应用中,大家肯定不满足于仅仅开发插件产品。当面对客户的时候,必须提供一个独立、完开发插件产品。当面对客户的时候,必须提供一个独立、完整的应用程序给客户。不可能把整个整的应用程序给客户。不可能把整个Eclipse IDE,连同编写,连同编写的插件一起交付给客户。可以想象,这样的软件产品是很别的插件一起交付给客户。可以想象,这样的软件产品是很别扭的,普通客户并不需要扭的,普
2、通客户并不需要JDT,也不可能学习使用,也不可能学习使用Eclipse。提供产品给客户的时候,必须把提供产品给客户的时候,必须把Eclipse平台中那些不必要的平台中那些不必要的功能去掉(例如功能去掉(例如JDT),还要给整个应用程序包装),还要给整个应用程序包装有专有专门的欢迎界面,看到门的欢迎界面,看到About的时候,显示的是自己特有的软的时候,显示的是自己特有的软件品牌而不是件品牌而不是Eclipse.Org的介绍,甚至把整个的介绍,甚至把整个Eclipse的界面的界面都进行改造,让界面更容易使用。都进行改造,让界面更容易使用。21.1 Eclipse21.1 Eclipse平台的核心
3、架构平台的核心架构在开发自己的在开发自己的RCP程序之前,先来了解一下程序之前,先来了解一下Eclipse的的核心架构。核心架构。21.1.1 Eclipse21.1.1 Eclipse的核心框架的核心框架EquinoxEquinox进一步细看进一步细看Platform Runtime,整个,整个Platform Runtime是是Eclipse中的一个子项目中的一个子项目Equinox。Equinox项目是项目是Eclipse开源组织提供的开源组织提供的OSGi框架的实现。框架的实现。Eclipse自自3.0版本开始,版本开始,其内核移植到其内核移植到OSGi框架上。通过框架上。通过 OSG
4、i框架强大的组件控制框架强大的组件控制、交互和管理能力,再加上、交互和管理能力,再加上Eclipse插件的自有特点,插件的自有特点,Eclipse开源框架得到了跳跃式的发展。开源框架得到了跳跃式的发展。Eclipse 3.4 后,正式用后,正式用Equinox作为核心框架。作为核心框架。OSGi的本质是将的本质是将Java面向对象的开发转向面向组件和面向对象的开发转向面向组件和服务的开发。服务的开发。OSGi框架提供了一套完善的机制用于管理和框架提供了一套完善的机制用于管理和控制组件(控制组件(Bundle)、服务()、服务(Service)的生命周期,以及组)的生命周期,以及组件和服务在其生
5、命周期内的交互。件和服务在其生命周期内的交互。Equinox的任务除了包括的任务除了包括OSGi的工作外,还要负责兼容的工作外,还要负责兼容Eclipse3.0之前的插件,负责之前的插件,负责启动整个启动整个Eclipse平台。平台。21.1.2 Eclipse21.1.2 Eclipse中插件、程序、和产品的概念中插件、程序、和产品的概念在进行在进行RCP产品开发之前,再来明确一下产品开发之前,再来明确一下Eclipse中的几中的几个概念个概念插件、程序、产品。插件大家已经非常熟悉了,插件、程序、产品。插件大家已经非常熟悉了,本书前面的内容都是关于插件开发的。在本书前面的内容都是关于插件开发
6、的。在Eclipse中,所有组中,所有组件都是插件,程序件都是插件,程序(Application),产品(,产品(Products)都是一种)都是一种特殊的插件。特殊的插件。程序(程序(Application)产品(产品(Product)Eclipse平台、插件、程序、产品之间的关系:平台、插件、程序、产品之间的关系:21.2 21.2 建立建立RCPRCP产品项目产品项目在前面章节的例子中,由于没有自己的在前面章节的例子中,由于没有自己的Application,所有插件的运行都依赖所有插件的运行都依赖org.eclipse.platform.ide这个插件,通这个插件,通过启动过启动Ecli
7、pse IDE来启动整个来启动整个Eclipse平台。下面开始制作自平台。下面开始制作自己的己的RCP软件平台,制作两个新的软件平台,制作两个新的Application和和Product,并包装成一个独立的应用软件。并包装成一个独立的应用软件。21.2.1 21.2.1 新建新建RCPRCP项目项目RCP项目也是插件项目,在项目也是插件项目,在Eclipse中,选择新建项目中,选择新建项目,按照图的步骤建立,按照图的步骤建立RCP项目。注意在第三步的时候,要选项目。注意在第三步的时候,要选择择Rich Client Application-Yes。21.2.2 RCP21.2.2 RCP插件项
8、目的文件结构插件项目的文件结构在模板选择完成后,按在模板选择完成后,按Finish,向导自动建立了一些相,向导自动建立了一些相关的文件。现在关的文件。现在com.smartdio.application项目的文件结构如项目的文件结构如图。图。21.2.3 21.2.3 认识认识org.eclipse.core.runtime.applicationsorg.eclipse.core.runtime.applications扩展点扩展点模板向导还自动建立了一些扩展点的扩展。如图,在模板向导还自动建立了一些扩展点的扩展。如图,在PDE编辑器中,选择编辑器中,选择Extensions标签,可以看到这
9、些自动建标签,可以看到这些自动建立的扩展。其中第一个最重要的是立的扩展。其中第一个最重要的是org.eclipse.core.runtime.applications扩展。没有这个扩展,扩展。没有这个扩展,就不能成为就不能成为Application插件,只能算是一般的插件而已。插件,只能算是一般的插件而已。21.2.4 21.2.4 认识认识IApplicationIApplication模板向导已经建立了模板向导已经建立了IApplication的实现,就是的实现,就是com.smartdio.application.intro.Application类。类。Application类实现类实
10、现IApplication所定义的两个抽象方法所定义的两个抽象方法start和和stop。21.2.5 RCP21.2.5 RCP关键对象的启动过程关键对象的启动过程到这里,可以看到一个到这里,可以看到一个RCP插件程序的启动需要多个插件程序的启动需要多个对象,看上去比较复杂,其实每个对象都只是负责单一的工对象,看上去比较复杂,其实每个对象都只是负责单一的工作,这也符合面向对象开发的原则。作,这也符合面向对象开发的原则。21.2.6 21.2.6 扩展点扩展点org.eclipse.core.runtime.productsorg.eclipse.core.runtime.productsRC
11、P模板的向导还实现了模板的向导还实现了org.eclipse.core.runtime.products扩展。扩展。org.eclipse.core.runtime.products用于定义用于定义Product。如图,。如图,在在PDE编辑器的编辑器的extensions标签中,展开标签中,展开org.eclipse.core.runtime.products扩展点可以看到扩展的详扩展点可以看到扩展的详细设置。细设置。21.2.7 21.2.7 试运行试运行RCPRCP项目项目到此,已经比较深入地研究过一个到此,已经比较深入地研究过一个RCP产品项目的结产品项目的结构了。下面来试运行一下这个
12、构了。下面来试运行一下这个RCP产品,看看是怎样的一个产品,看看是怎样的一个样子。首先选择工具栏上的样子。首先选择工具栏上的Run按钮,下拉菜单中选择按钮,下拉菜单中选择Run Configurations,打开运行设置对话框。在,打开运行设置对话框。在Eclipse Application类别中新建一个运行项目。类别中新建一个运行项目。21.2.7 21.2.7 试运行试运行RCPRCP项目项目21.3 21.3 定制定制RCPRCP程序的菜单程序的菜单通过前面的步骤,建立了一个应用程序。现在这个通过前面的步骤,建立了一个应用程序。现在这个RCP程序还十分简陋,菜单仅有程序还十分简陋,菜单仅
13、有Help,没有工具栏,也没有,没有工具栏,也没有状态栏,也无法选择其他视图或者其他透视图。下面将重点状态栏,也无法选择其他视图或者其他透视图。下面将重点对菜单、工具栏进行改造,添加上更多的菜单命令。对菜单、工具栏进行改造,添加上更多的菜单命令。21.3.1 21.3.1 基本菜单模式基本菜单模式对于菜单的排列模式,长期以来业界形成了个约定俗对于菜单的排列模式,长期以来业界形成了个约定俗成的规范。在单项的前三项,基本上是文件(成的规范。在单项的前三项,基本上是文件(Files)、编辑)、编辑(Edit)、视图()、视图(View);最后两项基本上是工具();最后两项基本上是工具(Tools)、
14、窗口()、窗口(Window)、帮助()、帮助(Help)。)。21.3.2 21.3.2 用用ActionBarAdvisorActionBarAdvisor定制菜单定制菜单模板向导建立的模板向导建立的ApplicationActionBarAdvisor其实已经其实已经为开发者提供了定制为开发者提供了定制RCP菜单的典范。打开菜单的典范。打开ApplicationActionBarAdvisor.java,可以看到,可以看到ApplicationActionBarAdvisor继承了继承了ActionBarAdvisor。ActionBarAdvisor是专门提供给是专门提供给RCP程序,
15、用于定制菜程序,用于定制菜单和工具栏的。要定制菜单,就要重载单和工具栏的。要定制菜单,就要重载ActionBarAdvisor中中的的fillMenuBar(IMenuManager menuBar)方法。方法中传递方法。方法中传递进来的参数进来的参数menuBar就是就是Workbench窗口中的菜单栏,往这窗口中的菜单栏,往这个个menuBar添加菜单就可以了。添加菜单就可以了。protected void fillMenuBar(IMenuManager menuBar)MenuManager helpMenu=new MenuManager(&Help,IWorkbenchAction
16、Constants.M_HELP);menuBar.add(helpMenu);/帮助菜单帮助菜单helpMenu.add(introAction);21.3.3 21.3.3 添加添加WorkbenchWorkbench预定义的菜单命令预定义的菜单命令Eclipse中不仅预先定义了一批标准菜单命令的中不仅预先定义了一批标准菜单命令的ID,还,还具体实现了这些菜单命令。在具体实现了这些菜单命令。在Eclipse中,命令都是中,命令都是Action对对象。同一个象。同一个Action对象可以用在菜单命令中,也可以用在按对象可以用在菜单命令中,也可以用在按钮中(工具栏上的按钮或者其他界面上的按钮)
17、。钮中(工具栏上的按钮或者其他界面上的按钮)。21.3.4 21.3.4 添加更多的菜单命令添加更多的菜单命令按照同样的原理添加更多的菜单命令,包括按照同样的原理添加更多的菜单命令,包括Edit菜单和菜单和Window菜单。由于这部分代码所占的篇幅比较多,所以就菜单。由于这部分代码所占的篇幅比较多,所以就不在此列出了,读者可以查看随书光盘中的源代码。不在此列出了,读者可以查看随书光盘中的源代码。21.4 21.4 添加状态栏添加状态栏窗口的上面是菜单,低端是状态栏,这已经是大部分窗口的上面是菜单,低端是状态栏,这已经是大部分应用程序的标准模式。上一小节添加了菜单,现在应用程序应用程序的标准模式
18、。上一小节添加了菜单,现在应用程序窗口下面还需要有一个状态栏,显示一些状态信息,或者提窗口下面还需要有一个状态栏,显示一些状态信息,或者提示信息。下面为示信息。下面为RCP程序添加这样的状态栏。程序添加这样的状态栏。21.4.1 21.4.1 显示状态栏显示状态栏打开打开ApplicationWorkbenchWindowAdvisor.java,在,在preWindowOpen()方法中添加方法中添加“configurer.setShowStatusLine(true);”。public void preWindowOpen()IWorkbenchWindowConfigurer confi
19、gurer=getWindowConfigurer();configurer.setInitialSize(new Point(700,550);configurer.setShowCoolBar(false);configurer.setShowStatusLine(true);configurer.setTitle(Smartdio Application);21.4.2 21.4.2 显示状态栏信息显示状态栏信息要往状态栏上显示文本信息,最简单的途径就是使用要往状态栏上显示文本信息,最简单的途径就是使用statusline.setMessage()方法。例如下面在方法。例如下面在Appl
20、icationWorkbenchWindowAdvisor.java 中加入中加入postWindowOpen()方法,当窗口打开后,在状态栏上显示方法,当窗口打开后,在状态栏上显示状态信息。状态信息。Overridepublic void postWindowOpen()IStatusLineManager statusline=getWindowConfigurer().getActionBarConfigurer().getStatusLineManager();statusline.setMessage(null,程序已经成功运行程序已经成功运行);21.5 21.5 添加工具栏添加工
21、具栏现在程序还少了工具栏。本来添加工具栏的原理和添现在程序还少了工具栏。本来添加工具栏的原理和添加菜单是一样的,也是往工具栏上添加加菜单是一样的,也是往工具栏上添加Action。现在有了。现在有了Eclipse 3.3新的命令框架,可以不用建立新的命令框架,可以不用建立Action。通过。通过org.eclipse.ui.menus扩展点的扩展,就可以实现不用编写代扩展点的扩展,就可以实现不用编写代码,往工具栏上添加常用命令。码,往工具栏上添加常用命令。21.5.1 21.5.1 显示工具栏显示工具栏打开打开ApplicationWorkbenchWindowAdvisor.java,在,在p
22、reWindowOpen()方法中,加入方法中,加入configurer.setShowCoolBar(true);把工具栏的显示设置为把工具栏的显示设置为true。public void preWindowOpen()IWorkbenchWindowConfigurer configurer=getWindowConfigurer();configurer.setInitialSize(new Point(700,550);/configurer.setShowCoolBar(true);configurer.setShowStatusLine(true)configurer.setTitl
23、e(Smartdio Application);21.5.2 21.5.2 添加添加org.eclipse.ui.menusorg.eclipse.ui.menus扩展点扩展点按照图的步骤,添加按照图的步骤,添加org.eclipse.ui.menus扩展点,然后扩展点,然后在扩展点下面添加在扩展点下面添加menuContribution。并把。并把menuContribution的的locationURI修改为修改为toolbar:org.eclipse.ui.main.toolbar。21.5.3 21.5.3 添加工具栏和命令添加工具栏和命令选择新增的选择新增的menuContribut
24、ion,按图的步骤,在下面,按图的步骤,在下面新增一个工具栏,把工具栏的新增一个工具栏,把工具栏的ID设置为设置为fileToolbar,然后再,然后再在新增的工具栏下面添加一个命令。在新增的工具栏下面添加一个命令。21.5.4 21.5.4 运行测试运行测试现在再次运行现在再次运行smartdio.application。如图,在关闭。如图,在关闭Welcome视图后,可以看到新增的工具栏的了。而添加工具视图后,可以看到新增的工具栏的了。而添加工具栏的过程没有编写任何代码。栏的过程没有编写任何代码。21.6 21.6 小结小结本章建立了一个本章建立了一个RCP程序。程序。RCP程序本身是特殊
25、插件,程序本身是特殊插件,它只是通过一些扩展设置,改变它只是通过一些扩展设置,改变Eclipse程序窗口的外观和一些程序窗口的外观和一些行为,看上去就像是一个全新的应用程序。行为,看上去就像是一个全新的应用程序。应用程序必须实现应用程序必须实现org.eclipse.core.runtime.application扩扩展点。至少要实现下面几个接口:展点。至少要实现下面几个接口:org.eclipse.equinox.application.IApplicationorg.eclipse.ui.application.ActionBarAdvisororg.eclipse.ui.application.WorkbenchAdvisororg.eclipse.ui.application.WorkbenchWindowAdvisorRCP程序至少还要建立一个透视图。程序至少还要建立一个透视图。RCP程序需要重新定义程序需要重新定义Eclipse窗口的菜单、工具栏、状窗口的菜单、工具栏、状态栏。可以通过实现态栏。可以通过实现ActionBarAdvisor中对应的方法实现。中对应的方法实现。Eclipse平台已经定义了一批系统命令:包括平台已经定义了一批系统命令:包括“新建新建”、“首选首选项项”、“打开透视图打开透视图”等等。等等。