Rev 1422 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified 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;}}});