diff options
Diffstat (limited to 'src/js/util/mxAutoSaveManager.js')
-rw-r--r-- | src/js/util/mxAutoSaveManager.js | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/src/js/util/mxAutoSaveManager.js b/src/js/util/mxAutoSaveManager.js new file mode 100644 index 0000000..85c23dc --- /dev/null +++ b/src/js/util/mxAutoSaveManager.js @@ -0,0 +1,213 @@ +/** + * $Id: mxAutoSaveManager.js,v 1.9 2010-09-16 09:10:21 gaudenz Exp $ + * Copyright (c) 2006-2010, JGraph Ltd + */ +/** + * Class: mxAutoSaveManager + * + * Manager for automatically saving diagrams. The <save> hook must be + * implemented. + * + * Example: + * + * (code) + * var mgr = new mxAutoSaveManager(editor.graph); + * mgr.save = function() + * { + * mxLog.show(); + * mxLog.debug('save'); + * }; + * (end) + * + * Constructor: mxAutoSaveManager + * + * Constructs a new automatic layout for the given graph. + * + * Arguments: + * + * graph - Reference to the enclosing graph. + */ +function mxAutoSaveManager(graph) +{ + // Notifies the manager of a change + this.changeHandler = mxUtils.bind(this, function(sender, evt) + { + if (this.isEnabled()) + { + this.graphModelChanged(evt.getProperty('edit').changes); + } + }); + + this.setGraph(graph); +}; + +/** + * Extends mxEventSource. + */ +mxAutoSaveManager.prototype = new mxEventSource(); +mxAutoSaveManager.prototype.constructor = mxAutoSaveManager; + +/** + * Variable: graph + * + * Reference to the enclosing <mxGraph>. + */ +mxAutoSaveManager.prototype.graph = null; + +/** + * Variable: autoSaveDelay + * + * Minimum amount of seconds between two consecutive autosaves. Eg. a + * value of 1 (s) means the graph is not stored more than once per second. + * Default is 10. + */ +mxAutoSaveManager.prototype.autoSaveDelay = 10; + +/** + * Variable: autoSaveThrottle + * + * Minimum amount of seconds between two consecutive autosaves triggered by + * more than <autoSaveThreshhold> changes within a timespan of less than + * <autoSaveDelay> seconds. Eg. a value of 1 (s) means the graph is not + * stored more than once per second even if there are more than + * <autoSaveThreshold> changes within that timespan. Default is 2. + */ +mxAutoSaveManager.prototype.autoSaveThrottle = 2; + +/** + * Variable: autoSaveThreshold + * + * Minimum amount of ignored changes before an autosave. Eg. a value of 2 + * means after 2 change of the graph model the autosave will trigger if the + * condition below is true. Default is 5. + */ +mxAutoSaveManager.prototype.autoSaveThreshold = 5; + +/** + * Variable: ignoredChanges + * + * Counter for ignored changes in autosave. + */ +mxAutoSaveManager.prototype.ignoredChanges = 0; + +/** + * Variable: lastSnapshot + * + * Used for autosaving. See <autosave>. + */ +mxAutoSaveManager.prototype.lastSnapshot = 0; + +/** + * Variable: enabled + * + * Specifies if event handling is enabled. Default is true. + */ +mxAutoSaveManager.prototype.enabled = true; + +/** + * Variable: changeHandler + * + * Holds the function that handles graph model changes. + */ +mxAutoSaveManager.prototype.changeHandler = null; + +/** + * Function: isEnabled + * + * Returns true if events are handled. This implementation + * returns <enabled>. + */ +mxAutoSaveManager.prototype.isEnabled = function() +{ + return this.enabled; +}; + +/** + * Function: setEnabled + * + * Enables or disables event handling. This implementation + * updates <enabled>. + * + * Parameters: + * + * enabled - Boolean that specifies the new enabled state. + */ +mxAutoSaveManager.prototype.setEnabled = function(value) +{ + this.enabled = value; +}; + +/** + * Function: setGraph + * + * Sets the graph that the layouts operate on. + */ +mxAutoSaveManager.prototype.setGraph = function(graph) +{ + if (this.graph != null) + { + this.graph.getModel().removeListener(this.changeHandler); + } + + this.graph = graph; + + if (this.graph != null) + { + this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler); + } +}; + +/** + * Function: save + * + * Empty hook that is called if the graph should be saved. + */ +mxAutoSaveManager.prototype.save = function() +{ + // empty +}; + +/** + * Function: graphModelChanged + * + * Invoked when the graph model has changed. + */ +mxAutoSaveManager.prototype.graphModelChanged = function(changes) +{ + var now = new Date().getTime(); + var dt = (now - this.lastSnapshot) / 1000; + + if (dt > this.autoSaveDelay || + (this.ignoredChanges >= this.autoSaveThreshold && + dt > this.autoSaveThrottle)) + { + this.save(); + this.reset(); + } + else + { + // Increments the number of ignored changes + this.ignoredChanges++; + } +}; + +/** + * Function: reset + * + * Resets all counters. + */ +mxAutoSaveManager.prototype.reset = function() +{ + this.lastSnapshot = new Date().getTime(); + this.ignoredChanges = 0; +}; + +/** + * Function: destroy + * + * Removes all handlers from the <graph> and deletes the reference to it. + */ +mxAutoSaveManager.prototype.destroy = function() +{ + this.setGraph(null); +}; |