yFiles for JavaFX Release Notes

yFiles for JavaFX version 3.3 is the newest major release available. (See also the entire yFiles for JavaFX change log.)

Technical Requirements

  • Oracle JDK 1.8 (8u40) or higher is needed for software development with yFiles for JavaFX.
  • Oracle JRE 1.8 (8u40) or higher is needed to execute programs using yFiles for JavaFX.
  • A browser to view the HTML documentation.

yFiles for JavaFX 3.3 - Changes Since 3.2.0.2

Hide Description
Open in yEd LiveDownload
yFiles for JavaFX 3.3 Release Notes
New support for bus-like arrangement in HierarchicLayout
yFiles for JavaFX 3.3 Release Notes
New integrated edge label placement in EdgeRouter class
yFiles for JavaFX 3.3 Release Notes
New support for orthogonal bus routing and port grouping of edges at source and/or target node in EdgeRouter class

Major New Features

  • A large number of code examples has been added to the API Documentation.
  • The HierarchicLayout class is now able to arrange children of a specific root node in a compact bus-like way. These bus substructures are defined by the HierarchicLayoutData#Buses property, and the new BusDescriptor class provides more individual settings for the buses.
  • The EdgeRouter class now features integrated edge label placement. Labels are automatically placed when the new property IntegratedEdgeLabelingEnabled is enabled. The placement considers the optional PreferredPlacementDescriptor of a label.
  • The EdgeRouter class now supports port grouping of edges at their source and target. To specify the port group IDs, see the associated properties in the PolylineEdgeRouterData class.
  • The EdgeRouter class now supports orthogonal bus routing. The new BusDescriptor class specifies the settings for a single bus.
  • The powerful analysis algorithms got a new API that is based on the IGraph interface and streamlines working with the results. In particular, it makes working with a special analysis graph class obsolete. The algorithms that are available with the new API include centrality measures, clustering, flow calculation, rank assignment, spanning tree, shortest path, and more. This is accompanied by the new GraphStructureAnalyzer class that provides methods to check structural properties of a given graph.

New Features

Layout

  • The HierarchicLayout class is now able to consider individual costs for crossing a group node border. These costs are defined with the HierarchicLayoutData#GroupBorderCrossingCosts property.
  • The HierarchicLayout class is now able to consider individual crossing costs for edges. They can be defined with the HierarchicLayoutData#EdgeCrossingCosts property.
  • The new callback method DefaultLayerSequencer#getCrossingCost allows for defining an individual crossing cost value for a specific pair of edges when using the said sequencer implementation for the HierarchicLayout algorithm.
  • In order to easily retrieve the original edge instance when customizing the hierarchic layout algorithm, the HierarchicLayout#getOriginalEdge method was added.
  • The HierarchicLayout class is now able to uniformly distribute ports at group nodes - with a few restrictions. The new property HierarchicLayoutData#UniformPortAssignmentGroups. defines the groups for which the feature should be enabled.
  • The OrganicLayout class is now able to produce 3D layout results.
  • The OrganicLayout class is now able to consider user-specified inertia and stress values for nodes.
  • The new property InteractiveOrganicLayout#CompactnessFactor specifies the compactness of the result. If the graph contains several components, this feature can prevent that the components drift apart.
  • The LeftRightNodePlacer class now supports layouts with multiple branches. With this feature, subtrees can not only be placed left/right of a single vertical bus, but left/right of multiple vertical buses (the branches). The new property BranchCount allows to configure the number of branches.
  • The tree node placer GridNodePlacer offers the following new features:
    • The placement of the bus for routes to its children can now be configured using the new enumeration BusPlacement. Available placements are LEADING, TRAILING and CENTER.
    • Child sub-trees can be assigned to rows automatically using the new property GridNodePlacer#AutomaticRowAssignmentEnabled.
    • The new alignment policy GridNodePlacer#BUS_ALIGNED aligns the root node with the bus.
  • The OrthogonalLayout class is now able to consider custom crossing and bend costs for edges. They can be specified using the new properties OrthogonalLayoutData#EdgeCrossingCosts and OrthogonalLayoutData#EdgeBendCosts respectively.
  • The new class GivenCoordinatesStage changes node locations and edge paths to user-specified values before invoking the core layout algorithm. To specify locations and paths, use the new GivenCoordinatesStageData class.
  • The new GenericPartitionGridStage class offers generic support for partition grid structures.

Viewer

  • The GraphEditorInputMode class provides the new methods raiseSelection, lowerSelection, selectionToFront and selectionToBack that change the z-order of all selected IModelItems.
  • The GraphModelManager class has the new methods raise, lower, toFront and toBack that allow for changing the z-order of IModelItems. All these z-order-related methods can also be triggered by the new commands RAISE, LOWER, TO_FRONT and TO_BACK.
  • CreateEdgeInputMode can now create edges in reversed direction, i.e. starting from target port.
    • The new EdgeDirectionPolicy supports starting creation at source, target, in the last direction, or depending on the port candidate.
    • A configurable ToggleDirectionRecognizer allows for changing the edge direction during creation.
  • The method CreateEdgeInputMode#doStartEdgeCreation that is used to programmatically start an interactive edge creation gesture now returns a Future with the newly created edge as result.
  • The method MoveInputMode#doStartDrag that is used to programmatically start an interactive drag gesture now returns a Future with the affected items as result.
  • The new property MoveLabelInputMode#MovingUnselectedLabelsAllowed enables moving labels without having to select them first.

New Demos

  • The GraphAnalysisDemo shows how to use the new interfaces for the graph analysis algorithms and how to visualize their results.
  • The CssDemo shows how to customize the visualizations of yFiles for JavaFX with the help of CSS.
  • The LogicGateDemo shows how yFiles can be used for the visualization of a digital system consisted of logic gates.
  • The Neo4jDemo shows how to integrate a Neo4j graph data base in your application.

Improvements

Algorithms

  • The new GraphStructureAnalyzer class provides methods to check structural properties of a given graph.

Layout

  • Added convenience overloads for ItemCollection and ItemMapping property setters to LayoutData classes with properties of type ItemCollection or ItemMapping. E.g. hierarchicLayoutData#getEdgeLayoutDescriptors().setConstant(newDescriptor) can now be abbreviated to hierarchicLayoutData#setEdgeLayoutDescriptors(newDescriptor).
  • The HierarchicLayout class now correctly calculates the group node bounds. Previously, the groups' insets were slightly too large (up to one pixel).
  • The HierarchicLayout class now always places a port in the middle of a node side, if it is the only port on that side. Previously the port was only centered if the label was additionally placed on the edge.
  • The HierarchicLayout class now also considers critical edge priorities for grouped edges.
  • The HierarchicLayout class now requires less memory for graphs with sequence constraints.
  • The HierarchicLayout class now uses the specified layer alignment (see NodeLayoutDescriptor#LayerAlignment) to align sub-components (see HierarchicLayoutData#SubComponents).
  • The HierarchicLayout class no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges.
  • With HierarchicLayout, the number of edges crossing through group nodes without starting or ending in them when using the default algorithm settings was reduced. Furthermore, the behavior can be customized using the new group node border crossing costs (see property HierarchicLayoutData#GroupBorderCrossingCosts).
  • The HierarchicLayout class now also considers sequence constraints for grouped edges.
  • The layering of HierarchicLayout was improved with respect to the resulting edge lengths if the recursive group layering is enabled.
  • The HierarchicLayout class now produces less overlapping elements for graphs with fixed coordinate hints.
  • The new property OrthogonalLayout#ParallelRoutesPreferenceEnabled allows for controlling how parallel edges (multi-edges) are routed.
  • The RecursiveGroupLayout class now allows to define a local PartitionGrid structure for each recursively handled group node. See the new property RecursiveGroupLayoutData#GroupNodePartitionGrids for details.
  • The EdgeRouter class now generates less edge-edge overlaps and a better distribution of edge segments when the EdgeRouter#MaximumDuration is strongly restricted or set to zero, or when the algorithm is stopped via the AbortHandler#stop method.
  • The EdgeRouter class now avoids superfluous bends that were in some cases caused by group nodes with (small) inset values.
  • The path search performance of the EdgeRouter class has been improved for cases where an edge has a strong, external PortConstraint or a fixed, external PortCandidate.
  • The EdgeRouter now supports edge grouping on both endpoints. Previously, an edge could only be part of either a source or a target group.
  • The EdgeRouter class now generates a proper routing from a group node border to a port location inside this group node defined by a strong PortConstraint or a fixed PortCandidate. Previously, the route was only calculated to the border and then the last segment was extended without consideration of obstacles and other elements.
  • The performance of the GenericLabeling algorithm and the quality of the label placements were improved.
  • The quality of edge label placement of the GenericLabeling class was improved in case that there are multiple labels with a source or target preference near the same node. They may now be placed further away but avoid undesired overlaps.
  • The PortCalculator class now considers edge label positions such that they are not affected by whether this stage is applied or not. Previously, label positions could be changed if the label position was stored relative to the first/last segment or the port.
  • If the master edge is clipped on the bounds of its source or target, the ParallelEdgeRouter class now always clips the associated parallel edges on that bounds, too.
  • The RemoveCollinearBendsStage.Scale property now also allows zero and negative numbers as its value. This makes it possible to internally round coordinates to full integer values for the comparison of bend points and, thus, the stage can be made more fuzzy.
  • The TreeReductionStage now marks non-tree edges if an IDataAcceptor is registered with the input graph with key TreeReductionStage#NonTreeEdgeSelectionKey. This way a user is able to query which edges the algorithm determined to be the non-tree edges.
  • New options on class PlaceNodesAtBarycenterStage allow for specifying the size of affected nodes, considering the grouping structure when calculating the barycenter of nodes as well as removing the bends of edges incident to affected nodes.
  • The properties Rows and Columns of class PartitionGrid are now of type IEnumerable<RowDescriptor> and IEnumerable<ColumnDescriptor> instead of an un-typed YList.
  • The PartitionGridData class has new properties RowOrderOptimizationEnabled and ColumnOrderOptimizationEnabled to indicate whether or not the order of the rows respectively columns should be chosen automatically to minimize edge lengths.
  • The new ChannelRoutingTool class brings back the features of the ChannelRouter class that was removed in version 3.0.
  • Combining multiple LayoutData classes is now easier:
    • The base class LayoutData offers a new method combineWith that combines the current instance with another LayoutData instance.
    • The class CompositeLayoutData has an additional constructor that takes a variable number of LayoutData instances.
  • The new properties AbortHandler, SourcePortConstraints, TargetPortConstraints, SourcePortCandidates, and TargetPortCandidates of ChannelEdgeRouterData facilitate using these features with ChannelEdgeRouter.
  • The RowIndices and ColumnIndices properties of the PartitionGridData class can now also be used in combination with the Grid property.
  • The ImprovingPortAssignment boolean property of LayoutExecutor and LayoutGraphAdapter was replaced by the PortAdjustmentPolicy property that offers more options how port locations should be adjusted after a layout calculation.

Viewer

  • The parameter of the scroll command, that can be used to specify an additional scroll factor, can now be any numeric value of type Number.
  • CanvasControl: Added zoomToAnimated overloads which take an optional event listener that is notified of the animation's end.
  • IMapperRegistry#createDelegateMapper has been renamed to createFunctionMapper.
  • The property ItemMapping#Delegate has been renamed to Function.
  • The property ContextItemMapping#ContextDelegate has been renamed to ContextBiFunction.
  • The property ItemCollection#Delegate has been renamed to Predicate.
  • The default methods toList and toArray have been added to IEnumerable.
  • HandleInputMode now clears the AffectedItems after the Canceled event has been raised instead of before.
  • DefaultEdgePathCropper's methods cropEdgePath and cropEdgePathAtArrow are no longer final.
  • The viewport animation of the LayoutExecutor class considers now the value of the LimitingFitContentZoomEnabled property of the corresponding GraphControl.
  • NodeStylePortStyleAdapter and TemplatePortStyle now have an Offset property that allows to shift the port visualization so that it no longer is centered over the port.
  • The GraphModelManager class has new factory methods for creating the ItemModelManager of each item group.
  • The GraphModelManager#getModelItem method now always returns the IModelItem for an ICanvasObject retrieved for it via getMainCanvasObject. Previously this only worked in all cases for the ICanvasObject retrieved via getCanvasObject.
  • Mouse move and drag events now correctly report the changed modifier keys.
  • Reduced number of cases where a new label was created by interactive editing instead of editing an existing one.
  • The methods addLabel, createLabel and editLabel of GraphEditorInputMode and TableEditorInputMode that are used to start the respective interactive label editing gesture programmatically return now a Future with the edited or newly created label as result.
  • GraphEditorInputMode provides new protected methods createLabelCore and editLabelCore to allow for overriding the default implementations.
  • GraphEditorInputMode provides a TextEditorInputModeConfigurator to allow for configuring the TextEditorInputMode before each label editing.
  • The GraphEditorInputMode#DeletedItem event provides now context information about the state before the item has been deleted. For example, if a label has been deleted you now can get its old owner.
  • The method GraphEditorInputMode#onDeletedItem is no longer final.
  • Added the GraphClipboard#getId method to facilitate retrieving the original item from which an item to be pasted has been copied from.
  • The new property GraphClipboard#ClipboardContext provides access to the current IGraphClipboardContext during a clipboard operation.
  • The new property CreateEdgeInputMode#ShowingTargetHighlightEnabled specifies whether to enable or disable highlighting of potential targets for edge creation. Also, the method updateTargetHighlight has been added to allow for further customization of the highlight.
  • NavigationInputMode: Added a property ScrollingToSelectionEnabled that controls whether a node that is focused or selected with a keyboard gesture is automatically scrolled into the viewport if necessary.
  • The new properties PortRelocationHandle#ShowingTargetHighlightEnabled and PortRelocationHandleProvider#ShowingTargetHighlightEnabled specify whether to enable or disable highlighting of potential targets for edge creation. Also, the method updateHighlight has been added to the PortRelocationHandle class to allow for further customization of the highlight.
  • The new properties PortRelocationHandle#ShowingPortCandidatesEnabled and PortRelocationHandleProvider#ShowingPortCandidatesEnabled specify whether to enable or disable showing port candidates during edge relocation.
  • The new PortStyleDecorationInstaller class allows the use of an IPortStyle to render the selection, highlight, or focus indicator of ports.
  • The properties RectangleIndicatorInstaller#Template and OrientedRectangleIndicatorInstaller#Template now return always the value that has been set by client code and are not modified by internal code anymore.
  • Snaplines are now infinitely long by default.
  • The performance of EdgePathLabelModel#getGeometry and EdgeSegmentLabelModel#getGeometry has been strongly increased.
  • The GraphMLIOHandler class now supports reading and writing arbitrary objects at graph level.
  • GraphML deserialization now supports the symbolic names "Zero" and "Infinite" for reading SizeD values.
  • GraphML deserialization now supports the symbolic name "Infinite" for reading RectD values.
  • GraphML deserialization now supports the symbolic name "Origin" for reading PointD values.
  • The type of property GraphBuilder#EdgeLabelProvider was generalized from Function<TEdge,String> to Function<TEdge,Object>.

Bugfixes

Algorithms

  • The Paths#findAllChains method now correctly calculates the chains of input graphs with cycles.
  • The GraphChecker#isMultipleEdgeFree method now returns the correct result for input graphs with self-loops.
  • The Bfs#getLayers method now correctly stores the layer indices in the specified INodeMap. Previously, the maximum layer index stored in the map exceeded the number of returned layers.

Layout

  • The EdgeRouter class no longer produces bad, non-orthogonal edge segments in cases where a selected edge is grouped together with an un-selected edge and where both edges have strong PortConstraints at their common source/target node.
  • The PortPlacementStage class no longer destroys the grouping information for the core layout algorithm.
  • The EdgeRouter class now correctly considers strong port constraints of edges that belong to a bus structure.
  • The HierarchicLayout class no longer throws an exception if the component arrangement policy is set to ComponentArrangementPolicy#COMPACT and bus routing is enabled (see property HierarchicLayoutData#Buses).
  • The OrganicLayout class now correctly considers input graphs where substructure handling is enabled and all nodes are located at coordinate (0,0). Previously, such inputs may have triggered an ArgumentException.
  • Class EdgeRouter no longer throws an exception if all fixed edges of a bus are non orthogonal/octilinear.
  • The GenericLabeling class no longer throws an ArgumentException for some input graphs containing labeled edges with zero length.
  • The HierarchicLayout class no longer throws an exception if it is wrapped by an instance of RecursiveGroupLayout and the input graph contains layering constraints between elements of different groups.
  • The HierarchicLayout class now correctly considers the group insets for input graphs with nested group nodes. Previously, it sometimes produced too large insets for inner groups.
  • The HierarchicLayout class no longer throws an IllegalArgumentException for some rare cases in incremental layout mode.
  • The HierarchicLayout class now produces shorter, more direct edge routes for edges connecting at a group node and leaving on the the left/right group side. This only affects cases where the relevant group node also contains direct-content edges (see EdgeLayoutDescriptor#DirectGroupContentEdgeRoutingEnabled).
  • Self-loop segments generated by the HierarchicLayout class are now shorter and take up less space if possible. Previously, segments were sometimes unnecessarily long even though the minimum length settings allowed shorter segments.
  • The HierarchicLayout class now produces less superfluous crossings if there are same-layer edges with PortConstraints or PortCandidates.
  • The HierarchicLayout class now correctly handles port labels with zero height/width. Previously, such labels may have caused very large distances between some nodes.
  • The HierarchicLayout class sometimes threw an IllegalArgumentException for input graphs that contained incremental elements in combination with groups.
  • The HierarchicLayout class sometimes threw an IllegalArgumentException for input graphs that contained fixed elements in combination with both swimlanes and groups.
  • The HierarchicLayout class now places sloped segments of grouped octilinear edges such that they are perfectly overlapping each other. Previously, it could happen that segments were slightly displaced with respect to each other.
  • The HierarchicLayout class no longer causes non-orthogonal segments when the input contained port labels in conjunction with edge grouping.
  • The HierarchicLayout class now correctly considers fixed nodes with layering constraints. In previous versions there were some rare cases where such inputs caused infinite looping issues.
  • The HierarchicLayout class no longer produces intersections between edges and elements of a sub-component (see HierarchicLayoutData#SubComponents). Note that this fix may sometimes cause less compact results within a layer.
  • Improved the path search performance of the EdgeRouter class for cases where a large number of fixed and overlapping edge segments exist. Previously, the search could become very slow in such scenarios.
  • The EdgeRouter class now correctly groups edges associated with equal group IDs that have a different object ID.
  • The EdgeRouter class now avoids unnecessary bends in cases that contain PortCandidates with fixed offsets (or strong PortConstraints) where the fixed port locations have a very similar x- or y-coordinate such that the path must consist of three segments with a single, very short middle segment. Previously, five segments in total were generated.
  • A rare exception that was triggered by the EdgeRouter class during routing when a Grid is defined on which edges need to be routed is now fixed.
  • The EdgeRouter class now correctly handles edges with external ports. Previously, such inputs may have caused an exception.
  • The EdgeRouter class now correctly routes direct content edges with strong port constraints at the group nodes. Previously, the algorithm sometimes produced weird routes for such edges.
  • Fixed a bug in the EdgeRouter class that sometimes caused a non-deterministic behavior.
  • Fixed two issues in the EdgeRouter class that resulted in the violation of a PortCandidate with fixed offsets or a strong PortConstraint. The first was only triggered for constraints at the target side and only when the target node was additionally partly or fully covered by other obstacles (e.g. node labels). The second issue appeared in cases with the source and target node fully overlapping (e.g. an edge from a group to a child node).
  • The EdgeRouter class no longer throws an exception if its PolylineRoutingEnabled property is enabled and the input contains fixed, grouped edges.
  • The EdgeRouter class now considers the correct NodeHalo associated with the target node when handling the minimum last segment length setting. Previously it incorrectly considered the halo of the source node which could lead to unnecessarily long or too short last segments.
  • The EdgeRouter class now correctly considers intersections between edges and labels of fixed edges if property EdgeLabelConsiderationEnabled is enabled.
  • The EdgeRouter class no longer throws an exception during routing in cases where the source or target node is covered by obstacles (i.e. by other nodes or labels).
  • The EdgeRouter class now correctly considers intermediate routing points when using the polyline routing style (EdgeRouter#PolylineRoutingEnabled). Previously, it could happen that intermediate points were not part of the final polyline edge path.
  • The EdgeRouter class no longer throws an exception during the routing of some graphs with grouped edges.
  • The EdgeRouter class no longer considers all PortCandidates with multiple directions as fixed PortCandidates.
  • The EdgeRouter class now correctly handles cases where the maximum duration is exceeded and where previously an exception was triggered.
  • Fixed a StackOverflowError in EdgeRouter.
  • The OrganicLayout class no longer throws an exception when using CycleSubstructureStyle#CIRCULAR and arranging a cycle structure where at least one cycle node is also connected to a group node outside the cycle.
  • The OrganicLayout class now produces deterministic results for group nodes if its property DeterministicModeEnabled is enabled.
  • The OrthogonalLayout class no longer causes an exception for some input graphs when property FaceMaximizationEnabled is enabled.
  • The OrthogonalLayout class no longer runs into an infinite loop for some input graphs that are tree structures with mixed edge directedness (see property OrthogonalLayout#EdgeDirectednessDpKey). Note that the problem only occurred if property OrthogonalLayout#TreeStyle is not set to TreeLayoutStyle#NONE.
  • The OrthogonalLayout class no longer throws an exception when its property UniformPortAssignmentEnabled is enabled and the input contains parallel edges.
  • When using RecursiveGroupLayout, the values of the properties ComputedWidth, ComputedHeight and ComputedPosition of the classes ColumnDescriptor and RowDescriptor are now correctly set after the layout if EdgeRouter is the corresponding InterEdgeRouter.
  • The CompactNodePlacer class no longer throws an exception for input graphs with specified memento strategies (see TreeLayoutData#CompactNodePlacerStrategyMementos or CompactNodePlacer#STRATEGY_MEMENTO_DPKEY).
  • The CompactNodePlacer class now correctly considers the specified values of the VerticalDistance and HorizontalDistance properties.
  • The CompactNodePlacer class no longer throws an exception for some inputs with specified strategy memento information (either via property TreeLayoutData#CompactNodePlacerStrategyMementos or with a mapper registered with key CompactNodePlacer#STRATEGY_MEMENTO_DPKEY).
  • The SimpleNodePlacer class no longer produces very long horizontal edge segments for inputs where it isn't required.
  • The GenericLabeling class now correctly places labels of direct content edges (edges that directly connect a group node with a descendant, without leaving the group) with a free edge label model.
  • The GenericLabeling class no longer calculates wrong label profit values (AbstractLabeling#getProfit) for some edge labels. Previously, edges that had a PreferredPlacementDescriptor were sometimes affected.
  • The GenericLabeling class now produces valid results for edge labels that have a preferred distance to the edge (PreferredPlacementDescriptor#DistanceToEdge) and at the same time multiple SideOfEdge preferences (e.g. left of edge and on the edge). Previously, the algorithm sometimes violated the preferred distance even though it would have been possible to keep it.
  • The GenericLabeling class now always prefers LabelCandidates with higher profit values over others with lower profit (see AbstractLabeling#getProfit). Previously, this sometimes happened even though both candidates did not intersect with other elements.
  • The GenericLabeling class does no longer assume that all LabelCandidates associated to a label have the same size. Previously, this caused unexpected labeling results if custom candidates with different sizes were given.
  • Fixed a rare bug in the GenericLabeling that may have caused an IllegalArgumentException for some input graphs that contain edges with zero length segments and labels associated with a free edge label model.
  • The SeriesParallelLayout class now correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception.
  • The PartialLayout class now correctly considers the specified PortCandidates during orthogonal or octilinear routing of edges.
  • The PartialLayout class does no longer reduce the size of fixed group nodes if the option PartialLayout#ResizeFixedGroups is disabled.
  • The ComponentLayout class now correctly handles input graphs with user-specified components that contain nodes with null as their component ID (see property ComponentLayoutData#ComponentIds). Previously, such inputs may have caused an exception.
  • The PolylineLayoutStage does no longer generate overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes).
  • The OrganicRemoveOverlapsStage no longer produces infinite loops in some rare cases.
  • Fixed a bug in YGraphAdapter that could trigger a NullPointerException when boolean, integer or double values were requested from registered IMapper but no value had been set beforehand.

Viewer

  • Fixed a bug in GraphEditorInputMode where changing the value of ShowHandleItems while handles were already displayed resulted in duplicate handles.
  • Fixed a bug in EdgePathLabelModel which could return an invalid geometry for parameters with a ratio < 0 and zero length edge segments.
  • A bug in CanvasComponent#fitContent has been fixed that sometimes resulted in a short flickering.
  • Mapper: Fixed default value handling for the null key.
  • Mapper: Ensured that mappings for the null key are taking into account by method getEntries.
  • GeneralPath#flatten(): Fixed unexpected behavior if a curve follows after a close operation.
  • Zooming the viewport during interaction no longer synthesizes mouse-move events in the wrong locations.
  • Labels at folder nodes and their adjacent edges are no longer lost during GraphML deserialization if the DefaultFolderNodeConverter#CopyFirstLabel property is enabled.
  • Fixed a bug in PortRelocationHandleProvider where the settings ShowPortCandidates and ShowTargetHighlight were ignored.
  • Fixed a bug in CreateEdgeInputMode#getPortOwner which could return edges even if EdgeToEdgeConnectionsAllowed was set to false. This could result in the edge's IPortCandidateProvider being queried for candidates erroneously.
  • Fixed a bug in the graph implementation that sometimes lead to a runtime that was quadratic in the number of nodes when creating large graphs.
  • Reparenting an expanded group node into a collapsed group node no longer throws an exception.
  • Fixed an exception which could occur in CanvasControl's method compareRenderOrder and when using GraphModelManager's Comparator property.
  • GraphClipboard's methods onElementCut and onElementCopied are no longer called for graph items which are not copied themselves but are owners of copied items.
  • When an edge is duplicated using GraphClipboard and a port is newly created during this operation, the new port now gets the old port's style and tag.
  • Fixed a memory leak in the UndoEngine class if the tokens returned by getToken were not disposed when the UndoEngine got cleared.
  • The CreateEdgeInputMode class now considers the value of the CanvasControl#HitTestRadius property when its StartingOverCandidateOnlyEnabled property is enabled.
  • The visualization of source port candidates by the CreateEdgeInputMode class does not flicker, anymore.
  • With SmartEdgeLabelModel, it was impossible to move a label from the left side of an edge to the right side. Instead, the label stopped at the edge.
  • The null check for the GridVisualCreator#Pen property works correctly now.
  • The type IGridConstraintProvider cannot be used in lookup methods since it has a generic type parameter. Therefore, new specific interfaces have been added for each item type (for example INodeGridConstraintProvider).
  • The EdgeStyleDecorationInstaller class no longer causes an exception when used on edges that are attached to other edges.
  • Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an exception.
  • In rare cases, saving a graph with folding to GraphML threw an exception.

Incompatible Changes

Layout

  • The ImprovingPortAssignment boolean property of LayoutExecutor and LayoutGraphAdapter has been replaced by the PortAdjustmentPolicy property.
  • SingleItemCollection's Item property has been pulled up to ItemCollection. Class SingleItemCollection has been removed, its usages have been replaced by ItemCollection.
  • The property HierarchicLayoutData#AlternativeEdgePath has been renamed to HierarchicLayoutData#AlternativeEdgePaths.
  • The property HierarchicLayoutData#AlternativeEdgePaths now expects Iterable<IPoint> instead of YPointPath as mapped values.
  • The property HierarchicLayoutData#AlternativeGroupBounds now expects IRectangle instead of YRectangle as mapped values.
  • The type of the properties BalloonLayoutData#TreeRoot and TreeLayoutData#TreeRoot has been changed to SingleItem<INode>.
  • The property TreeLayoutData#LeftRightPlacersLeftNodes has been renamed to TreeLayoutData#LeftRightNodePlacerLeftNodes.
  • The property TreeLayoutData#DelegatingNodePlacersPrimaryNodes has been renamed to TreeLayoutData#DelegatingNodePlacerPrimaryNodes.
  • The properties SourceGroups and TargetGroups of RadialLayoutData have been removed since edge grouping is not supported by the RadialLayout class.
  • The properties Rows and Columns of class PartitionGrid are now of type IEnumerable<RowDescriptor> and IEnumerable<ColumnDescriptor> instead of an un-typed YList.
  • The PenaltySettings#InvalidEdgeGroupingPenalty property has been removed. If edge groups are defined, the EdgeRouter class now always considers them. Therefore, this setting no longer applies.
  • The following changes regarding the expert API related to the EdgeRouter class were made:
    • The first parameter of the constructors in class AbstractSegmentInfo is now of type Object instead of Edge. The provided type should be either PathRequest for affected edges or Edge for non-affected, fixed ones. Furthermore, the property AbstractSegmentInfo#Edge has been removed as the info is not necessarily associated with an edge anymore.
    • Simialrly, the first parameter of the constructor in class EdgeCellInfo is now of type Object instead of Edge. The provided type should be either PathRequest for affected edges or Edge for non-affected, fixed ones.
    • The constructor of class EdgeInfo now additionally takes a parameter of type Edge.
    • The parameter of type Edge from the constructor of Path as well as the respective property were removed. A path is now not necessarily associated with an edge but only with the newly introduced PathRequest.
    • The method PathSearchResult#getEdgeInfo(Path) was removed.

Viewer

  • IMapperRegistry#createDelegateMapper has been renamed to createFunctionMapper.
  • The property ItemMapping#Delegate has been renamed to Function.
  • The property ContextItemMapping#ContextDelegate has been renamed to ContextBiFunction.
  • The property ItemCollection#Delegate has been renamed to Predicate.
  • GraphClipboard's methods onElementCut and onElementCopied are no longer called for graph items which are not copied themselves but are owners of copied items. As a consequence, the methods cut and copy of the IClipboardHelper implementations of these elements are no longer called, either.
  • The classes GeneralPath and GeneralPath.PathCursor are now final.

Changes of Default Behavior

Layout

  • Renamed property PartialLayout#ResizeFixedGroups to FixedGroupResizingEnabled.
  • The HierarchicLayout class now uses a higher crossing cost for group node borders. To specify custom values, use the property HierarchicLayoutData#GroupBorderCrossingCosts.
  • The GroupingSupport class no longer throws an IllegalArgumentException if there is a node without associated ID (see GroupingKeys#NODE_ID_DPKEY). Instead the class uses the node itself as ID.
  • The SimplexNodePlacer#BarycenterMode property is now enabled by default. Thus, the HierarchicLayout class with default settings now produces different (usually more symmetric) layouts.
  • The default value of the property GridNodePlacer#RootAlignment was changed to GridNodePlacer#BUS_ALIGNED from AbstractRotatableNodePlacer#RootAlignment#TRAILING.
  • If the master edge is clipped on the bounds of its source or target, the ParallelEdgeRouter class now always clips the associated parallel edges on that bounds, too.

Viewer

  • The following places now throw a ConcurrentModificationException instead of an IllegalStateException:
    • FilteredGraphWrapper: Changing graph items while iterating those using the IListEnumerable returned by FilteredGraphWrapper#getNodes, FilteredGraphWrapper#getEdges, FilteredGraphWrapper#getLabels or FilteredGraphWrapper#getPorts.
    • FilteredGraphWrapper: Changing the edges at a port or node while iterating those edges using the IListEnumerable returned by edgesAt.
    • GeneralPath: Changing the path's structure while iterating the path using a PathCursor returned by GeneralPath#createCursor.
  • The default tooltip in the class ToolTipQueryEventArgs is now set to null. Thus, the tooltip is not displayed when the event is handled without setting the tooltip content.
  • The properties RectangleIndicatorInstaller#Template and OrientedRectangleIndicatorInstaller#Template now return always the value that has been set by client code and are not modified by internal code anymore.