/**
*
*/
package icy.sequence.edit;
import icy.painter.Overlay;
import icy.roi.ROI;
import icy.sequence.Sequence;
import java.awt.Image;
import java.util.Set;
import javax.swing.undo.CannotUndoException;
/**
* Default lazy sequence undoable edit (do a complete sequence copy to restore previous state).<br>
* Do not handle redo operation to not consume too much memory.
*
* @author Stephane
*/
public class DefaultSequenceEdit extends AbstractSequenceEdit
{
Sequence previous;
Set<ROI> previousRois;
Set<Overlay> previousOverlays;
public DefaultSequenceEdit(Sequence previous, Sequence sequence, Image icon)
{
super(sequence, icon);
this.previous = previous;
// need to store ROI and overlays
previousRois = previous.getROISet();
previousOverlays = previous.getOverlaySet();
}
public DefaultSequenceEdit(Sequence previous, Sequence sequence)
{
this(previous, sequence, null);
}
@Override
public void undo() throws CannotUndoException
{
super.undo();
// undo
final Sequence sequence = getSequence();
// restore data & metadata
sequence.copyFrom(previous, true);
sequence.beginUpdate();
try
{
// restore ROIs
for (ROI roi : previousRois)
if (!sequence.contains(roi))
sequence.addROI(roi);
for (ROI roi : sequence.getROIs())
if (!previousRois.contains(roi))
sequence.removeROI(roi);
// restore Overlays
for (Overlay overlay : previousOverlays)
if (!sequence.contains(overlay))
sequence.addOverlay(overlay);
for (Overlay overlay : sequence.getOverlays())
if (!previousOverlays.contains(overlay))
sequence.removeOverlay(overlay);
}
finally
{
sequence.endUpdate();
}
}
@Override
public boolean canRedo()
{
return false;
}
}