GMF能根据.gmftool里定义的工具项生成一个缺省的palette(在生成的XXXPaletteFactory
类里实现,目前没有利用GMF扩展点),同时GMF Runtimeh还提供了org.eclipse.gmf.runtime.diagram.ui.paletteProviders
扩展点,如果缺省palette里的工具项不能满足需要,利用这个扩展点可以添加我们需要的其他工具。下图是GMF的Logic例子里对这个扩展点的实现:
图:GMF的Logic例子利用paletteProviders扩展点添加工具项
实现paletteProviders扩展点的步骤并不复杂。首先是在plugin.xml
里定义扩展点需要的信息,paletteProvider的class一般选org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider
即可,它会把下面定义的信息转换为实际的工具项添加到palette里。在paletteProvider下要创建一个editor项并指定id值;还要创建contribution项包含实际需要的工具项,contribution项里需要指定一个factoryClass,这个类要自己实现,并继承自PaletteFactory.Adapter,实现它的createTool()方法,这个方法根据此contribution项下面所定义的工具的id生成实际的工具实例。下面是GMF的Logic例子所使用的paletteFactory代码,可以看到所做的工作就是根据不同的toolId返回工具实例:
public class LogicPaletteFactory
extends PaletteFactory.Adapter {
/*
* Create the tool according to type
*/
public Tool createTool(String toolId) {
if (toolId.equals(LogicConstants.TOOL_LED)){
return new CreationTool(LogicSemanticType.LED);
}else if (toolId.equals(LogicConstants.TOOL_CIRCUIT)) {
return new CreationTool(LogicSemanticType.CIRCUIT);
}else if (toolId.equals(LogicConstants.TOOL_ORGATE)) {
return new CreationTool(LogicSemanticType.ORGATE);
}else if (toolId.equals(LogicConstants.TOOL_ANDGATE)) {
return new CreationTool(LogicSemanticType.ANDGATE);
}else if (toolId.equals(LogicConstants.TOOL_XORGATE)) {
return new CreationTool(LogicSemanticType.XORGATE);
}else if (toolId.equals(LogicConstants.TOOL_FLOWCONTAINER)) {
return new CreationTool(LogicSemanticType.FLOWCONTAINER);
}else if (toolId.equals(LogicConstants.TOOL_CONNECTION)) {
return new ConnectionCreationTool(LogicSemanticType.WIRE);
}
return null;
}
}
在contribution项下面可以创建多种类型的工具项(entry),例如Drawer、Separator,Stack和Tool等等,每一个工具项除Label外需要有一个id和一个path,id的作用如刚刚提到的是给paletteFactory的createTool()方法的参数,后者根据id创建所需要的工具实例;path可以是"/"或"/entryId/"这样用来指定工具项在palette里的位置。
总结下来就是,在plugin.xml里指定各个工具项的位置,而paletteFactory负责工具id到实际工具的转换。
参考资料
Creating and Registering the Palette Provider and Factory Classes
搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2007/08/13/854514.html
请保留原始链接:https://bjzhanghao.com/p/2705