向GMF应用的Palette里添加工具

GMF能根据.gmftool里定义的工具项生成一个缺省的palette(在生成的XXXPaletteFactory类里实现,目前没有利用GMF扩展点),同时GMF Runtimeh还提供了org.eclipse.gmf.runtime.diagram.ui.paletteProviders扩展点,如果缺省palette里的工具项不能满足需要,利用这个扩展点可以添加我们需要的其他工具。下图是GMF的Logic例子里对这个扩展点的实现:

向GMF应用的Palette里添加工具
图: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

你可能感兴趣的:(工具)