| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.undo.Manager"); |
| dojo.require("dojo.lang.common"); |
| dojo.undo.Manager = function (parent) { |
| this.clear(); |
| this._parent = parent; |
| }; |
| dojo.extend(dojo.undo.Manager, {_parent:null, _undoStack:null, _redoStack:null, _currentManager:null, canUndo:false, canRedo:false, isUndoing:false, isRedoing:false, onUndo:function (manager, item) { |
| }, onRedo:function (manager, item) { |
| }, onUndoAny:function (manager, item) { |
| }, onRedoAny:function (manager, item) { |
| }, _updateStatus:function () { |
| this.canUndo = this._undoStack.length > 0; |
| this.canRedo = this._redoStack.length > 0; |
| }, clear:function () { |
| this._undoStack = []; |
| this._redoStack = []; |
| this._currentManager = this; |
| this.isUndoing = false; |
| this.isRedoing = false; |
| this._updateStatus(); |
| }, undo:function () { |
| if (!this.canUndo) { |
| return false; |
| } |
| this.endAllTransactions(); |
| this.isUndoing = true; |
| var top = this._undoStack.pop(); |
| if (top instanceof dojo.undo.Manager) { |
| top.undoAll(); |
| } else { |
| top.undo(); |
| } |
| if (top.redo) { |
| this._redoStack.push(top); |
| } |
| this.isUndoing = false; |
| this._updateStatus(); |
| this.onUndo(this, top); |
| if (!(top instanceof dojo.undo.Manager)) { |
| this.getTop().onUndoAny(this, top); |
| } |
| return true; |
| }, redo:function () { |
| if (!this.canRedo) { |
| return false; |
| } |
| this.isRedoing = true; |
| var top = this._redoStack.pop(); |
| if (top instanceof dojo.undo.Manager) { |
| top.redoAll(); |
| } else { |
| top.redo(); |
| } |
| this._undoStack.push(top); |
| this.isRedoing = false; |
| this._updateStatus(); |
| this.onRedo(this, top); |
| if (!(top instanceof dojo.undo.Manager)) { |
| this.getTop().onRedoAny(this, top); |
| } |
| return true; |
| }, undoAll:function () { |
| while (this._undoStack.length > 0) { |
| this.undo(); |
| } |
| }, redoAll:function () { |
| while (this._redoStack.length > 0) { |
| this.redo(); |
| } |
| }, push:function (undo, redo, description) { |
| if (!undo) { |
| return; |
| } |
| if (this._currentManager == this) { |
| this._undoStack.push({undo:undo, redo:redo, description:description}); |
| } else { |
| this._currentManager.push.apply(this._currentManager, arguments); |
| } |
| this._redoStack = []; |
| this._updateStatus(); |
| }, concat:function (manager) { |
| if (!manager) { |
| return; |
| } |
| if (this._currentManager == this) { |
| for (var x = 0; x < manager._undoStack.length; x++) { |
| this._undoStack.push(manager._undoStack[x]); |
| } |
| if (manager._undoStack.length > 0) { |
| this._redoStack = []; |
| } |
| this._updateStatus(); |
| } else { |
| this._currentManager.concat.apply(this._currentManager, arguments); |
| } |
| }, beginTransaction:function (description) { |
| if (this._currentManager == this) { |
| var mgr = new dojo.undo.Manager(this); |
| mgr.description = description ? description : ""; |
| this._undoStack.push(mgr); |
| this._currentManager = mgr; |
| return mgr; |
| } else { |
| this._currentManager = this._currentManager.beginTransaction.apply(this._currentManager, arguments); |
| } |
| }, endTransaction:function (flatten) { |
| if (this._currentManager == this) { |
| if (this._parent) { |
| this._parent._currentManager = this._parent; |
| if (this._undoStack.length == 0 || flatten) { |
| var idx = dojo.lang.find(this._parent._undoStack, this); |
| if (idx >= 0) { |
| this._parent._undoStack.splice(idx, 1); |
| if (flatten) { |
| for (var x = 0; x < this._undoStack.length; x++) { |
| this._parent._undoStack.splice(idx++, 0, this._undoStack[x]); |
| } |
| this._updateStatus(); |
| } |
| } |
| } |
| return this._parent; |
| } |
| } else { |
| this._currentManager = this._currentManager.endTransaction.apply(this._currentManager, arguments); |
| } |
| }, endAllTransactions:function () { |
| while (this._currentManager != this) { |
| this.endTransaction(); |
| } |
| }, getTop:function () { |
| if (this._parent) { |
| return this._parent.getTop(); |
| } else { |
| return this; |
| } |
| }}); |
| |