Release notes
yFiles for JavaFX

yFiles for JavaFX 3.6

The newest major release of yFiles for JavaFX is version 3.6 .
Below, find a list of all the new features and improvements, along with the incompatibility changes.

See the change log for a list of all changes of this and all other versions.

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.

All changes
Since version 3.5

Hide Description
Open in yEd LiveDownload
yFiles for JavaFX 3.6 Release Notes

New group node style

yFiles for JavaFX 3.6 Release Notes

New Cactus group layout

yFiles for JavaFX 3.6 Release Notes

New support for dendrogram style layout

This release brings exciting new major features, and many other minor new features, improvements, and bugfixes to all parts of the library. As always, there are new and improved demos demonstrating these features and improvements.

If you are updating from an older version of yFiles for JavaFX, have a look at the list of incompatible changes.

Major new features

New styles for graph items

The RectangleNodeStyle class is a new node style that uses a rectangular shape whose corners are either rounded or cut diagonally. Its properties specify which corners get rounded, the corner radius, its fill, and its border stroke.

The new GroupNodeStyle class is a node style primarily designed for collapsed and expanded group nodes. It draws a (rounded) rectangle with an optional tab or ribbon, and offers extensive configuration options for an optional icon, its various fills, and paddings. The new GroupNodeLabelModel is tailored to place labels in the tab or tab background of a GroupNodeStyle.

The new ArrowNodeStyle class draws a node as an arrow shape. The arrow can point in one of the four compass directions, and the arrow head slope, the shaft thickness, the fill, and the border stroke can be configured.

Similarly, the new ArrowEdgeStyle class draws an edge as an arrow shape. This style always points from the source port to the target port, ignoring bends, and can be configured in the same way as the node style.

The DefaultLabelStyle class now supports different common background shapes.

The ShapeNodeStyle class now supports three additional shapes: HEXAGON2 (a six-sided polygon with tips at top and bottom), STAR5_UP (a five-pointed star with one tip pointing upwards), and PILL (a stadium shape with the shorter sides rounded).

Its new property KeepingIntrinsicAspectRatioEnabled defines whether to keep the intrinsic aspect ratio of the shape.

The new BridgeEdgeStyle class renders an edge as a 3-segment bridge with a given height between the edge's source and target port locations. This is especially useful to distinguish parallel multi-edges between the same pair of nodes.

Wrap text to shape

The text wrapping feature of DefaultLabelStyle now wraps the text inside a given shape instead of just the rectangular label bounds. The TextWrappingShape enum provides the predefined shapes, and includes for example pill, ellipse, and hexagon. The new DefaultLabelStyle.TextWrappingPadding property defines the padding between the chosen shape and the text.

If the predefined shapes don't fit your needs, you can override the DefaultLabelStyleRenderer.getTextWrappingOutline method to return any custom convex path as GeneralPath instead.

Compact disk layout

The new CompactDiskLayout class arranges a graph on a disk, packing the nodes as dense as possible. This layout is mostly suitable for graphs with small components whose loosely connected nodes should be grouped and packed in a small area.

The associated new class CompactDiskLayoutData allows to specify custom data considered during the layout calculation.

Cactus group layout

The new CactusGroupLayout class offers an alternative representation of hierarchically nested data. It places the children of a group along the groups circular border, resembling the structure of a cactus.

The associated new class CactusGroupLayoutData allows to specify custom data considered during the layout calculation.

New Features

View

  • The new class PortLocationModelParameterSerializer provides static helper methods which can convert the built-in IPortLocationModelParameter implementations into key-value pairs. It also supports creating IPortLocationModelParameter instances from these key-value pairs.
  • Added the new property AspectRatio to the GeneralPathNodeStyle which defines the aspect ratio of the path.
  • The new property CanvasControl#MouseWheelZoomEventRecognizer can be used to set the modifier for distinguishing between mouse wheel scrolling and zooming.
  • The new class LabelModelParameterSerializer provides static helper methods which can convert the built-in ILabelModelParameter implementations into key-value pairs. It also supports creating ILabelModelParameter instances from these key-value pairs.
  • The methods getNodesRevealedAfterExpand, getEdgesChangedAfterExpand, and getEdgesChangedAfterCollapse have been added to FoldingManager. They can be used to retrieve information about folding states that would be used when a specified group node would be expanded or collapsed.

Interaction

  • Handles can now react to mouse clicks and touch tap events. The handleClick method has been added to the IHandle interface and is called when HandleInputMode#ClickedRecognizer or HandleInputMode#ClickedRecognizerTouch was triggered on a targeted handle. To customize the general handle click handling, the Clicked event can be listened to or the method HandleInputMode#handleClick can be overridden.

Hierarchic Layout

  • The HierarchicLayout class now supports so-called tabular group nodes. The children of such groups are arranged in a compact tabular fashion (i.e., like a single column table for layout orientation left-to-right). Property HierarchicLayoutData#TabularGroups allows to mark groups as "tabular" and property HierarchicLayoutData#TabularGroupChildComparators to specify a custom order for the children.

Organic Layout

  • The OrganicLayout class now offers the possibility to define a group substructure scope, see property GroupSubstructureScope. Group substructures that lie in the specified scope are treated as substructures in the layout process, i.e., the child nodes are arranged on a disk that is contained in the group node.
  • In addition, the new property ClusterAsGroupStructureAllowed allows to specify whether or not detected clusters (see property ClusteringPolicy) are taken into account as group substructures.
  • The OrganicLayout class now offers two new ChainSubstructureStyles called DISK and DISK_NESTED that lead to a compact disk-like layout for chains.
  • The OrganicLayout class now offers the possibility to define tree substructures (stars, chains, cycles and parallel structures are already supported). The OrganicLayout#TreeSubstructureStyle property specifies the style of tree substructures and the OrganicLayout#TreeSubstructureSize property specifies their minimum size (structures of smaller size are not handled as a tree substructure).

Balloon Layout

  • The BalloonLayout class now supports node types. The types influence the ordering of child nodes and the subtrees rooted at them such that nodes of the same type are preferably placed next to each other. Node types are weaker than a user-specified custom order defined via a comparison function. Types can be defined via the BalloonLayoutData#NodeTypes property.

Radial Layout

  • The RadialLayout now supports a new layering strategy that produces a circular dendrogram drawing.
  • The RadialLayout now supports two new edge routing styles, namely a radial polyline style and a curved style. The radial polyline style produces edge paths which consist of a series of straight and arc segments. The curved polyline style routes the edges as curved bezier paths. In the latter case, the edge paths can be also returned as control points that represent cubic bezier control points.
  • The RadialLayout now supports integrated node labeling i.e., the node labels are taken into consideration when determining the positions for the nodes of the graph and guarantees that labels will not overlap with other objects in the graph.

Circular Layout

  • The CircularLayout now supports integrated node labeling i.e., the node labels are taken into consideration when determining the positions for the nodes of the graph and guarantees that labels will not overlap with other objects in the graph.
  • The CircularLayout class now supports curved edge routing within and between circles.

Analysis

  • Added the new RankAssignment analysis algorithm class that solves the rank assignment problem on an acyclic graph using the simplex method.
  • The new analysis class Intersections finds intersections and overlaps between graph items, featuring flexible configuration options to find only specific intersections. The respective com.yworks.yfiles.layout.Intersections class provides the functionality also for the LayoutGraph API, but offers less convenience.

Improvements

General

  • The documentation about configuring the item visualization has been improved. All styles and their configuration options are now described in a Developer's Guide chapter.

View

  • GraphClipboard now respects the PasteDelta value when pasting items without owner (e.g. edges without selected source or target node).
  • ModelManager and its derived classes HighlightIndicatorManager, SelectionIndicatorManager, and FocusIndicatorManager now have install and uninstall methods for properly allocating and freeing resources when setting or removing a manager to a CanvasControl.
  • GraphModelManager: the properties NodeManager, EdgeManager, PortManager, EdgeLabelManager, NodeLabelManager, PortLabelManager, and ProvideUserObjectOnMainCanvasObject have been made public.

Interaction

  • Pinch-zooming with two fingers now works a lot more reliably when the frame rate is low due to complex and large graphs.
  • Touch move events are now guaranteed to be raised up to the location where a touch up event happens.
  • The MoveViewportInputMode#uninstall method is now virtual and can be overridden in derived classes.
  • Input modes now listen for the Touch2DLostCapture event of the associated control, so that this event can be correctly detected in the 'recognizer' properties of an input mode.
  • The behavior of the inertia during touch inputs has been improved.
  • A SizeConstraintProvider property was added to NodeReshapeHandleProvider and NodeReshapeHandlerHandle that is queried during node resize gestures if no explicit MinimumSize, MaximumSize or MinimumEnclosedArea is set.
  • The input modes don't perform hit tests upon auto-repeated key down events for modifier keys anymore.
  • The new MoveViewportInputMode#SinglePointerMovementAllowed property can be used to disable moving the viewport with a single touch pointer. Disabling this property is especially useful for apps that allow editing since then, other gestures like moving items or creating edges can be configured to start without a long press.
  • Cursor property changes of active input modes are now immediately reflected in the application's mouse cursor. Previously, the application mouse cursor might have been updated only after the next mouse event.
  • The new MoveInputMode#ValidBeginCursor property offers the possibility to use different cursors for signaling a valid position for beginning a move operation and actually moving items.
  • The ResizeStripeInputMode class now offers the possibility to customize the cursors for signaling a valid position for beginning a resize operation as well as actually resizing columns or rows.
  • The ResizeStripeInputMode class now offers properties to set an invalid end cursor for column and row resize. The invalid end cursor is shown during resize operations if the column or row in question cannot be resized to the current mouse position.
  • The properties ValidBeginRecognizer and ValidBeginCursor have been added to LassoSelectionInputMode, MarqueeSelectionInputMode, and MoveViewportInputMode. The ValidBeginRecognizer can be used to indicate whether the selection respectively move viewport gesture may begin in which case the ValidBeginCursor is used.
  • The property MouseHoverInputMode#ValidHoverLocationCursor has been added that is used when the ValidHoverLocationHitTestable returns true for a location.
  • The property ContextMenuInputMode#ValidMenuLocationCursor has been added that is used when the ValidMenuLocationHitTestable returns true for a location.
  • IReparentNodeHandler#isValidParent is now also called with null as new parent during the drag gesture if no real parent node has been tested for the location.
  • Keyboard navigation with NavigationInputMode now always considers the current item to navigate from, regardless of the value of the NavigableItems property.
  • The GraphClipboard now raises the events ElementsCutting, ElementsCopying, ElementsPasting, and ElementsDuplicating at the very beginning of the cut, copy, paste, and duplicate methods.
  • GraphEditorInputMode now raises the GroupingSelection and GroupedSelection events at the start and end of the groupSelection method. Similarly, the UngroupingSelection and UngroupedSelection events are raised at the start and end of ungroupSelection method.
  • The new CreateEdgeInputMode#SourceNodeDraggingCursor property offers the possibility to customize the cursor that is shown while the mouse is still over the source node after starting the edge creation.
  • Changes to ItemHoverInputMode's HoverCursor property now take effect immediately if the mouse pointer is currently hovering over an item.
  • The TextEditorInputMode now releases the mutex before dispatching the TextEdited event.

Styles

  • The Pen#DashStyle property is now marked as @Nonnull, since several internal usages assumed that to be the case anyway. In addition, the documentation of the DashStyle#Dashes property now clarifies that both an empty collection and null result in a solid Pen.
  • Added a new property KeepingAspectRatioEnabled to ImageNodeStyle and MemoryImageNodeStyle to support keeping the image's aspect ratio during resizes.
  • Nodes rendered with the ShapeNodeStyle now respect their actual outline shape when selected with the LassoSelectionInputMode.

GraphBuilder

  • GraphBuilder now offers simplified access to a node/edge that has been created with a given ID or data item or accessing the data a node/edge has been created for via the new methods getNodeById, getNodeForItem, getDataItem(INode), getEdgeById, getEdgeForItem, and getDataItem(IEdge).
  • TreeBuilder and AdjacencyGraphBuilder now offer simplified access to a node that has been created with a given ID or data item or accessing the data a node/edge has been created for via the new methods getNodeById, getNodeForItem, getDataItem(INode), and getDataItem(IEdge).

Hierarchic Layout

  • The HierarchicLayout class now allows to combine the SimplexNodePlacer#StraightenEdges and SimplexNodePlacer#BarycenterMode properties. Previously, edge straightening was not supported in barycenter mode.
  • The HierarchicLayout class generates more compact results for some cases with edges between nodes of the same layer and integrated edge labeling where previously unnecessarily large distances to the label and edge were kept.
  • The HierarchicLayout class now places nodes without any edges as far left as possible without violating any constraints. That way they do not disturb the layout for the connected part of the graph.
  • For input graphs with a PartitionGrid structure, the HierarchicLayout class now correctly considers the layering produced by the FromScratchLayerer if it is already compatible with the specified grid structure. Previously, for such cases, the algorithm may have calculated an entirely different layer assignment.
  • The HierarchicLayout class now considers the flow direction to place the ports of port groups when combined with direct group content edges.
  • The HierarchicLayout class comes with an improved support for subcomponent layouts (see HierarchicLayoutData#Subcomponents). Defining subcomponents now works by assigning instances of the new SubcomponentDescriptor class to nodes so that nodes mapped to the same descriptor instance form a component. Components that have inter-edges only to a single non-component node are now integrated directly at that node when using the new placement policies SubcomponentPlacementPolicy#AlwaysIntegrated or SubcomponentPlacementPolicy#Automatic (and if the orientation of the sub-layout permits it). The overall results for such cases feature better edge routing quality and more compact drawings.
  • The HierarchicLayout class now also considers layering constraints between elements of different grouping hierarchies if the recursive group layering is enabled (property HierarchicLayout#RecursiveGroupLayering). Previously, such constraints were ignored in that case.
  • The HierarchicLayout class now uses a more compact layer placement for graphs with edge labels between layers.
  • The HierarchicLayout class now requires fewer bends for some inputs with grouped edges and port constraints or port candidates.

Organic Layout

  • The OrganicLayout class now produces stable results for inputs with node labels and in deterministic mode, where it previously could generate a slightly different arrangement when applied twice with the same parameters.
  • The OrganicLayout class now allows to specify custom node clusters by setting the ClusteringPolicy property to ClusteringPolicy#USER_DEFINED. The custom cluster IDs have to be specified by means of the OrganicLayoutData#ClusterIds property.

Circular Layout

  • The CircularLayout class now supports node types (see CircularLayoutData#NodeTypes) also for the layout of the cycle partitions. Previously, the types had an influence only on the layout of a partition itself. If all nodes of a partition are of the same type, then the partition gets that type as well, so that partitions of same type are preferably placed next to each other.
  • The CircularLayout class has received a faster algorithm for calculating edge bundles.

Tree Layout

  • Root Alignment in GenericTreeLayout can also factor in the port position to straighten out an edge.
  • The TreeLayout class now also supports integrated edge labeling for configurations that use a LayeredNodePlacer.

Edge Router

  • The EdgeRouter class now produces better results for some setups with monotonic path restrictions and edges with vertically/horizontally overlapping endpoints.
  • The EdgeRouter class now tries to avoid routes that cross fixed external ports of other edges as well as fixed internal ports at group nodes of other edges. The new property PenaltySettings#PortCrossingPenalty allows to specify the cost of such crossings.
  • The EdgeRouter class now supports buses that include self-loops (see class BusDescriptor). Previously, self-loops were ignored.

Generic Labeling

  • The generic labeling algorithm has an additional preset to avoid overlaps of labels and the partition grid.

Layout

  • Improved the initialization time and memory consumption of layout animations.
  • The TemporaryGroupNodeInsertionStage class now automatically marks inserted group nodes with an IDataProvider registered to the input graph with the key INSERTED_GROUP_NODE_DPKEY.
  • The TemporaryGroupNodeInsertionStage class now also supports specifying hierarchically nested temporary groups. Therefore, the new TemporaryGroupDescriptor class has been added.

Analysis

  • The TraversalDirection enumeration used by the Neighborhood and Bfs algorithms has been extended. The enum value UNDIRECTED has been added that ignores the edge direction and corresponds semantically with the previous value BOTH. The semantic of BOTH has been adjusted to indeed return the union of the SUCCESSOR and the PREDECESSOR results. To keep the default behavior of the Neighborhood and Bfs algorithms, the default value of their TraversalDirection property has been changed from BOTH to UNDIRECTED.
  • The GraphStructureAnalyzer class now supports operating on a subset of the graph.
  • The new SubgraphNodes and SubgraphEdges properties on the Reachability class allow to define a subset of nodes/edges the algorithm should operate on.

Bugfixes

View

  • Combining HierarchicNestingPolicy#GROUP_NODES, LabelLayerPolicy#AT_OWNER and undo no longer throws a NullPointerException.
  • Viewport animations no longer suddenly stop when the zoom level is near CanvasControl#MinimumZoom or MaximumZoom.
  • Holding down a scrollbar button no longer scrolls beyond the scrollable area indicated by this scrollbar.
  • Changing the ICanvasObject#Group property no longer triggers unnecessary recreation of the visuals anymore.
  • Fixed a bug in SelectionIndicatorManager that didn't call removeSelection when an item was deselected.
  • Changing the GraphControl#GraphModelManager property no longer leaks memory in certain situations.
  • A tooltip which is displayed at a given location by calling the MouseHoverInputMode#show method is no longer immediately hidden after each mouse move. It now respects the MouseHoverSize property.
  • Calling IFoldingView#collapse on a normal (i.e. non-group) node no longer creates an UndoUnit or a view state (which included an unexpected call to IFolderNodeConverter#initializeFolderNode even though the result would have never been used). Now calling IFoldingView#collapse on a normal node does nothing.
  • The automatic flipping behavior of labels now also works with projections that distort the labels.
  • ViewportAnimations now are properly cleaned up on cancel.
  • GroupNodeStyle's associated INodeInsetsProvider now correctly calculates insets for 'small' nodes, i.e. nodes whose height (or width) is less than the style's TabHeight property.
  • Inertia in MoveViewportInputMode no longer stops working randomly.

Graph

  • Fixed a bug in FilteredGraphWrapper's NodeRemoved event where the provided old parent might have been present in the wrapped graph but not in the filtered graph.
  • The FilteredGraphWrapper class now raises the correct events when filtering out port labels. Previously, the events contained incorrect owner information.
  • EdgePathLabelModel's findBestParameter method now creates correct parameters for locations close to bends.
  • NinePositionsEdgeLabelModel center placements above and below the edge have been improved when the angle wasn't close to one of the two coordinate axes and the distance was non-zero. Previously, labels could seem to jump around when the path changed and weren't always close to the center of the path.
  • GroupNodeLabelModel no longer stretches tab labels and tab background labels into the collapse/expand icon of the corresponding GroupNodeStyle.
  • NavigationInputMode#ExpandGroup, EnterGroup, and the EXPAND_GROUP and ENTER_GROUP commands do not create empty undo units anymore if nothing has changed.
  • NavigationInputMode#ExitGroup and the EXIT_GROUP command now create undo units if the bounds of the exited group node were adjusted.
  • GroupingSupport's methods enlargeGroupNode and enlargeAllGroupNodes do not create empty undo units anymore if nothing has changed.
  • EdgePathLabelModel, EdgeSegmentLabelModel, and SmartEdgeLabelModel findBestParameter implementations now create correct parameters for label boxes that overlap the edge's source or target node.

Interaction

  • The HandleInputMode#handleIsHitTouch method now correctly uses the value of the CanvasControl#HitTestRadiusTouch property instead of the value of the CanvasControl#HitTestRadius property for its calculations. As a result, dragging handles during touch input should be much easier.
  • After pasting, a closed group node within another closed group now stays closed. Previously, it was open due to a bug in the GraphClipboard class.
  • The GraphEditorInputMode#AdjustContentRect method now only updates the CanvasControl#ContentRect property once per call. Previously there have been circumstances where the property would have been updated twice unnecessarily.
  • The TableEditorInputMode class no longer changes the GraphControl#Selection property unnecessarily when the GraphControl#Graph property is changed.
  • An instance of the HandleInputMode class is no longer canceled if a handle is removed during its own DragFinished call. This fixes some very rare exceptions under complicated circumstances.
  • Multiple DropInputMode instances now correctly consider their respective priorities.
  • UndoEngine no longer adds an empty undo unit for an aborted operation in certain rare cases.
  • Fixed an issue where changing the GraphControl#InputMode while the context menu is open would lead to a crash.
  • Fixed a bug in MoveViewportInputMode that caused the inertia feature to mistakenly start moving the viewport after the mouse or touch pointer has stopped before being released.
  • Starting a CanvasControl/GraphControl viewport animation now properly stops a running MoveViewportInputMode inertia animation.
  • The direction of the first edge segment during orthogonal edge creation is now correctly determined when the source port candidate lies on the node border.
  • SmartEdgeLabelModel now properly supports the original position snap line.

Styles

  • Cloning an ITable instance now properly clones all of the table's internal state. Previously, changing a cloned table's insets could result in the cloned table's stripes not updating their geometry.
  • TableNodeStyle now allows the table background style to access the table node's tag.
  • The built-in styles with rounded corners now have the correct outline shape for all calculations.
  • Edges with Bézier paths can now also be animated into non-Bézier paths.
  • Edge cropping now works as expected when using the BezierEdgeStyle class and the terminating nodes have styles that do not provide an outline in their IShapeGeometry implementation.
  • Fixed that customer CSS styling of labels breaks the preferred size calculation of the DefaultLabelStyle.
  • Setting the Pen of a ShapeNodeStyle or a GeneralPathNodeStyle to null now correctly clears the shape's stroke.
  • Fixed a bug in GeneralPathNodeStyle where setting the Pen to null on an already rendered node resulted in a NullPointerException during redraw.
  • ShapeNodeStyleRenderer now always uses the protected getPaint and getPen methods for all shapes instead of falling back to the respective style properties for some shapes.
  • IconLabelStyle's updateVisual implementation now properly updates if the style's Icon instance is changed.
  • DefaultLabelStyle now adds ellipsis more reliably at the end when the text does not fit into the specified text wrapping shape.

GraphML

  • The key parameter of AbstractInputHandler#setValue method is now annotated correctly as nullable. The key may be null when the model item used as key is created after its data has been parsed.
  • Fixed GraphML serialization and deserialization for certain configurations of GeneralPathNodeStyle, HtmlLabelStyle, and ShapeNodeStyle.
  • Fixed GraphML serialization and deserialization for certain configurations of GroupNodeStyle and RectangleNodeStyle.
  • Fixed an issue in GraphMLIOHandler's WriteEvents where the DataWriting event has been dispatched after the writing process instead of before.

GraphBuilder

  • Label bindings which don't provide label data (or null) no longer add empty labels. Instead, no label will be added.
  • Fixed a potential memory leak in AdjacencyGraphBuilder. Some internal references were not cleaned up after items have been removed during updateGraph.
  • Fixed a bug in GraphBuilder where updating an existing edge whose (new) source or target nodes cannot be resolved did not remove the edge from the graph.
  • Fixed a potential memory leak in GraphBuilder, AdjacencyGraphBuilder, and TreeBuilder. Some internal map entries for labels were not discarded after their owner nodes or edges were removed.

Table

  • Fixed a bug in StretchStripeLabelModel that was causing incorrect handling of insets.

Hierarchic Layout

  • The SimplexNodePlacer class used by the HierarchicLayout no longer throws an error due to an internal overflow for very wide layouts.
  • The HierarchicLayout class now correctly considers the specified halos of group nodes when there is a partition grid defined.
  • The HierarchicLayout class no longer generates broken non-orthogonal edge segments of same-layer edges for some cases in conjunction with integrated edge labeling and edge labels placed at the ports.
  • The HierarchicLayout class now properly satisfies PortCandidates defined for same-layer edges at nodes where other edges with (rather large) source/target port labels additionally exist.
  • The HierarchicLayout class now produces a correct edge grouping structure for short edges having the same source and target group ID.
  • The HierarchicLayout class no longer throws an exception when the edge-directedness feature (HierarchicLayoutData#EdgeDirectedness) is used in conjunction with enabled back-loop routing (HierarchicLayout#BackLoopRouting).
  • The HierarchicLayout class no longer creates unnecessary spacing between sub-components (see HierarchicLayoutData#SubComponents) and other elements. This previously happened in some cases due to edge/node labels being present. In consequence, these cases are now more compact.
  • The HierarchicLayout class no longer produces overlaps between (large) external node labels and unrelated edges.
  • The HierarchicLayout class no longer produces overlaps between sub-component elements (see HierarchicLayoutData#SubComponents) and edges that are not part of the component.
  • The HierarchicLayout class now correctly assigns ports to edges incident to groups if the uniform port assignment is enabled (see property HierarchicLayoutData#UniformPortAssignmentGroups) for some cases where it previously did not yield a uniform port distribution.
  • The HierarchicLayout now correctly considers the PreferredPlacementDescriptor settings of an edge label when there are additionally edge groupings defined. Previously, it could, for example, happen that the edge label was placed on the wrong side of the edge.
  • The HierarchicLayout class now adheres more closely to its maximum duration and its AbortHandler.
  • The HierarchicLayout class now considers the PortCandidate directions correctly for layout orientations other than TopToBottom. This also improves the optimization results with PortCandidateSets that allow multiple directions to connect to nodes.
  • For input graphs with a PartitionGrid structure, the HierarchicLayout class now correctly considers the layering produced by the FromScratchLayerer if it is already compatible with the specified grid structure.
  • The HierarchicLayout class no longer throws an exception for some invalid specifications of alternative group bounds in incremental layout mode.
  • The results of the DefaultLayerSequencer class are now deterministic by default, since it no longer aborts the calculation after 10s. For this, its MaximumDuration value is now unrestricted.

Organic Layout

  • The OrganicLayout class no longer produces broken routes of self-loops at group nodes if the Scope is not equal to ALL.
  • The OrganicLayout class now correctly considers the specified PartitionGrid if substructure detection is enabled. Previously, the grid cell assignment of nodes belonging to a substructure has been ignored.
  • The OrganicLayout class now correctly considers fix-contents and fix-bounds groups (see enum GroupNodeMode) if the substructure detection is enabled.
  • The OrganicLayout class now correctly detects chain substructures if there are nodes of different types (OrganicLayoutData#NodeTypes).
  • The OrganicLayout class now satisfies property OrganicLayout#DeterministicModeEnabled for more cases when the maximum duration is restricted. Note, however, that non-deterministic behavior is still possible when restricting the duration.
  • The OrganicLayout class no longer produces violations of the specified minimum node distance for separated radial substructures (see property StarSubstructureStyle#SEPARATED_RADIAL).

Clear Area Layout

  • The ClearAreaLayout class no longer produces results where the specified area is not cleared for some input graphs when property ClearAreaStrategy is set to PRESERVE_SHAPES or PRESERVE_SHAPES_UNIFORM.
  • The ClearAreaLayout class now correctly considers the initial partition grid assignment of nodes.

Orthogonal Layout

  • The OrthogonalLayout class no longer produces bad edge routes where the path is non-orthogonal and does not connect to the source node anymore for some rare cases containing parallel edges or chain substructures.
  • The OrthogonalLayout class now correctly considers the specified minimum group node sizes (see GroupingKeys#MINIMUM_NODE_SIZE_DPKEY). Previously, the minimum sizes were always enlarged by the groups' insets (see GroupingKeys#GROUP_NODE_INSETS_DPKEY). Actually, the minimum size should include the insets.
  • The OrthogonalLayout class now correctly handles input graphs with parallel edges if the ParallelRoutesPreferenceEnabled property is enabled. Previously, such inputs have caused exceptions in some rare cases.
  • The OrthogonalLayout class no longer generates overlaps between edge segments (of a parallel edge) and edge labels of other edges for some rare scenarios.

Edge Router

  • The EdgeRouter class now correctly interprets specified intermediate points (EdgeLayoutDescriptor#IntermediateRoutingPoints) as well as bus points (BusDescriptor#BusPoints) in the case when the algorithm runs inside an orientation layout with an orientation other than TopToBottom.
  • The EdgeRouter class now correctly considers the maximum duration and the AbortHandler when the octilinear routing style is chosen. Previously, it could happen that the algorithm kept on running even though the time was up.
  • The EdgeRouter class no longer throws an exception for some rare cases with collinear bends.
  • The EdgeRouter class now correctly handles direct content edges that are incident to group nodes with PortCandidateSets.
  • The EdgeRouter class no longer produces bad layout results for some scenarios with grouped edges and multiple PortCandidates. Previously, the algorithm selected any of them without considering the alternative options.

Generic Labeling

  • The GenericLabeling class no longer produces superfluous label overlaps if one of its RemoveNodeOverlaps or RemoveEdgeOverlaps properties is enabled.
  • The GenericLabeling class no longer produces bad label placements for edges with direct group content routing, i.e., edges that connect a group node with one of its descendants and are routed directly without leaving the group.

Circular Layout

  • A circular layout with LayoutStyle#BCC_ISOLATED can no longer get into an infinite loop for inputs where a component consists only of articulation points.

Single Cycle Layout

  • The SingleCycleLayout class no longer produces violations of the specified minimum node distance.

Layout

  • TableLayoutConfigurator now considers the correct OriginalPositions of the RowDescriptors and ColumnDescriptors when table insets are used.
  • The TableLayoutConfigurator class now treats tables without rows or columns as tables with exactly one row and column instead of throwing an exception.
  • The PolylineLayoutStage class now correctly considers a registered AbortHandler instance so that it is possible to terminate early. Previously, the stage ignored the AbortHandler.
  • The TabularLayout class now always uses the correct bounding box values for node labels that are considered. Previously, wrong label bounds could lead to unnecessarily large rows or columns.
  • The IsolatedGroupComponentLayout class no longer produces unnecessarily large group nodes if the specified GridSpacing is zero.

Incompatible Changes

API

  • Due to the new install and uninstall methods of the ModelManager class, the following of its members have been changed:
    • The CanvasControl constructor parameter has been removed. Instead, you can call the new install method with the CanvasControl as parameter. Similarly, the CanvasControl constructor parameters of the derived classes have been removed, too.
    • Its existing protected methods install and uninstall have been renamed to installItem and uninstallItem.
    • Its protected methods add and remove have been renamed to addItem and removeItem.
  • The optional SelectionModel and Model parameters of HighlightIndicatorManager and SelectionIndicatorManager have been removed from the constructors, too. Instead, you can set the corresponding properties directly.
  • The NavigationInputMode#adjustGroupNodeLocation method has now an additional parameter expandedSize that specifies the size of the group node when it is expanded.
  • The LabelCreator#addLabel method can return null if no label is added.
  • The LabelCreator#updateLabel method now returns a boolean value: true if the label has been updated, false if the label should be removed.
  • The IHandle interface has a new method handleClick. This method must be implemented by custom handle implementations.
  • The DataProviderAdapter#defined method has been removed since it had no effect.
  • The GraphModelManager#ProvideUserObjectOnMainCanvasObject property has been renamed to ProvidingUserObjectOnMainCanvasObjectEnabled.
  • The NodeLabelingPolicy enum has been moved from com.yworks.yfiles.layout.tree to com.yworks.yfiles.layout. The reason is that the policy is now not only supported by BalloonLayout but also by CircularLayout, RadialLayout and CactusGroupLayout.
  • The type of the EdgeCellInfo#CellSegmentInfos property has been changed from YList to CellSegmentInfo[].
  • The HierarchicLayoutData#SubComponents property is replaced by the new HierarchicLayoutData#Subcomponents property with a different signature. The new property uses instances of the new SubcomponentDescriptor class to define subcomponents, and the layout algorithm responsible for a component is now specified via the new SubcomponentDescriptor#LayoutAlgorithm property.
  • Similarly, the data provider keys HierarchicLayout#SUB_COMPONENT_ID_DPKEY and HierarchicLayout#SUB_COMPONENT_LAYOUT_ALGORITHM_DPKEY are replaced by the new key HierarchicLayout#SUBCOMPONENT_DESCRIPTOR_ID_DPKEY that assigns instances of the new SubcomponentDescriptor class to nodes.
  • The TemporaryGroupNodeInsertionData#Components property is replaced by the new TemporaryGroups property of type TemporaryGroupDescriptor, which now specifies groups and the applied recursive group layout algorithm.
  • Similarly, the data provider key TemporaryGroupNodeInsertionStage#COMPONENT_LAYOUT_ALGORITHM_DPKEY was removed and the name of the key TemporaryGroupNodeInsertionStage#COMPONENT_ID_DPKEY was changed to TEMPORARY_GROUP_DESCRIPTOR_DPKEY.
  • The Pen#DashStyle property is now marked as @Nonnull, since several internal usages assumed that to be the case anyway.
  • Changes of Default Behavior

    • The semantic of the TraversalDirection#BOTH enumeration value used by the Neighborhood and Bfs algorithms has been changed and does not ignore the direction anymore, but now returns a union of the SUCCESSOR and the PREDECESSOR results instead. The old behavior can be restored by using the new TraversalDirection#UNDIRECTED enum value. Consequently, the default value of the TraversalDirection property of both the Neighborhood and the Bfs algorithm has been changed from BOTH to UNDIRECTED.
    • With the graph builder classes, label bindings which don't provide label data (or provide null) no longer add empty labels. Instead, no label will be added. Similarly, for label sources, no label will be added for data items for which the LabelCreator#TextProvider returns null.
    • When starting to drag the handle of a selected item, the handle isn't replaced anymore by a new handle instance provided for the selected item. Previously, this happened automatically, regardless of whether necessary to support use cases where state changes should result in a different handle instance. Now, the GraphEditorInputMode#requeryHandles method has to be called explicitly when changes are made that affect handles that are potentially already visible. Alternatively, a proxy implementation can be used that dynamically dispatches to new instances on its own when required.
    • The HandleInputMode class doesn't initialize a handle drag as soon as the handle is pressed, anymore. Instead, it waits until the DraggedRecognizer or DraggedRecognizerTouch is triggered. When pressed, the mutex is already acquired, which discards other concurrent input modes. This can be turned off by setting the RequestMutexOnPress property to false.
    • The lists returned by the GraphPartition#getCells, DynamicObstacleDecomposition#getCells and DynamicObstacleDecomposition#getObstacles methods are no longer unmodifiable.
    • ResizeStripeInputMode now always uses the N_RESIZE cursor for resizing rows and the W_RESIZE cursor for resizing columns instead of using N_RESIZE, S_RESIZE, W_RESIZE or E_RESIZE depending on the dragged side. The old behavior was inconsistent when dragging the border between two stripes and had no visual difference on most platforms. New cursor properties have been added that can be used to set a custom cursor for different usecases.
    • The value of the DefaultLayerSequencer#MaximumDuration property is now unrestricted. Previously, it was restricted to 10 seconds. It is used by the HierarchicLayout class, which still adheres to its own maximum duration.

    Deprecations

    • The BevelNodeStyle, ShinyPlateNodeStyle, and PanelNodeStyle classes and their renderers are now deprecated. Their appearance is rather outdated, and some of them are not very configurable. For group nodes, have a look at the new GroupNodeStyle class.

    New Demos

    • The Group Node Style Demo shows the new GroupNodeStyle in different configurations.
    • The Arrow Node Style Demo shows the new ArrowNodeStyle and its setting options.
    • The Rectangle Node Style Demo shows the new RectangleNodeStyle and its setting options.
    • The Shape Node Style Demo shows the shapes that are available for the ShapeNodeStyle.
    • The Default Label Style Demo shows the background shapes that are now available for the DefaultLabelStyle.
    • The Text Wrapping Demo shows the various options of the new text wrapping feature for labels.

    Why, how, what? —
    Just ask the diagramming experts!

    Our team is happy to advise you – no strings attached. Let's talk about your project and find the perfect solution for your needs!

    E-mail: hello@yworks.com

    The data you enter will only be used to contact you regarding your request.
    Learn more in our privacy policy.