yFiles.NET (WinForms)
Changelog

yFiles.NET 6.0

This version brings a major overhaul of many parts of the API, resulting in a lot of incompatible changes. We have designed many functions to be simpler, more intuitive and more consistent and removed technical debt.

In addition, this release contains numerous new features, improvements, and bug fixes to all parts of the library.

For a tour of this release's highlights, have a look at the article about yFiles.NET 6.0.

If you are updating from an older version of yFiles.NET, have a look at the list of incompatible changes and at the more detailed description in the Migration Guide.

Major new Feature: Support for Touch and Stylus Input

yFiles.NET now supports touch and stylus devices.

Touch input is now available across all built-in input modes. Numerous new properties enable full customization of input modes for mouse, stylus, and touch interactions.

The new versatile Pointer events replace the previous Mouse2D events. Pointer events support mouse, touch, and stylus inputs, providing generic properties such as event type (e.g., Up or Down) and location, as well as specific details like stylus pressure and touch size.

New Features, Improvements, and Bug Fixes

Categories: General Graph Controls Rendering Selection, Focus, Highlight Styles Interaction Label Editing Snapping Clipboard Folding View-Layout-Bridge Layout Hierarchical Layout Tree Layout Orthogonal Layout Edge Router Labeling Organic Layout Radial Tree Layout Series-parallel Layout Partial Layout Tabular Layout Component Layout Algorithms Analysis Geometry

General

New Features and Improvements

  • The yFiles library now consists of one single assembly.
  • All uses of the IListEnumerable<T> interface have been replaced by the IReadOnlyList<T> interface. This means that standard collections such as List<T> can now be used there. Accordingly, the ListEnumerableExtensions and ListEnumerable<T> classes have been removed.
  • The lookup API has been restructured. In particular, the LookupDecorator class is now easier to use, but most use cases are covered without having to access the low-level lookup architecture.
  • The assemblies now are strong-named as factory default.
  • The new LicenseConfig class offers a way to set the yFiles license data in code (as opposed to having to embed a resource file in the application).

Graph

New Features and Improvements

  • CompositeLabelModel now cannot only combine label models but also individual label model parameters or a mix of both kinds. Furthermore, it supports assigning a profit value to a parameter or model that can be used when placing labels during an automatic layout.
  • The new CompositeLabelModel.AddParameter method wraps a given parameter of one of the composed label models.
  • The new IGraph.GetEdgesBetween method returns all edges between two ports or port owners.
  • The methods of IGraph now check consistently whether given geometric arguments are neither infinite nor NaN.
  • The rotation direction of OrientedRectangle, NodeLabel, EdgeLabel and FreeEdgeLabelModel is now clockwise to be consistent with the other models.
  • The default placement for new edge labels is now on the middle of the edge path instead of on the first edge segment.
  • The label models ExteriorLabelModel, InteriorLabelModel, and InteriorStretchLabelModel have been renamed to ExteriorNodeLabelModel, InteriorNodeLabelModel, and StretchNodeLabelModel, respectively, to make it clear that only nodes are supported as label owner for these models.
  • The implementations of ILabelModelParameter and IPortLocationModelParameter used by the ILabelModel and IPortLocationModel classes are now public and provide all properties necessary to recreate them on the models. Consequently, the static LabelModelParameterSerializer and PortLocationModelParameterSerializer classes, which could be used to retrieve those properties and recreate the parameter, have been removed.
  • The ILabelModel parameter of the ILabelModelParameterFinder.FindBestParameter and ILabelModelParameterProvider.GetParameters methods has been removed as it was only very rarely required.
  • The GraphCopier API has been enhanced to offer improved clarity and functionality.
    • The GraphCopier has been optimized since its support for the GraphClipboard has been removed.
    • The GraphCopier.Copy method now uses an IEnumerable of items to define the subset to copy.
  • The SimpleNode, SimpleEdge, SimpleBend, SimpleLabel, and SimplePort classes now provide a convenience LookupDecorator instance through the GetDecorator method.
  • The ILabelModel.CreateDefaultParameter method and most of its implementations have been removed as it was often unclear what β€œdefault” meant. Most label models already had a corresponding Create*Parameter method. For the remaining models, the GroupNodeLabelModel.CreateTabParameter method and the FreeNodeLabelModel.Center and FreePortLabelModel.Center fields have been added.
  • The structural properties on graph items now are never null. This affects IEdge.SourcePort, IEdge.TargetPort, ILabel.Owner, IPort.Owner, and IBend.Owner.
  • The IGraph.GroupNodes method now has optional parameters that specify the Style and Tag of the newly created group.
  • The static parameter fields of FreeNodePortLocationModel have been renamed analogue to the static parameter fields in InteriorNodeLabelModel.
  • FilteredGraphWrapper now supports changing the node and edge predicates after creation.
  • The PropertyChanged event on the UndoEngine class is now also emitted if the token is changed.

Bug Fixes

  • Fixed ILabelOwner.Labels.Contains and IPortOwner.Ports.Contains implementations. Previously, these methods returned true for all labels/ports in the owner's graph instead of only for labels/ports belonging to the owner.
  • Fixed a bug in EdgeSegmentLabelModel and EdgePathLabelModel which caused a gap in supported positions close to the source and target node.
  • Fixed EdgeSegmentLabelModel and SmartEdgeLabelModel label placement at source and target nodes when using indices less than 0 or greater than the number of bends in the edge.
  • The EdgeSegmentLabelModel class now calculates valid label locations for selfloop paths with one port at the side of the node.
  • The EdgeSegmentLabelModel class now calculates valid label locations for paths with duplicate bends, i.e., paths in which two or more consecutive bends have the same location.
  • GraphClipboard's ParentNodeDetection now can use ParentNodeDetectionModes.None as fallback if no valid parent is found for modes ParentNodeDetectionModes.Selection or ParentNodeDetectionModes.PreviousParent.

Controls

New Features and Improvements

  • yFiles now offers theming. Therefore, a new Theme class has been added.
    • The new class provides the following properties to determine the overall visual appearance:
    • * PrimaryBrush, SecondaryBrush, and BackgroundBrush which determine the color of vaious decorations like selection decoration or handles.
    • * Scale: which determines the size if handles and port candidates.
    • * IndicatorOffset and HandleOffset: which determines an offset for decorations to their decorated elements.
    • * Variant: which determines some aspects of the overall appearance, e.g. whether handles should be drawn as circles or squares.
    • The theme can be set for a CanvasControl or GraphControl using the Theme property.
  • CanvasControl and GraphControl now have a new scroll bar design, as well as new behavior if either HorizontalScrollBarPolicy or VerticalScrollBarPolicy is set to AsNeeded. The new style is similar to system scrollbars in many operating systems, overlays the content and gets out of the way when not needed or interacted with. If this behavior is wanted when customizing the control template, the new DynamicScrollBar class can be used.
  • ViewportLimiter now also works with isometric projections and offers options to use the CanvasControl.ContentBounds for the limiting. It now offers the possibility to specify margins in the view coordinate system around the specified bounds, and bounds can be given as a list of convex polygon points. CanvasControl now also notifies the viewport limiter when the size of the ContentBounds or the size of the CanvasControl changes.
  • The new CanvasControl.HorizontalScrollEventRecognizer property allows customizing switching from vertical to horizontal scrolling.
  • The ICanvasContext.CanvasControl property (and consequently IRenderContext and IInputModeContext) is now guaranteed to have a non-null value.
  • All predefined EventRecognizer constants can now be found in the same class, EventRecognizers, which improves discoverability. In addition, their names now follow the platform conventions, i.e. they are formulated in the present tense and use the same wording as corresponding input events.
    Similarly, the events on CanvasControl which are related to input devices now have the same consistent names.
  • The CanvasControl.ContentRect property is now named ContentBounds to make its purpose more clear. The UpdateContentRect method has been renamed likewise.
  • It is now possible to have more than one BridgeManager. This allows you to have different types of bridges on different types of edges.
  • GraphControl now uses GraphViewerInputMode as the default InputMode for basic graph exploration.

Bug Fixes

  • Fixed an issue where a sequential animation would break when the preferred duration was set to zero.
  • Fixed GraphOverviewControl rendering issues with HighDPI displays in conjunction with display scaling.
  • Changing CanvasControl.Zoom property value no longer changes the viewport center, if the control's Projection and Scale are set to non-default values.

Rendering

New Features and Improvements

  • The new ObjectRendererBase class allows conveniently implementing the IObjectRenderer interface.
  • New classes formalize the data passed as RenderTag to implementations of IObjectRenderer.
    • The new PortCandidateRenderTag class will be passed as render tag for port candidates.
    • The new MarqueeRenderTag class will be passed as render tag for the marquee rectangle renderer of the MarqueeSelectionInputMode class.
    • The new LassoRenderTag class will be passed as render tag for the lasso path renderer of the LassoSelectionInputMode class. The new LassoPathState enum defines the current state of the lasso selection path in this class.
    • The new LabelCandidateRenderTag class will be passed as render tag to the label candidate renderer of the LabelPositionHandler.
  • The new VoidObjectRenderer.Instance constant provides a singleton renderer that renders nothing.
  • Added properties IntermediateToWorldTransform and ViewToWorldTransform to IRenderContext.
  • Hatch brushes are scaled on high-resolution displays.

Selection, Focus, Highlight

New Features and Improvements

  • The new Domain property on the HighlightIndicatorManager class matches the Domain property on the SelectionIndicatorManager class and allows automatic removal of highlights no longer present in the domain.
  • FocusIndicatorManager supports a new policy that will only show the keyboard focus indicator, when the user is actually using the keyboard to manipulate the focus.

Styles

New Features and Improvements

  • New styles that are based on the composition design pattern make it easier to combine existing styles into a single item visualization. These styles are available for all graph items via the CompositeNodeStyle, CompositeEdgeStyle, CompositeLabelStyle, and CompositePortStyle classes.
  • Similarly, new styles that are based on the delegation design pattern make it easier to implement custom styles that extend an existing style. For this, derive your style implementation from the DelegatingNodeStyle, DelegatingEdgeStyle, DelegatingLabelStyle, or DelegatingPortStyle class.
  • The new ShapePortStyle class displays ports as geometric shapes and supports the same shapes as the ShapeNodeStyle class.
  • The Arrow class now supports more types and features. In particular:
    • There are three new shapes that are similar to what is available in common drawing apps: ArrowType.Chevron, ArrowType.Deltoid, and ArrowType.Kite.
    • The width and height can now be scaled independently from each other.
    • An arrow can now specify whether the end of the edge the arrow belongs to should be cropped at the port or at the boundary of the port's owner. This alleviates the need to use PortDecorator.EdgePathCropper for this.
  • The new PathEdgeStyleBase class simplifies using a complex GeneralPath as the edge path of a style. Subclasses only have to create the path while the style already handles the visualization, including placing arrows and bridges. Several callback methods can be overridden to customize the behavior.
  • The ShapeNodeStyle class now supports more shapes, namely Pentagon, OctagonStanding, TrianglePointingLeft, and TrianglePointingRight. These shapes are also available as TextWrappingShape.
  • Node shapes that are stars or arbitrary polygons are now easy to implement with new factory methods of the GeneralPathNodeStyle class.
  • LabelStyle now trims text (and shows ellipsis) when text wrapping and text trimming is used with rectangle shapes. Previously, DefaultLabelStyle used Forms' native support for trimming and wrapping for rectangle shapes which could lead to clipped text.
  • LabelStyle now trims large text at words, with an ellipsis by default.
  • LabelSTyle now only includes entire lines in its bounds by default.
  • The IconLabelStyle now has a default icon size of 24x24 instead of empty, such that the icon is always visible.
  • The new GetLassoTestable method of the interfaces INodeStyleRenderer, IEdgeStyleRenderer, ILabelStyleRenderer, and IPortStyleRenderer is similar to the existing GetMarqueeTestable method, so marquee and lasso selection do no longer differ in the ways the testable is retrieved.
  • The CollapsibleNodeStyleDecorator class positions and styles the button now closer to what GroupNodeStyle does to achieve a more modern look.
  • Group nodes and nodes with GroupNodeStyle now have more useful default port candidates. Either four candidates, one in each cardinal direction, for group nodes with GroupNodeStyle. Or a single central port for folder nodes with a GroupNodeStyle.
  • ShapeNodeStyle now considers the pen thickness when rendering rectangle, round rectangle and ellipse shapes, i.e. the pen is rendered half inside and half outside the node bounds, like for the other shapes.

Bug Fixes

  • The intersection calculation for RectangleNodeStyle has been corrected for some previously failing edge cases that resulted in edges ending in mid-air or disappearing.
  • The selection, highlighting and focus visualization of edges using BridgeEdgeStyle or ArcEdgeStyle no longer disappears too early if the edge path is only partially in the viewport.
  • The following node styles now consider the pen thickness in the visibility test: ShapeNodeStyle, ArrowNodeStyle, GeneralPathNodeStyle, GroupNodeStyle, and RectangleNodeStyle.
  • LabelStyle's GetPreferredSize now correctly calculates the preferred height for label text consisting of multiple lines of text when some kind of text trimming is used. Previously, the more lines of text there were, the higher the chance was for some lines being cut off, because the calculated height was to small.

Interaction

New Features and Improvements

  • The MoveInputMode class now also handles moving labels, thus the MoveLabelInputMode has been removed.
  • The new PointerLongPress event is available for all pointer input types and replaces the previous touch-specific long press API.
  • The new PointerLongRest event is raised when the pointer stays still for a configurable amount of time during a move or drag gesture.
  • All events of an IInputMode which report creation of, changes to, or deletion of model items now have arguments of type InputModeItemEventArgs or InputModeItemChangedEventArgs. This type provides the affected item and the IInputModeContext for the involved input mode.
  • The keys to modify the gestures of various input modes have been adjusted to better match those of other often used applications:
    • To temporarily disable snapping during edge creation, moving, or resizing items, the Alt key can now be pressed instead of the Ctrl key.
    • When resizing a node using its reshape handles, the Ctrl key instead of the Alt key can be pressed to keep the center of the reshaped node.
    • To reparent a node to another parent during a drag gesture, the Ctrl key has to be pressed instead of the Shift key.
  • Elements can now be moved without selecting them first.
  • The new CreateEdgeInputMode.MinimumSelfLoopBendCount property allows for specifying the number of bends an edge must at least have before it can be created as selfloop.
  • The new CreateEdgeInputMode.ShowStartPortCandidateDelay property allows for specifying a delay after which start port candidates are displayed when the user hovers over a start port candidate owner.
  • The new GraphEditorInputMode.MovableUnselectedItems property allows for defining items which can be moved without selecting them first. The MovableUnselectedItemsPredicate property can be used for closer specification.
  • The CanvasControl's event system is now based on the PointerEvent API instead of mouse and touch events. This enables to support stylus devices and allows for handling different input devices in a more uniform way.
  • The new CreateEdgeInputMode.EdgeDirectionReversed event and the new CreateEdgeInputMode.OnEdgeDirectionReversed method are triggered when the direction of the edge creation changed during edge creation.
  • The event ItemsCopied on GraphViewerInputMode and the events ItemsCopied, ItemsCut, ItemsPasted, ItemsDuplicated, and DeletedSelection on GraphEditorInputMode now use ItemsEventArgs providing the items that are the subjects of the events.
  • The new GraphEditorInputMode.SetNodeLocation method uses the IPositionHandler of a node to change its location, and this way also adjusts the attached orthogonal edges and the position of child nodes if the given node is a group node.
  • Reconnecting edges to other nodes is now allowed per default.
  • The IHitTester interface has been changed to support faster hit testing. The generic type has been removed. Instead, a GraphItemTypes parameter has been added that is used to reduce hit tests to the specified item types.
  • The new HandleType.Void enum value makes a handle invisible and excludes it from hit testing.
  • The new GraphEditorInputMode.CreationSelectableItems property allows you to specify GraphItemTypes which should be selected after creation.
  • Moving items interactively now supports constraining the move gesture to an octilinear direction. This constraint is used when pressing the Shift key while dragging the items.
  • Marquee and lasso selection have been enhanced to support multiple selection policies. While the default gestures replaces the selection, pressing the Ctrl , Shift , or Alt modifier during the gestures extends, subtracts or toggles the current selection with the elements in the marquee or lasse area.
  • Edge creation now supports constraining the current edge segment to use an octilinear direction. This constraint is used when pressing the Shift key while dragging the pointer.
  • The PointerEventArgs.Handled property has been added that can be used to set and detect if another listener already handled the event.
  • A SnapResult.Pen property has been added that can be used to suggest a custom pen to the SnapResult.ObjectRenderer.
  • The IncreaseZoom and DecreaseZoom commands now also support Point and PointF as parameter.
  • Renamed GraphEditorInputMode HandleClickHandler method to HandleClickListener to match the name of the IClickListener interface.
  • If a Wheel event is handled by code, the default behavior (zoom/scroll) will be cancelled.
  • Commands handled by yFiles.NET can now be executed on a GraphControl using corresponding constants from the Command enum. GraphControl provides methods such as ExecuteCommand and CanExecuteCommand, along with the CanExecuteCommandChanged event, for this purpose. This presents an additional execution pathway while retaining the ability to use the original commands as usual.
  • KeyboardInputMode's methods AddCommandBinding, AddRecognizerBinding, and AddKeyBinding now return a token which can be used to remove that binding.
  • The IInputMode API has been updated for clarity: the InputMode property has been removed from the interface. Instead, most implementations now offer the protected ParentInputModeContext property to clearly indicate its role as the input mode's parent context. Most input modes can create a context which can be passed to dependents via the protected CreateInputModeContext method. The created context has the input mode set as the parent input mode. The new InputModeContext class may be used by implementations to conveniently create new contexts.
  • When using the GraphViewerInputMode, the viewport can now be moved by either dragging with the left or middle mouse button.
  • When using the GraphEditorInputMode, the viewport can now be moved by either dragging with the middle mouse button or by dragging with the left mouse button when pressing the Ctrl or Space key.
  • Several default keyboard shortcuts have been adjusted to more widely used ones:
    • Ctrl+0 or Alt+0 sets the zoom to 100%.
    • Alt+1 fits the content in the view.
    • Alt+2 brings the selection into the view.
    • Alt+3 brings the current item into the view.
    • Ctrl+Plus increases the zoom value.
    • Ctrl+Minus decreases the zoom value.
    • Alt+Left collapses a selected group node.
    • Alt+Right expands a selected folder node.
    • Alt+Up exits the current folder node.
    • Alt+Down enters the current folder node.
    • Alt+Shift+Left or Alt+Shift+Right toggles the expansion state of a selected group or folder node.
  • The new Command.ZoomToSelection zooms to the bounding box around all selected items. It can be triggered by the keyboard short cut Alt+2.
  • Lowered the MoveViewportInputMode.Priority to 105 to make viewport panning with CTRL or SPACE modifiers easier in dense graphs.
  • The new DropInputMode.AcceptDrag method is called on DragEntered events and determines if the mode will handle subsequent drag and drop events. Previously, this was the responsibility of the DropInputMode.AdjustEffect method . Now, AdjustEffect only changes the drag/drop effect of the given event args as its name implies.
  • Edge creation can now be cancelled by ending the gesture over the source node.
  • Edge creation is canceled if the GraphControl loses the focus.
  • GraphViewerInputMode's and GraphEditorInputMode's ClickHitTestOrder now reflects the z-Order of the elements. By enabling SkipHitLabels (the default) elements behind labels can still be prioritized over the labels.
  • LabelDropInputMode now consults the IEditLabelHelper of possible drop targets when dragging and dropping labels.
  • Command handling has been improved: The previous ICommand, inspired by WPF's commands, has been replaced with an enumeration of primary input gestures called Command. GraphControl now manages the execution of commands:
    • GraphControl.ExecuteCommand runs the specified command with an optional parameter.
    • GraphControl.CanExecuteCommand indicates whether the specified command can be executed.
    • The CanExecuteCommandChanged event is triggered when the executable state of a command has changed.
  • OverviewInputMode now uses the CanvasControl's MouseWheelZoomEventRecognizer to determine if the used performed a zoom gesture.
  • GraphEditorInputMode now allows for starting label editing just by starting to type. The AllowEditLabelOnTyping property can be used to configure this setting, which is turned on, by default.
  • The default gesture for label editing has been updated to also trigger when the user hits the `Enter` key.
  • The ClickInputMode.Clicked event is now raised also for double-clicks and multi-clicks. Clicking multiple times in the same location increments the ClickEventArgs.ClickCount by one for each click.
  • The HandleIsHit and GetClosestHitHandle methods of HandleInputMode now have an additional parameter which specifies the PointerType of the related user gesture.
  • MoveViewportInputMode now gracefully handles concurrent programmatic viewport modifications.
  • Starting edge-creation from a child node inside a group node now does not immediately snap to the parent when moving over the group nodes content. Instead, it only snaps to the closest port when hovering the tab or stroke.
  • The sub-input modes of GraphViewerInputMode and GraphEditorInputMode can now be replaced while the input mode is installed.
  • The new GraphViewerInputMode.HitTester property works in the same way as the GraphEditorInputMode.HitTester property.
  • The GraphEditorInputMode.DuplicateSelection method now also dispatches MultiSelectionStarted and MultiSelectionFinished events.
  • NavigationInputMode now interprets the direction of arrow keys in view coordinates by default. Previously the default settings could lead to surprising behavior when combined with a Projection on GraphControl.
  • The GraphInputMode.FindItems method now considers the actual z-order of the hit items.
  • The GraphInputMode.ItemClicked event and the cyclic selection now consider the actual z-order of the hit items at the cursor location. Bends and invisible ports are now properly taken into account and hit before their owners.
  • The rendering order of visuals created by an InputMode now corresponds to the input mode's Priority. In other words, visualizations of input modes with a smaller priority value (= higher priority) are drawn on top.
  • The GraphEditorInputMode.OrthogonalEdgeEditingContext property is now set and enabled per default and may not be null anymore. Edges can be individually configured to be edited orthogonally by providing an apropriate IOrthogonalEdgeHelper in their lookup.
    • For edges using a PolylineEdgeStyle, the style's new OrthogonalEditing property can be set so such a helper is automatically provided.
    • To disable orthogonal editing for all edges, the Enabled property of the OrthogonalEdgeEditingContext can be set to false.
    • To enable orthogonal edge editing for all edges that don't explicitly forbid this, the OrthogonalEdgeEditingContext.FallbackEdgeHelperProvider property can be set to a helper supporting orthogonal edge editing.
  • The HandleTypes enums has been refactored to a non-flaggable HandleType enum, and the values have been adjusted to those used in the library as well as some custom variants for individual use.
  • Custom IHandle implementations can use the new IHandle.Tag property for various purposes, including custom handle visualizations. yFiles does not use the property and initializes it with null, but decorating handles forwards any values unmodified.
  • The static member GraphClipboard.DefaultGraphClipboard has been added and is used per default as GraphControl.Clipboard. This way copy&paste operations work between multiple GraphControl instances without the need to set a shared GraphClipboard instance first.
  • The parent node detection of GraphClipboard has been streamlined.
  • The protected Should- methods of the input modes have been removed and replaced by predicate properties. This simplifies adjusting the behavior without the need to subclass the input modes.
  • Toggling the item selection via Ctrl+Space now prefers toggling the selection state of GraphControl.CurrentItem over deselecting a single selected item.
  • The items reported by the HandleInputMode.AffectedItems property now include edges that were modified with the height handle of BezierEdgeStyle and ArcEdgeStyle.
  • New overloads of the CreateEdgeInputMode.StartEdgeCreation method can be used to start interactive edge creation from a node or port, respectively.
  • The modifier for using the ILabelModelParameterFinder during label movement can now be changed with the LabelPositionHandler.UseParameterFinderRecognizer property.
  • Improved keyboard navigation for graph items.
  • The MoveInputMode and MoveUnselectedInputMode properties of GraphEditorInputMode have been renamed to MoveSelectedItemsInputMode and MoveUnselectedItemsInputMode to better describe what they are used for. Associated properties and methods have been renamed accordingly.
  • Dragging a selected edge doesn't move all its bends anymore which often screwed up the first and last edge segment.
  • The MouseHoverInputMode has been renamed to ToolTipInputMode to better reflect its function.

Bug Fixes

  • Fixed a possible exception upon ClickInputMode installation if the DoubleClickTime was set to 0.
  • Fixed a bug in TextEditorInputMode which prevented setting a custom TextBox via property.
  • Sporadic errors during pinch zoom have been corrected.
  • Toggling the selection of an item using the keyboard now always toggles the selection of the focused item. Previously, if exactly one other item was selected when toggling, that item was deselected, making it virtually impossible to select multiple individual items using the keyboard.
    To fix this, the behavior of GraphCommands.ToggleItemSelection has been adjusted accordingly, and the behavior the GraphCommands.SelectItem and GraphCommands.DeselectItem has also been changed accordingly.
  • NavigationInputMode now reliably brings items selected with keyboard navigation into the view. Previously this only worked for nodes.
  • Fixed an issue where keyboard navigation would stop working when two items were positioned at the same location.
  • The GraphInputMode.FindItems overload without the context parameter did not find items correctly.
  • Several members of EditLabelInputMode could not be overwritten by mistake. The Install, Uninstall, TryStop, and Cancel methods and the Enabled property can now be overwritten.
  • GraphInputMode.FindItems method: when the filter includes both edges and bends, the edge will no longer be ignored if any of its bends are hit.
  • GraphInputMode.FindItems method: when using GraphItemTypes.All, bends will not be ignored. Furthermore, the interfaces IBendSelectionTester and IPortSelectionTester are properly queried.
  • GraphInputMode.FindItems method: Ports with a style are no longer reported twice.
  • When moving the viewport in a GraphControl that has a projection, the inertia now works in the right direction.
  • Fixed that the MarqueeSelect and LassoSelect methods of GraphEditorInputMode and GraphViewerInputMode were called with a wrong input mode context.
  • Fixed occasionally missing auto-scrolling on viewport bounds for touch devices.
  • Key presses are no longer propagated to the canvas's parent control if an input mode requests the keyboard.

Label Editing

New Features and Improvements

  • The API related to label editing has been enhanced by introducing a new EditLabelInputMode, which is now a subordinate mode of GraphEditorInputMode. The new input mode consolidates the methods, properties, and events necessary for customizing label editing. The key methods, AddLabel and EditLabel, remain accessible through GraphEditorInputMode.
  • The text editor will now stay open by default if label text validation fails.
  • Each ILabel and ILabelOwner now includes a default implementation of IEditLabelHelper in its Lookup. The IEditLabelHelper interface has been updated to offer greater control over the label editing process.
  • The API related to label editing has been removed from TableEditorInputMode, except for the key methods AddLabel and EditLabel. Label editing is now handled through GraphEditorInputMode's EditLabelInputMode.

Snapping

New Features and Improvements

  • The snapping feature has been refactored and enhanced to support more use cases. Previously, items could only snap to points or orthogonal lines. Now lines with any orientation and circle segments can be defined as references where items can snap to. Furthermore:
  • Snapping to circles, grids, and specific node sizes has been refactored to work analogue to the snapping to a SnapLine, so SnapCircle, SnapGrid, and SnapSize instances are created and are available for the SnapResult providers.
  • Label snapping is now also handled by the GraphSnapContext, so the LabelSnapContext has been removed. Configuration options have been moved from LabelSnapContext to GraphSnapContext.
  • Additional improvements:
    • The new GraphSnapContext.AffectedItems property provides the items for which SnapResults shall be collected.
    • The configuration options of GraphSnapContext are now easier to use and more concise.
    • The new protected methods CollectGridSnapReferences and CollectSameSizeSnapReferences of GraphSnapContext can be overridden to customize the SnapGrid and SnapSize instances items can snap to.
    • The new SnapReference class is now the base class of SnapLine, and the new SnapGrid, SnapSize, and SnapCircle classes. The new SnapReference.SnappableItems property describes which item types may snap to this reference.
    • Snap references of all types can be styled with CSS classes.
    • The new OrthogonalSnapLine.Croppable property is used to decide which snap lines to crop if GraphSnapContext.CropSnapLines is {}true{}.
    • The new properties Reference, Item, and ItemAnchor of the SnapResult class can be used by the IObjectRenderer for the visualization of the SnapResult.
    • New methods of ReshapeRectangleContext simplify the calculation of the bounds for a specified pointer delta or the SnapConstraint necessary to result in a specified width, height or side location.

Clipboard

New Features and Improvements

  • Members of GraphClipboard and GraphEditorInputMode with Element in their name that actually referred to model items were renamed to Item to clarify their usage.
  • The GraphClipboard.Paste method now accepts an optional pasteLocation parameter specifying the center of the bounds of the pasted items.
  • The events on GraphClipboard now use GraphClipboardEventArgs that provide the current IGraphClipboardContext and the Items.
  • When moving the viewport in a GraphControl that has a projection, the inertia now works in the right direction.
  • GraphClipboard's Cut, Copy, Paste, and Duplicate methods now use an IEnumerable to determine the subgraph to copy.
  • GraphClipboard now uses an optimized ClipboardGraphCopier for its clipboard operations instead of the general GraphCopier.
  • Bug Fixes

    • In certain rare cases, the insertion of edges could end up in an endless loop. This has now been fixed.

    Folding

    New Features and Improvements

    • The process of configuring edges at folder nodes has been simplified, resulting in a significant reduction in the number of configuration calls for merged edges.
    • The default implementation for folder nodes and folding edge converters has been enhanced, providing more powerful capabilities for synchronizing and initializing various aspects with granularity.
    • Collapsed group nodes (folder nodes) can now have different tags from their expanded form (group nodes).
    • Changes made to view states (folder nodes, folding edges) can now be reflected back to the master items. New methods, UpdateGroupNodeState and UpdateMasterEdges, have been added to IFolderNodeConverter and IFoldingEdgeConverter, respectively, for handling these updates.

    Bug Fixes

    • Setting the source or target port of an edge to a port at another edge does no longer lead to an exception if the edge is represented in a managed view (IFoldingView). Instead, the edge is now removed from the view.
    • Fixed a bug which could cause an edge in a folding view to be created at different ports as those which were given as parameters. This could lead to unexpected connections during interactive edge creation in rare cases.
    • Fixed a bug that could lead to an exception when duplicating a port on the GraphClipboard if it is duplicated.
    • Fixed a bug which caused changing the ports on an edge whose source or target node is collapsed being reverted after subsequent collapsing and expanding.
    • Label changes on folder nodes are no longer reverted by FolderNodeConverter if labels are copied between master and view node.

    View-Layout-Bridge

    New Features and Improvements

    • LayoutExecutor can now automatically create port constraints for edges at ports that use a CompositePortLocationModel. For all parameters added to a CompositePortLocationModel, a fixed port candidate is created. The cost, capacity, and PortSide of this candidate can be specified when adding the parameter to the model.
    • With the new ItemMapping.Dictionary property, a dictionary can be used to specify an ItemMapping.
    • The LayoutExecutor.TableLayoutConfigurator feature now uses more flexible placements for nodes that don't belong to any table node.

    Bug Fixes

    • The LayoutExecutor and LayoutGraphAdapter classes now correctly assign port group IDs to edges that connect to the same port. Previously, in some cases involving ports with a single incoming and outgoing edge, the port group IDs were omitted, which could cause incorrect layout results (such as diagonal segments instead of orthogonal ones).

    Layout

    New Features and Improvements

    • LayoutPortCandidates now have a MatchingId. When finding matching LayoutPortCandidates at nodes and for edges, two LayoutPortCandidates can only match if their MatchingId properties are equal.
    • The LayoutAnchoringStage class (previously called FixNodeLayoutStage) now allows using not only nodes but also edges and labels to anchor the graph's position.
      • The new NodeAnchoringPolicies, EdgeAnchoringPolicies, NodeLabelAnchoringPolicies and EdgeLabelAnchoringPolicies properties specify which part of the items should be used to calculate the anchor point.
      • The new LayoutExecutor.AnchoredItems property specifies the graph items used to anchor the graph's position.
    • The ComponentLayout has now the ability to specify which layout to apply to individual components using ComponentLayoutData.ComponentLayouts property. Additionally, edges between components can be routed using a router set via ComponentLayout.InterEdgeRouter.
    • It is now possible to specify multiple layout grids for a graph (previously called PartitionGrid). This is made possible by the new LayoutGridCellDescriptor.LayoutGrid property. This way it is no more required to set the global layout grid with the LayoutGridData.Grid property. If a node is to be placed in a grid but not in a specific cell, this can now be achieved using the new LayoutGrid.CreateDynamicCellDescriptor method. Be aware that many layout algorithms like HierarchicalLayout don't support multiple layout grids.
    • The LayoutData classes are now generic and can be used for items of a LayoutGraph, too. Of course, it's still possible to use LayoutData with IGraph items.
      • LayoutData instances when used with IGraph typically need INode, IEdge, ILabel, and ILabel as their type arguments.
      • LayoutData instances when used with LayoutGraph typically need Node, Edge, NodeLabel, and EdgeLabel as their type arguments.
      • Instances of LayoutData classes can be created via factory extension methods on the layout algorithm themselves, for example, HierarchicalLayout.CreateLayoutData. Depending on the type of graph that is provided as the argument, the correct data instance will be created.
    • The API around the LayoutGraph class has received a major rework. The LayoutGraph is the only remaining graph implementation for the layout analysis part. Classes Graph (previously used for graph analysis, only) and CopiedLayoutGraph have been removed and functionality was moved to LayoutGraph.
      • The API has been made more similar to the API of the IGraph with respect to creation, modification and access to nodes, edges and labels.
      • Low-level data types like NodeList and EdgeList have been removed as well as cursor for iteration over the elements.
      • Properties NodeCount and EdgeCount have been removed. Query the size of the Nodes and Edges properties instead.
      • Layout information about items must no longer be queried from the graph instance (e.g. previously with methods like LayoutGraph.GetLayout). It is now accessible on the items itself and is also mutable, see Node.Layout property.
      • The edge path information is no defined by properties on the edge, most importantly these are SourcePortLocation, TargetPortLocation and Bends.
      • Labels of nodes and edges are now accessed via a property on the respective owning item. To add labels, use LayoutGraph.AddLabel method. The complicated ILabelLayoutFactory that covered that use case in the past has been removed.
      • Hiding items is no longer possible via the graph itself. To do so, use the helper LayoutGraphHider class.
      • The Graph.ContainsEdge method has been removed in favor of LayoutGraph.GetEdgesBetween. The same holds for the Node.GetEdgeTo and Node.GetEdgeFrom methods.
      • Convenience properties like Node.Neighbors have been removed. Instead, query all edges (using the Edges property) and filter the required adjacent nodes manually.
      • To copy a LayoutGraph instance, the new LayoutGraph.CreateCopy method has been added.
      • If a LayoutGraph without coordinate/path information is needed (to optimize memory performance), it can be created using the factory LayoutGraph.CreateStructureGraph method.
    • LayoutExecutor now supports arranging graphs without a GraphControl.
    • The thread started when LayoutExecutor.RunInThread is true is now a background thread and thus long-running layout calculations no longer block the process from exiting.
    • The new LayoutGraph.GetEdgesBetween method returns all edges between two nodes.
    • The PortPlacementStage now computes cost-minimal matchings between port candidates at nodes and edges.
    • Most layouts now support port grouping and port candidates at nodes and edges. These features are implemented through a post-processing step using the PortPlacementStage, rather than being natively integrated into the layouts. As a result, the quality may be poor.

    Bug Fixes

    • The CurveFittingStage now correctly respects the maximum error. Previously, it sometimes produced curves that violated the maximum error.
    • The LineSegment.GetIntersection method no longer produces incorrect results when the specified epsilon is zero. Previously, there were some edge cases where the algorithm failed to detect an intersection and returned null instead.
    • Added the protected ParallelEdgeRouter.HideMultiEdges method, which is required to meaningfully overwrite the existing protected ParallelEdgeRouter.FindAndHideMultiEdges method.
    • The PortPlacementStage now correctly considers port candidates together with port groups.

    Hierarchical Layout

    New Features and Improvements

    • The HierarchicalLayout class now supports defining minimum distances between the ports. They can be specified per node side using the HierarchicalLayoutNodeDescriptor.MinimumPortDistance property. The node size is increased if necessary in order to accommodate the minimum distances.
    • The Hierarchical Layout class now supports aligning the ports of edges incident to the same node, that is, the ports are placed at the same x- or y-coordinate. This can be particularly useful to visualize paths in a graph. Which ports to align is specified by the new properties PortData.SourcePortAlignmentIds and PortData.TargetPortAlignmentIds accessible via HierarchicalLayoutData.Ports.
    • The HierarchicalLayout now produces fewer bends for multi-edges with labels when integrated edge labeling is enabled.
    • The HierarchicalLayout class now produces better results for graphs with tabular groups where all children have a fixed user-specified order.
    • The routes of self-loops now consider both node and edge labels preventing overlaps if possible.
    • The ports of edges with free ports are no longer placed at the same location as fixed ports, which previously could happen if multiple edges had the same fixed port.
    • The HierarchicalLayout no longer produces overlapping edge segments if there are grouped edges with different thicknesses values. Previously, the user had to ensure that all these edges use the same thickness.
    • In barycenter mode the HierarchicalLayout now enforces a more symmetric placement of the nodes that are part of chains or height-2 trees.

    Bug Fixes

    • The HierarchicalLayout class no longer produces an error when using a non-zero grid distance in combination with incremental mode's exact coordinate hints.
    • The HierarchicalLayout class no longer assigns superfluous space to group nodes if there are grouped edges.
    • The HierarchicalLayout algorithm now correctly handles node and edge labels with width or height set to negative values. Previously, large negative values may have caused exceptions.
    • The HierarchicalLayout class now always places aligned ports correctly in from-sketch mode.
    • Instances of LayerConstraintData and SequenceConstraintData that are configured with comparables can now be reused for multiple layout calculations.
    • The HierarchicalLayout class no longer produces an error for labeled graphs with port alignment constraints when the integrated edge label placement is enabled.
    • The HierarchicalLayout class no longer produces superfluous crossings between backloops or same-layer edges in the first or last layer.
    • The HierarchicalLayout now properly handles self-loop edges when the edge is at a group node and furthermore edge/port grouped with the same ID on both sides. Previously, it was not routed correctly or that it was removed from the LayoutGraph instance when running the layout algorithm directly on the graph instance without using a copy.
    • The HierarchicalLayout class no longer swaps the position of fixed nodes in incremental layout mode with user-specified sequence constraints.
    • The HierarchicalLayout class no longer produces superfluous crossings for some graphs with group nodes in incremental layout mode.
    • Edges between two subcomponents now correctly consider fixed any-side port candidates.
    • The HierarchicalLayout class no longer produces very long edge segments for some input graphs containing groups with node halos and polyline edge routing.
    • The HierarchicalLayout class no longer throws an exception for graphs with bus structures if the algorithm runs in incremental mode and the group transposition feature is enabled.
    • The HierarchicalLayout class no longer produces intertwined edge routes with many superfluous crossings and bends for some cases with sequence constraints PlaceAtHead or PlaceAtTail. The problem mainly occurred with graphs with groups or PartitionGrid and incompatible sequence constraints.

    Tree Layout

    New Features and Improvements

    • Added the new TreeLayout.FromSketchMode property to consider the initial coordinates of the graph elements. This has an effect only if the used subtree placers implement IFromSketchSubtreePlacer.
    • Added the TreeLayoutData.MultiParentDescriptors property that allows to specify style information for multi-parent structures.
    • The TreeReductionStageData class now offers NonTreeEdgesResult property. It allows to conveniently query the set of edges that the stage actually selected as non-tree edges.
    • The TreeLayout now considers minimum last segment lengths no matter on which side the port shall be placed.
    • The AspectRatioSubtreePlacer now supports minimum first and last segment lengths.
    • The SingleLayerSubtreePlacer supports placing the subtree root centered with respect to the ports at its children with the new enum value SingleLayerSubtreePlacerRootAlignment.CenterOfPorts.
    • All subtree placers that used Tree.RootAlignment support placing the subtree root centered above the ports with the new value CenterOfPorts.
    • The LeftRightSubtreePlacer now supports minimum segment length, which can be set with the properties MinimumFirstSegmentLength and MinimumLastSegmentLength.
    • The AspectRatioSubtreePlacer now supports multiple variants how to place the root node with respect to its children, which can be set using the properties ChildArrangement and RootPlacement.
    • Added properties of TreeReductionStageData directly to the LayoutData of tree layouts, including RadialLayoutData, AspectRatioTreeLayoutData, RadialTreeLayoutData, and TreeLayoutData.

    Bug Fixes

    • The TreeLayout class no longer ignores the initial locations for some subtree placers if the FromSketchMode property is enabled.
    • The Tree Layout now automatically places edge labels of the parallel edges handled by its ParallelEdgeRouter instance, when integrated edge labeling is enabled.
    • The TreeLayout class no longer produces broken edge routes for some input graphs with multi-parent structures.
    • The AspectRatioSubtreePlacer class no longer ignores the specified AspectRatioSubtreePlacer.ChildAlignmentPolicy for some specific setups (e.g., if all children are leaves and have the same size).

    Orthogonal Layout

    New Features and Improvements

    • The newly added OrthogonalLayout.QualityTimeRatio property allows controlling the layout quality by automatically enabling/disabling additional optimization steps.
    • The OrthogonalLayout algorithm now supports specifying edges that should be routed against the main layout orientation in addition to the option to route with the main layout orientation. See OrthogonalLayoutData.EdgeOrientation property.

    Bug Fixes

    • The Orthogonal Layout now automatically places edge labels of the parallel edges handled by its ParallelEdgeRouter instance, when integrated edge labeling is enabled.

    Edge Router

    New Features and Improvements

    • The quality of edge routing for buses is improved.
    • If EdgeRouter is run with the buses feature and a limited duration, it now splits the available time amongst buses, meaning that it will not get "stuck" on a single bus, which could otherwise impact the quality of the remaining buses and non-bus edge routings.

    Bug Fixes

    • The EdgeRouter now prefers to use fixed port candidates that are not overlapped by other nodes.
    • The EdgeRouter class no longer produces uncovered buses. Previously, there were some rare cases where the specified bus edges didn't constitute a bus.
    • When routing edges to and from fixed ports in the interior of group nodes, other nodes in the group are not ignored anymore, so that the edge does not overlap them if possible.

    Labeling

    Bug Fixes

    • The GenericLabeling algorithm now correctly considers the case where model parameters of a CompositeLabelModel have different weight values. Higher weights are preferred.
    • The EdgeLabelCandidates.BuildCandidates method does no longer return null for some setups with free edge label models. Instead it returns an empty IEnumerable now.
    • The GenericLabeling class now produces less node-label overlaps.

    Organic Layout

    New Features and Improvements

    • The performance for the OrganicLayout has been substantially improved for large graphs without group nodes. The improvement is triggered if no special constraints are defined and no shape recognition is enabled.
    • The OrganicLayout now supports different styles for group substructures, which are set via the GroupSubstructureStyle property.

    Bug Fixes

    • The Organic Layout now automatically places edge labels of the parallel edges handled by its ParallelEdgeRouter instance, when integrated edge labeling is enabled.
    • The OrganicLayout class no longer ignores the preferred edge length in incremental layout mode with a single affected element.
    • Fixed an issue that may have automatically disabled the component layout when using constraint-based features.

    Radial Tree Layout

    New Features and Improvements

    • Added data key OutEdgeComparisonDataKey to RadialTreeLayout class (formerly BalloonLayout).

    Series-parallel Layout

    Bug Fixes

    • The Series Parallel Layout now automatically places edge labels of the parallel edges handled by its ParallelEdgeRouter instance, when integrated edge labeling is enabled.

    Partial Layout

    New Features and Improvements

    • PartialLayout now supports specifying inversely directed edges in addition to undirected and directed edges.

    Bug Fixes

    • PartialLayoutScopeData will no longer mark any edges as affected when only nodes are specified to be in scope, nor mark any nodes as affected when only edges are specified to be in scope.

    Tabular Layout

    New Features and Improvements

    • The new TabularLayoutData.LayoutGridData property makes it easy to query the cell to which a node was assigned to by the TabularLayout class after applying it.

    Bug Fixes

    • The layout algorithms do no longer throw an Exception when a LayoutGrid including a mapping from nodes to LayoutGridCellDescriptors is defined and if algorithm TabularLayout was executed before with LayoutMode AutoSize or FromSketch. In these modes the TabularLayout automatically assigns cells to nodes so that any mapping defined prior will be ignored now.

    Component Layout

    New Features and Improvements

    • ComponentLayout now supports NodeMargins (formerly NodeHalos) for each ComponentArrangementStyle other than None and KeepCenters.

    Algorithms

    New Features and Improvements

    • The LongestPath algorithm now uses double values instead of integers for edge traversal costs. This improves the Paths, LayoutGraphAlgorithms, and LongestPath classes.
    • The LayoutGraphAlgorithms.FindCycleEdges method has been improved and now requires fewer edges to be reversed. In addition, a new, even better but slower heuristic can be enabled with a new optional parameter.

    Bug Fixes

    • The Intersections class does not dispose FilteredGraphWrapper instances that it is given with no subgraph nodes or edges specified anymore. Previously, this caused the graph instance to become defunct, resulting in various operations running into null fields and properties, generating exceptions that were non-trivial to understand.
    • IntersectionsResult no longer includes intersections that have no actual intersection points. This issue occurred when two graph elements were within a small epsilon distance of each other.

    Analysis

    New Features and Improvements

    • The KShortestPaths class has a new implementation of the k-shortest path algorithm that allows for the exclusion of non-simple paths (i.e., paths with repeating vertices). Previously, these paths could not be excluded. The new implementation is used by default and can be disabled with the SimplePaths parameter.
    • For usage with a LayoutGraph, the algorithm is also available via the LayoutGraphAlgorithms.KShortestPaths method.

    Geometry

    New Features and Improvements

    • The new GeneralPath.AreaOrPathContains method tests if the path fuzzily contains a point and can be used for hit-testing a GeneralPath.
    • All methods on the GeneralPath class that accept points now have overloads for IPoint and PointD, and all methods that accept rectangles now have overloads for IRectangle and RectD.
    • There are now methods on RectD and PointD to calculate the distance between points and rectangles.
    • The GeneralPath.GetProjection method is now faster for paths with Bezier segments.
    • The IRectangle interface no longer implements IPoint. As a consequence, it is no longer possible to inadvertently use rectangles as parameters for methods that expect a point. You can still easily get the top-left corner of a rectangle with its GetTopLeft method. Similarly, IMutableRectangle no longer implements IMutablePoint.

    Bug Fixes

    • Fixed a potential NullReferenceException in GeneralPath.Render.
    • The GeneralPath.PathMayIntersectClip method has been corrected for paths with multiple segments, at least one of which is a cubic segment.
    • The SizeD.Area property now returns 0 for empty sizes. This is consistent with the behavior of the RectD.Area property.

    Incompatible Changes

    Categories: General Graph Controls Rendering Selection, Focus, Highlight Styles Interaction Snapping Clipboard Folding Lookup GraphML View-Layout-Bridge Layout Layout Data Hierarchical Layout Tree Layout Orthogonal Layout Edge Router Labeling Organic Layout Interactive Organic Layout Circular Layout Radial Layout Radial Tree Layout Radial Group Layout Series-parallel Layout Compact Disk Layout Multi-page Layout Partial Layout Tabular Layout Component Layout Tree Map Layout Recursive Group Layout Layout Grid Other Layouts Algorithms Analysis Collections Geometry

    General

    Incompatible API Changes

    • The minimum required .NET versions for yFiles are .NET Framework 4.6.2 and .NET 6.0, respectively.
    • The minimum supported .NET versions for the Layout package are now .NET Standard 2.1 and .NET Framework 4.6.2.
    • The (up to three) assembly files of the yFiles library are now combined into one single file.
    • The following classes are now sealed: BorderLineSegment, LayoutGridCellDescriptor, LabelScopeData, ItemCollection, ItemMapping, FreePortLabelModel, and FreeNodeLabelModel. They either already had an internal constructor or do not offer any meaningful members for overriding.
    • Removed the Default prefix from the names of the following types: DefaultEdgePathCropper, DefaultFoldingEdgeConverter, DefaultFolderNodeConverter, DefaultLabelStyle, DefaultObservableCollection, DefaultPortCandidate, and DefaultSelectionModel.
    • Removed DefaultLabelModelParameterFinder.
    • Removed the protected IgnoreModifierKeyRepeats property from CanvasControl.
    • Removed the StripeSelection class. Instead, use the instance returned by the TableEditorInputMode.StripeSelection property.
    • Consistently use names Padding and Margins in member names:
      • Renamed the TextEditorInputMode.TextBoxPadding property to TextBoxMargins.
      • Renamed the IndicatorLabelStyleDecorator.Padding property to Margins.
      • Renamed the IndicatorNodeStyleDecorator.Padding property to Margins.
      • Renamed the GraphEditorInputMode.ContentRectMargins property to ContentMargins.
      • Renamed the OverviewInputMode.Margins property to ContentMargins.
      • Renamed the ViewportAnimation.TargetBounds property to Target.
      • Renamed the ViewportAnimation.TargetViewMargins property to TargetMargins.
      • Renamed the StripeLabelModel.UseActualInsets property to UseTotalPadding.
      • Renamed the StretchStripeLabelModel.UseActualInsets property to UseTotalPadding.
      • Renamed the IStripe.GetActualInsets method to GetTotalPadding.
      • Renamed the GroupNodeStyle.ContentAreaInsets property to ContentAreaPadding.
      • Renamed Insets properties of all ILabelModel implementations to Margins.
      • Replace name part Insets of other types and members with Padding.
    • Removed the BridgeManager.ClipMargin property.
    • Sealed the following classes which have no inheritors:
      • all classes in the yWorks.Algorithms namespace.
      • all classes extending the EventArgs class.
      • all implementations of the ILabelModel and IObjectRenderer interfaces.
    • Enum values that followed the North, East, South, West naming convention have been renamed to follow a Top, Right, Bottom, Left naming convention. In particular, the values of the following enums have been renamed: HandlePositions, EdgeSegmentDirection, LabelModels.Position, LabelModels.Position, LabelModels.Position, LabelModels.Position, and LabelModels.Position,.
    • The IReadOnlyList<T> interface replaces the IListEnumerable<T> interface, which has been removed along with its related classes ListEnumerable<T> and ListEnumerableExtensions.
    • Renamed the PortSide enum to PortSides.
    • For consistency reasons, the property WeakDictionaryMapper.Empty is now called IsEmpty.
    • Renamed the CreateEdgeInputMode.AllowSelfloops property to AllowSelfLoops.
    • Renamed the GraphEditorInputMode.SelectNodeAndSelfloopBends method to SelectNodeAndSelfLoopBends.
    • Renamed the GraphEditorInputMode.AutoSelectSelfloopBends property to AutoSelectSelfLoopBends.
    • Renamed the IEdge.IsSelfloop method to IEdge.IsSelfLoop.

    Graph

    Incompatible API Changes

    • The ILookup interface and its extension methods have been moved to the yWorks.Utils namespace.
    • The IMapper interface, the Mappers, DictionaryMapper, and WeakDictionaryMapper classes have been moved to the yWorks.Utils namespace.
    • The GraphClipboard.IsDummy method has been renamed to IsHelper.
    • Method GroupingSupport.GetPathToRoot has been renamed to GetAncestors and returns an IReadOnlyList instead of an IList.
    • The owner parameter of the ITable.CreateRow, CreateColumn, and SetParent methods has been renamed to parent.
    • The structural properties of graph items (IEdge.SourcePort, IEdge.TargetPort, ILabel.Owner, IPort.Owner, IBend.Owner) now throw exceptions if accessed for items that are no longer in the graph. If it is unknown whether the item is still in the graph, please test the item with HasOwner or HasSourceAndTargetPort first before accessing these properties.
    • IEdge's GetSourceNode and GetTargetNode methods now throw exceptions if called for an edge that is no longer in the graph or if the owner of the edge's source or target port is not a node.
    • The classes DelegateUndoUnit and CompositeUndoUnit have been removed. The new factory methods UndoUnits.FromDelegate and UndoUnits.Combine can be used instead.
    • The UndoUnitBase class has been removed. Subclasses now have to implement the IUndoUnit interface instead.
    • GenericPortLocationModel has been renamed to CompositePortLocationModel and doesn't implement IEnumerable anymore. Instead, the Parameters property can be used to iterate the parameter.
    • The SegmentRatioPortLocationModel class is now named EdgeSegmentPortLocationModel, similar to EdgeSegmentLabelModel.
    • The CreateFromSource and CreateFromTarget methods of the SegmentRatioPortLocationModel and BendAnchoredPortLocationModel are now named CreateParameterFromSource and CreateParameterFromTarget.
    • The ITagOwner interface is now in the yWorks.Utils namespace.
    • Removed the TableAnimation class. Use the factory Animations.CreateTableAnimation method as a replacement.
    • The GraphItemTypes.NotContains method was removed, use the Contains method instead.
    • The FreeEdgeLabelModel.CreateEdgeAnchored method has been renamed to CreateParameter.
    • The FreeNodeLabelModel.CreateDefaultParameter method has been removed and replaced by the new FreeNodeLabelModel.Center field.
    • The FreeNodeLabelModel.CreateCanonicalParameter method has been renamed to CreateParameter.
    • The FreePortLabelModel.CreateDefaultParameter method has been removed and replaced by the new FreePortLabelModel.Center field.
    • Changes to the GraphCopier class:
      • The methods CopyNodeStyle, CopyEdgeStyle, CopyPortStyle, CopyLabelStyle, GetOrCreateCopy, CopyLabelLayoutParameter, and CopyPortLocationParameter have been made protected.
      • The methods CopyNode, CopyGroupNode, and CopyEdge have been renamed to CreateNode, CreateGroupNode, and CreateEdge to clarify their role.
      • The Clone property has been renamed to CloneTypes.
      • The Copy method now uses an IEnumerable of items instead of a filter predicate to define the subset to copy.
    • The ILabelModel.CreateDefaultParameter method has been removed. Instead suitable other Create*Parameter methods of the concrete label model implementations should be used.
    • The GenericLabelModel class has been removed. Its functionality has been integrated into the CompositeLabelModel, which can be used instead.
    • The CompositeLabelModel.LabelModels property has been removed. Instead of adding label models to this list, the new AddModel method has to be called.
    • The ILabelModel parameter of the ILabelModelParameterFinder.FindBestParameter and ILabelModelParameterProvider.GetParameters methods has been removed.
    • The static LabelModelParameterSerializer and PortLocationModelParameterSerializer classes have been removed. These classes could be used to retrieve the properties of label model parameters and port location model parameters and are not necessary anymore as the parameter classes are now public.
    • The ILabelModelParameter.Supports method has been removed. Instead, the ILabelModel.GetGeometry method may now throw an exception if the label and label model parameter don't match.
    • The IPortLocationModelParameter.Supports method has been removed. Instead, the IPortLocationModel.GetLocation method may now throw an exception if the port and port location model parameter don't match.
    • The UndoEngine.Token property replaces the UndoEngine.GetToken method.
    • The static parameter fields of FreeNodePortLocationModel have been renamed analogue to the static parameter fields in InteriorNodeLabelModel.
    • The IMapperRegistry interface, the MapperRegistry class, and the IGraph.MapperRegistry property have been removed. To store additional information for graph items, either use the item's Tag property or keep a dictionary alongside the graph.
      To configure layout settings for individual items, use LayoutData instead.
    • The label models ExteriorLabelModel, InteriorLabelModel, and InteriorStretchLabelModel have been renamed to ExteriorNodeLabelModel, InteriorNodeLabelModel, and StretchNodeLabelModel, respectively,.

    Incompatible Behavior Changes

    • The arrow of the default edge style is now ArrowType.Triangle.
    • The default lookup for INode doesn't return an IMutableRectangle anymore, the default lookup for IBend doesn't return an IMutablePoint anymore, and the default lookup for ILabel doesn't return an IMutableSize anymore.
    • The rotation direction of OrientedRectangle, NodeLabel, EdgeLabel and FreeEdgeLabelModel is now clockwise to be consistent with the other models.
    • The default value for the Padding properties of ExteriorNodeLabelModel, InteriorNodeLabelModel, StretchNodeLabelModel, and StretchStripeLabelModel have been changed from empty insets to insets with value 2 on each side. This way the label bounds per default don't touch the bounds of their owner anymore.
    • The default value for the Distance properties of the EdgePathLabelModel and EdgeSegmentLabelModel when using their default constructors have been changed from 0 to 2. This way the label bounds per default don't touch the edge path of their owner anymore when an EdgeSide other than OnEdge is used.
    • The EdgeSegmentPortLocationModel.CreateParameterFromTarget method now interprets the parameter ratio from the target to the source side.
    • The default edge label model parameter is now created from an EdgeSegmentLabelModel using its CreateParameterFromCenter method instead of CreateParameterFromSource.

    Controls

    Incompatible API Changes

    • The XAML namespace for yFiles WPF has changed and is now http://www.yworks.com/xml/yfiles-wpf/4.0/XAML.
    • GridVisualCreator has been renamed to GridRenderer.
    • The new CanvasControl.RenderTree property now encapsulates all low-level render object related API which was previously available directly on CanvasControl.
      • This includes the default render tree groups (RootGroup, BackgroundGroup, ForegroundGroup, ContentGroup, SelectionGroup, FocusGroup, HighlightGroup, InputModeGroup), the helper methods relating to render tree elements (HitElementsAt, IsHit, GetVisual, GetVisualCreator, GetCanvasObjects (now GetElements), GetBounds).
      • Furthermore, some functionality previously available on ICanvasObject(Group) has been moved to RenderTree as well, such as creating new elements or groups, changing the parent group or removing a render tree element.
    • Renamed the CanvasControl.AutoDrag property to AutoScrollOnBounds.
    • Renamed the CanvasControl.AutoDragInsets property to AutoScrollPadding.
    • Renamed the ViewportChanges.AutoDrag field to AutoScrollOnBounds.
    • Removed the DragSize, DragTime and DoubleClickSize properties of the CanvasControl class.
    • Renamed commands MoveFocusBack and MoveFocusForward to MoveFocusLeft and MoveFocusRight.
    • Renamed HighlightIndicatorManager.SelectionModel to Items.
    • Renamed SelectionIndicatorManager.SelectionModel to Items.
    • Renamed SelectionIndicatorManager.Model to Domain.
    • Renamed Canvas word components in properties and method parameter names to CanvasControl.
    • The GraphModelManager constructor no longer has canvasControl and contentGroup parameters. Also, the ContentGroup property can no longer be set directly. Instead, the Install method now sets both CanvasControl and ContentGroup.
    • Removed the events AutoDragChanged, AutoDragInsetsChanged, MouseWheelScrollFactorChanged, MouseWheelZoomFactorChanged, and ProjectionChanged of the CanvasControl class.
    • The ICanvasObject.Group property has been renamed to Parent.
    • The predefined EventRecognizer constants of the MouseEventRecognizers, KeyEventRecognizers, and TouchEventRecognizers classes have been moved to the EventRecognizers class. In addition, some rarely used constants have been removed.
    • The events on CanvasControl which are related to input devices and the corresponding EventRecognizer constants have neem renamed to conform to platform conventions.
    • Renamed the coordinate transformation methods to also include the source coordinate system in their names:
      • Renamed CanvasControl.ToViewCoordinates to WorldToViewCoordinates.
      • Renamed CanvasControl.ToWorldCoordinates to ViewToWorldCoordinates.
      • Renamed IRenderContext.ToViewCoordinates to WorldToViewCoordinates.
    • Removed the AnimateScrollCommands property and CanvasControl.AnimateScrollCommandsProperty field. Change AnimatedViewportChanges property instead.
    • ViewportLimiter.LimitViewport now uses a signature that works with the new type ViewportDescriptor and respects the new ViewportLimitingMode enum.
    • ViewportLimiter.HonorBothDimensions is now called ViewportLimiter.StrictBoundsContainment and the default value changed to false.
    • The default InputMode in GraphControl is no longer null but is now set to GraphViewerInputMode.

    Incompatible Behavior Changes

    • For new GraphModelManager instances, the Install method has to be called either directly or indirectly by assigning the GraphModelManager to the GraphControl.GraphModelManager property.

    Rendering

    Incompatible API Changes

    • Added properties IntermediateToWorldTransform and ViewToWorldTransform to IRenderContext.
    • The ICanvasObjectDescriptor interface has been renamed to IObjectRenderer and its IsDirty method has been removed.
    • The ICanvasObject interface has been renamed to IRenderTreeElement and its UserObject property has been renamed to Tag. Its Descriptor property has been replaced with property Renderer of type IObjectRenderer.
    • The ICanvasObjectGroup interface has been renamed to IRenderTreeGroup.
    • The ICanvasObjectInstaller interface has been removed.
    • The singletons of the CanvasObjectDescriptors class are no longer necessary, and thus, this class has been removed. There is now a VoidObjectRenderer.Instance singleton.
    • The IFocusIndicatorInstaller, IHighlightIndicatorInstaller, and ISelectionIndicatorInstaller interfaces have been renamed to IFocusRenderer, IHighlightRenderer, and ISelectionRenderer respectively and now inherit from IObjectRenderer instead of ICanvasObjectInstaller. Classes implementing these interfaces have been changed accordingly (EdgeStyleDecorationInstaller, LabelStyleDecorationInstaller, NodeStyleDecorationInstaller, and PortStyleDecorationInstaller have been renamed to EdgeStyleIndicatorRenderer, LabelStyleIndicatorRenderer, NodeStyleIndicatorRenderer, and PortStyleIndicatorRenderer respectively).
    • The GetInstaller methods on the ModelManager, FocusIndicatorManager, HighlightIndicatorManager, SelectionIndicatorManager, GraphFocusIndicatorManager, GraphHighlightIndicatorManager, and GraphSelectionIndicatorManager classes are now called GetRenderer and return IObjectRenderer. Similarly, the GetCanvasObjectGroup methods of these classes have been renamed to GetRenderTreeGroup.
    • The members of class GraphModelManager have been adjusted to reflect the ICanvasObjectDescriptor and ICanvasObject renamings. More precisely, DefaultEdgeDescriptor, DefaultLabelDescriptor, DefaultNodeDescriptor, DefaultPortDescriptor, EdgeDescriptor, EdgeLabelDescriptor, NodeDescriptor, NodeLabelDescriptor, PortDescriptor, PortLabelDescriptor, ProvideUserObjectOnMainCanvasObject, GetCanvasObject, GetCanvasObjectGroup, GetCanvasObjectGroup, GetCanvasObjectGroup, GetCanvasObjectGroup, and GetMainCanvasObject have been renamed to DefaultEdgeRenderer, DefaultLabelRenderer, DefaultNodeRenderer, DefaultPortRenderer, EdgeRenderer, EdgeLabelRenderer, NodeRenderer, NodeLabelRenderer, PortRenderer, PortLabelRenderer, ProvideRenderTagOnMainRenderTreeElement, GetRenderTreeElement, GetRenderTreeGroup, GetRenderTreeGroup, GetRenderTreeGroup, GetRenderTreeGroup, and GetMainRenderTreeElement respectively.
    • The members of class ItemModelManager have been adjusted to reflect the ICanvasObjectDescriptor and ICanvasObject renamings. More precisely, CanvasObjectGroup, Descriptor, GetCanvasObject, GetCanvasObjectGroup, and GetDescriptor have been renamed to RenderTreeGroup, Renderer, GetRenderTreeElement, GetRenderTreeGroup, and GetRenderer respectively.
    • The RectangleIndicatorInstaller, OrientedRectangleIndicatorInstaller, and PointSelectionIndicatorInstaller classes have been removed.
    • The IStripeInputVisualizationHelper interface is now called IStripeInputRenderer and extends IObjectRenderer, the DefaultStripeInputVisualizationHelper class has been removed.
    • The StripeDecorator.InputVisualizationDecorator property has been renamed to InputRenderer.
    • The DefaultPortCandidateDescriptor class is now called PortCandidateRenderer. The class no longer has the CandidateDrawingValidNonFocusedKey, CandidateDrawingValidFocusedKey, CandidateDrawingInvalidNonFocusedKey, and CandidateDrawingInvalidFocusedKey static properties.
    • The new PortCandidateRenderer property on the CreateEdgeInputMode class replaces the CandidateDescriptor and ClosestCandidateDescriptor properties.
    • The new public property PortCandidateRenderer on the PortRelocationHandle class replaces the CreatePortCandidateDescriptor and CreateCurrentPortCandidateDescriptor protected methods.
    • The new public property PortCandidateRenderer on the PortRelocationHandleProvider allows customizing the renderer for the port candidates.
    • The new ViewportRectangleRenderer property on the OverviewInputMode class allows customizing the renderer for the viewport rectangle. It replaces the Template property and the ViewportTemplateKey static property.
    • The new MarqueeSelectionInputMode.MarqueeRenderer property replaces the Template property and MarqueeRectangleTemplateKey static property.
    • The new LassoSelectionInputMode.LassoRenderer property replaces the FinishRegionTemplate and FinishRegionHighlightTemplate properties and the FinishRegionTemplateKey and FinishRegionHighlightTemplateKey static properties. Also, the LassoPenKey and LassoFillKey static properties have been removed.
    • The new CandidateRenderer property on the LabelPositionHandler class replaces the CandidateTemplate and HighlightTemplate properties and the CandidateTemplateKey and HighlightTemplateKey static properties.
    • The GetCanvasObject and GetCanvasObjects methods of class CanvasControl have been renamed to GetRenderTreeElement and have been moved to the GraphModelManager class.
    • The CreateSnapResultCanvasObjectDescriptor method of class SnapContext has been renamed to CreateSnapResultRenderer.
    • The GraphVisualCreator property of class GraphOverviewControl is now called GraphOverviewRenderer and of type IObjectRenderer.

    Selection, Focus, Highlight

    Incompatible API Changes

    • The IndicatorEdgeStyleDecorator, IndicatorLabelStyleDecorator, IndicatorNodeStyleDecorator, and IndicatorPortStyleDecorator classes were removed. Use the EdgeStyleIndicatorRenderer etc. classes instead.
    • The GraphFocusIndicatorManager, GraphHighlightIndicatorManager, and GraphSelectionIndicatorManager classes were removed. Use the FocusIndicatorManager etc. classes and their default instances on the GraphControl class instead and register instances of the EdgeStyleIndicatorRenderer etc. classes to the item lookups via the graph decorator.
    • The AddSelection and RemoveSelection methods on the SelectionIndicatorManager class were removed. Instead, modify the Items property directly.
    • HighlightIndicatorManager now by default uses the new GraphControl.Highlights collection. Adding, removing, and clearing highlights should now be done via the GraphControl.Highlights property.
    • The ISelectionModel interface has been removed and usages have been replaced by IObservableCollection. Thus, selecting an element works by calling ICollection.Add, deselecting works by calling ICollection.Remove, and checking the selection state is done via ICollection.Contains.
    • The ItemSelectionChangedEventArgs have been replaced by usages of ItemEventArgs and there are now two separate events for adding/selecting and removing/deselecting elements from the collections. The ItemSelectionChangedEventArgs type has been removed.
    • The default implementations of IGraphSelection and IStripeSelection have been removed from the public API.
    • Class FocusIndicatorManager no longer implements INotifyPropertyChanged.
    • Replaced event FocusIndicatorManager.PropertyChanged with event FocusedItemChanged.
    • Renamed Method FocusIndicatorManager.OnPropertyChanged to OnFocusedItemChanged and changed signature.
    • FocusIndicatorManager.ShowFocusPolicy changed its default to the new WhenUsingKeyboard. The old policy called OnlyWhenFocused is now called WhenFocused.

    Styles

    Incompatible API Changes

    • Methods CreateVisual and UpdateVisual of classes NodeStyleBase, EdgeStyleBase, LabelStyleBase, PortStyleBase and StripeStyleBase are no more abstract but virtual. Added Paint method to these classes as a simpler alternative to the two methods.
    • The following classes have been removed: VoidEdgeStyleRenderer, VoidLabelStyleRenderer, VoidNodeStyleRenderer, VoidPortStyleRenderer and VoidStripeStyleRenderer. Instances of these classes can be retrieved from the Renderer property of the corresponding void style implementations.
    • The IArrow interface now requires the CropAtPort property to be provided by implementations. For backward compatibility return false in simple subclasses.
    • The class Arrow is now immutable and comes with separate scale factors for arrow length and width. The default arrow was renamed to ArrowType.Stealth, circle arrow to ArrowType.Ellipse, and simple arrow to ArrowType.Open. The short arrow type was removed.
    • Class TableNodeStyle no longer implements INotifyPropertyChanged.
    • Renamed some values of TextWrappingShape and ShapeNodeShape:
      • Triangle2 is now TrianglePointingDown.
      • Hexagon2 is now HexagonStanding.
    • Removed the following values from ShapeNodeShape: ShearedRectangle, ShearedRectangle2, Trapez, Trapez2, FatArrow, and FatArrow2.
      • Use the ArrowNodeStyle for more flexible visualizations of these geometries.
    • Renamed Star5Up to Star5, removed old (down pointing) Star5.
      • Use the factory methods on GeneralPathNodeStyle for stars and polygons with an arbitrary number of points/edges and configurable rotation angle.
    • Removed the following values from TextWrappingShape: ShearedRectangle, ShearedRectangle2, Trapez, and Trapez2.
    • Most item style implementations have become sealed, and their renderers have been removed from the API. Instead of subclassing the styles or their renderers, custom style implementations should use delegation instead. For this the new DelegatingNodeStyle and CompositeNodeStyle style variants may be used.
    • The item style constructors taking a custom renderer implementation have been removed. Instead, a custom style should be implemented that may delegate to one of the library styles.
    • The TableNodeStyle.CopyBackgroundStyle method has been removed. The Clone method doesn't deep copy the background style but just uses it for the clone as well, which also was the previous default behavior.
    • The Wrapped property of CollapsibleNodeStyleDecorator, IndicatorNodeStyleDecorator, IndicatorEdgeStyleDecorator, IndicatorLabelStyleDecorator, IndicatorPortStyleDecorator, ShadowNodeStyleDecorator, and IconLabelStyle has been renamed to WrappedStyle.
    • The deprecated styles BevelNodeStyle, PanelNodeStyle and ShinyPlateNodeStyle have been removed.
    • The default StringFormat in LabelStyle now uses StringTrimming.EllipsisWord. Before, it was Character. It also uses StringFormatFlags.LineLimit as default FormatFlags. Before, no flag was set.

    Interaction

    Incompatible API Changes

    • CanvasControl's LastEventLocation property has been removed. Use LastPointerEvent.Location instead.
    • CanvasControl's LastInputEvent property has been renamed to LastPointerEvent to better reflect its type.
    • The ResourceKey and ComponentResourceKey classes have been removed. Their usages have been replaced, often using properties of type Pen or IObjectRenderer.
    • The PortRelocationHandle.GhostVisualizationPenKey has been replaced by a GhostVisualizationPen property.
    • The SnapLine.SnapLinePenKey has been replaced by a SnapContext.SnapResultPen property.
    • The MoveLabelInputMode class and its corresponding property on GraphEditorInputMode have been removed. Label movement is now handled directly by MoveInputMode. Most customizations related to label movement (as opposed to the move gesture in general) can now be done on LabelPositionHandler, instead.
    • The commands previously defined on GraphControl and CanvasControl are now located in class \GraphCommands. The suffix \Command has been dropped from their names.
    • KeyboardInputMode's AddHandler overloads have been renamed to AddRecognizerBinding and AddKeyBinding to clarify their usage. The AddCommand method has been renamed to AddCommandBinding to match the new naming.
    • KeyboardInputMode's RemoveCommand and RemoveHandler methods have been removed. Instead, the add methods now return a binding token which provides a Remove method to remove that binding.
    • Replaced Dummy in names with a more descriptive term. In particular:
      • In CreateEdgeInputMode, DummyEdge, DummyEdgeGraph, DummyTargetNode,, DummyTargetNodePort, UpdateDummyEdgeSourcePort, UpdateDummyEdgeTargetPort, GetDummyEdgeSnapLines, and CreateDummyBend have been renamed to PreviewEdge, PreviewGraph, PreviewEndNode, PreviewEndNodePort, UpdatePreviewEdgeStartPort, UpdatePreviewEdgeEndPort, GetPreviewEdgeSnapLines, and CreatePreviewBend.
      • The Visualization.Dummy enum value has been renamed to Visualization.Placeholder.
      • In PortRelocationHandle, CreateDummyEdge has been renamed to CreatePreviewEdge.
    • The NavigationInputMode.FindNearestItem method now gets the startItem as a parameter instead of the location of it, and this item is also included in the itemsToCheck parameter. Implementations may use the new GetReferenceLocation method to find the starting location and should make sure not to return the startItem itself.
    • The textProvider parameter for ToolTipInputMode's constructor has been removed. An event handler for the QueryToolTip event can be registered instead.
    • The return value of the DropInputMode.AdjustEffect method has been changed from bool to void. This method no longer determines if the mode will handle drag or drop events but only changes the drag/drop effect of given event args as its name implies. The DropInputMode.AcceptDrag method now determines if the mode will handle drag and drop events.
    • CreateEdgeInputMode's methods have been renamed:
      • GetClosestSourceCandidate to SelectClosestStartCandidate.
      • GetClosestCandidate to SelectClosestCandidate.
      • GetClosestTargetCandidate to SelectClosestEndCandidate.
    • CreateEdgeInputMode.StartPortCandidateHitRadius now is defined in view coordinates.
    • The event GraphEditorInputMode.LabelTextChanged has been changed to LabelEdited to reflect the broader scope of changes allowed during label editing. Similarly, GraphEditorInputMode.OnLabelTextChanged is now named OnLabelEdited.
    • Most methods, properties, and events related to label editing have been moved from GraphEditorInputMode to EditLabelInputMode: AutoRemoveEmptyLabels, HideLabelDuringEditing, TextEditorInputMode, TextEditorInputModeConfigurator, CreateLabel, CreateLabelCore, EditLabelCore, OpenTextEditor, LabelDeleted, LabelTextEditingStarted, LabelTextEditingCanceled, and ValidateLabelText. The events LabelEditing and LabelAdding have been moved to EditLabelInputMode and renamed to QueryLabelEditing and QueryLabelAdding, respectively, to clarify their purpose.
    • Most methods, properties, and events related to label editing have been moved from TableEditorInputMode to EditLabelInputMode: AutoRemoveEmptyLabels, HideLabelDuringEditing, TextEditorInputMode, TextEditorInputModeConfigurator, CreateLabel, CreateLabelCore, EditLabelCore, OpenTextEditor, LabelDeleted, LabelTextEditingStarted, LabelTextEditingCanceled, and ValidateLabelText. The events LabelEditing and LabelAdding have been moved to EditLabelInputMode and renamed to QueryLabelEditing and QueryLabelAdding, respectively, to clarify their purpose.
    • Removed callback methods which only raised the related events from classes CanvasControl and GraphControl, e.g., OnZoomChanged. Use the corresponding events instead, e.g., ZoomChanged.
    • Removed the factory methods for the sub-input modes from GraphInputMode, GraphViewerInputMode, GraphEditorInputMode, TableEditorInputMode, and TextEditorInputMode (e.g. CreateKeyboardInputMode). Set custom instances using the properties, instead.
    • Removed the factory methods for the ToolTip and TextBox properties on classes ToolTipInputMode and TextEditorInputMode, respectively. Set custom instances using the properties, instead.
    • Removed the methods GetBounds, GetVisual, GetVisualCreator, and IsHit from CanvasControl class. Use the respective methods of RenderTree class instead.
    • The ICommand interface and its implementations have been replaced with the enum Command.
    • Constants of ICommand have been replaced with equally named constants of enum Command.
    • The methods CanExecute and Execute and its CanExecuteChanged event in ICommand have been replaced with CanvasControl's CanExecuteCommand and ExecuteCommand methods and the CanExecuteCommandChanged event, respectively.
    • Custom commands can no longer be created. As an alternative, register handlers on KeyboardInputMode.
    • Renamed DoubleClickPolicy to ClickReportingPolicy.
    • Renamed ClickInputMode.DoubleClickPolicy to ClickReportingPolicy.
    • Renamed DoubleClickPolicy.InitialSingleAndDoubleClick to ClickReportingPolicy.Instant.
    • Renamed DoubleClickPolicy.DoubleClickOnly to WaitForDoubleClick.
    • Removed DoubleClickPolicy.BothSingleClicksAndDoubleClick.
    • Changed the default of ClickInputMode.ClickReportingPolicy to ClickReportingPolicy.Instant.
    • Removed the PreventNextDoubleClick method from ClickInputMode class. Use the Cancel method instead.
    • Replaced Mouse2DEventArgs and Touch2DEventArgs with PointerEventArgs.
    • Integrated TapInputMode into ClickInputMode. Touch input now also fires Clicked events.
    • Removed all ClickInputMode events except for Clicked. Click buttons and click count can be obtained from the ClickEventArgs.
    • Removed the events ItemTapped, ItemDoubleTapped, and CanvasTapped from GraphInputMode in favor of checking the PointerType on the corresponding Click event.
    • The HandleIsHitTouch and GetClosestHitHandleTouch methods of HandleInputMode have been removed in favor of the methods HandleIsHit and GetClosestHitHandle, which now handle all types of pointer devices.
    • The InputModeContext property has been removed from the IInputMode interface. In input mode implementations, the property has been renamed to ParentInputMode and changed to protected access to prevent incorrect usage.
    • Renamed "Source" to "Start" and "Target" to "End" in the following members of CreateEdgeInputMode class:
      • Renamed ResolveSourcePortCandidates to ResolveStartPortCandidates.
      • Renamed ResolveTargetPortCandidates to ResolveEndPortCandidates.
      • Renamed SourcePortCandidateChanged to StartPortCandidateChanged.
      • Renamed TargetPortCandidateChanged to EndPortCandidateChanged.
      • Renamed SourcePortCandidate to StartPortCandidate.
      • Renamed TargetPortCandidate to EndPortCandidate.
      • Renamed SnapToTargetCandidate to SnapToEndCandidate.
      • Renamed CancelGestureOnInvalidTarget to CancelGestureOnInvalidEnd.
      • Renamed SourceNodeDraggingFinishedRecognizer to StartPortOwnerDraggingFinishedRecognizer.
      • Renamed SourceNodeDraggingCursor to StartPortOwnerDraggingCursor.
      • Renamed ShowSourcePortCandidatesHitTestable to ShowStartPortCandidatesHitTestable.
      • Renamed OnSourcePortCandidateChanged to OnStartPortCandidateChanged.
      • Renamed OnTargetPortCandidateChanged to OnEndPortCandidateChanged.
      • Renamed SourcePortCandidateChanged to StartPortCandidateChanged.
      • Renamed TargetPortCandidateChanged to EndPortCandidateChanged.
      • Renamed GetSource to GetStartPortOwner.
      • Renamed GetTarget to GetEndPortOwner.
      • Renamed GetSourcePortCandidateProvider to GetStartPortCandidateProvider.
      • Renamed GetTargetPortCandidateProvider to GetEndPortCandidateProvider.
      • Renamed GetSourcePortCandidates to GetStartPortCandidates.
      • Renamed GetTargetPortCandidates to GetEndPortCandidates.
      • Renamed GetSourcePortCandidate(PointD) to GetStartPortCandidate.
      • Renamed GetSourcePortCandidate(IEnumerable<IPortCandidate>, PointD, bool) to SelectStartPortCandidate.
      • Renamed GetClosestCandidate to SelectClosestCandidate.
      • Renamed GetClosestSourceCandidate to SelectClosestStartCandidate.
      • Renamed GetClosestTargetCandidate to SelectClosestEndCandidate.
      • Renamed SourcePortCandidateHitRadius to StartPortCandidateHitRadius.
      • Renamed UpdateTargetLocation to UpdateEndLocation.
      • Renamed ShowTargetHighlight to ShowEndHighlight.
      • Renamed UpdateTargetHighlight to UpdateEndHighlight.
      • Renamed DummyTargetNode to PreviewEndNode.
      • Renamed DummyTargetNodePort to PreviewEndNodePort.
    • Renamed ShowPortCandidates.Source to Start and ShowPortCandidates.Target to End.
    • Removed CreateEdgeInputMode.CreateDummyEdgeGraph, CreateEdgeInputMode.CreateDummyEdge, CreateEdgeInputMode.CreateDummyTargetNode, CreateEdgeInputMode.CreateDummyTargetNodePort, CreateEdgeInputMode.DummySourceNodePort, CreateEdgeInputMode.UpdateDummyEdgeSourcePort, and CreateEdgeInputMode.UpdateDummyEdgeTargetPort.
    • Events which involve item changes triggered by input modes are now of type InputModeItemEventArgs instead of ItemEventArgs. These are the events:
      • CreateBendInputMode: BendCreated.
      • CreateEdgeInputMode: StartPortCandidateChanged, EndPortCandidateChanged, EdgeCreated, PortAdded, EdgeCreationStarted.
      • GraphEditorInputMode: LabelEdited, LabelAdded, NodeCreated, PortAdded.
      • ItemDropInputMode and inheritors: ItemCreated.
      • NavigationInputMode: GroupCollapsing, GroupCollapsed, GroupExpanding, GroupExpanded, GroupEntering, GroupEntered, GroupExiting, GroupExited.
      • TableEditorInputMode: DeletedItem.
      • EditLabelInputMode: LabelAdded, LabelEditingStarted, LabelEditingCanceled, LabelEdited.
      • StripeDropInputMode: StripeCreated.
    • Events which involve item deletion or structural changes triggered by input modes are now of type InputModeItemChangedEventArgs:
      • GraphEditorInputMode.DeletedItem: InputModeItemChangedEventArgs instead of ItemDeletedEventArgs.
      • GraphEditorInputMode.EdgePortsChanged: InputModeItemChangedEventArgs instead of EdgeEventArgs.
      • GraphEditorInputMode.NodeReparented: InputModeItemChangedEventArgs instead of NodeEventArgs.
      • EditLabelInputMode.LabelDeleted: InputModeItemChangedEventArgs instead of LabelEventArgs.
    • Removed the PortRelocationHandle.CreateDummyEdgeVisualCreator method. To change the preview edge's style overwrite PortRelocationHandle.CreatePreviewEdge instead.
    • Renamed GraphInputMode.ShouldSelectItem to ShouldSelect.
    • The event DeletedSelection of GraphEditorInputMode now uses ItemsEventArgs instead of SelectionEventArgs.
    • The static fields AllNodeCandidates and AllNodeAndEdgeCandidates on EdgeReconnectionPortCandidateProviders have been replaced by the factory methods FromAllNodeCandidates and FromAllNodeAndEdgeCandidates. The implementations now provide a port candidate for the unchanged port of the edge when collecting the port candidates from the IPortCandidateProvider instances of the nodes and edges.
    • The generic type of the IHitTester interface has been removed. Instead, a parameter of type GraphItemTypes has been added to its EnumerateHits method.
    • The HandleTypes enums has been refactored to a non-flaggable HandleType enum, and the values have been adjusted.
    • A Tag property has been added to the IHandle interface. yFiles does not use the property and initializes it with null, but decorating handles forward any values unmodified.
    • The protected virtual CreateEdgeCreationInputModeContext method on the CreateEdgeInputMode class has been removed. Use or override the CreateInputModeContext method, instead.
    • The protected Should- methods of the input modes have been removed and replaced by predicate properties.
    • The LassoSelectionEventArgs.SelectionPath property has been renamed to Path.
    • The core MarqueeSelect and LassoSelect methods of GraphEditorInputMode and GraphViewerInputMode, that take an enumerable and predicate, have been removed while the other MarqueeSelect and LassoSelect method got an additional parameter of type SelectionPolicy.
    • The LabelPositionHandler.SetPosition method has been removed.
    • The LabelPositionHandler.UseFinder property has been removed. Use the new UseParameterFinderRecognizer property instead.
    • The LabelPositionHandler.UseParameterFinder method has been renamed to ShouldUseParameterFinder.
    • The ToolTipQueryEventArgs class is now named QueryToolTipEventArgs to properly match the corresponding event's name.
    • The LabelPositionHandler.UseFinder property has been removed.
    • Method GetBendsInPath has been added to the IBendSelectionTester interface and is used to check for bends that should be lasso selected.
    • Method GetPortsInPath has been added to the IPortSelectionTester interface and is used to check for ports that should be lasso selected.
    • DiscardInvalidItems in ItemHoverInputMode has been renamed to IgnoreInvalidItems, and its behavior was reversed.
    • The DoStartEdgeCreation method on the CreateEdgeInputMode class is now called StartEdgeCreation.
    • The DoStartDrag method on the MoveInputMode class is now called StartDrag.
    • The BeginDragging method on the HandleInputMode class is now called StartDrag.
    • The AddLabel method on GraphEditorInputMode is now called StartLabelAddition.
    • The EditLabel method on GraphEditorInputMode is now called StartLabelEditing.
    • The MouseHoverInputMode class has been renamed to ToolTipInputMode.
    • The GraphInputMode.MouseHoverInputMode property has been renamed to ToolTipInputMode.

    Incompatible Behavior Changes

    • The default lookup of labels now returns an IPositionHandler implementation.
    • The LabelDropInputMode.IsValidLabelOwner method now only accepts instances of FreeLabelModel or that the draggedLabel's owner type matches the owner type e.g. INode, IEdge, or IPort.
    • The DropInputMode.AdjustEffect method no longer determines if the mode will handle drag or drop events but only change the drag/drop effect of given event args as its name implies. The DropInputMode.AcceptDrag method now determines if the mode will handle drag and drop events.
    • Unselected items can be moved by default.
    • Edge creation: by default, start port candidates are shown when hovering over a node.
    • GraphViewerInputMode / GraphEditorInputMode: the ClickHitTestOrder default value has been changed to GraphItemTypes.All which means that the default order is the Z-Order but with a prioritization for elements behind labels.
    • GraphViewerInputMode: The MoveViewportInputMode's priority has been changed to 190.
    • GraphEditorInputMode: The sub input mode's priorities have been changed to the following order: WaitInputMode, KeyboardInputMode, HandleInputMode, ClickInputMode, CreateEdgeInputMode, MoveSelectedItemsInputMode, MoveUnselectedItemsInputMode, CreateBendInputMode, MoveViewportInputMode, LassoSelectionInputMode, MarqueeSelectionInputMode, ItemHoverInputMode, NavigationInputMode, ContextMenuInputMode, NodeDropInputMode, LabelDropInputMode, PortDropInputMode, ToolTipInputMode, EditLabelInputMode.
    • In CreateEdgeInputMode it was previously possible to define a fallback for GetPortOwner if IHitTester was removed. This option for defining a fallback is removed and always returns null.
    • Improved the CreateBendInputMode behavior: Previously, dragging an existing bend triggered the BendCreated event, causing confusion and limiting event handling for new bend creation. This has been adjusted to ensure the event only fires when a new bend is created interactively.
    • Refined the event sequence of CreateEdgeInputMode to ensure consistency and symmetry between gesture cancellation and completion.
    • Reorganized the sequence to include EdgeCreationStarted only after the start node dragging has finished and the end port candidate is determined.
    • Adjusted the timing of the end port candidate update, which now occurs just before GestureFinishing, allowing users to apply final updates to the end port.
    • Ensured the following event order for gestures:
      • GestureStarting, GestureStarted.
      • Cancellation path: GestureCanceling, GestureCanceled.
      • Completion path: EdgeCreationStarted, GestureFinishing, EdgeCreated, GestureFinished.
    • The EdgeCreationStarted and EdgeCreated events provide now arguments of type ItemEventArgs<IEdge>.
    • NavigationInputMode now interprets the direction of arrow keys in view coordinates by default.
    • Edges can now be reconnected to other nodes per default. The old behavior can be restored by decorating the edge lookup with the provider returned by EdgeReconnectionPortCandidateProviders.FromSourceAndTarget.
    • The default value of EnableSnappingRecognizer in CreateEdgeInputMode, HandleInputMode, and MoveInputMode has been changed from CtrlUp to AltUp.
    • The default value of DisableSnappingRecognizer in CreateEdgeInputMode, HandleInputMode, and MoveInputMode has been changed from CtrlDown to AltDown.
    • The default value of CenterReshapeRecognizer in NodeReshapeHandleProvider and ReshapeHandlerHandle has been changed from AltIsDown to CtrlIsDown.
    • The default value of ReparentNodeHandler.ReparentRecognizer has been changed from ShiftIsDown to CtrlIsDown.
    • The GraphInputMode.FindItems method now considers the actual z-order of the hit items.
    • Orthogonal edge editing now has to be enabled for each edge that should be edited orthogonally instead of enabling it for all edges by setting the GraphEditorInputMode.OrthogonalEdgeEditingContext property. This can be done by enabling the PolylineEdgeStyle.OrthogonalEditing properties of the styles, by setting an apropriate FallbackEdgeHelperProvider on the used OrthogonalEdgeEditingContext or by providing an IOrthogonalEdgeHelper in the edges' lookup.
    • The MultiSelectionRecognizer of GraphEditorInputMode and GraphViewerInputMode are not used anymore for marquee and lasso selection. Instead, MarqueeSelectionInputMode and LassoSelectionInputMode have their own modifiers for different selection policies.
    • Changed the default of TextEditorInputMode.TextBoxPlacementPolicy to TextBoxPlacementPolicy.MoveTextBox.
    • CanvasControl.UpdateContentBounds now only considers the items in the RenderTree.ContentGroup instead of the RootGroup when calculating the new bounds.
    • The default value of CreateEdgeInputMode.PortCandidateResolutionRecognizer has been changed from ShiftIsDown to CtrlIsDown.
    • The default value of the CreateEdgeInputMode.EnforceBendCreationRecognizer has been changed form CtrlIsDown to AltIsDown.
    • The default edge lookup doesn't provide an IPositionHandler anymore so dragging a selected edge doesn't move all its bends.
    • GraphEditorInputMode's MoveUnselectedItemsInputMode now only moves unselected items. Previously it also moved selected items despite its name.
    • The default value of TextEditorInputMode.AutoCommitOnFocusLost is now true . This means that the text of an edited label is commited instead of discarded when the text box loses the focus e.g. by clicking on the canvas.
    • During edge creation, bends are now created when pressing a mouse button instead of releasing it. This way, when starting edge creation by dragging the mouse from a node, no bend is created on the first mouse button release, which was an often unwanted behavior.
    • The default values of the NodeReshapeHandleProvider.RatioReshapeRecognizer property and ReshapeHandlerHandle has been changed to null. If no custom recognizer is set, ReshapeHandlerHandle uses the new HandleInputMode.IsDirectionalConstrained method instead if a HandleInputMode is found in the IInputModeContext.
    • GraphEditorInputMode.AllowGroupingOperations is now true by default.

    Snapping

    Incompatible API Changes

    • LabelSnapContext has been removed, and label snapping is now handled by GraphSnapContext:
      • The GraphEditorInputMode.LabelSnapContext property and the GraphEditorInputMode.OnLabelSnapContextChanged method have been removed.
      • The CollectLabelSnapLineEventArgs class has been removed.
      • Configuration properties of LabelSnapContext have been moved to GraphSnapContext and renamed.
      • The ILabelSnapContextHelper interface and the LabelSnapContextHelper class have been removed. Instead, the ILabelSnapResultProvider interface and the classes LabelSnapResultProvider and LabelSnapReferenceProvider have been added.
      • The LabelDecorator.LabelSnapContextHelperDecorator property has been replaced by the properties SnapReferenceProvider and SnapResultProvider.
    • CollectGraphSnapLinesEventArgs has been renamed to CollectSnapReferencesEventArgs. Its methods AddFixedNodeSnapLine, AddFixedSegmentSnapLine, AddPortSnapLine, and AddAdditionalSnapLine have been removed and replaced by the single AddSnapReference method.
    • GraphSnapContext has been refactored, and the following members have changed:
      • The properties SnapNodesToSnapLines, SnapBendsToSnapLines, SnapSegmentsToSnapLines, SnapBendAdjacentSegments, SnapPortAdjacentSegments, SnapEdgeLabels, SnapNodeLabels, and SnapPortLabels have been replaced by the new properties SnappableItems and GridSnappableItems.
      • The CollectVisibleNodePairs method now takes the CollectSnapReferencesEventArgs the snap references shall be added to.
      • The methods FindSameWidthEntries and FindSameHeightEntries have been removed. Instead, the SnapSize references describing to which size items can snap are provided by the SnapReferences property. Similarly, the FixedNodeSnapLines, FixedSegmentSnapLines, FixedPortSnapLines, and AdditionalSnapLines properties have been removed. The SnapReferences property should be used instead.
    • The SnapLine.ResourceKey property has been removed along with most of the static ResourceKey members used for snapping. Instead, a VisualizationType property of the enum type SnapReferenceVisualizationType is used to describe which visualization should be used for the SnapLine.
    • Most subclasses of SnapLine have been removed as they only provided properties used for the visualization that are now available on SnapResult.
    • The SnapTypes enum used by SnapResult has been replaced by the new SnapConstraint class that supports finding common snap locations for SnapResults with different constraints.
    • The Snap and IsSnapped methods of SnapResult have been removed. Instead, a Constraint property of type SnapConstraint has been added that is used to merge possible SnapResults and check if a location is valid for a given SnapResult.
    • The SnapResult.GetVisualCreator method has been removed and is replaced by the new ObjectRenderer property.
    • The factory methods of SnapResults have been adjusted:
      • CreatePointSnapResult has been renamed to CreateSnapResult.
      • CreateSnapLineSnapResult has been renamed to CreateLineSnapResult.
      • CreateLabelSnapResult has been removed.
    • The methods of the snap result providers have been adjusted to support the new SnapReference API. Most methods now take one instance of a SnapReference subclass like SnapLine or SnapGrid.
    • The classes SnapState, ArrowContainer, and ArrowControl have been removed.
    • The type of the SnapContext properties of all input modes has been changed from SnapContext to GraphSnapContext.
    • Most classes and members that had SnapLine in their name have been renamed to include SnapReference instead.
    • The ReshapeRectangleContext.InitialBounds property has been renamed to InitialLayout.
    • The GraphEditorInputMode.SnapContext property is now set per default and may not be null. It is disabled per default.
    • Renamed the GraphSnapContext.NodeToNodeDistance property to NodeDistance.
    • Renamed the GraphSnapContext.EdgeToEdgeDistance property to EdgeDistance.

    Clipboard

    Incompatible API Changes

    • IClipboardHelper's methods Cut, Copy, and Paste have been renamed to OnCut, OnCopied, and OnPasted.
    • IClipboardHelper's methods Cut and Copy don't return an object anymore and the object parameter of Paste and ShouldPaste has been removed. For Cut/Copy and Paste the same IClipboardHelper method is now used so any state that should be transfered can be stored in a custom implementation.
    • IClipboardHelper has new methods ShouldDuplicate and OnDuplicated which have to be implemented, now.
    • GraphClipboard`s methods GetMemento and GetClipboardHelper have been removed.
    • GraphClipboard's protected Copy and Paste methods now take the new ClipboardOperationContext as parameter instead of the sourceGraphs and filter predicates.
    • The methods CreateClipboardGraph, CreateToClipboardCopier, CreateFromClipboardCopier, CreateDuplicateCopier, and CreateDefaultClipboardIdProvider from GraphClipboard that were used to lazily initialize the corresponding properties have been removed.
    • GraphClipboard.Paste now takes an enumerable of IModelItem as targetOwners parameter instead of a targetFilter predicate.
    • GraphClipboard.IsFoldingStateElement is now an instance method and doesn't have an owner parameter anymore.
    • ElementCopiedCallback has been renamed to ItemCopiedCallback.
    • GraphViewerInputMode's ElementsCopied event has been renamed to ItemsCopied.
    • GraphEditorInputMode's ElementsCopied, ElementsCut, ElementsCopied, ElementsPasted and ElementsDuplicated events were renamed to ItemsCopied, etc.
    • On GraphClipboard, the ElementsCut, -Cutting, -Copying, -Copied, -Pasting, -Pasted, -Duplicating, and -Duplicated events were renamed to Items instead of Elements and use the new GraphClipboardEventArgs. Also, the OnElementCut, -Copied-, and -Pasted methods were renamed to start with OnItem and take an additional ClipboardOperationContext as a parameter.
    • GraphClipboard.RemoveElements has been renamed to RemoveItems.
    • GraphClipboard.IsFoldingStateElement has been renamed to IsFoldingStateItem.
    • GraphClipboard.CreateContext now takes an additional IInputModeContext parameter that should be returned in the new contexts lookup.
    • The GraphClipboard.ClipboardGraph property is now read-only.
    • The parameters of GraphClipboard's Copy method have been rearranged so default values for optional parameters could be added.
    • For consistency reasons, the property GraphClipboard.Empty is now called IsEmpty.
    • GraphControl instances now use a shared GraphClipboard per default. To revert to the previous behavior, a new GraphClipboard instance can be set on each GraphControl.
    • GraphClipboard's Cut, Copy, Paste, and Duplicate methods now use an IEnumerable instead of a filter predicate to determine the subgraph to copy.
    • GraphClipboard's Create*Filter methods have been removed.
    • The GraphClipboard now uses ClipboardGraphCopier instances for its ToClipboardCopier, FromClipboardCopier, and DuplicateCopier.
    • The Graph.ParentNodeDetectionModes has been reduced to contain only the mainly used options. The option Root has been renamed to None, and the options AllowSelf and Force as well as the ModeMask and ModifierMask have been removed. The GetTargetNode method can be overridden if the reduced modes are not suitable and may call the new FindParentByPreviousParent method to simulate the old Force setting.
    • GraphClipboard`s GetTarget methods now take an additional ClipboardOperationContext parameter, and the GetTarget overload for nodes also takes a pasteLocation as an additional parameter.
    • The GraphClipboard.PasteDelta property has been renamed to PasteOffset. It is now modified by the GraphClipboard's Cut , Copy, Paste, and Duplicate methods instead of the corresponding methods on GraphEditorInputMode.
    • The GraphEditorInputMode.PasteDelta property has been removed and replaced by the new GraphClipboard.PasteOffsetIncrement property.
    • The values LabelModelParameter and PortLocationModelParameter have been removed from the CloneTypes enum as those parameter are typically immutable, so cloning them has no effect.

    Folding

    Incompatible API Changes

    • Interface IFolderNodeConverter has a new UpdateGroupNodeState method.
    • Interface IFoldingEdgeConverter has a new UpdateMasterEdges method.
    • FolderNodeConverter now relies on FolderNodeDefaults to configure initialization and update of states.
    • FoldingEdgeConverter and MergingFoldingEdgeConverter now rely on FoldingEdgeDefaults to configure initialization and update of states.
    • The FoldingLabelOwnerState.Remove method(.
    • FoldingLabelState) was renamed to RemoveLabel and the FoldingLabelState.RemoveBend method(FoldingBendState) was renamed to RemoveBend.

    Incompatible Behavior Changes

    • Tags are not automatically the same on group and folder nodes or master and folding edges (master and view states). Instead, they have to be synchronized using the IFolderNodeConverter and IFoldingEdgeConverter implementations. The default implementations already synchronize the tags.
    • In the graph of a folding view, the CreateGroup method now always creates a group even if the isExpanded predicate specified in the FoldingManager.CreateFoldingView method specifies otherwise. Create the group on the master graph if you want the predicate to be respected.

    Lookup

    Incompatible API Changes

    • Renamed LookupDecorator.SetImplementation to AddConstant.
    • Renamed LookupDecorator.SetFactory to AddFactory.
    • Renamed LookupDecorator.SetImplementationWrapper to AddWrapperFactory.
    • Renamed LookupDecorator.HideImplementation to Hide.
    • Renamed lookup decorators in general by removing the Decorator suffix. For example, graphDecorator.EdgeDecorator.PositionHandlerDecorator.HideImplementation is now graphDecorator.Edges.PositionHandler.Hide.
    • Removed LookupDecorator.NullIsFallback. Instead, use the predicate of the AddFactory method or return the original instance in the AddWrapperFactory method.
    • Removed LookupDecorator.DecorateNulls. Instead, implement the desired behavior in AddWrapperFactory.
    • Removed the SimpleNode.LookupImplementation property, SimpleEdge, SimpleBend, SimpleLabel and SimplePort. Instead, use the new GetDecorator method to adjust the item's lookup.
    • The SimpleNode, SimpleEdge, SimpleBend, SimpleLabel and SimplePort classes are now sealed, and their Lookup method is no longer virtual. To adjust the item's lookup, use the GetDecorator method.
    • Removed CanvasControl.InputModeContextLookup and CanvasControl.InputModeContextLookupChain. Instead, use the new GetInputModeContextDecoratorFor method to decorate the input mode context lookup.
    • The EdgeDecorator.GetDecoratorFor method, NodeDecorator, etc. no longer has the nullIsFallback and decorateNull parameters.
    • The node parameter of the methods in the interfaces IGroupPaddingProvider, INodeSizeConstraintProvider, and IGroupBoundsCalculator has been removed.
    • The edge parameter of the methods in the interfaces IEdgePortHandleProvider, IBendCreator, and IOrthogonalEdgeHelper has been removed.
    • The label parameter of the methods in the interfaces ILabelModelParameterProvider, and ILabelModelParameterFinder has been removed.
    • The model item parameter in ISnapReferenceProvider.AddSnapReferences has been removed.
    • The ILabelModelParameter parameter of ILabelModel.GetContext has been removed and ILabelModel doesn't extend ILookup anymore. Instead, the lookup returned by GetContext should be used for all lookup calls.
    • The IPortLocationModelParameter parameter of IPortLocationModel.GetContext has been removed and IPortLocationModel doesn't extend ILookup anymore. Instead, the lookup returned by GetContext should be used for all lookup calls.
    • The OrthogonalEdgeEditingContext.GetOrthogonalEdgeHelper method has been replaced by the FallbackEdgeHelperProvider and OrthogonalEdgeHelperProvider properties.
    • The INodeInsetsProvider interface was renamed to IGroupPaddingProvider.
    • The methods SetLookupImplementation and GetLookup have been removed from DefaultGraph. Instead the Lookup method should be overridden if the default lookup behavior should be replaced.
    • The methods SetLookup and GetLookup have been removed from GraphWrapperBase. Instead, the Lookup method should be overridden if the default lookup behavior should be replaced.

    GraphML

    Incompatible API Changes

    • The methods GraphMLIOHandler.AddInputMapperFuture and GraphMLIOHandler.AddInputHandlerFactory have been removed, together with their support classes.
    • The AddRegistryInputMapper and AddRegistryOutputMapper methods have been removed from GraphMLIOHandler, since the MapperRegistry has been removed. To read or write additional per-item data, use the AddInputMapper or AddOutputMapper methods, instead.

    View-Layout-Bridge

    Incompatible API Changes

    • The properties LayoutExecutor.SelectionModel and LayoutGraphAdapter.SelectionModel have been removed, meaning that selected items of the IGraph are no longer automatically marked in the LayoutGraph via keys like the former LayoutKeys.AffectedNodesDpKey. If the selected items should be marked for a specific key of layout algorithms, then these items can always be provided via the specific LayoutData property of the layout algorithms.
    • Removed the ContextItemMapping class.
    • Renamed the LayoutExtensions.MorphLayout method to ApplyLayoutAnimated.
    • Renamed the LayoutExecutor.Duration property to AnimationDuration.
    • Renamed the LayoutExecutor.CreateMorphAnimation method to CreateLayoutAnimation.
    • The LayoutGraphAdapter.PortDummyNodeDpKey constant has been renamed to PortHelperNodeDataKey.
    • Renamed ItemMapping.Delegate to MapperFunction.
    • Renamed ItemCollection.Delegate to Predicate.
    • Removed key LayoutGraphAdapter.OriginalTagDpKey. Use the Tag property of the layout items instead to get the original tag associated to the original IGraph items.
    • Renamed the LayoutExecutor.Duration property to AnimationDuration.
    • Replaced LayoutExecutor.LabelPreferredPlacementPolicy with ItemMapping LayoutExecutor.LabelPlacementPolicies.
    • Renamed Enum LabelPreferredPlacementPolicy to LabelPlacementPolicy.
    • Removed value FromDescriptor. PreferredPlacementDescriptors are now automatically considered when specified through LayoutDatas.
      • Renamed value FromModel to PreferModel.
      • Renamed value FromParameter to PreferParameter.
      • Added value KeepParameter, which suppresses the write-back of label positions to the view graph.
    • Replaced LayoutGraphAdapter.LabelPreferredPlacementPolicy with ItemMapping LayoutGraphAdapter.LabelPlacementPolicies.
    • Changed property PortAdjustmentPolicy of LayoutExecutor class to an ItemMapping PortAdjustmentPolicies which allows for different values for each port. The default is PortAdjustmentPolicy.Lengthen.
    • Changed property PortAdjustmentPolicy of LayoutGraphAdapter class to an ItemMapping PortAdjustmentPolicies which allows for different values for each port. The default is PortAdjustmentPolicy.Lengthen.
    • LayoutExecutor.AutomaticEdgeGrouping has been removed. Edges at the same port are now always automatically port grouped unless port groups have been defined explicitly.
    • LayoutGraphAdapter.AutomaticEdgeGrouping has been removed. Edges at the same port are now always automatically port grouped unless port groups have been defined explicitly.
    • The TableLayoutConfigurator.Prepare and LayoutExecutor.PrepareTableLayout methods now return a PartitionGridData instance.
    • Boolean LayoutExecutor.FixPorts property is replaced by an ItemMapping PortPlacementPolicies, that allows to specify a policy for the handling of each individual port.

    Incompatible Behavior Changes

    • The LayoutGraphAdapter class does no longer offer a method to create a layout graph several times but is now meant to create exactly one layout graph copy which can be accessed via the LayoutGraph property and initialized with method LayoutGraphAdapter.Initialize. After initialization, changing properties of the LayoutGraphAdapter has no effect anymore.
    • Edges at the same port are now always automatically port grouped unless port groups have been defined explicitly.

    Layout

    Incompatible API Changes

    • Replaced usages of the IComparer interface with Comparison function delegates.
    • Removed the IDataProvider interface and refactored the whole way data is registered with a LayoutGraph instance. The replacement of IDataProvider is the generic IMapper interface. It allows setting and getting data via an indexer.
      • Removed the methods Graph.AddDataProvider and RemoveDataProvider. Data is now registered and removed using the methods on the new LayoutGraphContext class (e.g. AddItemData, AddData, Remove).
      • Removed the Graph.DataProviderKeys property.
    • Removed the class Maps.
    • The nested Segment class of BorderLine is now the unnested BorderLineSegment class, and some of its members have been changed:
      • Renamed Grow to Enlarge, AddOffset to AddPositionOffset, Min to MinPosition and Max to MaxPosition.
      • Removed the BorderLine.AdoptValues method.
      • Converted BorderLine.FirstSegment, BorderLine.LastSegment, BorderLine.Segment.Prev and BorderLine.Segment.Next from methods to read-only properties, and renamed Prev to Previous.
      • Removed BorderLine.Prev and BorderLine.Next. Use methods BorderLineSegment.Previous and BorderLineSegment.Next instead.
    • The MultiStageLayout class has been removed from the API. The HierarchicalLayout (formerly HierarchicLayout), OrganicLayout, OrthogonalLayout, TreeLayout, RadialTreeLayout (formerly BalloonLayout), SeriesParallelLayout, RadialLayout, CompactDiskLayout, and RadialGroupLayout (formerly CactusGroupLayout) classes now directly implement ILayoutAlgorithm. These classes offer a new LayoutStages property that allows to access the mutable stack of ILayoutStage instances associated with the respective algorithm. In addition, the offer different new properties to directly access frequently used stages.
    • The read/write properties MinimumSizeGroupBoundsCalculator.MinimumNodeSizeDpKey and InsetsGroupBoundsCalculator.GroupNodeInsetsDpKey have been removed. The bounds calculator classes now always use the values defined via the keys LayoutKeys.MinimumGroupNodeSizeDataKey and LayoutKeys.GroupNodePaddingDataKey. Using the IGraph API, the insets and minimum sizes are registered automatically, so that this change has no effect.
    • The read/write properties SubgraphLayout.AffectedNodesDpKey and SubgraphLayout.AffectedEdgesDpKey have been removed. They were replaced by static read-only keys SubgraphLayoutStage.SubgraphNodesDataKey and SubgraphLayoutStage.SubgraphEdgesDataKey.
    • PortConstraints and PortCandidates have been unified and renamed to LayoutPortCandidate.
    • PortDirections and PortSide have been unified as PortSides, and the enum values of the sides have been renamed.
    • PortCandidateSets have been replaced by NodePortCandidates, and collections of PortCandidates for edges have been replaced by EdgePortCandidates.
    • The port-related settings in the LayoutData classes have been combined into a sub-LayoutData Ports.
    • The keys in PortConstraintKeys have been moved to LayoutKeys.
    • The SequentialLayout.Layouts property is now a read-only List<ILayoutAlgorithm>. The AppendLayout, AppendLayouts, and RemoveAll methods have been removed as their functionality is now handled by the list methods.
    • Replaced properties XOffset and YOffset of the PortCandidate class by a single property Offset of type PointD.
    • Renamed Graph.ReInsertNode and ReInsertEdge to LayoutGraph.Reinsert.
    • From LayoutGraphHider, the FireGraphEvents and Graph properties, and the HideEdges, HideSelfLoops, SimplifyGraph, and HideMultipleEdges methods have been removed. Also, all methods to hide and unhide various collections of nodes or edges have been replaced by Hide and Unhide methods that get an IEnumerable of Node or Edge.
    • The classes SelfLoopRouter and ParallelEdgeRouter have been moved from the yWorks.Layout namespace to the yWorks.Layout.Router namespace.
    • Removed the NodeHalo class. Halos are now specified as InsetsD and called node margins. in the corresponding LayoutData (e.g. HierarchicalLayoutData.NodeMargins).
      • The properties previously named NodeHalos have been renamed to NodeMargins for the following classes: AlignmentStageData, CircularLayoutData, CompactDiskLayoutData, ComponentLayoutData, RadialGroupLayoutData, RecursiveGroupLayoutData, HierarchicalLayoutData (formerly HierarchicLayoutData), GenericLabelingData (formerly LabelingData), OrganicLayoutData, OrthogonalLayoutData, ClearAreaLayoutData, FillAreaLayoutData, PartialLayoutData, RadialLayoutData, CurveRoutingStageData, TabularLayoutData, EdgeRouterData, RadialTreeLayoutData (formerly BalloonLayoutData), TreeLayoutData.
      • Renamed AsIsLayerer.NodeHalo to FromSketchLayerAssigner.NodeMargin.
      • Renamed TemporaryGroupDescriptor.Halo to Margins.
      • Renamed NodeHalo.NodeHaloDpKey to LayoutKeys.NodeMarginDataKey.
    • Renamed LayoutExecutor.TargetBoundsInsets to TargetBoundsPadding.
    • Renamed GroupingKeys.GroupNodeInsetsDpKey to GroupNodePaddingDataKey and moved the key to LayoutKeys.
    • Renamed GroupingKeys.MinimumNodeSizeDpKey to LayoutKeys.MinimumGroupNodeSizeDataKey.
    • Renamed InsetsGroupBoundsCalculator.DefaultInsets to GroupBoundsCalculator.DefaultPadding and InsetsGroupBoundsCalculator.ConsiderNodeHalos to GroupBoundsCalculator.ConsiderNodeMargins.
    • Renamed TemporaryGroupDescriptor.Insets to Padding.
    • The FamilyTreeLayout class has been removed.
    • Removed the LayoutGraphUtilities class. The new Edge.ResetPath method replaces LayoutGraphUtilities.ResetPath method. The new ParallelEdgeRouter.RouteEdgesParallel method replaces LayoutGraphUtilities.RouteEdgesParallel method.
    • Methods LayoutGraphUtilities.GetBoundingBox were combined to one more general, moved to LayoutGraph class and made an instance method.
    • Renamed AbortHandler to LayoutAbortController.
    • The MaximumDuration property is renamed to StopDuration in all public API usages.
    • StopDurations that were of type long are now of type TimeSpan.
    • StopDurations now affect pre-and post-processing steps defined directly on the layout algorithms, as opposed to only the core algorithm.
    • The LayoutAbortController (formerly AbortHandler) is no longer available as a property on LayoutData classes but only on the LayoutExecutor.
    • Static methods on LayoutAbortController (formerly AbortHandler) like GetFromGraph have been removed since the handler instance can easily be accessed via the LayoutGraphContext when working with LayoutGraph.
    • The default values of properties LayoutAbortController.StopDuration and LayoutAbortController.CancelDuration has been changed from TimeSpan.Zero to TimeSpan.MaxValue. Previously, Zero was interpreted as unlimited time, which is not the case anymore.
    • The default value of the algorithm properties RankAssignment.MaximumDuration and NodeAggregation.MaximumDuration (now called StopDuration) has been changed from TimeSpan.Zero to TimeSpan.MaxValue. Zero is no longer interpreted as an unrestricted running time but is the shortest possible time.
    • Renamed BorderLine.CreateMin to CreateMinimum.
    • Renamed BorderLine.CreateMax to CreateMaximum.
    • Removed the YPointPath class. Instead of this class an array or more generally an IEnumerable of type PointD[] is now used in API members.
      • Changed value to of HierarchicLayout.AlternativeEdgePathDpKey, ClearAreaLayout.ExpandedNodeOriginalEdgePathDpKey and GivenCoordinatesStage.EdgePathDpKey to IEnumerable<PointD>.
      • Changed BusDescriptor properties BusPoints and ComputedBusPoints to type PointD[].
    • Updated the constructor of DpKeyBase and subclasses to accept a single string parameter 'ID' for unique identification.
      • Removed properties DpKeyBase.DeclaringType and DpKeyBase.Name.
      • Made DpKeyBase class abstract.
    • Renamed GraphLayoutLineWrapper to LineWrappingStage.
    • Renamed HideGroupsStage to GroupHidingStage.
    • Renamed TemporaryGroupNodeInsertionStage to TemporaryGroupInsertionStage and the respective data class from TemporaryGroupNodeInsertionData to TemporaryGroupInsertionData.
    • Renamed BorderLineSide to Side, moved to namespace Layout and renamed its values: North to Side.Top, East to Side.Right, South to Side.Bottom, and West to Side.Left.
    • Moved BorderLine and BorderLineSegment to namespace Layout.
    • The methods PortCalculator.CalculatePorts and PortCalculator.EqualsEps have been removed.
    • The following methods have been removed from the ReverseEdgesStage: ReverseEdgesStage.FindReversedTreeEdges, ReverseEdgesStage.ReverseEdge and ReverseEdgesStage.ReverseEdges.
    • The HandleNaNCoordinatesStage has been removed.
    • LayoutMultiplexer has been removed. The features of ComponentLayout (ComponentLayoutDataKey) or RecursiveGroupLayout (GroupNodeLayoutDataKey) can be used instead.
    • Merged MinimumSizeGroupBoundsCalculator and InsetsGroupBoundsCalculator into the new GroupBoundsCalculator class.
    • Renamed MirrorModes to MirroredOrientations and OrientationLayout.MirrorMode to MirroredOrientations.
    • The API names to define routing styles throughout the layout algorithms have been streamlined and made more consistent. Properties on layout algorithms have all been renamed to EdgeRoutingStyle and those on edge-specific classes have been renamed to RoutingStyle.
      • The Polyline.EdgeRoutingStyle enum has been renamed to Router.RoutingStyle.
      • The Tree.EdgeRoutingStyle enum has been renamed to SingleLayerSubtreePlacerRoutingStyle.
      • The LayeredRoutingStyle enum has been renamed to LevelAlignedSubtreePlacerRoutingStyle.
      • The Radial.EdgeRoutingStrategy enum has been renamed to Radial.RoutingStyle.
      • The Partial.EdgeRoutingStrategy enum has been renamed to Partial.RoutingStyle.
      • The Hierarchic.EdgeRoutingStyle enum has been renamed to Hierarchical.RoutingStyle while the old RoutingStyle class has been renamed to RoutingStyleDescriptor.
    • Removed the GraphTransformer class; use factory methods from LayoutTransformations class instead to create stages that apply transformation operations on a LayoutGraph.
    • The CopiedLayoutGraph class was removed from the API. To create a copy of a layout graph, the new factory LayoutGraph.CreateCopy method may be used.
    • LayoutGraphHider: Method names have been standardized for consistency. Collection parameters and return values are now of type IEnumerable. Methods with non-nullable parameters will now throw an exception if passed null values.
    • Renamed EdgeBundlingStage to BundledEdgeRouter.
    • The classes FixPortLocationStage and FixPortLocationStageData have been removed from the library. To correct the port locations after applying a layout use the PortPlacementStage class.
    • PortPlacementStage.PathCorrection has been replaced by PortPlacementStage.RouteCorrectionPolicy of enum type RouteCorrectionPolicy.
    • The utility PortConstraintConfigurator class has been removed.
    • The classes ChannelEdgeRouter, OrthogonalPatternEdgeRouter and OrthogonalSegmentDistributionStage have been removed from the library. Their functionality is superseded by the EdgeRouter routing algorithm.
      • To configure the EdgeRouter to generate a style that is similar to the removed ChannelEdgeRouter, set the StopDuration property to zero and use the predefined penalty configuration EdgeRouterCosts.LowQuality. It is however not compatible with advanced features like integrated edge label placement.
    • Removed NormalizeGraphElementOrderStage. Use NodeComparison and EdgeComparison of LayoutExecutor instead.
    • The SnapOuterPortsToNodeBorderStage class has been removed.
    • The CompositeLayoutStage class has been removed. If a complex composition of layout stages is required, the new LayoutStageStack class can be used instead. To get an ILayoutAlgorithm that is then applied like CompositeLayoutStage was before, LayoutStageStack.LinkCoreLayouts method must be called.
    • The BufferedLayout class has been removed. To apply a layout algorithm on a copy of a LayoutGraph instance use LayoutGraph.CreateCopy method to get a copy, then apply the layout on it and, finally, write back the result using LayoutGraphCopyData.CommitLayoutToOriginalGraph.
    • The AbortHandler.CheckFailed property has been removed. To achieve the same functionality, the LayoutAbortController (new name of the AbortHandler) can be subclassed, overriding its Check method which allows to detect calls to that method.
    • The OrientationLayout class has been renamed to OrientationStage.
      • Furthermore, the following methods have been removed from that class: IsOrientationMirrored, Transform, PrepareTransform, CompleteTransform, CreateOrientedNodeHalo, CreateOrientedInsets and CreateOrientedNodeSize.
    • The port-related properties of the layout data classes (SourcePortGroupIds, TargetPortGroupIds, SourcePortCandidates, TargetPortCandidates) have been moved to a sub-data accessible via the property Ports.
    • Removed public methods HideGroupNodes and UnhideGroupNodes of GroupHidingStage.
    • Removed LayoutKeys.NodeIdDpKey and LayoutKeys.EdgeIdDpKey.
    • The GraphDpKey class was replaced by ValueDataKey.
    • The TemporaryGroupDescriptor used by TemporaryGroupInsertionStage class to define temporary group nodes now does not allow that properties Insets, MinimumSize and Margins (formerly Halo) are null anymore. Previously this was the default which is now InsetsD.Empty, SizeD.Empty and InsetsD.Empty, meaning that the behavior does not change.
    • Removed SplitEdgeStage.
    • Removed the classes PartitionLayout and PartitionLayoutData.
    • Renamed BendConverter to BendSubstitutionStage.
    • GraphPartitionManager is removed, LayoutGraphHider provides the same functionality.
    • PortCalculator, IIntersectionCalculator, and IntersectionCalculatorKeys have been removed. Instead, the LayoutExecutor.PortAdjustmentPolicy property should be set to a suitable value.
    • The OrientationLayout.HorizontalOrientation property has been removed. To check for a horizontal orientation, check if Orientation property equals LayoutOrientation.LeftToRight or LayoutOrientation.RightToLeft.
    • Renamed GivenCoordinatesStage to GivenCoordinatesLayout.
    • Renamed GivenCoordinatesStageData to GivenCoordinatesLayoutData.
    • Removed the look-up keys GroupingKeys.GroupDpKey, GroupingKeys.NodeIdDpKey and GroupingKeys.ParentNodeIdDpKey which were necessary to define grouping information for LayoutGraph instances. This can now be achieved via the helper LayoutGraphGrouping class or directly via instance methods such as LayoutGraph.SetIsGroupNode.
    • The public constructors of ItemMapping and ItemCollection have been removed. Instead the instances returned by the LayoutData properties should be used to configure the LayoutData.
    • The optional ItemMapping parameter of GenericLayoutData.AddItemMapping has been removed.
    • The optional ItemCollection parameter of GenericLayoutData.AddItemCollection has been removed.
    • Renamed the SubgraphLayout class to SubgraphLayoutStage and renamed the respective layout data class from SubgraphLayoutData to SubgraphLayoutStageData.
    • Methods and and properties with "BoundingBox" in their name have been renamed to include "Bounds" instead.

    Incompatible Behavior Changes

    • Method LayoutGraph.ReverseEdge now reverses the edge path too. To exchange only source and target of an edge use LayoutGraph.ChangeEdge method.

    Layout Data

    Incompatible API Changes

    • The value type of properties HierarchicalLayoutData.LayerIndicesResult, HierarchicalLayoutData.SequenceIndicesResult, HierarchicalLayoutData.GivenLayersIndices, RadialLayoutData.LayerIds and CircularLayoutData.CircleIdsResult has been changed from number to a nullable number value. Null as value means that nothing was published for an item.
    • The value type of the keys HierarchicalLayout.LayerIndexResultDataKey, HierarchicalLayout.SequenceIndexResultDataKey, GivenLayersAssigner.LayerIndexDataKey, RadialLayout.LayerIdDataKey and CircularLayout.CircleIdResultDataKey has been changed from number to a nullable number value. Null as value means that the nothing was published for an item.
    • Properties of type ItemMapping in LayoutData classes are now named using plural consistently.
    • The type SingleItem<TItem> was removed. Affected properties use ItemCollection<TItem> instead.

    Hierarchical Layout

    Incompatible API Changes

    • Renamed all types, methods, properties, and namespaces containing "hierarchic" to "hierarchical" including HierarchicLayout, which is renamed to HierarchicalLayout.
    • IPortConstraintOptimizer has been renamed to IPortCandidateSelector, and its methods have been renamed from OptimizeAfterLayering and OptimizeAfterSequencing to SelectAfterLayering and IPortCandidateSelector.SelectAfterSequencing.
    • PortConstraintOptimizerBase has been removed.
    • PortCandidateOptimizer has been renamed to PortCandidateSelector and its properties have been renamed: BackLoopPenalty to BackLoopCost, CrossingPenalty to CrossingCost, and OverUsagePenalty to OverUsageCost.
    • Renamed the DefaultDrawingDistanceCalculator.NodeToNodeDistance property to DrawingDistanceCalculator.NodeDistance.
    • Renamed the DefaultDrawingDistanceCalculator.EdgeToEdgeDistance property to DrawingDistanceCalculator.EdgeDistance.
    • Renamed the HierarchicLayout.NodeToNodeDistance property to NodeDistance.
    • Renamed the HierarchicLayout.EdgeToEdgeDistance property to EdgeDistance.
    • Renamed "Layerer" to "LayerAssigner" in the following types and members;
      • Renamed ILayerer to ILayerAssigner.
      • Moved HierarchicLayout.FixedElementsLayerer to HierarchicalLayoutCore and renamed to FixedElementsLayerAssigner.
      • Moved HierarchicLayout.FromScratchLayerer to HierarchicalLayoutCore and renamed to FromScratchLayerAssigner.
      • Renamed WeightedLayerer to WeightedLayerAssigner.
      • Renamed ConstraintIncrementalLayerer to ConstraintIncrementalLayerAssigner.
      • Renamed MultiComponentLayerer to MultiComponentLayerAssigner.
      • Renamed MultiComponentLayerer.SingleComponentLayerer to SingleComponentLayerAssigner.
      • Renamed AspectRatioComponentLayerer.SingleComponentLayerer to SingleComponentLayerAssigner.
      • Renamed TopologicalLayerer to TopologicalLayerAssigner.
      • Renamed AspectRatioComponentLayerer to AspectRatioComponentLayerAssigner.
      • Renamed BFSLayerer to BfsLayerAssigner.
      • Renamed GivenLayersLayerer to GivenLayersAssigner.
      • Renamed HierarchicLayoutCore.CreateIncrementalLayerer to CreateIncrementalLayerAssigner.
      • Renamed HierarchicLayoutData.BfsLayererCoreNodes to BfsLayerAssignerCoreNodes.
      • Renamed AsIsLayerer to FromSketchLayerAssigner.
    • Renamed GivenLayersLayerer.LayerIdDpKey to LayerIndexDataKey.
    • Renamed HierarchicLayoutData.GivenLayersLayererIds to GivenLayersIndices.
    • Removed HierarchicLayoutData.ConstraintIncrementalLayererAdditionalEdgeWeights.
    • Renamed AsIsSequencer to FromSketchSequencer.
    • Renamed LayerType to HierarchicalLayoutLayerType.
    • Renamed DefaultLayerSequencer to DefaultSequencer.
    • Methods ConstraintIncrementalLayerer.CheckConstraints, GivenLayersLayerer.Normalize have been removed.
    • The protected callback methods GetLayerAlignment and AssignNodesToSublayer have been removed from the CoordinateAssigner class (formerly called SimplexNodePlacer). Furthermore, its GetMinDistance method has been renamed to GetMinimumDistance.
    • The IDrawingDistanceCalculator.GetMinDistance method has been renamed to GetMinimumDistance.
    • HierarchicalLayout.GridSpacing: made grid spacing behavior consistent across all layouts by throwing an exception for negative values.
    • Renamed Hierarchic.NodeDataType to HierarchicalLayoutNodeType and its value Normal to HierarchicalLayoutNodeType.Regular.
    • Renamed Hierarchic.EdgeDataType to HierarchicalLayoutEdgeType and its value Normal to HierarchicalLayoutEdgeType.Regular.
    • Renamed LayerType.Normal to HierarchicalLayoutLayerType.Regular.
    • Renamed MergingPolicy to LayerMergingPolicy.
    • Renamed RankingPolicy to LayerRerankingPolicy and TopologicalLayerer.RankingPolicy to RerankingPolicy.
    • Renamed WeightHeuristic to SequencerWeightHeuristic.
    • Names containing PortBorderGap were renamed to now contain BorderToPortGapRatio.
    • Renamed EdgeLayoutDescriptor to HierarchicalLayoutEdgeDescriptor.
    • Renamed HierarchicLayout.EdgeLayoutDescriptor to DefaultEdgeDescriptor.
    • Renamed and moved HierarchicLayoutCore.EdgeLayoutDescriptorDpKey to HierarchicalLayout.EdgeDescriptorDataKey.
    • Renamed HierarchicLayoutData.EdgeLayoutDescriptors to EdgeDescriptors.
    • Renamed NodeLayoutDescriptor to HierarchicalLayoutNodeDescriptor.
    • Renamed HierarchicLayout.NodeLayoutDescriptor to DefaultNodeDescriptor.
    • Renamed and moved HierarchicLayoutCore.NodeLayoutDescriptorDpKey to HierarchicalLayout.NodeDescriptorDataKey.
    • Renamed HierarchicLayoutData.NodeLayoutDescriptors to NodeDescriptors.
    • Replaced INodeData interface with HierarchicalLayoutNodeContext class.
      • Renamed INodeData.GroupId to HierarchicalLayoutNodeContext.EdgeGroupId.
      • Removed the INodeData.ParentGroupNode property.
    • Replaced IEdgeData interface with HierarchicalLayoutEdgeContext class.
      • IEdgeData.Type is read-only on the new HierarchicalLayoutEdgeContext.
      • The following IEdgeData properties now offer read and write access on the new HierarchicalLayoutEdgeContext: SourceGroup, TargetGroup, SourcePortGroup, TargetPortGroup, SourcePortCandidates, TargetPortCandidates, Thickness, CrossingCost, CriticalEdgePriority, SourcePortAlignment, TargetPortAlignment.
      • Renamed IEdgeData.SourcePortConstraint and TargetPortConstraint to SelectedSourcePortCandidate and SelectedTargetPortCandidate respectively. Bot properties now offer read and write access.
      • Removed the IEdgeData.Group property.
    • Replaced ILayer interface with HierarchicalLayoutLayer class.
    • Renamed the ILayer.List property to HierarchicalLayoutLayer class.Nodes.
    • Replaced ILayers interface with a list of HierarchicalLayoutLayer instances accessible via HierarchicalLayoutContext.Layers property.
      • Methods HierarchicalLayoutContext.InsertLayer and RemoveLayer are replacements for the ILayers.Insert and ILayers.Remove methods.
    • Replaced IItemFactory interface with ItemFactory class. Several of the factory methods have also been removed or renamed.
      • CreateDummyEdge has been renamed to CreateHelperEdge.
      • CreateProxyNode has been renamed to CreateSideProxyNode and DestroyProxyNode to DestroySideProxyNode.
      • CreateSameLayerProxy has been renamed to CreateSameLayerProxyEdge and DestroySameLayerProxy to DestroySameLayerProxyEdge.
      • SetTemporaryEdgeGroups has been renamed to CreateGroupedEdgeContext.
      • SetTemporaryCriticalEdgePriority has been removed.
      • SetTemporaryCrossingCost has been removed.
      • SetTemporaryEdgeThickness has been removed.
      • SetTemporaryPortConstraint has been removed.
    • EdgeDataType.RedirectedGroupEdge has been removed.
    • Separated HierarchicLayout.IncrementalHintsDpKey in IncrementalNodeHintsDataKey and IncrementalEdgeHintsDataKey.
    • Separated enum IncrementalHint in IncrementalNodeHint for nodes and IncrementalEdgeHint for edges.
    • Separated HierarchicLayoutData.IncrementalHints in HierarchicalLayoutData.IncrementalNodes and HierarchicalLayoutData.IncrementalEdges. IncrementalNodes now only allows for specifying the nodes that should be inserted incrementally during the layering phase. Additional options for incremental node insertion can be specified using GenericLayoutData.
    • Removed GroupCompactionStrategy.
    • Renamed SimplexNodePlacer.GroupCompactionStrategy to GroupCompaction and changed its type to boolean.
    • The DefaultDrawingDistanceCalculator.OptimizeSwimlaneDistances property has been removed. The behavior does not change and is the same as the old default where the property was disabled. Override DrawingDistanceCalculator.GetMinimumDistance method and assign zero to nodes that are in different rows/columns to get the same behavior as when previously enabling the property.
    • Property SimplexNodePlacer.SwimLaneCrossingWeight has been renamed to LayoutGridCrossingWeight. Note that the class has been renamed to CoordinateAssigner.
    • The TypeBasedDrawingDistanceCalculator class has been removed.
    • The classes ILayeredComponentsMerger and DefaultLayeredComponentsMerger have been removed. The functionality is integrated into the MultiComponentLayerer, which now offers a new MergingPolicy property and protected method Merge for the case that a custom merging approach is required.
    • The HierarchicLayout.OrthogonalRouting property has been removed. To specify orthogonal or other routing styles, the routing style on the HierarchicalLayoutEdgeDescriptor must be used instead.
    • Renamed IPortAllocator to IHierarchicalLayoutPortAssigner.
    • Renamed DefaultPortAllocator to HierarchicalLayoutPortAssigner.
    • Properties HierarchicLayout.RecursiveGroupLayering and HierarchicLayout.CompactGroups are combined into HierarchicalLayout.GroupLayeringPolicy.
    • BusDescriptor is renamed to GridComponentDescriptor.
    • HierarchicLayout.BusDescriptorDpKey is renamed to GridComponentDescriptorDataKey.
    • HierarchicLayoutData.Buses is renamed to GridComponents.
    • HierarchicLayoutData.BusRootOffsets is renamed to GridComponentRootOffsets.
    • NodeDataType.BusStructureDummy is renamed to GridComponentBusNode.
    • Renamed SimplexNodePlacer.BarycenterMode to SymmetryOptimizationStrategy and changed its type to SymmetryOptimizationStrategy. It now supports performing strong, weak and no additional symmetry optimization.
    • Refactored the enum HierarchicLayout.LayoutMode property into a boolean FromSketchMode property and removed the LayoutMode enum.
    • The ICandidateMatcher interface has been removed. For an advanced customization of the port selection consider implementing a custom IPortCandidateSelector.
    • Moved HierarchicLayout.StopAfterLayering/Sequencing to HierarchicalLayoutCore.
    • The ILayoutDataProvider interface is removed and its functionality is moved to HierarchicalLayoutContext.
    • The ILayers interface is moved to the HierarchicalLayoutContext, and methods that accepted ILayers as a parameter instead accept HierarchicalLayoutContext now.
    • The IItemFactory interface is moved to the HierarchicalLayoutContext, and methods that accepted IItemFactory as a parameter instead accept HierarchicalLayoutContext now.
    • The obsolete extension methods CreateLayerConstraintFactory and CreateSequenceConstraintFactory have been removed from HierarchicLayout. To specify layer and sequence constraints, use LayoutData instead.
    • LayerConstraintData no longer inherits from LayoutData.
    • SequenceConstraintData no longer inherits from LayoutData.
    • NodeLayoutDescriptor.NodeLabelMode was removed. If node labels shall be considered by the layout algorithm, they are now considered during all phases. In particular, self-loops do not overlap node labels anymore.
    • The NodeLabelMode enum was removed.
    • The NodeLayoutDescriptor class of the HierarchicLayout algorithm, which was renamed to HierarchicalLayoutNodeDescriptor, does no longer allow to specify the border-to-port gap ratios individually for each node side. The BorderToPortGapRatio property now defines the value for all four node sides.
    • Property HierarchicLayoutData.SelfLoopCalculatorData was removed. Settings like minimum lengths for self-loop edges are specified via the HierarchicalLayoutEdgeDescriptor class like for normal edges.
    • The SelfLoopCalculator and SelfLoopCalculatorData classes was removed from the API.
    • In the sub-data SequenceConstraintData of the HierarchicalLayoutData PlaceBefore and PlaceAfter were replaced by PlaceInOrder.
    • In the sub-data LayerConstraintData of the HierarchicalLayoutData PlaceAbove and PlaceBelow were replaced by PlaceInOrder.
    • The INodePlacer interface of the hierarchic layout has been renamed to ICoordinateAssigner. Its implementation has been renamed from SimplexNodePlacer to CoordinateAssigner.
    • The HierarchicLayout.SeparateLayers property has been moved to CoordinateAssigner.SeparateLayers, since it has always only worked when using that implementation.
    • The IEdgeReverser interface and the HierarchicLayoutCore.CreateEdgeReverser method have been removed.
    • The GroupTransposition property has been removed from DefaultLayerSequencer class. The Transposition property should now be used for groups too.
    • The HierarchicLayoutCore class is not a standalone layout algorithm anymore but now offers only access to more advanced features of the HierarchicLayout class.
      • All public data keys were moved to the HierarchicLayout class.
      • The protected API of both classes was reduced, but still even highly advanced customization are possible.
    • The protected methods DefaultPortAllocator.GetPortBorderGap, DefaultPortAllocator.GetPortBorderGapRatio, and DefaultPortAllocator.GetPortDistanceDelta were removed.
    • Removed members HierarchicLayout.CreateLayerConstraintFactory, HierarchicLayoutData.LayerConstraintFactory, HierarchicLayout.CreateSequenceConstraintFactory and HierarchicLayoutData.SequenceConstraintFactory. The factories are no longer required to define layering and sequence constraints.
      • The recommended way is to use properties HierarchicLayoutData.LayerConstraints and HierarchicLayoutData.SequenceConstraints.
      • For expert uses cases (e.g. algorithm customization), the low-level helper classes LayoutGraphLayerConstraints and LayoutGraphSequenceConstraints were added.
    • Removed the keys HierarchicLayout.LayerConstraintsMementoDpKey and HierarchicLayout.SequenceConstraintsMementoDpKey.
    • Class TopLevelGroupToSwimlaneStage has been removed from the library.

    Incompatible Behavior Changes

    • The HierarchicalLayout now considers node labels by default.
    • The HierarchicalLayout now places edge labels by default using an integrated labeling algorithm.
    • Changed the default edge routing style of the HierarchicalLayout class from Polyline to Orthogonal.

    Tree Layout

    Incompatible API Changes

    • Renamed TreeLayout.MultiParentAllowed to AllowMultiParent.
    • Renamed TreeReductionStage.MultiParentAllowed to AllowMultiParent.
    • Renamed "NodePlacer" to "SubtreePlacer" in the following types and members:
      • Renamed the DefaultNodePlacer class to SingleLayerSubtreePlacer.
      • Renamed the DelegatingNodePlacer class to SingleSplitSubtreePlacer.
      • Renamed the DoubleLineNodePlacer class to DoubleLayerSubtreePlacer.
      • Renamed the FreeNodePlacer class to FixedSubtreePlacer.
      • Renamed the GridNodePlacer class to MultiLayerSubtreePlacer.
      • Renamed the GroupedNodePlacer class to MultiSplitSubtreePlacer. The class now considers port grouping (use TreeLayoutData.Ports) to define how child nodes are split.
      • Renamed the LayeredNodePlacer class to LevelAlignedSubtreePlacer.
      • Renamed the TreeLayout.DefaultNodePlacer property to DefaultSubtreePlacer.
      • Renamed the TreeLayoutData.DelegatingNodePlacerPrimaryNodes property to SingleSplitSubtreePlacerPrimaryNodes.
      • Renamed the TreeLayoutData.GridNodePlacerRowIndices property to MultiLayerSubtreePlacerLayerIndices.
    • Renamed ConnectorDirection to SubtreeConnectorDirection, and the values North to SubtreeConnectorDirection.Up, East to SubtreeConnectorDirection.Right, South to SubtreeConnectorDirection.Down, and West to SubtreeConnectorDirection.Left.
    • Renamed the values of ParentConnectorDirection: North to ParentConnectorDirection.Up, East to ParentConnectorDirection.Right, South to ParentConnectorDirection.Down, and West to ParentConnectorDirection.Left.
    • Replaced Tree.Matrix with the SubtreeTransform enum and renamed constants:
      • Matrix.Default to SubtreeTransform.None.
      • Matrix.MirHor to SubtreeTransform.FlipY.
      • Matrix.MirVert to SubtreeTransform.FlipX.
      • Matrix.Rot90 to SubtreeTransform.RotateLeft.
      • Matrix.Rot180 to SubtreeTransform.Rotate180.
      • Matrix.Rot270 to SubtreeTransform.RotateRight.
      • Matrix.MirVertRot90 to SubtreeTransform.RotateRightFlipY.
      • Matrix.MirHorRot90 to SubtreeTransform.RotateLeftFlipY.
    • Renamed TreeLayoutData.OutEdgeComparers to TreeLayoutData.ChildOrder and changed the types to Comparison function.
    • Removed TreeLayout.DefaultOutEdgeComparer. Use TreeLayoutData.ChildOrder instead. Also removed NodeOrderComparer class.
    • Removed the SimpleNodePlacer class; use DefaultSubtreePlacer class instead.
    • Replaced DefaultNodePlacer.ChildPlacement property with the new SingleLayerSubtreePlacer.Transformation property. The former
      ChildPlacement.HorizontalDownward value now maps to SubtreeTransform.None, ChildPlacement.HorizontalUpward to SubtreeTransform.FlipY,
      ChildPlacement.VerticalToLeft to SubtreeTransform.RotateRight, and ChildPlacement.VerticalToRight to SubtreeTransform.RotateLeftFlipY.
    • Renamed RootAlignment.CenterOverChildren to SubtreeRootAlignment.CenterOfChildren.
    • Renamed RootAlignment.Leading to SubtreeRootAlignment.Left, RootAlignment.Trailing to SubtreeRootAlignment.Right, RootAlignment.LeadingOffset to SubtreeRootAlignment.Leading, and RootAlignment.TrailingOffset to SubtreeRootAlignment.Trailing.
    • The TreeComponentLayout class has been removed.
    • Renamed FillStyle to AspectRatioChildAlignmentPolicy and AspectRatioNodePlacer.FillStyle to ChildAlignmentPolicy.
    • The AspectRatioTreeLayout has been removed together with AspectRatioTreeLayoutData, RootPlacement, and SubtreeArrangement. Use the TreeLayout with the AspectRatioSubtreePlacer instead.
    • Replaced TreeLayoutData.OutEdgeComparers property with new, more powerful ChildOrder property.
    • The TreeReductionStage.NonTreeEdgeLabelingAlgorithm property has been renamed to NonTreeEdgeLabeling.
    • Remove methods GetPortBorderGap and GetPortDistanceDelta from the DefaultPortAssignment (renamed to TreeLayoutPortAssigner) class.
    • Removed the NodePlacerBase class. Implement ISubtreePlacer interface instead.
    • Removed the method PlaceSubtree(Node, ParentConnectorDirection) of former subclasses of NodePlacerBase class. Override PlaceSubtree method(IMapper<Node, SubtreeShape>, IMapper<Node, SubtreeShape>, LayoutGraph, Node) instead.
    • Removed the DetermineChildConnector method of former subclasses of NodePlacerBase class. Override DetermineChildConnectors method instead.
    • Removed the methods GetNodeShape and GetSubtreeShape from former subclasses of NodePlacerBase class.
    • Renamed all types, methods and properties containing "NodePlacer" to "SubtreePlacer".
    • The DefaultPortAssignment.BorderGapToPortGapRatio property was renamed to BorderToPortGapRatio.
    • Tree.PortAssignmentMode value PortConstraint has been removed. Port candidates are always considered if they are specified.
    • Tree.PortAssignmentMode values DistributedEast, DistributedWest, DistributedNorth, DistributedSouth have been replaced by value Distributed. The side can be specified by using TreeLayoutData.Ports.
    • Tree.PortAssignmentMode.None has been renamed Tree.PortAssignmentMode.Center.
    • TreeLayout.GetPortAssignment can no longer be overridden. To specify IPortAssignment strategies per node, TreeLayoutData.PortAssigners can be used.
    • TreeLayout.GetNodePlacer can no longer be overridden. To specify NodePlacer strategies per node, TreeLayoutData.SubtreePlacers can be used.
    • The following methods of TreeLayout have been removed:
      • ReverseEdges.
      • GetRootsArray.
      • GetOutEdgeComparer - TreeLayoutData.ChildOrder can be used instead.
      • CreateNodeShape - ModifyNodeShape can be used instead to modify the shape.
      • DirectTree - TreeLayoutData.TreeRoot can be used to accomplish the same result.
    • DefaultNodePlacer.CalculateParentConnector has been removed. Custom implementations can be inlined at the end of PlaceSubtree.
    • SubtreeShape.AddBoundsToShape accepts a single RectD parameter instead of its deconstructed values.
    • SubtreeShape.AssignValuesTo has been removed - CreateCopy can be used instead.
    • The API of the node placer implementations has been simplified and improved. The INodePlacer interface was renamed to ISubtreePlacer.
    • The class hierarchy of the various node placer implementations has been simplified. The rotatable base class implementation has been removed from the hierarchy.
    • Renamed IPortAssignment to ITreeLayoutPortAssigner.
    • Renamed DefaultPortAssignment to TreeLayoutPortAssigner.
    • Renamed TreeLayout.PortAssignmentDpKey to PortAssignerDataKey.
    • Renamed TreeLayoutData.PortAssignments to PortAssigners.
    • Renamed the property RoutingStyle.Polyline to SingleLayerSubtreePlacerRoutingStyle.StraightLineToChildConnector, RoutingStyle.Fork property to SingleLayerSubtreePlacerRoutingStyle.Orthogonal, and RoutingStyle.ForkAtRoot property to SingleLayerSubtreePlacerRoutingStyle.OrthogonalAtRoot.
    • Added SingleLayerSubtreePlacerRoutingStyle.Polyline property which leads to a polyline routing style.
    • The ClassicTreeLayout has been removed together with the enums LeafPlacement, EdgeRoutingStyle, and PortStyle. The TreeLayout can be used instead.
    • The properties TreeLayout.SourcePortConstraintDataAcceptor and TreeLayout.TargetPortConstraintDataAcceptor have been removed.
    • The properties TreeLayout.SourceGroupDataAcceptor
      and TreeLayout.TargetGroupDataAcceptor have been removed.
    • Removed the TreeLayout.DefaultLeafPlacer property as well as LeafNodePlacer class.
    • DelegatingNodePlacer now implements ISubtreePlacer instead of IFromSketchNodePlacer.
    • BusNodePlacer now implements ISubtreePlacer instead of IFromSketchNodePlacer.
    • Renamed IProcessor to ISubtreePlacerProcessor.
    • All layouts suitable for trees, such as TreeLayout, RadialTreeLayout, now default to using the TreeReductionStage to temporarily remove non-tree edges from the graph during layout calculation.
    • The GridNodePlacer.AutomaticRowAssignment property (now renamed to MultiLayerSubtreePlacer) was removed. The layers are now always automatically assigned if no layer indices are defined via TreeLayoutData.MultiLayerSubtreePlacerLayerIndices.
    • The TreeLayout.graph field has been removed. For customizations in the TreeLayout the graph is available whatsoever and can if required be queried from the node/edge items.
      • Method TreeLayout.LayoutRoot now has an additional parameter of type LayoutGraph as its first argument.
    • Removed the LayeredNodePlacer.Id property (class was also renamed to LevelAlignedSubtreePlacer). The ID can still be provided via the constructor. Reading it later should never be necessary.
    • The factory TreeReductionStage.CreateStraightLineRouter method has been removed. The standalone router StraightLineEdgeRouter class should be used instead when straight-line edges are required.

    Incompatible Behavior Changes

    • Port candidates are always considered if they are specified.
    • The TreeLayout now considers node labels by default.
    • The TreeLayout now places edge labels by default using an integrated labeling algorithm.

    Orthogonal Layout

    Incompatible API Changes

    • The LayoutStyle enum (belonging to the OrthogonalLayout) has been renamed to OrthogonalLayoutMode. Furthermore, the new values are Strict (former Default), ForcedStraightLine (former Box) , and Relaxed (former FixedMixed). The former values Uniform, FixedBox, and Mixed have been removed from the enum.
    • The OrthogonalLayout properties related to substructures have all been renamed to contain "substructure" in their name. ChainStyle, ChainSize, TreeStyle, TreeSize, TreeOrientation, CycleStyle, CycleSize are now called ChainSubstructureStyle, ChainSubstructureSize, TreeSubstructureStyle, TreeSubstructureSize, TreeSubstructureOrientation, CycleSubstructureStyle, CycleSubstructureSize.
    • The following properties have been removed from the OrthogonalLayout class: Randomization, CrossingReduction, EdgeLengthReduction, OptimizePerceivedBends and FaceMaximization. Use the new QualityTimeRatio property instead.
    • Removed the CompactOrthogonalLayout class.
    • The DirectedEdges properties of OrthogonalLayoutData and PartialLayoutData are now both of type ItemMapping with the name EdgeOrientation and support floating-point values to also specify edges oriented against the main layout direction.
    • EdgeDirectednessDpKey on all supporting ILayoutAlgorithms have been combined into a global data key LayoutKeys.EdgeDirectednessDataKey.
    • PartialLayout.DirectedEdgesDpKey is renamed to EdgeOrientationDataKey and now also allows specifying edges should be routed against the main layout orientation.
    • Renamed EdgeLayoutDescriptor to OrthogonalLayoutEdgeDescriptor.
    • Renamed OrthogonalLayout.EdgeLayoutDescriptor to DefaultEdgeDescriptor.
    • Renamed OrthogonalLayout.EdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
    • Renamed OrthogonalLayoutData.EdgeLayoutDescriptors to EdgeDescriptors.

    Incompatible Behavior Changes

    • The OrthogonalLayout now considers node labels by default.
    • The OrthogonalLayout now places edge labels by default using an integrated labeling algorithm.

    Edge Router

    Incompatible API Changes

    • The MonotonicPathRestriction enum is now a flags enum and is called MonotonicPathRestrictions.
    • The SelfLoopRouter.SmartSelfLoopPlacement property has been removed. It was enabled by default and the algorithm now always behaves like when it was enabled previously. To get all self-loops on the same node corner independently of other edges, the SelfLoopRouter can be applied in a separate post-processing step where only self-loops are present in the graph (use SubgraphLayoutStage).
    • Method ParallelEdgeRouter.LayoutParallelEdges was renamed to RouteEdges.
    • Renamed ParallelEdgeRouter.RoutedParallelEdgesDpKey to RoutedMultiEdgesResultDataKey.
    • Renamed ParallelEdgeRouter.FindAndHideParallelEdges to FindAndHideMultiEdges.
    • Renamed ParallelEdgeRouterData.RoutedParallelEdges to RoutedMultiEdgesResult.
    • The ParallelEdgeRouter.AbsJoinEndDistance property has been renamed to AbsoluteJoinEndDistance.
    • The ParallelEdgeRouter.RelJoinEndDistance property has been renamed to RelativeJoinEndDistanceFactor, and its default value now is 0.
    • The ParallelEdgeRouter.LineDistance property has been renamed to EdgeDistance.
    • The SelfLoopRouter.LineDistance property has been renamed to EdgeDistance.
    • The SelfLoopRouter.LayoutSelfLoops method has been removed. To route the self-loop edges, the SelfLoopRouter class should be applied to the graph.
    • The SelfLoopRouter.LayoutStyle property has been renamed to RoutingStyle. The respective enum type has been renamed to SelfLoopRoutingStyle.
    • The OrganicEdgeRouter.CreateNodeEnlargementStage method has been removed and is now replaced by the new AllowMovingNodes property.
    • The OrganicEdgeRouter.EdgeNodeOverlapAllowed property has been renamed to OrganicEdgeRouter.AllowEdgeNodeOverlaps.
    • The BusRouter class and all API members related to it have been removed. For bus-style edge routing, use EdgeRouter instead.
    • Renamed the CurveEdgeLayoutDescriptor.MinimumEdgeToEdgeDistance property to MinimumEdgeDistance.
    • Renamed the EdgeLayoutDescriptor.MinimumEdgeToEdgeDistance property (EdgeRouter) to MinimumEdgeDistance.
    • Renamed the PenaltySettings.MinimumEdgeToEdgeDistancePenalty property to EdgeRouterCosts.MinimumEdgeDistanceCost.
    • Renamed Interval.Min to Interval.Minimum.
    • Renamed Interval.Max to Interval.Maximum.
    • Renamed OrthogonalInterval.Min to OrthogonalInterval.Minimum.
    • Renamed OrthogonalInterval.Max to OrthogonalInterval.Maximum.
    • Replaced EdgeRouter.EdgeComparer property of type IComparer with EdgeRouterData.EdgeProcessingComparison of type Comparison function.
    • The EdgeRouter.IgnoreInnerNodeLabels property has been removed from the API. Consideration is controlled via EdgeRouter.NodeLabelPlacement. Inner labels of non-group are only ignored when choosing value EdgeRouterNodeLabelPlacement.Ignore; labels of group nodes alone can be ignored when choosing EdgeRouterNodeLabelPlacement.IgnoreGroupLabels.
    • The protected EdgeRouter.CreateDefaultEdgeOrderComparer method has been removed. Use EdgeRouterData.EdgeProcessingComparison instead.
    • Refactored the API for customizing the EdgeRouter class.
      • The classes/interfaces PathSearch, PathSearchResult, CellSegmentInfo, EdgeInfo, Channel, ChannelBasedPathRouting, SegmentInfo, SegmentInfoBase, SegmentGroup, Router.Polyline.Alignment, DynamicObstacleDecomposition, IObstaclePartition, IPartition, GraphPartition, GraphPartitionExtensionAdapter, IDecompositionListener, IDynamicDecomposition, IEnterIntervalCalculator and IGraphPartitionExtension have been removed.
      • The PartitionCell.CreateBorderInterval method has been removed alongside with the PartitionCellBorder enum.
      • The properties EdgeCellInfo.EnterSegmentGroup, EdgeCellInfo.ExitSegmentGroup and EdgeCellInfo.CellSegmentInfos have been removed.
      • The properties EdgeRouter.RegisteredPartitionExtensions, RegisteredPathSearchExtensions and Partition have been removed, as well as methods CreateObstacleDecomposition, CreatePathSearch, CreatePathSearchContext, ConfigurePathSearch, CreatePathRouting, CreateConfiguration, ConfigureGraphPartition and CleanUpGraphPartition.
      • The properties PathSearchContext.PathSearch and PathSearchContext.PathSearchResult have been removed.
      • Added new methods EdgeRouter.AddPathSearchExtension and EdgeRouter.AddPartitionExtension.
      • Added PartitionExtension class as replacement for IGraphPartitionExtension.
      • Added new IRouterPartition interface as replacement of IObstaclePartition and IPartition.
      • The Partition property has been added to PathSearchConfiguration class.
      • The Path.Length property has been renamed to PathSearchResult.CellEntranceCount.
    • Renamed Obstacle to RoutingObstacle.
    • Renamed Path to PathSearchResult.
    • Renamed PathRequest to PathSearchRequest.
    • Renamed EdgeLayoutDescriptor to EdgeRouterEdgeDescriptor.
    • Renamed CurveEdgeLayoutDescriptor to CurveRoutingEdgeDescriptor.
    • Renamed EdgeRouter.EdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
    • Renamed EdgeRouter.DefaultEdgeLayoutDescriptor to DefaultEdgeDescriptor.
    • Renamed EdgeRouter.GetEdgeLayoutDescriptor to GetEdgeDescriptor.
    • Renamed EdgeRouterData.EdgeLayoutDescriptors to EdgeDescriptors.
    • Renamed PathSearchContext.CurrentEdgeLayoutDescriptor to CurrentEdgeDescriptor.
    • Renamed CurveRoutingStage.DefaultEdgeLayoutDescriptor to DefaultEdgeDescriptor.
    • Renamed CurveRoutingStage.CurveEdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
    • Renamed CurveRoutingStageData.EdgeLayoutDescriptors to EdgeDescriptors.
    • EdgeRouter.Grid has been replaced by EdgeRouter.GridSpacing.
    • The class Polyline.Grid has been removed.
    • The EdgeRouter and all its related classes have been moved from namespace yWorks.Layout.Router.Polyline to yWorks.Layout.Router.
    • Class PenaltySettings and EdgeLayoutDescriptor.PenaltySettings property where renamed to EdgeRouterCosts and EdgeRouterEdgeDescriptor.EdgeRouterCosts.
    • The already obsolete properties EdgeRouter.PolylineRouting, EdgeRouter.PreferredPolylineSegmentLength and EdgeRouter.MaximumPolylineSegmentRatio have been removed. They are replaced by respective properties on the EdgeRouterEdgeDescriptor class.
    • The PolylineLayoutStage class has been renamed to OctilinearRoutingStage. Its PreferredPolylineSegmentLength property has been renamed to PreferredOctilinearSegmentLength.
    • The type of IntermediateRoutingPoints property has been changed from IList to IEnumerable.

    Incompatible Behavior Changes

    • The default of ParallelEdgeRouter.RelativeJoinEndDistanceFactor has changed from 0.1 to 0.
    • The EdgeRouter now considers node labels by default.
    • The EdgeRouter now places edge labels by default using a generic labeling algorithm.

    Labeling

    Incompatible API Changes

    • The PreferredPlacementDescriptor class has been renamed to EdgeLabelPreferredPlacement.
      • The IEdgeLabelLayout.PreferredPlacementDescriptor property has been removed. Instead, the preferred placement can be specified using EdgeLabelPreferredPlacement.EdgeLabelPreferredPlacementDataKey.
    • Removed the interfaces INodeLabelLayout and IEdgeLabelLayout. Labels of the LayoutGraph are instead represented by types NodeLabel and EdgeLabel.
    • Removed LayoutGraph.GetLabelLayout. Labels can instead be retrieved using Node.Labels and Edge.Labels.
    • Removed the ILabelLayoutFactory class. Labels can instead be created and removed using LayoutGraph.AddLabel and LayoutGraph.Remove.
    • Removed the interfaces INodeLabelLayoutModel, IEdgeLabelLayoutModel and all implementations. To specify valid positions for GenericLabeling, the types NodeLabelCandidates and EdgeLabelCandidates offer methods for creating positions that correspond to the old model implementations. Candidates can be specified using GenericLabelingData.NodeLabelCandidates and GenericLabelingData.EdgeLabelCandidates.
    • Summarized layout algorithm properties such as ConsiderNodeLabels, ConsiderEdgeLabels, IntegratedNodeLabeling, IntegratedEdgeLabeling, and NodeLabelingPolicy as two properties NodeLabelPlacement and EdgeLabelPlacement.
    • Removed LabelLayoutTranslator, LabelLayoutData, LabelLayoutKeys and related classes. The behavior of LabelLayoutData can be recreated using NodeLabel.AbsolutePlacement and EdgeLabel.AbsolutePlacement.
    • Removed properties RemoveNodeOverlaps, RemoveEdgeOverlaps and EdgeGroupOverlapAllowed from GenericLabeling.
    • Introduced GenericLabeling.QualityTimeRatio property providing the possibility of balancing runtime and quality.
    • Added intersection information to LabelCandidate class, which provides means to compute profits and to mimic the behavior of the removed properties.
    • Removed MISLabelingBase.OptimizationStrategy. Use GenericLabeling.DefaultNodeLabelingCosts and GenericLabeling.DefaultEdgeLabelingCosts instead. Additionally individual costs can now be set for each label, using GenericLabelingData.NodeLabelingCosts and GenericLabelingData.EdgeLabelingCosts.
    • Removed LabelingBase.AutoFlipping. Automatically flipping labels right-side up is handled by the view, e.g. SmartEdgeLabelModel.AutoRotation.
    • Removed the IProfitModel interface and properties LabelingBase.ProfitModel and MISLabelingBase.CustomProfitModelRatio. Custom weights for a label candidate can be set at creation of the candidate with NodeLabelCandidates and EdgeLabelCandidates, or through a callback for each label using GenericLabelingData.NodeLabelCandidateProcessors and GenericLabelingData.EdgeLabelCandidateProcessors.
    • Removed the classes MISLabelingBase and LabelingBase.
    • Removed the following protected methods from GenericLabeling: CreateEdges, AssignProfit, FoundLabelOverlap, FoundNodeOverlap, FoundEdgeOverlap, FoundHaloOverlap, FoundPartitionGridLineOverlap, FoundPartitionGridInsetOverlap, FoundPartitionGridInteriorOverlap.
    • Made enums LabelAngleOnRightSideRotations and LabelAngleReferences non-flags enums.
    • Removed the LabelAngleOnRightSideOffsets enum.
    • Changed the PreferredPlacementDescriptor.AngleOffsetOnRightSide enum property to the AddHalfRotationOnRightSide bool property.
    • MISLabelingBase.ReduceAmbiguity is removed. Ambiguous label placements can instead be penalized using LabelingCosts.AmbiguousPlacementCost.
    • Removed the GraphModelManager.LabelLayerPolicy property. Use the more specific properties NodeLabelLayerPolicy, EdgeLabelLayerPolicy and PortLabelLayerPolicy instead.
    • The SandwichLabelModel has been removed. It can be emulated using a CompositeLabelModel with the top and bottom position of an ExteriorNodeLabelModel.
    • Renamed LabelSideReferences.AbsoluteWithLeftInNorth to AbsoluteWithLeftAbove.
    • Renamed LabelSideReferences.AbsoluteWithRightInNorth to AbsoluteWithRightAbove.
    • ILabelCandidateDescriptor and related interfaces have been removed.
    • LayoutGraphAdapter: removed GetLabelCandidateDescriptorProvider and GetLabelCandidateDescriptor.
    • Renamed SliderMode to EdgeLabelSliderMode.
    • Values of DiscreteNodeLabelPositions have been renamed:
      • DiscreteNodeLabelPositions.Top, DiscreteNodeLabelPositions.TopLeft, ... have been renamed to TopInside, TopLeftInside, ...
      • DiscreteNodeLabelPositions.North, DiscreteNodeLabelPositions.NorthWest, ... have been renamed to DiscreteNodeLabelPositions.Top, DiscreteNodeLabelPositions.TopLeft, ...
    • Values of DiscreteNodeLabelPositions enum have been renamed.
      • InternalMask to Inside.
      • EightPosMask to DiscreteNodeLabelPositions.Outside.
      • SidesMask to Sides.
      • CornerMask to Corners.
      • Removed value SandwichMask.
    • Removed DescriptorWrapperLabelModel.
    • The configuration LabelingData class for the GenericLabeling algorithm has been renamed to GenericLabelingData to be more in line with other LayoutData implementations.

    Organic Layout

    Incompatible API Changes

    • TreeSubstructureStyle.Balloon has been renamed to RadialTree.
    • Renamed OrganicLayout.ClusterAsGroupSubstructureAllowed to AllowClusterAsGroupSubstructure.
    • Renamed OrganicLayout.NodeEdgeOverlapAvoided to AvoidNodeEdgeOverlap.
    • Renamed OrganicLayout.NodeOverlapsAllowed to AllowNodeOverlaps.
    • The classes OrganicRemoveOverlapsStage and ShuffleLayout have been removed from the library. To solve the task of overlap removal, the RemoveOverlapsStage class is still available and the style previously generated by OrganicRemoveOverlapsStage can be triggered via the policy OverlapRemovalPolicy.PreserveRelativeLocations.
    • The OrganicPartitionGridLayoutStage class has been removed.
    • The RecursiveShuffleLayout class has been removed from the API.
    • Renamed GroupNodeMode.Normal to GroupNodeHandlingPolicy.Free.
    • Renamed OrganicLayoutData.SourceGroupIds to SubstructureSourceGroupIds. OrganicLayout now uses OrganicLayout.SubstructureSourceGroupIdDataKey instead of LayoutKeys.SourceEdgeGroupIdDataKey.
    • Renamed OrganicLayoutData.TargetGroupIds to SubstructureTargetGroupIds. OrganicLayout now uses OrganicLayout.SubstructureTargetGroupIdDataKey instead of LayoutKeys.TargetEdgeGroupIdDataKey.
    • Renamed the OrganicLayout.GroupNodeModeDpKey property to GroupNodeHandlingPolicyDataKey.
    • The OrganicLayout now configures the ComponentLayout by default, and SmartComponentLayout was removed.
    • OrganicLayout.ConfigureComponentLayout and DisposeComponentLayout were removed. To configure the ComponentLayout, replace the instance of the ComponentLayout in the LayoutStageStack with a suitably configured instance.
    • Removed ConstraintFactory and OrganicLayout.CreateConstraintFactory. Use OrganicLayoutData.Constraints instead.
    • OrganicConstraintData.AddFloatingBoundingBox now accepts SizeD its deconstructed values.
    • OrganicConstraintData.AddFloatingBoundingBox now accepts RectD its deconstructed values.
    • OrganicLayout.ConsiderNodeSizes was removed. The OrganicLayout now always considers node sizes.
    • OrganicConstraintData no longer inherits from LayoutData.
    • The OutputRestriction class and the associated properties have been renamed to ShapeConstraint.
    • Removed the ClusterNodes property from OrganicLayout. It is replaced by ClusteringPolicy property. To disable the clustering, specify ClusteringPolicy.None. To enable it choose one of the available other policies.
    • Removed the ClusteringQuality property from OrganicLayout. Use QualityTimeRatio instead.
    • The OrganicLayout class no longer offers value ClusteringPolicy.UserDefined. Now, cluster IDs provided by users via OrganicLayoutData.ClusterIds property or data key OrganicLayout.ClusterIdDataKey are always considered first. If none are defined, the specified OrganicLayout.ClusteringPolicy is considered.
    • The ClassicOrganicLayout class has been removed. It is superseded by the more powerful OrganicLayout algorithm that should be used instead.

    Incompatible Behavior Changes

    • The OrganicLayout now considers node labels by default.
    • The OrganicLayout now places edge labels by default using a generic labeling algorithm.
    • The default style of the OrganicLayout's ComponentLayout is changed to PackedCircle.
    • The OrganicLayout now always considers node sizes.

    Interactive Organic Layout

    Incompatible API Changes

    • The InteractiveOrganicLayoutData class has been added. It handles the initial settings per node and edge.
    • The classes InteractiveOrganicNodeHandle and InteractiveOrganicEdgeHandle have been added. They handle the settings per node and edge while the algorithm runs.
    • The properties, getters, and setters on InteractiveOrganicLayout that concern settings for individual items have been moved to InteractiveOrganicLayoutData or the handles as appropriate.
    • The InteractiveOrganicLayout.AddStructureUpdate method has been removed.
    • The methods InteractiveOrganicLayout.CommitPositions and CommitPositionsSmoothly have been combined as the InteractiveOrganicLayoutData.UpdateNodeCenters method.
    • The InteractiveOrganicLayout.OutputRestriction property has been renamed to ShapeConstraint.
    • The InteractiveOrganicLayout.PreferredEdgeLength property has been renamed to DefaultPreferredEdgeLength.
    • The InteractiveOrganicLayout.SyncStructure method has been removed.

    Circular Layout

    Incompatible API Changes

    • Renamed the ExteriorEdgeLayoutDescriptor.EdgeToEdgeDistance property to CircularLayoutExteriorEdgeDescriptor.EdgeDistance.
    • The type of the CircularLayout.MaximumDeviationAngle property has been changed to double.
    • Renamed CircularLayout.LayoutStyle to CircularLayout.PartitioningPolicy.
    • Renamed Circular.LayoutStyle to Circular.PartitioningPolicy.
    • Removed the enum value LayoutStyle.CustomGroups. If custom partitions are specified using CircularLayoutData.Partitions, they are respected by the CircularLayout automatically.
    • The INodeSequencer class has been removed from the API. Use the new CircularLayoutData.NodeComparison property to specify custom node orders.
    • The CircularLayout.LayoutStyle property has been renamed to PartitioningPolicy to better reflect the fact that it controls how nodes are partitioned. The corresponding enum has also been renamed from to PartitioningPolicy.
    • Renamed EdgeLayoutDescriptor to CircularLayoutEdgeDescriptor.
    • Renamed CircularLayout.DefaultEdgeLayoutDescriptor to EdgeDescriptor.
    • Renamed ExteriorEdgeLayoutDescriptor to CircularLayoutExteriorEdgeDescriptor.
    • Renamed CircularLayout.ExteriorEdgeLayoutDescriptor to ExteriorEdgeDescriptor.
    • The SingleCycleLayout has been removed. The CircularLayout with PartitioningPolicy set to SingleCycle can be used instead.
    • CircularLayout.SingleCycleLayout has been replaced by CircularLayout.PartitionDescriptor.
    • CircularLayout.DefaultEdgeLayoutDescriptor has been renamed to EdgeDescriptor.
    • CircularLayout.BalloonLayout has been renamed to BackboneLayout.
    • Removed the enum value EdgeRoutingPolicy.MarkedExterior. To manually select which edges should be routed externally, use the CircularLayoutData.ExteriorEdges property instead.

    Incompatible Behavior Changes

    • The CircularLayout now considers node labels by default.
    • The CircularLayout now places edge labels by default using a generic labeling algorithm.
    • The default style of the CircularLayout's ComponentLayout is changed to PackedCircle.
    • PartitionDescriptor.InitialAngle is measured in degrees rather than radians.

    Radial Layout

    Incompatible API Changes

    • Radial.NodeInfo is renamed to RadialLayoutNodePlacementResult.
    • The read/write CenterNodesDpKey property from the RadialLayout class has been removed. It was replaced by the static read-only key RadialLayout.CenterNodesDataKey that must now be used instead to mark the custom center nodes.
    • Renamed the RadialLayout.MinimumNodeToNodeDistance property to MinimumNodeDistance.
    • Renamed the RadialLayout.MinimumEdgeToEdgeDistance property to MinimumEdgeDistance.
    • Renamed Radial.LayeringStrategy to RadialLayeringStrategy.
    • Replaced ItemMapping OutEdgeComparers with ChildOrderData ChildOrder.
    • Replaced properties RadialLayoutData.NodeComparables and RadialLayoutData.OutEdgeComparers with new, more powerful ChildOrder property.
    • Removed the enum value Radial.LayeringStrategy.UserDefined. Custom layers are now always used if defined via RadialLayoutData.LayerIds property.
    • Radial.NodeInfo has been renamed to RadialLayoutNodePlacementResult.
    • Removed the enum value CenterNodesPolicy.Custom. Custom center nodes are now always used if defined via RadialLayoutData.CenterNodes property.

    Incompatible Behavior Changes

    • Custom layers are now always used if defined via RadialLayoutData.LayerIds property.
    • The RadialLayout now considers node labels by default.
    • The RadialLayout now places edge labels by default using a generic labeling algorithm.
    • The default style of the RadialLayout's ComponentLayout is changed to PackedCircle.
    • The RadialLayoutNodePlacementResult.SectorStart property is now interpreted in clockwise direction.
    • Custom center nodes are now always used if defined via RadialLayoutData.CenterNodes property.

    Radial Tree Layout

    Incompatible API Changes

    • BalloonLayout has been renamed to RadialTreeLayout, and BalloonLayoutData has been renamed to RadialTreeLayoutData.
    • The following members have been removed from BalloonLayout (now RadialTreeLayout): The field graph, the BalloonLayout class.NodeInfo, the methods GetInfo, CalculateChildArrangement, CalculateAngles, DetermineRoot, and SortChildNodes, the FromSketchMode property (use the new enum value FromSketch of ChildOrderingPolicy instead), and the InterleavedMode property (use RadialTreeLayoutData.InterleavedNodes instead).
    • The following members of BalloonLayout (now RadialTreeLayout) have been renamed: PreferredChildWedge has been renamed to PreferredChildSectorAngle, PreferredRootWedge has been renamed to PreferredRootSectorAngle, and the GetPreferredChildWedge method has been renamed to GetPreferredChildSectorAngle.
    • The InterleavedMode enum has been removed.
    • The enum value InterleavedMode.MarkedNodes has been removed. To define specific parents for interleaved placed child nodes use the RadialTreeLayoutData.InterleavedNodes property.
    • The enum value RootNodePolicy.SelectedRoot has been removed. A custom root node is now always used if defined via RadialTreeLayoutData.TreeRoot property.
    • The types of the following properties have been changed to double: PreferredChildSectorAngle, PreferredRootSectorAngle, MinimumEdgeLength, and MinimumNodeDistance.
    • Renamed RootNodePolicy to RootSelectionPolicy.
    • Removed BalloonLayout.Comparer. Use RadialTreeLayoutData.ChildOrder instead.
    • Replaced layout data OutEdgeComparer property with ChildOrderData ChildOrder.
    • Replaced BalloonLayoutData.OutEdgeComparer property with new, more powerful ChildOrder property (class is renamed to RadialTreeLayoutData).

    Incompatible Behavior Changes

    • The compactness factor is now interpreted differently. Larger values result in more compact drawings. Its range has been changed to [0, 1].
    • The from-sketch option of RadialTreeLayout sorts like before but no longer takes precedence over orders specified with the RadialTreeLayoutData properties ChildOrder or NodeTypes.
    • The RadialTreeLayout now considers node labels by default.
    • The RadialTreeLayout now places edge labels by default using an integrated labeling algorithm.
    • The default style of the RadialTreeLayout's (formerly BalloonLayout's) ComponentLayout is changed to PackedCircle.

    Radial Group Layout

    Incompatible API Changes

    • Renamed CactusGroupLayout.GroupSizingPolicy to RadialGroupLayout.GroupSizePolicy.
    • Replaced CactusGroupLayout.NodeComparer property of type IComparer with RadialGroupLayoutData.ChildNodeComparison of type Comparison function.
    • The CactusGroupLayout has been renamed to RadialGroupLayout, and the CactusGroupLayoutData has been renamed to RadialGroupLayoutData.
    • Property PreferredRootWedge has been renamed to PreferredRootSectorAngle.

    Incompatible Behavior Changes

    • The RadialGroupLayout now places edge labels by default using a generic labeling algorithm.
    • The default of the PreferredRootSectorAngle property has been changed from 180 to 360.
    • The default style of the RadialGroupLayout's (formerly CactusGroupLayout's) ComponentLayout is changed to PackedCircle.

    Series-parallel Layout

    Incompatible API Changes

    • Renamed the SeriesParallelLayout.MinimumNodeToNodeDistance property to MinimumNodeDistance.
    • Renamed the SeriesParallelLayout.MinimumEdgeToEdgeDistance property to MinimumEdgeDistance.
    • Removed SeriesParallelLayout.DefaultOutEdgeComparer. Use SeriesParallelLayoutData.ChildOrder instead. Also removed DefaultOutEdgeComparer class.
    • Replaced SeriesParallelLayoutData property .OutEdgeComparers with new, more powerful ChildOrder property.
    • The GeneralGraphHandling property was removed. SeriesParallelLayout now handles general graphs by default.
    • The DefaultPortAssignment.BorderGapToPortGapRatio property was renamed to BorderToPortGapRatio.
    • Remove methods GetPortBorderGap and GetPortDistanceDelta from the DefaultPortAssignment class.
    • The SeriesParallelLayout.NonSeriesParallelEdgeLabelingAlgorithm property has been renamed to NonSeriesParallelEdgeLabeling.
    • Renamed EdgeLayoutDescriptor to SeriesParallelLayoutEdgeDescriptor.
    • Renamed SeriesParallelLayout.DefaultEdgeLayoutDescriptor to DefaultEdgeDescriptor.
    • Renamed SeriesParallelLayout.EdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
    • Renamed SeriesParallelLayoutData.EdgeLayoutDescriptors to EdgeDescriptors.
    • Renamed the SeriesParallelLayout.VerticalAlignment property to ParallelSubgraphAlignment.
    • The combinations of the enums ForkStyle and PortAssignmentMode have been integrated into the PortAssignmentMode enum, and the ForkStyle enum has been removed.
    • DefaultPortAssignment.ForkStyle has been removed.
    • Renamed IPortAssignment to ISeriesParallelLayoutPortAssigner.
    • Renamed DefaultPortAssignment to SeriesParallelLayoutPortAssigner.
    • Renamed SeriesParallelLayout.PortAssignmentDpKey to PortAssignerDataKey.
    • Renamed SeriesParallelLayoutData.PortAssignments to PortAssigners.

    Incompatible Behavior Changes

    • SeriesParallelLayout now handles general graphs by default.
    • The SeriesParallelLayout now considers node labels by default.
    • The SeriesParallelLayout now places edge labels by default using an integrated labeling algorithm.

    Compact Disk Layout

    Incompatible Behavior Changes

    • The CompactDiskLayout now considers node labels by default.
    • The CompactDiskLayout now places edge labels by default using a generic labeling algorithm.

    Multi-page Layout

    Incompatible API Changes

    • MultiPageLayoutResult is now an inner class of MultiPageLayout.
    • Renamed GroupingPolicy to MultiPageGroupingPolicy.
    • Renamed Multipage.NodeType to MultiPageNodeType and its value Normal to MultiPageNodeType.Regular.
    • Renamed Multipage.EdgeType to MultiPageEdgeType and its value Normal to MultiPageEdgeType.Regular.
    • The EdgeBundleModes enum and the associated properties have been renamed to MultiEdgeConnectorPolicy. The enum values have been renamed to Separate, ShareForSameDirection and Share, respectively. The corresponding EdgeDataKey has been renamed to MultiEdgeConnectorIdDataKey (previously EdgeTypeDpKey).
    • The MultiPageLayout.CreateProxyReferenceNodes property has been renamed to UseProxyReferenceNodes.
    • The EdgeBundleModes enum has been renamed to MultiEdgeConnectorPolicy and converted from a flags enum to a regular enum. To manually select which multi-edges should be distinguished, use the MultiPageLayoutData.MultiEdgeConnectorIds property.
    • The properties MultiPageLayout.EdgeBundleModeMask, MultiPageLayout.EdgeTypeDpKey, and MultiPageLayoutData.EdgeTypes have been renamed to MultiPageLayout.MultiEdgeConnectorPolicy, MultiPageLayout.MultiEdgeConnectorIdDataKey, and MultiPageLayoutData.MultiEdgeConnectorIds.
    • The public API of the MultiPageLayout class has been changed.
      • The ILayoutCallback interface has been removed. The respective MultiPageLayout.LayoutCallback property is now an Action delegate instead. Furthermore, MultiPageLayout.CalculateLayout method has been removed, meaning the layout can and should only be started like all other algorithms (e.g. via the LayoutExecutor or IGraph.ApplyLayout).
      • The IElementFactory interface and the DefaultElementFactory class have been removed. The replacement is MultiPageElementFactory class which can be accessed and modified using MultiPageLayout.ElementFactory property.
      • The MultiPageLayout.CreateElementFactory method has been removed. The factory can be get and set using MultiPageLayout.ElementFactory property.
      • The IElementInfoManager interface has been removed.
      • The LayoutContext class of the MultiPageLayout has been renamed to MultiPageLayoutContext and its properties Graph and Layout have been removed.
      • The INodeInfo, IEdgeInfo, INodeLabelInfo, IEdgeLabelInfo interfaces related to MultiPageLayout have been removed. The data provided by them can now be retrieved via methods of the MultiPageLayoutContext (which is available also as property on the MultiPageLayoutResult).
      • The callback methods MultiPageLayout.RemoveConnectorPair, RouteRestoredEdges and ApplyIncrementalLayout have been removed.
    • MultiPageLayoutResult.GetPage and PageCount have been replaced by PageGraphs.
    • MultiPageLayoutData handles the ID mapping automatically. Consequently, the explicit mappings NodeIds, EdgeIds, NodeLabelIds, and EdgeLabelIds have been removed. Original graph items can be obtained by calling MultiPageLayoutData.GetOriginalItem.

    Partial Layout

    Incompatible API Changes

    • Renamed Partial.LayoutOrientation to PartialLayoutOrientation.
    • Removed the enum value ComponentAssignmentStrategy.Customized. Custom components are now always used if defined with PartialLayoutData.ComponentIds, ClearAreaLayoutData.ComponentIds or FillAreaLayoutData.ComponentIds respectively.
    • The PartialLayout.LayoutSubgraph method has been removed.
    • The callback ConfigureEdgeRouter method has been removed from classes PartialLayout and ClearAreaLayout. The router instance can be specified via the PartialLayout.EdgeRouter and ClearAreaLayout.EdgeRouter properties so that an additional configuration callback is not necessary.

    Incompatible Behavior Changes

    • Custom components are now always used if defined with PartialLayoutData.ComponentIds.

    Tabular Layout

    Incompatible API Changes

    • Replaced TabularLayout.NodeComparer property of type IComparer with TabularLayoutData.FreeNodeComparison of type Comparison function.
    • Renamed Tabular.LayoutPolicy to TabularLayoutMode.
    • The TabularLayout class now features its own data key (LayoutGridCellDescriptorResultDataKey) where it will publish cell IDs of nodes that it explicitly assigned to the cells. Previously it reused the common data key PartitionGrid.PartitionCellIdDpKey.
    • Renamed NodeLayoutDescriptor to TabularLayoutNodeDescriptor.
    • Renamed TabularLayout.DefaultNodeLayoutDescriptor to DefaultNodeDescriptor.
    • Renamed TabularLayout.NodeLayoutDescriptorDpKey to NodeDescriptorDataKey.
    • Renamed TabularLayoutData.NodeLayoutDescriptors to NodeDescriptors.

    Incompatible Behavior Changes

    • The TabularLayout now considers node labels by default.
    • The TabularLayout now places edge labels by default using a generic labeling algorithm.

    Component Layout

    Incompatible API Changes

    • If ComponentLayout is used as a pre-processing step to apply a layout algorithm on multiple connected components, the StopDuration of that layout is divided appropriately over all components, instead of being applied once per component.
    • The IsolatedGroupComponentLayout class has been removed.
    • Renamed ComponentArrangementStyles.None to ComponentArrangementStyle.KeepCenters.
    • Removed the ComponentArrangement property from ComponentLayout; use the new ComponentArrangementStyle.None instead to avoid arranging components.
    • The ComponentArrangementStyles enum has been renamed to ComponentArrangementStyle, as it is no longer a Flags-Enum.
      • Removed ComponentArrangementStyles.Mask.
      • Replaced ComponentArrangementStyles.ModifierNoOverlap with TryKeepCenters.
      • Replaced ComponentArrangementStyles.ModifierAsIs with ComponentLayout.FromSketchMode.
    • Renamed ComponentLayout.CalculateBounds to CalculateComponentBounds.
    • Renamed ComponentLayout.SetOrigin to SetComponentLocation.
    • Removed ComponentLayout.ArrangeFields method.
    • Simplified parameter lists of methods ComponentLayout.ArrangeComponents and ComponentLayout.SetOrigin to now accept instances of Component class.

    Incompatible Behavior Changes

    • ComponentArrangementStyle.PackedCircle and ComponentArrangementStyle.PackedRectangle now consider the convex hulls of components to determine overlaps.

    Tree Map Layout

    Incompatible API Changes

    • Replaced TreeMapLayout.NodeComparer property of type IComparer with TreeMapLayoutData.ChildNodeComparison of type Comparison function.
    • Removed the NodeWeightComparer class.
    • Renamed TilingPolicy to TilingStrategy and TreeMapLayout.TilingPolicy to TreeMapLayout.TilingStrategy.

    Recursive Group Layout

    Incompatible API Changes

    • RecursiveGroupLayout.NullLayout is renamed to RecursiveGroupLayout.FixContentLayout.
    • FixGroupLayoutStage is removed and its functionality is replaced by RecursiveGroupLayout using RecursiveGroupLayout.FixGroupLayout for all groups.
    • The RecursiveGroupLayout class now ignores empty group nodes by default (see ConsiderEmptyGroups property).
    • The signature of IGroupBoundsCalculator.CalculateBounds method was changed. The given children are now of type IListEnumerable<Node>.
    • The GroupBoundsCalculator implementation now keeps the center of empty group nodes if ConsiderEmptyGroups is enabled.
    • Method GroupBoundsCalculator.CalculateBounds now correctly considers the specified children. Previously, the given children were ignored and all graph elements were considered when calculating the group bounds.

    Layout Grid

    Incompatible API Changes

    • Renamed all types, methods and properties containing "CellId" to "CellDescriptor".
    • Removed properties OptimizeRowOrder and OptimizeColumnOrder from PartitionGridData class.
    • Removed the data key PartitionGrid.PartitionGridDpKey. The key LayoutGrid.LayoutGridCellDescriptorDataKey is now the only data key which can be used to specify layout grids.
    • Removed data key RecursiveGroupLayout.GroupNodePartitionGridDpKey. The key LayoutGrid.LayoutGridCellDescriptorDataKey is now the only data key which can be used to specify layout grids.
    • Renamed inset properties on classes LayoutGridColumn (formerly ColumnDescriptor) and LayoutGridRow (formerly RowDescriptor) to now be called padding (e.g., LeftPadding instead of LeftInset).
    • The methods PartitionGrid.PrepareOrientationChange and PartitionGrid.FinalizeOrientationChange have been removed.
    • Removed properties OriginalPosition and OriginalWidth from LayoutGridColumn class (formerly ColumnDescriptor). Use properties LayoutGridColumn.Position (formerly ComputedPosition) or LayoutGridColumn.Width (formerly ComputedWidth).
    • Removed properties OriginalPosition and OriginalHeight from LayoutGridRow class (formerly RowDescriptor). Use properties LayoutGridRow.Position (formerly ComputedPosition) or LayoutGridRow.Height (formerly ComputedHeight).
    • PartitionGrid is renamed to LayoutGrid. This also affects the related classes PartitionGridData, GenericPartitionGridStage, and GenericPartitionGridStageData.
    • Renamed ColumnDescriptor to LayoutGridColumn & RowDescriptor to LayoutGridRow.
    • Renamed PartitionCellId to LayoutGridCellDescriptor.
    • The SwimlaneDescriptor class has been removed from the API. Use LayoutGrid class (formerly called PartitionGrid) instead, which is able to model one-dimensional and two-dimensional grids.
    • The PartitionGridLayoutStage class has been removed. It is not necessary to manually add this stage, since HierarchicalLayout can support LayoutGrid out-of-the-box.
    • Removed helper class Swimlanes and Layout.SwimlaneRepresentative.
    • Removed the SwimlanesMode enum.

    Other Layouts

    Incompatible API Changes

    • Removed the InterEdgeRoutingStyle enum.
    • Renamed CurveFittingLayoutStage to CurveFittingStage.
    • Renamed FixNodeLayoutStage to LayoutAnchoringStage and FixNodeLayoutData to LayoutAnchoringStageData. In addition:
      • Renamed FixPointPolicy to LayoutAnchoringPolicy.
      • Renamed FixNodeLayoutStage.FixedNodeDpKey to NodeAnchoringPolicyDataKey.
      • Renamed CalculateFixPoint to CalculateAnchorPoint.
      • Removed FixNodeLayoutData.FixedNodes. Graph elements to anchor the graph on can be specified by setting the respective AnchoringPolicies using LayoutAnchoringStageData.

    Algorithms

    Incompatible API Changes

    • Removed the Groups class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Renamed the Dendrogram class to HierarchicalClusteringDendrogram.
    • Renamed ParallelEdges.FindParallelEdges to LayoutGraphAlgorithms.FindMultiEdges.
    • Renamed Analysis.Component to ConnectedComponent.
    • The Algorithms.NodeAggregation class has been renamed to LayoutGraphNodeAggregation, emphasizing that this class is intended for users working with the LayoutGraph API only.
      • Furthermore, its member NodeTypeDpKey has been removed. The replacement is key LayoutKeys.NodeTypeDataKey.
      • Also, its member NodeCenterDpKey has been removed. Node centers are now directly read from the LayoutGraph instance which must contain the coordinates of nodes if useful results should be generated.
    • Removed the utility class Sorting that offered methods to get a sorted node array based on node degrees or another criterion. The functionality is written without this utility by first getting the array of nodes from the graph and then sorting it using standard built-in sorting utilities.
    • Removed namespace Algorithms.Util. The types are now in namespace Algorithms.
    • Removed the GraphConnectivity class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the IndependentSets class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the enum value EuclideanSquared from DistanceMetric enum. Use enum value Euclidean instead which now calculates with squared values.
    • Removed the DistanceMetric enum of KMeansClustering class. Use KMeansDistanceMetric enum instead.
    • Removed the AggregationPolicy enum of NodeAggregation class. Use AggregationPolicy enum instead.
    • Removed the ShortestPaths class. Use corresponding methods of LayoutGraphAlgorithms class instead (e.g. ShortestPath).
    • The Triangulator algorithm class has been removed.
    • Removed the BfsDirection enum. Use TraversalDirection instead.
    • Removed the Intersections class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the IntersectionAlgorithm class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the Substructures class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the Trees class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the NetworkFlows class. Use corresponding methods of LayoutGraphAlgorithms instead (e.g. MaximumFlow).
    • Removed the NodeOrders class. Use corresponding methods of LayoutGraphAlgorithms instead (e.g. TopologicalNodeOrder).
    • Removed the Bipartitions class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the Cycles class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the ParallelEdges class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the Transitivity class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • The SpanningTrees class has been removed. To compute a minimum spanning tree, use LayoutGraphAlgorithms.MinimumSpanningTree method.
    • The RankAssignments class has been removed in favor of the single LayoutGraphAlgorithms.SimplexRankAssignment method that offers access to the rank assignment algorithm.
    • The GraphChecker class has been removed and most of its methods are now available on LayoutGraphAlgorithms.
    • The TreeAnalyzer class has been removed. Use the more convenient and powerful TreeAnalysis class instead.
    • Removed the Centrality class. Use corresponding methods of LayoutGraphAlgorithms instead.
    • Removed the Bfs class. Use LayoutGraphAlgorithms.Bfs instead.
    • Removed the Dfs class. Use LayoutGraphAlgorithms.Dfs instead.

    Analysis

    Incompatible API Changes

    • Renamed GraphStructureAnalyzer.HasMultipleEdges to HasMultiEdges.
    • Renamed GraphStructureAnalyzer.GetMultipleEdges to GetMultiEdges.
    • Renamed AggregationInfo to NodeAggregationInfo.
    • Renamed AggregationInfo.ParentAggregation to ParentNodeAggregation.
    • Renamed NodeAggregation.AggregationPolicy to NodeAggregationPolicy.
    • Renamed NodeAggregation.Aggregation to AggregationPolicy.
    • Renamed DistanceMetric to KMeansDistanceMetric.
    • The NodeAggregation.NodeTypeHandling property has been renamed to NodeTypePolicy.
    • The NodeTypeHandlingPolicy enum has been renamed to NodeTypePolicy.
    • Renamed Analysis.Component to ConnectedComponent.
    • Renamed Substructure to SubstructureItems.
    • Replaced enum Algorithms.Linkage with HierarchicalClusteringLinkage.

    Collections

    Incompatible API Changes

    • The YList.ElementAt method was removed.
    • Renamed ICursor.Prev to ICursor.Previous.
    • Renamed ListCell.Succ to ListCell.Next.
    • Renamed ListCell.Pred to ListCell.Previous.
    • Removed the IsEmpty method from YList class. Test YList.Count property for 0 instead.
    • Removed the methods SuccCell and PredCell from YList class. Use new properties ListCell.Next and ListCell.Previous instead.
    • Removed the methods CyclicSucc, CyclicPred, ContainsAll and RetainAll from YList class.
    • Removed the methods Succ and Pred from ListCell class. Use new properties Next and Previous instead.
    • Removed the Peek method from YList class. Use First property instead.

    Geometry

    Incompatible API Changes

    • The GeomUtilities class has been renamed to GeometryUtilities.
    • Implicit and explicit conversion operators between yFiles geometry types and the platform geometry types have been removed.
    • Renamed the GeomUtilities.FindRayIntersection method to GetSegmentRayIntersection.
    • Renamed the GeomUtilities.FindEllipseLineIntersection method to GetEllipseLineIntersection.
    • Moved Geom.Collinear method to GeometryUtilities class and renamed to AreCollinear.
    • Moved Geom.CalcConvexHull method to GeometryUtilities class and renamed to GetConvexHull.
    • Moved the Geom.CalcIntersection method to GeometryUtilities class and renamed to GetLineLineIntersection.
    • Removed the Geom.Projection method. Use PointD.GetProjectionOnSegment method instead.
    • Removed the methods DistanceToLineSegment of Geom class. Use PointD.DistanceToSegment method instead.
    • Moved IPlaneObject and LineSegment to namespace yWorks.Geometry.
    • The copy constructors on the RectD, PointD, and SizeD classes were removed. Use the ToRectD, ToPointD, or ToSizeD methods respectively instead.
    • All Intersects methods of the GeneralPath class are now called PathIntersects.
    • The MayIntersectClip method of the GeneralPath class is now called PathMayIntersectClip.
    • All AreaContains methods of the GeneralPath class now have an optional flatteningTolerance parameter.
    • The IsEmpty method of the GeneralPath class was removed. Use the IsVisible method or the Count property, instead.
    • The GetBounds overload of the GeneralPath class that returns the approximate bounds for BΓ©zier segments is now called GetApproximateBounds.
    • Renamed the LineSegment.XOffset property to YIntercept.
    • Renamed the LineSegment.IsInXIntervall method to LineSegment.IsInXInterval and LineSegment.IsInYIntervall method to LineSegment.IsInYInterval.
    • Made LineSegment class sealed.
    • The IRectangle interface no longer implements IPoint. You can get the top-left corner of a rectangle with its GetTopLeft method. For usages of the dynamic behavior of IPoint, like in a custom IPositionHandler, we recommend to let the IPositionHandler implement IPoint, too.
    • The IMutableRectangle interface no longer implements IMutablePoint. When working with the MutableRectangle class, use its Location property to get a dynamic point of the location.

    yFiles.NET 5.6

    This release brings exciting new major features, and many other minor new features, improvements, and bugfixes to all parts of the library.

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

    Major new features

    Constraint organic layout and more

    The OrganicLayout class now supports different types of constraints that restrict the placement of the graph's nodes that are specified with the new OrganicLayoutData.Constraints property.

    In addition, organic layout now supports:

    • Integrated edge labeling, which can be enabled with the OrganicLayout.IntegratedEdgeLabeling property
    • Drawing edges such that they point to the main layout direction, specified with the new OrganicLayoutData.EdgeOrientations property
    • Individual minimum lengths of edges that can be specified with the new OrganicLayoutData.MinimumEdgeLengths property.
    Compact tabular layout

    The TabularLayout class now supports the calculation of node arrangements that lead to a low overall edge length. This feature can be enabled with the new property considerEdges.

    New alignment layout stage

    The new AlignmentStage class places the nodes of a given layout on automatically determined horizontal and/or vertical lines. This stage is particularly designed as a post-processing step that snaps suitable nodes to the same x- or y-coordinates to obtain a grid-like structure. When rearranging the initial layout, the stage moves the nodes as little as possible.

    The associated new AlignmentStageData class allows specifying custom data considered during the layout calculation.

    Improved group node style

    The last major release brought a powerful GroupNodeStyle, that got even more features and improvements in this release, namely:

    • If GroupNodeStyle's tab width is set to 0, the tab width does not reduce the corner radius of the style's outline anymore. However, it still forces the corner radius of the style's inner corners (i.e., the corners of the content area on the side of the style's tab) to 0.
    • The new GroupNodeStyle.MinimumContentAreaSize property simplifies enforcing a minimum size for the content area a group node.
    • GroupNodeStyle offers the possibility to have its tab width grow (or shrink) depending on the preferred size of associated tab and tab background labels.
    • The new GroupNodeStyle.RenderTransparentContentArea property controls whether a semi-transparent value for the contentAreaFill property works as expected by showing what's behind the group node.
    Support for .NET 8.0

    To facilitate using our library with .NET 8.0 and to improve compatibility a .NET 8.0 version of the library has been added.

    New Features

      Styles

      • Selection, focus, and highlight visualizations can now be easier customized with a node, edge, label, or port style. These style instances can be set to the corresponding properties of the new GraphSelectionIndicatorManager, GraphFocusIndicatorManager, and GraphHighlightIndicatorManager classes that can be set as corresponding managers on the GraphControl. This removes the need for NodeStyleDecorationInstaller, etc.
      • To render items in a zoom-invariant fashion, their style can be wrapped in one of the new IndicatorNodeStyleDecorator, IndicatorEdgeStyleDecorator, IndicatorLabelStyleDecorator, or IndicatorPortStyleDecorator classes. The main use case for these decorators is using item styles as selection, focus or highlight indicators.

      Layout

      • The OrganicLayout class now provides a feature that dynamically detects whether nodes already lie almost on a common line or circle and, if so, snaps the nodes to this line/circle. This new feature can be enabled with the ChainRecognition and CircleRecognition properties.
      • PreferredPlacementDescriptor instances can now be created from ILabelModel and ILabelModelParameter instances, respectively, via their ToDescriptor extension method.
      • The RadialLayout class now allows defining a custom order of child nodes around a local root node. The order can be individually specified for each node by using the new RadialLayoutData.OutEdgeComparers property. It is especially suitable for tree-like input graphs. For specifying a single global order for all nodes, for example, alphabetically, the new RadialLayoutData.NodeComparables property is a more convenient option.
      • The CircularLayout class now offers the possibility to define star substructures. The CircularLayout.StarSubstructureStyle property specifies the style of star substructures and the CircularLayout.StarSubstructureSize property their minimum size (structures of smaller size are not handled as a star substructure). Furthermore, the CircularLayout.StarSubstructureTypeSeparation property specifies whether star substructures should be separated by the node type.
      • The CircularLayoutData class offers the new EdgeDirectedness property that influences the detection of star-substructures; see CircularLayout.StarSubstructureStyle.

      Improvements

      Graph

      • EdgePathLabelModel and EdgeSegmentLabelModel have been improved to provide better placements with edge-cases where the path is too short for the label or degenerates completely.
      • GroupNodeLabelModel no longer triggers an ArgumentException when used with / set for a node that does not use GroupNodeStyle. GroupNodeLabelModel is still not intended to be used with nodes that do not use GroupNodeStyle. This restriction has been lifted to support workflows where the node style is set to GroupNodeStyle after the label model is set to GroupNodeLabelModel.
      • Changing the height of an arc or bridge edge via its handle is now undoable.

      View

      • The rendering order of nodes in the GraphOverviewControl has been improved to be more in sync with the rendering order in the corresponding GraphControl.
      • GraphOverviewControl now uses its ContentGroup instead of the RootGroup to add the visualization of its graph content. This makes it easier to customize the overview for example by adding a background visual.
      • The LabelLayerPolicy property of GraphModelManager, which defines whether labels should be rendered at their owner or in a separate layer, has been split into three separate properties NodeLabelLayerpolicy, EdgeLabelLayerPolicy, and PortLabelLayerPolicy to support different policies for node, edge, and port labels.
      • The new SelectionModelChanged event of GraphControl is raised when the model managing the selection is changed itself, not when the selected items change.

      Styles

      • The ArrowEdgeStyle's bounds now are tightly enclosing the rendered shape. Before they were too large.
      • Bends in edges that use ArcEdgeStyle, ArrowEdgeStyle, or BridgeEdgeStyle are no longer shown when selecting these edges. Additionally, marquee selection will not select these bends anymore even if they lie in the selection rectangle.

      Interaction

      • The method PortRelocationHandle.CreateDummyEdge is now virtual and can be overridden.
      • The protected property DummySourceNodePort has been added to CreateEdgeInputMode to simplify overriding CreateDummyEdge.
      • The protected virtual method CreateEdgeInputMode.CreateDummyBend has been added that can be overridden to customize bends added during edge creation.
      • The edge creation start gesture while dragging inside the source node can now be customized with CreateEdgeInputMode.SourceNodeDraggingFinishedRecognizer.
      • The ItemDroppedInputMode.DragDropped event is now raised after the drop gesture has actually finished, in line with how similar events are raised elsewhere.
      • The MoveInputMode, MoveLabelInputMode, and HandleInputMode sub-modes of GraphEditorInputMode no longer have a pre-set SnapContext. Instead, they get their SnapContext from the InputModeContext. That way, setting the SnapContext on GraphEditorInputMode will affect all sub-modes unless a custom SnapContext is set to them.
      • The resize handle rendering order has been adapted to improve usability for small nodes.

      GraphBuilder

      • The GetUpdatedStyle method of the NodeCreator/EdgeCreator/LabelCreator classes now uses the default style from the graph as fallback if the style provider is not set.
      • The LabelCreator.GetUpdatedLayoutParameter method now uses the default layout parameter from the graph as fallback if the layout parameter provider is not set.
      • The NodeCreator, EdgeCreator, and LabelCreator classes can now be used without a GraphBuilder. This enables developers to apply styles and labels from a data object in cases where a GraphBuilder is not suitable for graph creation.
      • A NodeSource now allows for recursive definition of child nodes in a grouping hierarchy. The new methods AddChildNodesSource and CreateChildNodesSource allow for defining a source to fetch child node items from a node data item.
      • A NodeSource now allows for implicit definition of parent nodes in a grouping hierarchy. The new methods AddParentNodesSource and CreateParentNodesSource allow for defining a source to fetch a parent node item from a node data item.

      GraphML

      • Improved GraphML serialization of Color.Transparent.

      Layout

      • If AffectedLabels are set in LabelingData but no DpKey has been provided for them, the key set as AffectedLabelsDpKey on the labeling algorithm will be used.
      • For oriented rectangles the intersection test no longer allocates unnecessary memory and no longer creates unnecessary objects, which improves its allocation performance.
      • 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 TreeLayout class now places the ports of edges incident to multi-parent nodes and with port constraints (excluding any-side constraints) at the nodes' border. Previously, unlike as for edges incident to other nodes, the edge ports where located at the nodes' center.
      • The RadialLayout class now supports node types. The types influence the ordering of nodes of the same circle such that nodes of the same type are preferably placed next to each other if this does not induce additional crossings or conflicts with other constraints. Node types can be defined via the RadialLayoutData.NodeTypes property.

      Bugfixes

      Graph

      • Fixed NullReferenceException that occured when removing highlighted edges from their graph.
      • Fixed a bug where labels with an initial opening brace were not correctly serialized.
      • 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 ExpandGroup and EnterGroup commands do not create empty undo units anymore if nothing has changed.
      • NavigationInputMode.ExitGroup and the ExitGroup 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.

      View

      • CanvasControl: Animated viewport changes could lead to strange behavior if maximum or minimum zoom were set and violated by the viewport change.
      • 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.
      • Fixed a bug which might have caused port selection visualizations to disappear in image export or printing under rare conditions.

      Styles

      • With ArcEdgeStyle, the 3 center positions of the NinePositionEdgeLabelModel are now in the right places. Previously they were often way off.
      • GroupNodeStyle's collapse/expand icon can now be reliably hit in all cases. In rare cases, changing the value of one the properties that affect the icon's location were not taken into account for hit tests.
      • GroupNodeStyle no longer renders a hairline in place of the tab when using a Pen with TabWidth 0.
      • ImageNodeStyleRenderer's GetBounds method now returns the actual image bounds instead of the node layout's bounds if KeepAspectRatio is enabled.
      • DefaultLabelStyle now adds ellipsis more reliably at the end when the text does not fit into the specified text wrapping shape.
      • Bezier edges no longer devolve into polyline paths under rare circumstances.
      • ArrowEdgeStyle now correctly considers its visibility with thicknesses greater than 13.
      • MemoryImageNodeStyle and UriImageNodeStyle now properly respect their KeepAspectRatio property for rendering, hit testing, and outline.
      • The hit test for PolylineEdgeStyle, ArcEdgeStyle, BezierEdgeStyle, and BridgeEdgeStyle has been fixed. Previously, the hit area was too large when using thicker pens.

      Interaction

      • The default visualization for selected ports is now displayed properly.
      • Fixed an issue where changing the GraphControl.InputMode while the context menu is open would lead to a crash.
      • Fixed a bug in HighlightIndicatorManager that could result in missing or surplus highlight visualizations when changing the GraphControl.HighlightIndicatorManager.
      • Self-loops no longer disappear when resizing nodes while orthogonal editing is enabled.
      • Fixed a bug in MoveViewportInputMode that caused the inertia feature to mistakenly start moving the viewport after the mouse 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.
      • Fixed a bug in some input modes which led to undefined behavior if the mode has been uninstalled in a handler for its own events.

      GraphML

      • Fixed GraphML serialization and deserialization for certain configurations of GroupNodeStyle and RectangleNodeStyle.

      Animations

      • Layout animation performance has been improved for edges with many bends.

      Analysis

      • Fixed the issue of excessive memory consumption in the analysis algorithm Paths when a large number of start and end nodes were set.
      • The ShortestPaths class now correctly calculates the k-shortest paths of graphs (see methods ShortestPaths.KShortestPaths and ShortestPaths.KShortestPathsCursor). Previously, in rare cases, the algorithm sometimes produces wrong results, i.e., returns paths that are not the shortest.

      Layout

      Hierarchic Layout
      • Rare combinations of PortCandidates in PortCandidateSets no longer result in exceptions.
      • 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.
      Organic Layout
      • The OrganicLayout class no longer produces edge overlaps when property ChainRecognition is enabled.
      • In rare cases fixed nodes could move when also a group node was fixed.
      Radial Layout
      • The RadialLayout class no longer throws an exception if the layout algorithm is executed too many times from the same instance.
      Circular Layout
      • The CircularLayout class no longer throws an exception if property StarSubstructureStyle is set to StarSubstructureStyle.Radial and the whole input graph is a star.
      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 PreserveShapes or PreserveShapesUniform.
      Partial Layout
      • The PartialLayout class does no longer yield different results in rare cases when the same instance is applied twice to the same input graph.
      • The PartialLayout class now correctly places disconnected components for cases where a layout orientation is specified, and the property ComponentAssignmentStrategy is not Single. Previously, such components were sometimes placed far away from the remaining graph elements.
      Edge Router
      • The EdgeRouter class does no longer yield different results in rare cases when the same instance is applied twice to the same input graph.
      • The EdgeRouter class no longer produces self-crossing routes of edges with labels if property IntegratedEdgeLabeling is enabled.
      • 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.
      Orthogonal Layout
      • The OrthogonalLayout class no longer throws an exception for some input graphs with tree substructures when the TreeStyle is set to a value different from TreeLayoutStyle.None.

      Demo Improvements

      • Fixed BPMN-DI import for LaneSets in a Subprocess.

      Incompatible Changes

      Requirements

      • yFiles does not support .NET Core 3.1 anymore. Minimum .NET version is 6.0 now. Minimum .NET Framework version still is 4.0. For the Layout only packages, the minimum requirements still are .NET Framework 3.5 and .NET Standard 2.0
      • The Layout package, i.e. the package which provides only the layout and analysis library, now only provides libraries for .NET Framework 3.5 and .NET Standard 2.0. These are compatible with all supported .NET versions, though.

      API

      • The property GraphModelManager.LabelLayerPolicy has been marked as deprecated and may be removed in future releases. Use the more specific properties NodeLabelLayerPolicy, EdgeLabelLayerPolicy, and PortLabelLayerPolicy instead.
      • HoveredItemChangedEventArgs is no longer a subclass of the unrelated ItemEventArgs.
      • TreeNodeSource and AdjacencyNodesSource no longer inherit from NodeSource.
      • TreeBuilder.SetData only accepts a TreeNodesSource and no longer a NodesSource as a parameter.
      Layout
      • CactusGroupLayout.DefaultNodeComparator has been renamed to DefaultNodeComparer.

      Interaction

      • The ItemDroppedInputMode.DragDropped event is now raised after the drop gesture has actually finished, in line with how similar events are raised elsewhere.
      • Bends in edges that use ArcEdgeStyle, ArrowEdgeStyle, or BridgeEdgeStyle are no longer shown when selecting these edges. Additionally, marquee selection will not select these bends anymore even if they lie in the selection rectangle.
      • The MoveInputMode, MoveLabelInputMode, and HandleInputMode sub-modes of GraphEditorInputMode no longer have a pre-set SnapContext. Instead, they take the SnapContext from the InputModeContext. That way, changing the SnapContext on GraphEditorInputMode will also affect the sub-modes.

      Changes of Default Behavior

      • EdgePathLabelModel and EdgeSegmentLabelModel have been modified to yield better results for some degenerate path cases. This leads to greater visual stability when the path is not long enough for the label or even completely invisible due to overlapping nodes. Technically, this can result in slightly different placements with the same parameter values in these edge-cases.
      • Adding a label with GroupNodeLabelModel to a node that does not use GroupNodeStyle or setting a GroupNodeLabelModel-created parameter for a label whose owner node does not use GroupNodeStyle no longer throws an ArgumentException claiming "The parameter does not support this kind of label.".
      • If GroupNodeStyle's tab width is set to 0, the tab width does not reduce the corner radius of the style's outline anymore. However, it still forces the corner radius of the style's inner corners (i.e. the corners of the content area on the side of the style's tab) to 0.
      Layout
      • The EdgeRouter class now ignores inner node labels by default, see property IgnoreInnerNodeLabels. Previously, this property was disabled by default.

      yFiles.NET 5.5.0.1

      Bugfixes

      View

      • 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

      • 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 ExpandGroup and EnterGroup commands do not create empty undo units anymore if nothing has changed.
      • NavigationInputMode.ExitGroup and the ExitGroup 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

      • 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

      • GroupNodeStyle's collapse/expand icon can now be reliably hit in all cases. In rare cases, changing the value of one the properties that affect the icon's location were not taken into account for hit tests.
      • ShapeNodeStyleRenderer now always uses the protected GetBrush and GetPen methods for all shapes instead of falling back to the respective style properties for some shapes.
      • ImageNodeStyleRenderer's GetBounds method now returns the actual image bounds instead of the node layout's bounds if KeepAspectRatio is enabled.
      • DefaultLabelStyle now adds ellipsis more reliably at the end when the text does not fit into the specified text wrapping shape.

      Table

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

      GraphML

      • Fixed an issue in GraphMLIOHandler's WriteEvents where the DataWriting event has been dispatched after the writing process instead of before.
      • Fixed GraphML serialization and deserialization for certain configurations of GroupNodeStyle and RectangleNodeStyle.

      GraphBuilder

      • 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.

      Layout

        Edge Router
        • 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.
        Circular Layout
        • A circular layout with LayoutStyle.BccIsolated can no longer get into an infinite loop for inputs where a component consists only of articulation points.
        Generic Labeling
        • 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.
        Hierarchical Layout
        • 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 now satisfies property OrganicLayout.Deterministic 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.SeparatedRadial).
        Orthogonal Layout
        • The OrthogonalLayout class no longer generates overlaps between edge segments (of a parallel edge) and edge labels of other edges for some rare scenarios.
        Single Cycle Layout
        • The SingleCycleLayout class no longer produces violations of the specified minimum node distance.

        Incompatible Changes

          Minor

          • 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.

          yFiles.NET 5.5

          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 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), Star5Up (a five-pointed star with one tip pointing upwards), and Pill (a stadium shape with the shorter sides rounded).

          Its new property KeepIntrinsicAspectRatio 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.

          The LargeGraphsAggregation demo has been modified to demonstrate that layout.

          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 that 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.TabularGroupChildComparers 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 DiskNested 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).

          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.

          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.

          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 yWorks.Layout.Intersections class provides the functionality also for the LayoutGraph API, but offers less convenience.

          Improvements

          General

          • yFiles now provides assemblies for .NET 7. The assemblies for .NET 5 have been removed.
          • 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

          • The MoveViewportInputMode.Uninstall method is now virtual and can be overridden in derived classes.
          • 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.
          • 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.
          • IReparentHandler.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 SelectionGrouping and SelectionGrouped events at the start and end of the GroupSelection method. Similarly, the SelectionUngrouping and SelectionUngrouped 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.
          • The input modes do not perform hit tests upon automatically repeated key down events for modifier keys anymore.

          Styles

          • Added a new property KeepAspectRatio to ImageNodeStyle and MemoryImageNodeStyle to support keeping the image's aspect ration during resizes.
          • Nodes rendered with the ShapeNodeStyle now respect their actual outline shape when selected with the LassoSelectionInputMode.
          • The icon for IconLabelStyle is now rendered above the wrapped label style. This enables the icon to be rendered above the background provided by DefaultLabelStyle.
          • DefaultLabelStyleRenderer.GetPreferredSize has been made virtual.
          • CollapsibleNodeStyleDecorator now can handle rotated icons.

          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.UserDefined. 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 InsertedGroupNodeDpKey.
          • 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.GroupNodes, LabelLayerPolicy.AtOwner and undo no longer throws a NullReferenceException.
          • 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 never have 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.
          • Fixed potential text clipping issue with HighDPI displays in conjunction with display scaling.

          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.

          Interaction

          • 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.
          • Setting the CanvasControl.DoubleClickTime to one second no longer causes an exception and setting it above one second now correctly considers the total duration, not just the fractional second part, in ClickInputMode.
          • The QueryItemToolTip event of the GraphEditorInputMode and GraphViewerInputMode is now only triggered once when hovering over a graph element instead of twice.

          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.
          • DefaultLabelStyle now considers the NoWrap flag of the FormatFlags of its StringFormat property correctly. Previously ClipText was often used to determine the clip and wrap behavior.
          • DefaultLabelStyle's NormalizeBrushes now properly handles rotated brushes.
          • ImageIcon now considers the pixel size of the image for painting instead of the physical size. This means it is now consistent with its own Size property.
          • Setting a new projection on CanvasControl now correctly keeps the viewport center the same.

          Licensing

          • License validation no longer fails when dynamic assemblies are loaded or yFiles code is called indirectly from dynamic methods. This could have resulted in licensing failures, e.g. when using yFiles in ASP.NET web services.

          GraphML

          • The key parameter of InputHandlerBase.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.

          GraphBuilder

          • Label bindings which don't provide label data (or null) no longer add empty labels. Instead, no label will be added.

          Designer

          • Setting the GraphEditorInputMode or GraphViewerInputMode in the Visual Studio Designer no longer causes an Exception in the designer.

          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.

          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).

          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 PreserveShapes or PreserveShapesUniform.
          • 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.MinimumNodeSizeDpKey). Previously, the minimum sizes were always enlarged by the groups' insets (see GroupingKeys.GroupNodeInsetsDpKey). Actually, the minimum size should include the insets.
          • The OrthogonalLayout class now correctly handles input graphs with parallel edges if the PreferParallelRoutes property is enabled. Previously, such inputs have caused exceptions in some rare cases.

          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.

          Generic Labeling

          • The GenericLabeling class no longer produces superfluous label overlaps if one of its RemoveNodeOverlaps or RemoveEdgeOverlaps properties is enabled.

          Layout

          • TableLayoutConfigurator now considers the correct \OriginalPosition of the \RowDescriptor and \ColumnDescriptor 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.
          • CurveRoutingStage now correctly uses the MinimumNodeToEdgeDistance from the edge layout descriptor.
          • EdgeRouter now indeed stops more reliably close to its maximum duration. This has been reported as improved before, but did not actually work.
          • 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.
            • yWorks.Layout.LayoutMultiplexer: The getCoreLayout method has been renamed to GetCoreLayout.
            • yWorks.Layout.Multipage.MultiPageLayout: The calculateLayout method has been renamed to CalculateLayout.
            • yWorks.Layout.Organic.OrganicLayout: The configureComponentLayout method has been renamed to ConfigureComponentLayout.
            • 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 WeakDictionaryMapper<K, V> now is constrained to reference types as keys.
            • The DataProviderAdapter.Defined method has been removed since it had no effect.
            • The NodeLabelingPolicy enum has been moved from yWorks.Layout.Tree to yWorks.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.SubComponentIdDpKey and HierarchicLayout.SubComponentLayoutAlgorithmDpKey are replaced by the new key HierarchicLayout.SubcomponentDescriptorDpKey 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.ComponentLayoutAlgorithmDpKey was removed and the name of the key TemporaryGroupNodeInsertionStage.ComponentIdDpKey was changed to TemporaryGroupDescriptorDpKey.

            Styles

            • The property DefaultLabelStyle.ClipText does not influence the text wrapping behavior anymore but is only used to clip any text outside the label bounds.

            Changes of Default Behavior

            • Licensing via the License Compiler now only works for .NET Framework. Previously, using a .licx file in the project would still work with .NET 5 and earlier when building in Visual Studio (though not on the command line). The recommended way to embed the yFiles.NET license is adding the license XML file as an embedded resource, which will work reliably in all supported platforms and target frameworks.
            • 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.

            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.

            Demo Improvements

            Improvements

            • The ZOrder demo's ZOrderSupport does not use custom overrides of GraphEditorInputMode, GraphModelManager, and GraphMLIOHandler anymore. That way, using the ZOrderSupport class in other applications that already use a custom GraphEditorInputMode or GraphModelManager is now easier.

            New Demos

            • 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.
            • The Simple Arrow Demo shows how to implement a custom arrow.
            • The Sankey demo shows how to visualize flow information in which the thickness of the edges is proportional to the flow quantity.

            yFiles.NET 5.4.0.2

            Improvements

              Hierarchic Layout

              • 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.

              Bugfixes

                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.

                Interaction

                • 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.

                View

                • Fixed a bug that resulted in a NullReferenceException when HierarchicNestingPolicy.GroupNodes, LabelLayerPolicy.AtOwner and undo support were used together.
                • Viewport animations no longer suddenly stop when the zoom level is near CanvasControl.MinimumZoom or MaximumZoom.

                Generic Labeling

                • The GenericLabeling class no longer produces superfluous label overlaps if one of its RemoveNodeOverlaps or RemoveEdgeOverlaps properties is enabled.

                Orthogonal Layout

                • The OrthogonalLayout class now correctly considers the specified minimum group node sizes (see GroupingKeys.MinimumNodeSizeDpKey). Previously, the minimum sizes were always enlarged by the groups' insets (see GroupingKeys.GroupNodeInsetsDpKey). Actually, the minimum size should include the insets.

                Hierarchic Layout

                • The SimplexNodePlacer class used by the HierarchicLayout no longer throws an error due to an internal overflow for very wide layouts.

                Layout

                • 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.

                yFiles.NET 5.4.0.1

                Bugfixes

                Interaction

                • TableEditorInputMode no longer changes the GraphControl's Selection property unnecessarily when GraphControl's Graph property is changed.
                • HandleInputMode is no longer canceled if a handle is removed during its own DragFinished call. This fixes some very rare exceptions under complicated circumstances.
                • CreateEdgeInputMode now correctly toggles the direction of an orthogonal edge segment when the mouse is over a potential target.

                Licensing

                • License validation no longer fails when dynamic assemblies are loaded or yFiles code is called indirectly from dynamic methods. This could have resulted in licensing failures, e.g. when using yFiles in ASP.NET web services.

                Graph

                • The FilteredGraphWrapper class now raises the correct events when filtering out port labels. Previously, the events contained incorrect owner information.
                • The CompositeUndoUnit.UndoName property now indeed sets the undo name, not the redo name.

                Styles

                • 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.

                Hierarchic Layout

                • The HierarchicLayout class now correctly considers the specified halos of group nodes when there is a partition grid defined.
                • The HierarchicLayout class no longer produces misplaced edge labels for some rare cases with grouped edges.
                • 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 correctly routes grouped edges, where previously there could be overlaps of nodes and edges in some rare cases.
                • 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 no longer produces superfluous port overlaps if there are edges with strong port constraints.
                • 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.

                Organic Layout

                • 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 produces correct results if auto-clustering is enabled (i.e., its ClusteringPolicy property is not None) and the GroupNodeMode property is set to FixBounds or FixContents.
                • 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 handles nodes with several degree-one neighbors. Previously, such inputs could cause arrangement artifacts if the StarSubstructureStyle was None.
                • The OrganicLayout class now correctly detects chain substructures if there are nodes of different types (OrganicLayoutData.NodeTypes).

                Orthogonal Layout

                • The OrthogonalLayout class now correctly handles input graphs with parallel edges if the PreferParallelRoutes property is enabled. Previously, such inputs have caused exceptions in some rare cases.

                Circular Layout

                • The CircularLayout class no longer crashes when applying it on a graph that contains parallel edges and both edge bundling is enabled and node types are defined.
                • The CircularLayout class no longer produces node overlaps if the SingleCycleLayout.MinimumNodeDistance property is set to 0.

                Clear Area Layout

                • The ClearAreaLayout class now correctly considers the initial partition grid assignment of nodes.
                • The ClearAreaLayout class now correctly routes the edges if its EdgeRoutingStrategy property is set to Straightline. Previously, in some rare cases, this setting could cause broken edge routes.

                Partial Layout

                • The PartialLayout class now correctly routes the edges if its AllowMovingFixedElements property is enabled. Previously, in some rare cases, this setting could cause broken edge routes.

                Edge Router

                • The EdgeRouter class no longer produces artifacts if there are edges with curved routing style and labels, and the integrated edge labeling is disabled (see property EdgeRouter.IntegratedEdgeLabeling).
                • The EdgeRouter class now correctly handles direct content edges that are incident to group nodes with PortCandidateSets.

                Layout

                • TableLayoutConfigurator now considers the correct OriginalPositions of the RowDescriptors and ColumnDescriptors when table insets are used.
                • TableLayoutConfigurator now treats tables without rows or columns as tables with exactly one row and column instead of throwing an exception.
                • EdgeRouter now correctly considers octilinear segments when using the SegmentsAsNeeded or PathAsNeeded RoutingPolicy enumeration value.
                • The graph's UndoEngine no longer gets corrupted after an exception in a layout algorithm has been raised and caught.
                • The TabularLayout class now correctly handles the case that the input graph contains only a single node. Previously, the node was not properly assigned to a partition cell and the partition cell row/column did not get correct values for its computed width, height and position.

                View

                • Changing the GraphControl.GraphModelManager property no longer leaks memory in certain situations.
                • The CanvasControl.ZoomToAnimated method now works correctly when a CanvasControl.Projection is set. This has previously been reported as fixed, but was not.
                • Fixed a bug in ContextConfigurator which resulted in misplaced decorations if the decorations were rendered in view coordinates and a scale value other than 1 was used.
                • Fixed an OutOfMemoryException which could occur if nodes with a width or height < 1e-6 were rendererd.

                yFiles.NET 5.4

                This release brings a couple of exciting new major features and lots of other smaller new features, improvements, and bugfixes for all parts of the library.

                Major New Features

                Smooth viewport animations

                Many viewport transitions are now smoothly animated. This prominently includes scrolling and zooming with the mouse wheel, but also the various commands, such as zooming via a toolbar button, fitting the graph into the viewport, interacting with the overview, and many others. This can be turned off for individual interactions via the new CanvasControl.AnimatedViewportChanges property, and customized with the new protected method CanvasControl.GetViewportAnimationDuration.

                Support Nodes of Different Types in Layout

                Many of the yFiles layout styles now support node types. Typically, a layout places nodes of the same type closer together or in a similar way. The following layout styles support node types:

                In the HierarchicLayout class, types influence the ordering of nodes within their layers as a subordinate optimization criteria. More precisely, nodes of the same type are more likely to be placed next to each other if this does not violate other constraints.

                For the TreeLayout and ClassicTreeLayout classes 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 a weak criterion, i.e., if the ordering and placement is determined by other constraints, these are prioritized. Types can be defined via the TreeLayoutData.NodeTypes property.

                The OrganicLayout class now allows to define node types via the new OrganicLayoutData.NodeTypes property . The types control the detection of substructures (e.g. stars, parallel structures). When types are defined, only nodes of the same type can form a substructure. For star-like and parallel substructures, it is also possible to have a single substructure with nodes of different types, see properties ParallelSubstructureTypeSeparation and StarSubstructureTypeSeparation. The algorithm still tries to highlight the different types by choosing a suitable layout for these components (e.g., placing nodes of the same type closer together or on the same circle).

                The OrthogonalLayout class now allows to define node types via the new OrthogonalLayoutData.NodeTypes property. The types control the detection of substructures, i.e., chains, cycles and trees. When types are defined, only nodes of the same type can form a substructure.

                The CircularLayout class is now able to separate nodes that are on the same cycle with respect to their node type. For this, the new NodeTypeAwareSequencer class can be set as NodeSequencer on the CircularLayout.SingleCycleLayout. Node types are specified via the CircularLayoutData.NodeTypes property.

                The ComponentLayout class now supports node types. The types influence the arrangement and ordering of the the components such that components consisting mostly of nodes of the same type are put close to other components consisting of nodes of that type. Use the ComponentLayoutData.NodeTypes property to define types.

                The node types feature is shown in the new Node Types Demo.

                Edge Routing Only if Needed

                Optionally, the EdgeRouter, ChannelEdgeRouter and BusRouter classes now automatically determine whether or not a new path should be calculated for a certain edge. This is controlled via the new properties EdgeRouterEdgeLayoutDescriptor.RoutingPolicy, ChannelEdgeRouter.RoutingPolicy and BusRouterBusDescriptor.RoutingPolicy, respectively. The decision is based on the quality of the existing routes - edges with strict violations of the routing style or that intersect other elements will be selected for routing. Available options:

                • RoutingPolicy.Always: A new route is calculated in any case. This was the previous behavior and remains the default.
                • RoutingPolicy.PathAsNeeded: The algorithm determines whether a new route is needed. If an edge is selected, its current path is not considered when computing a new route.
                • RoutingPolicy.SegmentsAsNeeded: The algorithm determines whether a new route is needed. If an edge is selected, its current path is preserved as much as possible. Only the required segments are changed. This is only supported by the EdgeRouter class.

                The new penalty property PenaltySettings.SketchViolationPenalty supported by the EdgeRouter class defines the cost for a deviation from the original edge path if the new routing policy property is set to SegmentsAsNeeded.

                Support for .NET 6.0
                To facilitate using our library with .NET 6.0 and to improve compatibility a .NET 6.0 version of the library has been added. Also, the demo and tutorial samples now automatically reference the highest .NET SDK which is available on the current machine.

                New Features

                View

                • The new EdgePathPortLocationModel for ports owned by edges can be used to define port locations as a ratio of the edge path length. This keeps the port location stable when bends are added onto the edge path, for example during orthogonal edge editing.
                • Added a mechanism to support disposing and caching Visuals which are created by IVisualCreator.CreateVisual:
                  • Added methods SetDisposeCallback, ChildVisualRemoved, and RegisterForChildrenIfNecessary to support the registration of a callback for disposal.
                  • Added the delegate DisposeVisualCallback for this purpose.

                Analysis

                • The new TreeAnalysis algorithm offers a convenient way of analyzing tree structures and querying tree-related properties (e.g. leaf nodes, parent-child relations and more).

                GraphBuilder

                • The graph and tree builders now support bindings for bend locations. This is implemented by new bend-related members of the EdgeCreator class.

                Algorithms

                • The new ParallelEdges.FindParallelEdges method allows to find all sets of parallel edges contained in a given graph or incident to a specific node.

                Layout

                • The new GenericLayoutData class is a generic implementation of LayoutData that allows to pass arbitrary data to layout stages. As a consequence, the LayoutData.Apply, ItemCollection.ProvideMapper and ItemMapping.ProvideMapper methods were removed.
                • The new SelfLoopRouterData class specifies custom data for the SelfLoopRouter class. In more details, it allows to define which self-loop edges should be routed and which should keep their current path.
                • The new PortPlacementStageData class specifies custom data for the PortPlacementStage class. In more details, it allows to define port candidates, port constraints, and node port candidate sets which are then considered by that layout stage.
                • The SubgraphLayout class now allows to define which edges must be included or excluded in the subgraph. Previously, only nodes could be specified. The new SubgraphLayoutData class offers the SubgraphNodes and SubgraphEdges properties to conveniently define the nodes and edges that should form the subgraph the core layout runs on.
                • The OrganicLayout class offers the new ClusteringPolicy property, which allows to specify the clustering algorithm that is applied to the input graph. Three clustering algorithms are available: Louvain modularity, edge betweenness, and label propagation. Previously, the node clustering was always based on edge betweenness. By default, clustering is disabled.
                • The PartialLayout class offers a new property MoveFixedElements to allow moving fixed elements. This often yields a better layout quality even though the preservation of the mental map declines because the fixed elements may change their position.
                • The OrganicLayout and ClassicOrganicLayout classes support the new scope MainlySubsetGeometric. In addition to the actual affected nodes, this scope may to some degree move nodes that are geometrically close to an affected node. The existing scope MainlySubset is similar, but it does determine the closeness of other nodes by using the graph structure instead of the current geometry (i.e. location).

                New Demos

                • The new LensInputMode demo shows how to create an InputMode to show a magnifying glass effect on the canvas.
                • The new Neo4JIntegrationDemo shows how the Neo4J.Driver library can be included in yFiles applications to create diagrams from Neo4J databases.
                • The new NodeTypes demo shows how to use the node type support of the yFiles layout algorithms.

                Improvements

                Interaction

                • The new HandleInputMode.QueryClosestHandle event can be used to provide the closest handle for a certain query location.
                • Tooltip contents can now be provided asynchronously. As an alternative to setting the tooltip content directly, the ToolTipQueryEventArgs class also accepts a Task that provides the tooltip content asynchronously.
                • The HandleInputMode.BeginDragging method now returns a Task which indicates whether the drag of a handle has been finished or canceled.
                • Validation of the text of edited labels can now be provided asynchronously. The new LabelTextValidationEventArgs.ValidatedText property accepts a Task that provides the validated text asynchronously.
                • Changing the selection state of a large number of elements is now faster.
                • The OrthogonalEdgeEditingContext.CreateOrthogonalEdgeDragHandler method now accepts an IPortOwner instead of only an INode as dragged item. This can be used for custom edge drag handling that should support orthogonal edge editing.
                • The ItemCopiedEventArgs class now guarantees that its Original and Copy properties are not null.

                Graph

                • The DefaultFolderNodeConverter and FoldingEdgeConverterBase classes now have PortLabelStyle and PortLabelLayoutParameter properties to control the style and label layout parameter of copied port labels.
                • The new NodeInsetsProvider class is an INodeInsetsProvider that returns the same insets for each node.

                View

                • The CanvasControl.EnsureVisible, CanvasControl.FitContent, and GraphControl.FitGraphBounds methods now return a Task that completes when the view port adjustment has been finished.
                • The new Install and Uninstall methods of the GraphModelManager class simplify exchanging the manager used by a GraphControl. They are called when setting/removing a GraphModelManager as GraphControl.GraphModelManager and should also be called when combining a GraphModelManager with a CanvasControl.
                • The new Animations.CreateDelay method creates an animation that does nothing. This is especially useful in combination with other animations that run in parallel or in sequence to create complex multi-sequence animations. The accompanying extension method CreateDelayedAnimation for the IAnimation interface delays the provided animation.
                • The CanvasControl.EnsureVisible method now respects margins defined by the CanvasControl.ContentMargins property . Ensure visible is called for example by keyboard navigation,.
                • The Zoom command now respects margins defined by the CanvasControl.ContentMargins property when executed with a rectangle as parameter.
                • The ZoomToCurrentItemCommand now respects the margins defined in the CanvasControl.ContentMargins property.
                • Setting the various descriptor properties of the GraphModelManager class no longer causes updates for every installed item if the descriptor hasn't actually changed.
                • The OverviewInputMode now renders its handle on top of the viewport rectangle instead of below it.
                • The ViewportLimiter.LimitViewport method now has an optional parameter that enforces the ViewportLimitingPolicy.Strict policy.
                • The CanvasControl.EnsureVisible method now has an additional parameter to specify insets to keep around what to make visible in the viewport.
                • The CanvasControl.EnsureVisible method now has an additional overload to make a set of points visible in the viewport. This is mainly useful when using a Projection and trying to make something visible that is not a rectangle in world coordinates.
                • All of the following features no longer block user interaction: the viewport animations for CanvasControl.EnsureVisible, executing scroll commands when the CanvasControl.AnimateScrollCommands property is enabled, and executing GraphControl.ZoomToCurrentItemCommand.
                • The CanvasControl.FitContent and GraphControl.FitGraphBounds methods now have an optional parameter that allows changing the viewport in an animated fashion.
                • TextVisual has a new property MaximumSize. Text will be clipped if a value is set and the text is larger than that value.
                • The PixelImageExporter's SmoothingMode, TextRenderingHint, and InterpolationMode properties now default to high quality rendering.

                GraphBuilder

                • The GraphBuilder, TreeBuilder, and AdjacencyGraphBuilder classes no longer throw Exceptions during calls to UpdateGraph when the graph was modified.

                Hierarchic Layout

                • The HierarchicLayout class now has an improved strategy for choosing the port candidates for same-layer edges with multiple available candidates. Previously, the chosen candidate may have led to superfluous back-loops.
                • The HierarchicLayout class now generates shorter paths for edges that cross borders of PartitionGrid columns in cases where there are no other obvious constraints that require the edge to be longer. This holds for the default vertical layout orientation; for a horizontal orientation, edges that cross borders of rows are affected by this improvement.
                • The HierarchicLayout class now considers the edge direction when choosing a port candidate for edges with multiple candidates. This new strategy often leads to less bends.

                Organic Layout

                • For the substructures in the OrganicLayout it is now possible to explicitly specify whether structures are allowed to be nested or not. Previously, substructures were allowed to be nested by default. New styles were added while the old styles now will not generated nested structures anymore.
                  • Star structures offer the new styles StarSubstructureStyle.RadialNested and StarSubstructureStyle.CircularNested.
                  • ChainSubstructureStyle.RectangularNested and ChainSubstructureStyle.StraightLineNested are the new styles for nested chains.
                  • CycleSubstructureStyle.CircularNested is the new style for nested cycles.
                • The OrganicLayout class now offers the possibility to define the minimum sizes of substructures (stars, chains, cycles and parallel structures). Structures of smaller size are not handled as a substructure. For each type of structure a new property was added: OrganicLayout.StarSubstructureSize, OrganicLayout.ChainSubstructureSize, OrganicLayout.CycleSubstructureSize and OrganicLayout.ParallelSubstructureSize.
                • With substructures, the OrganicLayout class now often produces more compact results and comes with an improved placement of degree-one nodes.
                • When specified for the OrganicLayout class, the scope MainlySubset now works together with more of its other features and constraints, and has a larger impact. For example, it previously had very little or no effect when a partition grid or an output restriction was defined.

                Edge Routing

                • When the EdgeRouter class runs with a highly restricted maximum duration or is aborted via the AbortHandler class, i.e., the router operates in the fastest possible mode, the calculated edge routes now are of higher quality. The quality improvements mainly affect cases with fixed port locations.
                • The EdgeRouter class now allows to explicitly define the costs for different types of edge crossings. The new properties PenaltySettings.AdjacentEdgeCrossingPenalty and PenaltySettings.SelfCrossingPenalty relate to crossings between two adjacent edges and crossings between two line segments that belong to the same edge, respectively. Previously, all types of crossings were covered by the existing EdgeCrossingPenalty property.
                  • By default, now, crossings of adjacent edges are more expensive than normal ones and self-crossings are the most expensive.
                  • Furthermore, the default values of the EdgeLengthPenalty and GroupNodeCrossingPenalty properties were increased to obtain more balanced results.
                • The EdgeRouter class now produces more suitable routes for edges with octilinear routing style. Previously, the diagonal segments where often omitted after/before an edge's first/last segment.

                Layout

                • The new BalloonLayoutData.OutEdgeComparer property specifies a comparison function used to sort a nodes' outgoing edges.
                • The new LayoutGraphAdapter.OriginalTagDpKey data provider key provides access to the object stored in the tag property of the original graph item from within custom layout code.
                • The quality of the curved edge routing was improved with respect to various aspects and such that it yields aesthetically nicer curves. To further configure the curve routing, the following settings were added.
                  • CurveShortcuts: if shortcuts are allowed, curves can become smoother and more direct but may violate other constraints (e.g. edge-edge distance). Available for HierarchicLayout (RoutingStyle.CurveShortcuts), EdgeRouter (EdgeLayoutDescriptor.CurveShortcuts) and CurveRoutingStage (CurveEdgeLayoutDescriptor.CurveShortcuts).
                  • CurveUTurnSymmetry: allows to specify the symmetry preference for u-turns (180 degree turns) of curved routes. The default is zero so that results are equal to previous results. Available for HierarchicLayout (RoutingStyle.CurveUTurnSymmetry), EdgeRouter (EdgeLayoutDescriptor.CurveUTurnSymmetry) and CurveRoutingStage (CurveEdgeLayoutDescriptor.CurveUTurnSymmetry).
                • The HierarchicLayout, EdgeRouter, and CurveRoutingStage classes now avoid unnecessary, consecutive Bezier segments for modeling larger straight-line parts of an edge path. The resulting reduced bend count improves the user experience when working with the BezierEdgeStyle.
                • The ClassicTreeLayout class now features properties MinimumFirstSegmentLength and MinimumLastSegmentLength that allow to specify the minimum first and last segment length for the orthogonal routing style.
                • The new ParallelEdgeRouterData.RoutedParallelEdges property returns which edges the ParallelEdgeRouter class routed and thus were hidden during the core layout. This can be useful if parallel, non-leading edges need further handling, e.g., for placing their labels.

                Demo Improvements

                • The demo and tutorial projects for .NET Framework have been updated to target the most recent .NET Framework SDK.
                • The .NET demos and tutorials now automatically reference the newest .NET SDK which is available on the machine they are installed on.

                Bugfixes

                View

                • The mouse event coordinates are no longer quantized to very large steps if a projection is used and the viewport is zoomed in afterwards.
                • The clipboard now doesn't copy labels or ports if they are not selected and their owner's IClipboardHelper forbids copying the owner.
                • The ZoomToCurrentItem command no longer moves the current item outside the visible area in rare cases. This was caused by a problem in the ViewportLimiter class.
                • Callbacks registered for removed visuals on the CanvasObject tree now reliably run after the visual is indeed no longer visible.
                • Callbacks registered with the IRenderContext.SetDisposeCallback method now are reliably called, even when a canvas object has been explicitly removed.
                • The CanvasControl.EnsureVisible method no longer ignores the limited viewport size in certain cases.
                • The Scale is honored for the VisibilityThreshold of the GridVisual.
                • EmfImageExporter now properly extends the background brush into the margins.

                Interaction

                • When expanding a closed group, the parent groups of the expanded group no longer become unnecessarily large. The incorrect behavior could be observed only under certain conditions and was caused by a bug in the NavigationInputMode class.
                • Auto dragging was not stopped in certain cases.
                • The text box shown by the TextEditorInputMode class is now correctly placed if the TextBoxPlacementPolicy.MoveTextBox is set and a projection is used.
                • Fixed editing self-loops with PolylineEdgeStyle and orthogonal edge editing enabled.

                Graph

                • The ITable.StripeChanged event now reports the correct parent when re-parenting will be undone or redone.
                • A label with EdgeSegmentLabelModel or EdgePathLabelModel now moves steadily when the segment to which it belongs moves.
                • The FilteredGraphWrapper class now dispatches ParentChanged events in the correct order after predicate changes.
                • All SetFactory methods of the Node-, Edge-, Label-, Port-, and BendDecorator classes now respect the NullIsFallback property.

                Styles

                • The parameter of type IShapeGeometry of the DefaultEdgePathCropper.IsInside and GetIntersection methods is now nullable.

                Geometry

                • The Area property of an empty RectD instance (including RectD.Empty) is now always zero, and no longer a negative value.

                Hierarchic Layout

                • The HierarchicLayout class no longer produces an infinite looping issue in the incremental layout mode for some input graphs with layer constraints that specify that a node should be placed in the topmost/bottommost layer.
                • The HierarchicLayout class no longer produces unnecessary edge crossings between self-loop edges at the same node in cases where a larger number of self-loops exist at a node.
                • The HierarchicLayout class no longer ignores edges connected to group nodes when the group node contains a bus structure (see HierarchicLayoutData.Buses) and no other elements. Such edges were previously actually removed from the layout graph such that other stages (e.g. the ComponentLayout) could have failed with an exception.
                • The HierarchicLayout class no longer occasionally throws an exception when enabling HierarchicLayout.CompactGroups and in conjunction with layering constraints and/or a group node marked as incremental.
                • The HierarchicLayout class does no longer violate the specified minimum length for edges incident to group nodes.
                • The sequencing phase of the HierarchicLayout class is now faster for large graphs with sequence constraints and non-incremental layout mode.

                Edge Routing

                • The BusRouter class now produces more suitable edge routes for rare cases that were caused by an unsuitable bus placement.
                • The EdgeRouter class now uses the given ports for edges of a bus with fixed edges.
                • The EdgeRouter class now correctly considers edges incident to a fixed inner port of a group node when the routing algorithm has restricted maximum duration. Previously, this setup sometimes led to strange edge routes with many superfluous bends.
                • The CurveRoutingStage class now correctly considers the minimum distance to nodes specified as value of the CurveEdgeLayoutDescriptor.MinimumNodeToEdgeDistance property. Previously, the curves could violate the distance and get too close to nodes.
                • The EdgeRouter class no longer contains edges with self-crossings in some rare cases where it previously failed to eliminate them.
                • The EdgeRouter and CurveRoutingStage classes no longer change the path of unaffected (fixed) edges when the CreateControlPoints property of their associated EdgeLayoutDescriptor instance (CurveEdgeLayoutDescriptor respectively) is enabled.
                • The EdgeRouter class now correctly supports the use case that a subset of edges is routed with the curved routing style while another subset is routed with another routing style and different settings on the associated individual EdgeLayoutDescriptor instances. Previously, with some edges being curved, the settings of the other edges got lost and the default settings were used.
                • The OrthogonalSegmentDistributionStage class does no longer crash when receiving input graphs with a very large edge count (greater than approximately 22000). Note that the ChannelEdgeRouter class is affected too, as the stage is by default called from within the router.
                • The EdgeRouter class no longer has a problem that appeared with a bus containing affected as well as non-affected (fixed) edges at the same time. Previously, this could trigger an Exception or lead to the incorrect behavior that an actually affected other edge was not routed.
                • The EdgeRouter class no longer occasionally throws an exception if the input contains bus edges defined via BusDescriptor.
                • The BusRouter class no longer fails to generate connected buses for cases with fixed and incremental edges on the same bus. Previously it sometimes generated a disjoint bus even though the bus IDs were equal.
                • The BusRouter class no longer ignores edges that should be routed when a they are on a bus with fixed edges (see BusDescriptor.Fixed property) and when they share both source and target port with a fixed edge.
                • The EdgeRouter class no longer has a problem that occasionally resulted in bad edge routing artifacts if edge grouping is enabled and non-affected edges are grouped at both end points.*.
                • The ParallelEdgeRouter class no longer throws an exception if the input has both a large number of parallel edges and a leading edge with ports on the node border.
                • The EdgeRouter class no longer occasionally throws an exception if the input contains bus edges (defined via BusDescriptor).
                • The OrganicEdgeRouter.KeepExistingBends property now correctly obeys its definition and actually keeps the absolute coordinates of the existing bends.

                Layout

                • The comparison delegates defined in TreeLayoutData.OutEdgeComparers and SeriesParallelLayoutData.OutEdgeComparers no longer receive null elements during runtime.
                • The SimpleProfitModel class now computes meaningful different profits based on the PreferredPlacementDescriptor for candidates that belong to a SliderEdgeLabelLayoutModel or a DiscreteEdgeLabelLayoutModel. Previously, the computed profit was equal for all candidates.
                • Fixed a bug in LayoutExecutor which caused port labels not to be placed in their calculated position after a layout animation.
                • The LayoutExecutor class now uses the correct target bounds when a projection is set on the GraphControl.
                • The OrganicLayout class no longer throws an exception when running it on a graph with a partition grid, group nodes and such that the IDs of the group nodes (see provider key GroupingKeys.NodeIdDpKey) are defined using a provider that cannot handle null as argument to its get method.
                • The OrganicLayout and ClassicOrganicLayout classes no longer cause undesired layout side effects when a mapper is registered with key RecursiveGroupLayout.GroupNodeLayoutDpKey or when data is provided via the RecursiveGroupLayoutData.GroupNodeLayouts property. Previously, the layout algorithms registered there could be applied to nodes that should actually be kept fix by the organic layout.
                • The HierarchicLayout class now correctly considers the specified port groups for edges (see HierarchicLayoutData.SourcePortGroupIds). Previously, such groups were not always considered properly if there are either critical edges or property SimplexNodePlacer.StraightenEdges is enabled.
                • The HierarchicLayout class now correctly handles grouped input graphs if the node compaction is enabled (see property SimplexNodePlacer.NodeCompaction). Previously, the algorithm sometimes produced less compact results for such inputs.
                • The HierarchicLayout class now adheres more closely to its maximum duration and its AbortHandler when property SimplexNodePlacer.BendReduction is enabled.
                • The HierarchicLayout 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.
                • The HierarchicLayout now correctly processes input graphs with sub-components (HierarchicLayoutData.SubComponents) and curved edge routing style. Previously, such setups may have a caused an exception.
                • The HierarchicLayout class now correctly considers the specified critical edge priorities (see HierarchicLayoutData.CriticalEdgePriorities) if the input graph contains grouped edges.
                • The CircularLayout class no longer produces node label overlaps when its PlaceChildrenOnCommonRadius property is disabled.
                • The EdgeRouter class no longer generates unnecessary detours in the routes when it is configured with MonotonicPathRestriction.Both.
                • The ClearAreaLayout class now correctly considers node labels. Previously, there could be results where node labels intersected with the specified area to be cleared.
                • The HierarchicLayout class now adheres more closely to its maximum duration and its AbortHandler.
                • The ParallelEdgeRouter class now produces correct parallel routes if its JoinEnds property is enabled.
                • Improved the reaction time of the EdgeRouter class when the MaximumDuration is exceeded or the algorithm should stop due to AbortHandler for some cases where previously the search for a path kept on running for a long time.
                • The RadialLayout class is now much faster if the input graph is a very large tree structure.
                • The OrganicLayout and ClassicOrganicLayout classes no longer produce an internal integer overflow that may lead to an early exit and, thus, poor layout results for very large input graphs.
                • The ClearAreaLayout class no longer throws an exception for some scenarios where the same algorithm instance was first applied to a graph with PartitionGrid and later to a graph without grid.
                • The ClearAreaLayout and FillAreaLayout classes no longer throw an exception for some input graphs with edge labels if property ConsiderEdgeLabels is enabled.
                • The TreeLayout class now correctly handles trees with group nodes. Previously, it sometimes produced overlapping elements and halo violations for such inputs.
                • Curved edge routes generated by HierarchicLayout, EdgeRouter and CurveRoutingStage no longer contain a self-crossing for edges that connect to a group node and where the connection style CurveConnectionStyle.Organic is specified.
                • The curved edge routes produced by HierarchicLayout, EdgeRouter or CurveRoutingStage no longer violate the minimum node-edge distance or intersect the node. Intersections could previously happen especially when the specified node-edge distance was zero.
                • The PartialLayout class now transfers the value of its PartialLayout.MaximumDuration property to the internally used edge routing algorithm. This means that when the partial layout has a restricted running time, the routing part will be restricted, too. Previously, the duration of the edge routing was unrestricted. Note that if the router instance is user-specified, this instance will not get a maximum duration.
                • The element processing order in the BendConverter layout stage is now deterministic. The previous non-deterministic order of inserting and removing elements could lead to non-deterministic behavior for consecutive layout calculations.
                • The FamilyTreeLayout class now properly handles the case that the family tree contains cycles, e.g., due to a family founded by parent and (step-)child. Previously, it sometimes produced a stack overflow or non-orthogonal routes for such an input.
                • The HierarchicLayout class now correctly considers input graphs with group nodes and a PartitionGrid. Previously, in some rare cases, such inputs may have caused overlapping group nodes.
                • A potential NullReferenceException for the OrganicLayout with very small graphs has been fixed.

                Incompatible Changes

                • The out-of-support .NET Core 3.0 SDK is no longer supported by yFiles. The minimum supported .NET Core version now is .NET Core 3.1.
                • The protected method HandleInputMode.IsHovering has been removed. To customize what handle should be used for a certain query location, the new HandleInputMode.QueryClosestHandle event can be used.
                • The methods MouseHoverInputMode.OnShow and Show now return a Task that completes when the tooltip content is available and provides whether the tooltip is actually displayed.
                • The HandleInputMode.BeginDragging method now returns a Task.
                • The GraphEditorInputMode.OnLabelTextEdited method now returns a Task that completes when the text validation is done and provides whether the validation succeeded or was canceled.
                • The protected method GraphEditorInputMode.EditLabelCore now returns a Task instead of a Future.
                • The new GenericLayoutData class is a generic implementation of LayoutData that allows to pass arbitrary data to layout stages. As a consequence, the LayoutData.Apply, ItemCollection.ProvideMapper and ItemMapping.ProvideMapper methods were removed.
                • The PolylineEdgeRouterData class has been renamed to EdgeRouterData to match the name of the layout algorithm it supports.
                • The methods CanvasControl.FitContent and GraphControl.FitGraphBounds now have an optional parameter that allows changing the viewport in an animated fashion.
                • The CanvasControl.Projection property no longer accepts transforms with a non-zero translation component.
                • The CanvasControl.FitContentViewMargins property has been renamed to ContentMargins. Accordingly, the OnFitContentViewMarginsChanged method and the FitContentViewMarginsChanged event have been renamed to OnContentMarginsChanged and ContentMarginsChanged, respectively.
                • The ViewportLimiter.LimitViewport method now has an optional parameter that enforces the ViewportLimitingPolicy.Strict policy.
                • The CanvasControl.EnsureVisible method now has an additional parameter viewportInsets.
                • The TextEditorInputMode.GetTextBoxBounds method has been removed.
                • The PixelImageExporter's SmoothingMode, TextRenderingHint, and InterpolationMode properties now default to high quality rendering.
                • The return value of the MouseHoverInputMode.GetToolTipContent method has been changed to object to accommodate being able to return a Task<string> as well.

                Behavior

                • The provider returned by EdgeReconnectionPortCandidateProviders.AllNodeAndEdgeCandidates now doesn't return port candidates of the reconnected edge itself anymore as this lead to an unstable reconnection behavior.
                • The FitContent and FitGraphBounds commands now change the viewport in an animated fashion.
                • Zooming with the mouse wheel to the center of the viewport by using CanvasControl's CenterZoomRecognizer no longer uses the IncreaseZoom and DecreaseZoom commands.
                • During animated viewport transitions, for performance reasons, mouse events are not redispatched, anymore, except for the last frame of the animation.
                • The OrganicLayout substructure styles StarSubstructureStyle.Radial, StarSubstructureStyle.Circular, ChainSubstructureStyle.Rectangular, ChainSubstructureStyle.StraightLine and CycleSubstructureStyle.Circular do no longer allow that the detected substructures are nested inside other substructures. To get the old behavior and allow nesting, new style values were added (e.g. StarSubstructureStyle.RadialNested).
                • The following behavior change applies to class HierarchicLayout with polyline edge routing style: the default value of property yWorks.Layout.Hierarchic.EdgeLayoutDescriptor.MinimumSlope was changed from 0.3 to 0.2 which makes the sloped segments less steep and the overall results more compact.
                • In organic layout, the way edge grouping influences the layout of certain substructures has changed. Structures are not anymore split-up into several ones when edges of nodes in the structure have different group IDs. Now, the new node types can be used to split-up structures (see OrganicLayoutData.NodeTypes). If a structure contains different edge groups, the grouping is properly considered and may influence the sorting of elements within the structure. Affected substructure styles are StarSubstructureStyle.SeparatedRadial, ParallelSubstructureStyle.Radial, ParallelSubstructureStyle.StraightLine and ParallelSubstructureStyle.Rectangular.
                • As the OrganicEdgeRouter.KeepExistingBends property now correctly obeys its definition and actually keeps the absolute coordinates of the existing bends, a new property to get the old behavior was introduced: OrganicEdgeRouter.ConsiderExistingBends. Existing bends are considered, but their absolute coordinates are not kept.
                • The default value of the ClassicTreeLayout.MinimumLayerDistance property was changed from 40.0 to 20.0 and the default value of the ClassicTreeLayout.BusAlignment property was changed from 0.3 to 0.5. In addition, the new MinimumFirstSegmentLength and MinimumLastSegmentLength properties may lead to different results compared to previous versions. Setting both properties to zero will neutralize their influence on the result.
                • For the DefaultNodePlacer class that is used by the TreeLayout, the default values of the HorizontalDistance and VerticalDistance properties were changed from 40.0 to 20.0, and the default values of the MinimumFirstSegmentLength and MinimumLastSegmentLength properties were changed from 0.0 to 20.0.
                • For the CompactNodePlacer class that is used by the TreeLayout, the default values of the HorizontalDistance and VerticalDistance properties were changed from 40.0 to 20.0, and the default values of the MinimumFirstSegmentLength and MinimumLastSegmentLength properties were changed from 10.0 to 20.0.
                • The default value of the LayeredNodePlacer.BusAlignment property was changed from 0.3 to 0.5.

                Deprecations

                • The CanvasControl.AnimateScrollCommands property has been deprecated in favor of the new AnimatedViewportChanges property, which offers more control over viewport animations, not just the scroll commands.
                • The OrganicLayout.ClusterNodes property is now deprecated. It is replaced by the new OrganicLayout.ClusteringPolicy property. To disable clustering specify ClusteringPolicy.None. To enable it and use the same algorithm as before, specify ClusteringPolicy.EdgeBetweenness.

                yFiles.NET 5.3.0.2

                Improvements

                • A dedicated .NET 5.0 version of the library now is bundled to facilitate the use with NuGet and to improve compatibility with certain obfuscation tools. A .NET 5.0 version of the samples is provided, too.

                View

                • The ViewportLimiter class now always centers the viewport if its HonorBothDimensions property is disabled.

                Layout

                • The HierarchicLayout class now has an improved strategy for choosing the port candidates for same-layer edges with multiple available candidates. Previously, the chosen candidate may have led to superfluous back-loops.

                Algorithms

                • The LabelPropagationClustering algorithm now produces normalized, continuous clustering IDs. In other words, for example, if it finds 5 clusters, they get IDs from 0 to 4. Previously, the range of IDs may have contained holes. If initial label values are provided, this normalization is omitted.

                Bugfixes

                View

                • The clipboard now doesn't copy labels or ports if they are not selected and their owner's IClipboardHelper forbids copying the owner.
                • The CanvasControl.ZoomToAnimated method now works correctly when a Projection is used.
                • Fixed a bug in CanvasControl.FitContent and GraphControl.FitGraphBounds which caused FitContentViewMargins being incorrectly applied in case a Projection has been set.
                • The following issues of the ZoomToCurrentItemCommand have been corrected:
                  • The item is now longer placed slightly out of center if scrollbars appear during the operation.
                  • If the current item is too large to fit the viewport at zoom 1, the command now zooms out.
                • Fixed incorrect margins on an OverviewGraphControl with a Projection set.
                • Fixed a bug which caused the Zoom command to disrespect the ViewportLimiter if executed with a rectangle as parameter.
                • Fixed ViewportLimiter sometimes leading to jumping viewports and not allowing the user to zoom out in certain situations.
                • The mouse event coordinates are no longer quantized to very large steps if a projection is used and the viewport is zoomed in afterwards.
                • Fixed the MaxX and MaxY properties of RectD.Infinite which now return Double.PositiveInfinity instead of NaN. In turn, RectD.Infinite's TopRight, BottomRight, and BottomLeft corners were fixed, too.

                Graph

                • The DefaultFolderNodeConverter and FoldingEdgeConverterBase classes (and thus, also the DefaultFoldingEdgeConverter and MergingFoldingEdgeConverter classes) no longer ignore port labels.
                • A label with EdgeSegmentLabelModel or EdgePathLabelModel now moves steadily when the segment to which it belongs moves.

                Input

                • The CreateEdgeInputMode class no longer has an error which prevented the removal of port candidate visualizations after another input mode claimed to be active.
                • Labels with \n now are displayed correctly when the label is edited.

                GraphML

                • Labels at ports of collapsed nodes are no longer lost during GraphML serialization.

                Analysis

                • The Manhattan distance metric for HierarchicalClustering no longer ignores the vertical distance component.
                • The Cycles.FindCycleEdges algorithm no longer crashes when the given input graph contains self-loops.

                Layout

                • The TabularLayout class no longer throws an exception about a missing PartitionGrid when used within RecursiveGroupLayout and RecursiveGroupLayoutData and TabularLayoutData are used without an explicit cell-id mapping.
                • The LayoutExecutor class now uses the correct target bounds when a projection is set on the GraphControl.
                • When the MaximumDuration of the EdgeRouter class is exceeded, it now still uses the same port for edges that are grouped. Previously, edge grouping constraints were mostly ignored when the time was up.
                • Improved the reaction time of the EdgeRouter class when the MaximumDuration is exceeded or the algorithm should stop due to AbortHandler for some cases where previously the search for a path kept on running for a long time.
                • The RadialLayout class is now much faster if the input graph is a very large tree structure.
                • The OrganicLayout and ClassicOrganicLayout classes no longer produce an internal integer overflow that may lead to an early exit and, thus, poor layout results for very large input graphs.
                • The ClearAreaLayout class no longer throws an exception for some scenarios where the same algorithm instance was first applied to a graph with PartitionGrid and later to a graph without grid.
                • The EdgeRouter and PolylineLayoutStage classes no longer produce broken routes for edges with polyline segments. Previously, such broken routes may have appeared in rare cases.
                • The HierarchicLayout class now correctly considers the back-loop routing style (HierarchicLayout.BackLoopRouting) for graphs with critical edges (see HierarchicLayoutData.CriticalEdgePriorities).
                • The ClearAreaLayout and FillAreaLayout classes no longer throw an exception for some input graphs with edge labels if property ConsiderEdgeLabels is enabled.
                • The GenericLabeling class no longer throws an exception for edge labels with preferred placement descriptor if property PlaceEdgeLabels is disabled.
                • The TreeLayout class now correctly handles trees with group nodes. Previously, it sometimes produced overlapping elements and halo violations for such inputs.
                • The curved edge routes produced by HierarchicLayout, EdgeRouter or CurveRoutingStage no longer violate the minimum node-edge distance or intersect the node. Intersections could previously happen especially when the specified node-edge distance was zero.
                • The RecursiveGroupLayout class now correctly handles setups that use both recursive and non-recursive group nodes. Previously, such use-cases may have led to invisible/ignored edges and, thus, broken edge routes.
                • The PartialLayout class now transfers the value of its PartialLayout.MaximumDuration property to the internally used edge routing algorithm. This means that when the partial layout has a restricted running time, the routing part will be restricted, too. Previously, the duration of the edge routing was unrestricted. Note that if the router instance is user-specified, this instance will not get a maximum duration.
                • The HierarchicLayout, EdgeRouter and CurveRoutingStage classes no longer occasionally throw an exception when the curved routing style is used for graphs that have self-loop edges.
                • The ClearAreaLayout class now produces correct orthogonal routes for edges if its ClearAreaStrategy property is set to a local strategy. Previously, some of the edges may have received a non-orthogonal route.
                • The EdgeRouter class no longer throws an exception if the input contains a bus defined via BusDescriptor where all the associated edges are actually fixed.

                Hierarchic Layout

                • The HierarchicLayout class no longer produces an infinite looping issue in the incremental layout mode for some input graphs with layer constraints that specify that a node should be placed in the topmost/bottommost layer.
                • The HierarchicLayout class no longer produces unnecessary edge crossings between self-loop edges at the same node in cases where a larger number of self-loops exist at a node.
                • The HierarchicLayout class no longer ignores edges connected to group nodes when the group node contains a bus structure (see HierarchicLayoutData.Buses) and no other elements. Such edges were previously actually removed from the layout graph such that other stages (e.g. the ComponentLayout) could have failed with an exception.
                • The HierarchicLayout class no longer occasionally throws an exception when enabling HierarchicLayout.CompactGroups and in conjunction with layering constraints and/or a group node marked as incremental.
                • The HierarchicLayout class does no longer violate the specified minimum length for edges incident to group nodes.
                • The sequencing phase of the HierarchicLayout class is now faster for large graphs with sequence constraints and non-incremental layout mode.

                Edge Routing

                • The BusRouter class now produces more suitable edge routes for rare cases that were caused by an unsuitable bus placement.
                • The EdgeRouter class now uses the given ports for edges of a bus with fixed edges.
                • The EdgeRouter class now correctly considers edges incident to a fixed inner port of a group node when the routing algorithm has restricted maximum duration. Previously, this setup sometimes led to strange edge routes with many superfluous bends.
                • The EdgeRouter class no longer contains edges with self-crossings in some rare cases where it previously failed to eliminate them.
                • The EdgeRouter and CurveRoutingStage classes no longer change the path of unaffected (fixed) edges when the CreateControlPoints property of their associated EdgeLayoutDescriptor instance (CurveEdgeLayoutDescriptor respectively) is enabled.
                • The EdgeRouter class now correctly supports the use case that a subset of edges is routed with the curved routing style while another subset is routed with another routing style and different settings on the associated individual EdgeLayoutDescriptor instances. Previously, with some edges being curved, the settings of the other edges got lost and the default settings were used.
                • The OrthogonalSegmentDistributionStage class does no longer crash when receiving input graphs with a very large edge count (greater than approximately 22000). Note that the ChannelEdgeRouter class is affected too, as the stage is by default called from within the router.

                New Demos

                • The new Sankey layout demo shows how HierarchicLayout can be configured to show a Sankey diagram.

                yFiles.NET 5.3.0.1

                Bugfixes

                • An animation created with Animations.CreateGraphAnimation no longer throws an Exception if the provided IMapper with new bend locations doesn't provide bend locations for all edges.
                • Using the NinePositionEdgeLabelModel for edges with the BezierEdgeStyle no longer throws an exception in the BezierEdgeStyleRenderer.getSegmentCount method.
                • Fixed exception which occurs with layout animations for graphs which contain edges with ports.
                • Fixed a bug when executing ZoomToCurrentItemCommand which did not center on the current item with the ViewportLimiter enabled and the LimitingPolicy set to TowardsBounds.
                • Calling the GraphInputMode.FindItems and GraphInputMode.HitTester.EnumerateHits methods with a custom IInputModeContext will now always pass that context to the IHitTestable implementations of the items being hit-tested. Previously, the main input mode's own IInputModeContext was used in certain cases.
                • The GraphModelManager.GetMainCanvasObject method no longer throws a NullReferenceException when overriding its GetCanvasObject methods for items in an unexpected way.
                • The new default ViewportLimiter policy TowardsBounds no longer causes the viewport to scroll to unexpected locations (including far away from the graph) during layout animations.
                • The viewport rectangle in the GraphOverviewControl is now displayed correctly if the referenced GraphControl has a projection set.
                • The viewport rectangle in the overview is now correctly hit-tested when a projection is used.
                • DefaultLabelStyle.Insets is now correctly applied around the content instead of just enlarging the preferred size.
                • CommandManager no longer causes ICommand.CanExecute calls if the target GraphControl is already disposed.
                • Mouse2DEvents now properly reflect changes of modifier keys in their ChangedModifiers property.
                • Fixed hit-test of handles being in a slightly different position from where the handles are displayed.
                • Labels with \n now are displayed correctly when the label is edited.
                • Fixed PanelNodeStlye shadow that was mangled when printing.
                • The NodeDropInputMode class now correctly considers port labels, both for creating the new node and for the preview.

                Right-to-Left

                • The extent of the horizontal scrollbar now correctly accounts for the vertical scrollbar being displayed on the left side with RightToLeft.
                • The AutoDrag feature in CanvasControl now works correctly with RightToLeft while the vertical scroll bar is visible.
                • The vertical scrollbar location is now correctly adjusted when switching writing direction with the RightToLeft property.
                • CanvasControl.EnsureVisible now works correctly when the vertical scrollbar is on the left side due to RightToLeft.
                • Commands.ScrollPageLeft, Commands.ScrollPageRight as well as horizontal mouse-wheel scrolling no longer scroll in the wrong direction when RightToLeft is enabled.

                Layout

                • The HierarchicLayout class now correctly handles inputs that have both bus structures and edges with recursive style. Previously, an exception could be triggered when an edge was marked as recursive and belonged to a bus at the same time.
                • The EdgeRouter class no longer has a problem that appeared with a bus containing affected as well as non-affected (fixed) edges at the same time. Previously, this could trigger an Exception or lead to the incorrect behavior that an actually affected other edge was not routed.
                • The EdgeRouter class no longer occasionally throws an exception if the input contains bus edges defined via BusDescriptor.
                • The BusRouter class no longer fails to generate connected buses for cases with fixed and incremental edges on the same bus. Previously it sometimes generated a disjoint bus even though the bus IDs were equal.
                • The BusRouter class no longer ignores edges that should be routed when a they are on a bus with fixed edges (see BusDescriptor.Fixed property) and when they share both source and target port with a fixed edge.
                • The element processing order in the BendConverter layout stage is now deterministic. The previous non-deterministic order of inserting and removing elements could lead to non-deterministic behavior for consecutive layout calculations.
                • The ParallelEdgeRouter class no longer throws an exception if the input has both a large number of parallel edges and a leading edge with ports on the node border.
                • The OrthogonalLayout class now correctly handles input graphs with parallel edges if the PreferParallelRoutes property is enabled. Previously, such inputs have caused exceptions in some rare cases.
                • The FamilyTreeLayout class now properly handles the case that the family tree contains cycles, e.g., due to a family founded by parent and (step-)child. Previously, it sometimes produced a stack overflow or non-orthogonal routes for such an input.

                Improvement

                • The .NET Core version of the library (lib/netcoreapp3.0) has been tested with .NET 5.0 and compatibility has been confirmed.

                Incompatible Changes (Demos)

                • The .NET Core versions of demos and tutorial (samples-netcore) now target .NET Core 3.1. They can still be used with .NET Core 3.0 by simply changing the target framework. The library is not affected.

                yFiles.NET 5.3

                This release contains many new major features and lots of other new features, improvements, and bugfixes for all parts of the library. In addition to the new demos that show the new features, there are some notable new demos and demo improvements, too.

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

                Major New Features

                Isometric Drawing and Other Projections

                CanvasControl (and thus GraphControl) now has an additional Projection property that can be used to transform the viewport into a different parallel projection, e.g. isometric or cabinet projection. Predefined useful projections are provided as constants on the new Projections class. Interaction, including graph editing, snapping, orthogonal edge editing, etc. still work as expected, just within the new projection. That is, orthogonal edge editing becomes isometric edge editing with an isometric projection. There is a corresponding chapter in the Developer's Guide that goes into further detail what has changed and which customization options exist.

                The IsometricDrawing demo displays graphs in an isometric fashion to create an impression of a 3-dimensional view.

                Fill Area Layout and Clear Area Layout

                The new ClearAreaLayout algorithm clears a user-specified area in an existing layout by moving elements. It is suitable if the rest of the layout should not change much but some free space is required, e.g., because new elements need to be inserted into the drawing or have been resized.

                The new FillAreaLayout algorithm fills a user-specified area in an existing layout by moving elements into or towards it. It can make layouts around the specified area more compact and is suitable if, e.g., elements were removed from the graph or their size has changed substantially.

                A number of new demos showcase the new layout algorithms:

                • The new MarqueeClearArea demo shows how to make space in a diagram by dragging a marquee rectangle.
                • The new OverlapAvoidingEditor demo shows how to interactively edit graphs without creating overlaps.
                • The new ComponentDragAndDrop demo shows how to make space for components that you can drag from a palette onto the canvas.
                • The new FillAreaAfterDeletion demo shows how to fill free space after deleting nodes using the FillAreaLayout algorithm.
                • The new RelocateSubtree demo shows how to reuse free space after relocating a subtree to a new parent.

                Aggregation and Analysis of (Large) Graphs

                Many new algorithms for analyzing graphs are now included, for example to detect components and clusters, to aggregate sub-graphs, and to calculate centrality values. In addition, the analysis algorithms now have the option to define a subset of the graph to work on. In detail, the new classes are:

                • The new NodeAggregation class provides an algorithm that intelligently aggregates nodes of (large) input graphs. It does not require complex configuration and can be used without knowledge of specific clustering or aggregation techniques.
                • The KCoreComponents class provides a component detection algorithm that finds k-cores.
                • The classes LouvainModularityClustering and LabelPropagationClustering provide two new algorithms for cluster detection.
                • The EigenvectorCentrality class offers a centrality algorithm that measures the influence of a node in a network based on the Eigenvector score.
                • The PageRank class provides a centrality algorithm that calculates the so-called page rank for the nodes.
                • The classes ChainSubstructures, CliqueSubstructures, CycleSubstructures, StarSubstructures, and SubtreeSubstructures provide new algorithms that detect isolated substructures like chains, cliques, cycles, stars, or subtrees. This can be used as an input to other (layout) algorithms.
                • The class GraphStructureAnalyzer now offers additional methods to calculate the average degree, the average weighted degree, the diameter, and the density of a given graph.

                The Large Graph Aggregation Demo shows how to use the NodeAggregation algorithm to automatically analyze and explore a large graph. Developers don't need to learn the academic details of the available clustering and centrality algorithms, but can simply configure their preferred aggregation sizes to automatically create perfect user-experiences in drill-down scenarios.

                Support for curved edges

                The new BezierEdgeStyle renders edges with smooth Bezier-curve paths.

                In addition, the new edge label models BezierEdgePathLabelModel and BezierEdgeSegmentLabelModel place labels optimally on curved edges rendered with this style.

                The BezierEdgeStyle demo demonstrates the use of the new BezierEdgeStyle and shows additional customizations to support various features in interactive editing. For example, for intuitive interactive editing, the edges are edited with the same control points -or handles- that are known from other vector graphic drawing applications.

                Support for curved edges has been added to the layout and edge routing algorithms EdgeRouter and the CurveRoutingStage, and HierarchicLayout.

                Interactive Node Resizing
                Resizing nodes using their handles now supports two new behaviors:
                • Center resizing keeps the center fixed and scales the node in all directions. It is active when the NodeReshapeHandleProvider.CenterReshapeRecognizer is triggered which defaults to the Alt key held down.
                • Aspect ratio resizing maintains the aspect ratio of a node. It is active when the NodeReshapeHandleProvider.RatioReshapeRecognizer is triggered which defaults the Shift key held down.
                • The NodeReshapeHandleProvider.ReshapePolicy determines how the mouse location is interpreted when aspect ratio resizing is active.

                The Reshape Handle Configuration Demo showcases these different resizing behaviors.

                Related to this, the new Node Group Resizing Demo shows how to resize a selection of nodes en bloc. In contrast to the default behavior, this changes both the sizes and the locations of the nodes and not just the sizes.

                Graph Builder

                The old GraphBuilder, TreeBuilder, and AdjacentNodesGraphBuilder classes have been replaced in the library with more powerful but incompatible builder classes. Loading graphs from external data sources has become even easier with the new graph builder implementations. This release contains completely rewritten utility classes that can help with the creation of diagrams from one or more data sources.

                The new classes can load nodes, edges, labels, and their properties from one or many different sources dynamically using a declarative-like approach. Binding expressions can be used for setting the visual properties of the graph entities depending on the values in the source data.

                For backward compatibility, the old GraphBuilder, TreeBuilder, and AdjacentNodesGraphBuilder classes are available as demo code.

                New Features

                Viewer

                • The new NodeLabelModelStripeLabelModelAdapter class allows for using node label model parameters for the positioning of the row and column labels of a table.
                • Resizing nodes using their handles now supports keeping the node center and/or the aspect ratio of the node bounds.
                  • Center resizing is active when the NodeReshapeHandleProvider.CenterReshapeRecognizer is triggered. The default is pressing the Alt key.
                  • Aspect ratio resizing is active when the NodeReshapeHandleProvider.RatioReshapeRecognizer is triggered. The default is pressing the Shift key.
                  • The NodeReshapeHandleProvider.ReshapePolicy property determines how the mouse location is interpreted when aspect ratio resizing is active.
                • Besides the CanvasControl.Projection property itself a number of new properties and methods have been added to support to transform the viewport into a different parallel projection:
                  • CanvasControl has additional methods to convert between the world, the new intermediate, and the view coordinate system.
                  • MarqueeSelectionInputMode, NavigationInputMode, and HandleInputMode now have a property UseViewCoordinates, which controls whether the input mode draws its decorations and processes input in view coordinates.
                  • When MarqueeSelectionInputMode uses view coordinates, the resulting shape of the marquee in world coordinates may not be a rectangle. Therefore MarqueeSelectionEventArgs now has a Path property of type GeneralPath to describe the marquee shape and a UsePath property that determines whether the Path property or the Rectangle property shall be used.
                  • EdgeDecorationInstaller, RectangleIndicatorInstaller, PointSelectionIndicatorInstaller, and DefaultPortCandidateDescriptor now have a property UseViewCoordinates that controls whether the decoration is rendered in view coordinates.
                  • CreateEdgeInputMode's MeasureDistance method now has to return the distance in view coordinates if and only if CanvasControl's Projection is used.
                  • IRenderContext now has additional members that are useful with the new projections feature: the Projection transform, transforms used to paint in view, intermediate or world coordinate system, and members to convert points from one coordinate system to another.
                  • The GetTransform method of the DefaultLabelStyle, NodeStyleLabelStyleAdapter, LabelStyleBase<TVisual>, and IconLabelStyleRenderer now have an IRenderContext added as first argument.
                  • A new Projection property has been added to ContextConfigurator and CanvasPrintDocument.

                Analysis

                • A new component detection algorithm which finds k-cores has been made available using class KCoreComponents.
                • Centrality calculation algorithms which calculate the eigenvector centrality and page ranks for nodes have been made available using classes EigenvectorCentrality and PageRank, respectively.
                • The new analysis algorithm NodeAggregation supports an algorithm that tries to intelligently aggregate nodes of (large) input graphs and does not require that the user is familiar with specific clustering/aggregation algorithms.
                • New algorithms for detecting isolated substructures like chains, cliques, cycles, stars or subtrees have been made available via the classes ChainSubstructures, CliqueSubstructures, CycleSubstructures, StarSubstructures, and SubtreeSubstructures.
                • GraphStructureAnalyzer: added methods to calculate the average degree, the average weighted degree, the diameter and the density of a given graph.
                • New clustering detection algorithms using the Louvain Modularity and Label Propagation have been made available via classes LouvainModularityClustering and LabelPropagationClustering.
                • The analysis algorithms now have the option to define a subset of the graph to work on.

                Algorithms

                The features listed here are new features of the low level analysis algorithms. Most of them are reflected in new features of the analysis facade classes as listed in the section Analysis.

                • New methods compute several additional network statistics, namely GetAverageDegree, GetAverageWeightedDegree, GetDiameter, and GetDensity of class GraphChecker and GetModularity of class Groups.
                • Added class NodeAggregation which represents an algorithm that tries to intelligently aggregate nodes of (large) input graphs and does not require that the user is familiar with specific clustering/aggregation algorithms.
                • Added new method Transitivity.TransitiveEdges which creates the transitive edges that connect the visible nodes in an input graph.
                • Added method Groups.GetClusteringCoefficient that computes the local clustering coefficient for each node as well as the average clustering coefficient.
                • Added the new methods GraphConnectivity.KCore and GraphConnectivity.KCore(Graph, int that compute the so-called k-cores of an undirected input graph.
                • Added the new method Centrality.EigenvectorCentrality which computes the eigenvector centrality for each node in an undirected graph.
                • Added an implementation of the label propagation algorithm which detects communities in the input graph. See the new method Groups.LabelPropagation.
                • Added the new method Groups.LouvainModularity which detects the communities in the input graph by applying the well-known louvain modularity approach.
                • Added the new method Centrality.PageRank which provides an implementation of the page rank algorithm that computes a rank for each node.
                • The new Substructures class offers methods to detect the following graph structures: Chains, Cliques, Cycles, Stars, and Trees.

                Layout

                • Added new property EdgeLayoutDescriptor.RoutingStyle that allows to specify the routing style individually for each edge routed by the EdgeRouter class. Furthermore, new properties MaximumOctilinearSegmentRatio and PreferredOctilinearSegmentLength on the descriptor provide means to configure the octilinear routing style.
                • The EdgeRouter class now supports a new routing style that generates curved edge paths. It can be specified for each edge individually using EdgeRoutingStyle.Curved.
                • Added new layout stage CurveRoutingStage. It replaces polyline edge paths with curved segments using cubic bezier splines and provides a generic way to produce layouts with curved edges.
                • Added the new routing style EdgeRoutingStyle.Curved to the HierarchicLayout class. The resulting edge paths consist of smooth curves that are constructed using cubic bezier splines.
                • The CircularLayout class now supports exterior edges that are routed around the exterior of the circle as smooth arcs, see the new property CircularLayout.EdgeRoutingPolicy.
                • Added new class EdgeBundlingStage that offers edge bundling for general undirected graphs. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes.

                Improvements

                View

                • A new policy has been added to the ViewportLimiter which allows for zooming and panning towards the limits but not away from them. This prevents the viewport from "jumping" from out-of-limit coordinates into the limited bounds.
                • FitContent with an enabled ViewportLimiter now respects the LimitedFitContentZoom property on the CanvasControl.
                • An Animation can now be paused and unpaused by setting the Paused Property on the Animator after the animation has started.
                • DefaultFolderNodeConverter and FoldingEdgeConverterBase: provide new protected methods CreatePreferredLabelSize to allow for overriding the default implementations.
                • The property GraphModelManager.ProvideUserObjectOnMainCanvasObject was added that can be set so that a model is accessible as its main canvas object's user object.
                • The extension method GetPathPoints was added for edges. The returned IListEnumerable contains the source port location, followed by the bend locations, followed by the target port location of an edge.
                • NodeStyleLabelStyleAdapter now propagates the label's tag to the node that's rendered with the node style.
                • NodeStylePortStyleAdapter now propagates the port's tag to the node that's rendered with the node style.
                • NodeStyleStripeStyleAdapter now propagates the stripe's tag to the node that's rendered with the node style.
                • CanvasControl.UpdateContentRect now throws an InvalidOperationException if an element on the canvas provided invalid (e.g. infinite) bounds.
                • ITable.AddLabel no longer accepts label model parameters that do not support IStripe instances. Previously node label models could be used, but did not work properly at runtime.
                • CompositeLabelModel: added support for label snapping.
                • GraphModelManager: made methods Raise, Lower, ToFront and ToBack virtual.
                • Added the ability to the image export support (PixelImageExporter, EmfExporter, ContextConfigurator) to define an arbitrary list of points. The export chooses the exported area in a way that all these points are enclosed in the smallest possible rectangular area which is axis-parallel to the output coordinates.
                • Added the ability to the printing support (CanvasPrintDocument, CanvasControl.Print) to define an arbitrary list of points. The printed area is defined in a way that all these points are enclosed in the smallest possible rectangular area which is axis-parallel to the output coordinates.
                • PixelImageExporter and EmfImageExporter now have a Background property which sets a Brush for the background.

                Input

                • GridVisualCreator now supports to only draw horizontal or only vertical lines when its GridStyle property is set to one of the new values HorizontalLines or VerticalLines.
                • GraphSnapContext.GridSnapDistance and GraphSnapContext.GridSnapType have been pulled up to SnapContext.
                • The zoom-invariant GridSnapDistance property has been added to CollectSnapResultsEventArgs.
                • An optional parameter preferredSnapType has been added to the SnapLineSnapResult constructor and the SnapResults.CreateSnapLineSnapResult factory method.
                • SnapResults.CreateResizeSnapResult now takes a PointD as delta parameter instead of a double so it is possible to create resize snap results where the orientation of the mouse delta differs from the orientation of the snapped size.
                • GraphClipboard and GraphEditorInputMode: added new event ElementsDuplicated that occurs when a duplicate operation finished successfully.
                • UndoEngine: The Undo and Redo methods now throw now InvalidOperationException if the current state does not allow performing Undo or Redo. Previously either NotSupportedException or Exception have been thrown.
                • The GraphEditorInputMode.RequeryHandles method has been made public and can now be used to refresh the displayed handles, if IHandleProvider implementations return different handles over time.
                • It is now easier to customize GroupingNodePositionHandler. The boolean properties AdjustParentNodeLayout, MoveChildNodes and ReparentingEnabled have been added to control whether ancestors' node layout should be adjusted when a node is moved, to not move the contents of a group node when a group node is moved or forbid any interactive reparenting.
                • The default position handler for edges now creates fewer additional bends when the edge is dragged while orthogonal edge editing is enabled.
                • A ReshapeHandlerDecorator property has been added to NodeDecorator to simplify using a custom IReshapeHandler implementation for nodes.
                • The property ReshapeRectangleContext.Ratio has been added that describes the width/height ratio that is kept for aspect ratio resizing.
                • The new classes NodeReshapeHandleProvider and NodeReshapeHandlerHandle are used as default implementation for node resize handles.
                • The factory method OrthogonalEdgeEditingContext.CreateOrthogonalEdgeDragHandler has been added and can be used for custom node position handler and reshape handler to keep orthogonal edges attached to a node orthogonal during the drag/reshape gesture.
                • A MaximumBoundingArea can now be set on ReshapeHandleProviderBase, ReshapeHandlerHandle, RectangleHandle and ReshapeRectangleContext to restrict reshaping to stay inside the given bounds.
                • ReshapeHandlerHandle: Getter for the IReshapeHandler and the HandlePositions have been added.
                • The property ReshapePolicy has been added to ReshapeRectangleContext so INodeReshapeSnapResultProvider implementations can respect the node aspect ratio for according resize gestures.
                • The new method PointD.Interpolate calculates the linear interpolation between two points.
                • Added a new method NavigationInputMode.FitContent that is called after collapse, expand, enter and exit operations if FitContentAfterGroupActions is enabled.
                • The NavigationInputMode class doesn't fit the content anymore after expand/collapse operations if an AutoGroupNodeAlignmentPolicy other then None is used.
                • ResizeStripeInputMode now has an IsDragging property, indicating whether a drag currently is in progress.
                • DropInputMode now has an IsDragging property, indicating whether a drag on the canvas currently is in progress.
                • HandleInputMode now has an IsDragging property, indicating whether a drag currently is in progress.
                • The new ClickHandlerDecorator property of Bend-, Edge-, Label-, Node- and PortDecorator simplifies using custom IClickHandler implementations.

                Analysis

                • Most of the algorithms in namespace Analysis provide properties SubgraphNodes and SubgraphEdges which facilitate to analyze only a subset of the given graph.
                • In a single node graph, the single node's closeness centrality and graph centrality value is now 1.0 (previously, it was infinity). This also affects derived values such as minimum, maximum, and normalized centrality. This change relates to yWorks.Analysis.GraphCentrality and yWorks.Analysis.ClosenessCentrality. The backing algorithms in yWorks.Algorithms.Centrality are unchanged.
                • GraphStructureAnalyzer: added methods to determine multiple edges.
                • The GraphCentrality and ClosenessCentrality analysis algorithms now calculate the centrality individually per component instead of returning a centrality value of 0.0 for nodes in graphs that are not connected.
                • EdgeBetweennessClustering: throws an InvalidOperationException if edge weights are not positive or finite.
                • FeedbackEdgeSet: throws an InvalidOperationException if edge weights are negative.

                Layout

                • Constructor overloads have been added to SingleItem, ItemCollection, ItemMapping and ContextItemMapping that initialize one of their properties on construction.
                • Frequently used types of the layout part have now nullability annotations.
                • LayoutExecutor now generates more specific port constraints with FixPorts enabled, resulting in better edge paths.
                • HierarchicLayoutData.EdgeDirectedness: if the Mapper property is directly accessed (not explicitly set) its default for unset values is 1.0 (directed edge).
                • OrganicLayoutData.GroupNodeModes: if the Mapper property is directly accessed (not explicitly set) its default for unset values is GroupNodeMode.Normal. This doesn't change the result of the layout.
                • AspectRatioTreeLayoutData: RootPlacements, SubtreeRoutingPolicies, SubtreeAspectRatio: the type of the mapped values has been made nullable. For null or unset values now the settings on the AspectRatioTreeLayout will be taken as the documentation already stated.
                • Improved the support for early exits of the EdgeRouter class. The routing algorithm now often reacts more sensibly to the case that the specified MaximumDuration is reached.
                • The HideGroupStage class now offers a new property ResetEdgePaths that allows to specify whether or not the stage resets the path of edges incident to group nodes.
                • The ComponentLayout class now correctly considers node and edge labels when using the packed layout styles, e.g., ComponentArrangementStyles.PackedRectangle or ComponentArrangementStyles.PackedCircle. Previously, labels could overlap other elements when using these component arrangement styles.
                • Improved the consideration of the minimum edge to edge distance of the EdgeRouter class when it runs with highly restricted time (see EdgeRouter.MaximumDuration) or when it gets stopped by means of AbortHandler.
                • The PartialLayout class now produces more stable results if it is multiple times applied to the same input graph and property SubgraphPlacement is set to SubgraphPlacement.FromSketch.

                New Demos and Demo Improvements

                New Demos

                • The new LargeGraphAggregation demo that shows how to use the smart NodeAggregation clustering algorithm together with an AggregateGraphWrapper for drill down exploration of a large graph.
                • The new BezierEdgeStyle demo demonstrates the use of the new BezierEdgeStyle and shows additional customizations to support various features in interactive editing.
                • The new NodeGroupResizing demo shows how to apply different resize behaviors to a set of nodes. For instance, the nodes will keep their size but their positions are altered according to the resize gesture applied to the entire group.
                • The new ZOrder demo shows how to persist the z-order during undo, clipboard operations, grouping, and saving and loading.
                • The new MarqueeClearArea demo shows how to make space in a diagram by dragging a marquee rectangle.
                • The new OverlapAvoidingEditor demo shows how to interactively edit graphs without creating overlaps.
                • The new ComponentDragAndDrop demo shows how to make space for components that you can drag from a palette onto the canvas.
                • The new RelocateSubtree demo shows how to reuse free space after relocating a subtree to a new parent.
                • The IsometricDrawing demo displays graphs in an isometric fashion to create an impression of a 3-dimensional view.

                Noteworthy Demo Improvements

                • The BPMN demo has been improved to provide more flexibility. Its code now can easier be used in custom projects.
                • Improved support for parsing the BPMN Diagramm Interchanged format.
                • The BPMN node styles now support setting colors.
                • The ReshapeHandleProvider demo now shows how to implement a custom IReshapeHandleProvider. The new ReshapeHandleProviderConfiguration demo shows how to configure the default IReshapeHandleProvider to modify the resizing behavior.
                • The LayoutStyles demo has been enhanced to include new layout features:
                  • Exterior edge routing for CircularLayout.
                  • Curved edge routing style for HierarchicLayout and Polyline EdgeRouter.
                  • Bus routing for HierarchicLayout and Polyline EdgeRouter.
                  • Integrated Edge Labeling for Polyline EdgeRouter.

                Bugfixes

                View

                • Fixed a bug in FoldingManager where a predicate change in a FilteredGraphWrapper which serves as MasterGraph could trigger an exception if a child of a folder node has been hidden.
                • ICanvasObject.Above and Below don't unneccessarily trigger IRenderContext.VisualRemoved anymore.
                • Fixed the explict conversion between Transform and Matrix2D which was incorrect for Transforms with a rotation component.
                • SmartEdgeLabelModel: fixed a bug that caused a label with an angle other than 0 to jump when starting to move it interactively.
                • IFoldingView.Collapse and Expand now throw an ArgumentException when called with a node not belonging to the graph (instead of a NullReferenceException).
                • Fixed a bug which caused custom IEdgePathCropper implementations which are defined on custom port styles ignored if the graph is grouped.
                • Edges between deeper nested nodes are now displayed correctly in front of a common ancestor after that ancestor has been added or removed.
                • Fixed a bug which caused the ZoomToCurrentItem command to ignore the ViewportLimiter.
                • CanvasControl.ZoomTo no longer triggers two ViewportChanged events.
                • Fixed a bug in GraphCopier which caused the LabelCopied event to be dispatched twice for port labels on folder nodes.
                • Labels with line breaks now are displayed correctly in the text editor.
                • The speed of the auto dragging feature now is independent of the scale.
                • Fixed PanelNodeStlye shadow that was mangled when printing.
              • Bugfixes related to Right-to-Left direction:
                • The extent of the horizontal scrollbar now correctly accounts for the vertical scrollbar being displayed on the left side with RightToLeft.
                • The AutoDrag feature in CanvasControl now works correctly with RightToLeft while the vertical scroll bar is visible.
                • The vertical scrollbar location is now correctly adjusted when switching writing direction with the RightToLeft property.
                • CanvasControl.EnsureVisible now works correctly when the vertical scrollbar is on the left side due to RightToLeft.
                • Commands.ScrollPageLeft, Commands.ScrollPageRight as well as horizontal mouse-wheel scrolling no longer scroll in the wrong direction when RightToLeft is enabled.
              • Input

                • TextEditorInputMode now correctly queries the ViewportLimiter if TextBoxPlacementPolicy.ScrollCanvas is used. If the text box is still not visible because it's outside the limited viewport, the text box will be moved as well.
                • Fixed Undo/Redo of addition and removal of bends on folding edges. The bends now are correctly restored at the location they had at the time of removal.
                • TextboxEditorInputMode correctly rotates the textbox when Zoom is clamped.
                • The NavigationInputMode.FitContentAfterGroupActions method is no longer ignored when the NavigationInputMode class is used as a child input mode of the GraphEditorInputMode class.
                • The NavigationInputMode class now also updates the CanvasControl.ContentRect property when it is not used as a child input mode of the GraphEditorInputMode class.
                • Fixed that GridVisualCreator ignored the grid origin when rendering lines or crosses.
                • Fixed bugs that interpreted SnapContext.GridSnapDistance or SnapContext.SnapDistance in world coordinates when calculating SnapResults.
                • Orthogonal Edge Editing: fixed a bug that created bends in edges that are marked as not orthogonal.
                • OverviewInputMode: Fixed jumping of both client canvas and overview when scrollbar visibilty changes.
                • When zooming to the current item, changes in scrollbar visibility are properly incorporated into the new viewport position.
                • Scrolling the viewport with the mouse wheel no longer scrolls in the wrong direction if the mouse wheel is set to scroll one page at a time (instead of several lines).
                • Paste and duplicate operation now honor GraphEditorInputMode's ShouldSelect predicate.
                • Fixed a bug which could cause an input mode to be left in an undefined state if another input mode has been activated in an event handler of the first input mode. This usually resulted in the wrong cursor being displayed.
                • Fixed hit-test of handles being in a slightly different position from where the handles are displayed.

                Analysis

                • Fixed analysis class Chains for undirected cycles: if these cycles are not connected to other parts of the graph the Nodes collection of a resulting Path could be in an incorrect order.
                • yWorks.Analysis.EdgeBetweennessClustering no longer throws an exception with its default settings (MaximumClusterCount == -1).
                • The HierarchicalClustering class no longer throws an exception when applied to an empty graph.
                • ClosenessCentrality does no longer return NaN as NormalizedNodeCentrality if the graph consists of one single node. Instead, the NormalizedNodeCentrality will be positive infinity.
                • ClosenessCentrality.Run no longer throws an exception for unconnected graphs. Instead, all NodeCentrality and NormalizedNodeCentrality values will be 0 as the documentation states.

                Layout

                • Fixed an exception in EdgeRouter which could occur in rare cases.
                • The OrganicLayout class no longer throws an exception when having a PartitionGrid and at the same time the scope set to Subset or MainlySubset where all nodes of the graph are marked as affected (could have used scope All instead).
                • Fixed method NodePlacerBase.PlaceSubtree(IDataProvider, IDataProvider, LayoutGraph, Node, ParentConnectorDirection) to clear its internal caches, especially the graph cached in field NodePlacerBase.graph. Previously, holding onto a node placer instance could lead to subtle memory leaks.
                • The EdgeRouter class no longer yields edge labels that overlap with unrelated group nodes when using the integrated label placement feature (EdgeRouter.IntegratedEdgeLabeling).
                • Resolved a bug in the EdgeRouter class which caused that grouped edges were sometimes actually not grouped together. This mainly appeared in conjunction with a large value of either the minimum first or last segment length.
                • The EdgeRouter class no longer produces an exception for some rare cases with fixed grouped edges and octilinear paths.
                • The HierarchicLayout class no longer throws an exception that was previously triggered in some cases with bus structures (see property HierarchicLayoutData.Buses) and in conjunction with layering constraints.
                • The EdgeRouter class now correctly observes inputs where the user specifies buses with both fixed and non-fixed edges at the same time.
                • The EdgeRouter class now properly considers ports provided by a PortCandidateSet when the set contains multiple candidates with single capacities and where the candidates are on the same node side. Previously, it could happen that only one of several edges connecting to the node correctly considered the ports.
                • The EdgeRouter class does no longer use the same fixed PortCandidate out of a specified PortCandidateSet if another non-saturated candidate can be chosen. Thus, overlapping edge segments are avoided.
                • The OrthogonalSegmentDistributionStage no longer produces degenerated (very large or small) coordinates for edges that contain zero-length segments, that is, duplicate edge path points.
                • The ChannelEdgeRouter class no longer yields degenerated routing results (very large or small coordinates) when using the OrthogonalPatternEdgeRouter as path finder strategy and setting its minimum distance to zero. The OrthogonalPatternEdgeRouter class now avoids duplicate points when the MinimumDistance property is set to zero.
                • The AspectRatioTreeLayout class no longer crashes, causing a stack overflow, when applied to a large chain graph.
                • Fixed a bug in the HierarchicLayout class that could cause unnecessary (double) edge crossings when the algorithm was executed in incremental layout mode with edge grouping and alternative group bounds.
                • The RecursiveGroupLayout class now correctly moves child nodes along with their group also in case the RecursiveGroupLayout.CoreLayout is null. Previously, if additionally a group node had a specific layout algorithm associated to it, the content was not correctly moved along. If the core layout was not null, the issue did not occur.
                • The EdgeRouter class now considers the correct shape of non-affected, fixed edges. Previously, it sometimes incorrectly parsed their shape which could lead to undesired effects like incorrect path cost calculation of affected edges.
                • The BalloonLayout class now longer crashes due to a stack overflow for inputs containing very long chain graphs.
                • Fixed a bug in the HierarchicLayout class that in some cases caused a violation of the minimum first or last segment length (EdgeLayoutDescriptor.MinimumFirstSegmentLength and EdgeLayoutDescriptor.MinimumLastSegmentLength). The bug was only triggered when the minimum length values were relatively large.
                • The TreeMapLayout class no longer produces results that may have infinite coordinates.
                • The EdgeRouter class no longer produces unnecessary overlaps for cases where the source or target node is overlapped by (several) label elements. This generally improves the ability of the router to deal with input that contains source/target nodes that are overlapped by other elements and are required to be crossed by an edge route.
                • The HierarchicLayout class no longer throws an exception that was previously triggered in some cases with bus structures (see property HierarchicLayoutData.Buses) and in conjunction with undirected edges (see HierarchicLayoutData.EdgeDirectedness).
                • Fixed a bug in the EdgeRouter class that sometimes generated bad routing artifacts with edge grouping and when there were non-affected edges grouped at both end points.
                • The EdgeRouter class no longer throws an Exception that was previously in some cases triggered when the input contained bus edges (defined via BusDescriptor).

                Incompatible Changes

                API

                • The method CanvasControl.CreateInputModeContext is protected again, after having been made public accidentally previously.
                • The GraphEditorInputMode.RequeryHandles method is now public.
                • The HierarchicalClustering.Result.DendrogramRoot property can now return null if the result has been obtained from an empty graph.
                • The optional IPortLocationModelParameter and IPortStyle parameters of the IGraph.AddPort and GraphExtensions.AddPort methods can now be null.
                • The properties PixelImageExporter.Configurator and EmfImageExporter.Configurator are no longer virtual.
                • The ModelManager.UnInstall method has been renamed to the canonical name Uninstall.
                • The NodeReshapeSnapResultProvider.GetSnapLines method now takes CollectSnapResultsEventArgs as additional parameter.
                • Several methods related to snapping now take a PointD instead of a double as delta parameter. In detail, these are SnapResults.CreateResizeSnapResult, NodeReshapeSnapResultProvider.AddSnaplineSnapResult, NodeReshapeSnapResultProvider.AddGridLineSnapResult, and NodeReshapeSnapResultProvider.AddSameSizeSnapResult.
                • The NavigationInputMode.FitContentAfterGroupActions property now is false by default.
                • The GetTransform method of the DefaultLabelStyle, NodeStyleLabelStyleAdapter, LabelStyleBase<TVisual>, and IconLabelStyleRenderer now have an IRenderContext added as argument.
                • IRenderContext.Transform has been renamed to WorldToIntermediateTransform.
                • The method DefaultLabelStyleRenderer.IsTextMirrored has been removed.
                • The property BackColor on the PixelImageExporter class and the FillBackground property on the EmfImageExporter class have been replaced with the Background property which now takes a Brush instead of a Color or a boolean value.

                Behavior

                • The view coordinate system now includes the projection. For customers who do not use a projection, nothing will change. However, when the (old) view coordinate system has been used to render parts of the visualization in a zoom-invariant manner, the equivalent now is called the intermediate coordinate system. The view coordinate system is still necessary when coordinates relative to the control are needed, e.g. for tooltips or a context menu.
                • When using the new projections feature, CanvasControl's ContentRect property no longer has an effect on scrollbars or GraphControl.FitGraphBounds.
                • CanvasControl ignores its ViewportLimiter when projections are used.
                • Visuals that are rendered in view coordinates relative to the viewport may appear in a different location when exporting an image.
                • The GraphCentrality and ClosenessCentrality analysis algorithms now calculate the centrality individually per component instead of returning a centrality value of 0.0 for nodes in graphs that are not connected.
                • The NavigationInputMode.AdjustContentRect method doesn't fit the graph bounds in the viewport anymore.
                • The NavigationInputMode class doesn't fit the content after expand/collapse operations anymore. This can be re-enabled by setting the AutoGroupNodeAlignmentPolicy to a value other than None and FitContentAfterGroupActions to true.
                • The default value of the MoveViewportInputMode.PinchZoomThreshold property has been changed from 100 to 50 to prevent pinch gestures from stopping periodically.
                • The ViewportLimiter no longer jumps to the limited viewports if the current viewport is outside the limited area. This behavior can be restored by setting the ViewportLimiter.LimitingPolicy property to LimitingPolicy.Strict.
                • HierarchicLayoutData.EdgeDirectedness: If the Mapper property is directly accessed (not explicitly set), its default for unset values is now 1.0 instead of 0.0. These means that such edges are now treated as directed instead of undirected.
                • For the RootPlacements, SubtreeRoutingPolicies, and SubtreeAspectRatio properties of the AspectRatioTreeLayoutData class, the type of the mapped values has been made nullable. For null or unset values, the settings on the AspectRatioTreeLayout will now be taken. This is the documented behavior, though.
                • The value of the read-only property EdgeRouter.Partition is now null after applying the routing algorithm. It is only intended to be used during the execution. Previously, it was cached, even though the documentation stated otherwise.
                • PixelImageExporter.Export: throws InvalidOperationException if the size of the image is empty.
                • PixelImageExporter.ExportBitmap: throws InvalidOperationException if the size of the image is empty and throws IOException if the image needs too much memory.
                • EmfImageExporter.Export: throws InvalidOperationException if the width or height of the image is negative.
                • The view coordinate system now includes the projection. For customers who do not use that feature, nothing will change. However, when the (old) view coordinate system has been used to render parts of the visualization in a zoom-invariant manner, the equivalent now is called the intermediate coordinate system. The view coordinate system is still necessary when coordinates relative to the control are needed, e.g. for tooltips or a context menu.
                • When using the new projections feature, CanvasControl's ContentRect property no longer has an effect on scrollbars or GraphControl.FitGraphBounds.
                • CanvasControl ignores its ViewportLimiter when projections are used.

                Deprecations

                • The properties EdgeRouter.PolylineRouting, EdgeRouter.PreferredPolylineSegmentLength and EdgeRouter.MaximumPolylineSegmentRatio are now deprecated. To enable polyline routing, specify EdgeRoutingStyle.Octilinear as routing style via EdgeLayoutDescriptor.RoutingStyle. The other two properties are also replaced by respective properties on the EdgeLayoutDescriptor class.

                yFiles.NET 5.2.0.2

                Bugfixes

                • FilteredGraphWrapper: Fixed a possible ArgumentException ("Node not in this graph") which could occur when the parent of a node which is not visible in the filtered graph has been changed in the wrapped graph.
                • FoldingManager.GetFoldingEdgeState now throws an ArgumentException with a meaningful message instead of a NullReferenceException if the state is queried for a master edge (both source and target node are expanded).
                • FoldingManager: HasFoldingEdgeState now returns false for a non-dummy edge (both source and target are expanded) instead of throwing a NullReferenceException.

                Layout

                • The EdgeRouter class now considers the correct shape of non-affected, fixed edges. Previously, it sometimes incorrectly parsed their shape which could lead to undesired effects like incorrect path cost calculation of affected edges.
                • The BalloonLayout class now longer crashes due to a stack overflow for inputs containing very long chain graphs.
                • The HierarchicLayout class no longer throws an exception that was previously triggered in some cases with bus structures (see property HierarchicLayoutData.Buses) and in conjunction with undirected edges (see HierarchicLayoutData.EdgeDirectedness).
                • Fixed a bug in TableLayoutConfigurator which in rare cases could cause exceptions in additional layout stages.
                • ILabelCandidateDescriptor's Profit now is considered properly by the labeling algorithms.
                • The constants EdgeLabelLayoutDpKey and NodeLabelLayoutDpKey of the LabelLayoutKeys class now specify correctly that their generic type parameter is LabelLayoutData[] and not just LabelLayoutData.

                Incompatible Changes

                • FoldingManager.GetFoldingEdgeState now throws an ArgumentException instead of a NullReferenceException if the state is queried for a master edge (both source and target node are expanded).
                • FoldingManager: HasFoldingEdgeState now returns false for a non-dummy edge (both source and target are expanded) instead of throwing a NullReferenceException.

                yFiles.NET 5.2.0.1

                Major Improvements

                • The .NET Core-based library has been built and tested with the GA release of .NET Core 3.0. No library changes have been necessary and yFiles.NET 5.2 works just as well on the GA release of .NET Core 3.0.

                New Demos

                • The new LayoutStyles demo showcases the features and settings of the yFiles automatic layout algorithms.

                Improvements

                • A lot of small improvements and bugfixes have been applied to the demo applications.

                Bugfixes

                Viewer

                • Fixed an issue where NavigationInputMode's AutoGroupNodeAlignmentPolicy would sometimes not work when the expanded and collapsed group node sizes differ.
                • The GeneralPath.Prepend method no longer loses a part of the combined path in certain circumstances.

                Layout

                • The HierarchicLayout class now produces better results for input graphs with grouped edges and a PartitionGrid. Previously, such inputs may have produced edge routes with superfluous bends.
                • The HierarchicLayout class now correctly considers the properties MaximumNodesAfterBus and MaximumNodesBeforeBus of the BusDescriptor for single line (layer) buses. In addition, for multiple layer buses, the specified minimum node to edge distance is now considered for the distance between nodes and the vertical bus segment.
                • The OrganicLayout class now correctly removes node overlaps if its Scope is set to Scope.MainlySubset and its NodeOverlapsAllowed property is disabled. Previously, the layout sometimes produced superfluous overlaps for such cases.
                • The TreeMapLayout class no longer produces results that may have infinite coordinates.

                yFiles.NET 5.2

                ο»Ώ

                This release contains many new major features and lots of other new features, improvements, and bugfixes for all parts of the library. In addition to the new demos that show the new features, there are some notable new demos and demo improvements, too.

                Major New Features

                Support for .NET Core

                yFiles.NET now provides assemblies for both .NET Framework and .NET Core. All demos and tutorials are also provided for both frameworks.

                Improved documentation including more than 1000 new example code snippets

                The documentation has been improved. Particularly, more than 1000 new code examples have been added to the API documentation.

                Bus-like placement in hierarchic layouts
                The HierarchicLayout class is now able to arrange children of a specified root node in a bus-like way. This results in a very compact and uniform arrangement if a node has many successors. The bus sub-structures are defined by the HierarchicLayoutData.Buses property, and the new BusDescriptor class provides more individual settings for the buses.
                Label placement, bus routing, and port grouping for EdgeRouter

                The EdgeRouter class now features integrated edge label placement. Labels are automatically placed when the new property IntegratedEdgeLabeling is enabled. The placement considers the optional PreferredPlacementDescriptor of a label.

                Also, it now supports port grouping of edges at their source and target and orthogonal bus routing. To specify the port group IDs or the bus affiliation, use the associated properties in the PolylineEdgeRouterData class.

                Analysis wrapper

                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.

                The new GraphAnalysis demo allows you to interactively explore all the algorithms.

                NuGet Support

                The yFiles.NET assemblies can easily be bundled into NuGet packages. The packages support multiple targets.

                New and improved demos

                Added import feature for BPMN 2.0 abstract syntax format (Diagram Interchange).

                New Features

                View

                • The DefaultLabelStyle class got some new features:
                  • Support for insets that specify a distance between the label border and the label content.
                  • New properties for minimum and maximum size to restrict the size of the label.
                  • The ability to quantify the preferred size to avoid unnecessary floating point precision when saving.
                  • New static properties to enlarge the preferred size which can be useful when converting graphs between different platforms.
                • The CreateEdgeInputMode class can now create edges in reversed direction, i.e., starting from the target port.
                  • The new EdgeDirectionPolicy supports starting creation at the source, at the target, in the last direction, or depending on the port candidate.
                  • A configurable ToggleDirectionRecognizer allows changing the edge direction during creation.
                • The new property MoveLabelInputMode.AllowUnselected enables moving labels without having to select them first.
                • The method CreateEdgeInputMode.DoStartEdgeCreation that is used to programmatically start an interactive edge creation gesture now returns a Task with the newly created edge as result (or null if the gesture was canceled).
                • The method MoveInputMode.DoStartDrag that is used to programmatically start an interactive drag gesture now returns a Task with the affected items as result (or null if the gesture was canceled).
                • 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, ToFront and ToBack.

                  In addition, the GraphEditorInputMode class provides the new methods RaiseSelection, LowerSelection, SelectionToFront and SelectionToBack that change the z-order of all selected IModelItems.

                • The new PortStyleDecorationInstaller class allows the use of an IPortStyle to render the selection, highlight, or focus indicator of ports.

                Layout

                • 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 HierarchicLayout class is now able to consider individual crossing costs for edges and for crossing a group node border. These can be defined with the HierarchicLayoutData.EdgeCrossingCosts and the HierarchicLayoutData.GroupBorderCrossingCosts properties.

                  In addition, the new callback method DefaultLayerSequencer.GetCrossingCost allows to define an individual crossing cost value for a specific pair of edges when using this sequencer for the HierarchicLayout. In order to easily retrieve the original edge instance when customizing the hierarchic layout, the HierarchicLayout.GetOriginalEdge method was added.

                • 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.AutomaticRowAssignment.
                  • The new alignment policy GridNodePlacer.BusAligned aligns the root node with the bus.
                • The OrganicLayout class is now able to consider user-specified inertia and stress values for nodes.
                • 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 InteractiveOrganicLayout.CompactnessFactor property specifies the compactness of the result. If the graph contains several components, this feature can prevent that the components drift apart.
                • The new GivenCoordinatesStage class 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 GenericPartitionGridSupportStage class offers generic support for partition grid structures.
                • The OrganicLayout class is now able to produce 3D layout results.
                • The new ChannelRoutingTool class brings back the features of the ChannelRouter class that was removed in version 3.0.

                Improvements

                Graph and View

                • GraphOverviewControl no longer draws nodes and edges that are hidden via VoidNodeStyle and VoidEdgeStyle.
                • NodeStylePortStyleAdapter and PortControlPortStyle 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.
                • DefaultEdgePathCropper's methods CropEdgePath and CropEdgePathAtArrow have been made virtual.
                • The performance of EdgePathLabelModel.GetGeometry and EdgeSegmentLabelModel.GetGeometry has been strongly increased.
                • 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.
                • 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 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.
                • GraphBuilder's EdgeLabelProvider now is a function with return type object instead of string. The label text will be the string returned by the provided item's ToString method.

                Input

                • The new property CreateEdgeInputMode.ShowTargetHighlight 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.
                • The new properties PortRelocationHandler.ShowTargetHighlight and PortRelocationHandlerProvider.ShowTargetHighlight specify whether to enable or disable highlighting of potential targets for edge creation. Also, the method UpdateHighlight has been added to the PortRelocationHandler class to allow for further customization of the highlight.
                • The new properties PortRelocationHandler.ShowPortCandidates and PortRelocationHandlerProvider.ShowPortCandidates specify whether to enable or disable showing port candidates during edge relocation.
                • 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 now virtual.
                • Snaplines are now infinitely long by default.
                • HandleInputMode now clears the AffectedItems after the Canceled event has been raised instead of before.
                • GraphEditorInputMode provides new protected methods CreateLabelCore and EditLabelCore to allow for overriding the default implementations.
                • Fixed some rare cases where a new label was erroneously 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 now return a Task with the edited or newly created label as result. Therefore, these methods can be awaited.
                • GraphEditorInputMode provides a TextEditorInputModeConfigurator property to allow for configuring the TextEditorInputMode before each label editing.
                • NavigationInputMode: Added a property ScrollToSelection that controls whether a node that is focused or selected with a keyboard gesture is automatically scrolled into the viewport if necessary.

                GraphML Serialization

                • The GraphMLIOHandler class now supports reading and writing arbitrary objects at graph level.
                • GraphML: Name mappings for both closed and unbound generic types are now supported.
                • GraphML: Generic type arguments are now available as a property of the QueryTypeEventArgs.
                • SizeDValueSerializer and SizeDConverter can now read the strings "Zero" and "Infinite".
                • RectDValueSerializer and RectDConverter can now read the string "Infinite".
                • PointDValueSerializer and PointDConverter can now read the string "Origin".

                Graph-Layout-Bridge

                • 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 PortAdjustmentPolicy property of LayoutExecutor and LayoutGraphAdapter replaces the previous ImprovePortAssignment boolean property. The new property is of type PortAdjustmentPolicy and offers more options for adjusting the port locations after a layout calculation.
                • The viewport animation of the LayoutExecutor class considers now the value of the LimitFitContentZoom property of the corresponding GraphControl.

                Hierarchic Layout

                • The HierarchicLayout class now also considers critical edge priorities for grouped edges.
                • The HierarchicLayout class now also considers sequence constraints for grouped edges.
                • The HierarchicLayout class now uses the specified layer alignment to align sub-components (see HierarchicLayoutData.SubComponents).
                • 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 no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges.
                • The layering of HierarchicLayout was improved with respect to the resulting edge lengths if the recursive group layering feature is enabled.
                • The HierarchicLayout class now produces less overlapping elements for graphs with fixed coordinate hints.
                • 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 label in the middle of a node side, if it is the only port on that side. Previously it was only centered if the label was additionally placed on the edge.
                • The HierarchicLayout class now requires less memory for graphs with sequence constraints.

                Edge Routing

                • 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 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 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 new properties AbortHandler, SourcePortConstraints, TargetPortConstraints, SourcePortCandidates, and TargetPortCandidates of ChannelEdgeRouterData facilitate using these features with ChannelEdgeRouter.

                Labeling

                • 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.

                Other Layouts

                • The new OrthogonalLayout.PreferParallelRoutes property allows for controlling how parallel edges (multi-edges) are routed.
                • New options of the PlaceNodeAtBarycenterStage class 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 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.
                • 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.
                • 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 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 OptimizeRowOrder and OptimizeColumnOrder to indicate whether or not the order of the rows respectively columns should be chosen automatically to minimize edge lengths.

                  In addition, the RowIndices and ColumnIndices properties of the PartitionGridData class can now also be used in combination with the Grid property.

                • The PortCalculator class now considers edge label positions such they are not affected by whether this stage is applied or not (see property LayoutExecutor.PortAdjustmentPolicy). Previously, label positions could be changed if the label position was stored relative to the first or last segment or the port.

                Demos

                • The demos now have shorter project and folder names.

                Bugfixes

                Graph and View

                • 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.
                • Fixed a bug in the UndoEngine class that resulted in memory leaks if the tokens returned by GetToken were not disposed when the UndoEngine got cleared.
                • The null check for the GridVisualCreator.Pen property works correctly now.
                • Fixed a bug in EdgePathLabelModel which could return an invalid geometry for parameters with a ratio < 0 and zero length edge segments.
                • GeneralPath.Flatten(): Fixed unexpected behavior if a curve follows after a close operation.
                • Fixed a bug in DictionaryMapper and WeakDictionaryMapper where entries with key null were not included in the mapper's Entries enumeration.
                • Fixed an exception which could occur in CanvasControl's method CompareRenderOrder and when using GraphModelManager's Comparer property.
                • Fixed some false positive errors emitted by PEVerify due to unused methods.
                • Fixed a bug in FilteredGraphWrapper which prevented port labels from being correctly added or removed together with their port owner after the predicate changed.
                • Setting null or VoidNodeStyle/VoidEdgeStyle as the NodeStyle, GroupNodeStyle or EdgeStyle in OverviewGraphVisualCreator no longer results in a NullReferenceException.
                • TextVisual.GetBounds now returns correct results for Format alignments other then Near.

                Input

                • Reparenting an expanded group node into a collapsed group node no longer throws an error.
                • 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 CreateEdgeInputMode class now considers the value of the CanvasControl.HitTestRadius property when its StartOverCandidateOnly property is enabled.
                • 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.

                • 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.
                • The visualization of source port candidates by the CreateEdgeInputMode class does not flicker, anymore.
                • Fixed a bug in GraphEditorInputMode where changing the value of ShowHandleItems while handles were already displayed resulted in duplicate handles.
                • 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 AllowEdgeToEdgeCreation was set to false. This could result in the edge's IPortCandidateProvider being queried for candidates erroneously.
                • Zooming the viewport during interaction no longer synthesizes mouse-move events in the wrong locations.

                GraphML Serialization

                • Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an error.
                • Labels at folder nodes and their adjacent edges are no longer lost during GraphML deserialization if the DefaultFolderNodeConverter.CopyFirstLabel property is enabled.
                • Fixed GraphML exception when parsing generic types.

                Hierarchic Layout

                • 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 error if it is wrapped by an instance of RecursiveGroupLayout and the input graph contains layering constraints between elements of different groups.
                • The HierarchicLayout class no longer throws an ArgumentException 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.DirectGroupContentEdgeRouting).
                • 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 or width. Previously, such labels may have caused very large distances between some nodes.
                • The HierarchicLayout class sometimes threw an ArgumentError for input graphs that contained incremental elements in combination with 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 sometimes threw an ArgumentError for input graphs that contained fixed elements in combination with both swimlanes and groups.
                • 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.
                • 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).

                Tree Layout

                • The CompactNodePlacer class no longer throws an exception for input graphs with specified memento strategies (see TreeLayoutData.CompactNodePlacerStrategyMementos or CompactNodePlacer.StrategyMementoDpKey).
                • 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.
                • The SimpleNodePlacer class no longer produces unnecessarily long horizontal edge segments.

                Edge Routing

                • 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.
                • The EdgeRouter class now correctly handles edges with external ports. Previously, such inputs may have caused an exception.
                • The EdgeRouter class now correctly groups edges associated with equal group IDs that have a different object ID.
                • A rare error 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 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.
                • The PolylineLayoutStage class no longer generates overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes).
                • Fixed a rare error that was triggered by the EdgeRouter class during routing in cases where the input contained grouped edges.
                • The EdgeRouter class no longer throws an exception if the EdgeRouter.PolylineRouting 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 ConsiderEdgeLabels is enabled.
                • The EdgeRouter class no longer throws an error 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. Previously, it could happen that intermediate points were not part of the final polyline edge path.
                • The EdgeRouter class no longer considers all PortCandidates with multiple directions as fixed PortCandidates.
                • Fixed two issues that induced the violation of a PortCandidate with fixed offsets (or a strong PortConstraint) by the EdgeRouter class. 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).
                • 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 handles cases where the maximum duration is exceeded and where previously an exception was triggered.
                • Fixed a StackOverflowException in EdgeRouter.
                • 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 EdgeRouter class no longer throws an exception if all fixed edges of a bus are non orthogonal/octilinear.
                • The EdgeRouter class now correctly considers strong port constraints of edges that belong to a bus structure.

                Labeling

                • The GenericLabeling class now produces better 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 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 for some edge labels. Previously, edges that had a PreferredPlacementDescriptor were sometimes affected.
                • The GenericLabeling class now always prefers LabelCandidates with higher profit values over others with lower profit. Previously, this sometimes happened even though both candidates did not intersect with other elements.
                • The GenericLabeling class no longer assumes 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.
                • We fixed a rare bug in the GenericLabeling that may have caused an ArgumentException for some input graphs that contain edges with zero length segments and labels associated with a free edge label model.
                • The GenericLabeling class no longer throws an ArgumentException for some input graphs containing labeled edges with zero length.

                Other Layout Styles

                • The OrthogonalLayout class no longer throws an exception when property OrthogonalLayout.UniformPortAssignment is enabled and the input contains parallel edges.
                • The OrthogonalLayout class no longer causes an exception for some input graphs when property FaceMaximization is enabled.
                • The OrthogonalLayout class no longer runs into an infinite loop for some input graphs that are tree structures with mixed edge directedness. Note that the problem only occurred if property OrthogonalLayout.TreeStyle is not set to TreeLayoutStyle.None.
                • 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 Deterministic is enabled.
                • 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.
                • 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 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 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 OrganicRemoveOverlapsStage no longer produces infinite loops in some rare cases.
                • The PortPlacementStage class no longer destroys the grouping information for the core layout algorithm.
                • Fixed a bug in YGraphAdapter that could trigger a NullReferenceException when boolean, integer or double values were requested from registered IMapper but no value had been set beforehand.
                • The GraphStructureAnalyzer.HasMultipleEdges method now returns the correct result for input graphs with self-loops.
                • The Paths.FindAllChains method now correctly calculates the chains for input graphs with cycles.
                • 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.
                • Fixed a bug which caused licenses for public tokens not to work for the algorithms assembly.

                Incompatible Changes

                Incompatible API Changes

                • The ImprovePortAssignment 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.
                • ItemCollection's type parameter has been constrained to reference types.
                • The following properties of specific layout data types now have a name with the correct plural or singular usage.
                  • HierarchicLayoutData.AlternativeEdgePath has been renamed to AlternativeEdgePaths.
                  • TreeLayoutData.LeftRightPlacersLeftNodes has been renamed to LeftRightNodePlacerLeftNodes.
                  • TreeLayoutData.DelegatingNodePlacersPrimaryNodes has been renamed to DelegatingNodePlacerPrimaryNodes.
                  • FixNodeLayoutData.FixedNode has been renamed to FixedNodes.
                • The type of the properties BalloonLayoutData.TreeRoot and TreeLayoutData.TreeRoot has been changed to SingleItem<INode>.
                • The property HierarchicLayoutData.AlternativeEdgePaths now expects IEnumerable<IPoint> instead of YPointPath as mapped values.
                • The property HierarchicLayoutData.AlternativeGroupBounds now expects IRectangle instead of YRectangle as mapped values.
                • The properties Rows and Columns of class PartitionGrid are now of type IEnumerable<RowDescriptor> and IEnumerable<ColumnDescriptor> instead of an un-typed YList.
                • The properties SourceGroups and TargetGroups of RadialLayoutData have been removed since edge grouping is not supported by the RadialLayout class.
                • 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.
                • IXamlNameMapper.GetType now has a third argument for optional type parameters.
                • Class TextVisual now is sealed.
                • GraphBuilder's EdgeLabelProvider now is a function with return type object instead of string. The label text will be the string returned by the provided item's ToString method.

                Changes of Default Behavior

                • The SimplexNodePlacer.BarycenterMode property is now enabled by default. Thus, the HierarchicLayout class with default settings now produces different (usually more symmetric) layouts.
                • 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 default tooltip of the ToolTipQueryEventArgs class 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.
                • The GroupingSupport class no longer throws an ArgumentException if there is a node without associated ID. Instead the class uses the node itself as ID.
                • The HierarchicLayout class now uses a higher crossing cost for group node borders. To specify custom values, use the property HierarchicLayoutData.GroupBorderCrossingCosts.
                • 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 default value of the property GridNodePlacer.RootAlignment was changed to GridNodePlacer.BusAligned from RotatableNodePlacerBase.RootAlignment.Trailing.

                Minor Incompatible Changes

                • The method LayoutData.Apply is now protected instead of public.
                • The YList.SubList method was removed since it was not implemented at all and is not used by the library.
                • The clone methods of the geometric types Point, Rect, Size, and Insets was removed since these types are immutable and the methods just returned this.
                • The classes GeneralPath and GeneralPathCursor are now sealed.
                • The following changes regarding the expert API related to the EdgeRouter class were made:
                  • The first parameter of the constructors in class SegmentInfoBase 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 SegmentInfoBase.Edge has been removed as the info is not necessarily associated with an edge anymore.
                  • Similarly, 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) has been removed.

                yFiles.NET 5.1.0.2

                Improvements

                • OrganicLayoutData: The new properties SourceGroupIds and TargetGroupIds can be used to group edges when some preconditions are met.
                • The performance of the GenericLabeling algorithm and the quality of the label placements were improved.
                • Added the FixPortLocationStageData class that allows to conveniently define the port constraints that are considered by theFixPortLocationStage class.

                Bugfixes

                • User interactions in a folded graph which contains labels at ports no longer throw an exception.
                • An edge in a folded view no longer loses its bends and labels after it is reversed multiple times.
                • Scrolling with CanvasControl.AnimateScrollCommands enabled no longer changes the zoom level.
                • The labels of dragged ports are now displayed correctly by the PortDropInputMode class.
                • The EdgeStyleDecorationInstaller class now properly displays decorations for edges between group nodes and their descendants when displayed in view coordinates.
                • The EdgeStyleDecorationInstaller class no longer causes an exception when used on edges that attach to other edges.
                • Reparenting an expanded group node into a collapsed group node no longer throws an exception.
                • 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.
                • GridVisualCreator now renders grids with GridStyle Crosses and different horizontal and vertical spacings correctly.
                • The null check for the GridVisualCreator.Pen property works correctly now.
                • PixelImageReporter's Export method doesn't get stuck anymore when rendering a grid.
                • ContextConfigurator's Setup method doesn't create IRenderContext instances with unbound Clip anymore.
                • With SmartEdgeLabelModel it now is possible to move a label from the left side of an edge to the right side. Fixed a bug which stopped the label at the edge.
                • Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an exception.
                • Fixed GraphML exception when parsing generic types.
                • Fixed a bug that rendered labels or ports neither in a separate layer nor at their owner when exactly one of LabelLayerPolicy.AtOwner or PortLayerPolicy.AtOwner was used.
                • The AutoGroupNodeAlignmentPolicy values CenterLeft, CenterRight, TopCenter, BottomCenter, and BottomLeft now work correctly.
                • The visualization of source port candidates by the CreateEdgeInputMode class does not flicker, anymore.
                • Fixed an exception which could occur in CanvasControl's method CompareRenderOrder and when using GraphModelManager's Comparer property.
                • Fixed a bug which might occur in very rare cases in the undo/redo processing of several consecutive reparent actions.
                • Fixed a bug in the UndoEngine class that resulted in memory leaks if the tokens returned by GetToken were not disposed when the UndoEngine got cleared.
                • CollapsibleNodeStyleDecorator: IsHit respects buttons outside the node bounds.

                Algorithms

                • The Paths.FindAllChains method now correctly calculates the chains of input graphs with cycles.

                Layout

                • 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 ArgumentException for input graphs that contained incremental elements in combination with groups.
                • The HierarchicLayout class now prevents intersections between labels and the horizontal grid lines of a PartitionGrid.
                • The HierarchicLayout class now properly handles input graphs with source/target port labels and where a subset of nodes has NodeHalos. Previously, such inputs could cause an exception.
                • The HierarchicLayout class does not longer violate fixed PortCandidates in cases where also critical edges (HierarchicLayoutData.CriticalEdgePriorities) and edges connecting to group nodes are given.
                • The HierarchicLayout class now produces less superfluous crossings if there are same-layer edges with PortConstraints or PortCandidates.
                • 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 calculates the required length of straight-line same-layer edges. Previously, the calculated length could have exceeded the required length by the value of the HierarchicLayout.NodeToEdgeDistance property.
                • 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 EdgeRouter class no longer throws an exception for some inputs containing edges with intermediate routing points.
                • The EdgeRouter class now correctly handles cases where the maximum duration is exceeded and where previously an exception was triggered.
                • 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.
                • Fixed a StackOverflowError in EdgeRouter.
                • 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 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 CompactNodePlacer class now correctly handles inputs where the tree root is marked as assistant node, see TreeLayoutData.AssistantNodes.
                • The CompactNodePlacer class now correctly considers the specified values of the VerticalDistance and HorizontalDistance properties.
                • The CompactNodePlacer class now produces more compact results for some cases where it previously generated larger, less compact results.
                • 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.StrategyMementoDpKey).
                • The OrthogonalLayout does no longer throw an exception if a graph is almost a tree and its TreeStyle property is set to TreeLayoutStyle.Integrated and a fixed TreeOrientation is set.
                • The OrganicLayout class now produces deterministic results for group nodes if its property Deterministic is enabled.
                • The OrganicRemoveOverlapsStage no longer produces infinite loops in some rare cases.
                • Fixed a potential exception in LayoutExecutor which could occur when a layout is applied to a graph which contains table nodes which are not group nodes.
                • Fixed a bug in class EdgeRouter that sometimes caused a non-deterministic behavior.
                • The PolylineLayoutStage does no longer generate overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes).
                • Fixed a rare exception that was triggered by the EdgeRouter class during routing in cases where the input contained grouped edges.
                • The GenericLabeling class now produces better 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.
                • Fixed two issues that induced the violation of a PortCandidate with fixed offsets (or a strong PortConstraint) by the EdgeRouter class. 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 the EdgeRouter.PolylineRouting 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 ConsiderEdgeLabels 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.PolylineRouting). Previously, it could happen that intermediate points were not part of the final polyline edge path.
                • The PartialLayout class now correctly considers the specified PortCandidates during orthogonal or octilinear routing of edges.
                • The EdgeRouter class no longer considers all PortCandidates with multiple directions as fixed PortCandidates.
                • The OrthogonalLayout class no longer throws an exception when property OrthogonalLayout.UniformPortAssignment is enabled and the input contains parallel edges.
                • 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 CompactNodePlacer class now correctly handles input graphs that contain assistant nodes and given placement strategies (see the CompactNodePlacerStrategyMementos property of the TreeLayoutData class).
                • The SeriesParallelLayout class now correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception.

                yFiles.NET 5.1.0.1

                Bugfixes

                • PortRelocationHandle.GhostVisualizationPenKey now is excluded from obfuscation.
                • Fixed the Save command always opening a file dialog even if a file has been specified in a previous file operation.
                • The cursor is now correctly reset after editing an orthogonal edge.
                • The CreateEdgeInputMode class doesn't show port candidates anymore if bend creation is enforced (by pressing CTRL key during edge creation).
                • Bridges sometimes didn't appear on edges when they were scrolled into the viewport.
                • Fixed a possible infinite loop in the OrthogonalEdgeHelper class.
                • Fixed a possible NullReferenceError which could occur in customized LabelDropInputMode and PortDropInputMode classes.
                • The Clone method now is overridable in all style implementations.
                • The INodeInsetsProvider implementations which can be retrieved from InteriorLabelModel and InteriorStretchLabelModel now correctly sum up the space required by overlapping labels.
                • The scrollbars now respect viewport limits set by a ViewportLimiter even if the limited bounds are smaller than the GraphControl's ContentRect.
                • Fixed a possible NullReferenceException in TableNodeStyleRenderer when a TableNodeStyle is rendered with Table set to null.
                • The indicators for bend grid snapping were not always drawn at the correct position for bends which were implicitly moved with a selected edge.
                • Fixed ContextMenuInputMode not showing the context menu upon the first right click after application startup.
                • Added missing support for context menus opened with the keyboard. The PopulateItemContextMenu event will then be raised for selected items instead of the item under the mouse pointer.
                • KeyboardInputMode no longer forgets custom key bindings when reinstalled.

                Demo Improvements

                • The RenderPolicies demo has been updated with a better design and description.
                • Fixed some issues in BPMN demo which occured when the style of an edge was changed.

                yFiles.NET 5.1

                ο»Ώ

                Major New Features

                Labels at Ports
                Labels can now be added to ports and the new label models FreePortLabelModel and InsideOutsideLabelModel can be used to place such labels. On the technical side, IPort now extends the ILabelOwner interface and the enum constant GraphItemTypes.PortLabel was added.
                Customizable Rendering Order
                Labels and ports can now optionally be rendered directly in front of their owner. Such a rendering order can make the ownership of labels and ports clearer if nodes overlap. Previously, all labels and ports were rendered in front of all nodes. The new rendering order can be enabled by setting the new properties LabelLayerPolicy and PortLayerPolicy of GraphModelManager to LabelLayerPolicy.AtOwner and PortLayerPolicy.AtOwner, respectively.

                The nesting options of GraphModelManager for the visualizations of nodes and edges have been improved and clarified. The properties UseHierarchicNodeNesting and UseHierarchicEdgeNesting have been combined into the new HierarchicNestingPolicy property. It takes values of the new HierarchicNestingPolicy enum. Its new option HierarchicNestingPolicy.GroupNodes configures GraphModelManager to visualize all leaf nodes in one canvas object group while nesting all group nodes depending on their hierarchical depth.

                Drag and Drop
                The new LabelDropInputMode and PortDropInputMode classes implement drag and drop for labels and ports, respectively. The API of these classes is similar to NodeDropInputMode for nodes.
                Lasso Selection
                The new LassoSelectionInputMode selects all model items inside a hand-drawn lasso region. This mode allows combinations of free-hand and straight-line sections during path creation.
                Improved Orthogonal Layout
                Many parts of the orthogonal layout algorithm have been significantly improved. In many cases, the drawings created by this algorithm are now much more compact and have smaller edge lengths, and they contain less crossings and perceived bends.

                In addition, this layout now supports special layout styles of various substructures that are automatically detected in the input graph. Supported substructures are trees, chains and cycles. In addition to the style, the new feature offers more settings, like, for example, the desired tree layout orientation.

                Parallel edges (multi-edges that share the same source and target node) are now routed as parallel as possible; if there are edge labels, the routes must differ somewhat. Previously, parallel edges were not handled explicitly and their routes were often very different, making the recognition of parallel structures difficult.

                Sub-components in Hierarchic Layouts
                In a hierarchic layout, you can now define sub-components of the input graph such that each sub-component is arranged by a user-specified layout algorithm. This allows hierarchical layouts where parts of the graph are arranged in a different fashion, e.g., to emphasize special sub-structures. The new HierarchicLayoutData.SubComponents property can be used to configure the new sub-components feature of the hierarchic layout.
                Tree Map Layout
                Added the new layout algorithm TreeMapLayout that generates tree maps. Tree maps present hierarchical data using nested rectangles (nodes) where each rectangle (node) gets its size depending on a specific dimension of data associated to it. The new TreeMapLayoutData class provides additional configuration options for this algorithm.
                Tabular Layout Style
                The new layout algorithm TabularLayout generates simple tabular arrangements of nodes. It allows to place nodes in rows and columns, such that each table cell contains at most one node. Among its features is, for example, a from-sketch mode, the possibility to exactly map nodes to specific cells or different vertical and horizontal alignments. The new TabularLayoutData class provides additional configuration options for this algorithm.

                New Features

                View

                • The following types and methods were added to support the new LassoSelectionInputMode.
                  • Added the GraphInputMode.LassoSelectionInputMode property and a corresponding factory method. LassoSelectionInputMode is disabled per default.
                  • The new GraphInputMode.LassoSelect method programmatically selects all items in the provided GeneralPath.
                  • The new ILassoTestable interface specifies whether the item is considered to be inside the lasso path. This is analog to the IMarqueeTestable interface for marquee selection.
                  • Any model item can be decorated with an instance of ILassoTestable or provide one in its lookup. For this, the Node/Edge/Port/Label/BendDecorator classes got the new LassoTestableDecorator property for decorating an item with a custom ILassoTestable.
                  • The new IsInPath method of Node/Edge/Port/LabelStyleBase can be overridden to customize the lasso testing behavior.
                • With TableEditorInputMode, double clicking a stripe or stripe label now edits the label in the same way as for other graph items.
                • RectD and SizeD: Added methods to reduce the size of an RectD and SizeD instance, respectively.
                • The new static method PositionHandlers.Combine combines multiple position handler instances into a single instance.
                • Added the events ElementsCopied, ElementsCut, and ElementsPasted to GraphEditorInputMode, and the event ElementsCopied to GraphViewerInputMode.
                • The new Animations.CreateSequentialAnimation method creates an animation that animates multiple animations in sequence.
                • The rectangle of the marquee selection can now be customized with the new protected method MarqueeSelectionInputModes.CalculateMarqueeRectangle.
                • Added new decorator implementations for table items. You can access these new decorators via the new method ITable.GetDecorator with the RowDecorator, ColumnDecorator and StripeLabelDecorator properties.
                • If the new CanvasControl.QuantizeInputCoordinates property is enabled, world coordinates of mouse events are rounded to nicer values to avoid unnecessary precision. For example, you'll get the value 326.375 instead of 326.3758109495. The rounding is chosen based on the zoom level to ensure that there is almost no visual deviation. Lower zoom levels will result in coarser rounding, higher zoom levels will use exactly as much precision as necessary. By default, this option is enabled.

                Layout

                • Added the TreeMapLayoutData configuration class for the new TreeMapLayout algorithm.
                • Added the TabularLayoutData configuration class for the new TabularLayout algorithm.
                • Added the TemporaryGroupNodeInsertionData configuration class for the new TemporaryGroupNodeInsertionStage layout stage.
                • The new HierarchicLayoutData.SubComponents property can be used to configure the new sub-components feature of the hierarchic layout.
                • The new TreeLayoutData.CompactNodePlacerStrategyMementos property can be used to maintain similar layout styles over subsequent runs of compact tree layout.
                • ShortestPaths: Added a-star (A*) algorithm for finding the shortest path between two nodes in a directed or undirected, arbitrary graph.
                • The new property OrthogonalLayout.MaximumDuration controls the preferred time limit of this layout algorithm.
                • The new OrthogonalLayout.UniformPortAssignment property allows you to obtain results with a more uniform port assignment.
                • TreeLayout: Added node placer CompactNodePlacer that produces more compact tree layouts. It uses a dynamic optimization approach that chooses a placement strategy of the children such that the overall result is compact with respect to a specified aspect ratio, see property CompactNodePlacer.PreferredAspectRatio.
                • EdgeRouter now supports routing through user-specified intermediate points. All specified points will lie on the edge route in the given order. See new property EdgeLayoutDescriptor.IntermediateRoutingPoints.
                • EdgeRouter: Edges that connect group nodes with their descendants can now directly connect from the inside to the group node border. Previously, an edge needed to always leave the group node before connecting to it. The feature can be enabled/disabled individually for each edge using the new property EdgeLayoutDescriptor.DirectGroupContentEdgeRouting.
                • Added convenience layout stage TemporaryGroupNodesInsertionStage that automatically generates a (non-nested) grouping structure from a given mapping of nodes to a component ID. This temporary grouping is meant for use during the run of the core layout algorithm of the stage. It allows, for example, easy use of RecursiveGroupLayout without the need for a real grouping structure when the requirement is that different sub-graphs need to be arranged with different layout algorithms.

                  The new TemporaryGroupNodeInsertionData class provides additional configuration options for this algorithm.

                • The new PlaceNodesAtBarycenterStage places a user-specified subset of nodes on the barycenter of their neighbors. During the core layout, these nodes are hidden.

                Improvements

                General

                • The PointD.ToMutablePoint and RectD.ToMutableRectangle methods now return a MutablePoint instead of IMutablePoint and a MutableRectangle instead of a IMutableRectangle, respectively.
                • The new method GeneralPath.Intersects(GeneralPath) determines whether the path intersects with another GeneralPath.
                • When reading GraphML with the deserialization property IgnoreXamlDeserializationErrors enabled, invalid property content is now skipped instead of discarding the whole object with such content.

                Graph

                • Many label model CreateParameter methods now have default values for parameters that are not needed every time.
                • InteriorStretchLabelModel: Added new parameters CenterHorizontal and CenterVertical for horizontal or vertical centered one-line labels.
                • The ElementCopiedCallback parameter of the methods GraphCopier.Copy and GraphClipboard.Duplicate is now optional (and can be null).
                • Added a Remove method to NodeDecorator, LabelDecorator, EdgeDecorator, PortDecorator, and BendDecorator for easy removal of decorations.
                • GraphBuilder now supports edges to and from group nodes.
                • GraphBuilder now supports parent-child relationships between nodes defined in NodesSource when no GroupsSource is set. The parent node of such a relation is converted to a group node.
                • The default value of DefaultPortCandidate.LocationParameter is now FreeNodePortLocationModel.NodeCenterAnchored for nodes and BendAnchoredPortLocationModel.FirstBend for edges instead of a parameter of an internal model.
                • DefaultGraph has new factory methods to customize undo unit creation.

                View

                • Added the new CanvasControl.LimitFitContentZoom property which controls whether the maximum zoom level for the CanvasControl.FitContent method as well as the FitContent command is restricted to 1 or the value of the MaximumZoom property.
                • The new method GraphModelManager.GetMainCanvasObject returns the canvas object that should be used when changing the visibility or z-order of a model item.
                • The ComponentCommands.ScrollPage commands now accept any IConvertible command parameter instead of only doubles and strings.
                • Akin to the two CanvasControl.ZoomTo methods, there are now two CanvasControl.ZoomToAnimated methods that animate the viewport change.
                • Assigning a new graph instance to GraphOverViewControl now keeps configuration changes made to the overview's VisualCreator instance.
                • Selfloop edges are now properly displayed in the GraphOverviewControl.
                • Animations after a layout don't break anymore if the graph is modified concurrently.
                • ICanvasObjectGroup.AddChild(Object,ICanvasObjectDescriptor): The second parameter is now a default parameter with default value null and therefore changed its attribute to CanBeNull. If no descriptor is passed, CanvasObjectDescriptors.AlwaysDirtyInstance is used by the default implementation.
                • GraphModelManager now avoids unnecessary re-installation of items if they keep their ICanvasObjectGroup. By these re-installations the z-order of the item in its group was lost and a new visual was created.
                • PolylineEdgeStyle renders better looking paths for self loop edges whose ports are near the node border.

                Input

                • The CanvasControl.CreateInputModeContext method is now public instead of protected.
                • GraphEditorInputMode and TableEditorInputMode: Method EditLabel now also returns a Future, similar to AddLabel and CreateLabel.
                • The INode parameter of the NavigationInputMode.EnterGroup method is now optional. If it is omitted or null the whole graph will be revealed.
                • Moving a node with the MoveInputMode for unselected nodes now moves the bends of adjacent self-loops, too.
                • The new methods FindNextItem and FindNearestItem of NavigationInputMode can be used to configure the determination of the "next" item.
                • The type parameter T of class ItemDropInputMode<T> is no longer restricted to IModelItem.
                • The following input modes now release the mutex before dispatching their final event:
                  • CreateEdgeInputMode now releases the mutex before dispatching the EdgeCreated event.
                  • MoveInputMode now releases the mutex before dispatching the DragFinished event.
                  • ResizeStripeInputMode now releases the mutex before dispatching the DragFinished event.
                • CreateEdgeInputMode now removes coinciding bends if orthogonal edge creation is enabled.
                • The new CreateEdgeInputMode.GetSourcePortCandidates protected method makes source port candidate determination more flexible.
                • The new optional parameter initialTargetLocation of the CreateEdgeInputMode.DoStartEdgeCreation method can be used to define the initial location that shall be used to find a target node.
                • During interactive edge creation, the tip of a newly created edge now only snaps to valid target port candidates to create orthogonal end segments.
                • CreateEdgeInputMode now always creates dummy ports during a gesture, instead of temporarily reusing real ports if available. This makes it possible to change, e.g. the dummy edge's source port's style during the gesture.
                • The new CreateEdgeInputMode.StartOverCandidateOnly property can be used to restrict the start of an edge creation gesture to directly hovered port candidates.
                • The new TextEditorInputMode.TextBoxPlacementPolicy property provides finer control of what happens when the TextBox is (partially) outside of the viewport.
                • The new TextEditorInputMode.TextBoxPadding property controls the padding between the TextBox and the border of the canvas.
                • The CanvasControl.Mouse2DClicked event now reports the position of the mouse down event as its location. Previously, this was the location of the up events which can be slightly different.
                • The properties MaximumSnapDistance, ShowHitPortOwnerCandidatesOnly and Visualization have been added to PortRelocationHandleProvider and are applied to each PortRelocationHandle created by this provider.
                • Added overridable methods to PortRelocationHandle to allow customization of the port candidates.
                • The new PortRelocationHandle.Visualization property controls how the preview during edge reconnection is handled. A new option is to change the edge during the gesture, which improves fidelity of the preview in certain cases.
                • The new optional content parameter of the MouseHoverInputMode.Show method defines the content of the tool tip to show. Now, the GetToolTipContent method only gets called if no content was specified.
                • The static constants SelectedMovablesPositionHandler and SelectedMovablesHitTestable have been added to GraphEditorInputMode. These are used as default PositionHandler and HitTestable properties of GraphEditorInputMode.MoveInputMode and can be reused for other input modes.
                • Introduced new property HandleMissingMouseEvents on CanvasControl which allows for configurable handling of mouse gestures which are only received partially.
                • Canceled input modes now don't run unnecessary hit tests.
                • The CanvasControl now reports losing the mouse capture with a Mouse2DEvent with the type LostCapture. Several input modes listen to this event and cancel themselves upon it.

                Table

                • The last parameter of the following extension methods of ITable is now optional: FindRow, FindColumn, FindStripe, and FindStripes.
                • TableEditorInputMode now handles clicks similar to GraphEditorInputMode:
                  • New ItemClicked, ItemLeftClicked, ItemRightClicked, ItemDoubleClicked, ItemLeftDoubleClicked, ItemRightDoubleClicked events are raised.
                  • If an event is handled, its default behavior is prevented.
                  • The new properties ClickableItems and ClickableRegions determine for which items and regions a click event will be raised.

                Layout

                • The new LayoutExecutor.CreateLayoutGraphAdapter callback method makes it possible to configure the LayoutGraphAdapter that is used for the layout calculation.
                • The new TreeLayoutData.CriticalEdgePriorities property can be used to specify critical edges.
                • SmartEdgeLabelModel now is properly handled by labeling algorithms, resulting in better label placements.
                • The new ImprovePortAssignment property of LayoutExecutor and LayoutGraphAdapter enables PortCalculator to improve the port assignment.
                • The combination of PartitionGridData and TableLayoutConfigurator has been improved:
                  • PartitionGridData now reuses the PartitionGrid created by the TableLayoutConfigurator.
                  • Several methods have been added to TableLayoutConfigurator which provide access to the PartitionCellId assignment of the configurator as well as the mappings between IRow/IColumn and RowDescriptor/ColumnDescriptor.
                • Major performance improvement for EdgeRouter in routing scenarios where it is unavoidable to cross obstacles (e.g. other nodes or labels) in order to reach the target. This includes cases where a crossing is necessary to guarantee that port candidates/constraints at the target side are satisfied.

                  In addition, several minor performance improvements reduce the runtime of the path search phase as well as the segment location assignment phase.

                • EdgeRouter: Improved quality in maze routing scenarios. Previously, it could happen that edge-node overlaps occurred even though there exists a more complicated path that yields no overlaps.
                • BusRouter: Now automatically ignores non-orthogonal edges with fixed bus descriptor (see BusDescriptor.Fixed) or transforms them into orthogonal edges if they are octilinear. In previous versions, the layout algorithm simply throws an error in such cases.
                • MultiPageLayout: Improved runtime as well as layout quality if the input is a tree structure and the specified CoreLayout is either an instance of class TreeLayout or ClassicTreeLayout. Furthermore, property MultiPageLayout.AdditionalParentCount allows to specify the number of additional proxies that the algorithm tries to add to a subtree. The original nodes associated with these proxies lie on the path of the tree's root to the subtree placed on a page.
                • MultiPageLayout: Added property CreateProxyReferenceNodes that allows to disable the creation of proxy reference nodes as well as property MultipleComponentsOnSinglePage that allows to prevent that elements of different connected components are placed on the same page.
                • PortPlacementStage now additionally considers port grouping constraints. If two edges are port-grouped at a certain node, the stage assigns the same port location to the edges. Port groups are marked using DataProviders registered with PortConstraintKeys.SourcePortGroupIdDpKey and PortConstraintKeys.TargetPortGroupIdDpKey.
                • TreeComponentLayout: Added property ConsiderUndirectedTreesthat allows to specify whether or not undirected tree structures should be handled or not. Previously, only directed tree structures were considered.
                • DefaultNodePlacer and SimpleNodePlacer now both support to specify a minimum distance between the edge segments that are routed orthogonally in the channel between the root node and the child nodes, see method DefaultNodePlacer.MinimumChannelSegmentDistance and SimpleNodePlacer.MinimumChannelSegmentDistance respectively.
                • ClassicTreeLayout now allows you to specify a minimum vertical distance for the horizontal edge segments of the bus, see ClassicTreeLayout.MinimumBusSegmentDistance.
                • The new properties LayerConstraints and SequenceConstraints of HierarchicLayoutData can be used to configure layer and sequence constraints for the HierarchicLayout. These supersede the previous LayerConstraintFactory and SequenceConstraintFactory properties.
                • OrthogonalLayout: Reduced the number of bends of directed edges.
                • The EdgeRouter class now calculates a better routing for edges between group nodes and their descendants in the case that the routing is aborted via AbortHandler or when the maximum duration time limit is up. Previously, such edges might not have been handled in this case, whereas now they always get a simple but valid orthogonal route.
                • The HierarchicLayout class now respects the sequence and layering constraints between subcomponents. Previously, such constraints were ignored.
                • Added PlaceNodesAtBarycenterStageData which allows to conveniently define the affected nodes that should be affected by PlaceNodesAtBarycenterStage.
                • The HierarchicLayout now requires less memory for graphs with sequence constraints.
                • The HierarchicLayout no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges.

                Bugfixes

                Graph and View

                • Reduced memory consumption of DefaultEdgePathCropper.
                • Fixed a bug that sometimes detects a mouse move instead of a mouse drag.
                • The Mouse2DEventTypes.Entered event now provides the correct coordinates.
                • Fixed a bug that sometimes prevented dispatching the mouse up event.
                • Fixed an exception when an edge or label is pasted without selected target while its original owner is not in the current view.
                • PolylineEdgeStyle now takes arrow heads into account for visibility checks.
                • Removing an item that is currently highlighted with a custom HighlightIndicatorManager, FocusIndicatorManager, or SelectionIndicatorManager no longer results in a NullReferenceException.
                • The extension method OrientedRectangleExtensions.GetCenter didn't return the correct center if the width or height of the rectangle was equal to 0.
                • The HitTestRadius property of the following implementations of ICanvasContext now correctly contain the value in world coordinates instead of view coordinates:
                  • The context created by Contexts.CreateCanvasContext when passing a CanvasControl but no hit test radius.
                  • The context passed to IPositionHandlers by MoveInputMode.
                  • The context passed to adjacent handles when moving a bend handle.
                • The InteriorStretchLabelModel.GetMinimumNodeSize method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.
                • Sometimes, the GroupNodeDefaults.Labels.AutoAdjustPreferredSize property and the GroupNodeDefaults.Ports.AutoCleanup property were not considered for labels and ports of groups.
                • The ApplicationCommands.Copy command is no longer executed twice.
                • The methods GraphClipboard.Copy and GraphClipboard.Cut don't copy items anymore which depend on items that are selected but not included in GraphClipboard.CopyItems.
                • Snap lines which indicate the same size are no longer shown for implicitly re-sized parent group nodes.
                • The validation schema for GraphML has been fixed to work with more validators.
                • FreeEdgeLabelModel: Static property Instance is now excluded from obfuscation.
                • The graph of an IFoldingView now raises the NodeCreated, EdgeCreated, PortAdded, LabelAdded, and BendAdded events after the created element is registered. This fixes a bug where the master item of the created item was not available in handlers for these events.
                • Fixed wrong types of exceptions:
                  • GraphMLIOHandler: The methods OnQueryName and OnQueryType now throw an ArgumentNullException instead of a NullReferenceException when one of the arguments is null.
                  • Table: The methods SetLabelText, Remove, SetLabelPreferredSize and SetLabelLayoutParameter now throw an ArgumentException instead of an InvalidOperationException.
                • Undo units created by the execution of a layout algorithm are now correctly merged with undo units of the previously executed interactive gesture.
                • The default implementation of IPortSnapResultProvider never returned any snap results.
                • Corrected weird scrolling behavior of the scroll bar when the viewport was outside the content rectangle.
                • DefaultGraph now calls the OnRemovingEdge and OnRemovingPort methods before their incident items are removed.
                • The commands Copy, Cut, and Duplicate are no longer enabled if there are no elements to cut, copy, or duplicate.
                • The GroupingSupport.HasGroupNodes method now returns only true if there are actually group nodes in the graph. Previously, it returned also true if there once were group nodes which had been removed in the meantime.
                • BevelNodeStyleRenderer, PanelNodeStyleRenderer, ShadowNodeStyleDecorator and ShinyPlateNodeStyleRenderer now consider the shadow in their IsVisible and GetBounds methods.
                • Bridges: For edges which cross each other with the same absolute slope now a bridge is added on exactly one of these edges, depending on the crossing policy (was: either on both edges or none of them).
                • GraphModelManager: Fixed NullReferenceException that occured when any of the Descriptor properties were set while the GraphModelManager instance was not yet associated to an IGraph.
                • GenericLabelModel serialization: Fixed cyclic reference in GraphML which could happen while serializing a GenericLabelModel with a parameter with associated descriptor.
                • The methods GetBounds and IsVisible describing the RectangleIndicatorInstaller returned wrong values. This could impact the performance as e.g. some node selection highlights were updated although they were not in the view port and result in unnecessary large content rectangles.
                • Fixed IHitTestable implementation of DefaultPortCandidateDescriptor which used incorrect coordinates.
                • Fixed the Save command always opening a file dialog even if a file has been specified in a previous file operation.
                • PortRelocationHandleProvider now can handle null as "graph" constructor parameter.
                • The PreferredPlacementDescriptor.Equals method incorrectly reported instances with different angles and distances as equal.
                • SmartEdgeLabelModel centered all labels on an edge that overlapped with a segment of the edge or were placed directly next to it.
                • Fixed a possible NullReferenceException in class Animator, that might be caused when using MoveViewportInputMode with inertia.
                • Fixed viewport "jumping" during mouse wheel zoom in rare cases.
                • GraphBuilder: Two group nodes can now reverse their parent/child relationship between two calls to UpdateGraph without an exception.
                • CanvasControl: Fixed possible changes to Zoom when moving the viewport while a ViewportLimiter is active.

                Input

                • Fixed possible NullReferenceException when TextEditorInputMode was uninstalled directly after starting an edit.
                • ClickInputMode provided wrong click locations in the Clicked event if a Mouse2DEventTypes.Clicked event without preceding Mouse2DEventTypes.Pressed event was processed.
                • CreateEdgeInputMode and CreateBendInputMode now cancel on LostCaptureDuringDrag event.
                • CreateEdgeInputMode did not show port candidates after re-installation of the input mode.
                • Moving an edge label with SmartEdgeLabelModel that is owned by an edge without visible path no longer throws an exception.
                • ItemHoverInputMode now resets the hovered item when moving the mouse out of the control.
                • GraphEditorInputMode and GraphViewerInputMode no longer ignore changes to their sub-input modes after having been installed once.
                • Disabling MarqueeSelectionInputMode during the gesture via code left the marquee visible on the screen.
                • While relocating edges, dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.
                • The Clicked and DoubleClicked events of ClickInputMode were sometimes missing when clicking on a node or edge. Now, they are always triggered unless the event was handled before.
                • TextEditorInputMode: Inserting a line break now replaces selected text.
                • Node-to-edge snapping is now disabled by default which is the documented and intended value. For this, the initial value of the GraphSnapContext.NodeToEdgeDistance property is set to -1.0.
                • The LabelEditingEventArgs.Context.ParentInputMode property provided in the events GraphEditorInputMode.LabelAdding, GraphEditorInputMode.LabelEditing, TableEditorInputMode.LabelAdding and TableEditorInputMode.LabelEditing now contains the corresponding GraphEditorInputMode or TableEditorInputMode instance.
                • CreateEdgeInputMode: The ValidBeginCursor is now correctly hidden during edge creation when bend creation isn't allowed.
                • CreateEdgeInputMode didn't always update the highlight of possible source port candidates when its ShowPortCandidates property was configured to show the source port candidates.
                • Switching the input mode in an event handler of the current input mode no longer throws an exception.
                • ItemHoverInputMode updates the hovered item upon mouse drag events, too. This is the documented behavior. Previously, the hovered item was only updated on mouse move events.
                • ItemHoverInputMode removes the hovered item upon Cancel.
                • The ParentInputMode property of the InputModeEventArgs now is the input mode which has raised the event. Previously, some input modes erroneously set the ParentInputMode to the containing GraphEditorInputMode or GraphViewerInputMode.
                • GraphClipboard: The contents of a folder node was not copied if the folder was copied from within a group view, i.e. if the user entered a group node. In the worst case, this might have frozen the complete application.
                • MouseHoverInputMode.QueryToolTip was raised twice for every mouse hover event.

                Table

                • When a stripe is removed, ITable.LabelRemoved events for the implicitly removed associated labels are now raised, too.
                • When a selected stripe label is edited its TextBox now is correctly placed.
                • Selected stripe labels no longer remain selected after their owning stripe is deleted.
                • Selected stripe labels no longer cause exceptions when hovering over them.
                • The selection indicator for selected stripe labels is now shown correctly.

                Layout

                • OrthogonalLayout now considers edge grouping also if there are no directed edges specified.
                • In EdgeRouter, an error occurred when there were intermediate routing points and the path search got aborted (e.g. because of maximum duration time limit).
                • In ShortestPaths, an error occurred when the a-star algorithm was applied to a graph with non-monotonic heuristic costs.
                • In HierarchicLayout, an error was triggered when a yWorks.Algorithms.Util.DataProviderAdapter that does not override the DataProvider.get method was registered with key GivenLayersLayerer.LayerIdDpKey. This issue only appeared in conjunction with subcomponents.
                • The HierarchicLayout now produces less bends if the edges should be routed on a grid and the grid reference point is not (0,0), see NodeLayoutDescriptor.GridReference.
                • HierarchicLayout did sometimes not correctly consider the edge thickness for grouped edge segments. Even though there would have been space for a thick edge it was placed too close to other elements.
                • HierarchicLayout now produces more symmetric results for grouped edges if property SimplexNodePlacer.BarycenterMode is enabled.
                • Fixed a rare bug in OrthogonalLayout that may have caused infinite looping for grouped input graphs.
                • For some input graphs the OrganicLayout produced an error if the CycleSubstructureStyle property was set to CycleSubstructureStyle.Circular.
                • CircularLayout does now correctly consider the EdgeBundleDescriptor.Bundled property for edges between different partitions. Previously, when at least one of these edges had the Bundled property enabled, all of them were bundled, ignoring the property value of the other edges.
                • Fixed a bug in TreeMapLayout that may have caused NaN-coordinates or infinite looping for input graphs that are non-directed trees.
                • For grouped segments the GraphLayoutLineWrapper now produces more compact results.
                • In rare cases the GraphLayoutLineWrapper produced drawings with large empty space between lines.
                • HierarchicLayout: Fixed problem that sometimes caused an unnecessarily large distance between adjacent layers.
                • The MultiPageLayout now correctly considers the maximum page size for tree layouts.
                • TabularLayout no longer crashes when applying an instance of it to a single-node graph after that same instance was previously applied to a larger graph.
                • HierarchicLayout now correctly considers fixed nodes with layering constraints. In previous versions there were some rare cases where such inputs caused infinite looping issues.
                • GenericLabeling now always prefers LabelCandidates with higher profit values over others with lower profit (see LabelingBase.GetProfit). Previously, this sometimes happened even though both candidates did not intersect with other elements.
                • GenericLabeling 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.
                • The EdgeRouter now always considers the PortCandidates for edges grouped with fixed edges.
                • The EdgeRouter now keeps collinear bends of fixed edges.
                • The FamilyTreeLayout now correctly considers the preferred family member order.
                • OrthogonalLayout does no longer throw an exception for some input graphs when property SubtreeStyle is set to Compact and ChainStyle is set to a wrapped style.
                • OrthogonalLayout no longer throws exceptions if property CycleStyle is set to a specific style and the input graph only consists of a single cycle.
                • BusRouter does no longer produce non-deterministic results, i.e. different results for consecutive runs on the same input. Previously, this was possible in rare cases.
                • EdgeRouter does no longer crash when defining exactly two equal intermediate routing points for an edge.
                • An invalid license no longer leads to a NullReferenceException when calling IGraph.ApplyLayout.

                Incompatible Changes

                Incompatible API Changes

                • ReparentStripePositionHandler: All callback methods dealing with ghost objects have been renamed consistently:
                  • UpdateXyzVisualisation to UpdateXyzGhost.
                  • UpdateTargetVisualizationBounds to UpdateTargetGhostBounds.
                • The protected factory method MoveLabelInputMode.CreateLabelHitTestable has been removed. Developers who want to set a custom instance need to set it directly to the HitTestable property.
                • The CanvasControl.AnimateScrollTo method has been removed and is superseded by the new ZoomToAnimated methods.
                • The AnchoredPortLocationModelExtension class has been moved to the GraphML compatibility demo where it was really needed.
                • The GraphInputMode.CanvasClicked event now provides the GraphEditorInputMode or the GraphViewerInputMode as parent input mode in the Context property of its ClickEventArgs.
                • The ITable.RelativeLocation property has been removed. Use ITable.Insets with corresponding Left and Top values instead.
                • Renamed all occurrences of Cleanup to CleanUp in API names.
                • ItemClickedEventArgs now extends ClickEventArgs.
                • CreateEdgeInputMode's EdgeCreator might receive null as targetPortCandidate parameter. Callbacks must handle this case by either creating a target port of their own or canceling the edge creation by returning null.
                • The StripeSubregion.TargetTableNode property is now read-only.
                • Renamed the enumeration value ShowFocusPolicy.WhenFocused to OnlyWhenFocused.
                • Removed unnecessary Enabled parts from the following property names.
                  • EdgeSegmentLabelModel.AutoRotationEnabled is now AutoRotation.
                  • EdgePathLabelModel.AutoRotationEnabled is now AutoRotation.
                  • LabelLayoutTranslator.AutoFlippingEnabled is now AutoFlipping.
                  • SingleCycleLayout.FromSketchModeEnabled is now FromSketchMode.
                  • SliderEdgeLabelLayoutModel.AutoRotationEnabled is now AutoRotation.
                  • DiscreteEdgeLabelLayoutModel.AutoRotationEnabled is now AutoRotation.
                • Renamed the Animator.Destroy method to Stop.
                • The GraphEditorInputMode.CreateMoveUnselectedInputMode method has been removed. Use the property MoveUnselectedInputMode instead.
                • The CreateEdgeInputMode.ShowPortCandidates property has now the enum type ShowPortCandidates instead of boolean.
                • Removed the (undocumented) classes SelectionControl, HighlightControl, and FocusControl.
                • Removed SnapLine.SnapLineColorKey, which never worked correctly. Use SnapLine.SnapLinePenKey instead.
                • Removed properties for touch devices from MoveViewportInputMode.

                Changes of Default Behavior

                • The OverviewInputMode.AutoMouseWheelZoom property is superseded by the new MouseWheelBehavior property.
                • RectD.IsFinite and SizeD.IsFinite now also consider empty instances as not finite.
                • By default, stripe labels that are programmatically selected or highlighted don't show a selection or highlight indicator anymore.
                • Inertia scrolling of the viewport behaves now in a more natural way. The scrolling stops now after a fixed amount of time. Previously, the duration depended on the initial inertia velocity.
                • The IGraph.SetNodeLayout method and the various methods to create a node now throw an ArgumentException if the layout rectangle contains one or more NaN values. Similarly, the IGraph.SetBendLocation and the various methods to add a bend to an edge now throw an ArgumentException if the location point contains one or two NaN values.
                • GraphML: Duplicate properties on XAML input are now considered an error in accordance with the XAML specification.
                • The stroke thickness is now considered for the calculation of the origin of the default arrow visualizations. This can result in a slightly different rendering of the arrows.
                • The CreateEdgeInputMode.DummyEdge property is now always reset after the edge creation was finished or canceled.
                • MoveLabelInputMode: The moved label now is visualized as a preview instead of a symbolic rectangle. Set the Visualization property to Visualization.Ghost to restore the old mode.
                • The LayoutExecutor.UpdateContentRect property is now enabled by default.
                • CreateEdgeInputMode, determination whether the mouse hovers over a valid end: if ForceSnapToCandidate is disabled, the EndHitTestable now is queried first and a target port candidate is only searched if the hit testable returns true. Previously, the hit testable was only queried if no target port candidate was found at the current location.
                • Previously, even if the GraphModelManager.UseHierarchicEdgeNesting property was set to true, canvas objects for edges were added to the GraphModelManager.EdgeGroup as long as no group nodes were part of the graph. The corresponding new HierarchicNestingPolicy NodesAndEdges has no such behavior and thus, EdgeGroup is empty by default. Use one of the other polices if canvas objects for edges should be part of EdgeGroup.
                • PolylineEdgeStyle defaults to an improved smoothing algorithm when using the SmoothingLength property. This is especially apparent when using large values for SmoothingLength.
                • The mouse button which is reported in Mouse2DEventArgs now is more synchronized with the real mouse button state. The old behavior can be restored using the new property HandleMissingMouseEvents on CanvasControl.
                • TextEditorInputMode.Editing is now false when UninstallTextBox is called.
                • TextEditorInputMode.InstallTextBox() is now called after AdjustPosition and AdjustSize, so the TextBox is not yet available as a child control of the Canvas in those methods.

                Minor Incompatible Changes

                • The method CollapsibleNodeStyleDecorator.CreateSelectionInstaller has been removed.

                Types and Members Marked as Obsolete

                • The properties LayerConstraintFactory and SequenceConstraintFactory of HierarchicLayoutData have been marked as obsolete. The new properties LayerConstraints and SequenceConstraints should be used instead. Similarly, the extension methods HierarchicLayout.CreateLayerConstraintFactory(IGraph) and HierarchicLayout.CreateSequenceConstraintFactory(IGraph) have been marked as Obsolete.

                Most Notable Demo Improvements

                • The new RotatableNode demo shows how support for rotated node visualizations can be implemented on top of the yFiles library.
                • The new RenderPolicies demo shows the effect of different render policies on the z-order of nodes, edges, labels and ports. This demo replaces the Integrated Node Style demo.
                • Demonstrated highlighting elements as hover effects in the Viewer demo.
                • GraphMLCompatibility demo: Added missing implementation of AnchoredParameter.
                • BpmnDemo: Fixed clone implementations of some styles.
                • yEd.NET: Fixed a bug that prevents using triangle arrows for edges.

                yFiles.NET 5.0.0.2

                Bugfixes

                • Fixed an exception in DropInputMode which occurred if a drag enter was recognized while another drag action was still running.
                • Removing an item that is currently highlighted with a custom HighlightIndicatorManager, FocusIndicatorManager, or SelectionIndicatorManager no longer results in a NullReferenceException.
                • Moving an edge label with SmartEdgeLabelModel that is owned by an edge without visible path no longer throws an exception.
                • GraphEditorInputMode and GraphViewerInputMode no longer ignore changes to their sub-input modes after having been installed once.
                • CreateEdgeInputMode no longer fires gesture cancel events if it has not been started before.
                • Fixed a bug in CreateEdgeInputMode which caused port candidates not to be shown after re-installation of the input mode.
                • The extension method OrientedRectangleExtensions.GetCenter didn't return the correct center if the width or height of the rectangle was equal to 0.
                • StripeDropInputMode no longer calls ItemCreator twice.
                • The StripeDropInputMode.ItemCreated event now is properly raised.
                • The InteriorStretchLabelModel.GetMinimumNodeSize method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.
                • MoveViewportInputMode: The Dragging, Dragged, DragCanceling, DragCanceled, DragFinishing and DragFinished events did not fire reliably for touch input and when mouse inertia was active.
                • TextEditorInputMode: inserting a line break now replaces selected text.
                • The HitTestRadius property of the following implementations of ICanvasContext now correctly contain the value in world coordinates instead of view coordinates:
                  • The context created by Contexts.CreateCanvasContext when passing a CanvasControl but no hit test radius.
                  • The context passed to DisposeVisualCallback.
                  • The context passed to IPositionHandlers by MoveInputMode.
                  • The context passed to adjacent handles when moving a bend handle.
                • Fixed an issue where bridges would erroneously appear when using EdgeStyleDecorationInstaller to use an edge style for highlight or selection.
                • RectangleVisual no longer truncates the rectangle coordinates to integers when drawing a rectangle with an outline.
                • Fixed validation for signing licenses which could fail with certain public keys.
                • Fixed an error message that could appear erroneously at build time when using a signing license.
                • Fixed a NullReferenceException when calling IGraph.ApplyLayout when the license is invalid.
                • Sometimes, the GroupNodeDefaults.Labels.AutoAdjustPreferredSize property and the GroupNodeDefaults.Ports.AutoCleanup property were not considered for labels and ports of groups.
                • Relocation of edges: dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.
                • The ApplicationCommands.Copy command is no longer executed twice.
                • The validation schema for GraphML has been fixed to work with more validators.
                • FreeEdgeLabelModel: static property Instance is now excluded from obfuscation.
                • AdjacentNodesGraphBuilder and TreeBuilder no longer remove unchanged nodes unnecessarily when those have been created lazily.

                Layout

                • Corrected an error in the Rectangle2D.Contains(Rectangle2D) method. As a consequence of this error, the results of various algorithms and automatic layouts could have been wrong.
                • Fixed some InvalidCastExceptions that might occur when using port candidates.
                • HierarchicLayout: Fixed ArgumentException that could be triggered when the user specified both edge directedness (see HierarchicLayout.EdgeDirectednessDpKey) and layering constraints.
                • HierarchicLayout with partition grid: Fixed bug that in some cases caused an ArgumentException when the layout algorithm was configured to stop after the layering or sequencing phase (see HierarchicLayout.StopAfterLayering and HierarchicLayout.StopAfterSequencing).
                • HierarchicLayout: Fixed bug that caused unnecessarily large layer distances in case that there exist empty partition grid rows with a minimum row height.
                • HierarchicLayout and SimplexNodePlacer: Fixed rare ArgumentException that could be triggered when the input graph had a partition grid and PortCandidates or PortConstraints.
                • TreeLayout: Fixed bug in the integrated edge labeling feature that caused that multiple edge labels were not always ordered correctly along the edge with respect to their preferred placement setting (i.e., place at source, center or target preference). For example, a source label should always come before a target label in the direction of the actual edge flow.
                • OrthogonalLayout: Fixed rare bug that caused node-edge overlaps.
                • SeriesParallelLayout: Fixed bug that caused misplaced edge labels for graphs containing only a single edge.
                • PortPlacementStage: Fixed bug that caused NullReferenceException when the ports of edges in the input graph were outside the node bounds.
                • LayeredNodePlacer: Fixed bug that caused node-edge overlaps for some configurations.
                • MultiPageLayout: Fixed bug that proxy edges were never routed as such.
                • Polyline.EdgeRouter: Fixed Exception that could be triggered when the graph contained fixed edges (see EdgeRouter.SphereOfAction) with very short segments.
                • BusRouter: Fixed rare NullReferenceException that could be triggered if there are buses with both fixed and movable edges at the same time.

                Improvements

                • GraphBuilder no longer requires an edge source, allowing graphs to be built consisting only of nodes.
                • If the GroupsSource property is not set (is null), GraphBuilder no longer removes existing groups during BuildGraph and UpdateGraph. The same applies to the related classes TreeBuilder and AdjacentNodesGraphBuilder.

                Layout

                • HierarchicLayout: Improved adherence to the specified maximum duration by applying a suitable runtime restriction to class PortCandidateOptimizer. Previously, this class didn't have any runtime restrictions.

                yFiles.NET 5.0.0.1

                Bugfixes

                • Fixed several problems with relative resource URIs for UriImageNodeStyle and UriIconNodeStyle when reading and writing GraphML.

                yFiles.NET 5.0

                ο»Ώ

                Major Features Added

                General

                • The complete yFiles.NET API has been overhauled, simplified, and made more consistent. Many strange and dark corners of the API have been cleaned up. Types have more logical and intuitive names. The namespace structure is more logical and intuitive as well.
                • The Developer's Guide has been completely revised. It now consists of two major parts: The first part covers the basics of yFiles.NET, while the second part describes in detail how the behavior of the library can be adapted to the customer's requirements.
                • API documentation and Developer's Guide are now integrated into our Documentation Viewer that provides useful search and filtering facilities.

                Viewer

                • Support for building graphs based on user data offered by new classes GraphBuilder, TreeBuilder, and AdjacentNodesGraphBuilder.
                • High DPI support: A new Scale property allows for adapting zoom independent sizes in rendering (e.g. drawings for resize handles) as well as in user interaction (hit test radius or double click size) to higher screen resolutions and thus smaller pixels. An extension method automatically chooses an appropriate scaling in high DPI aware applications. Furthermore, the default font now is resolution independent.
                • Running animations and performing layouts now offers .NET's Task-based mechanism for asynchronous processes. This leads to easier composition of asynchronous processes using C#'s await keyword where code is written close to how synchronous code would look like instead of chaining callbacks. This also simplifies exception handling which works as usual via try-catch instead of callbacks.

                Layout

                • Performance for many layout algorithms has been improved.
                • There now is a new way to configure yFiles automatic layout algorithms. The LayoutData class and its sub-classes can be used to pass configuration data to a layout algorithm by setting properties instead of registering DataProviders on the graph which have to be filled with this data. This reduces the code needed to configure a layout and is more flexible as well as reusable. As most subclasses of LayoutData are specialized for one layout algorithm, their properties provide a good overview which data can be passed to the algorithm.
                • Added new layout algorithm SeriesParallelLayout for graphs that are constructed only by series (combining two series parallel graphs by merging the source of one graph with the sink of the other) and parallel (combining two series parallel graphs by merging the sources and the sinks) operations.
                • Added edge bundling feature. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes. The following layout algorithms support edge bundling:
                  • CircularLayout: Edge bundling is applied to edges of the same partition.
                  • TreeReductionStage: Edge bundling is applied to non-tree edges.
                  • RadialLayout: Edge bundling is applied to non-tree edges.
                • Added support for Sankey diagrams which visualize flow quantity between entities like e.g., cost or energy flow.
                • OrganicLayout now supports the detection of regular substructures in the graph (see OrganicLayout.ChainSubstructureStyle, OrganicLayout.StarSubstructureStyle, OrganicLayout.CycleSubstructureStyle, and OrganicLayout.ParallelSubstructureStyle) and applies a specific layout style to them such that they can be better recognized.

                Deployment

                  The Software License Agreement now provides an alternative to the requirement of obfuscating the redistributable DLLs: delivering the redistributables as part of software applications is now allowed if the redistributable DLLs are obfuscated or if the assemblies of the application which reference yFiles are signed with a strong name whose public key token is bound to the license. See distribution.html for details.

                Minor Features Added

                Layout

                • Added multi-parent support to TreeLayout. A tree node can have multiple parents that are connected to all of its siblings and share the same parents. This might come to use in organizational charts where a team answers to multiple superiors.
                • Added grid placement support for nodes and edges to HierarchicLayout.
                • RecursiveGroupLayout: Added the InterEdgeRouter property to specify an edge router to layout edges that cross group node bounds. Thus, it is not necessary to subclass the layout algorithm to change inter-edge routing anymore.
                • HierarchicLayout supports recursively routed edges. Edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node. This routing style is specified using EdgeLayoutDescriptor.RecursiveEdgeStyle.
                • HierarchicLayout: Improved from-sketch behavior for groups with changed bounds (e.g. after folding or expanding a group node).
                • HierarchicLayout: Added support for port grouping, see PortConstraintKeys.SourcePortGroupIdDpKey and PortConstraintKeys.TargetPortGroupIdDpKey. Edges are bundled at their ports, but routed independently.
                • HierarchicLayout now allows to specify the directedness of edges, see HierarchicLayout.EdgeDirectednessDpKey. This new feature enables to, for example, support mixed graphs that contain both directed and undirected edges: While for directed edges the layering step tries to find a solution where the source of an edge is placed above the target (with respect to the main layout direction), for undirected edges the direction doesn't matter and the edge may also be inserted as same-layer edge. This feature also enables to force some edges to specifically point against the main layout direction.
                • HierarchicLayout: Added support for edges with a specific thickness. Minimum distances in the layout will consider these thicknesses, see HierarchicLayout.EdgeThicknessDpKey.

                Incompatible Changes

                General

                • The rendering mechanism has been overhauled: Most rendering code that previously used the IPaintable interface now uses the new IVisualCreator interface instead for improved rendering performance. Please see the migration guide for details on the resulting incompatibilities.
                • The minimum required framework version for the viewer part and the layout adapter is now .NET Framework 4.0. The minimum required framework version for the algorithms part still is .NET Framework 3.5
                • The return type of several methods has been changed from IEnumerator<T> to IEnumerable<T>.
                • Many usages of ref or out parameters have been replaced with a suitable structure as return type. The most prominent example of this change are the various GetTangent methods in IPathGeometry and GeneralPath that now return a Tangent.
                • All methods that take a parameter of type ICanvasContext, IRenderContext, IInputModeContext, IParseContext, IWriteContext, SnapContext, GraphSnapContext, or LabelSnapContext now have that parameter as their first parameter.
                • With the new web-based Documentation Viewer, the integrated help for the Visual Studio Help Viewer has been discontinued.
                Namespace Structure
                • Classes of the viewer part have been reorganized into a simpler namespace structure.
                  • yWorks.Graph contains types related to the graph structure, including label models and port location models.
                  • yWorks.Controls contains types related to the GraphControl and CanvasControl, and to the visualization in general.
                  • yWorks.Graph.Styles contains the style implementations.
                  • yWorks.Controls.Input contains the types related to input modes.
                • Geometry types remain in yWorks.Geometry.
                • Layout and analysis types are in yWorks.Layout, yWorks.Algorithms, and the namespaces that correspond to a specific layout style.
                Factory Methods Instead of Default Implementations
                • Contexts: Factory methods replace the removed classes CanvasContext and SimpleInputModeContext.
                • Lookups: Factory methods replace the removed properties HidingLookupChainLink, FactoryLookupChainLink and AddingLookupChainLink.
                • Animations: Factory methods replace the removed classes EasedAnimation, ParallelAnimation, GeneralPathAnimation, LayoutMorpher, LayoutMorpherWrapper, EdgeAnimation, LabelAnimation, NodeAnimation, and PortAnimation.
                • PortCandidateProviders: Factory methods replace all existing non-abstract implementations. PortCandidateProviderBase remains for an easier start for own implementations.
                • EdgeReconnectionPortCandidateProviders: Factory methods replace all existing implementations.
                • Commands: Factory method CreateCommand replaces all existing implementations of ICommand.

                Model

                IGraph
                • Support for grouped graphs has been simplified to a large extent:
                  • IGraph now supports grouping by default. The GroupingSupported property has been removed from DefaultGraph. Grouping is now always enabled for graphs.
                  • The new property AllowGroupingOperations on GraphEditorInputMode allows for switching interactive grouping operations on or off. Grouping operations are disabled by default and have to be enabled explicitly if the input mode should support them.
                  • The grouping support interfaces IGroupedGraph and IHierarchy<T> have been removed and folded with IGraph.
                  • IHierarchy<T>'s Root property is no longer available. The root of a grouping hierarchy is now represented by null.
                • Overhaul of IGraph's CreateNode, CreateEdge, AddLabel, AddPort: Ambiguous overloads have been removed, missing overloads have been added and parametershave been ordered to be consistent throughout all overloads.
                • IGraph's Nodes, Edges, Labels, and Ports properties have been changed from ICollectionModel to IListEnumerable. To be notified of created or removed items, the corresponding IGraph events should be used instead.
                • The properties NodeLabels and EdgeLabels on IGraph have been replaced by the extension methods GetNodeLabels and GetEdgeLabels.
                • The properties CollectionModel and Bends have been removed. Bends has been replaced by the GetBends extension method.
                • The classes BendList and ListLabelCollection have been removed. Use ListEnumerable instead.
                • IGraph now provides events for property changes on model items, e.g. NodeStyleChanged, NodeLayoutChanged, etc. Those events replace the dedicated change reporters available previously (e.g. INodeBoundsChangeReporter, ILabelTextChangeReporter, etc.), which have been removed.
                • The signatures of event handlers throughout the IGraph API have been made consistent using properly typed EventArgs subtypes. Exceptions are a few events that are raised very often which retain an argument list to improve performance.
                • The methods IsLeaf/SetLeaf and related properties and events have been replaced by IsGroupNode/SetIsGroupNode which have the exact opposite meaning from the old ones.
                • The signature of IGraph.AddBend has changed. The index parameter has been moved to the end and made optional.
                • The IGraphStructure interface and its SimpleGraphStructure implementation have been removed, as well as DefaultGraph's constructor that accepted an IGraphStructure.
                • IGraph now extends the ITagOwner interface. Thus graphs now have a Tag property.
                DefaultGraph
                • DefaultGraph now raises removal events for labels, ports, and bends which are implicitly removed when their owner is removed.
                • Various protected factory methods on DefaultGraph have been removed: CreateNodeDefaults, CreateEdgeDefaults and CreateMapperRegistry, amongst others.
                • The method GetBounds has been removed from DefaultGraph.
                • The property UsePortCandidateProviders has been removed from both DefaultGraph and GraphSettings. Creating an edge using port candidate providers has to be done by manually querying the provider and calling CreateEdge(IPort, IPort).
                Folding
                • The method IsInitiallyExpanded has been removed from IFoldedGraph. The methods IsInitiallyExpanded, SetInitiallyExpanded, and the property DefaultExpandedPredicate have been removed from FoldingManager.
                • The Expand, Collapse, and IsExpanded methods on IFoldingView (previously IFoldedGraph) now also work with nodes that belong to the master graph instead of the view graph. Thus the collapsed/expanded state can be set or queried for items that are currently not in the view graph. This replaces part of the removed functionality mentioned above.
                • The interfaces IChangeDummyNodeAppearanceCallback, IChangeDummyEdgeAppearanceCallback, and IChangeLabeledItemAppearanceCallback as well as the FoldingManager.GetChangeDummyAppearanceCallback methods have been removed. The view state properties can now directly be changed on the view state implementations returned by FoldingManager.GetFolderNodeState and FoldingManager.GetFoldingEdgeState, respectively.
                • IFoldingView.IsInFoldingState (previously IFoldedGraph.IsDummy) now throws an ArgumentException for labels and ports that are not part of this view. Previously, this method returned true for such items. Since this exception is already thrown for nodes, edges, and bends that are not part of this view, the behavior is now the same for all types of graph items.
                Labels
                • The order of the parameters of ILabelModel.GetGeometry has been changed to ILabelModel.GetGeometry(ILabel, ILabelModelParameter).
                • FreeNodeLabelModel.CreateNodeCenterAnchored and FreeNodeLabelModel.CreateNodeLayoutAnchored have been removed.
                • FreeNodeLabelModel.CreateDefaultParameter now uses the label's center as its anchor point.
                • The new edge label models EdgeSegmentLabelModel and EdgePathLabelModel have been added. EdgeSegmentLabelModel allows to create parameters for a segment index and segment ratio while EdgePathLabelModel creates parameters using a ratio of the edge path.
                  • The new label models replace the following removed label models: RotatingEdgeLabelModel, SliderEdgeLabelModel, SideSliderEdgeLabelModel, RotatedSliderEdgeLabelModel, and RotatedSideSliderEdgeLabelModel.
                  • The label layout parameter of the edge label defaults now uses the EdgeSegmentLabelModel.
                Ports
                • The property IPort.Location (to obtain a snapshot of the port's location) has been replaced by the extension method GetLocation. To retrieve a live view of the location of a port, use the new extension method IPort.DynamicLocation.
                • NodeScaledPortLocationModel has been replaced by FreeNodePortLocationModel that allows to specify the port location by a ratio of the node layout's size and an additional offset. The placement options and API are very similar to FreeNodeLabelModel.
                • AnchoredPortLocationModel has been removed.
                Table
                • ITable interface:
                  • The signature of CreateRow and CreateColumn has changed. The index parameter has been moved to the end and made optional.
                  • The events StripeChanged and StripeRemoved use StripeEventArgs now. The corresponding event raiser methods have been changed accordingly.
                  • The event LabelRemoved uses LabelEventArgs now.
                  • New extension methods have been added: FindColumn, FindRow, GetCellBounds.
                • Table class:
                  • The table's lookup decorator can now decorate stripe labels, too.
                  • The following methods have been removed: CreateDefaultColumnStyle, CreateDefaultColumnInsets, CreateDefaultColumnLabelStyle, CreatedDefaultColumnLabelModelParameter, CreateColumnLabelDefaults, CreateDefaultRowStyle, CreateDefaultRowInsets, CreateDefaultRowLabelStyle, CreatedDefaultRowLabelModelParameter, CreateRowLabelDefaults, RemoveUndoSupport, some overloads of CreateRow/CreateColumn, some overloads of AddLabel
                  • The properties DefaultStripeLookup, DefaultColumnLookup and DefaultRowLookup have been added, which replace the removed classes with the same same.
                • TableExtensions: The GetElementsToMove method has been removed
                • The IStripeSelection.SelectedStripes property has been removed. Use the individual properties for SelectedRows and SelectedColumns instead
                • StripeSelection: The superfluous overloads of IsSelected and SetSelected taking an IRow or IColumn have been removed.
                • The static helper method PlaceNodeInCell has been added to ITable to easily move a node into a specific table cell.
                Undo Support
                • Extension methods to enable/disable Undo have been added to IGraph.
                • Setting the Tag property on model items and the graph now works with Undo.
                • Undo operations for the removal of graph elements now keep the proper item order. This improves the consistency especially for layouts between undo operations.
                • Overloads of the IGraph.BeginEdit extension method that work with IMementoSupport (either via ILookup or an IMementoSupportProvider) have been added.
                • The overload of the IGraph.BeginEdit extension method that accepted an IEnumerable of IModelItems has been removed.
                • IUndoSupport, MementoUndoUnit, MementoUndoableEdit, and MementoStateStruct have been removed.
                • IUndoUnit: The methods CanUndo and CanRedo have been removed.
                • The methods UndoImpl and RedoImpl on UndoUnitBase have been removed. Implementations should use Undo and Redo from the IUndoUnit interface instead.
                • The properties UndoText and RedoText on UndoEngine have been removed.
                • The interface IGraphUndoUnitSupport has been removed. Its methods Create...UndoUnit have been moved to DefaultGraph. Developers who have created a custom implementation have to derive from DefaultGraph and override the corresponding method(s).
                Geometry
                The yWorks.Geometry namespace has been simplified and cleaned up.
                • The basic geometry types PointD, SizeD, RectD and InsetsD have been made immutable.
                • The classes ImmutablePoint, ImmutableSize, ImmutableRectangle and ImmutableOrientedRectangle have been removed. The immutable types PointD, SizeD and RectD as well as the immutable instance provided by the new static method OrientedRectangle.CreateImmutable can be used instead.
                • The interfaces IPointSetter and ISizeSetter have been removed. Instead the interfaces IMutablePoint and IMutableSize are used.
                • The IReshapeable interface has been removed. The various overloads of the Reshape method have been implemented as extension methods on IMutableRectangle instead.
                • IMovable has been removed as well. Instead an IPositionHandler can be used.
                • PointD.FromPoint, SizeD.FromSize and RectD.FromRectangle have been removed and replaced by the extension methods IPoint.ToPoint, ISize.ToSize, and IRectangle.ToRect.
                • Various other geometry-related infrequently-used or duplicate classes and interfaces have been removed.
                • The static fields SizeD.Unbound, SizeD.Empty and SizeD.Zero have been added.

                Controls

                • The ContentRect will now also be updated when creating edges, adding, editing or moving labels or deleting graph items.
                • The Cut, Copy and Paste commands are no longer handled by GraphControl and the respective methods have been removed as well. Command bindings for Copy are still supplied by GraphViewerInputMode and GraphEditorInputMode. Command bindings for Cut and Paste are still supplied by GraphEditorInputMode.
                • The Undo and Redo commands are no longer handled by GraphControl and the respective methods have been removed as well. Command bindings for Undo and Redo are still supplied by GraphEditorInputMode. Furthermore, the respective methods can still be called on the UndoEngine directly.
                • The UndoabilityEnabled property has been removed. Undo and Redo command bindings can be enabled on GraphEditorInputMode.
                • The ClipboardEnabled property has been removed. Clipboard command bindings can be enabled on GraphViewerInputMode and GraphEditorInputMode.
                • The GetUndoEngine method has been removed. The current UndoEngine can be retrieved from the graph instead.
                • The SelectionChanged event has been removed.
                • The new property LastEventLocation always contains the location of the last mouse or touch event.
                • The MouseWheelBehavior property replaces the previous property AutoMouseWheelZoomEnabled and not only allows disabling mouse wheel zoom, but also enabling scrolling with the mouse wheel.
                • The methods Add, AddCreator, AddGroup and AddGroupToGroup have been removed as the new methods AddChild and AddGroup of ICanvasObjectGroup provide a more intuitive way to add child elements to e.g. the GraphControl.GetBackgroundGroup.
                • The InputModes property has been removed. Developers who want to install multiple input modes on a CanvasControl have to set a MultiplexingInputMode as CanvasControl.InputMode and add their input modes to that mode.
                • The CollectCanvasObjects method has been removed.

                Visualization

                Styles
                • Renamed SimpleAbstractNode/Edge/Port/LabelStyle to Node/Edge/Port/LabelStyleBase.
                • Removed SimplePortStyle. Instead, use NodeStylePortStyleAdapter with ShapeNodeStyle.
                • Renamed SimpleLabelStyle to DefaultLabelStyle.
                • Added the interface IStripeStyle for styles of IColumns and IRows. With NodeStyleStripeStyleAdapter, you can still use node styles as styles for columns and rows.
                • The style and style renderer hierarchies have been flattened:
                  • Removed all sub-interfaces of INodeStyle, IEdgeStyle, ILabelStyle, and IPortStyle.
                  • Removed classes AbstractEdgeStyle, AbstractStyleRenderer, AbstractNodeStyleRenderer, AbstractEdgeStyleRenderer, AbstractLabelStyleRenderer, AbstractShapedNodeStyleRenderer, AbstractShapedLabelStyleRenderer, VoidVisualStyle, and VoidStyleRenderer.
                  • Merged types AbstractTableNodeStyle and DynamicTableNodeStyle into TableNodeStyle.
                • Removed superfluous interfaces IUserTagProvider and ITableProvider, and all implementations.
                • Removed superfluous constructors from all style implementations.
                • All IStyleRenderer implementations: The accessibility of the Style, Layout, and Item properties has been reduced to protected. In addition, the latter has been renamed to Node, Label, Edge, or Port respectively.
                • Various changes to IModelItemInstaller and related interfaces and classes. Styles no longer implement IModelItemInstaller, simplifying certain custom style implementations.
                Animations
                • Animator.AnimateAndWait has been removed.
                • The original overloads of Animator.Animate that accept a callback for finishing the animation have been removed. Instead the new Task-based overloads can be used.
                Various Visualization Changes
                • Replaced IPaintable with IVisualCreator for improved rendering performance. IPaintable's Paint method now has to be implemented on the IVisual returned by IVisualCreator's CreateVisual and UpdateVisual methods.
                • The protected factory methods that supplied the initial value for GraphModelManager's Installer properties (EdgeStyleInstaller, NodeStyleInstaller, etc.) have been removed.
                • GraphModelManager.Invalidate has been removed.
                • The IRenderContext.Canvas method has been pulled up to ICanvasContext and renamed to CanvasControl.
                • IRenderContext: The Transform property has been removed.
                • The RenderContext class has been removed. Use CanvasControl.CreateRenderContext instead to retrieve an instance of IRenderContext.
                • DefaultEdgePathCropper now uses the new method HandleEmptyPath if cropping the edge would result in an empty path. By default this method crops at the ports instead which results in edges between a group node and one of its children being no longer hidden.
                • DefaultEdgeIntersectionCalculator: A callback method GetNodeGeometry has been added.
                • The CanvasObjectGroupProviderCallback property on ModelManager has been replaced with the GetCanvasObjectGroup method. The CanvasObjectGroupProviderCallback property on ItemModelManager has been replaced with the CanvasObjectGroup property and the GetCanvasObjectGroup method; the default implementation just defers to the property, just like GetDescriptor.
                • IGroupAction as well as ICanvasObjectGroup.GetGroupAction have been removed as they had hardly any use.
                • The interface ICanvasGroupProvider and the delegate CanvasObjectGroupProviderCallback have been removed. Accessing the individual CanvasObjectGroups can be done via the properties of CanvasControl instead.
                • ICanvasObjectTreeEventSource and the corresponding classes CanvasObjectAddEventArgs, CanvasObjectRemoveEventArgs, CanvasObjectMoveEventArgs, and CanvasObjectInvalidateEventArgs have been removed.

                Input

                General Input Mode Refactorings
                • The type hierarchy for input modes has been simplified considerably:
                  • All input modes except OverviewInputMode, GraphViewerInputMode, and GraphEditorInputMode now directly implement IInputMode without any abstract base classes in between.
                  • IConcurrentInputMode has been removed and merged with IInputMode.
                    • The Enabled property on the IInputMode interface has been removed. It is still present on all concrete implementations.
                    • The ConcurrencyController property has been removed. Instead, a parameter of type ConcurrencyController has been added to the IInputMode.Install method.
                  • All abstract input mode base classes except AbstractInputMode (which has been renamed to InputModeBase) have been removed. AbstractConcurrentInputMode has been merged into InputModeBase.
                • Input mutex handling has been refactored considerably:
                  • IInputMode's ConcurrencyController property has been removed. Input modes now get a ConcurrencyController as parameter of their Install method.
                  • The ConcurrencyController has been refactored and is now only responsible for a single input mode. Its Active property indicates if the input mode currently has or may request the mutex.
                  • The InputMutex class has been removed.
                  • The PreferredCursor property has been moved from IInputMode to ConcurrencyController.
                  • The input mutex should be requested and released using the according methods on ConcurrencyController. Most input modes don't provide the methods HasMutex, CanRequestMutex, RequestMutex and ReleaseMutex anymore.
                  • The Enabled property of IInputModes is not set to false anymore if another input mode acquires the mutex. Instead their ConcurrencyController is deactivated. This provides a clear separation between suppressing input modes (while another mode holds the mutex) and explicitly disabling a mode from user code (via the Enabled property).
                  • As a consequence most input modes don't provide the EnabledChanged event and the OnEnabled and OnDisabled methods anymore, but OnConcurrencyControllerActivated and OnConcurrencyControllerDeactivated instead.
                • IInputMode has a new property Priority which defines the installation priority of the input mode. Previously those have been available as properties on GraphViewerInputMode, GraphEditorInputMode, and TableEditorInputMode. Those have been removed.
                • IInputMode's Stop method has been renamed to TryStop to make it more obvious that an implementation might return false to indicate that it did not actually stop.
                • All input modes no longer raise Stopped and Canceled events. Developers who want to get notified when an input mode gets stopped or canceled have to override the OnStopped or OnCanceled methods. Also, the events Initializing and Initialized no longer exist. Input modes that need to perform one-time initialization on first Install can keep track of that themselves.
                • MultiplexingInputMode: The AddConcurrent methods as well as the Add method which takes an additional priority parameter have been removed. There is only one Add method left, which takes an input mode as its only parameter. Priority is determined by the input mode's Priority property. Whether an input mode runs exclusive or always active alongside other input modes is determined by the input mode's ConcurrencyController which has an Exclusive property controlling that. This property is also available for all default IInputMode implementations.
                • MultiplexingInputMode is now aware of changes to the priority of already installed input modes and will update the installation order accordingly when an input mode's priority is changed.
                • IInputModes in general:
                  • The setter for Graph and GraphSelection properties, if present, and its associated Set* methods have been removed. Both are now always retrieved from the input mode context dynamically.
                  • The read-only property InputModeContext has been introduced to expose the IInputModeContext the mode is installed in.
                  • Many input modes now no longer have protected methods for state machine transitions. Instead those methods are mostly parameterless now.
                GraphEditorInputMode and GraphViewerInputMode
                • GraphViewerInputMode and GraphEditorInputMode have been made more similar regarding customization in the capabilities they both provide:
                  • GraphViewerInputMode now supports the same click and selection behavior as GraphEditorInputMode. This includes detail selection (Shift+Click) and cyclic selection (Alt+Click) as well as finer control over behavior like the ClickSelectableItems property and the ShouldClickSelect method.
                  • The methods Click and DoubleClick now take an IModelItem and ClickEventArgs as arguments and have no return value. Instead of returning a boolean, the Handled property on the ClickEventArgs should be set.
                  • Their ClickInputMode instances is now configured to raise events for both left and right clicks.
                  • The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.
                  • An explicit hit-test order for double clicks is provided that can be changed through the DoubleClickHitTestOrder property. By default, this hit-test order prefers labels over other graph elements.
                  • GraphViewerInputMode now also has the AvailableCommands property, already known from GraphEditorInputMode or NavigationInputMode.
                  • Several child input mode priorities in GraphViewerInputMode have been changed and most of them now have the same priorities as in GraphEditorInputMode.
                  • The new CanvasClicked event reports clicks on an empty canvas location.
                  • The new SelectablePredicate property allows finer control over what particular items should be selectable without the need to create a custom subclass.
                  • The new CreateSelectionEventArgs method creates SelectionEventArgs using the GraphSelection.
                  • The events MultiSelectionStarted and MultiSelectionFinished now use SelectionEventArgs<IModelItem>.
                  • GraphViewerInputMode now has improved support for marquee selection. Marquee selection is no longer turned on or off via MarqueeSelectableItems but instead directly on the MarqueeSelectionInputMode. The recognizer for marquee selection is Shift+Drag and the child input mode priorities have been adjusted accordingly so that marquee selection and viewport movement can co-exist. The child input mode still defaults to being disabled, though.
                  • GraphViewerInputMode now also has a KeyboardInputMode.
                  • GraphViewerInputMode now allows copying items (including the convenience method) and handles the command appropriately.
                • Improved functionality of GraphEditorInputMode
                  • Changing the ShowHandleItems property will now immediately update the currently visible handles.
                  • The new DeletablePredicate property allows finer control over what particular items should be deletable without the need to create a custom subclass.
                  • The new LabelAdding and LabelEditing events have been added. Those allow fine-grained control over adding or editing labels and tie into the existing functionality provided by IEditLabelHelper.
                  • TextEditorInputMode now ensures that the TextBox is visible in the viewport when starting editing. This behavior can be adjusted by creating a custom subclass and overriding the EnsureVisible method.
                • Cleanup of the old GraphEditorInputMode API
                  • The type of the OrthogonalBendRemoval property has been changed from bool to OrthogonalEdgeEditingPolicy.
                  • The DeletingSelection and DeletedSelection events now use SelectionEventArgs<IModelItem>.
                  • The constructor that take additional IGraph and IGraphSelection arguments have been removed, as well as the protected methods SetGraph, SetGraphControl, OnGraphChanged and the protected setter for the GraphSelection property. Instead, the IGraph instance is now always taken from the InputModeContext and cannot be changed after the mode is installed.
                  • The CreateDefaultLabelConfiguration method has been removed.
                  • The MarqueeSelect<T>(RectD,IEnumerable<T>) method has been removed.
                  • The SelectionModel property has been removed. Instead the GraphSelection property is used.
                  • The CollectionModel property has been removed. Instead the model items of the Graph property are used.
                  • The GraphInputModeController property has been removed.
                  • The protected event handlers for ClickInputMode's Clicked and DoubleClicked events have been removed.
                  • FindItem has been removed. An additional overload of FindItems without the context parameter has been added. To replicate the previous behavior of FindItem, FindItems can be called and the first element taken from the resulting enumeration.
                  • ShouldBeMovableForMoveInputMode has been removed.
                • Improved GraphViewerInputMode API:
                  • Added support for the Copy command.
                  • Added support for multi-selection via Ctrl+Click and marquee selection. The latter is disabled by default.
                  • The click hit-test order can now be configured by property ClickHitTestOrder.
                  • By default, clipboard commands are now disabled. This can be controlled with the new property AllowClipboardOperations.
                  • The ItemSelected event has been removed.
                  • ClipboardCommandsEnabled has been removed.
                CreateEdgeInputMode

                CreateEdgeInputMode has been refactored and streamlined:

                • Orthogonal edge creation is automatically enabled if orthogonal edge editing is enabled on the containing GraphEditorInputMode.
                • The ConnectToCandidatesOnly property has been removed. Edge creation now always uses port candidates.
                • The creation callbacks NodeBasedEdgeCreationCallback and PortBasedEdgeCreationCallback have been replaced by the new EdgeCreator which is always port-based.
                • The methods GetSourcePortOwner, GetTargetPortOwner, GetSourceNode and GetTargetNode have been replaced by GetSource and GetTarget.
                • The properties SourcePortCandidate and TargetPortCandidate are no longer read-only.
                • The methods DetermineEdgeStyle, AssignSourcePortPosition, AssignEdgeStyle as well as the EdgeStyle property have been removed. Instead the new EdgeDefaults property can be used to customize the new edge.
                • The UseHitNodeTargetCandidatesOnly property has been replaced by the new UseHitItemsCandidatesOnly property.
                • The type of the OrthogonalEdgeCreation property has been changed from bool to OrthogonalEdgeEditingPolicy.
                • The new DummyEdgeGraph property is used to create the dummy edge that visualizes the edge during creation.
                • The preview edge which is displayed during edge creation now shows the edge as it will be created, i.e. the preview edge has the same style, port visualization, and labels as the created edge will have.
                • The SnapToTargetCandidateOwner property has been removed. The preview edge now is always being cropped at the candidate owner's borders.
                • A new CancelGestureOnInvalidTarget property has been added that makes it possible to cancel the gesture immediately if ended on an invalid target.
                • The EdgeCreator callback now has a templateEdge parameter where all data for edge creation can be retrieved from. The source and target IPort parameters have been changed to IPortCandidates.
                • The AssignBends method has been removed and its functionality folded into the default EdgeCreator implementation. This also means that customized EdgeCreators now have to add bends to the created edge as well.
                • The following methods have been removed: IsPortCandidateResolutionEnabled, IsValidEnd, IsValidBegin, IsCancelGesture, IsBendCreationEnforced, IsValidBend, IsSourceNodeDraggingFinished, IsRemoveBendEvent. Instead, use the corresponding ...EventRecognizer properties to customize the behavior.
                • The following methods and properties have been removed: CreateBend(PointD), StartCreateEdge, OnTargetLocationChanged, GetNodes, NodeComparer and PortOwnerComparer.
                Other Input Modes
                • ContextMenuInputMode: Support for different context menu trigger events has been added. Currently only mouse (right-click) and keyboard (application / context menu key) are distinguished, more may be added in the future.
                • ClickInputMode: The ValidClickHitCursor property has been added. This cursor is used when hovering over a valid hit region.
                • ClickInputMode: The PreventNextDoubleClick method has been added that can be used in event handlers for single clicks to prevent that this click can become part of a double click event.
                • CreateBendInputMode: The CancelEventRecognizer property has been removed.
                • HandleInputMode: The Active property has been removed. The mode can be manually deactivated using the Enabled property instead.
                • HandleInputMode: The Arm method now has a handle parameter for the handle that is under the mouse cursor.
                • NodeDropInputMode: The NodeCreator callback, NodeCreated event, and GetDraggedNode method have been removed. The ItemCreator callback, ItemCreated event and DraggedItem property from its base class ItemDropInputMode is used instead.
                • OverviewInputMode now extends MultiplexingInputMode and can be customized more easily. Minor modes can be replaced and adjusted, as well as the list of available default command bindings can be modified.
                • OverviewInputMode: The new Margins property specifies margins for the visible area of the bound GraphOverviewControl. The new protected method UpdateVisibleArea provides further means for customizing the visible area.
                • MarqueeSelectionInputMode: The events DragStarting, DragStarted, Dragging, Dragged, DragFinishing, DragFinished, DragCanceling and DragCanceled now use MarqueeSelectionEventArgs that provide the current selection rectangle.
                • MarqueeSelectionInputMode: The MarqueeSelected event has been removed. The DragFinished event can be used instead.
                • MarqueeSelectionInputMode: The LastModifierState property has been removed.
                • MoveInputMode now provides a QueryPositionHandler event that queries an IPositionHandler each time a drag is started.
                • MoveViewportInputMode: Mouse cursor handling is now also done by protected methods Arm and Disarm, similar to other input modes.
                • MultiplexingInputMode: The ChildController property and CreateChildConcurrencyController method have been removed.
                • TableEditorInputMode: The new events LabelAdding and LabelEditing allow fine-grained control over adding or editing labels and tie into the existing functionality provided by IEditLabelHelper.
                • TableEditorInputMode: The events DeletingSelection and DeletedSelection now use SelectionEventArgs<IStripe>.
                • TableEditorInputMode: Now contains the AllowMixedSelection property which has been moved from the removed class CompositeStripeSelection.
                • WaitInputMode.GetMultiplexingInputMode has been removed.
                • TextEditorInputMode: The events EditingStarted, EditingCanceled and TextEdited now use TextEventArgs.
                • TextEditorInputMode: The properties StopRecognizer, CancelRecognizer and LineBreakRecognizer have been added which allow for easy customization of the key gestures used to add new line breaks and to cancel or stop the text editing.
                Label Editing
                • IEditLabelHelper has been refactored:
                  • AddLabel and EditLabel have been replaced by the methods OnLabelAdding and OnLabelEditing which take the new LabelEditingEventArgs as their only argument.
                  • The IEditLabelHelper.ConfigureTextEditorInputMode method has been removed. It has been replaced by the LabelEditingEventArgs.TextEditorInputModeConfigurator property.
                  • The customizations possible from IEditLabelHelper are the same as those from the LabelAdding and LabelEditing events on GraphEditorInputMode and TableEditorInputMode. IEditLabelHelper is conceptually used as another event handler for those events.
                  • The Owner property of EditLabelHelper has been removed, along with the respective constructor. The label owner can usually be queried from the LabelEditingEventArgs. Custom subclasses can of course still opt to store the item they were created for and use that field.
                • If an IEditLabelHelper implementation is present in an ILabeledItem's lookup, its AddLabel method is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate method GraphEditorInputMode.ShouldLabelBeAdded always has to return true, whether edit helpers are present or not. If the new label should be edited interactively after it's creation (the default behavior), it also must be editable, following the rules above. Therefore an IEditLabelHelper implementation usually should allow editing of label instances that it has created itself in OnLabelAdding.
                • The current label visual can be hidden while the text editor is shown to reduce visual clutter. This feature is enabled by default and can be controlled through the GraphEditorInputMode.HideLabelDuringEditing property.
                Snapping
                • SnapContext:
                  • A boolean parameter snappingDisabled has been added to the methods HandleMove and DragFinished. This parameter has to be set to true to handle moves or finish a drag when snapping is temporarily disabled. This replaces the call to SnapContext.DisableSnapping.
                  • The events Initializing, Initialized and CleanedUp as well as their associated methods now use InputModeEventArgs.
                  • The VoidInstance field has been removed.
                • GraphSnapContext:
                  • The return type of GetMovementInfos has been changed to IListEnumerable<MovementInfo> and the classes NodeMovementInfo, PortMovementInfo, BendMovementInfo and EdgeEndMovementInfo have been removed.
                  • The info parameter's type of AddEdgeEndToBeMoved has been changed to the more general MovementInfo. A boolean parameter AtSource has been added.
                  • The methods AddSameWidthEntries and AddSameHeightEntries now return an IListEnumerable<RectD> containing the rectangles whose widths respectively heights are closest to the given size. The parameters resultingSize and rects have been removed.
                • IEdgeSnapResultProvider:
                  • The methods InitializeSnapping and CleanupSnapping have been removed.
                  • The info parameter's type of CollectSnapResults has been changed to IListEnumerable<MovementInfo>.
                • SnapResult now has more factory methods. The class SnapLineSnapResult has been replaced with a factory method as well.
                • The classes SnapLineContainer, SingleLineSnapLineContainer, EdgeSegmentSnapLineContainer, FixedDistanceSnapLineContainer, InBetweenSnapLineContainer have been removed.
                Clipboard
                • The GraphClipboard.ClipboardContext property has been removed.
                • The Copy methods in GraphCopier now have a new PointD offset parameter that shifts nodes and bends by a given amount upon copying them.
                • The signature of IClipboardIdProvider.GetId has changed. The context parameter has been moved to the front.
                KeyboardInputMode

                KeyboardInputMode has been simplified along with all helper types and infrastructure around commands:

                • KeyboardInputMode now allows creating a mapping between a key gesture and a command as well as providing custom execution logic for a given command.
                • There is also a single new method RemoveCommand on KeyboardInputMode which removes all currently existing bindings for a given command.
                Various Input-related Changes
                • Events
                  • The properties LastMouse2DEventArgs and LastEventLocation have been removed from all input modes. Instead, the properties LastMouseEvent and LastEventLocation on CanvasControl can be used.
                  • EdgeEventArgs now also contains the owner of the source and target port.
                  • ItemClickedEventArgs now also contains the location of the click.
                  • StripeEventArgs now also contains the Table for this event.
                  • OrthogonalEdgeEditingContext: The events Initializing, Initialized and CleanedUp as well as associated methods now use InputModeEventArgs.
                  • GraphCommands.AdjustGroupNodeSize now always processes the nodes in bottom to top order instead of using the order in which the nodes were selected.
                • The command framework has been simplified. Classes ApplicationCommands, NavigationCommands, and GraphCommands have been removed. All commands are now available on new class Commands. The ending "Command" has been removed from the command's names. There is no public implementation for a command, now. Instead, the factory method CreateCommand on class Commands has to be used.
                • All hit-testing methods as well as the methods in IPortSelectionTester and IBendSelectionTester now take an IInputModeContext instead of ICanvasContext as their context parameter.
                • IPositionHandler and IHandle implementations no longer implement IPoint.
                • IPositionHandler.SetPosition has been removed. The interface is now used as a flagging interface only.
                • The classes DefaultPositionHandler and PointHandle have been removed.
                • GraphEditorInputMode.NodeCreator now has an additional parent parameter which can be used as the parent node for creating a new node. GraphEditorInputMode tries to find a group node at the click location to pass as parent to the NodeCreator.
                • Opening a context menu from the keyboard no longer uses the last known mouse pointer location for opening the context menu. Instead, the location of the current selection or the current item are used.
                • IPortCandidateProvider: The two method overloads GetSourcePortCandidatesForEdge and GetTargetPortCandidatesForEdge that had an IEdge parameter have been removed - the two remaining pairs have been merged into a single method with an optional argument for the opposite candidate.
                • The property AbstractPortCandidateProvider.PortOwner has been removed, along with the methods that made use of it.
                • AbstractPortCandidateProvider: Overloads of CreateCandidate taking an IPort an optionally an IPortLocationModel have been removed.
                • DefaultPortCandidate: A constructor overload taking the optional PortCandidateValidity additionally has been added.
                • OrthogonalEdgeEditingContext.AddMovedEdgeEnd: The movementInfo parameter's type has been changed to the more general MovementInfo. A boolean parameter atSource has been added.
                • PortRelocationHandle: The method ConfigureDummyEdge has been folded into CreateDummyEdge.
                • The methods IDragHandler.HandleMove and IReshapeHandler.HandleReshape no longer has a return value.
                • The classes InputModeController and GraphInputModeController have been removed.
                • The abstract class EdgeEndMoveHandle has been removed.
                • The StateMachine class as well as the associated types and infrastructure have been removed from the API.

                GraphML

                The XML namespaces have been updated and the mapping from yFiles.NET types to their corresponding XML namespace has been changed.

                • All platform-independent graph model types are now mapped to http://www.yworks.com/xml/yfiles-common/3.0. This includes the following types:
                  • all graph item types
                  • all default label models
                  • all port location models
                  • all "void" styles
                  • serialization for geometric primitives
                • All platform-independent GraphML support types are now mapped to http://www.yworks.com/xml/yfiles-common/markup/3.0.
                • All platform-independent framework classes are now mapped to http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0. This includes the following types:
                  • Built-in value types (int, double, bool, etc., and enumeration types)
                  • string
                • All library types specific to yFiles.NET are now mapped to http://www.yworks.com/xml/yfiles.net/5.0/forms. These are mainly the types in the following namespaces:
                  • yWorks.Graph.Styles
                  • yWorks.Markup.Platform
                • The following events have been added to signal the end of the write or parse process, respectively: GraphMLIOHandler.Parsed, GraphMLParser.Parsed, GraphMLIOHandler.Written, GraphMLWriter.Written, together with the corresponding event raiser methods.
                • SerializationProperties:
                  • The new serialization property ParseLabelSize optionally disables parsing of the preferred size of a label. This can be used to prevent unexpected clipping when parsing GraphML written on different machines, or with fonts that are not available.
                  • WriteGraphSettings and DisableGraphSettings have been merged to a single DisableGraphSettings property which is interpreted according to the context where it is set.
                  • IndentOutput has been added that allows to define whether the XML output should be properly indented.
                • A few abstract base classes have been merged:
                  • AbstractXmlWriter and DirectXmlWriter have been merged into XmlWriter
                  • AbstractMapperInputHandler and ComplexMapperInputHandler have been merged into MapperInputHandler
                  • AbstractMapperOutputHandler and ComplexMapperOutputHandler have been merged into MapperOutputHandler
                • The legacy interface IDeserializer has been removed. For custom deserialization an event handler for GraphMLIOHandler.HandleDeserialization can be used.
                • The classes ArrayValueSerializer and NullXmlWriter have been removed.
                • IXamlNameMapper has been refactored to and AddXamlNamespaceMapping has been added to GraphMLIOHandler.
                • QueryOutputHandlersEventArgs: The overload of AddOutputHandler taking an object id has been removed.
                • XmlWriter: A property indent has been added that allow to define whether the XML output should be properly indented.
                • XmlWriter: The constructor overload taking an InternalXmlWriter as well as the corresponding property DelegateWriter have been removed.

                Utility Types

                A lot of the utility types have been either replaced or removed.

                • The yWorks.Model namespace has been removed and its types have been moved to more intuitive namespaces.
                • The yWorks.Support namespace has been removed along with most of the types contained within, since they were not really needed. The remaining types have been moved to more meaningful namespaces, mainly yWorks.Controls.
                • The classes EmptyCollection<T>, EmptyList<T>, CompositeEnumerable, CompositeEnumerator, CompositeListEnumerable, CompositeCollectionModel, SingleListEnumerable, SingletonCollection, SingletonList, DoubleCollection, and CollectionChangedEventArgs have been removed.
                • The classes CompositeHandle<T> and CompositePositionHandler have been removed.
                • The IMapper.RemoveValue method has been removed. It depends on the specific implementation of the mapper whether a mapping can be removed. If an implementation provides a way to remove a mapping, that should be preferred over setting a null value.
                • The classes GenericYList, GenericListCell, and HashSet have been removed.
                • The classes DefaultNodeLookup, DefaultEdgeLookup, DefaultPortLookup, DefaultLabelLookup, DefaultBendLookup and DefaultItemLookup have been removed. Properties with the same names have been added to DefaultGraph instead.
                • The ItemDecorator<TModelItem> class has been removed. Its members have been pushed down to its former sub-classes NodeDecorator, EdgeDecorator, LabelDecorator, PortDecorator, and BendDecorator.
                • The events ItemSelected and ItemDeselected on ISelectionModel have been merged into the ItemSelectionChanged event.
                • The GeomSupport.CreateSmoothedPath method has been moved to GeneralPath.

                Layout

                Layout Execution
                • LayoutExecutor:
                  • The method Stop now stops a running layout calculation as soon as possible and then immediately shows the result so far, skipping any animation. In addition, the new method Cancel immediately cancels a running calculation and doesn't change the GraphControl's Graph unless the animation was already running.
                  • The property AbortHandler has been made read-only. There is a protected factory method CreateAbortHandler which can be overridden to create a custom AbortHandler implementation.
                  • Labels are now taken into account for the final content rectangle and viewport animation.
                  • The new property ConsiderViewportLimiter can be enabled to let the target viewport after a layout respect the ViewportLimiter of the GraphControl. The ViewportAnimation has a new property ConsiderViewportLimiter for the same purpose.
                  • The classes LayoutExecutor and LayoutGraphAdapter now have a property AutomaticEdgeGrouping that automatically configures edge groups for ports with multiple incoming or outgoing edges. This feature is enabled by default.
                  • The classes LayoutExecutor and LayoutGraphAdapter now have a property FixPorts that automatically configures strong source and target port constraints for all edges in the graph. This feature is disabled by default.
                  • LayoutExecutor no longer throws an exception wrapping a layout exception if no event handler of LayoutFinished handled the event arguments. This means that exceptions in a layout algorithm can go by unnoticed if the layout runs asynchronously, and the task returned from LayoutExecutor.Start is not awaited.
                • LayoutGraphAdapter now adds data providers that map each node, edge, and label of a LayoutGraph to their corresponding IModelItem in the original IGraph. Especially, these data providers are available if a layout is run with a LayoutExecutor or the convenience methods MorphLayout or ApplyLayout.
                Layout API
                • The legacy hierarchic layout algorithms HierarchicLayouter, HierarchicGroupLayouter, and the associated legacy interfaces ILayerer, IDrawer, IMementoSupport, ILayerSequencer, together with their implementations, have been removed. Instead, IncrementalHierarchicLayouter has been renamed to HierarchicLayout and is now the only implementation of the hierarchic layout style. All associated interfaces and implementations from the namespace yWorks.yFiles.Layout.Hierarchic.Incremental have been moved up to yWorks.Layout.Hierarchic.
                • The legacy classes OrthogonalGroupLayouter and DirectedOrthogonalLayouter have been removed and their features have been incorporated into OrthogonalLayout.
                • The legacy class OrthogonalEdgeRouter and all associated classes have been removed.
                • The HVTreeLayouter class has been removed and its features have been incorporated into TreeLayout.
                • The DefaultGraphLayout class has been removed.
                • The ParentEdgeAugmentationStage class has been removed.
                • The Graph.MoveSubgraph method has been removed.
                • CopiedLayoutIGraph has been removed. An instance of the base type CopiedLayoutGraph with the same functionality can be obtained from LayoutGraphAdapter's CreateCopiedLayoutGraph factory method.
                • The CanLayout method has been removed from all layout algorithms. Previously it pretty much always returned true.
                Renamed Layout Types
                yFiles.NET 4.4 yFiles.NET 5.0
                Main Interface
                ILayouter ILayoutAlgorithm
                ILayouter.DoLayout ILayoutAlgorithm.ApplyLayout
                ILayouter.CanLayout removed
                Major Layout Algorithms
                HierarchicLayouter removed
                HierarchicGroupLayouter removed
                IncrementalHierarchicLayouter HierarchicLayout
                DirectedOrthogonalLayouter removed; functionality incorporated into OrthogonalLayout
                OrthogonalGroupLayouter removed; functionality incorporated into OrthogonalLayout
                OrthogonalLayouter OrthogonalLayout
                OrthogonalEdgeRouter removed; functionality incorporated into EdgeRouter
                OrganicLayouter ClassicOrganicLayout
                SmartOrganicLayouter OrganicLayout
                TreeLayouter ClassicTreeLayout
                GenericTreeLayouter TreeLayout
                HVTreeLayouter removed; functionality incorporated into TreeLayout
                SALabeling GenericLabeling
                GreedyMISLabeling removed; functionality incorporated into GenericLabeling
                MultiPageLayouter MultiPageLayout
                MultiPageLayout MultiPageLayoutResult
                Changes in alphabetical order
                AbstractLabelingAlgorithm LabelingBase
                ARTreeLayouter AspectRatioTreeLayout
                BalloonLayouter BalloonLayout
                BufferedLayouter BufferedLayout
                CanonicMultiStageLayouter MultiStageLayout
                CanonicMultiStageLayouter.LabelLayouter MultiStageLayout.Labeling
                CanonicMultiStageLayouter.LabelLayouterEnabled MultiStageLayout.LabelingEnabled
                CircularLayouter CircularLayout
                CompactOrthogonalLayouter CompactOrthogonalLayout
                ComponentLayouter ComponentLayout
                FamilyTreeLayouter FamilyTreeLayout
                GenericTreeLayouter TreeLayout
                GroupedShuffleLayouter RecursiveShuffleLayout
                GroupNodeHider HideGroupsStage
                IncrementalHierarchicLayouter HierarchicLayout
                yWorks.yFiles.Layout.Hierarchic.Incremental.HierarchicLayouter yWorks.Layout.Hierarchic.HierarchicLayoutCore
                IncrementalHierarchicLayouter.CreateHierarchicLayouter HierarchicLayout.CreateHierarchicLayoutCore
                IncrementalHierarchicLayouter.HierarchicLayouter HierarchicLayout.HierarchicLayoutCore
                InteractiveOrganicLayouter.DisableStages InteractiveOrganicLayout.DisableAllStages
                InteractiveOrganicLayouter InteractiveOrganicLayout
                IsolatedGroupComponentLayouter IsolatedGroupComponentLayout
                LayouterKeys LayoutKeys
                LayoutTool LayoutGraphUtilities
                MinNodeSizeStage MinimumNodeSizeStage
                MISLabelingAlgorithm MISLabelingBase
                NormalizingGraphElementOrderStage NormalizeGraphElementOrderStage
                OrganicLayouter ClassicOrganicLayout
                OrientationLayouter OrientationLayout
                PartialLayouter PartialLayout
                RadialLayouter RadialLayout
                RecursiveGroupLayouter RecursiveGroupLayout
                ReducedScopeStage (removed)
                RemoveOverlapsLayoutStage RemoveOverlapsStage
                SALabeling GenericLabeling
                SequentialLayouter SequentialLayout
                SeriesParallelLayouter SeriesParallelLayout
                ShuffleLayouter ShuffleLayout
                SingleCycleLayouter SingleCycleLayout
                SmartOrganicLayouter OrganicLayout
                SplitEdgeLayoutStage SplitEdgeStage
                SubgraphLayouter SubgraphLayout
                TreeComponentLayouter TreeComponentLayout
                TreeLayouter ClassicTreeLayout
                Previous changes