/** * Sample plugin. */ Draw.loadPlugin(function(ui) { // Adds numbered toggle property Editor.commonVertexProperties.push({name: 'numbered', dispName: 'Numbered', type: 'bool', defVal: true, isVisible: function(state, format) { var graph = format.editorUi.editor.graph; return graph.view.redrawNumberShape != null; }, onChange: function(graph, newValue) { graph.refresh(); }}); var graph = ui.editor.graph; var enabled = true; var counter = 0; var graphViewResetValidationState = graph.view.resetValidationState; graph.view.resetValidationState = function() { graphViewResetValidationState.apply(this, arguments); this.numberCounter = 0; }; var graphViewValidateCellState = graph.view.validateCellState; graph.view.validateCellState = function(cell, recurse) { var state = graphViewValidateCellState.apply(this, arguments); recurse = (recurse != null) ? recurse : true; if (recurse && state != null && graph.model.isVertex(state.cell) && mxUtils.getValue(state.style, 'numbered', 1) == 1) { this.numberCounter++; this.redrawNumberShape(state); } return state; }; graph.view.redrawNumberShape = function(state) { var numbered = mxUtils.getValue(state.style, 'numbered', 1) == 1; var value = '
' + (this.numberCounter) + '
'; if (enabled && numbered && graph.model.isVertex(state.cell) && state.shape != null && state.secondLabel == null) { state.secondLabel = new mxText(value, new mxRectangle(), mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM); // Styles the label state.secondLabel.size = 12; state.secondLabel.dialect = mxConstants.DIALECT_STRICTHTML; graph.cellRenderer.initializeLabel(state, state.secondLabel); } if (state.secondLabel != null) { if (!numbered) { state.secondLabel.destroy(); state.secondLabel = null; } else { var scale = graph.getView().getScale(); var bounds = new mxRectangle(state.x + state.width - 4 * scale, state.y + 4 * scale, 0, 0); state.secondLabel.value = value; state.secondLabel.state = state; state.secondLabel.scale = scale; state.secondLabel.bounds = bounds; state.secondLabel.redraw(); } } }; // Destroys the shape number var destroy = graph.cellRenderer.destroy; graph.cellRenderer.destroy = function(state) { destroy.apply(this, arguments); if (state.secondLabel != null) { state.secondLabel.destroy(); state.secondLabel = null; } }; graph.cellRenderer.getShapesForState = function(state) { return [state.shape, state.text, state.secondLabel, state.control]; }; // Extends View menu mxResources.parse('number=Number'); // Adds action var action = ui.actions.addAction('number...', function() { enabled = !enabled; graph.refresh(); }); action.setToggleAction(true); action.setSelectedCallback(function() { return enabled; }); var menu = ui.menus.get((urlParams['sketch'] == '1') ? 'extras' : 'view'); var oldFunct = menu.funct; menu.funct = function(menu, parent) { oldFunct.apply(this, arguments); ui.menus.addMenuItems(menu, ['-', 'number'], parent); }; // Forces refresh if file was loaded before plugin if (ui.getCurrentFile() != null) { graph.refresh(); } });