RCP应用程序开发之三——如何打开多个工作台窗体 工作网络应用EclipseUI配置管理
前面讲到了从eclipse平台下直接导出的rcp应用程序模板中核心类的功能。在项目的研发过程中,不同的窗体总体上代表了不同的功能。因此,我们有时需要调用另外一个工作台窗体窗体来表现另外一个系统模块的功能,而这个活动窗体也需要像需要像主窗体一样,要展示对应的导航树,鹰眼图等,需要在子窗体和主窗体中切换。怎么实现这个功能呢? <o:p></o:p>
调用另外一个工作台窗体(活动的),实际上就是新生成一个新的工作台窗体,并给这个新的工作台窗体配置相关的菜单、工具栏。前面讲到,我们在Rcp的核心类Application里已经生成了一个工作台,我们需要打开在此基础上新打开一个工作台窗体,具体的方式如下:<o:p></o:p>
PlatformUI.getWorkbench().openWorkbenchWindow(null);<o:p></o:p>
然后,我们在为这个WorkbenchWindow来配置一些菜单,工具栏,就达到我们的要求了。<o:p></o:p>
<o:p> </o:p>
下面,我们详细的说明是如何实现这些功能的:<o:p></o:p>
在3.1版本以后,前面讲到要生成一个工作台窗体,调用了Application,WorkbenchAdvisor,WorkbenchWindowAdvisor,ActionBarAdvisor。处了Application用来创建工作台,其他的类都用来配置工作台窗体,我们新打开一个工作台窗体时,也需要用这些类来配置工作台窗体。WorkbenchAdvisor,WorkbenchWindowAdvisor不用重新定义,用来配置新工作台窗体菜单、工具栏,我们则必须另外实现接口ActionBarAdvisor了。
于是,我们引入了一个新类,WorkbenchActionBuilder,通过这个类,我们来调用不同窗体actionbar生成器(即实现不同窗体的菜单、工具栏)。<o:p></o:p>
package com.jdenght.rcpstudy.action;<o:p></o:p>
<o:p> </o:p>
import org.eclipse.ui.application.ActionBarAdvisor;<o:p></o:p>
import org.eclipse.ui.application.IActionBarConfigurer;<o:p></o:p>
import org.eclipse.ui.application.WorkbenchWindowAdvisor;<o:p></o:p>
import com.jdenght.rcpstudy.MainActionBarAdvisor;<o:p></o:p>
import com.jdenght.rcpstudy.Child_1_ActionBarAdvisor;<o:p></o:p>
<o:p> </o:p>
public final class WorkbenchActionBuilder {<o:p></o:p>
private IActionBarConfigurer Ibarconfigurer;<o:p></o:p>
private WorkbenchWindowAdvisor workbenchWindowAdvistor;<o:p></o:p>
private ActionBarAdvisor actionBarAdvisor;<o:p></o:p>
<o:p> </o:p>
public WorkbenchActionBuilder(IActionBarConfigurer Ibarconfigurer) {<o:p></o:p>
this.Ibarconfigurer = Ibarconfigurer;<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public ActionBarAdvisor makeWinAction(){ <o:p></o:p>
switch(WorkbenchControler.flag){<o:p></o:p>
case WorkbenchControler.main:<o:p></o:p>
actionBarAdvisor = new MainActionBarAdvisor(Ibarconfigurer);<o:p></o:p>
break;<o:p></o:p>
case WorkbenchControler.child_1:<o:p></o:p>
actionBarAdvisor = new Child_1_ActionBarAdvisor(Ibarconfigurer);<o:p></o:p>
break;<o:p></o:p>
case WorkbenchControler.child_2:<o:p></o:p>
actionBarAdvisor = new MainActionBarAdvisor(Ibarconfigurer);<o:p></o:p>
break;<o:p></o:p>
}<o:p></o:p>
return actionBarAdvisor;<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public void dispose() {<o:p></o:p>
workbenchWindowAdvistor.dispose();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
如上所述,当当前打开的为主窗体时,调用MainActionBarAdvisor,为主窗体来配置菜单、工具栏等,当当前打开的为子窗体时,调用一个子窗体的菜单、工具栏生成类Child_1_ActionBarAdvisor。<o:p></o:p>
于是,有人会提到,我们在哪里调用WorkbenchActionBuilder这个类呢,这个类怎样让它调用不同的工具栏生成器呢?WorkbenchControler有什么作用呢?<o:p></o:p>
这个类是在WorkbenchWindowAdvisor的实现类中调用的,让我们来看看代码:<o:p></o:p>
package com.jdenght.rcpstudy;<o:p></o:p>
<o:p> </o:p>
import org.eclipse.ui.application.ActionBarAdvisor;<o:p></o:p>
import org.eclipse.ui.application.IActionBarConfigurer;<o:p></o:p>
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;<o:p></o:p>
import org.eclipse.ui.application.WorkbenchWindowAdvisor;<o:p></o:p>
import com.jdenght.rcpstudy.action.WorkbenchActionBuilder;<o:p></o:p>
<o:p> </o:p>
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {<o:p></o:p>
<o:p> </o:p>
private WorkbenchActionBuilder fActionBuilder;<o:p></o:p>
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {<o:p></o:p>
super(configurer);<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public ActionBarAdvisor createActionBarAdvisor(<o:p></o:p>
IActionBarConfigurer configurer) {<o:p></o:p>
if (fActionBuilder == null)<o:p></o:p>
fActionBuilder = new WorkbenchActionBuilder(configurer);<o:p></o:p>
return fActionBuilder.makeWinAction();<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public void preWindowOpen() {<o:p></o:p>
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();<o:p></o:p>
// configurer.setShowCoolBar(true);<o:p></o:p>
// configurer.setShowStatusLine(true);<o:p></o:p>
configurer.setTitle("网络资源管理系统");<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
在rcp应用程序学习一中,在createActionBarAdvisor()是这样定义的:<o:p></o:p>
return new ApplicationActionBarAdvisor(configurer);<o:p></o:p>
它直接返回了一个菜单栏,工具栏的生成器。现在,我们让fActionBuilder.makeWinAction()来返回对应的当前窗体需要的actionbar(菜单,工具栏)生成器了。<o:p></o:p>
下面,我们在看看WorkbenchControler里有什么:<o:p></o:p>
import org.eclipse.ui.IWorkbenchWindow;<o:p></o:p>
import org.eclipse.ui.PlatformUI;<o:p></o:p>
<o:p> </o:p>
public class WorkbenchControler {<o:p></o:p>
//不同的工作台窗体代表的值<o:p></o:p>
public final static int main = 1;<o:p></o:p>
public final static int child_1 = 2;<o:p></o:p>
public final static int child_2 = 3;<o:p></o:p>