222 lines
5.2 KiB
JavaScript
222 lines
5.2 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) 2006-2015, JGraph Ltd
|
||
|
* Copyright (c) 2006-2015, Gaudenz Alder
|
||
|
*/
|
||
|
var mxClipboard =
|
||
|
{
|
||
|
/**
|
||
|
* Class: mxClipboard
|
||
|
*
|
||
|
* Singleton that implements a clipboard for graph cells.
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* (code)
|
||
|
* mxClipboard.copy(graph);
|
||
|
* mxClipboard.paste(graph2);
|
||
|
* (end)
|
||
|
*
|
||
|
* This copies the selection cells from the graph to the clipboard and
|
||
|
* pastes them into graph2.
|
||
|
*
|
||
|
* For fine-grained control of the clipboard data the <mxGraph.canExportCell>
|
||
|
* and <mxGraph.canImportCell> functions can be overridden.
|
||
|
*
|
||
|
* To restore previous parents for pasted cells, the implementation for
|
||
|
* <copy> and <paste> can be changed as follows.
|
||
|
*
|
||
|
* (code)
|
||
|
* mxClipboard.copy = function(graph, cells)
|
||
|
* {
|
||
|
* cells = cells || graph.getSelectionCells();
|
||
|
* var result = graph.getExportableCells(cells);
|
||
|
*
|
||
|
* mxClipboard.parents = new Object();
|
||
|
*
|
||
|
* for (var i = 0; i < result.length; i++)
|
||
|
* {
|
||
|
* mxClipboard.parents[i] = graph.model.getParent(cells[i]);
|
||
|
* }
|
||
|
*
|
||
|
* mxClipboard.insertCount = 1;
|
||
|
* mxClipboard.setCells(graph.cloneCells(result));
|
||
|
*
|
||
|
* return result;
|
||
|
* };
|
||
|
*
|
||
|
* mxClipboard.paste = function(graph)
|
||
|
* {
|
||
|
* if (!mxClipboard.isEmpty())
|
||
|
* {
|
||
|
* var cells = graph.getImportableCells(mxClipboard.getCells());
|
||
|
* var delta = mxClipboard.insertCount * mxClipboard.STEPSIZE;
|
||
|
* var parent = graph.getDefaultParent();
|
||
|
*
|
||
|
* graph.model.beginUpdate();
|
||
|
* try
|
||
|
* {
|
||
|
* for (var i = 0; i < cells.length; i++)
|
||
|
* {
|
||
|
* var tmp = (mxClipboard.parents != null && graph.model.contains(mxClipboard.parents[i])) ?
|
||
|
* mxClipboard.parents[i] : parent;
|
||
|
* cells[i] = graph.importCells([cells[i]], delta, delta, tmp)[0];
|
||
|
* }
|
||
|
* }
|
||
|
* finally
|
||
|
* {
|
||
|
* graph.model.endUpdate();
|
||
|
* }
|
||
|
*
|
||
|
* // Increments the counter and selects the inserted cells
|
||
|
* mxClipboard.insertCount++;
|
||
|
* graph.setSelectionCells(cells);
|
||
|
* }
|
||
|
* };
|
||
|
* (end)
|
||
|
*
|
||
|
* Variable: STEPSIZE
|
||
|
*
|
||
|
* Defines the step size to offset the cells after each paste operation.
|
||
|
* Default is 10.
|
||
|
*/
|
||
|
STEPSIZE: 10,
|
||
|
|
||
|
/**
|
||
|
* Variable: insertCount
|
||
|
*
|
||
|
* Counts the number of times the clipboard data has been inserted.
|
||
|
*/
|
||
|
insertCount: 1,
|
||
|
|
||
|
/**
|
||
|
* Variable: cells
|
||
|
*
|
||
|
* Holds the array of <mxCells> currently in the clipboard.
|
||
|
*/
|
||
|
cells: null,
|
||
|
|
||
|
/**
|
||
|
* Function: setCells
|
||
|
*
|
||
|
* Sets the cells in the clipboard. Fires a <mxEvent.CHANGE> event.
|
||
|
*/
|
||
|
setCells: function(cells)
|
||
|
{
|
||
|
mxClipboard.cells = cells;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Function: getCells
|
||
|
*
|
||
|
* Returns the cells in the clipboard.
|
||
|
*/
|
||
|
getCells: function()
|
||
|
{
|
||
|
return mxClipboard.cells;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Function: isEmpty
|
||
|
*
|
||
|
* Returns true if the clipboard currently has not data stored.
|
||
|
*/
|
||
|
isEmpty: function()
|
||
|
{
|
||
|
return mxClipboard.getCells() == null;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Function: cut
|
||
|
*
|
||
|
* Cuts the given array of <mxCells> from the specified graph.
|
||
|
* If cells is null then the selection cells of the graph will
|
||
|
* be used. Returns the cells that have been cut from the graph.
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* graph - <mxGraph> that contains the cells to be cut.
|
||
|
* cells - Optional array of <mxCells> to be cut.
|
||
|
*/
|
||
|
cut: function(graph, cells)
|
||
|
{
|
||
|
cells = mxClipboard.copy(graph, cells);
|
||
|
mxClipboard.insertCount = 0;
|
||
|
mxClipboard.removeCells(graph, cells);
|
||
|
|
||
|
return cells;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Function: removeCells
|
||
|
*
|
||
|
* Hook to remove the given cells from the given graph after
|
||
|
* a cut operation.
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* graph - <mxGraph> that contains the cells to be cut.
|
||
|
* cells - Array of <mxCells> to be cut.
|
||
|
*/
|
||
|
removeCells: function(graph, cells)
|
||
|
{
|
||
|
graph.removeCells(cells);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Function: copy
|
||
|
*
|
||
|
* Copies the given array of <mxCells> from the specified
|
||
|
* graph to <cells>. Returns the original array of cells that has
|
||
|
* been cloned. Descendants of cells in the array are ignored.
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* graph - <mxGraph> that contains the cells to be copied.
|
||
|
* cells - Optional array of <mxCells> to be copied.
|
||
|
*/
|
||
|
copy: function(graph, cells)
|
||
|
{
|
||
|
cells = cells || graph.getSelectionCells();
|
||
|
var result = graph.getExportableCells(graph.model.getTopmostCells(cells));
|
||
|
mxClipboard.insertCount = 1;
|
||
|
mxClipboard.setCells(graph.cloneCells(result));
|
||
|
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Function: paste
|
||
|
*
|
||
|
* Pastes the <cells> into the specified graph restoring
|
||
|
* the relation to <parents>, if possible. If the parents
|
||
|
* are no longer in the graph or invisible then the
|
||
|
* cells are added to the graph's default or into the
|
||
|
* swimlane under the cell's new location if one exists.
|
||
|
* The cells are added to the graph using <mxGraph.importCells>
|
||
|
* and returned.
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* graph - <mxGraph> to paste the <cells> into.
|
||
|
*/
|
||
|
paste: function(graph)
|
||
|
{
|
||
|
var cells = null;
|
||
|
|
||
|
if (!mxClipboard.isEmpty())
|
||
|
{
|
||
|
cells = graph.getImportableCells(mxClipboard.getCells());
|
||
|
var delta = mxClipboard.insertCount * mxClipboard.STEPSIZE;
|
||
|
var parent = graph.getDefaultParent();
|
||
|
cells = graph.importCells(cells, delta, delta, parent);
|
||
|
|
||
|
// Increments the counter and selects the inserted cells
|
||
|
mxClipboard.insertCount++;
|
||
|
graph.setSelectionCells(cells);
|
||
|
}
|
||
|
|
||
|
return cells;
|
||
|
}
|
||
|
|
||
|
};
|