深入浅出Eclipse RCP(2):RCP简介

上一篇随笔我们用Hello RCP模板创建了一个简单的RCP应用,并介绍了系统自动生成的5个类 。本文将重点介绍RCP的架构并对其中的一些概念进行阐述。

Eclipse体系结构

Eclipse的体系结构图如下。

2006529114659189.jpg

Platform Runtime是整个架构的核心,其他部分实质上都属于插件范畴。Eclipse采用动态加载机制,即只有需要的才加载,这样可以降低启动时间,提高资源使用效率。

Workspace主要负责管理用户资源,如创建项目的管理、文件变更等,并通知其他插件关于资源的变更信息。

Workbench是Eclipse提供的用户界面,它使用SWT(标准窗口工具包)和JFace(建立在SWT之上的UI部件)构建。

Help允许以HTML文件形式添加文档,并提供了一个附加的导航结构以便用户使用帮助功能搜索相关信息。

Team负责提供版本控制和配置管理支持。它根据需要添加视图,以允许用户与所有使用的任何版本控制系统交互。大多数插件都不需要与Team交互,除非它们提供版本控制服务。

JDT提供了用于编辑、查看、编译、调试和运行Java代码的专门插件。PDE构建于Eclipse平台和JDT之上,提供了专门开发插件的工具。

什么是RCP

RCP摆脱了失败的AWT和Swing,是一套基于SWT和JFace的图形界面引擎。RCP在本质上是Eclipse插件,它提供丰富的界面控件,使得基于 Java 开发桌面应用也变得容易了很多。

概念解析

上一篇随笔中提到了很多RCP概念,如Workbench、WorkbenchWindow、Advisor等,它们具体是干什么的呢?下面我将试着对这些概念进行解释。

Display

应用程序一般只需要一个Display对象,该对象实际上是一个SWT对象,代表了底层图形系统的实现。Display的主要任务是事件处理,它负责从操作系统的事件队列中读取事件,传递给RCP的事件监听器以便完成具体的任务。需要注意的是,Display对象不代表应用程序窗口的任何可视控件,在应用程序主窗口打开之前,Display是不可获得的。应用程序主窗口打开之后,才可以通过一个被称作Shell的对象获得。Display对象的获得方法如下。

Display display = new Display();

或者:Display display=Display.getCurrent();

Shell

每一个窗口都有一个Shell对象。Shell对象代表了与用户交互的窗口框架,并处理与窗口关联的诸如移动、改变大小等常见行为。Shell对象的获得方法:

Display display=Display.getCurrent();

Shell shell = new Shell(display);

或者:Shell shell=Display.getCurrent().getActiveShell();

Workbench

Workbench是工作台,通俗地说就是代表用户界面的UI元素。工作台上有各种窗口、图标、按钮和控件,用户可以在工作台上做各种操作。获得工作台对象的方法:

IWorkbench wb=PlatformUI.getWorkbench();

工作台对象有两个方法也许很有用:

    wb.restart(),关闭应用程序并立即重新启动。

    wb.close(),正常关闭应用程序,等同于ActionFactory.QUIT_ACTION。

Advisor

Advisor是建议者,用户主界面宽度、高度、图标、菜单、工具栏、颜色、操作等等配置方案需要Advisor来提出“建议”。Eclipse提供了3种类型的Advisor:

    1. WorkbenchAdvisor。应用程序级别,Eclipse3.0开始引入的全新类。每一个应用程序只有一个 Workbench,WorkbenchAdvisor负责该工作台生命周期的管理,例如启动、关闭工作。WorkbenchAdvisor也负责该 Workbench的异常处理,并负责向Workbench提供一些重要参数,例如可以指定该Workbench的初始透视图。

    2. WorkbenchWindowAdvisor。窗口级别。每一个窗口都有一个WorkbenchWindow- Advisor 实例。WorkbenchWindowAdvisor 负责具体窗口生命周期的管理,例如状态栏、工具栏、菜单、窗口标题、窗口大小和各种控件等等,也可以处理窗口的各种事件例程。

    3. ActionBarAdvisor。窗口级别。每一个窗口都有一个ActionBarAdvisor实例。ActionBarAdvisor负责管理窗口的菜单栏、状态栏、工具栏的外观和行为。

IWorkbenchSite

workbench及其part,包括part中的page,的通用接口。

IWorkbenchPartSite:workbench和workbench part之间主要的接口,不直接实现。

PartSite:实现IWorkbenchPartSite。PartSite的生命周期:

1. 构建site。

2. 构建part并保存在part中??

3. site调用part.init()。

4. 构建pane并保存在site中。

5. 构建part的action bar并保存在site中。

6. pane添加到presentation中。

7. 创建pane和part的SWT widget。

8. 激活site,使actions可见。

 

IWorkbench

Workbench是Eclipse用户界面中最底层的对象,它建立在Display之上,包含1个或多个IWorkbenchWindow,用于向最终用户呈现信息。当你的workbench插件被激活的时候,eclipse平台将为之创建一个实例,在平台的整个生命周期中,只允许出现该workbench的唯一实例

IWorkbenchWindow

上面getActiveWorkbenchWindow()得到的就是IWorkbenchWindow。IWorkbench利用其包含的IWorkbenchWindow向终端用户展现信息。workbench window是workbench中最顶级的window。包括菜单栏、工具栏、状态栏以及一个用来显示IWorkbenchPage的主区域。每个IWorkbenchWindow包含0个或多个IWorkbenchPage,但是同一时刻只允许一个IWorkbenchPage被激活并向最终用户显示。

IWorkbenchPage

IWorkbenchPage的功能就是组织一个或多个IWorkbenchPart(IEditorPart或IViewPart)显示在一个IWorkbenchWindow中,最终呈现给最终用户。IWorkbenchPage包含0个或多个IEditorPart或IViewPart,这些IEditorPart和IViewPart完全被包含在这个IWorkbenchPage并且不能与其它的IWorkbenchPage共享。IWorkbenchPage上定义的Layout和ActionSet就是我们常说的透视图——perspective了。

WorkbenchPage:workbench中view和editor的集合。

    IWorkbenchPage.findView(viewName)可以得到IViewPart。

    IWorkbenchPage.findEditor(IEditorInput)可以得到IEditorPart。

获取WorkbenchPage的方法:

    ViewPart.getViewSite().getPage()。(getViewSite()得到的是IWorkbenchPartSite)

    getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()。

    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()。

IWorkbenchPart

WorkbenchPart是所有workbench parts的基类,如ViewPart和EditPart。不直接继承。

IWorkbenchPart就是上面提到的IEditorPart和IViewPart,它也只包含这两个子类型。

IViewPart常常被用于导航信息的层次结构,例如我们的workspace,或者用来打开一个编辑器,或者用来显示这个编辑器的某些属性

IEditorPart多被用来编辑或浏览一个文档或一个输入的对象,而这个输入的对象必须是一个IEditorInput,IEditorPart遵循的就是打开-保存-关闭的生命周期模型

IWorkbenchPart的生命周期模型:

    创建IWorkbenchPart扩展点

        实例化IWorkbenchPart

        创建一个IWorkbenchPartSite

        调用part.init(site)

    IWorkbenchPart成为可见:

        调用part.createControl(parent)绘制 IWorkbenchPart

        激活partOpened event

    IWorkbenchPart被激活或者取得焦点:

        调用part.setFocus()

        激活partActivated event

    IWorkbenchPart被关闭:

        如需要保存,完成保存

        解除IWorkbenchPart的激活状态

        激活partClosed event

        从界面上移除IWorkbenchPart

        调用part.dispose()

PartPane:ViewPane和EditorPane的基类。

PartSite:ViewSite和EditorSite的基类,实现IWorkbenchPartSite。

IEditorInput:是editor input轻量级的描述符(descriptor),类似文件名,但更加抽象。它并不是一个model,而是为IEditorPart的model源的描述。

小结

本文介绍了一些RCP的基本概念,在接下来的随笔中将通过实例讲解如何进行RCP开发。

目 录 1.富客户端平台 1 1.1.概述 1 1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 2.1.创建一个RCP程序 2 2.2.启动你的RCP程序 5 2.3.应用程序VS 产品 6 3.应用程序里的插件ID 7 4.Actions的用法(菜单和工具栏) 7 4.1.概述 7 4.2.通过编码添加 8 4.3.由“扩展”方式向程序添加菜单和工具栏 11 5.添加组合键 19 5.1.概述 19 5.2.声明actions的组合键 19 6.系统托盘 24 7.外观 30 7.1.向程序中添加视图模板 31 7.2.向应用程序添加VIEW 36 7.3.向VIEW里添加action 40 8.和编辑器一起工作 51 8.1.概述 51 8.2.创建工程 51 8.3.创建并准备domain 模型 51 8.4.在视口中使用domain模型 57 8.5.加入编辑器 58 8.6.调用编辑器 66 8.7.向编辑器提供内容 70 9.对话框 71 9.1概述 71 9.2.预定义的对话框 71 9.2.1.概述 71 9.2.2.创建工程 71 9.2.3.声明action 71 9.2.4.调用对话框 71 9.3.用户自定义对话框 74 9.3.1.概述 74 9.3.2.创建工程 74 9.3.3.声明action 74 9.3.4.声明action 74 9.3.5.创建对话框 75 10.向导(wizard) 77 10.1.概述 77 10.2.例子 77 11.首选项 85 11.1 首选项 85 11.2.使用首选项 85 11.3.首选项页 91 12.添加状态条 97 12.1.安装状态条 97 12.2.共享状态条 98 13.透视 103 13.1.向你的程序中添加透视图 103 13.2.使透视图可选。 107 13.2.1.使透视图可由一个coolbar可选 107 13.2.2.使透视图可通过菜单选择。 109 14.进度报告 112 15.将外部类包含进你的程序 118 15.1.概述 118 15.2.向构建路径中添加jar 118 15.3.使jar在你的运行路径里有效 119 16.提示和策略 120 16.1.控制台日志 120 16.2.保存用户的布局 121 16.3.获得display 122 16.4.使用eclipse的“保存”action 123 16.5.装载模型 127 16.6.向你的程序添加错误日志视口 127 17.制造一个产品 129 17.1.概述 129 17.2.创建一个工程 130 17.3.测试你的产品 134 18.商标 134 18.1.欢迎页面 134 18.2.商标 135 18.3.风格化launcher 136 19.发布你的产品 137 20.发布引入外部jar的产品 141 20.1.整合外部jar和第三方库 141 Tip 142 21.1.创建一个新工程 144 21.2.创建一个产品 144 21.3.添加依赖性 145 21.4.向程序中添加action 146 21.5.创建一个帮助插件工程////原著写的不好 149 22.附录:配置文件 152 22.1.概述 152 22.2..project 153 22.3.Manifest.MF 154 23.附录:使用接口技术 154 23.2.Jface 154
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值