package icy.roi.edit; import icy.roi.ROI; import icy.sequence.Sequence; import icy.type.rectangle.Rectangle5D; import java.util.List; import java.util.Set; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoableEdit; public class BoundsROIsEdit extends AbstractROIsEdit { List<Rectangle5D> previousBounds; List<Rectangle5D> newBounds; public BoundsROIsEdit(List<? extends ROI> rois, List<Rectangle5D> previousBounds, List<Rectangle5D> newBounds, boolean mergeable) { super(rois, (rois.size() > 1) ? "ROIs bounds changed" : "ROI bounds changed"); if (rois.size() != previousBounds.size()) throw new IllegalArgumentException("ROI list and old values list size do not match (" + rois.size() + " != " + previousBounds.size() + ")"); if (rois.size() != newBounds.size()) throw new IllegalArgumentException("ROI list and new values list size do not match (" + rois.size() + " != " + newBounds.size() + ")"); this.previousBounds = previousBounds; this.newBounds = newBounds; setMergeable(mergeable); } public BoundsROIsEdit(List<? extends ROI> rois, List<Rectangle5D> previousBounds, List<Rectangle5D> newBounds) { this(rois, previousBounds, newBounds, true); } @Override public void undo() throws CannotUndoException { super.undo(); final Set<Sequence> sequences = getSequences(); // undo for (Sequence sequence : sequences) sequence.beginUpdate(); try { int ind = 0; for (ROI roi : getROIs()) roi.setBounds5D(previousBounds.get(ind++)); } finally { for (Sequence sequence : sequences) sequence.endUpdate(); } } @Override public void redo() throws CannotRedoException { super.redo(); final Set<Sequence> sequences = getSequences(); // redo for (Sequence sequence : sequences) sequence.beginUpdate(); try { int ind = 0; for (ROI roi : getROIs()) roi.setBounds5D(newBounds.get(ind++)); } finally { for (Sequence sequence : sequences) sequence.endUpdate(); } } @Override public boolean addEdit(UndoableEdit edit) { if (!isMergeable()) return false; if (edit instanceof BoundsROIsEdit) { final BoundsROIsEdit bndEdit = (BoundsROIsEdit) edit; // same ROI list ? if (bndEdit.getROIs().equals(getROIs())) { // collapse edits newBounds = bndEdit.newBounds; return true; } } return false; } @Override public void die() { super.die(); previousBounds = null; newBounds = null; } }