Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
43b8acdd19
commit
6c1ef14f32
450
js/ui/mxgraph/src/js/view/mxSwimlaneManager.js
Normal file
450
js/ui/mxgraph/src/js/view/mxSwimlaneManager.js
Normal file
|
@ -0,0 +1,450 @@
|
|||
/**
|
||||
* Copyright (c) 2006-2015, JGraph Ltd
|
||||
* Copyright (c) 2006-2015, Gaudenz Alder
|
||||
*/
|
||||
/**
|
||||
* Class: mxSwimlaneManager
|
||||
*
|
||||
* Manager for swimlanes and nested swimlanes that sets the size of newly added
|
||||
* swimlanes to that of their siblings, and propagates changes to the size of a
|
||||
* swimlane to its siblings, if <siblings> is true, and its ancestors, if
|
||||
* <bubbling> is true.
|
||||
*
|
||||
* Constructor: mxSwimlaneManager
|
||||
*
|
||||
* Constructs a new swimlane manager for the given graph.
|
||||
*
|
||||
* Arguments:
|
||||
*
|
||||
* graph - Reference to the enclosing graph.
|
||||
*/
|
||||
function mxSwimlaneManager(graph, horizontal, addEnabled, resizeEnabled)
|
||||
{
|
||||
this.horizontal = (horizontal != null) ? horizontal : true;
|
||||
this.addEnabled = (addEnabled != null) ? addEnabled : true;
|
||||
this.resizeEnabled = (resizeEnabled != null) ? resizeEnabled : true;
|
||||
|
||||
this.addHandler = mxUtils.bind(this, function(sender, evt)
|
||||
{
|
||||
if (this.isEnabled() && this.isAddEnabled())
|
||||
{
|
||||
this.cellsAdded(evt.getProperty('cells'));
|
||||
}
|
||||
});
|
||||
|
||||
this.resizeHandler = mxUtils.bind(this, function(sender, evt)
|
||||
{
|
||||
if (this.isEnabled() && this.isResizeEnabled())
|
||||
{
|
||||
this.cellsResized(evt.getProperty('cells'));
|
||||
}
|
||||
});
|
||||
|
||||
this.setGraph(graph);
|
||||
};
|
||||
|
||||
/**
|
||||
* Extends mxEventSource.
|
||||
*/
|
||||
mxSwimlaneManager.prototype = new mxEventSource();
|
||||
mxSwimlaneManager.prototype.constructor = mxSwimlaneManager;
|
||||
|
||||
/**
|
||||
* Variable: graph
|
||||
*
|
||||
* Reference to the enclosing <mxGraph>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.graph = null;
|
||||
|
||||
/**
|
||||
* Variable: enabled
|
||||
*
|
||||
* Specifies if event handling is enabled. Default is true.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.enabled = true;
|
||||
|
||||
/**
|
||||
* Variable: horizontal
|
||||
*
|
||||
* Specifies the orientation of the swimlanes. Default is true.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.horizontal = true;
|
||||
|
||||
/**
|
||||
* Variable: addEnabled
|
||||
*
|
||||
* Specifies if newly added cells should be resized to match the size of their
|
||||
* existing siblings. Default is true.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.addEnabled = true;
|
||||
|
||||
/**
|
||||
* Variable: resizeEnabled
|
||||
*
|
||||
* Specifies if resizing of swimlanes should be handled. Default is true.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.resizeEnabled = true;
|
||||
|
||||
/**
|
||||
* Variable: moveHandler
|
||||
*
|
||||
* Holds the function that handles the move event.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.addHandler = null;
|
||||
|
||||
/**
|
||||
* Variable: moveHandler
|
||||
*
|
||||
* Holds the function that handles the move event.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.resizeHandler = null;
|
||||
|
||||
/**
|
||||
* Function: isEnabled
|
||||
*
|
||||
* Returns true if events are handled. This implementation
|
||||
* returns <enabled>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.isEnabled = function()
|
||||
{
|
||||
return this.enabled;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: setEnabled
|
||||
*
|
||||
* Enables or disables event handling. This implementation
|
||||
* updates <enabled>.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* enabled - Boolean that specifies the new enabled state.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.setEnabled = function(value)
|
||||
{
|
||||
this.enabled = value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: isHorizontal
|
||||
*
|
||||
* Returns <horizontal>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.isHorizontal = function()
|
||||
{
|
||||
return this.horizontal;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: setHorizontal
|
||||
*
|
||||
* Sets <horizontal>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.setHorizontal = function(value)
|
||||
{
|
||||
this.horizontal = value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: isAddEnabled
|
||||
*
|
||||
* Returns <addEnabled>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.isAddEnabled = function()
|
||||
{
|
||||
return this.addEnabled;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: setAddEnabled
|
||||
*
|
||||
* Sets <addEnabled>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.setAddEnabled = function(value)
|
||||
{
|
||||
this.addEnabled = value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: isResizeEnabled
|
||||
*
|
||||
* Returns <resizeEnabled>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.isResizeEnabled = function()
|
||||
{
|
||||
return this.resizeEnabled;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: setResizeEnabled
|
||||
*
|
||||
* Sets <resizeEnabled>.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.setResizeEnabled = function(value)
|
||||
{
|
||||
this.resizeEnabled = value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: getGraph
|
||||
*
|
||||
* Returns the graph that this manager operates on.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.getGraph = function()
|
||||
{
|
||||
return this.graph;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: setGraph
|
||||
*
|
||||
* Sets the graph that the manager operates on.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.setGraph = function(graph)
|
||||
{
|
||||
if (this.graph != null)
|
||||
{
|
||||
this.graph.removeListener(this.addHandler);
|
||||
this.graph.removeListener(this.resizeHandler);
|
||||
}
|
||||
|
||||
this.graph = graph;
|
||||
|
||||
if (this.graph != null)
|
||||
{
|
||||
this.graph.addListener(mxEvent.ADD_CELLS, this.addHandler);
|
||||
this.graph.addListener(mxEvent.CELLS_RESIZED, this.resizeHandler);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: isSwimlaneIgnored
|
||||
*
|
||||
* Returns true if the given swimlane should be ignored.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.isSwimlaneIgnored = function(swimlane)
|
||||
{
|
||||
return !this.getGraph().isSwimlane(swimlane);
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: isCellHorizontal
|
||||
*
|
||||
* Returns true if the given cell is horizontal. If the given cell is not a
|
||||
* swimlane, then the global orientation is returned.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.isCellHorizontal = function(cell)
|
||||
{
|
||||
if (this.graph.isSwimlane(cell))
|
||||
{
|
||||
var style = this.graph.getCellStyle(cell);
|
||||
|
||||
return mxUtils.getValue(style, mxConstants.STYLE_HORIZONTAL, 1) == 1;
|
||||
}
|
||||
|
||||
return !this.isHorizontal();
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: cellsAdded
|
||||
*
|
||||
* Called if any cells have been added.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* cell - Array of <mxCells> that have been added.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.cellsAdded = function(cells)
|
||||
{
|
||||
if (cells != null)
|
||||
{
|
||||
var model = this.getGraph().getModel();
|
||||
|
||||
model.beginUpdate();
|
||||
try
|
||||
{
|
||||
for (var i = 0; i < cells.length; i++)
|
||||
{
|
||||
if (!this.isSwimlaneIgnored(cells[i]))
|
||||
{
|
||||
this.swimlaneAdded(cells[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
model.endUpdate();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: swimlaneAdded
|
||||
*
|
||||
* Updates the size of the given swimlane to match that of any existing
|
||||
* siblings swimlanes.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* swimlane - <mxCell> that represents the new swimlane.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.swimlaneAdded = function(swimlane)
|
||||
{
|
||||
var model = this.getGraph().getModel();
|
||||
var parent = model.getParent(swimlane);
|
||||
var childCount = model.getChildCount(parent);
|
||||
var geo = null;
|
||||
|
||||
// Finds the first valid sibling swimlane as reference
|
||||
for (var i = 0; i < childCount; i++)
|
||||
{
|
||||
var child = model.getChildAt(parent, i);
|
||||
|
||||
if (child != swimlane && !this.isSwimlaneIgnored(child))
|
||||
{
|
||||
geo = model.getGeometry(child);
|
||||
|
||||
if (geo != null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Applies the size of the refernece to the newly added swimlane
|
||||
if (geo != null)
|
||||
{
|
||||
var parentHorizontal = (parent != null) ? this.isCellHorizontal(parent) : this.horizontal;
|
||||
this.resizeSwimlane(swimlane, geo.width, geo.height, parentHorizontal);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: cellsResized
|
||||
*
|
||||
* Called if any cells have been resizes. Calls <swimlaneResized> for all
|
||||
* swimlanes where <isSwimlaneIgnored> returns false.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* cells - Array of <mxCells> whose size was changed.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.cellsResized = function(cells)
|
||||
{
|
||||
if (cells != null)
|
||||
{
|
||||
var model = this.getGraph().getModel();
|
||||
|
||||
model.beginUpdate();
|
||||
try
|
||||
{
|
||||
// Finds the top-level swimlanes and adds offsets
|
||||
for (var i = 0; i < cells.length; i++)
|
||||
{
|
||||
if (!this.isSwimlaneIgnored(cells[i]))
|
||||
{
|
||||
var geo = model.getGeometry(cells[i]);
|
||||
|
||||
if (geo != null)
|
||||
{
|
||||
var size = new mxRectangle(0, 0, geo.width, geo.height);
|
||||
var top = cells[i];
|
||||
var current = top;
|
||||
|
||||
while (current != null)
|
||||
{
|
||||
top = current;
|
||||
current = model.getParent(current);
|
||||
var tmp = (this.graph.isSwimlane(current)) ?
|
||||
this.graph.getStartSize(current) :
|
||||
new mxRectangle();
|
||||
size.width += tmp.width;
|
||||
size.height += tmp.height;
|
||||
}
|
||||
|
||||
var parentHorizontal = (current != null) ? this.isCellHorizontal(current) : this.horizontal;
|
||||
this.resizeSwimlane(top, size.width, size.height, parentHorizontal);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
model.endUpdate();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: resizeSwimlane
|
||||
*
|
||||
* Called from <cellsResized> for all swimlanes that are not ignored to update
|
||||
* the size of the siblings and the size of the parent swimlanes, recursively,
|
||||
* if <bubbling> is true.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* swimlane - <mxCell> whose size has changed.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.resizeSwimlane = function(swimlane, w, h, parentHorizontal)
|
||||
{
|
||||
var model = this.getGraph().getModel();
|
||||
|
||||
model.beginUpdate();
|
||||
try
|
||||
{
|
||||
var horizontal = this.isCellHorizontal(swimlane);
|
||||
|
||||
if (!this.isSwimlaneIgnored(swimlane))
|
||||
{
|
||||
var geo = model.getGeometry(swimlane);
|
||||
|
||||
if (geo != null)
|
||||
{
|
||||
if ((parentHorizontal && geo.height != h) || (!parentHorizontal && geo.width != w))
|
||||
{
|
||||
geo = geo.clone();
|
||||
|
||||
if (parentHorizontal)
|
||||
{
|
||||
geo.height = h;
|
||||
}
|
||||
else
|
||||
{
|
||||
geo.width = w;
|
||||
}
|
||||
|
||||
model.setGeometry(swimlane, geo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var tmp = (this.graph.isSwimlane(swimlane)) ?
|
||||
this.graph.getStartSize(swimlane) :
|
||||
new mxRectangle();
|
||||
w -= tmp.width;
|
||||
h -= tmp.height;
|
||||
|
||||
var childCount = model.getChildCount(swimlane);
|
||||
|
||||
for (var i = 0; i < childCount; i++)
|
||||
{
|
||||
var child = model.getChildAt(swimlane, i);
|
||||
this.resizeSwimlane(child, w, h, horizontal);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
model.endUpdate();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: destroy
|
||||
*
|
||||
* Removes all handlers from the <graph> and deletes the reference to it.
|
||||
*/
|
||||
mxSwimlaneManager.prototype.destroy = function()
|
||||
{
|
||||
this.setGraph(null);
|
||||
};
|
Loading…
Reference in New Issue
Block a user