eclipce自定义扩展点创建过程.doc

上传人:仙人指路1688 文档编号:2388668 上传时间:2023-02-17 格式:DOC 页数:72 大小:2.28MB
返回 下载 相关 举报
eclipce自定义扩展点创建过程.doc_第1页
第1页 / 共72页
eclipce自定义扩展点创建过程.doc_第2页
第2页 / 共72页
eclipce自定义扩展点创建过程.doc_第3页
第3页 / 共72页
eclipce自定义扩展点创建过程.doc_第4页
第4页 / 共72页
eclipce自定义扩展点创建过程.doc_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《eclipce自定义扩展点创建过程.doc》由会员分享,可在线阅读,更多相关《eclipce自定义扩展点创建过程.doc(72页珍藏版)》请在三一办公上搜索。

1、自定义扩展点创建过程这里要介绍的是关于Eclipse 中扩展点的问题,我们知道,Eclipse本身提供了很多的扩展点,这样的话,我们可以根据需要对Eclipse的一些功能进行扩展,使得满足我们的使用,也正是因为这一点,许多的Eclipse Fans都可以贡献自己的力量,通过不断的贡献Eclipse插件,使Eclipse的功能越来越强大,现在Eclipse已经不单单是作为一个开发工具了,而是发展成为了一个平台,我们可以基于这样的一个平台进行开发, 为了扩展现有 Eclipse 功能或在其上进行构建,插件将具体的 扩展 贡献给由其他插件暴露的 扩展点 。通常,插件专注于特定区域的责任,并通过一个或

2、多个扩展点的方式将其他责任指派给其他插件。例如,一个插件允许您可视地并行比较两个文件的内容,但它不会关心如何读取这些文件甚至如何解释这些文件的结构;这是其他插件的工作。比较两个文件时,该插件首先检查是否有另一个插件可以解释这些文件的结构。如果找到一个,它就会向找到的插件询问有关文件结构的信息,并在比较过程中使用该信息。 那现在我们就通过一个简单的例子来示范一下怎么个扩展法 : 首先我们先新建一个 插件工程,注意这个工程作为 RCP 项目存在的,比如工程名称就叫做 TheMainMenuProject, 接下来选择一个插件模板,这里我们选择第二个 RCP application with a v

3、iew : 点完成,这样的话我们就将这个项目建好了,看下项目的结构: 接下来,我们打开 plugin.xml或 MANIFEST.MF文件,切换到 Extension Points 标签页,然后我们就可以新增扩展点了,点 新增 点完成后,系统会自动切换到 org.vwpolo.rcp.extender.exsd 文件的编辑页面,这时我们切换到 Definition 标签页,开始扩展扩展点了: 我们先新建一个 元素(New Element)名称为 extender,这时有两个元素了,在第一个元素上点右键,在弹出的对话框中选择序列, 再在这个新增的对象上右键新增一个 extender 对象。 在

4、extender 的明细页中将 最大边界选择为 无边界就行了。 接下来我们给 extender 元素增加属性,过程就省略了 上面是添加好的属性,注意其中的className属性 好了,扩展点就这样建好了,下面我将这个扩展点文件贴出来: Enter description of this extension point. Enter the first release in which this extension point appears. Enter extension point usage example here. Enter API information here. Enter

5、information about supplied implementation of this extension point. 接下来,我们开始实现 扩展点的一些 功能吧,新增选中的包和类: 为了方便起见,我将这些类的源代码贴出来 TheFirstAction .java: packageorg.vwpolo.rcp.extension.client.actions;importorg.eclipse.jface.action.Action;publicclassTheFirstActionextendsActionpublicstaticfinalStringID=TheFirstAc

6、tion.class.getName();/*构造函数*/publicTheFirstAction()setId(ID);setText(第一个Action);publicvoidrun()Shellshell=Display.getCurrent().getActiveShell();MessageDialog.openInformation(shell,信息,第一个项目中的Action);ExtensionContances .java package org.vwpolo.rcp.extension.client.extender;/* * 扩展点常量。 */public class E

7、xtensionContances public static final String EXTENSION_ID = org.vwpolo.rcp.extender; public static final String ATTR_ID = id; public static final String ATTR_NAME = name; public static final String ATTR_TYPE = type; public static final String ATTR_CLIENTID = clientId; public static final String ATTR

8、_INDEX = index; public static final String ATTR_DESC = desc; public static final String ATTR_CLASS = className; public static final String TYPE_PERSPECTIVE = perspective; public static final String TYPE_VIEW = view; public static final String TYPE_ACTION = action;ExtensionHelper .java package org.vw

9、polo.rcp.extension.client.extender;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.eclipse.core.runtime.IConfigurationElement;import org.eclipse.core.runtime.Platform;import org.eclipse.jface.action.IAction;import or

10、g.eclipse.jface.action.IMenuManager;import org.eclipse.jface.action.MenuManager;import org.vwpolo.rcp.extension.client.Activator;import org.vwpolo.rcp.extension.client.actions.TheFirstAction;/* * 。 */public class ExtensionHelper /* */ private String ID = ExtensionContances.EXTENSION_ID; /* */ public

11、 static ExtensionHelper instance; /* Action Map */ private MapString, List actionMap = new HashMapString, List(); /* 视图 Map */ private MapString, List viewMap = new HashMapString, List(); /* 透视图 Map */ private MapString, List perspectiveMap = new HashMapString, List(); /* */ private MenuManager exte

12、ndMenu; /* * 构造函数。 */ private ExtensionHelper() loadExtensions(); /* * 。 * return ExtensionHelper */ public static ExtensionHelper getInstance() if (instance = null) instance = new ExtensionHelper(); return instance; /* * 读取扩展点的属性,然后生成ExtensionInfoBean 对象。 */ private void loadExtensions() IConfigura

13、tionElement elements = Platform.getExtensionRegistry().getConfigurationElementsFor(Activator.EXTENSION_ID);/ IConfigurationElement elements = Platform.getExtensionRegistry().getConfigurationElementsFor(Activator.EXTENSION_ID); 此句在运行时报错 将Activator.EXTENSION_ID修改为org.vwpolo.rcp.extender即可 if (elements

14、 = null | elements.length = 0) return; for (int i = 0; i elements.length; i+) IConfigurationElement element = elementsi; ExtensionInfoBean bean = new ExtensionInfoBean(); bean.setId(element.getAttribute(ExtensionContances.ATTR_ID); bean.setName(element.getAttribute(ExtensionContances.ATTR_NAME); bea

15、n.setType(element.getAttribute(ExtensionContances.ATTR_TYPE); bean.setClientId(element.getAttribute(ExtensionContances.ATTR_CLIENTID); String index = element.getAttribute(ExtensionContances.ATTR_INDEX); if (index = null | index.trim().isEmpty() bean.setIndex(100); else bean.setIndex(Integer.parseInt

16、(index); bean.setDesc(element.getAttribute(ExtensionContances.ATTR_DESC); if (ExtensionContances.TYPE_ACTION.equalsIgnoreCase(bean.getType() try String classPath = element.getAttribute(ExtensionContances.ATTR_CLASS); Object object = null; if (!classPath.isEmpty() object = element.createExecutableExt

17、ension(ExtensionContances.ATTR_CLASS); else object = element.createExecutableExtension(ExtensionContances.ATTR_CLIENTID); if (object instanceof IAction) bean.setAction(IAction) object); catch (Exception e) e.printStackTrace(); appendGroup(bean); private void appendGroup(ExtensionInfoBean bean) if (E

18、xtensionContances.TYPE_PERSPECTIVE.equalsIgnoreCase(bean.getType() addToMap(perspectiveMap, bean); else if (ExtensionContances.TYPE_VIEW.equalsIgnoreCase(bean.getType() addToMap(viewMap, bean); else if (ExtensionContances.TYPE_ACTION.equalsIgnoreCase(bean.getType() addToMap(actionMap, bean); private

19、 void addToMap(MapString, List map, ExtensionInfoBean bean) List list; if (map.containsKey(ID) list = (List) map.get(ID); else list = new ArrayList(); map.put(ID, list); list.add(bean); public void fillMenuBar(IMenuManager menuManager) extendMenu = new MenuManager(扩展菜单); menuManager.add(extendMenu);

20、 fillMenuBar(perspectiveMap); fillMenuBar(viewMap); fillMenuBar(actionMap); private void fillMenuBar(MapString, List map) List list = map.get(ID); if (list = null | list.size() = 0) return; Iterator iter = list.iterator(); while (iter.hasNext() ExtensionInfoBean bean = iter.next(); IAction action =

21、bean.getAction(); if (action = null) action = new TheFirstAction(); extendMenu.add(action); ExtensionInfoBean .java package org.vwpolo.rcp.extension.client.extender;import org.eclipse.jface.action.IAction;/* * 扩展点实体 。 */public class ExtensionInfoBean /* */ private String id; /* */ private String nam

22、e; /* */ private String type; /* */ private String clientId; /* */ private int index; /* */ private String desc; /* */ private IAction action; /* * return id */ public String getId() return id; /* * 设置id 。 */ public void setId(String id) this.id = id; /* * return name */ public String getName() retu

23、rn name; /* * 设置name 。 * param name */ public void setName(String name) this.name = name; /* * return type */ public String getType() return type; /* * 设置type 。 * param type */ public void setType(String type) this.type = type; /* * return clientId */ public String getClientId() return clientId; /*

24、* 设置clientId 。 * param clientId */ public void setClientId(String clientId) this.clientId = clientId; /* * return index */ public int getIndex() return index; /* * 设置index 。 * param index */ public void setIndex(int index) this.index = index; /* * return desc */ public String getDesc() return desc;

25、/* * 设置desc 。 * param desc */ public void setDesc(String desc) this.desc = desc; /* * return action */ public IAction getAction() return action; /* * 设置action 。 * param action */ public void setAction(IAction action) this.action = action; 现在差不多了,我们在 ApplicationActionBarAdvisor .java 文件的 fillMenuBar

26、方法调用 ExtensionHelper 的方法就行了 protected void fillMenuBar(IMenuManager menuBar) MenuManager fileMenu = new MenuManager( &File , IWorkbenchActionConstants. M_FILE ); menuBar.add(fileMenu); fileMenu.add( exitAction ); ExtensionHelper . getInstance ().fillMenuBar(menuBar); 现在我们把所有的条件都配好了,现在开始使用这个扩展点了,打开 p

27、lugin.xml 文件,切换到 Extensions 标签页,然后新增扩展点 新增完成之后,我们就添上相应的条件就行了,比如 : 运行看看效果吧: 结果就是这样了,不过这不足说明扩展点功能的强大,我打算再新增一个插件项目来扩展刚才新增的扩展点 项目的名称叫 TheSecondMenuProject 可以看到文件的结构很简单,就两个类 打开 plugin.xml 文件,切换到 Dependencies 标签页,将TheMainMenuProject工程添加成这个项目的依赖项,然后在切换到 Extensions 标签页,点击 Add. 填入相关的信息: 现在运行看看效果吧,先打开运行配置对话框

28、先将TheMainMenuProject 和 TheSecondMenuProject项目选中,然后点击 添加依赖插件 运行。 可以看到,结果和我们期望的一样。我们自己可以多动动手来做一些实例,这样上手会快些点完成,这样的话我们就将这个项目建好了,看下项目的结构: 接下来,我们打开 plugin.xml或 MANIFEST.MF文件,切换到 Extension Points 标签页,然后我们就可以新增扩展点了,点 新增 点完成后,系统会自动切换到 org.vwpolo.rcp.extender.exsd 文件的编辑页面,这时我们切换到 Definition 标签页,开始扩展扩展点了: 参考网站:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号