插件开发久了,难免遇到需要自定义扩展点的需求,那么如何自定义扩展点呢?
以编写一个快捷菜单项为例,说明如下:
假设最终用户可通过如下配置来扩展快捷菜单项
<plugin>
<extension point="com.kdevn.test.MyPopupMenus">
<objectContribution id="contribution1">
<action
label="MyNewAction"
class="com.kdevn.test.actions.MyNewAction"
id="com.kevn.test.actions.MyNewAction">
</action>
</objectContribution>
</extension>
</plugin>
假设其中objectContribution元素仅可配置1个,而action元素可配置多个
1 编写Schema文件,可Checkout CVS上的org.eclipse.ui,参考org.eclipse.ui/schema/popupMenus.exsd
2 在自定义扩展点插件com.kdevn.test的plugin.xml中添加如下内容
<plugin>
<extension-point id="MyPopupMenus" name="MyPopupMenus" schema="schema/MyPopupMenus.exsd"/>
</pluing>
3 完成了Schema文件和plugin.xml文件后,就需要开始编写读取扩展点信息的代码了,如下所示
IExtensionRegistry registry = Platform.getExtensionRegistry();
String pointId = "com.kdevn.test.MyPopupMenus"
IExtension point = registry.getExtensionPoint(pointId);
IExtension[] extensions = point.getExtensions();
//get an objectContribution element
IConfigurationElement ocElem =extensions[0].getConfigurationElements()[0]
//get action elements
IConfigurationElement actionElems = ocElem.getChildren();
for(int i=0; i<actionElems.length; i++){
//create an instance
NewAction newAction = (NewAction)actionElems[i].createExecutableExtension("class");
//get the label attribute
String label = actionElems[i].getAttribute("label");
newAction.setText(label);
newAction.setData(...);
//use the action
//add the action to menubar/menuManger
}
4 实现NewAction类
class NewAction extends Action {
protected Object data;
public NewAction() {
super();
}
//get/set method
public void run() {
//do anything with the data
}
}
完成以上步骤,一个自定义扩展点就完成了,
接着就可以新建一个插件工程,来使用该扩展点了,在新建插件工程中实现的MyNewAction类需继承自NewAction。