/**
 * 
 */
package icy.roi.edit;

import icy.roi.ROI;

import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoableEdit;

/**
 * Default lazy implementation for ROI undoable edition (full copy)
 * 
 * @author Stephane
 */
public class DefaultROIEdit extends AbstractROIEdit
{
    ROI previous;
    ROI current;

    public DefaultROIEdit(ROI previous, ROI current)
    {
        super(current);

        this.previous = previous;
        this.current = current.getCopy();
    }

    @Override
    public void undo() throws CannotUndoException
    {
        super.undo();

        // undo
        getROI().copyFrom(previous);
    }

    @Override
    public void redo() throws CannotRedoException
    {
        super.redo();

        // redo
        if (current != null)
            getROI().copyFrom(current);
    }

    @Override
    public boolean addEdit(UndoableEdit edit)
    {
        if (!isMergeable())
            return false;

        if (edit instanceof DefaultROIEdit)
        {
            final DefaultROIEdit defEdit = (DefaultROIEdit) edit;

            // same ROI ?
            if (defEdit.getROI() == getROI())
            {
                // collapse edits
                current = defEdit.current;
                return true;
            }
        }

        return false;
    }

    @Override
    public void die()
    {
        super.die();

        previous = null;
        current = null;
    }
}