作者:梁祺 (eclipsesbs@gmail.com)
来自:http://www.benisoft.net/day1/index.html
刚开始接触Plug-in开发,我们可以先看一个最简单的Plug-in,Hello World。这个Plug-in可以通过Eclipse提供的模版生成,不需要写任何代码。不过通过这个Plug-in,可以了解Plug-in的基本结构,对于今后的Plug-in开发是很有帮助的。下面我们就开始吧。
首先启动Eclipse,来创建一个Plug-in项目。在主菜单选择“File/New/Project”。
![](http://www.benisoft.net/day1/day1A.png)
在“New Project”对话框中选择“Plug-in Project”,点击“Next“。
![](http://www.benisoft.net/day1/day1B.png)
在“New Plug-in Project”对话框中,在”Project name“文本框输入项目名,这里我们输入“eclipse.tutorial.day1“。顺便看一下”Location“文本框,也就是新创建的项目在磁盘上的位置,方便今后查找。其他的属性就不用改了,点击“Next“。
![](http://www.benisoft.net/day1/day1C.png)
这里我们需要输入Plug-in的一些基本信息。
- ID:Plug-in的ID是Plug-in的唯一标识,我们输入“ eclipse.tutorial.day1”。
- Version:我们就用缺省值"1.0.0.qualifier",”1.0.0“比较好理解,”qualifier“我们后面会看到,在Plug-in导出时,它会被替换成导出的日期。
- Name:用以表达Plug-in用途,用户在安装Plug-in的时候,是通过这个名字了解这个Plug-in是做什么用的。
- Vendor:就是开发者或公司名称,我们这里用不着。
- Execution Environment,是指定Plug-in运行的环境要求,比如Java 1.5还是1.6,等等。
其他选项用就用缺省值,点击“Next“。
![](http://www.benisoft.net/day1/day1D.png)
在接下来这页,选择模版“Hello, World”。从右面的解释,可以看到这个模版演示如何使用Action Set来创建菜单和工具栏按钮,在Eclipse里,菜单和按钮都由Action来完成,Action是Eclipse里非常灵活的一个部分,当然也很复杂。另外,Eclipse里大量使用扩展点来添加功能,在这个例子里,就用到“org.eclipse.ui.actionSets”这个扩展点,通过扩展这个扩展点,可以在Eclipse的主菜单栏和工具栏中插入我们的菜单项和工具栏按钮。当然,插入的位置是Eclipse预先保留给其他Plug-in的。点击“Next“。
![](http://www.benisoft.net/day1/day1E.png)
我们定义的Action需要告诉Eclipse菜单项的显示文字,Tooltip文字,图标,一个符合要求(实现接口)的Action类,以及快捷键等等。详细的内容我们等一会儿会看到。这里模版只要求提供如下几项:
- Java Package Name:输入“eclipse.tutorial.day1.actions”作为Action类的Java包名
- Action Class Name:输入Action的类名为SampleAction
- Message Box Text:这个模版演示的Action会打开一个对话框,并显示这里输入的文字。我们用缺省的“Hello, Eclipse world”。
点击”Finish“。
![](http://www.benisoft.net/day1/day1F.png)
这样,一个Plug-in项目就建好了。项目里的绝大部分文件都可以在左侧的Package View里找到,但是”.project“和”.classpath“这两个文件除外。(不过你仍然可以通过Navigation View找到它们,一般情况我们不需要这样做)。项目包含三个文件。
- src: 存放Java源文件
- icons: 存放Plug-in用到的图像文件
- META-INF: 只存放MANIFEST.MF文件
![](http://www.benisoft.net/day1/day1L.png)
Package View右面是Plug-in Editor,通过它,你可以查看或修改Plug-in的任何信息。它的内容来源于两个文件,MANIFEST.MF和plugin.xml。前者提供Plug-in的ID,版本,与其他Plug-in之间的依赖关系等Plug-in的配置信息,后者则定义了当前Plug-in的所有扩展。Plug-in Editor有很多配置子页,大部分都很直观,这里就不多作解释了。
![](http://www.benisoft.net/day1/day1M.png)
运行一下看看这个Plug-in运行起来怎么样。在Plug-in Editor的Overview子页中,点击“Launch an Eclipse Application”。事实上,我们启动的是加载了Hello World这个Plug-in的Eclipse,Plug-in本身是无法独立运行的,它必须在Eclipse提供的框架中运行,这个框架提供了Plug-in运行所需要的运行时环境。等Eclipse启动起来后,在主菜单栏里找到“Sample Menu”,选择“Sample Action”。
![](http://www.benisoft.net/day1/day1H.png)
我们会看到下面这个对话框,对话框里显示的“Hello, Eclipse world”就是我们刚才输入的内容。
![](http://www.benisoft.net/day1/day1I.png)
到目前为止,我们没有编写任何代码,那它到底是怎么工作的呢?下面我们来看一下。首先找到Plug-in Editor的Extensions子页,这个页面列出Plug-in扩展的所有扩展点,也就是Extension Point。这个Plug-in只扩展了扩展点“org.eclipse.ui.actionSets”。它先是定义了一个Action Set,名字是“Sample Action Set”。Action Set允许你把同一类的Action归在一起,便于管理。这个Action Set定义了一个名为“Sample Menu”的菜单。菜单下面的sampleGroup是一个菜单分割线,菜单分割线一方面起了对Action分组的作用,把同一类的Action挂到同一个sampleGroup上,就可以保证它们在菜单显示时处于相邻的位置。另一方面,菜单里会出现一个分割线,把归属于不同菜单分割线的Action隔开,所以它被称为分割线(separator)。
最后我们说一下Sample Action,它有很多东西需要定义:
- id:每个Action需要有一个标识,命名方式类似于Java包名的命名方式。
- label:指定出现在菜单上的文字,&符号以及它后面的字母标识Action的快捷键。
- menubarPath:指定Action在菜单中的位置,“sampleMenu/sampleGroup”表示放在主菜单栏中ID是sampelMenu的菜单里,和ID为sampleGroup的其他Action放在一起。
- toolbarPath:指定Action在工具栏中的位置,工具栏不象菜单栏是有层次结构的,所以定义起来就比较简单,只要给个组名就可以了。
- icon:指定图标文件在Plug-in项目中的相对路径。
- tooltip:显示Tooltip文字。
- class:指定Action的Java类。把鼠标移到class上,我们能看到Action的Java类必须实现IWorkbenchWindowActionDelegate,或者IWorkbenchWindowPulldownDelegate接口。点击class,就可以打开Java类文件,非常方便。
![](http://www.benisoft.net/day1/day1N.png)
SampleAction这个类实现了IWorkbenchWindowActionDelegate接口,其中最重要的方法就是run方法,用户选择菜单后,在这个方法会弹出一个对话框。
* The action has been activated. The argument of the
* method represents the \'real\' action sitting
* in the workbench UI.
* @see IWorkbenchWindowActionDelegate#run
*/
public void run(IAction action) {
MessageDialog.openInformation(
window.getShell(),
\ "Day1\",
\ "Hello, Eclipse world\");
}
到此为止,我们可以看到,Hello World Plug-in通过扩展“org.eclipse.ui.actionSet”这个扩展点,定义了一个Action,包括它的菜单名,图标,在菜单栏和工具栏中的位置,以及Java类SampleAction, SampleAction根据“org.eclipse.ui.actionSet”扩展点的要求,实现IWorkbenchWindowActionDelegate接口,在run方法里完成动作,弹出对话框。
非常的简单,不是吗?