GMF中,删除节点和连线的实现

       在GMF中,有时我们需要programmatically删除节点或连线,该如何实现呢?

       由于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
					}
				});
			}

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值