166 lines
3.1 KiB
JavaScript
166 lines
3.1 KiB
JavaScript
/**
|
|
* Copyright (c) 2006-2015, JGraph Ltd
|
|
* Copyright (c) 2006-2015, Gaudenz Alder
|
|
*/
|
|
/**
|
|
* Class: mxEdgeLabelLayout
|
|
*
|
|
* Extends <mxGraphLayout> 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 - <mxGraph> 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 <mxGraphLayout.execute>.
|
|
*/
|
|
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);
|
|
}
|
|
}
|
|
};
|