/** * Copyright (c) 2006-2015, JGraph Ltd * Copyright (c) 2006-2015, Gaudenz Alder */ /** * Class: mxEdgeLabelLayout * * Extends to implement an edge label layout. This layout * makes use of cell states, which means the graph must be validated in * a graph view (so that the label bounds are available) before this layout * can be executed. * * Example: * * (code) * var layout = new mxEdgeLabelLayout(graph); * layout.execute(graph.getDefaultParent()); * (end) * * Constructor: mxEdgeLabelLayout * * Constructs a new edge label layout. * * Arguments: * * graph - that contains the cells. */ function mxEdgeLabelLayout(graph, radius) { mxGraphLayout.call(this, graph); }; /** * Extends mxGraphLayout. */ mxEdgeLabelLayout.prototype = new mxGraphLayout(); mxEdgeLabelLayout.prototype.constructor = mxEdgeLabelLayout; /** * Function: execute * * Implements . */ mxEdgeLabelLayout.prototype.execute = function(parent) { var view = this.graph.view; var model = this.graph.getModel(); // Gets all vertices and edges inside the parent var edges = []; var vertices = []; var childCount = model.getChildCount(parent); for (var i = 0; i < childCount; i++) { var cell = model.getChildAt(parent, i); var state = view.getState(cell); if (state != null) { if (!this.isVertexIgnored(cell)) { vertices.push(state); } else if (!this.isEdgeIgnored(cell)) { edges.push(state); } } } this.placeLabels(vertices, edges); }; /** * Function: placeLabels * * Places the labels of the given edges. */ mxEdgeLabelLayout.prototype.placeLabels = function(v, e) { var model = this.graph.getModel(); // Moves the vertices to build a circle. Makes sure the // radius is large enough for the vertices to not // overlap model.beginUpdate(); try { for (var i = 0; i < e.length; i++) { var edge = e[i]; if (edge != null && edge.text != null && edge.text.boundingBox != null) { for (var j = 0; j < v.length; j++) { var vertex = v[j]; if (vertex != null) { this.avoid(edge, vertex); } } } } } finally { model.endUpdate(); } }; /** * Function: avoid * * Places the labels of the given edges. */ mxEdgeLabelLayout.prototype.avoid = function(edge, vertex) { var model = this.graph.getModel(); var labRect = edge.text.boundingBox; if (mxUtils.intersects(labRect, vertex)) { var dy1 = -labRect.y - labRect.height + vertex.y; var dy2 = -labRect.y + vertex.y + vertex.height; var dy = (Math.abs(dy1) < Math.abs(dy2)) ? dy1 : dy2; var dx1 = -labRect.x - labRect.width + vertex.x; var dx2 = -labRect.x + vertex.x + vertex.width; var dx = (Math.abs(dx1) < Math.abs(dx2)) ? dx1 : dx2; if (Math.abs(dx) < Math.abs(dy)) { dy = 0; } else { dx = 0; } var g = model.getGeometry(edge.cell); if (g != null) { g = g.clone(); if (g.offset != null) { g.offset.x += dx; g.offset.y += dy; } else { g.offset = new mxPoint(dx, dy); } model.setGeometry(edge.cell, g); } } };