Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
94363c1d0e
commit
2bf95ff31a
213
js/ui/mxgraph/src/js/util/mxAutoSaveManager.js
Normal file
213
js/ui/mxgraph/src/js/util/mxAutoSaveManager.js
Normal file
|
@ -0,0 +1,213 @@
|
|||
/**
|
||||
* Copyright (c) 2006-2015, JGraph Ltd
|
||||
* Copyright (c) 2006-2015, Gaudenz Alder
|
||||
*/
|
||||
/**
|
||||
* 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);
|
||||
};
|
Loading…
Reference in New Issue
Block a user