Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
06e846f05a
commit
329f6724d9
165
js/ui/mxgraph/src/js/layout/mxEdgeLabelLayout.js
Normal file
165
js/ui/mxgraph/src/js/layout/mxEdgeLabelLayout.js
Normal file
|
@ -0,0 +1,165 @@
|
|||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user