package org.esa.snap.rcp.nodes;
import com.bc.ceres.core.Assert;
import org.esa.snap.core.datamodel.ProductNode;
import org.esa.snap.core.datamodel.ProductNodeGroup;
import org.openide.util.NbBundle;
import javax.swing.undo.AbstractUndoableEdit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
/**
* An undoable deletion of a {@code ProductNode}.
*
* @param <T> The product node type.
* @author Norman Fomferra
*/
@NbBundle.Messages("LBL_UndoableProductNodeInsertionName=Add ''{0}''")
public class UndoableProductNodeInsertion<T extends ProductNode> extends AbstractUndoableEdit {
private ProductNodeGroup<T> group;
private T productNode;
private final int index;
public UndoableProductNodeInsertion(ProductNodeGroup<T> productNodeGroup, T productNode) {
Assert.notNull(productNodeGroup, "group");
Assert.notNull(productNode, "node");
this.group = productNodeGroup;
this.productNode = productNode;
this.index = productNodeGroup.indexOf(productNode);
}
public T getProductNode() {
return productNode;
}
@Override
public String getPresentationName() {
return Bundle.LBL_UndoableProductNodeInsertionName(productNode.getName());
}
@Override
public void undo() throws CannotUndoException {
super.undo();
// todo - close all open document windows
group.remove(productNode);
}
@Override
public void redo() throws CannotRedoException {
super.redo();
if (index < group.getNodeCount()) {
group.add(productNode);
} else {
group.add(index, productNode);
}
}
@Override
public void die() {
group = null;
productNode = null;
}
}