Aimd's Blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

假设你的模型已经有了对节点(Node)和连线(Connection)删除的功能,如果我们想在删除节点时把与它相连的连线一并自动删除,并可以undo时一并恢复,我们需要这样做:

1。在已有connection model中添加如下几个方法,其中getSource()得到此线的连出的model的节点,而getTarget()是得到此连线接入的节点,这两个节点也保存到Connection模型中:

public void attachSource(){
     
if (getSource() == null || getSource().getOutgoingConnections().contains(this))
      
return;
     getSource().addOutput(
this);
    }

    
public void attachTarget(){
     
if (getTarget() == null || getTarget().getIncomingConnections().contains(this))
      
return;
     getTarget().addInput(
this);
    }

    
public void detachSource(){
     
if (getSource() == null)
      
return;
     getSource().removeOutput(
this);
    }

    
public void detachTarget(){
     
if (getTarget() == null)
      
return;
     getTarget().removeInput(
this);
    }

2。DeleteNodeCommand中不仅要保存待删除的节点,也要把和此节点相连的连线都保存起来,也就是先加这个:
private List sourceConnections = new ArrayList();
private List targetConnections = new ArrayList();

然后添加如下两个方法,第一个在execute中调用,而后者在undo时调用,这样我们就实现了需要的功能:

private void deleteConnections(Node node) {
     sourceConnections.addAll(node.getOutgoingConnections());
     
for (int i = 0; i < sourceConnections.size(); i++) {
      Connection conn 
= (Connection)sourceConnections.get(i);
      conn.detachSource();
      conn.detachTarget();
     }
     targetConnections.addAll(node.getIncomingConnections());
     
for (int i = 0; i < targetConnections.size(); i++) {
      Connection conn 
= (Connection)targetConnections.get(i);
      conn.detachSource();
      conn.detachTarget();
     }
    }
    
    
private void restoreConnections() {
     
for (int i = 0; i < sourceConnections.size(); i++) {
      Connection conn 
= (Connection)sourceConnections.get(i);
      conn.attachSource();
      conn.attachTarget();
     }
     sourceConnections.clear();
     
for (int i = 0; i < targetConnections.size(); i++) {
      Connection conn 
= (Connection)targetConnections.get(i);
      conn.attachSource();
      conn.attachTarget();
     }
     targetConnections.clear();
}
posted on 2006-05-15 18:00  Aimd  阅读(493)  评论(0编辑  收藏  举报