/** * Copyright (c) 2006-2015, JGraph Ltd * Copyright (c) 2006-2015, Gaudenz Alder */ /** * Class: mxGraphSelectionModel * * Implements the selection model for a graph. Here is a listener that handles * all removed selection cells. * * (code) * graph.getSelectionModel().addListener(mxEvent.CHANGE, function(sender, evt) * { * var cells = evt.getProperty('added'); * * for (var i = 0; i < cells.length; i++) * { * // Handle cells[i]... * } * }); * (end) * * Event: mxEvent.UNDO * * Fires after the selection was changed in . The * edit property contains the which contains the * . * * Event: mxEvent.CHANGE * * Fires after the selection changes by executing an . The * added and removed properties contain arrays of * cells that have been added to or removed from the selection, respectively. * The names are inverted due to historic reasons. This cannot be changed. * * Constructor: mxGraphSelectionModel * * Constructs a new graph selection model for the given . * * Parameters: * * graph - Reference to the enclosing . */ function mxGraphSelectionModel(graph) { this.graph = graph; this.cells = []; }; /** * Extends mxEventSource. */ mxGraphSelectionModel.prototype = new mxEventSource(); mxGraphSelectionModel.prototype.constructor = mxGraphSelectionModel; /** * Variable: doneResource * * Specifies the resource key for the status message after a long operation. * If the resource for this key does not exist then the value is used as * the status message. Default is 'done'. */ mxGraphSelectionModel.prototype.doneResource = (mxClient.language != 'none') ? 'done' : ''; /** * Variable: updatingSelectionResource * * Specifies the resource key for the status message while the selection is * being updated. If the resource for this key does not exist then the * value is used as the status message. Default is 'updatingSelection'. */ mxGraphSelectionModel.prototype.updatingSelectionResource = (mxClient.language != 'none') ? 'updatingSelection' : ''; /** * Variable: graph * * Reference to the enclosing . */ mxGraphSelectionModel.prototype.graph = null; /** * Variable: singleSelection * * Specifies if only one selected item at a time is allowed. * Default is false. */ mxGraphSelectionModel.prototype.singleSelection = false; /** * Function: isSingleSelection * * Returns as a boolean. */ mxGraphSelectionModel.prototype.isSingleSelection = function() { return this.singleSelection; }; /** * Function: setSingleSelection * * Sets the flag. * * Parameters: * * singleSelection - Boolean that specifies the new value for * . */ mxGraphSelectionModel.prototype.setSingleSelection = function(singleSelection) { this.singleSelection = singleSelection; }; /** * Function: isSelected * * Returns true if the given is selected. */ mxGraphSelectionModel.prototype.isSelected = function(cell) { if (cell != null) { return mxUtils.indexOf(this.cells, cell) >= 0; } return false; }; /** * Function: isEmpty * * Returns true if no cells are currently selected. */ mxGraphSelectionModel.prototype.isEmpty = function() { return this.cells.length == 0; }; /** * Function: clear * * Clears the selection and fires a event if the selection was not * empty. */ mxGraphSelectionModel.prototype.clear = function() { this.changeSelection(null, this.cells); }; /** * Function: setCell * * Selects the specified using . * * Parameters: * * cell - to be selected. */ mxGraphSelectionModel.prototype.setCell = function(cell) { if (cell != null) { this.setCells([cell]); } }; /** * Function: setCells * * Selects the given array of and fires a event. * * Parameters: * * cells - Array of to be selected. */ mxGraphSelectionModel.prototype.setCells = function(cells) { if (cells != null) { if (this.singleSelection) { cells = [this.getFirstSelectableCell(cells)]; } var tmp = []; for (var i = 0; i < cells.length; i++) { if (this.graph.isCellSelectable(cells[i])) { tmp.push(cells[i]); } } this.changeSelection(tmp, this.cells); } }; /** * Function: getFirstSelectableCell * * Returns the first selectable cell in the given array of cells. */ mxGraphSelectionModel.prototype.getFirstSelectableCell = function(cells) { if (cells != null) { for (var i = 0; i < cells.length; i++) { if (this.graph.isCellSelectable(cells[i])) { return cells[i]; } } } return null; }; /** * Function: addCell * * Adds the given to the selection and fires a * event. * * Parameters: * * cells - Array of to add to the selection. */ mxGraphSelectionModel.prototype.addCells = function(cells) { if (cells != null) { var remove = null; if (this.singleSelection) { remove = this.cells; cells = [this.getFirstSelectableCell(cells)]; } var tmp = []; for (var i = 0; i < cells.length; i++) { if (!this.isSelected(cells[i]) && this.graph.isCellSelectable(cells[i])) { tmp.push(cells[i]); } } this.changeSelection(tmp, remove); } }; /** * Function: removeCell * * Removes the specified from the selection and fires a