- I
- I
Remarks
Layout Style
The way a graph is arranged depends on the layout algorithms which are applied to the different group nodes. RecursiveGroupLayout is able to produce different layout styles for the content of each group node.
This layout algorithm can be either applied if an ILayoutAlgorithm cannot handle grouped graphs by itself or if the content of (some) group nodes should be arranged differently.
Concept
RecursiveGroupLayout uses a hierarchy tree representation of the grouped graph in which the content nodes are the children of their containing group node. That way, it can traverse the tree recursively while arranging only the direct children of each group node. The layout algorithm starts by arranging the leaves in the hierarchy tree, then works its way up to the root computing the layout for each group node in the tree.
A) Group Handling
All nodes other than the direct children are temporarily hidden. The layout algorithm performs two steps for each group node.- It arranges the direct children using either the coreLayout or a special layout algorithm defined using the layout data property groupNodeLayouts. The content of group nodes among the children is already arranged at this time and will be ignored. These group nodes are handled like normal nodes with a size that encloses the content.
The following two special cases should be considered. If
nullis specified as layout algorithm for a group, the recursion will be disabled and the group is handled non-recursively: the group itself and its content is arranged by the algorithm specified for the nearest ancestor which has a non-nullalgorithm mapped to it. Importantly, this must be distinguished from the second case where the layout of the group content should remain unchanged. This is achieved when the group is associated with FIX_CONTENT_LAYOUT as responsible layout algorithm (or any other algorithm that does not change the layout). - Then RecursiveGroupLayout computes the final size of the group node using an implementation of ILayoutGroupBoundsCalculator. Customized ILayoutGroupBoundsCalculators can be specified using groupBoundsCalculator. Aside from the resulting layout, this size is used in the following iteration.
B) Top-Level Hierarchy
After a layout is applied to all group nodes, the layout algorithm uses the coreLayout to arrange the top level hierarchy. Note that RecursiveGroupLayout can run without a core layout. In this case no layout is calculated for the top level hierarchy. Still, for group nodes with a non-null algorithm, the bounds are adjusted to fit their respective contents.
C) Inter-Edge Routing
Finally, routes for the edges whose source node is located at a different hierarchy level than its target node are computed. The edge routing algorithm for these so-called inter-edges can be customized.
Features
To apply different layout styles to the contents of group nodes, it is required to map each group node to a corresponding ILayoutAlgorithm via groupNodeLayouts. The content of the hierarchy root is arranged with the coreLayout.
Since RecursiveGroupLayout delegates the actual arrangement of the graph to other layout algorithms, it will support the same features as the currently used layout algorithm.
The improvement of the routing of inter-edges is based on the insertion of EdgePortCandidates. Hence, they only work well if the applied layout algorithm supports EdgePortCandidates.
This algorithm also provides a fromSketchMode that should be activated if the applied layout algorithm runs in From Sketch mode, too. Otherwise, the initial coordinates may not be considered correctly.
It is also possible to apply individual layout styles to different sub-graphs using this algorithm without actually defining group nodes: Use TemporaryGroupInsertionStage and specify RecursiveGroupLayout as its core layout algorithm. The stage allows to define sub-graphs which are internally enclosed by a temporary group node. To assign a specific ILayoutAlgorithm instance for a temporary group, specify the desired ILayoutAlgorithm in the TemporaryGroupDescriptor's property recursiveGroupLayoutAlgorithm. It is then not necessary to use groupNodeLayouts.
Default Values of Properties
| Name | Default | Description |
|---|---|---|
| considerEmptyGroups | false | Empty group nodes are not resized. |
| coreLayout | null | |
| fromSketchMode | false | The initial coordinates of the nodes are not taken into account. |
| groupBoundsCalculator | GroupBoundsCalculator | |
| interEdgeRouter | null | Edges are routed as straight lines from source to target. |
See Also
Developer's Guide
Members
Constructors
RecursiveGroupLayout
(coreLayout?: ILayoutAlgorithm, groupBoundsCalculator?: ILayoutGroupBoundsCalculator)Creates a new instance of RecursiveGroupLayout.
RecursiveGroupLayout
(coreLayout?: ILayoutAlgorithm, groupBoundsCalculator?: ILayoutGroupBoundsCalculator)Parameters
- coreLayout?: ILayoutAlgorithm
- The layout algorithm that is applied in each step of the recursion. The default value is
null. - groupBoundsCalculator?: ILayoutGroupBoundsCalculator
- An optional ILayoutGroupBoundsCalculator for calculating group sizes. The default value is GroupBoundsCalculator.
Properties
Gets or sets whether or not temporary LayoutPortCandidates are inserted to improve the routing of inter-edges.
If enabled, RecursiveGroupLayout will insert LayoutPortCandidates for all inter-edges that cross a group node border. Those LayoutPortCandidates are located at the relative position of the real source/target node. Inter-edges that connect to such LayoutPortCandidates will be routed when the layout of the containing group node is calculated and will not be rerouted later. This may produce more suitable edge routes but cannot prevent edges from crossing nodes.
Without temporary or user specified LayoutPortCandidates, inter-edges will always end at the border/center of the corresponding group node. Thus, they are rerouted afterwards using an edge routing algorithm.
Property Value
true if temporary port candidates are insertedDefault Value
Sample Graphs
falseSee Also
Property Value
true if empty groups are treated like group nodes, false if they are treated like normal nodesDefault Value
Sample Graphs
Gets or sets the core ILayoutAlgorithm that is wrapped by this stage.
Property Value
Default Value
Defined in
LayoutStageBase.coreLayoutGets or sets a value that determines whether this stage should do anything but execute the coreLayout.
By default, when constructed, stages should be enabled. Users may disable a stage's functionality by setting this property to false.
Stages that can guarantee that the graph will not change can choose to not even execute the coreLayout when disabled.
Defined in
LayoutStageBase.enabledProperty Value
true if the initial coordinates of the graph elements are considered, false otherwiseDefault Value
Gets or sets a ILayoutGroupBoundsCalculator which computes the sizes of all group nodes.
Property Value
Default Value
Gets or sets the current edge routing algorithm for handling inter-edges.
Property Value
Default Value
Methods
Implementation of the ILayoutAlgorithm interface and main entry point for the layout calculation.
Parameters
- graph: LayoutGraph
- The graph to apply the layout to.
Defined in
LayoutStageBase.applyLayoutInvokes a recursive traversal through the grouping hierarchy of the given graph during which the specified layout algorithms are applied to the content of the groups.
createLayoutData
(graph: LayoutGraph): RecursiveGroupLayoutData<LayoutNode, LayoutEdge, LayoutNodeLabel, LayoutEdgeLabel>Returns an instance of LayoutData<TNode, TEdge, TNodeLabel, TEdgeLabel> that can be used to perform item-specific configurations for the RecursiveGroupLayout.
createLayoutData
(graph: LayoutGraph): RecursiveGroupLayoutData<LayoutNode, LayoutEdge, LayoutNodeLabel, LayoutEdgeLabel>Parameters
- graph: LayoutGraph
- the graph that determines the generic type arguments of the created layout data
Return Value
- RecursiveGroupLayoutData<LayoutNode, LayoutEdge, LayoutNodeLabel, LayoutEdgeLabel>
- an instance of layout data that can be used to perform item-specific configurations for the given RecursiveGroupLayout.
Returns an instance of LayoutData<TNode, TEdge, TNodeLabel, TEdgeLabel> that can be used to perform item-specific configurations for the RecursiveGroupLayout.
LayoutExecutor type is available at runtime.Parameters
- graph?: IGraph
- the graph that determines the generic type arguments of the created layout data
Return Value
- RecursiveGroupLayoutData<INode, IEdge, ILabel, ILabel>
- an instance of layout data that can be used to perform item-specific configurations for the given RecursiveGroupLayout.
Constants
A constant that represents a ILayoutAlgorithm implementation that does nothing.
See Also
A constant that represents a ILayoutAlgorithm implementation that does nothing.
See Also
A constant that represents a ILayoutAlgorithm implementation that delegates to the coreLayout.
This implementation can be assigned to group nodes to specify that they should not be handled recursively. In this case, the marked group node handled by this stage's coreLayout as is. The core layout must therefore be able to handle group nodes.
This constant is functionally equivalent to marking a group node with the value null or not marking it at all. It can be used to explicitly specify that the default behaviour is intended.