GMF中,删除节点和连线的实现
2012-07-15 16:45
232 查看
在GMF中,有时我们需要programmatically删除节点或连线,该如何实现呢?
由于GMF框架用的是MVC模式,所以在删除节点或连线的时候,需要删除该节点或连线对应的view和model。有了这个概念后,删除节点和连线便简单了。
先介绍删除连线的方法。
首先,我们得获得org.eclipse.gmf.runtime.notation.Edge类型的连线对象,然后,从此对象中获得它的model,接着删除Edge类型的连线对象,最后从diagram的model中删除此对象的model。这样讲起来有点抽象,大家可以参考以下代码:
上面的删除连线只是简单的把某个节点中的所有连线删除,没有删除某个特定的连线,大家可以自己去实现。
删除图元更简单些,不过要考虑两种情况:1:有连线连接在此节点上;2:无连线连接在此节点上。(也还有其他情况,比如图元嵌套图元等,其他情况不再赘述)
对第一种情况,必须先把连线删除,再删除节点,否则连线就没有源或目的节点了,在GMF中,这种情况是不允许的。
这里介绍第二种情况(和删除连线的原理是一样的),可以参考如下代码:
由于GMF框架用的是MVC模式,所以在删除节点或连线的时候,需要删除该节点或连线对应的view和model。有了这个概念后,删除节点和连线便简单了。
先介绍删除连线的方法。
首先,我们得获得org.eclipse.gmf.runtime.notation.Edge类型的连线对象,然后,从此对象中获得它的model,接着删除Edge类型的连线对象,最后从diagram的model中删除此对象的model。这样讲起来有点抽象,大家可以参考以下代码:
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(xxxDiagramImpl); // 图的model的editingDomain final View xxxView = (View) xxxEditPart.getModel(); // 连线依赖的节点的View XXXImpl xxxImpl = (XXXImpl) xxxView.getElement(); // 连线依赖的节点的model final List<?> incomingList = xxxView.getTargetEdges(); // 此节点上的所有连线 int incomingSize = incomingList.size(); for (int j = incomingSize - 1; j >= 0; j--) { domain.getCommandStack().execute(new RecordingCommand(domain) { protected void doExecute() { Edge edge = (Edge) incomingList.get(j); // 连线的view if (edge.getElement() instanceof LinkImpl) { LinkImpl linkImpl = (LinkImpl) edge.getElement(); // 连线的model ViewUtil.destroy(edge); // 删除连线的view xxxDiagramImpl.getLinks().remove(linkImpl); // 删除连线的model } }); }
上面的删除连线只是简单的把某个节点中的所有连线删除,没有删除某个特定的连线,大家可以自己去实现。
删除图元更简单些,不过要考虑两种情况:1:有连线连接在此节点上;2:无连线连接在此节点上。(也还有其他情况,比如图元嵌套图元等,其他情况不再赘述)
对第一种情况,必须先把连线删除,再删除节点,否则连线就没有源或目的节点了,在GMF中,这种情况是不允许的。
这里介绍第二种情况(和删除连线的原理是一样的),可以参考如下代码:
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(xxxDiagramImpl); final View xxxView = (View) xxxEditPart.getModel(); // 某个节点的view final XXXImpl xxxImpl = (XXXImpl) xxxView.getElement(); // 某个节点的model domain.getCommandStack().execute(new RecordingCommand(domain) { protected void doExecute() { ViewUtil.destroy(xxxView); // 删除此节点的view xxxDiagramImpl.getModules().remove(xxxImpl); // 删除此节点的model } }); }
相关文章推荐
- GMF中,删除节点和连线的另一种实现
- GMF中,删除节点和连线的另一种实现
- GMF中,删除节点和连线的实现
- python实现单链表中删除倒数第K个节点的方法
- 剑指Offer 面试题18:删除链表节点 Java代码实现
- C语言实现链表节点的插入和删除
- PHP 循环删除无限分类子节点的实现代码
- 编程实现单链表的删除节点
- Python实现针对给定单链表删除指定节点的方法
- QTreeWidget实现的树形节点的添加+双击响应+删除详解
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- JavaScript实现节点的删除与序号重建实例
- jQuery插件zTree实现删除树子节点的方法示例
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 实现删除指定节点及所有子结点的处理触发器
- 树的操作(绑定数据库,添加新节点,删除节点)(转载加实现)
- js实现删除div下所有子节点
- AVL Tree 平衡二叉树基本插入删除节点功能的实现 .
- C++实现单链表删除倒数第k个节点的方法
- 递归删除树形结构的所有子节点(java和mysql实现)