`

编写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。双击它,你编写的代码出来了吧!
分享到:
评论
1 楼 Breather.杨 2012-07-06  
http://rfid.hongbo.net.cn/products/jira

相关推荐

    eclipse扩展点介绍 插件

    **一、Eclipse扩展点的概念** Eclipse的扩展点是它插件系统的核心组成部分,它定义了插件可以插入或扩展的特定位置。这些位置可能包括菜单项、视图、编辑器、构建过程等。每个扩展点都有自己的标识符,由提供该扩展...

    开发自己的eclipse扩展点

    在IT行业中,开发自己的Eclipse扩展点是一项高级技能,它涉及到Eclipse插件开发和平台扩展的深入理解。Eclipse作为一个强大的集成开发环境(IDE),提供了丰富的可扩展性,允许开发者根据自己的需求定制功能。本篇文章...

    Eclipse常用插件扩展点

    本篇文章将深入探讨Eclipse插件开发中的关键知识点,包括插件扩展点、RCP(Rich Client Platform)应用开发以及如何在Eclipse RCP中整合第三方库。 首先,让我们了解Eclipse插件扩展点。扩展点是Eclipse平台提供的...

    Eclipse插件开发扩展点API中文.chm

    "Eclipse插件开发扩展点API中文.chm"文档就是为帮助开发者理解并使用Eclipse插件开发中的扩展点API而编写的中文指南。 扩展点(Extension Point)是Eclipse插件框架的关键概念,它是插件之间进行交互和扩展的基础。...

    osgi 扩展点实例

    1. **Eclipse扩展点定义**:Eclipse中的扩展点通常由XML文件定义,包含ID、名称、描述等信息,以及插件可以提供的服务或组件的详细规格。 2. **Eclipse插件实现**:开发者在自己的插件中通过实现指定的扩展点,声明...

    RCP、PDE、Eclipse插件、模态、阻塞Eclipse平台、扩展点知识

    "扩展点"是Eclipse插件系统的关键概念,它是Eclipse平台允许插件之间进行通信和扩展的机制。通过定义和实现扩展点,插件可以声明它们提供的功能,而其他插件则可以通过这些扩展点来使用或扩展这些功能。 在压缩包的...

    自定义eclipce扩展点代码实例

    本文将深入探讨“自定义Eclipse扩展点代码实例”这一主题,通过项目实例来阐述如何创建和使用扩展点,以提高开发效率。 Eclipse插件体系的核心在于OSGi框架,它允许开发者通过定义、实现和组合扩展点来增强Eclipse...

    Eclipse编写的Java记事本

    学习和分析这个项目,我们可以深入理解以下Java和Eclipse相关的知识点: 1. **Java基础**:包括数据类型、控制结构(循环、分支)、类与对象、继承、多态、异常处理等。这些基础知识构成了程序的核心逻辑。 2. **...

    自定义eclipce扩展点步骤(详细).doc

    创建自定义的Eclipse扩展点通常包括以下几个步骤: 1. **创建插件工程**: 首先,你需要创建一个新的Eclipse插件工程。在本例中,创建了一个名为"TheMainMenuProject"的RCP(Rich Client Platform)项目。RCP项目...

    eclipse插件开发步步教你

    本教程旨在逐步指导初学者进行Eclipse插件的开发,通过实例演示如何利用Eclipse平台的API和扩展点来实现各种功能。 首先,我们要理解Eclipse插件的基本概念。Eclipse插件是基于OSGi模块系统构建的,每个插件都是一...

    用eclipse 编写的servlet小demo

    【标题】"用eclipse 编写的servlet小demo"是一个简单的Java Web项目,它展示了如何在Eclipse集成开发环境中创建和运行一个Servlet程序。Servlet是Java编程语言中用于扩展服务器功能的Java类,通常用于处理HTTP请求。...

    eclipse插件开发ppt

    开发Eclipse插件的基本步骤包括:确定插件与平台的集成方式、定义所需的扩展点、实现扩展点功能、编写plugin.xml文件来描述插件信息,然后进行测试、封装和发布。常见的扩展点包括视图(Views)、编辑器(Editors)...

    Eclipse中类型扩展机制分析

    1. **扩展点(Extension Point)**:这是Eclipse插件系统的核心,由一个插件定义,描述了可以被其他插件扩展的特定领域。扩展点通常包含一系列属性,这些属性定义了扩展的具体形式和内容。 2. **扩展(Extension)*...

    Eclipse插件开发学习笔记.pdf

    在Eclipse中,插件主要由一系列的扩展点(Extension Points)组成,这些扩展点定义了插件可以提供的功能。插件开发者需要根据Eclipse平台提供的扩展点来开发自己的插件,从而与Eclipse的其他部分集成。 在进行...

    Eclipse入门Eclipse的使用简介及插件开发.rar

    Eclipse的插件开发还包括编写扩展点(Extension Points)和扩展(Extensions)。扩展点是Eclipse预先定义的接口,如菜单项、工具栏按钮等。扩展则是对这些接口的具体实现,通过XML描述文件与扩展点关联。 最后,...

    eclipse插件开发PDF

    3. 编写扩展点:Eclipse插件之间通过扩展点来通信,开发者需要定义和实现扩展点来提供或使用其他插件的功能。 4. 用户界面开发:可以使用SWT(Standard Widget Toolkit)和JFace来开发用户界面。SWT模拟了操作系统...

    打造基于Eclipse的IDE产品

    插件开发过程中可以利用Eclipse提供的API和扩展点来实现特定功能,并通过各种开发和调试工具来完善插件。 例如,可以通过Eclipse插件来实现一个流程调试插件。这个插件的基本功能可能包括流程图编辑器、将流程定义...

Global site tag (gtag.js) - Google Analytics