除了以XML的方式配置Figure组件之外,GMF还允许用户直接编写Figure的实现类。
同GEF一样,GMF在视图展现上依然使用Java的draw2d技术框架,而我们所创建的Figure组件一般继承org.eclipse.draw2d.Figure
类或其子类。这里,我们可以参考JBPM自带的流程编辑器源代码,把它已定义好的Figure组件copy过来稍作修改,拿来直接使用。比如StartFigure,用于定义开始节点的视图组件。
public class StartFigure extends AbstractElementFigure { private static final Image icon=imgUtil.getImgFromPlugIn("org.chen.test.diagram.custom", "icons/start_event_empty.png"); @Override protected void customizeFigure() { setIcon(icon); } }
public abstract class AbstractElementFigure extends Panel { private Label label = new Label(); protected static ImageUtil imgUtil=new ImageUtil(); public AbstractElementFigure() { add(label); customizeFigure(); setSize(48, 48); } protected abstract void customizeFigure(); public void setIcon(Image icon) { label.setIcon(icon); } public void setText(String text) { label.setText(text); } public Label getLabel() { return label; } public void setColor(Color color) { setBackgroundColor(color); } public void setBounds(Rectangle bounds) { bounds.setSize(48, 48); super.setBounds(bounds); label.setBounds(bounds); } public void paint(Graphics g) { int saved = g.getAntialias(); g.setAntialias(SWT.ON); super.paint(g); g.setAntialias(saved); } }
public class ImageUtil { public Image getImgFromPlugIn(String plugIn,String path){ Image result=AbstractUIPlugin.imageDescriptorFromPlugin(plugIn, path).createImage(); return result; } }
另外,我们所自定义的Figure,或其他组件最好放到一个独立的bundle中进行管理,与GMF所驱动出的代码加以区分,比如在现有
的bundle基础上加custom表示该bundle不是GMF所驱动出来的,而是我们人为定义的。
Figure定义好之后,便可将它引入到我们的视图模型中去,新建一个Figure Descriptor,name属性设置为StartFigure,然后添加一个Custom Figure节点,将Qualified Class Name属性设置成StartFigure的类名全称,设置完成以后,还需要把StartFigure所在的包添加到MANIFEST.MF文件包依赖关系中去,因为我们所定义的Figure在另一个Bundle中,最后在Canvas节点下实例化我们所声明的StartFigure,新添加一个Node节点,Name属性设置成Start,Figure属性设置成StartFigure,至此,视图模型定义结束。
定义好视图模型之后,修改工具模型。
新建一个Creation Tool,Title属性设置为"开始",Description属性设置为"创建开始节点",然后为该工具指定默认的图标信息。
最后修改映射模型,完成开始节点的映射关系。
新建一个Top Node Reference,Containment Feature属性设置为Process.nodes,为其添加Node Mapping节点,完成如图所示的属性设置。
模型修改完成以后,我们需要重新生成generator模型,右键映射模型配置文件,在弹出的菜单中选择Create generator model按照向导,完成模型的生成操作。
最后重新生成项目代码,启动项目实例,可以看到Start节点也已经添加到视图中去。
可以按照此方法,完成End节点的添加操作,这里略去。