package icy.roi.edit; import icy.roi.ROI; import icy.sequence.Sequence; import icy.type.point.Point5D; import java.util.List; import java.util.Set; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoableEdit; /** * Multiple position change implementation for ROI undoable edition. * * @author Stephane */ public class PositionROIsEdit extends AbstractROIsEdit { List<Point5D> previousPositions; List<Point5D> newPositions; public PositionROIsEdit(List<? extends ROI> rois, List<Point5D> previousPositions, List<Point5D> newPositions, boolean mergeable) { super(rois, (rois.size() > 1) ? "ROIs position changed" : "ROI position changed"); if (rois.size() != previousPositions.size()) throw new IllegalArgumentException("ROI list and old values list size do not match (" + rois.size() + " != " + previousPositions.size() + ")"); if (rois.size() != newPositions.size()) throw new IllegalArgumentException("ROI list and new values list size do not match (" + rois.size() + " != " + newPositions.size() + ")"); this.previousPositions = previousPositions; this.newPositions = newPositions; setMergeable(mergeable); } public PositionROIsEdit(List<? extends ROI> rois, List<Point5D> previousPositions, List<Point5D> newPositions) { this(rois, previousPositions, newPositions, 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.setPosition5D(previousPositions.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.setPosition5D(newPositions.get(ind++)); } finally { for (Sequence sequence : sequences) sequence.endUpdate(); } } @Override public boolean addEdit(UndoableEdit edit) { if (!isMergeable()) return false; if (edit instanceof PositionROIsEdit) { final PositionROIsEdit posEdit = (PositionROIsEdit) edit; // same ROI list ? if (posEdit.getROIs().equals(getROIs())) { // collapse edits newPositions = posEdit.newPositions; return true; } } return false; } @Override public void die() { super.die(); previousPositions = null; newPositions = null; } }