快速掌握Eclipse Plugin / RCP开发思想

快速掌握Eclipse Plugin / RCP开发思想java

 

李晓明 (lxm@lxm.name)程序员

 

引言

本文不是快速入门的文章,只面向有必定基础的开发人员,至少看这篇文章以前你应该了解什么是Eclipse,什么是RCP,什么是Plugin,什么是架构,什么是软件框架等等概念。不然的话这篇文章也帮不了你什么。另外,本人对RCP的理解也是处于只知其一;不知其二的程度,若有错误还请指出。算法

 

Eclipse是一种面向开发人员的编程环境(IDE),同时它也是一个很好的平台,它提供了一种架构,或者说一种软件框架,可让开发人员相对比较容易的开发出功能比较强大的,带有人机交互功能的应用程序。编程

 

Eclipse这种强大的功能是经过其插件(Plugin)来实现的,RCP也是如此。RCP的全称是Rich Client Platform,其根本就是把Eclipse的应用平台剥离了其余的插件以后剩下的东西,天然其架构和原理与eclipse自己是同样的。RCP也能够经过插件来进行扩展,但RCP每每是用来开发一些像Eclipse同样独立的应用程序。架构

 

本文帮助对RCP不是很清楚的人快速的理解Eclipse RCPPlugin的工做原理与开发方法。框架

 

基本知识

让咱们闭上眼睛静下心来冥想一下,咱们能够想象,若是要开发一个带有人机交互的应用程序,必备的几个部分是什么?eclipse

 

人机界面。人机界面在某些应用程序中基本上就能够当成是软件的核心了,特别是一些轻量级的应用中。VB这方面作的就很好,它基本上就是一个以界面为核心的开发环境,我曾经在上课的时候讲过,VB编程基本上就两步,第一步画好界面,第二步写界面的响应代码(事件处理程序)。这个思路基本上能够解决百分之八十的Vb编程应用。人机界面其实是人机交互的一部分,它能够将各类数据用图形化的方法呈现给操做者。虽然有人会认为人机界面还应当包括用户对界面操做所做出的响应,例如用户在用鼠标点击按钮时按钮的按下效果等,但这本质上仍是属于可视界面的范畴,并且是提早预约好的,并非一种真正的交互。编辑器

 

数据模型。这在应用程序中是相当重要的,由于界面所显示的内容主要是从数据模型中获取的,另外用户经过界面录入的数据也是要存储到数据模型中去的。这也是软件存在目的之一,获取数据,管理数据和修改数据等。对于数据和数据模型,通常的程序员都有着深入的理解,这里就不赘述了。不是一度计算机软件被宣称等于数据加算法的吗?ide

 

用户命令输入。人机交互的另外一部分,即用户能够经过人机界面输入(或者释放)相应的命令。在目前的人机交互模型中,用户命令的输入一般是经过一些控件来实现的,例如按钮,文本框,快捷键,菜单等。在触摸界面中还包括手势,在智能系统中甚至包括语音等。工具

 

业务逻辑。这是软件的主要功能,也是用户需求的集中体现。业务逻辑一般是用户命令激发的,包括对数据进行分析和处理,并得到新的可供展现的数据的过程。固然也有一些业务逻辑是在后台执行的。

 

用图形的方式来展现这四个部分的功能:

 

你们都是作软件开发的,不知道你们有没有想过,这四个部分实际上是能够作到相互之间是独立的。其实你们都知道有一个著名的MVC模型(Model-View-Control)模型和这个基本上是同样的。可是MVC我一直以来也没有搞明白其中的Control是什么功能,因此我认为我上面提出的四个部分的功能分解是比较好理解的。

 

Eclipse的框架里,因为Eclipse是面向人机交互的,因此在框架里是不包含数据模型这一块的,业务逻辑这块也只包括用户命令处理这一部分,其框架的大部分功能都集中在人交互这块。用图形表述一下是这样的:

 

Eclipse Platform的名词介绍

接下来介绍一下Eclipse里的经常使用到的术语。

 

界面

首先看一下界面部分。下图是Eclipse应用程序的界面。

界面最外面的叫作Workbench Window。也是应用程序最顶层的界面模块。通常来讲一个应用会有一个Workbench Window,不过根据Eclipse的手册说明,其实也能够有多个Workbench Window,可是怎么实现还不清楚,目前接触的例子都是单窗口的。

 

Workbench Window包含了主菜单(Menu Bar),工具条(Tool Bar),状态条(Status Bar)和一个页面Page。这些都是典型的GUI程序锁必备的。

 

页面Page是应用程序窗口的主界面,也是工做区界面。Page里包括各类的ViewEditorViewEditor都称为Part。因此View也称为ViewPartEditor也称为EditorPartViewEditor的区别在于:View一般是用来显示目录树,属性窗口,文档结构图等相似内容,能够把View当作是数据在某个功能界面上的反映,并且View所作的修改会马上生效。Editor顾名思义是用来编辑文档的,或者修改文档内容的,Editor所作的修改必需经过专门的保存命令进行存储生效。在Editor界面关闭的时候会检查文档内容是否为“脏”,并提示用户保存为“脏”的文档。除此以外,二者太大的区别。

 

在编程行为上看,editorView最大区别就是:同一类(来自同一个类)的View在界面中只能有一个,而同一类的Editor能够有多个,可是同一个文档只能打开一个对应的Editor

扩展点(Extension Point

Eclipse的插件开发全靠扩展点这个玩意了。扩展点顾名思义就是开发者能够对原程序进行功能和界面扩展的地方。

 

个人理解,扩展点就是应用程序留下来的插座,扩展程序经过使用扩展点,能够把本身编写的代码接入到原有程序中。可是不一样的扩展点,能够接入的东西是不同的,须要程序员仔细体会。从Java程序开发的角度来看,只要写的类使用了约定的接口,就能够被平台类加载和调用。从这个意义上来说,扩展点接入的实际上不是代码,而是对接入代码的描述。经过扩展点接入的声明,能够告诉Eclipse平台,使用什么功能的时候调用什么类,新的插件提供了哪些功能,或者扩展了原有的哪些功能等。从这个意义上将,扩展点本质上是配置信息。

 

RCP中的扩展点很是多,并且RCP甚至还容许开发者建立新的扩展点!因此,这里咱们只给你们介绍一下RCP中的基本的扩展点。

 

须要说明的是,RCP中强调的是尽可能的少写代码。特别是界面这块,所以,大部分的界面相关的东西都是能够经过扩展点实现的。固然有不少功能用代码也能够实现,可是简单的用XML配置文件就能够实现一个界面岂不是更好吗?

 

扩展点使用方法

org.eclipse.ui.views

这个扩展点定义了系统当中的全部的View

<extension

    point = "org.eclipse.ui.editors">

      <editor

            class="org.eclipse.ui.examples.contributions.editor.InfoEditor"

            icon="icons/editor.gif"

            id="org.eclipse.ui.examples.contributions.editor"

            name="%contributions.editor.name">

      </editor>

</extension>

Category主要用于分类参数配置。Eclipse有本身专门的参数设置界面,属于同一个Category的类会出如今同一个设置面板中,其余没有什么做用。

 

这里能够用本身写的View,也能够用别人已经写好的Viewclass这个选项的值指向的是具体运行这个视图的类。这个View的代码须要本身写,必需继承ViewPart这个虚拟类或者实现IViewPart这个接口。

org.eclipse.ui.editors

这个扩展点下面要给出软件系统中全部的Editor

 

<extension

    point = "org.eclipse.ui.editors">

      <editor

            class="org.eclipse.ui.examples.contributions.editor.InfoEditor"

            icon="icons/editor.gif"

            id="org.eclipse.ui.examples.contributions.editor"

            name="%contributions.editor.name">

      </editor>

</extension>

 

Editor有本身特有的一些属性,例如extension属性,能够指定editor可以打开的文件类型等。对于某些不须要编辑器的应用,能够忽略这部份内容,由于大部分的不须要编辑器的应用实际上不须要Editor,只须要View

org.eclipse.ui.commands

这个扩展点里面收集了大量的命令。以前一节讲到了命令这个概念,你们千万不要误会这里的命令。这里的命令指的是用户能够经过界面产生的命令,可是这里的命令是没有实现的。也就是说,你能够在这里本身定义大量的命令,但能够本身不实现,等待后续有人写新的扩展来实现你制定的命令。固然,绝大多数咱们写的程序不会指望别人来帮咱们写代码,本身仍是要写代码来实现这里的命令的,可是咱们写的代码不会在这里有体现,而是体如今后面要讲的handler里。

 

<extension

point="org.eclipse.ui.commands">

      <command

categoryId="org.eclipse.ui.examples.contributions.commands.category"

            id="org.eclipse.ui.examples.contributions.view.count"

            description="%contributions.view.count.desc"

            name="%contributions.view.count.name">

      </command>

      <category

            name="%contributions.commands.category.name"

            description="%contributions.commands.category.desc"

            id="org.eclipse.ui.examples.contributions.commands.category">

      </category>

</extension>

 

org.eclipse.ui.menus

这个扩展点对于我们编程序的人来讲过重要了。前面咱们刚看到了command,会疑惑说,command实际上就是一个花架子,其实什么都不作,这样子弄个command什么用处呢?用处太大了。Command比如定义了用户的一条指令,比方说在View上弄个曲线什么的。可是这个指令怎么发出的呢?Command这个扩展点并无说明,缘由就是要留到这里说。Menus这个扩展点里要定义的,就是用户的Command如何发出的问题。

 

通常状况下,用户的command主要经过人机界面发出,经常使用到的控件为菜单,工具条,快捷键等。快捷键暂且不表,这里主要定义了菜单(各类类型)以及工具条。

 

   <extension

         point="org.eclipse.ui.menus">

      <menuContribution

locationURI="menu:org.eclipse.ui.examples.contributions.view?after=additions">

         <command

               commandId="org.eclipse.ui.examples.contributions.view.count"

               mnemonic="%contributions.view.count.mnemonic">

         </command>

         <command

               commandId="org.eclipse.ui.examples.contributions.view.edit"

               mnemonic="%contributions.view.edit.mnemonic">

         </command>

         <command

               commandId="org.eclipse.ui.file.refresh"

               mnemonic="%contributions.view.refresh.mnemonic">

         </command>

      </menuContribution>

      ...

 

一个MenuContribution就定义了一个菜单。Command标签订义了菜单对应的命令。经过这些文本,就将菜单与命令结合了起来。Command里的label属性定义了菜单的标签,天然也能够定义图标,菜单的属性(push,仍是radio),以及tooltip等。

 

其中一个很重要的属性是locationURI。它定义了菜单在什么地方显示。下面几个例子有所说明:

 

menu:org.eclipse.ui.main.menu?after=window 

在主菜单中插入菜单

 

menu:file?after=additions

同上

 

menu:org.eclipse.ui.views.ContentOutline?after=additions

View上显示菜单(又叫作快捷菜单)

 

toolbar:org.eclipse.ui.views.ContentOutline?after=additions

View上的工具条位置上显示菜单(其实是工具按钮)

 

popup:org.eclipse.ui.examples.propertysheet.outline?after=additions

在某个View上显示弹出菜单(右键菜单)

 

可见,经过上述方法,能够定义任意地方上的菜单,工具条等。关键的一点是,你不须要写任何代码,很是的爽。

org.eclipse.ui.handlers

尽管在界面上放置菜单是不须要写任何代码的,可是对命令的处理时必需要写代码的,这个时候就须要handler扩展了。

 

Handler是对命令的实现。能够放在这里:

 

      <command            categoryId="org.eclipse.ui.examples.contributions.commands.category"

            defaultHandler="org.eclipse.ui.examples.contributions.handlers.GlobalMenuHandler"

            id="org.eclipse.ui.examples.contributions.commands.globalCommand"

            name="%contributions.commands.globalCommand.name">

      </command>

 

也能够放在这里:

 

      <handler

class="org.eclipse.ui.examples.contributions.handlers.GlobalMenuHandler"

commandId="org.eclipse.ui.examples.contributions.commands.globalCommand">

      </handler>

 

无非就是将实现类与commandid关联起来。这个实现类必需要继承AbstractHandler或者实现IHandler接口。

 

须要说明的是,一个命令能够有多个Handler,由于每一个handler有本身的scope(做用域),通常说来,越具体的UI组件所实现的Handler具备越高的优先级。不过这个属于比较高级的话题,感兴趣的能够去研究一下Eclipse的帮助文档。(注:此段可能有误)

 

RCP程序的开发方法

这里简明扼要的介绍一个RCP应用程序的开发方法,相似介绍网上较多,能够去搜索学习。

 

通常状况下利用向导获得的应用程序,代码里包括这么几个文件:

 

Application.java这个文件里包括了应用程序的一些信息,包括启动界面和关闭界面。若是你须要在打开界面的时候作一些事情(例如让用户输入验证密码等),能够在这个文件里进行处理。

 

ApplicationWorkbenchAdvisor.java这个文件用来配置平台的一些信息。这个里面一个重要的方法是返回默认的Perspective

 

ApplicationWorkbenchWindowAdvisor.java这个文件用来配置窗口的一些属性的。

 

ApplicationActionBarAdvisor.java是用来配置工具栏的。

 

 

最重要的是配置plugin.xml这个文件。Eclipse提供了各类的辅助工具来编辑这个文件,里面最重要的是这个extensions标签。这个能够用右键添加各类item。最重要的是用来编辑menusviewscommandshandlers。其属性在前面已经介绍过了,若是有不明白的能够查阅帮助。

相关文章
相关标签/搜索