自己动手编写Eclipse扩展点

扩展(Extension)是Eclipse中一个关键的机制,plug-in利用扩展向Eclipse平台添加新功能。但是扩展不能随意地创建,必须按照扩展点(extension point)定义的规范进行明确的声明,Eclipse才能认出这些扩展。我们不仅可以使用Eclipse提供的众多现成的扩展点,而且还可以定义新的扩展点,并在该扩展点上进行扩展。
当然,扩展点的定义比较复杂。不过Eclipse为用户提供了图形化的编辑界面,我们只要输入一些信息,Eclipse就会自动生成代码,使扩展点的定义变得非常简单。
下面我们就来看看如何在Eclipse中创建一个新的扩展点,并在这个扩展点上进行扩展。
我们需要做以下的工作:
1.设计该扩展点
2.定义扩展点,即编写扩展点的清单文件
3.编写代码来载入该扩展点的扩展
我们以创建workList扩展点为例,进行详细介绍。
worklist完成的功能是:创建一个view,在其中以树状显示系统中可用的功能模块,通过双击某个模块节点,执行该扩展定义的方法(method)。其实相当于一个控制台,通过控制台来运行不同的功能。
由于Eclipse是由一个运行时核心(runtime core)和众多插件组成的,我们也将workList扩展点定义在一个插件中,有关workList的代码文件也放在这个插件中,这样便于查找和修改,也不影响Eclipse本身的代码。

1. 定义扩展点
首先我们要创建一个存放新扩展点信息的插件net.softapp.worklist,这个插件对org.eclipse.ui.views进行扩展,以下是插件的plugin.xml文件在views扩展点的信息:
<extension
point="org.eclipse.ui.views">
<category
name="WorkListCategory"
id="WorkListCategory"/>
<view
icon="icons/sample.gif"
class="net.softapp.internal.worklist.WorkListView"
category="WorkListCategory"
name="WorkList视图"
id="net.softapp.internal.worklist.WorkListView"/>
</extension>
这样就可以通过“window->show view->other”,在弹出的“Show view”对话框中选择“WorkList视图”,打开视图,我们用这个视图显示workList扩展点的所有扩展信息。“Show View”对话框显示了Eclipse中定义所有视图,即所有org.eclipse.views扩展点的扩展。了解这一点很重要,因为我们在编写workList扩展点代码时,就可以模仿甚至拷贝views扩展点的代码。
下面,我们要在net.softapp.worklist插件中定义workList扩展点。
扩展点的定义文件按照Eclipse的存放方式,一般存放在schema目录下,我们把文件命名为worklist.exsd。内容如下,此内容由PDE生成:
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="mtn.esip.worklist">
<annotation>
<appInfo>
<meta.schema plugin="net.softapp.worklist" id="workList" name="workList"/>
<!--通过这个定义,我们可以看出,定义的扩展点的id是 net.softapp.worklist.workList,以后引用时要注意,同时注意大小写-->
</appInfo>
<documentation>
[Enter description of this extension point.]
</documentation>
</annotation>

<element name="extension">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="category" minOccurs="0" maxOccurs="1"/>
<element ref="worklist" minOccurs="0" maxOccurs="1"/>
</choice>
<attribute name="point" type="string" use="required"><!--定义point-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string"><!--定义id-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string"><!--定义name-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>

<!--定义category-->
<element name="category">
<complexType>
<attribute name="name" type="string"><!--定义category/name-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string"><!--定义category/id。引用category时,必须指出应用的id,而name给出了一个可供显示的直观的名字-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="parentCategory" type="string"><!--定义父category,也就是说我们的category可以嵌套形成树状结构-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>

<!--定义worklist,注意大小写-->
<element name="worklist">
<complexType>
<attribute name="name" type="string"><!--定义worklist/name,可供显示的直观的名字-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="icon" type="string"><!--定义worklist/icon,可供显示的直观的图标-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="category" type="string">!--定义worklist/category,存放的category位置。如果引用嵌套形式的category,则采用 parent_id/child_id的形式 -->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string"><!--定义worklist/class,实现功能的类名称-->
<annotation>
<documentation>
</documentation>
<appInfo>
<meta.attribute kind="java"/>
</appInfo>
</annotation>
</attribute>
<attribute name="id" type="string" use="required"><!--定义worklist/id,唯一标志-->
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<!--以下内容为PDE自动生成,与我们的编程无关-->
<annotation>
<appInfo>
<meta.section type="since"/>
</appInfo>
<documentation>
[Enter the first release in which this extension point appears.]
</documentation>
</annotation>

<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>

<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>

<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>

<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>

</schema>
这样我们就定义好了扩展的属性。
然后在plugin.xml加入:
<extension-point id="workList" name="workList" schema="schema/workList.exsd"/>
就定义好了!

2. 实现扩展
定义完扩展之后,接下来要编写解析此扩展的相关代码。可喜的是,Eclipse为我们提供了大量的API可以调用,省下了若干代码的编写。另外我们还可以借鉴Eclipse实现的其他代码,通过模仿来编写我们自己的解析代码。本例参考了View的解析部分。同View,我们定义了WorkListDescriptor,WorkListRegistry,WorkListRegistryReader.其中WorkListDescriptor完成对上述定义的解析,WorkListRegistry存放了其他插件对workList扩展的相关信息,WorkListRegistryReader则从WorkListRegistry读取信息供我们使用。
此处代码从略,具体请参考View实现部分的ViewDescriptor,ViewRegistry,ViewRegistryReader相关代码。

3. 编写界面部分
根据1对View的扩展,我们需要编写界面部分。此处请参考View插件的编写。我们在此对WorkListPlugin添加了一个方法用以从注册表中读取扩展信息:
public IWorkListRegistry getWorkListRegistry() {
if (workListRegistry == null) {
workListRegistry = new WorkListRegistry();
try {
WorkListRegistryReader reader = new WorkListRegistryReader();
reader.readWorkList(Platform.getExtensionRegistry(), workListRegistry);
} catch (CoreException e) {
// cannot safely show a dialog so log it
WorkbenchPlugin.log("Unable to read workList registry.", e.getStatus()); //$NON-NLS-1$
}
}
return workListRegistry;
}
其中WorkListRegistryReader.readWorkList定义如下:
/**
* Read the workList extensions within a registry.
*/
public void readWorkList(IExtensionRegistry in, WorkListRegistry out)
throws CoreException {
// this does not seem to really ever be throwing an the exception
workListRegistry = out;
readRegistry(in, WorkListPlugin.getDefault().getPluginId(), "workList");
out.mapWorkListToCategories();
}
可见,我们不需要编写复杂的代码就可以读取注册表中存放的扩展信息!
我们对workList扩展的显示是采用了TreeView,代码如下(WorkListView):
protected TreeViewer createViewer(Composite parent) {
TreeViewer viewer =
new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setUseHashlookup(true);
viewer.setContentProvider(new WorkListContentProvider());
viewer.setLabelProvider(new WorkListLabelProvider());
workListReg = WorkListPlugin.getDefault().getWorkListRegistry();
viewer.setInput(workListReg);
initListeners(viewer);
return viewer;
}
这样,就可以实现显示了。
那么,怎样实现选择某个扩展后,通过双击执行其功能呢?我们对TreeViewer添加了鼠标双击事件支持,关键代码如下:
protected void handleDoubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
Object element = selection.getFirstElement();

TreeViewer viewer = getWorkListViewer();
if (viewer.isExpandable(element)) {
viewer.setExpandedState(element, !viewer.getExpandedState(element));
}else {
WorkListDescriptor workList = (WorkListDescriptor)element;
try {
IWorkListPart workListPart = (IWorkListPart) workList.createWorkList();
workListPart.run();
} catch (CoreException e) {
// should add something to handle the exception
}
}

}
其中IWorkListPart很简单,使所有实现workList扩展必须实现的接口:
public interface IWorkListPart {

public void run();

}
只有一个run方法(可以自行添加其他的支持)。
其中WorkListDescriptor.createWorkList方法实现根据class的字符串创建一个对象,也是超级简单,因为Eclipse已经为我们编好了:
public Object createWorkList() throws CoreException {
Object obj = WorkbenchPlugin.createExtension(configElement, "class");
return obj;
}
这样就可以执行扩展的功能了。
但是别忘了,还要编写pluin.xml,否则Eclipse可不认吆:
<extension
point="net.softapp.worklist.workList">
<category
name="HelloTest"
id="HelloTest"/>
<worklist
icon="icons/example.ico"
class="net.softapp.internal.worklist.Hello"
category="HelloTest"
name="Hello"
id="net.softapp.internal.worklist.Hello"/>
</extension>

4.测试新扩展点

OK,开始运行Eclipse的plugin调试环境,打开WorkList视图,看看在树状列表里是不是有一个HelloTest目录,下面有Hello。双击它,你编写的代码出来了吧!

时间: 2024-08-03 17:15:35

自己动手编写Eclipse扩展点的相关文章

【Eclipse插件开发】在什么情况下创建扩展点

我想绝大部分Eclipse插件开发人员对扩展点这个概念应该都比较熟悉了,那 么什么时候决定创建自己的扩展点呢?简单的说一下俺的看法,错了不要笑话. 为什么说这个问题呢?亲眼看到一些插件开发刚入门的人,不怎么懂得扩展 点相关的东西,也谈不上理解扩展点机制,所以这个时候从来不自己定义新的扩 展点:过了一段时间之后,感觉使用Eclipse扩展点有点经验了(尤其是 workbench相关的扩展点肯定经常使用),开始定义自己的扩展点了,....,灾 难发生了,乱定义扩展点,各种想法的扩展点都出来了....

使用Eclipse BIRT扩展点:聚合

简介:了解 BIRT 扩展点模型,使用新的 V2.3+ 扩展模型在 BIRT 中创建基 本聚合扩展. 本文介绍商业智能和报告工具(Business Intelligence and Reporting Tools,BIRT)扩展点模型,并在 BIRT V2.3.x 和 V2.5.x 中实际创建一个聚合 扩展.在较早的 BIRT 版本中,创建聚合扩展的方式是扩展 org.eclipse.birt.data.aggregation 扩展点,这会在一个名为 Total 的全局对 象中添加一个小函数,您

eclipse rcp 扩展点view创建时机问题

问题描述 eclipse rcp 扩展点view创建时机问题 我创建了两个view扩展点,他们以分页方式布局,如图 启动时自动加载左边的页面(view类的构造函数和CreatPartControl被调用).只有当鼠标点击切换到右边页面时,对应view的构造函数和CreatePartControl方法才会被调用,页面才会创建.有没有什么方法让这个页面在这个插件启动时就自动创建,而不是点击后才创建.

一起谈.NET技术,13个不可不知的ASP.NET MVC扩展点

      ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中. 在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点. 1.ASP.NET MVC扩展之RouteConstraint 通常情况下你可以使用正则表达式对url参数

13个不可不知的ASP.NET MVC扩展点

ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中. 在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点. 1.ASP.NET MVC扩展之RouteConstraint 通常情况下你可以使用正则表达式对url参数进行约束,但

ASP.NET MVC中你必须知道的13个扩展点

ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点.Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在 以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助. ASP.NET MVC设计

自己动手编写CSDN博客备份工具-blogspider

来源:http://blog.csdn.net/gzshun   我之前一直在看lucene,nutch,发现有这么一个现成的小应用,特转来学习下!mark一下. 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫. 网络爬虫最重要的任务,就是从互联网搜索出需要的信息,将网页抓取下来并分析,很多搜索引擎,比如百度,谷歌,后台都有一只很强悍的网络爬虫,用来访问互联网上的网页,图片,视频等内容

Spring Boot 中如何使用 Dubbo Activate 扩展点

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 公司的核心竞争力在于创新 – <启示录> 』 继续上一篇:< Springboot 整合 Dubbo/ZooKeeper >,在 Spring Boot 使用 Dubbo Activate 扩展点.这是一个群友问的,我总结下,分享给更多人. 本文提纲 一.什么是 Dubbo Activate 注解 二.使用 Dubbo Activate 三.小结   运行环境:JDK 7

《Android App开发入门:使用Android Studio 2.X开发环境》——2-5 开始动手编写程序

2-5 开始动手编写程序 在这一节中,本书将会带领大家制作第一个互动 Android App.这个范例执行后会显示"Hello world!"字符串,并且可在用户单击屏幕上的按钮时自动放大文字. 我们会遵循设计 Android App 的流程,先将视觉外观的部分设计好,再加入控制互动行为的程序逻辑.通过实际演练这个范例可以对 Android App 的设计有更清楚的认识. 创建项目后,会自动打开项目并以图形布局编辑器打开布局文件. 在新建的 Android项目中,默认的布局含有两个组件