GEF理解系列六(2)

三、删除结点时删除连接线

刚才我们已经完成了删除结点的操作。不过它有一个问题:结点是被删除了,可连在它上面的连接线还存在。这是一个很可笑しい的结果。所以这里我们要修改一下,删除结点时,把它上面的连接线也一并删除。
这个操作要关注的地方只有一个,就是删除结点命令。
之前我们说过,一个连接线要想被显示出来的条件。这里我们可以借助这个条件来实现连接线的删除:让连接线脱离源的目标。所以删除结点时要想把连接线一并删除,我们就要在删除结点时先得到结点的所有连接线,然后让这些连接线脱离源和目标。修改删除结点命令如下:

public class DeleteHelloWorldCommand extends Command {

 

      private DiagramRootContent content;

      private HelloWorldModel model;

 

     private List<AbstractConnectionModel> inputs = new ArrayList<AbstractConnectionModel>();

      private List<AbstractConnectionModel> outs = new ArrayList<AbstractConnectionModel>();

 

      public DeleteHelloWorldCommand(DiagramRootContent content,

                  HelloWorldModel model) {

            super();

            this.content = content;

            this.model = model;

            inputs.addAll(model.getInputs());

            outs.addAll(model.getOutputs());

      }

 

      @Override

      public void execute() {

            for (AbstractConnectionModel connection : inputs) {

                  connection.deattachSource();

                  connection.deattachTarget();

            }

            for (AbstractConnectionModel connection : outs) {

                  connection.deattachSource();

                  connection.deattachTarget();

            }

 

            content.removeChild(model);

      }

 

      @Override

      public void undo() {

            for (AbstractConnectionModel connection : inputs) {

                  connection.attachSource();

                  connection.attachTarget();

            }

            for (AbstractConnectionModel connection : outs) {

                  connection.attachSource();

                  connection.attachTarget();

            }

            content.addChild(model);

      }

}

我们增加了两个List分别用来存储所有的输入线和所有的输出线。
运行结果:
deleteNodeConnectionpre afterdeleteNodeConnections
              图:删除前                                           图:删除后
注意:我们之前在结点模型里有一个得到全部源连接线和目的连接线的方法,理论上是可以直接返回这两个list对象来进行删除的。但是这会造成一个并发异常的发生,因为在java里,List对象是一个非线程同步的对象。所以在顺序取对象的时候不能执行删除操作。因此这里的一个很简单的解决办法就是用另外的两个List去执行这个操作。这就相当于:List A = List B。从A中取值,在B中删除。
在java1.5里,新增加了一些线程同步的列表类。如果想直接用,且不发生异常的话,可以使用那些类做为List用。

四、删除连接线

到上面为止,我们就讲完了删除结点操作。这里我们要开始讲删除连线操作。这个现在就已经变得很简单了。从段三中,我们已经知道要使得一个连接被删除应该怎么做了:脱离源了目标。所以我们的问题就是怎么发出删除命令了/或者说怎么收到删除连接命令了。还是Policy。和选中连线一样,我们要删除一个连线,也应该在连线模型里增加Policy。
查找和连线有关的Policy,我们可以猜到大约是:ConnectionEditPolicy。因为其他的都不太像嘛。哈哈。
那好,找到了Policy,我们还是把它安装在所以连线上,所以在AbstractConnectionModelEditPart安装这个Policy。如下:

installEditPolicy(EditPolicy.CONNECTION_ROLE, new DeleteConnectionEditPolicy());

最后就是完成command,完成policy了。至于command怎么写,从上面的解释中大约大家都已经知道了,这里就直接给出代码:
删除命令:

public class DeleteConnectionCommand extends Command {

 

      private AbstractConnectionModel connection;

 

      public DeleteConnectionCommand(AbstractConnectionModel connection) {

            super();

            this.connection = connection;

      }

      @Override

      public void execute() {

            connection.deattachSource();

            connection.deattachTarget();

      }

      @Override

      public void undo() {

            connection.attachSource();

            connection.attachTarget();

      }

     

}

删除Policy:

public class DeleteConnectionEditPolicy extends ConnectionEditPolicy {

 

      @Override

      protected Command getDeleteCommand(GroupRequest request) {

            DeleteConnectionCommand command = new DeleteConnectionCommand((AbstractConnectionModel) getHost()

                        .getModel());

            return command;

      }

 

}

OK。完成了:
connectionPreDelete connectionafterdelete
               图:删除前                                       图:删除后
后记:其实我觉得吧,这个连接线删除应该自动被支持才对。呵呵。但是要怎么样自动被支持,我也不太清楚。在结点EditPart里再加一个要继承的方法?可行吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值