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

问题

在GMF中,如果需要programmatically删除节点或连线,在google中我们很容易搜索到《GMF中,删除节点和连线的实现》一文(我并不确定这是原创作者的原始链接),很多人可能都使用这种实现。这是一种很好的实现,但有时候也有其缺点--除了需要删除View和Edge外,还需要删除model,在element对应于各种不同的model时,显然需要写大量if else来处理不同的model。

实现

我们可以有另一种实现,通过request和command来实现,以下代码删除某个节点上所有的连线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void deleteConnections(ShapeNodeEditPart editpart)
{
    CompoundCommand compoundCommand =new CompoundCommand("delete all connections");
    List connections = editpart.getTargetConnections();
    connections.addAll(editpart.getSourceConnections());
    GroupRequest deleteReq = new GroupRequest(RequestConstants.REQ_DELETE);
    deleteReq.setEditParts(connections);
    for (int i = 0; i < connections.size(); i++) {
        EditPart object = (EditPart) connections.get(i);
        Command deleteCmd = object.getCommand(deleteReq);
        if (deleteCmd != null)
            compoundCommand.add(deleteCmd);
    }
     
    editpart.getDiagramEditDomain().getDiagramCommandStack().execute(compoundCommand);
}

删除多个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void deleteNodes(List editparts)
    {
        CompoundCommand compoundCommand =new CompoundCommand("delete nodes");
        GroupRequest deleteReq = new GroupRequest(RequestConstants.REQ_DELETE);
         
        deleteReq.setEditParts(editparts);
        for (int i = 0; i < editparts.size(); i++) {
            EditPart object = (EditPart) editparts.get(i);
            Command deleteCmd = object.getCommand(deleteReq);
            if (deleteCmd != null)
                compoundCommand.add(deleteCmd);
        }
         
        ((ShapeNodeEditPart)editparts.get(0)).getDiagramEditDomain().getDiagramCommandStack().execute(compoundCommand);
    }

这种方式的好处是,不必关心底层model的删除,因为每个element对应的command中,GMF已经帮我们实现了,更加简单,且符合开放-闭合原则。并且,undo和redo也已经实现。

 

参考

org.eclipse.gef.ui.actions.DeleteAction

 

Binhua Liu原创,写于2013/8/25。

posted @   Binhua Liu  阅读(3333)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示