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