UndoManager class

An UndoManager observes and records model and diagram changes in transactions and supports undo/redo operations. You will need to set the #isEnabled property to true in order for the UndoManager to record changes and for users to perform an undo or a redo.

Typically an operation will call #startTransaction, make some changes to the Model and/or Diagram, and then call #commitTransaction. Any ChangedEvents that occur will be recorded in a Transaction object. If for some reason you do not wish to complete the transaction successfully, you can call #rollbackTransaction instead of #commitTransaction.

For convenience the Diagram#commit and Model#commit methods execute a function within a transaction and then perform a commit, or else a rollback upon an error.

The #history property is a list of Transactions. #commitTransaction will add the #currentTransaction to the #history list. #rollbackTransaction will undo the changes remembered in the #currentTransaction and then discard it, without changing the #history. You can limit how many transactions are remembered in the history by setting #maxHistoryLength.

Transactions may be nested. Be sure to call either #commitTransaction or #rollbackTransaction for each call to #startTransaction. Avoid repeated start-commit-start-commit calls as a result of a user's actions. Instead, start, make all changes, and then commit.

If you want to restore the diagram to the state before the latest complete transaction, call #undo. Call #redo to change the diagram to a later state. If after some number of undo's you start a transaction, all of the history after the current state is discarded, and a new transaction may be recorded. You cannot undo or redo during a transaction.

Initially each Model has its own UndoManager. UndoManagers may be shared by multiple Models by replacing the standard Model#undoManager created by the model constructor.

There are several informational properties:

  • #isInTransaction is true when a top-level transaction has been started that has not yet been committed or rolled-back.
  • #currentTransaction holds the flattened list of all ChangedEvents that have happened within the current transaction.
  • #transactionLevel indicates the current depth of nesting.
  • #nestedTransactionNames holds the stack of transaction names supplied to #startTransaction calls.
  • #history holds only complete top-level transactions.
  • #isUndoingRedoing is true during a call to #undo or #redo.
  • #historyIndex indicates which Transaction in the #history is the next to be "undone"; this is decremented by each undo and incremented by each redo.
  • #transactionToUndo and #transactionToRedo indicate which Transaction may be undone or redone next, if any.
  • #models returns an iterator over all of the Models that this UndoManager is handling.

A transaction may not be ongoing when replacing a Diagram#model, because it would not make sense to be replacing the UndoManager (the Model#undoManager) while changes are being recorded.

Replacing a Diagram#model copies certain properties from the old UndoManager to the new one, including #isEnabled and #maxHistoryLength.

Available extensions
Annotations
  • @JS()
  • @staticInterop

Constructors

UndoManager()
factory

Properties

currentTransaction Transaction?

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns the current Transaction for recording additional model change events. This is initialized and augmented by #handleChanged before it is added to #history by a top-level call to #commitTransaction. The value will be null between transactions.
getter/setter pair
hashCode int
The hash code for this object.
no setterinherited
history List<Transaction>

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns the whole history, a list of all of the Transactions, each representing a transaction with some number of ChangedEvents.
getter/setter pair
historyIndex num

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns the index into #history for the current undoable Transaction. The value is -1 if there is no undoable Transaction to be undone.
getter/setter pair
isEnabled bool

Available on UndoManager, provided by the UndoManager$Typings extension

Gets or sets whether this UndoManager records any changes. The default value is false -- you need to set this to true if you want the user to be able to undo or redo.
getter/setter pair
isInTransaction bool

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property is true after the first call to #startTransaction and before a corresponding call to #commitTransaction or #rollbackTransaction.
getter/setter pair
isUndoingRedoing bool

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property is true during a call to #undo or #redo.
getter/setter pair
maxHistoryLength num

Available on UndoManager, provided by the UndoManager$Typings extension

Gets or sets the maximum number of transactions that this undo manager will remember. When a transaction is committed and the number exceeds this value, the UndoManager will discard the oldest transaction(s) in order to meet this limit. The initial value is 999. Any new value must be an integer. A negative value is treated as if there were no limit. A zero value will not remember any Transactions in the #history, but will allow commits and rollbacks to occur normally, including raising "Transaction" type ChangedEvents.
getter/setter pair
models Iterator<Model>

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns an iterator for all of the Models that this UndoManager is handling.
getter/setter pair
nestedTransactionNames List<String>

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns a stack of ongoing transaction names. The outermost transaction name will be the first item in the list. The last one will be the name of the most recent (nested) call to #startTransaction.
getter/setter pair
runtimeType Type
A representation of the runtime type of the object.
no setterinherited
transactionLevel num

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns the current transaction level. The value is zero when there is no ongoing transaction. The initial value is zero. #startTransaction will increment this value; #commitTransaction or #rollbackTransaction will decrement it. When this value is greater than zero, #canUndo and #canRedo will be false, because additional logically related model change events may occur.
getter/setter pair
transactionToRedo Transaction?

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns the Transaction in the #history to be redone next. The value may be null if the UndoManager is not ready to perform a redo.
getter/setter pair
transactionToUndo Transaction?

Available on UndoManager, provided by the UndoManager$Typings extension

This read-only property returns the Transaction in the #history to be undone next. The value may be null if the UndoManager is not ready to perform an undo.
getter/setter pair

Methods

addModel(Model model) → void

Available on UndoManager, provided by the UndoManager$Typings extension

Make sure this UndoManager knows about a Model for which it may receive ChangedEvents when the given Model is changed. The model will also receive notifications about transactions and undo or redo operations.
canRedo() bool

Available on UndoManager, provided by the UndoManager$Typings extension

This predicate returns true if you can call #redo. This will return false if #isEnabled is false (as it is by default), if any transaction is ongoing, or if there is no #transactionToRedo that can be redone. @return {boolean} true if ready for #redo to be called.
canUndo() bool

Available on UndoManager, provided by the UndoManager$Typings extension

This predicate returns true if you can call #undo. This will return false if #isEnabled is false (as it is by default), if any transaction is ongoing, or if there is no #transactionToUndo that can be undone. @return {boolean} true if ready for #undo to be called.
clear() → void

Available on UndoManager, provided by the UndoManager$Typings extension

Clear all of the Transactions and clear all other state, including any ongoing transaction without rolling back. However, this maintains its references to its Models.
commitTransaction([String? tname]) bool

Available on UndoManager, provided by the UndoManager$Typings extension

Commit the current transaction started by a call to #startTransaction.
copyProperties(UndoManager old) → void

Available on UndoManager, provided by the UndoManager$Typings extension

(undocumented) Copy persistent properties from an old UndoManager to this new one. This is called by the Diagram#model property setter. @expose @param old
discardHistoryAfterIndex() → void

Available on UndoManager, provided by the UndoManager$Typings extension

After an undo, call this to discard all of the transactions after this point in the history, as indicated by the #historyIndex. This method is called when a transaction occurs after some number of undo's without the same number of redo's, in order to remove all of the transactions that happened after the current history point, and then adding the new transaction.
handleChanged(ChangedEvent e) → void

Available on UndoManager, provided by the UndoManager$Typings extension

Maybe record a ChangedEvent in the #currentTransaction. This calls #skipsEvent to see if this should ignore the change. If #skipsEvent returns false, this creates a copy of the ChangedEvent and adds it to the #currentTransaction. If there is no #currentTransaction, this first creates and remembers it.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
redo() → void

Available on UndoManager, provided by the UndoManager$Typings extension

After an #undo, re-perform the changes in #transactionToRedo. #canRedo must be true for this method to have any effect.
removeModel(Model model) → void

Available on UndoManager, provided by the UndoManager$Typings extension

Inform this UndoManager that it will no longer be receiving ChangedEvents when the given Model is changed. The model will no longer receive notifications about transactions and undo or redo operations.
rollbackTransaction() bool

Available on UndoManager, provided by the UndoManager$Typings extension

Rollback the current transaction started by a call to #startTransaction, undoing any changes.
skipsEvent(ChangedEvent e) bool

Available on UndoManager, provided by the UndoManager$Typings extension

This predicate is called by #handleChanged to decide if a ChangedEvent is not interesting enough to be remembered.
startTransaction([String? tname]) bool

Available on UndoManager, provided by the UndoManager$Typings extension

Begin a transaction, where the changes are held by a Transaction object as the value of #currentTransaction. You must call either #commitTransaction or #rollbackTransaction afterwards.
toString() String
A string representation of this object.
inherited
undo() → void

Available on UndoManager, provided by the UndoManager$Typings extension

Reverse the effects of the #transactionToUndo. #canUndo must be true for this method to have any effect.

Operators

operator ==(Object other) bool
The equality operator.
inherited