package com.revolsys.swing.undo; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.undo.UndoableEdit; public class MultipleUndo extends AbstractUndoableEdit { private static final long serialVersionUID = 1L; private final List<UndoableEdit> edits; public MultipleUndo() { this(new ArrayList<UndoableEdit>()); } public MultipleUndo(final List<UndoableEdit> edits) { this.edits = new ArrayList<>(edits); } public MultipleUndo(final UndoableEdit... edits) { this(Arrays.asList(edits)); } @Override public boolean addEdit(final UndoableEdit edit) { if (edit == null || isHasBeenDone()) { return false; } else { this.edits.add(edit); return true; } } @Override public boolean canRedo() { for (final UndoableEdit edit : this.edits) { if (!edit.canRedo()) { return false; } } return true; } @Override public boolean canUndo() { for (int i = this.edits.size() - 1; i >= 0; i--) { final UndoableEdit edit = this.edits.get(i); if (!edit.canUndo()) { return false; } } return true; } public boolean isEmpty() { return this.edits.isEmpty(); } @Override protected void redoDo() { for (final UndoableEdit edit : this.edits) { edit.redo(); } } @Override protected void undoDo() { for (int i = this.edits.size() - 1; i >= 0; i--) { final UndoableEdit edit = this.edits.get(i); edit.undo(); } } }