首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

EMF学习-CompoundCommand

2012-07-25 
EMF学习--CompoundCommand1、新建插件工程graph,建立ecore文件。2、由ecore生成对应的genmodel文件,用来生成M

EMF学习--CompoundCommand
1、新建插件工程graph,建立ecore文件。


2、由ecore生成对应的genmodel文件,用来生成Model代码,edit和editor两个插件。

3、修改edit插件的EdgeItemProvider类,使Edge的source属性可以和Node的outgoing属性之间实现双向引用。
覆写createSetCommand方法,当feature为GraphPackage.Literals.EDGE__SOURCE时,触发SetSrcEdgeCompoundCommand这样一个组合命令。

@Overrideprotected Command createSetCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value) {if (feature == GraphPackage.Literals.EDGE__SOURCE) {return new SetSrcEdgeCompoundCommand(domain, owner, feature, value);}return super.createSetCommand(domain, owner, feature, value);}private class SetSrcEdgeCompoundCommand extends CompoundCommand {private EditingDomain domain;private EObject owner;private Object value;public SetSrcEdgeCompoundCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value) {this.domain = domain;this.owner = owner;this.value = value;append(new SetCommand(domain, owner, feature, value));}@Overridepublic void execute() {Node node = (Node) value;if (node != null) {Edge outgoingEdge = node.getOutgoing();if (outgoingEdge != null) {// 关联一个存在其他关联的对象appendAndExecute(new SetCommand(domain, node, GraphPackage.Literals.NODE__OUTGOING, null));appendAndExecute(new SetCommand(domain, outgoingEdge, GraphPackage.Literals.EDGE__SOURCE, null));}}Edge edge = (Edge) owner;Node sourceNode = edge.getSource();if (sourceNode == null) {// addappendAndExecute(new SetCommand(domain, node, GraphPackage.Literals.NODE__OUTGOING, edge));} else if (node == null) { // removeappendAndExecute(new SetCommand(domain, sourceNode, GraphPackage.Literals.NODE__OUTGOING, null));} else { // editappendAndExecute(new SetCommand(domain, sourceNode, GraphPackage.Literals.NODE__OUTGOING, null));appendAndExecute(new SetCommand(domain, node, GraphPackage.Literals.NODE__OUTGOING, edge));}super.execute();}}

热点排行