假设你的模型已经有了对节点(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);
}
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();
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();
}
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();
}