/** * Copyright (c) 2006-2015, JGraph Ltd * Copyright (c) 2006-2015, Gaudenz Alder */ /** * Class: mxAutoSaveManager * * Manager for automatically saving diagrams. The 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 . */ 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 changes within a timespan of less than * seconds. Eg. a value of 1 (s) means the graph is not * stored more than once per second even if there are more than * 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 . */ 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 . */ mxAutoSaveManager.prototype.isEnabled = function() { return this.enabled; }; /** * Function: setEnabled * * Enables or disables event handling. This implementation * updates . * * 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 and deletes the reference to it. */ mxAutoSaveManager.prototype.destroy = function() { this.setGraph(null); };