Release notes
yFiles for HTML

yFiles for HTML
Version 3.0

Version 3.0 is the latest major release for yFiles for HTML.
See the change log for a list of all changes in this and all other versions.

To learn about the new features in version 3.0, have a look at the About yFiles for HTML Version 3 page on our yfiles.com website.
Below you will find the technical requirements and a list of all changes, including new features and incompatible changes.

What to expect on this page

Technical Requirements

  • For development, we strongly recommend an IDE with dedicated support for the web platform, for example Visual Studio Code or JetBrains WebStorm.
  • yFiles for HTML-based web applications require a common, standards-compliant browser. These include Chrome, Safari, Firefox, and Edge on Windows, macOS, iOS, and Android operating systems.
    The yFiles for HTML 3.0 release has been tested with the following browsers:
Google Chrome
Mozilla Firefox
Apple Safari
Microsoft Edge(based on Chromium)
110+(desktop and mobile devices)
115+
16+(macOS, iOS, and iPadOS)
110+

All changes
Version 3.0

New Features, Improvements, and Bug Fixes

General

New Features and Improvements

  • The yFiles class system now follows the conventions of the ECMAScript standard even more closely. As a result, some special classes and constructs have become superfluous, e.g. the YObject, YNumber, YBoolean, and YString types and the $class member.
  • The event listener API for yFiles events is now similar to JavaScript's EventTarget. Each event sender now has a single addEventListener and removeEventListener method that gets the event name as the first parameter and an optional options object as the last one. The second parameter is the event listener function that gets two parameters: a specific EventArgs object and the sender instance. The options support automatic event deregistration via the AbortController API and single (once) event invocation with automatic deregistration.
  • 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.
  • Option objects in arguments of constructors and other methods now also work for nested properties. Previously, only the direct properties of the class could be defined.
  • It is now possible to explicitly pass undefined to optional parameters matching the behavior of ECMAScript and TypeScript.
  • yFiles for HTML 3.0 uses a new license format (license version "1.2"). Existing licenses with license version "1.1" remain compatible.
  • The yFiles npm package is now named @yfiles/yfiles. This makes it easier to serve yFiles from a local registry by associating the @yfiles scope with it.
  • The library now prevents problems with strict CSP settings, as we now set CSS styles with the HTMLElement.style property instead of the style attribute.

See the related incompatible changes.

Graph

New Features and Improvements

  • The new IGraph.getEdgesBetween method returns all edges between two ports or port owners.
  • 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 methods of IGraph now check consistently whether given geometric arguments are neither infinite nor NaN.
  • The rotation direction of OrientedRectangle, LayoutNodeLabel, LayoutEdgeLabel 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 public ILabelModel and IPortLocationModel classes are now public and provide all properties necessary to recreate them on the models. Consequently, the static deserializeParameter and serializeParameter methods of the ILabelModelParameter and IPortLocationModelParameter 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 property-changed event on the UndoEngine class is now also emitted if the token is changed.
  • The new static ITable.getTable method returns the ITable instance of a node if there is one.
  • The types of IModelItem.tag properties are now easier to customize. See the "Augmenting the tag property" section in the Developer's Guide for more details.

Bug Fixes

  • 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.
  • The GraphClipboard's parentNodeDetection now can use ParentNodeDetectionModes.NONE as fallback if no valid parent is found for modes ParentNodeDetectionModes.SELECTION or ParentNodeDetectionModes.PREVIOUS_PARENT.

See the related incompatible changes.

Components

New Features and Improvements

  • ViewportLimiter now also works with isometric projections and offers options to use the CanvasComponent.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. CanvasComponent now also notifies the viewport limiter when the size of the contentBounds or the size of the CanvasComponent changes.
  • Added a pointer-cancel event to the CanvasComponent.
  • The SvgExport.exportSvgAsync method now supports an optional render completion callback that can be used to await asynchronous rendering.
  • Theming is now specified with CSS variables, such that the look and feel of a GraphComponent can now be customized with a few lines of CSS.
    • The available values for the --yfiles-theme-variant variable are round and square with solid strokes, and the new square-round and square-hatched with a hatched stroke.
    • It's now possible to specify an offset for resize handles and the selection indicator rectangle via theming. Setting an offset can prevent such handles from overlapping ports.
    • Consequently, the Theme class has been removed.
  • The scrollbars of a CanvasComponent are now easier to style since we improved their CSS rules. For example, the scrollbar size is now determined by the CSS variables --yfiles-scrollbar-size, --yfiles-scrollbar-horizontal-size, and --yfiles-scrollbar-vertical-size.
  • GraphComponent now uses GraphViewerInputMode as the default inputMode for basic graph exploration.
  • The ICanvasContext.canvasComponent 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 CanvasComponent which are related to input devices now have the same consistent names.
  • The CanvasComponent.contentRect property is now named contentBounds to make its purpose more clear.
  • The superfluous CanvasComponent.setContentRect method has been removed in favor of the setter of the contentBounds property.
  • It is now possible to have more than one BridgeManager. This allows you to have different types of bridges on different types of edges.
  • The DOM focus state of the CanvasComponent moved from the container element to an inner child of the CanvasComponent. This makes it easier to listen to DOM events in HTML elements that are part of the render tree, e.g. in an HtmlVisual or an overlay panel.
  • CanvasComponent constructor now accepts HTMLElement as hosting element instead of HTMLDivElement. This allows initialization of the CanvasComponent in semantic elements and custom elements.
  • The CanvasComponent.focus method now has an optional parameter that takes an options object with a preventScroll property, similar to the HTMLElement.focus method. This replaces the CanvasControl.PreventFocusScroll property.

New Demos

  • New Viewport Limiter demo shows the improved behavior of the ViewportLimiter class.
  • The new timeline demo shows how to implement a timeline component for graphs that change over time.

Bug Fixes

  • Fixed an issue where a sequential animation would break when the preferred duration was set to zero.

See the related incompatible changes.

Rendering

New Features and Improvements

  • The new ObjectRendererBase class allows conveniently implementing the IObjectRenderer interface.
  • New classes formalize the data that is 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 LassoPathFinishRegionRenderTag class will be passed as render tag for the finish region 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 RenterTree.VoidObjectRenderer constant provides a singleton renderer that renders nothing.

See the related incompatible changes.

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.

See the related incompatible changes.

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, OCTAGON_STANDING, TRIANGLE_POINTING_LEFT, and TRIANGLE_POINTING_RIGHT. 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.
  • The WebGLShapeNodeStyle and WebGLImageNodeStyle classes, and the WebGL selection visualization now support triangle shapes pointing down, left, and right as well as a diamond shape.
  • TextWrapping supports four new policies for trimming the text without wrapping the line: TRIM_CHARACTER, TRIM_CHARACTER_ELLIPSIS, TRIM_WORD, and TRIM_WORD_ELLIPSIS. The existing policies that allow wrapping lines have been renamed to properly distinguish them from the new ones. In addition, the clipping-only policy previously enabled with the DefaultLabelStyle.clipText and MarkupLabelStyle.clipText properties is now available with the TextWrapping.CLIP value, and the default wrapping policy of these styles is now TextWrapping.WRAP_WORD_ELLIPSIS.
  • The ImageNodeStyle and IconLabelStyle classes can now have a background visual. The shape of this background can be one of the values of ShapeNodeShape.
  • The new CssFill class is a fill that supports CSS color values.
  • 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.
  • The CollapsibleNodeStyleDecorator class positions and styles the button now closer to what GroupNodeStyle does to achieve a more modern look.
  • 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 IconLabelStyle now has a default icon size of 24x24 instead of empty, such that the icon is always visible.
  • 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.
  • The fill conversion now prioritizes the new CssFill class for input strings.
  • The Color class is now a fill and can therefore be used wherever the SolidColorFill class was previously used. The latter has therefore been removed.
  • CollapsibleNodeStyleDecorator has new methods for creating a custom button visualization.
  • The default line spacing has been reduced to 0.2 to better match the platform defaults.

New Demos

  • The new Shape Port Style demo shows this new style.
  • The new Arrow demo shows the new visualization options for arrows.
  • The new General Path Node Style demo shows how to create stars, polygons, and other shapes with this style.

Bug Fixes

  • For IconLabelStyle the width and height of the rendered icon are no longer swapped.
  • When the label text is rendered using the TextRenderSupport.addText method and wrapping is word-ellipsis or character-ellipsis, an ellipsis character is now always added when necessary.
  • The TextRenderSupport.addText method now uses the correct line spacing when a shape is specified.
  • Resolved an issue where resize handles were not updating when group nodes were expanded or collapsed.
  • Nodes rendered with ArrowNodeStyle that are filled with a gradient do not rotate the fill along with the arrow, anymore.

See the related incompatible changes.

WebGL

New Features and Improvements

  • The new WebGLArrowType.CROP_AT_PORT enum value enables cropping similar to the new IArrow.cropAtPort property.
  • The WebGLLabelStyle and WebGLIconLabelStyle classes now support different paddings per direction.
  • The automatic conversion of LabelStyle to WebGLLabelStyle now considers the minimum LabelStyle.padding (if uniform padding is not set) to prevent text misplacement or disappearance.
  • WebGL2 styles can now be set directly via the IGraph.
  • Decorator styles for WebGL2 and SVG rendering simplify style handling on rendering type switch.
  • Automatic conversion for WebGL2 styles in SVG rendering mode.

Bug Fixes

  • Fixed an issue where instantiating animations via WebGLGraphModelManager.createBeaconAnimation (and all other animation creating functions) would throw an exception when the timing parameter was not provided.
  • WebGLLabelStyle now avoids unnecessary text wrapping for labels with large padding when there is sufficient space to place the text.
  • Bend handles are now always displayed correctly when rendering with WebGL.
  • Ports are now correctly positioned when they lie slightly outside the node.

See the related incompatible changes.

Interaction

New Features and Improvements

  • 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.
  • Reconnecting edges to other nodes is now allowed per default.
  • Elements can now be moved without selecting them first.
  • When editing label text, users can now enter newlines with Shift+Enter in addition to Ctrl+Enter / Command+Enter.
  • A fully customizable context menu is now included. You have complete control over the menu elements and can customize all UI elements to your liking. Of course, it's also still possible to use the context menu of your favorite UI framework. In addition, the API of the ContextMenuInputMode has been improved and its event handling was simplified.
  • 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.
  • 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 pointer-long-press event is available for all pointer input types and replaces the specific TouchLongPress event.
  • The new pointer-long-rest 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.
  • 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.
  • The new GraphEditorInputMode.creationSelectableItems property allows you to specify GraphItemTypes which should be selected after creation.
  • The new CreateEdgeInputMode.edge-direction-reversed event and the new CreateEdgeInputMode.onEdgeDirectionReversed method are triggered when the direction of the edge creation changed during edge creation.
  • The new HandleType.VOID enum value makes a handle invisible and excludes it from hit testing.
  • 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.
  • 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 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.
  • The CanvasComponent'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 MoveInputMode class now also handles moving labels, thus the MoveLabelInputMode was removed.
  • The event items-copied on GraphViewerInputMode and the events items-copied, items-cut, items-pasted, items-duplicated, and deleted-selection on GraphEditorInputMode now use ItemsEventArgs providing the items that are the subjects of the events.
  • The CanvasComponent now listens to native PointerEvents to handle mouse, touch, and stylus input.
  • The new ctrlKey, shiftKey, altKey, and metaKey boolean properties of PointerEventArgs and ClickEventArgs specify which modify keys were pressed during the event.
  • The order of the two parameters of the EventRecognizer function has been reversed: The event is now the first one, and the rarely used sender the last one.
  • 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 GraphInputMode.findItems method now considers the actual z-order of the hit items.
  • The GraphInputMode.item-clicked 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.
  • MoveViewportInputMode now gracefully handles concurrent programmatic viewport modifications.
  • The modifier for using the ILabelModelParameterFinder during label movement can now be changed with the LabelPositionHandler.useParameterFinderRecognizer property.
  • 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 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.
  • 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.
  • Toggling the item selection via Ctrl+Space now prefers toggling the selection state of GraphComponent.currentItem over deselecting a single selected item.
  • 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.
  • The new Command.ZOOM_TO_SELECTION zooms to the bounding box around all selected items. It can be triggered by the keyboard short cut Alt+2.
  • Edge creation can now be cancelled by ending the gesture over the source node.
  • Edge creation is canceled if the GraphComponent 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.
  • 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 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.
  • 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.
  • The handleIsHit and getClosestHitHandle methods of HandleInputMode now have an additional parameter which specifies the PointerType of the related user gesture.
  • 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.
  • 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 GraphComponent.
  • Improved keyboard navigation for graph items.
  • 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.
  • LabelDropInputMode now consults the IEditLabelHelper of possible drop targets when dragging and dropping labels.
  • The Fill and Stroke properties of LassoSelectionInputMode are now also applied to the finish region (with the default renderer).
  • New overloads of the CreateEdgeInputMode.startEdgeCreation method can be used to start interactive edge creation from a node or port, respectively.
  • The parent node detection of GraphClipboard has been streamlined.
  • The new GraphViewerInputMode.hitTester property works in the same way as the GraphEditorInputMode.hitTester property.
  • The GraphEditorInputMode.duplicateSelection method now also dispatches multi-selection-started and multi-selection-finished events.
  • The items reported by the HandleInputMode.affectedItems property now include edges that were modified with the height handle of BezierEdgeStyle and ArcEdgeStyle.
  • The static member GraphClipboard.DEFAULT_GRAPH_CLIPBOARD has been added and is used per default as GraphComponent.clipboard. This way copy&paste operations work between multiple GraphComponent instances without the need to set a shared GraphClipboard instance first.
  • The sub-input modes of GraphViewerInputMode and GraphEditorInputMode can now be replaced while the input mode is installed.
  • It is now possible to declare different sets of keyboard shortcuts as well as localizations for string constants depending on the language the user has enabled in their user agent.
  • The Cursor constructor now allows the specification of the hot-spot.
  • Cursors for resize handles now show double-headed arrows on all devices.
  • NodeDropInputMode, LabelDropInputMode, StripeDropInputMode, and PortDropInputMode now provide a static DEFAULT_TRANSFER_TYPE property which represents the transfer type to which the respective input mode is configured by default.
  • Setting the tooltip content or custom components as tooltips has been streamlined.

New Demos

  • the new Mouse Wheel Customization demo shows how to customize and enhance the default mouse wheel behavior.

Bug Fixes

  • 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 GraphComponent that has a projection, the inertia now works in the right direction.
  • Fixed that the onMarqueeSelect and onLassoSelect methods of GraphEditorInputMode and GraphViewerInputMode were called with a wrong input mode context.
  • Fixed occasionally missing auto-scrolling on viewport bounds for touch devices.
  • The GraphInputMode.findItems overload without the context parameter did not find items correctly.
  • Fixed an issue where keyboard navigation would stop working when two items were positioned at the same location.
  • Offset rectangle handles were hard to hit with a custom theme scale and now properly consider theme scaling and custom offsets.
  • Fixed label edit boxes having no width/height if editing started outside of the viewport.

See the related incompatible changes.

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.
  • The label text editor element now takes the on-screen keyboard into account when it scrolls into the visible part of the view, so that it is actually always visible.

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

See the related incompatible changes.

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.
  • IClipboardHelper now has methods to support Duplicate, too: shouldDuplicate and onDuplicated.
  • 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.

See the related incompatible changes.

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.

See the related incompatible changes.

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 CompositePortLocationModelPortSide of this candidate can be specified when adding the parameter to the model.
  • The new LayoutExecutorAsync.createWebWorkerMessageHandler and LayoutExecutorAsyncWorker.initializeWebWorker methods simplify the default setup for layouts running in a web worker.
  • The LayoutExecutor.tableLayoutConfigurator feature now uses more flexible placements for nodes that don't belong to any table node.

Bug Fixes

  • Exceptions thrown by IGraph.applyLayout are now properly re-thrown (instead of causing an unhandled promise rejection) and can be caught by a catch block.

See the related incompatible changes.

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 MatchingIds 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 PartionGrid). 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.
    • 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 LayoutNode.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.
    • LayoutGraph.containsEdge has been removed in favor of LayoutGraph.getEdgesBetween. The same holds for 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.
  • 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 PortPlacementStage now correctly considers port candidates together with port groups.

See the related incompatible changes.

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.

New Demos

  • There is a new demo showing how to implement sourcePortAlignment and targetPortAlignment in hierarchical layout.
  • There is a new demo showing how to use the HierarchicalLayoutData.incrementalNodes property to incrementally lay out the newly loaded nodes in a nested graph.

Bug Fixes

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

See the related incompatible changes.

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 LeftRightSubtreePlacer now supports minimum segment length, which can be set with the properties minimumFirstSegmentLength and minimumLastSegmentLength.
  • All subtree placers that used RootNodeAlignment support placing the subtree root centered above the ports with the new value CENTER_OF_PORTS.
  • The SingleLayerSubtreePlacer supports placing the subtree root centered with respect to the ports at its children with the new enum value SingleLayerSubtreePlacerRootAlignment.CENTER_OF_PORTS.
  • The AspectRatioSubtreePlacer now supports minimum first and last segment lengths.
  • 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 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).

See the related incompatible changes.

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.

See the related incompatible changes.

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

See the related incompatible changes.

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

  • Fixed an issue that may have automatically disabled the component layout when using constraint-based features.

See the related incompatible changes.

Interactive Organic Layout

Demo Improvements

  • The Interactive Organic Layout demo now shows how to run the InteractiveOrganicLayout in a web worker thread.

See the related incompatible changes.

Radial Tree Layout

New Features and Improvements

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

See the related incompatible changes.

Partial Layout

New Features and Improvements

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

See the related incompatible changes.

Component Layout

New Features and Improvements

  • ComponentLayout now supports nodeMargins (formerly nodeHalos) for each ComponentArrangementStyle other than NONE and KEEP_CENTERS.

See the related incompatible changes.

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.

See the related incompatible changes.

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.

See the related incompatible changes.

Collections

New Features and Improvements

  • The IEnumerable.ofType method now supports primitive types as element types.
  • The IEnumerable.filter method now has two new overloads with type guards.

See the related incompatible changes.

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 now consistently accept IPoint instead of Point and IRectangle instead of Rect.
  • There are now methods on Rect and Point 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 topLeft method. Similarly, IMutableRectangle no longer implements IMutablePoint.

See the related incompatible changes.

Incompatible Changes

General

Incompatible API Changes

  • 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, ObservableCollection, DefaultPortCandidate, and DefaultSelectionModel.
  • Removed DefaultLabelModelParameterFinder.
  • Removed DefaultBendCreator.
  • Removed the Default prefix from the names of the following types: Graph, WebGL2DefaultLabelStyle.
  • 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 StripeControl.Insets property to thickness.
    • Renamed the StripeLabelModel.useActualInsets property to useTotalPadding.
    • Renamed the StretchStripeLabelModel.useActualInsets property to useTotalPadding.
    • Renamed the IStripe.actualInsets method to totalPadding.
    • 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.
  • 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, ExteriorLabelModelPosition, InteriorLabelModelPosition, InteriorStretchLabelModelPosition, StretchStripeLabelModelPosition, and StripeLabelModelPosition,.
  • Renamed the CompositePortLocationModelPortSide enum to PortSides.
  • The yFiles npm package is now named @yfiles/yfiles. This makes it easier to serve yFiles from a local registry by associating the @yfiles scope with it.
  • The Enum static helper methods have been removed. Instead, each yFiles enum has a new getName(value): string method that can be used to retrieve the name of an enum value.
  • Removed obsolete browser-specific workarounds:
    • Cr320635, Cr433873, Cr701075.
    • Edge2057021.
    • Ie14492280, Ie205775, Ie233711, Ie2337112, Ie7766782, Ie964525.
    • Wk203237.
  • Renamed all members containing Comparison or Comparer to Comparator.
  • The static isInstance method of each type was removed. Use instanceof instead. This change can be done by the migration tool.
  • The library now only comes in a variant that uses JS modules, and the UMD variant has been removed. Nowadays, almost all tools work with JS modules, and you can use a bundler like Rollup if you need the library in a different format.
  • The TypeScript types for very old versions of TypeScript have been removed. The oldest supported TypeScript version is now 5.0.
  • APIs that used Class<T> now use the T type directly instead. This usually means that instead of SomeClass.$class, you can now use SomeClass instead.
  • 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.

See the related new features.

Graph

Incompatible API Changes

  • The SegmentRatioPortLocationModel class is now named EdgeSegmentPortLocationModel, similar to EdgeSegmentLabelModel.
  • The createFromSource and createFromTarget methods of the SegmentRatioPortLocationModel and BendAnchoredPortLocationModelParameter are now named createParameterFromSource and createParameterFromTarget.
  • Removed the TableAnimation class. Use the factory IAnimation.createTableAnimation method as a replacement.
  • GenericPortLocationModel has been renamed to CompositePortLocationModel and doesn't implement IEnumerable<ILabelModelParameter> anymore. Instead, the parameters property can be used to iterate the parameter.
  • 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.
  • The label models ExteriorLabelModel, InteriorLabelModel, and InteriorStretchLabelModel have been renamed to ExteriorNodeLabelModel, InteriorNodeLabelModel, and StretchNodeLabelModel, respectively,.
  • 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 static deserializeParameter and serializeParameter methods of the ILabelModelParameter and IPortLocationModelParameter classes have been removed. These methods 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 ILabelModel parameter of the ILabelModelParameterFinder.findBestParameter and ILabelModelParameterProvider.getParameters methods has been removed.
  • The classes DelegateUndoUnit and CompositeUndoUnits have been removed. The new factory methods IUndoUnit.fromHandler and IUndoUnit.combine can be used instead.
  • The UndoUnitBase class has been removed. Subclasses now have to implement the IUndoUnit interface instead.
  • The owner parameter for ITable.createRow, CreateColumn, and setParent has been renamed to parent.
  • Changes to the GraphCopier class:
    • The methods copyNodeStyle, copyEdgeStyle, copyPortStyle, copyLabelStyle, getOrCreateCopy, copyLabelLayoutParameter, and copyPortLocationParameter have been made protected.
    • The methods copyChildNode, 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 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 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 sourceNode and targetNode 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 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 GraphItemTypes.enumerableNotContainsTypes method was removed, use the includes method instead.
  • Method GroupingSupport.getPathToRoot has been renamed to getAncestors and returns an IListEnumerable instead of an IList.
  • The static parameter fields of FreeNodePortLocationModel have been renamed analogue to the static parameter fields in InteriorNodeLabelModel.
  • The GraphClipboard.isDummy method has been renamed to isHelper.
  • The UndoEngine.token property replaces the UndoEngine.getToken method.
  • 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.

Incompatible Behavior Changes

  • The rotation direction of OrientedRectangle, LayoutNodeLabel, LayoutEdgeLabel and FreeEdgeLabelModel is now clockwise to be consistent with the other models.
  • The EdgeSegmentPortLocationModel.createParameterFromTarget method now interprets the parameter ratio from the target to the source side.
  • The arrow of the default edge style is now ArrowType.TRIANGLE.
  • The default edge label model parameter is now created from an EdgeSegmentLabelModel using its createParameterFromCenter method instead of createParameterFromSource.
  • 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 ON_EDGE is used.
  • 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.
  • SegmentRatioPortLocationModel now uses the path geometry from the edge's style instead of bend locations to determine segments.

See the related new features.

Components

Incompatible API Changes

  • Renamed the coordinate transformation methods to also include the source coordinate system in their names:
    • Renamed CanvasComponent.toViewCoordinates to worldToViewCoordinates.
    • Renamed CanvasComponent.toWorldCoordinates to viewToWorldCoordinates.
    • Renamed IRenderContext.toViewCoordinates to worldToViewCoordinates.
  • The default inputMode in GraphComponent is no longer null but is now set to GraphViewerInputMode.
  • Renamed HighlightIndicatorManager.selectionModel to items.
  • Renamed SelectionIndicatorManager.selectionModel to items.
  • Renamed SelectionIndicatorManager.model to domain.
  • Renamed commands MOVE_FOCUS_BACK and MOVE_FOCUS_FORWARD to MOVE_FOCUS_LEFT and MOVE_FOCUS_RIGHT.
  • Removed the animateScrollCommands property and CanvasControl.AnimateScrollCommandsProperty field. Change animatedViewportChanges property instead.
  • Renamed the CanvasComponent.autoDrag property to AutoScrollOnBounds.
  • Renamed the CanvasComponent.autoDragInsets property to autoScrollPadding.
  • Renamed the ViewportChanges.AUTO_DRAG field to AutoScrollOnBounds.
  • Removed properties dragSize, dragTime and doubleClickSize of CanvasComponent class.
  • 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 CanvasComponent which are related to input devices and the corresponding EventRecognizer constants have neem renamed to conform to platform conventions.
  • The new CanvasComponent.renderTree property now encapsulates all low-level render object related API which was previously available directly on CanvasComponent.
  • The superfluous CanvasComponent.setContentRect method has been removed in favor of the setter of the contentBounds property.
  • The CanvasComponent and contentGroup parameters have been removed from the constructor of GraphModelManager. Also, the contentGroup property can no longer be set directly. Instead, the install method now sets both CanvasComponent and contentGroup.
  • Renamed Canvas properties and method parameters to CanvasComponent.
  • 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 ICanvasObject.group property has been renamed to parent.
  • Due to the switch to pointer events and the unification of code, some gestures may now start or end on an up event instead of a down event or vice versa.
  • The CanvasComponent.resources property has been removed since everything can now be customized in other ways, in particular with CSS classes.
  • The names of CanvasComponent's coordinate transformation methods now also include the source coordinate system: toPageFromView is now viewToPageCoordinates, toViewFromPage is pageToViewCoordinates, and toWorldFromPage is pageToWorldCoordinates.
  • The DOM focus state of the CanvasComponent moved from the container element to an inner child of the CanvasComponent. Therefore, 'blur' listeners on CanvasControl.div (now CanvasComponent.htmlElement) do not trigger anymore. Instead, use the focusout event on CanvasComponent.htmlElement.
  • The Color.fromArgb method has been removed. Use the Color constructor or the Color.fromRGBA method instead.
  • The events GraphComponent.graph-changed, CanvasComponent.content-margins-changed, CanvasComponent.input-mode-changed, and CanvasComponent.input-mode-context-changed have been removed.
  • The order of the arguments of the methods CanvasComponent.zoomTo and CanvasComponent.zoomToAnimated has changed.
  • The HTMLCanvasVisual.paint method has been renamed to render.
  • SizeChangedDetectionMode has been removed: The GraphComponent size is now always detected using a Resize Observer.
  • The Theme class has been removed in favor of CSS variables. The CLASSIC theme is no longer available.
  • The CanvasComponent.schedule method has been removed as it had no use.
  • The RenderModes enum is now called RenderMode, since this is not a flags enum. Also, its values WEB_GL and WEB_GL2 have been renamed to the nicer names WebGL and WebGL2.
  • Renamed CanvasComponent.div to CanvasComponent.htmlElement to reflect the less strict requirement for its hosting element.
  • Renamed the values of the ScrollBarVisibility enum to be more clear:
    • ScrollBarVisibility.NEVER is now ScrollBarVisibility.HIDDEN.
    • ScrollBarVisibility.AS_NEEDED_DYNAMIC is now ScrollBarVisibility.AUTO.
    • ScrollBarVisibility.ALWAYS is now ScrollBarVisibility.VISIBLE.

Incompatible Behavior Changes

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

See the related new features.

Rendering

Incompatible API Changes

  • The VOID_VISUAL_CREATOR class was removed. Use the IObjectRenderer.VOID_OBJECT_RENDERER singleton instead.
  • 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 ICanvasObjectDescriptor class has been renamed to IObjectRenderer.
  • The ICanvasObjectInstaller interface has been removed.
  • 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, DEFAULT_LABEL_DESCRIPTOR, defaultNodeDescriptor, DEFAULT_PORT_DESCRIPTOR, edgeDescriptor, edgeLabelDescriptor, nodeDescriptor, nodeLabelDescriptor, portDescriptor, portLabelDescriptor, provideUserObjectOnMainCanvasObject, getCanvasObject, GetCanvasObjectGroup, GetCanvasObjectGroup, GetCanvasObjectGroup, GetCanvasObjectGroup, and getMainCanvasObject have been renamed to DEFAULT_EDGE_RENDERER, DEFAULT_LABEL_RENDERER, DEFAULT_NODE_RENDERER, DEFAULT_PORT_RENDERER, 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 CANDIDATE_DRAWING_VALID_NON_FOCUSED_KEY, CANDIDATE_DRAWING_VALID_FOCUSED_KEY, CANDIDATE_DRAWING_INVALID_NON_FOCUSED_KEY, and CANDIDATE_DRAWING_INVALID_FOCUSED_KEY 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 VIEWPORT_TEMPLATE_KEY static property.
  • The new marqueeRenderer property on the MarqueeSelectionInputMode class replaces the template property and MARQUEE_RECTANGLE_TEMPLATE_KEY static property.
  • The new finishRegionRenderer property on the LassoSelectionInputMode class replaces the finishRegionTemplate and finishRegionHighlightTemplate properties and the FINISH_REGION_TEMPLATE_KEY and FINISH_REGION_HIGHLIGHT_TEMPLATE_KEY static properties.
  • The LASSO_STROKE_KEY and LASSO_FILL_KEY static properties on LassoSelectionInputMode were removed.
  • The new candidateRenderer property on the LabelPositionHandler class replaces the candidateTemplate and highlightTemplate properties and the CANDIDATE_TEMPLATE_KEY and HIGHLIGHT_TEMPLATE_KEY static properties.
  • The getCanvasObject and getCanvasObjects methods of class CanvasComponent 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 GraphOverviewComponent is now called GraphOverviewRenderer and of type IObjectRenderer.
  • The classes GraphOverviewSvgVisualCreator, GraphOverviewCanvasVisualCreator, GraphOverviewWebGLVisualCreator, and WebGL2GraphOverviewVisualCreator were replaced by the GraphOverviewRenderer class, which implements IObjectRenderer. The new class uses canvas rendering. The other rendering methods were removed from the library. There is a demo implementation for SVG rendering in the overview styles demo.

See the related new features.

Selection, Focus, Highlight

Incompatible API Changes

  • Class FocusIndicatorManager no longer implements INotifyPropertyChanged.
  • Replaced event FocusIndicatorManager.property-changed with event focused-item-changed.
  • Renamed Method FocusIndicatorManager.onPropertyChanged to onFocusedItemChanged and changed signature.
  • 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 GraphComponent 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.
  • FocusIndicatorManager.showFocusPolicy changed its default to the new WHEN_USING_KEYBOARD. The old policy called ONLY_WHEN_FOCUSED is now called WHEN_FOCUSED.
  • HighlightIndicatorManager now by default uses the new GraphComponent.highlights collection. Adding, removing, and clearing highlights should now be done via the GraphComponent.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.

See the related new features.

Styles

Incompatible API Changes

  • Class TableNodeStyle no longer implements INotifyPropertyChanged.
  • 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.
  • The Wrapped property of CollapsibleNodeStyleDecorator, IndicatorNodeStyleDecorator, IndicatorEdgeStyleDecorator, IndicatorLabelStyleDecorator, IndicatorPortStyleDecorator, ShadowNodeStyleDecorator, and IconLabelStyle has been renamed to wrappedStyle.
  • 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 deprecated styles BevelNodeStyle, PanelNodeStyle and ShinyPlateNodeStyle have been removed.
  • Renamed some values of TextWrappingShape and ShapeNodeShape:
    • Triangle2 is now TRIANGLE_POINTING_DOWN.
    • Hexagon2 is now HEXAGON_STANDING.
  • Removed the following values from ShapeNodeShape: SHEARED_RECTANGLE, SHEARED_RECTANGLE2, Trapez, Trapez2, FAT_ARROW, and FAT_ARROW2.
    • Use the ArrowNodeStyle for more flexible visualizations of these geometries.
  • Renamed STAR5_UP 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: SHEARED_RECTANGLE, SHEARED_RECTANGLE2, Trapez, and Trapez2.
  • The IArrow interface now requires the cropAtPort property to be provided by implementations. For backward compatibility return false in simple subclasses.
  • Removed TemplateNodeStyle, StringTemplateNodeStyle, TemplateLabelStyle, StringTemplateLabelStyle, TemplatePortStyle, StringTemplatePortStyle, TemplateStripeStyle and StringTemplateStripeStyle. Alternatively, use LitNodeStyle from the yFiles demos, or implement a custom style.
  • The SolidColorFill class has been removed because the Color class takes over its functions.
  • The MarkupLabelStyle no longer inherits from DefaultLabelStyle.
  • WebGLImageNodeStyle: renamed background visual properties: shape → backgroundShape, fill → backgroundFill, stroke → backgroundStroke.
  • Renamed textDecoration to TextDecorations to reflect its enum flags characteristic.
  • Removed TextDecoration.BLINK enum value.
  • Renamed WebGL2IconNodeStyle to WebGLImageNodeStyle.
    • Renamed its icon property to image.
    • Renamed its iconColor property to imageColor.
  • The VoidNodeStyle, VoidEdgeStyle, VoidLabelStyle, VoidPortStyle, VoidStripeStyle classes, and the respective renderer classes were removed. Use one of the following constant singletons instead: INodeStyle.VOID_NODE_STYLE, IEdgeStyle.VOID_EDGE_STYLE, ILabelStyle.VOID_LABEL_STYLE, IPortStyle.VOID_PORT_STYLE, and IStripeStyle.VOID_STRIPE_STYLE.
  • The VoidShapeGeometry and VoidPathGeometry classes were removed. Use one of the following constant singletons instead: IShapeGeometry.VOID_SHAPE_GEOMETRY and IPathGeometry.VOID_PATH_GEOMETRY.
  • The ImageNodeStyle.image property has been renamed to `href`.
  • The ImageNodeStyle.fallbackImage property has been removed.
  • The ImageNodeStyleRenderer.TEMPLATE_KEY has been removed.
  • Removed fontWeight enum in favor of setting the font's weight as string.
  • The values of the TextWrapping enum have been renamed to distinguish those that wrap the lines from those that don't.
  • The DefaultLabelStyle.clipText and MarkupLabelStyle.clipText properties have been removed. In case a label text should be clipped but not wrapped, use the TextWrapping.CLIP policy.
  • Font's equals implementation now check for value equality instead of only looking for referential equality.

Incompatible Behavior Changes

  • The default line spacing has been reduced to 0.2 to better match the platform defaults.
  • The default value of the DefaultLabelStyle.wrapping and MarkupLabelStyle.wrapping properties has been changed to TextWrapping.WRAP_WORD_ELLIPSIS.

See the related new features.

WebGL

Incompatible API Changes

  • The type of the WebGLLabelStyle.padding and WebGLIconLabelStyle.padding properties is now Insets instead of a single number.
  • Made WebGLTextureRendering a non-flag enum.
  • The WebGL2ShapeNodeShape.HEXAGON2 property is now called HEXAGON_STANDING.
  • Style setters on the WebGL2GraphModelManager have been removed.
  • Replaced "WebGL2" prefix with "WebGL" for the following types: WebGL2Animation, WebGL2AnimationDirection, WebGL2AnimationEasing, WebGL2AnimationTiming, WebGL2ArcEdgeStyle, WebGL2ArrowType, WebGL2BeaconAnimationType, WebGL2BeaconNodeIndicatorStyle, WebGL2BridgeEdgeStyle, WebGL2DashStyle, WebGL2DefaultLabelStyle, WebGL2EdgeIndicatorStyle, WebGL2Effect, WebGL2FadeAnimationType, WebGL2FocusIndicatorManager, WebGL2GraphModelManager, WebGL2GraphModelManagerRenderMode, WebGL2GroupNodeStyle, WebGL2HighlightIndicatorManager, WebGL2IconLabelStyle, WebGL2IndicatorType, WebGL2LabelIndicatorShape, WebGL2LabelIndicatorStyle, WebGL2LabelShape, WebGL2LineCap, WebGL2NodeIndicatorShape, WebGL2NodeIndicatorStyle, WebGL2PolylineEdgeStyle, WebGL2PulseAnimationType, WebGL2ScaleAnimationType, WebGL2SelectionIndicatorManager, WebGL2ShakeAnimationType, WebGL2ShapeNodeShape, WebGL2ShapeNodeStyle, WebGL2Stroke, WebGL2TextureRendering, WebGL2Transition, WebGL2TransitionProperties, WebGL2Visual.
  • The RenderModes.WEB_GL enum value and the WebGLShapeNodeStyle, WebGLImageNodeStyle, WebGLPolylineEdgeStyle, WebGLTaperedEdgeStyle, and GraphOverviewWebGLVisualCreator classes have been removed.
  • The textAlignment property in WebGLLabelStyle was renamed to horizontalTextAlignment.
  • Class WebGLAnimation no longer implements IAnimation but is still accepted in IAnimation.createParallelAnimation and IAnimation.createSequentialAnimation through auto-conversion.

See the related new features.

Interaction

Incompatible API Changes

  • Removed the PortRelocationHandle.createDummyEdgeVisualCreator method. To change the preview edge's style overwrite PortRelocationHandle.createPreviewEdge instead.
  • 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 LabelPositionHandler.useFinder property has been removed.
  • The protected virtual createEdgeCreationInputModeContext method on the CreateEdgeInputMode class has been removed. Use or override the createInputModeContext method, instead.
  • The ToolTipQueryEventArgs class is now named QueryToolTipEventArgs to properly match the corresponding event's name.
  • Renamed DoubleClickPolicy to ClickReportingPolicy.
  • Renamed ClickInputMode.doubleClickPolicy to ClickReportingPolicy.
  • Renamed DoubleClickPolicy.INITIAL_SINGLE_AND_DOUBLE_CLICK to ClickReportingPolicy.INSTANT.
  • Renamed DoubleClickPolicy.DOUBLE_CLICK_ONLY to WAIT_FOR_DOUBLE_CLICK.
  • Removed DoubleClickPolicy.BOTH_SINGLE_CLICKS_AND_DOUBLE_CLICK.
  • Changed the default of ClickInputMode.clickReportingPolicy to ClickReportingPolicy.INSTANT.
  • Removed the preventNextDoubleClick method from ClickInputMode class. Use the Cancel method instead.
  • The LassoSelectionEventArgs.selectionPath property has been renamed to Path.
  • The core onMarqueeSelect and onLassoSelect methods of GraphEditorInputMode and GraphViewerInputMode, that take an enumerable and predicate, have been removed while the other onMarqueeSelect and onLassoSelect method got an additional parameter of type SelectionPolicy.
  • Renamed DropInputMode.mousePosition to pointerPosition.
  • Renamed DropInputMode.captureMouseInputDuringDrag to capturePointerInputDuringDrag.
  • Renamed ItemDropInputMode.snappedMousePosition to snappedPointerPosition.
  • The generic type of the IHitTester interface has been removed. Instead, a parameter of type GraphItemTypes has been added to its enumerateHits method.
  • Renamed LabelDropInputMode.useBestMatchingParameter and PortDropInputMode.useBestMatchingParameter to useLocationForParameter.
  • Events which involve item changes triggered by input modes are now of type InputModeItemEventArgs instead of ItemEventArgs. These are the events:
    • CreateBendInputMode: bend-created.
    • CreateEdgeInputMode: start-port-candidate-changed, end-port-candidate-changed, edge-created, port-added, edge-creation-started.
    • GraphEditorInputMode: label-edited, label-added, node-created, port-added.
    • ItemDropInputMode and inheritors: item-created.
    • NavigationInputMode: group-collapsing, group-collapsed, group-expanding, group-expanded, group-entering, group-entered, group-exiting, group-exited.
    • TableEditorInputMode: deleted-item.
    • EditLabelInputMode: label-added, label-editing-started, label-editing-canceled, label-edited.
    • StripeDropInputMode: stripe-created.
  • Events which involve item deletion or structural changes triggered by input modes are now of type InputModeItemChangedEventArgs:
    • GraphEditorInputMode.deleted-item: InputModeItemChangedEventArgs instead of ItemDeletedEventArgs.
    • GraphEditorInputMode.edge-ports-changed: InputModeItemChangedEventArgs instead of EdgeEventArgs.
    • GraphEditorInputMode.node-reparented: InputModeItemChangedEventArgs instead of NodeEventArgs.
    • EditLabelInputMode.label-deleted: InputModeItemChangedEventArgs instead of LabelEventArgs.
  • Renamed "Source" to "Start" and "Target" to "End" in the following members of CreateEdgeInputMode class:
    • Renamed resolveSourcePortCandidates to resolveStartPortCandidates.
    • Renamed resolveTargetPortCandidates to resolveEndPortCandidates.
    • Renamed source-port-candidate-changed to start-port-candidate-changed.
    • Renamed target-port-candidate-changed to end-port-candidate-changed.
    • 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 source-port-candidate-changed to start-port-candidate-changed.
    • Renamed target-port-candidate-changed to end-port-candidate-changed.
    • Renamed getSource to getStartPortOwner.
    • Renamed getTargetNode to getEndPortOwner.
    • Renamed lookupSourcePortCandidateProvider to getStartPortCandidateProvider.
    • Renamed lookupTargetPortCandidateProvider to getEndPortCandidateProvider.
    • Renamed GetSourcePortCandidates to getStartPortCandidates.
    • Renamed GetTargetPortCandidates to getEndPortCandidates.
    • Renamed GetSourcePortCandidate(PointD) to getStartPortCandidate.
    • Renamed getSourcePortCandidate(IEnumerable<IPortCandidate>, Point, 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.
  • 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.
  • ICanvasContext.DEFAULT and ICanvasContext.createCanvasContext have been removed. A valid ICanvasContext can be retrieved from the CanvasComponent.canvasContext property.
  • IInputModeContext.EMPTY has been removed. A valid IInputModeContext can be retrieved using CanvasComponent.inputModeContext property.
  • The factory methods for input mode contexts on the IInputModeContext interface have been removed. Appropriate IInputModeContext implementations can be obtained using InputModeContext class with CanvasComponent.inputModeContext as parent context.
  • The static fields ALL_NODE_CANDIDATES and ALL_NODE_AND_EDGE_CANDIDATES on IEdgeReconnectionPortCandidateProvider 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.
  • CreateEdgeInputMode's methods have been renamed:
    • getClosestSourceCandidate to selectClosestStartCandidate.
    • getClosestCandidate to selectClosestCandidate.
    • getClosestTargetCandidate to selectClosestEndCandidate.
  • CreateEdgeInputMode.startPortCandidateHitRadius now is defined in view coordinates.
  • 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 textProvider parameter for ToolTipInputMode's constructor has been removed. An event handler for the query-tool-tip event can be registered instead.
  • Removed callbacks which only raised the related events (e.g. OnContentBoundsChanged) from classes CanvasComponent and GraphComponent. Use the corresponding events (e.g. ContentBoundsChanged) instead.
  • 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 CanvasComponent class. Use the respective methods of RenderTree class instead.
  • The MouseHoverInputMode class has been renamed to ToolTipInputMode.
  • The GraphInputMode.mouseHoverInputMode property has been renamed to ToolTipInputMode.
  • 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.
  • NavigationInputMode's findNearestItem method now gets the startItem rather than the location of it and this item is also included in the itemsToCheck parameter. Implementations may use the new getReferenceLocation to find the starting location and should make sure not to return the startItem itself.
  • The protected Should- methods of the input modes have been removed and replaced by predicate properties.
  • The event GraphEditorInputMode.label-text-changed has been changed to label-edited 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, label-deleted, label-text-editing-started, label-text-editing-canceled, ValidateLabelEditing. The events label-editing and label-adding have been moved to EditLabelInputMode and renamed to query-label-editing and query-label-adding, 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, label-deleted, label-text-editing-started, label-text-editing-canceled, ValidateLabelEditing. The events label-editing and label-adding have been moved to EditLabelInputMode and renamed to query-label-editing and query-label-adding, respectively, to clarify their purpose.
  • Replaced MouseEventArgs and TouchEventArgs 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 item-tapped, item-double-tapped, and canvas-tapped from GraphInputMode in favor of checking the PointerType on the corresponding Click event.
  • 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 MoveLabelInputMode class and its corresponding property on GraphEditorInputMode have been removed. Label movement is now handled directly by MoveInputMode.
  • 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 event deleted-selection of GraphEditorInputMode now uses ItemsEventArgs instead of SelectionEventArgs.
  • Renamed GraphInputMode.shouldSelectItem to shouldSelect.
  • 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.
  • Removed the PortRelocationHandle.GHOST_VISUALIZATION_STROKE_KEY constant. Use the new .yfiles-edge-relocation-ghost CSS class instead.
  • The LassoTestables.ALWAYS and SINGLE singletons have been moved to the ILassoTestable type.
  • The CanvasComponent listens to and handles PointerEvents to intercept user input. Custom styles might need to handle pointer-down events to ensure proper click events will be delivered to listeners.
  • Snapping override (i.e. disable snapping temporarily) is now recognized by pressing the command key on the macOS platform.
  • Added META_KEY to DragDropKeyStates.
  • Removed KeyEventArgs.originalSource which is already covered by KeyEventArgs.OriginalEvent.target.
  • Renamed KeyEventArgs.alt to KeyEventArgs.altKey.
  • Renamed KeyEventArgs.shift to KeyEventArgs.shiftKey.
  • Renamed KeyEventArgs.control to KeyEventArgs.ctrlKey.
  • Renamed KeyEventArgs.meta to KeyEventArgs.metaKey.
  • The MouseEventArgs.wheelDelta property has been renamed to wheelDeltaY.
  • The MouseEventArgs.scrollAmount property has been removed.
  • Removed CanvasComponent.KeyPress event and associated KeyEventType.Press. Instead, use the key-down event or listen to the browser's (deprecated) "keypress" event.
  • Renamed ModifierKeys.WINDOWS to ModifierKeys.META.
  • The order of the two parameters of the EventRecognizer function was reversed.
  • The CSS class for all snap references was renamed from yfiles-snap-line to yfiles-snap-reference.
  • The SNAP_LINE_STROKE_KEY was removed.
  • The toolTip class has been removed.

Incompatible Behavior Changes

  • Changed the default of PopulateContextMenuEventArgs.showMenu to false.
  • Changed the default of TextEditorInputMode.textBoxPlacementPolicy to TextBoxPlacementPolicy.MOVE_TEXT_BOX.
  • The GraphInputMode.findItems method now considers the actual z-order of the hit items.
  • GraphEditorInputMode's moveUnselectedItemsInputMode now only moves unselected items. Previously it also moved selected items despite its name.
  • 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.
  • LabelDropInputMode.isValidLabelOwner now only accepts FreeLabelModel or that the draggedLabel's owner type matches the owner type e.g. INode, IEdge, or IPort.
  • 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.
  • The default value of enableSnappingRecognizer in CreateEdgeInputMode, HandleInputMode, and MoveInputMode has been changed from CTRL_UP to ALT_UP.
  • The default value of disableSnappingRecognizer in CreateEdgeInputMode, HandleInputMode, and MoveInputMode has been changed from CTRL_DOWN to ALT_DOWN.
  • The default value of centerReshapeRecognizer in NodeReshapeHandleProvider and ReshapeHandlerHandle has been changed from ALT_IS_DOWN to CtrlIsDown.
  • The default value of ReparentNodeHandler.reparentRecognizer has been changed from SHIFT_IS_DOWN to CtrlIsDown.
  • GraphEditorInputMode.allowGroupingOperations is now true by default.
  • Refined the event sequence of CreateEdgeInputMode to ensure consistency and symmetry between gesture cancellation and completion.
  • Reorganized the sequence to include edge-creation-started 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 gesture-finishing, allowing users to apply final updates to the end port.
  • Ensured the following event order for gestures:
    • gesture-starting, gesture-started.
    • Cancellation path: gesture-canceling, gesture-canceled.
    • Completion path: edge-creation-started, gesture-finishing, edge-created, gesture-finished.
  • The edge-creation-started and edge-created events provide now arguments of type ItemEventArgs<IEdge>.
  • 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 IEdgeReconnectionPortCandidateProvider.fromSourceAndTarget.
  • 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.
  • 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.
  • The default value of CreateEdgeInputMode.portCandidateResolutionRecognizer has been changed from SHIFT_IS_DOWN to CtrlIsDown.
  • The default value of the CreateEdgeInputMode.enforceBendCreationRecognizer has been changed form CtrlIsDown to ALT_IS_DOWN.
  • The default keyboard shortcuts of several commands have been changed:
    • Command.COLLAPSE_GROUP now uses Alt+Left.
    • Command.EXPAND_GROUP now uses Alt+Right.
    • Command.ENTER_GROUP now uses Alt+Down.
    • Command.EXIT_GROUP now uses Alt+Up.
    • Command.INCREASE_ZOOM now uses Ctrl+Plus.
    • Command.DECREASE_ZOOM now uses Ctrl+Minus.
    • Command.TOGGLE_EXPANSION_STATE now uses Alt+Shift+Left and Alt+Shift+Right.
  • 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.
  • The default edge lookup doesn't provide an IPositionHandler anymore so dragging a selected edge doesn't move all its bends.
  • 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.
  • NavigationInputMode now interprets the direction of arrow keys in view coordinates by default.
  • The default lookup of labels now returns an IPositionHandler implementation.
  • 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 bend-created 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.
  • CanvasComponent.updateContentBounds now only considers the items in the RenderTree.contentGroup instead of the rootGroup when calculating the new bounds.
  • The mouse wheel events of the GraphComponent now use the browser's native {}deltaX{}, deltaY and deltaMode values. This implies that the mouse wheel behavior now also respects the client's current system settings.

See the related new features.

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 SnapResult 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 SnapResult 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 SnapResult 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 initialBounds property and the ReshapeRectangleContext.CalculateBounds method have been renamed to initialLayout and calculateLayout.
  • 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.

See the related new features.

Clipboard

Incompatible API Changes

  • The values LABEL_MODEL_PARAMETER and PORT_LOCATION_MODEL_PARAMETER have been removed from the CloneTypes enum as those parameter are typically immutable, so cloning them has no effect.
  • ElementCopiedCallback has been renamed to ItemCopiedCallback.
  • GraphViewerInputMode's elements-copied event has been renamed to items-copied.
  • GraphEditorInputMode's elements-copied, elements-cut, elements-copied, elements-pasted and elements-duplicated events were renamed to items-copied, etc.
  • GraphClipboards elements-cut, -Cutting, -Copying, -Copied, -Pasting, -Pasted, -Duplicating, and -Duplicated events were renamed to items instead of elements and use the new GraphClipboardEventArgs.
  • GraphClipboards 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.
  • 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 IModelItems as targetOwners parameter instead of a targetFilter predicate.
  • GraphClipboard.isFoldingStateElement is now an instance method and doesn't have an owner parameter anymore.
  • 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.
  • 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.
  • 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 ParentNodeDetectionModes has been reduced to contain only the mainly used options. The option root has been renamed to NONE, and the options ALLOW_SELF and FORCE as well as the MODE_MASK and MODIFIER_MASK have been removed. The targetNode 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 getTargetNode methods now take an additional ClipboardOperationContext parameter, and the getTargetNode overload for nodes also takes a pasteLocation as an additional parameter.
  • GraphComponent instances now use a shared GraphClipboard per default. To revert to the previous behavior, a new GraphClipboard instance can be set on each GraphComponent.
  • For consistency reasons, the property GraphClipboard.empty is now called isEmpty.

See the related new features.

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.

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.

See the related new features.

Lookup

Incompatible API Changes

  • The methods setLookupImplementation and getLookup have been removed from Graph. 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.
  • 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 FallbackEdgeHelper property and the OrthogonalEdgeEditingContext.getOrthogonalEdgeHelper method have been replaced by the properties fallbackEdgeHelperProvider and orthogonalEdgeHelperProvider.
  • The INodeInsetsProvider interface was renamed to IGroupPaddingProvider.
  • 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.DecorateNull. 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 CanvasComponent.inputModeContextLookup and CanvasComponent.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.

GraphML

Incompatible API Changes

  • The methods GraphMLIOHandler.addInputMapperFuture and GraphMLIOHandler.addInputHandlerFactory have been removed, together with their support classes.
  • Type and property annotations via the $meta attributes are not supported anymore. Instead, metadata has to be registered with GraphMLIOHandler.addTypeInformation.
  • The convenience GraphMLSupport class, the predefined ICommand.OPEN and ICommand.SAVE commands, and the StorageLocation enum have been removed. Use custom application code instead.
  • 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

  • Renamed ItemMapping.delegate to mapperFunction.
  • Renamed ItemCollection.delegate to predicate.
  • Renamed LayoutExtensions.MorphLayout to applyLayoutAnimated.
  • Renamed LayoutExecutor.MorphDuration to animationDuration.
  • Renamed LayoutExecutor.createMorphAnimation to createLayoutAnimation.
  • The LayoutGraphAdapter.PortDummyNodeDataKey constant has been renamed to PORT_HELPER_NODE_DATA_KEY.
  • Several expert arguments have been removed from the convenience functions applyLayout and applyLayoutAnimated. These are easedAnimation, updatedContentBound, allowUserInteraction, configureTableLayout, considerViewportLimiter and hideEdgesAtEdges.
  • Some default values of LayoutExecutor have been changed to be in line with default behavior of IGraph.applyLayout/applyLayoutAnimated that was already in place in 2.6. These are animateViewport, has changed from false to true and eased animation, has changed from false to true.
  • The parameters updateContentBounds, considerViewportLimiter, and targetBoundsInsets were removed from IGraph.applyLayout.
  • Renamed LayoutExecutorAsync.createMorphAnimation to createLayoutAnimation.
  • Boolean LayoutExecutorAsync.fixPorts property is replaced by an ItemMapping portPlacementPolicies, that allows to specify a policy for the handling of each individual port.
  • The static from method has been removed from the ItemMapping, ItemCollection, and.
  • ContextItemMapping classes.
  • The deprecated LayoutExecutorAsync.graphControl property has been removed. Use the LayoutExecutorAsync.graphComponent property instead.
  • Boolean LayoutExecutor.fixPorts property is replaced by an ItemMapping portPlacementPolicies, that allows to specify a policy for the handling of each individual port.
  • 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.
  • Replaced LayoutExecutor.labelPreferredPlacementPolicy with ItemMapping LayoutExecutor.labelPlacementPolicies.
  • Renamed Enum LabelPreferredPlacementPolicy to LabelPlacementPolicy.
  • Removed value FROM_DESCRIPTOR. PreferredPlacementDescriptors are now automatically considered when specified through LayoutDatas.
    • Renamed value FROM_MODEL to PREFER_MODEL.
    • Renamed value FROM_PARAMETER to PREFER_PARAMETER.
    • Added value KEEP_PARAMETER, 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.
  • Renamed the LayoutExecutor.duration property to animationDuration.
  • Removed the ContextItemMapping class.
  • 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.AFFECTED_NODES_DP_KEY. 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.
  • The TableLayoutConfigurator.prepare and LayoutExecutor.prepareTableLayout methods now return a PartitionGridData instance.
  • Renamed the YGraphAdapter class to StructureGraphAdapter.
    • Renamed the YGraphAdapter.yGraph property to structureGraph.
    • Renamed YGraphAdapter.createEdgeEnumerable to createOriginalEdgeList.
    • Renamed YGraphAdapter.createNodeEnumerable to createOriginalNodeList.
    • Renamed YGraphAdapter.createEdgeList to createCopiedEdgeList.
    • Renamed YGraphAdapter.createNodeList to createCopiedNodeList.
    • Renamed YGraphAdapter.createMapper to createCopiedToOriginalNodeWrapper and createCopiedToOriginalEdgeWrapper.
    • Renamed YGraphAdapter.createDataMap to createOriginalToCopiedNodeWrapper and createOriginalToCopiedEdgeWrapper.
  • Removed key LayoutGraphAdapter.ORIGINAL_TAG_DP_KEY. Use the Tag property of the layout items instead to get the original tag associated to the original IGraph items.

Incompatible Behavior Changes

  • Edges at the same port are now always automatically port grouped unless port groups have been defined explicitly.
  • 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.

See the related new features.

Layout

Incompatible API Changes

  • 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.
  • For GenericLayoutData, the methods to add an ItemMapping or an ItemCollection are now overloads and no longer include LayoutNode, LayoutEdge, etc in their name. For example, the addNodeItemCollection method is now named addItemCollection.
  • LayoutExecutor.abortHandler was removed and replaced by the two properties LayoutExecutor.stopDuration and LayoutExecutor.cancelDuration.
  • OrganicLayout: OrganicLayoutParallelSubstructureStyle has been renamed to OrganicLayoutParallelSubstructureStyle.
  • AlignmentStageAlignmentPolicy; SNAP_X_Y has been renamed to SNAP_XY.
  • Renamed the SubgraphLayout class to SubgraphLayoutStage and renamed the respective layout data class from SubgraphLayoutData to SubgraphLayoutStageData.
  • Renamed EdgeBundlingStage to BundledEdgeRouter.
  • Renamed GivenCoordinatesStage to GivenCoordinatesLayout.
  • Renamed GivenCoordinatesStageData to GivenCoordinatesLayoutData.
  • 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.
  • Renamed BendConverter to BendSubstitutionStage.
  • The OrientationLayout.horizontalOrientation property has been removed. To check for a horizontal orientation, check if Orientation property equals LayoutOrientation.LEFT_TO_RIGHT or LayoutOrientation.RIGHT_TO_LEFT.
  • 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.
  • Removed all methods and properties from Layout class.Direction and converted it to an enum.
  • Removed the NodeHalo class. Halos are now specified as Insets 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.NODE_HALO_DP_KEY to LayoutKeys.NODE_MARGIN_DATA_KEY.
  • Renamed LayoutExecutor.targetBoundsInsets to targetBoundsPadding.
  • Renamed GroupingKeys.GROUP_NODE_INSETS_DP_KEY to GROUP_NODE_PADDING_DATA_KEY and moved the key to LayoutKeys.
  • Renamed GroupingKeys.MINIMUM_NODE_SIZE_DP_KEY to LayoutKeys.MINIMUM_GROUP_NODE_SIZE_DATA_KEY.
  • Renamed InsetsGroupBoundsCalculator.defaultInsets to GroupBoundsCalculator.defaultPadding and InsetsGroupBoundsCalculator.considerNodeHalos to GroupBoundsCalculator.considerNodeMargins.
  • Renamed TemporaryGroupDescriptor.insets to Padding.
  • Renamed Graph.reInsertNode/Edge to LayoutGraph.reinsert.
  • LayoutGraphHider:
    • Removed properties fireGraphEvents, Graph and methods HideEdges, hideSelfLoops, simplifyGraph, hideMultipleEdges.
    • Replaced all methodes to hide and unhide several nodes or edge by Hide(IEnumerable<Node>), Hide(IEnumerable<Edge>) and Unhide(IEnumerable<Node>), Unhide(IEnumerable<Edge>).
  • PortCalculator, IIntersectionCalculator, and IntersectionCalculatorKeys have been removed. Instead, the LayoutExecutor.portAdjustmentPolicy property should be set to a suitable value.
  • Renamed BorderLine.createMin to createMinimum.
  • Renamed BorderLine.createMax to createMaximum.
  • GraphPartitionManager is removed, LayoutGraphHider provides the same functionality.
  • 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.
  • Renamed MirrorModes to MirroredOrientations and OrientationLayout.mirrorMode to MirroredOrientations.
  • 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.
  • 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.
  • Replaced properties xOffset and yOffset of Layout class.PortCandidate by a single property offset of type Point.
  • SequentialLayout: updated Layouts property to be a read-only List<ILayoutAlgorithm>. Removed appendLayout, appendLayouts, and removeAll methods, as their functionality is now handled by the list methods.
  • PortConstraints and PortCandidates have been unified and renamed to LayoutPortCandidate.
  • PortDirections and PortSide have been unified as PortSides. 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 port-related properties of the layout data classes (sourcePortGroupIds, targetPortGroupIds, sourcePortCandidates, targetPortCandidates) have been moved to a sub-data accessible via the property ports.
  • 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 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.
  • Merged MinimumSizeGroupBoundsCalculator and InsetsGroupBoundsCalculator into the new GroupBoundsCalculator class.
  • LayoutMultiplexer has been removed. The features of ComponentLayout (COMPONENT_LAYOUT_DATA_KEY) or RecursiveGroupLayout (GROUP_NODE_LAYOUT_DATA_KEY) can be used instead.
  • 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 SnapOuterPortsToNodeBorderStage class has been removed.
  • Removed NormalizeGraphElementOrderStage. Use nodeComparator and edgeComparator of LayoutExecutor instead.
  • 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.LOW_QUALITY. It is however not compatible with advanced features like integrated edge label placement.
  • The utility PortConstraintConfigurator class has been removed.
  • Removed the classes PartitionLayout and PartitionLayoutData.
  • The FamilyTreeLayout class has been removed.
  • Removed SplitEdgeStage.
  • The read/write properties MinimumSizeGroupBoundsCalculator.minimumNodeSizeDpKey, MinimumSizeGroupBoundsCalculator.groupNodeInsetsDpKey and InsetsGroupBoundsCalculator.groupNodeInsetsDpKey have been removed. The bounds calculator classes now always use the values defined via the keys LayoutKeys.MINIMUM_GROUP_NODE_SIZE_DATA_KEY and LayoutKeys.GROUP_NODE_PADDING_DATA_KEY. 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.SUBGRAPH_NODES_DATA_KEY and SubgraphLayoutStage.SUBGRAPH_EDGES_DATA_KEY.
  • Removed LayoutKeys.NODE_ID_DP_KEY and LayoutKeys.EDGE_ID_DP_KEY.
  • The HandleNaNCoordinatesStage has been removed.
  • Class MultiStageLayout has been removed from the API. The classes HierarchicalLayout (formerly HierarchicLayout), OrganicLayout, OrthogonalLayout, TreeLayout, RadialTreeLayout (formerly BalloonLayout), SeriesParallelLayout, RadialLayout, CompactDiskLayout, and RadialGroupLayout (formerly CactusGroupLayout) now directly implement ILayoutAlgorithm. These classes offer a new layoutStages property that allows to access the mutable stack of ILayoutStages associated with the respective algorithm. In addition, the offer different new properties to directly access frequently used stages.
  • 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 EdgeRoutingStyle enum has been renamed to EdgeRouterRoutingStyle.
    • The EdgeRoutingStyle enum has been renamed to SingleLayerSubtreePlacerRoutingStyle.
    • The LayeredRoutingStyle enum has been renamed to LevelAlignedSubtreePlacerRoutingStyle.
    • The EdgeRoutingStrategy enum has been renamed to RadialLayoutRoutingStyle.
    • The EdgeRoutingStrategy enum has been renamed to PartialLayoutRoutingStyle.
    • The EdgeRoutingStyle enum has been renamed to HierarchicalLayoutRoutingStyle while the old RoutingStyle class has been renamed to RoutingStyleDescriptor.
  • 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.
  • Removed public methods hideGroupNodes and unhideGroupNodes of GroupHidingStage.
  • Moved nested BorderLine class.Segment to top-level BorderLineSegment class.
  • Renamed Grow to Enlarge, addOffset to addPositionOffset, Min to minPosition and Max to maxPosition.
  • Removed the BorderLine.adoptValues method.
  • Removed BorderLine.prev and BorderLine.next. Use methods BorderLineSegment.previous and BorderLineSegment.next instead.
  • Converted BorderLine.firstSegment, BorderLine.lastSegment, BorderLineSegment.previous and BorderLineSegment.next from methods to readonly properties. Renamed Prev to Previous.
  • Removed the Maps class.
  • Layout data properties that are meant for publishing results now contain the word Result in their name: Renamed CircularLayoutData.circleIds to CircularLayoutData.circleIdsResult, HierarchicLayoutData.layerIndices to HierarchicalLayoutData.layerIndicesResult, HierarchicLayoutData.sequenceIndices to HierarchicalLayoutData.sequenceIndicesResult, OrganicLayoutData.zCoordinates to OrganicLayoutData.zCoordinatesResult, RadialLayoutData.nodeInfos to RadialLayoutData.nodePlacementsResult, and ParallelEdgeRouterData.routedParallelEdges to ParallelEdgeRouterData.routedMultiEdgesResult.
    • They are now all made readonly and initialized with an IMapper instance.
  • 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.
  • 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 Insets.EMPTY, Size.EMPTY and Insets.EMPTY, meaning that the behavior does not change.
  • 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.
  • Methods and and properties with "BoundingBox" in their name have been renamed to include "Bounds" instead.
  • Removed the YPointPath class. Instead of this class an array or more generally an IEnumerable of type Point[] is now used in API members.
    • Changed value to of HierarchicLayout.ALTERNATIVE_EDGE_PATH_DP_KEY, ClearAreaLayout.EXPANDED_NODE_ORIGINAL_EDGE_PATH_DP_KEY and GivenCoordinatesStage.EDGE_PATH_DP_KEY to IEnumerable<Point>.
    • Changed EdgeRouterBusDescriptor properties busPoints and computedBusPoints to type Point[].
  • 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 LayoutGraph.addDataProvider and removeDataProvider. Data is now registered and removed using the methods on the new LayoutGraphContext class (e.g. addItemData, addData, remove).
    • Removed the LayoutGraph.dataProviderKeys property.
  • Removed the look-up keys GroupingKeys.GROUP_DP_KEY, GroupingKeys.NODE_ID_DP_KEY and GroupingKeys.PARENT_NODE_ID_DP_KEY 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 GraphDpKey class was replaced by ValueDataKey.
  • Removed the GraphTransformer class; use factory methods from LayoutTransformations class instead to create stages that apply transformation operations on a LayoutGraph.
  • Replaced IComparer interface usages with Comparison function delegates.
  • Removed the LayoutGraphUtilities class. The new LayoutEdge.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.

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.

See the related new features.

Layout Data

Incompatible API Changes

  • The type SingleItem<TItem> was removed. Affected properties use ItemCollection<TItem> instead.
  • Properties of type ItemMapping in LayoutData classes are now named using plural consistently.
  • 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.LAYER_INDEX_RESULT_DATA_KEY, HierarchicalLayout.SEQUENCE_INDEX_RESULT_DATA_KEY, GivenLayersAssigner.LAYER_INDEX_DATA_KEY, RadialLayout.LAYER_ID_DATA_KEY and CircularLayout.CIRCLE_ID_RESULT_DATA_KEY has been changed from number to a nullable number value. Null as value means that the nothing was published for an item.

Hierarchical Layout

Incompatible API Changes

  • 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.
  • Removed groupCompactionStrategy.
  • Renamed SimplexNodePlacer.groupCompactionStrategy to groupCompaction and changed its type to boolean.
  • 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.
  • HierarchicalLayout.gridSpacing: made grid spacing behavior consistent across all layouts by throwing an exception for negative values.
  • 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.
  • Renamed LayerType to HierarchicalLayoutLayerType.
  • Renamed DefaultLayerSequencer to DefaultSequencer.
  • Renamed all types, methods and properties containing "hierarchic" to "hierarchical" including HierarchicLayout, which is renamed to HierarchicalLayout.
  • Moved HierarchicLayout.stopAfterLayering/Sequencing to HierarchicalLayoutCore.
  • Replaced HierarchicLayout properties BackLoopRouting & backLoopRoutingForSelfLoops with HierarchicalLayoutEdgeDescriptor.backLoopRouting, where it can now be specified per edge (HierarchicalLayoutData.edgeDescriptors) or for all edges at once (HierarchicalLayout.defaultEdgeDescriptor).
  • Removed properties sourcePortOptimization and targetPortOptimization from HierarchicalLayoutEdgeDescriptor class.
  • LayerConstraintData no longer inherits from LayoutData.
  • SequenceConstraintData no longer inherits from LayoutData.
  • Renamed IPortAllocator to IHierarchicalLayoutPortAssigner.
  • Renamed DefaultPortAllocator to HierarchicalLayoutPortAssigner.
  • Separated HierarchicLayout.INCREMENTAL_HINTS_DP_KEY in INCREMENTAL_NODE_HINTS_DATA_KEY and INCREMENTAL_EDGE_HINTS_DATA_KEY.
  • 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.
  • 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 EdgeLayoutDescriptor to HierarchicalLayoutEdgeDescriptor.
  • Renamed HierarchicLayout.edgeLayoutDescriptor to defaultEdgeDescriptor.
  • Renamed and moved HierarchicLayoutCore.EDGE_LAYOUT_DESCRIPTOR_DP_KEY to HierarchicalLayout.EDGE_DESCRIPTOR_DATA_KEY.
  • Renamed HierarchicLayoutData.edgeLayoutDescriptors to edgeDescriptors.
  • Renamed NodeLayoutDescriptor to HierarchicalLayoutNodeDescriptor.
  • Renamed HierarchicLayout.nodeLayoutDescriptor to defaultNodeDescriptor.
  • Renamed and moved HierarchicLayoutCore.NODE_LAYOUT_DESCRIPTOR_DP_KEY to HierarchicalLayout.NODE_DESCRIPTOR_DATA_KEY.
  • Renamed HierarchicLayoutData.nodeLayoutDescriptors to nodeDescriptors.
  • 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.LAYER_ID_DP_KEY to LAYER_INDEX_DATA_KEY.
  • Renamed HierarchicLayoutData.givenLayersLayererIds to givenLayersIndices.
  • Removed HierarchicLayoutData.constraintIncrementalLayererAdditionalEdgeWeights.
  • Renamed AsIsSequencer to FromSketchSequencer.
  • 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 IEdgeReverser interface and the HierarchicLayoutCore.createEdgeReverser method have been 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.
  • EdgeRouterBusDescriptor is renamed to GridComponentDescriptor.
  • HierarchicLayout.BUS_DESCRIPTOR_DP_KEY is renamed to GRID_COMPONENT_DESCRIPTOR_DATA_KEY.
  • HierarchicLayoutData.buses is renamed to gridComponents.
  • HierarchicLayoutData.busRootOffsets is renamed to gridComponentRootOffsets.
  • NodeDataType.BUS_STRUCTURE_DUMMY is renamed to GRID_COMPONENT_BUS_NODE.
  • 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.REDIRECTED_GROUP_EDGE has been removed.
  • 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.
  • Names containing PortBorderGap were renamed to now contain BorderToPortGapRatio.
  • Properties HierarchicLayout.recursiveGroupLayering and HierarchicLayout.compactGroups are combined into HierarchicalLayout.groupLayeringPolicy.
  • 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.
  • Renamed NodeDataType to HierarchicalLayoutNodeType and its value Normal to HierarchicalLayoutNodeType.REGULAR.
  • Renamed 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.
  • The HierarchicLayout.orthogonalRouting property has been removed. To specify orthogonal or other routing styles, the routing style on the HierarchicalLayoutEdgeDescriptor must be used instead.
  • IPortConstraintOptimizer has been renamed to IPortCandidateSelector, and its methods have been renamed from optimizeAfterLayering and optimizeAfterSequencingForSingleNode 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.
  • The IPortCandidateMatcher interface has been removed. For an advanced customization of the port selection consider implementing a custom IPortCandidateSelector.
  • 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 groupTransposition property has been removed from DefaultLayerSequencer class. The Transposition property should now be used for groups too.
  • 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 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.
  • 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.
  • 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.LAYER_CONSTRAINTS_MEMENTO_DP_KEY and HierarchicLayout.SEQUENCE_CONSTRAINTS_MEMENTO_DP_KEY.
  • Class TopLevelGroupToSwimlaneStage has been removed from the library.
  • The obsolete extension methods createLayerConstraintFactory and createSequenceConstraintFactory have been removed from HierarchicLayout. To specify layer and sequence constraints, use LayoutData instead.

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.

See the related new features.

Tree Layout

Incompatible API Changes

  • 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.
  • 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.
  • 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.
  • 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.
  • Renamed IProcessor to ISubtreePlacerProcessor.
  • DelegatingNodePlacer now implements ISubtreePlacer instead of IFromSketchNodePlacer.
  • BusNodePlacer now implements ISubtreePlacer instead of IFromSketchNodePlacer.
  • Replaced RotatableNodePlacerMatrix with the SubtreeTransform enum and renamed constants:
    • RotatableNodePlacerMatrix.DEFAULT to SubtreeTransform.NONE.
    • RotatableNodePlacerMatrix.MIR_HOR to SubtreeTransform.FLIP_Y.
    • RotatableNodePlacerMatrix.MIR_VERT to SubtreeTransform.FLIP_X.
    • RotatableNodePlacerMatrix.ROT90 to SubtreeTransform.ROTATE_LEFT.
    • RotatableNodePlacerMatrix.ROT180 to SubtreeTransform.ROTATE_180.
    • RotatableNodePlacerMatrix.ROT270 to SubtreeTransform.ROTATE_RIGHT.
    • RotatableNodePlacerMatrix.MIR_VERT_ROT90 to SubtreeTransform.ROTATE_RIGHT_FLIP_Y.
    • RotatableNodePlacerMatrix.MIR_HOR_ROT90 to SubtreeTransform.ROTATE_LEFT_FLIP_Y.
  • 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 the property RoutingStyle.Polyline to SingleLayerSubtreePlacerRoutingStyle.STRAIGHT_LINE_TO_CHILD_CONNECTOR, RoutingStyle.FORK property to SingleLayerSubtreePlacerRoutingStyle.ORTHOGONAL, and RoutingStyle.FORK_AT_ROOT property to SingleLayerSubtreePlacerRoutingStyle.ORTHOGONAL_AT_ROOT.
  • Added SingleLayerSubtreePlacerRoutingStyle.POLYLINE property which leads to a polyline routing style.
  • Removed the TreeLayout.defaultLeafPlacer property as well as LeafNodePlacer class.
  • Removed the SimpleNodePlacer class; use defaultSubtreePlacer class instead.
  • Replaced DefaultNodePlacer.childPlacement property with the new SingleLayerSubtreePlacer.transformation property. The former
    ChildPlacement.HORIZONTAL_DOWNWARD value now maps to SubtreeTransform.NONE, ChildPlacement.HORIZONTAL_UPWARD to SubtreeTransform.FLIP_Y,
    ChildPlacement.VERTICAL_TO_LEFT to SubtreeTransform.ROTATE_RIGHT, and ChildPlacement.VERTICAL_TO_RIGHT to SubtreeTransform.ROTATE_LEFT_FLIP_Y.
  • Renamed RootNodeAlignment.CENTER_OVER_CHILDREN to SubtreeRootAlignment.CENTER_OF_CHILDREN.
  • Renamed RootNodeAlignment.LEADING to SubtreeRootAlignment.LEFT, RootNodeAlignment.TRAILING to SubtreeRootAlignment.RIGHT, RootAlignment.LEADING_OFFSET to SubtreeRootAlignment.LEADING, and RootAlignment.TRAILING_OFFSET to SubtreeRootAlignment.TRAILING.
  • Renamed IPortAssignment to ITreeLayoutPortAssigner.
  • Renamed DefaultPortAssignment to TreeLayoutPortAssigner.
  • Renamed TreeLayout.PORT_ASSIGNMENT_DP_KEY to PORT_ASSIGNER_DATA_KEY.
  • Renamed TreeLayoutData.portAssignments to portAssigners.
  • Removed the NodePlacerBase class. Implement ISubtreePlacer interface instead.
  • Removed the method PlaceSubtree(LayoutNode, 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".
  • Renamed TreeLayout.multiParentAllowed to allowMultiParent.
  • Renamed TreeReductionStage.multiParentAllowed to allowMultiParent.
  • The TreeReductionStage.nonTreeEdgeLabelingAlgorithm property has been renamed to nonTreeEdgeLabeling.
  • Remove methods getPortBorderGap and getPortDistanceDelta from the DefaultPortAssignment (renamed to TreeLayoutPortAssigner) class.
  • The DefaultPortAssignment.borderGapToPortGapRatio property was renamed to borderToPortGapRatio.
  • TreeLayoutPortAssignmentMode value PortConstraint has been removed. Port candidates are always considered if they are specified.
  • TreeLayoutPortAssignmentMode values DISTRIBUTED_EAST, DISTRIBUTED_WEST, DISTRIBUTED_NORTH, DISTRIBUTED_SOUTH 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 Rect parameter instead of its deconstructed values.
  • SubtreeShape.assignValuesTo has been removed - createCopy can be used instead.
  • Renamed FillStyle to AspectRatioChildAlignmentPolicy and AspectRatioNodePlacer.fillStyle to ChildAlignmentPolicy.
  • 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.
  • The properties TreeLayout.sourcePortConstraintDataAcceptor and TreeLayout.targetPortConstraintDataAcceptor have been removed.
  • The properties TreeLayout.sourceGroupDataAcceptor
    and TreeLayout.targetGroupDataAcceptor have been removed.
  • The TreeComponentLayout class has been removed.
  • The factory TreeReductionStage.createStraightLineRouter method has been removed. The standalone router StraightLineEdgeRouter class should be used instead when straight-line edges are required.
  • The AspectRatioTreeLayout has been removed together with AspectRatioTreeLayoutData, RootPlacement, and SubtreeArrangement. Use the TreeLayout with the AspectRatioSubtreePlacer instead.
  • The ClassicTreeLayout has been removed together with the enums LeafPlacement, EdgeRoutingStyle, and PortStyle. The TreeLayout can be used instead.
  • Renamed TreeLayoutData.outEdgeComparers to TreeLayoutData.childOrder and changed the types to Comparison function.
  • Removed TreeLayout.defaultOutEdgeComparer. Use TreeLayoutData.childOrder instead. Also removed NodeOrderComparer class.
  • 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.
  • Replaced TreeLayoutData.outEdgeComparers property with new, more powerful childOrder property.

Incompatible Behavior Changes

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

See the related new features.

Orthogonal Layout

Incompatible API Changes

  • Renamed ChainLayoutStyle to OrthogonalLayoutChainSubstructureStyle.
  • Renamed CycleLayoutStyle to OrthogonalLayoutCycleSubstructureStyle.
  • Renamed TreeLayoutStyle to OrthogonalLayoutTreeSubstructureStyle.
  • Renamed EdgeLayoutDescriptor to OrthogonalLayoutEdgeDescriptor.
  • Renamed OrthogonalLayout.edgeLayoutDescriptor to defaultEdgeDescriptor.
  • Renamed OrthogonalLayout.EDGE_LAYOUT_DESCRIPTOR_DP_KEY to EDGE_DESCRIPTOR_DATA_KEY.
  • Renamed OrthogonalLayoutData.edgeLayoutDescriptors to edgeDescriptors.
  • The LayoutStyle enum (belonging to the OrthogonalLayout) has been renamed to OrthogonalLayoutMode. Furthermore, the new values are Strict (former Default), FORCED_STRAIGHT_LINE (former Box) , and Relaxed (former FIXED_MIXED). The former values Uniform, FIXED_BOX, 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 OrthogonalLayoutChainSubstructureStyle, chainSubstructureSize, OrthogonalLayoutTreeSubstructureStyle, treeSubstructureSize, treeSubstructureOrientation, OrthogonalLayoutCycleSubstructureStyle, cycleSubstructureSize.
  • The following properties have been removed from the OrthogonalLayout class: Randomization, crossingReduction, edgeLengthReduction, optimizePerceivedBends and faceMaximization. Use the new qualityTimeRatio property instead.
  • 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.EDGE_DIRECTEDNESS_DATA_KEY.
  • PartialLayout.DIRECTED_EDGES_DP_KEY is renamed to EDGE_ORIENTATION_DATA_KEY and now also allows specifying edges should be routed against the main layout orientation.
  • Removed the CompactOrthogonalLayout class.

Incompatible Behavior Changes

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

See the related new features.

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).
  • 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 type of intermediateRoutingPoints property has been changed from IList to IEnumerable.
  • Renamed ParallelEdgeRouter.ROUTED_PARALLEL_EDGES_DP_KEY to ROUTED_MULTI_EDGES_RESULT_DATA_KEY.
  • Renamed ParallelEdgeRouter.findAndHideParallelEdges to findAndHideMultiEdges.
  • Renamed ParallelEdgeRouterData.routedParallelEdges to routedMultiEdgesResult.
  • Renamed the CurveEdgeLayoutDescriptor.minimumEdgeToEdgeDistance property to minimumEdgeDistance.
  • Renamed the EdgeLayoutDescriptor.minimumEdgeToEdgeDistance property (EdgeRouter) to minimumEdgeDistance.
  • Renamed the PenaltySettings.minimumEdgeToEdgeDistancePenalty property to EdgeRouterCosts.minimumEdgeDistanceCost.
  • EdgeRouter.grid has been replaced by EdgeRouter.gridSpacing.
  • The class Grid has been removed.
  • Renamed EdgeLayoutDescriptor to EdgeRouterEdgeDescriptor.
  • Renamed CurveEdgeLayoutDescriptor to CurveRoutingEdgeDescriptor.
  • Renamed EdgeRouter.EDGE_LAYOUT_DESCRIPTOR_DP_KEY to EDGE_DESCRIPTOR_DATA_KEY.
  • 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.CURVE_EDGE_LAYOUT_DESCRIPTOR_DP_KEY to EDGE_DESCRIPTOR_DATA_KEY.
  • Renamed CurveRoutingStageData.edgeLayoutDescriptors to edgeDescriptors.
  • Renamed Interval.min to Interval.minimum.
  • Renamed Interval.max to Interval.maximum.
  • Renamed OrthogonalInterval.min to OrthogonalInterval.minimum.
  • Renamed OrthogonalInterval.max to OrthogonalInterval.maximum.
  • Renamed PenaltySettings to EdgeRouterCosts.
    • Renamed the related EdgeLayoutDescriptor.penaltySettings property to EdgeRouterCosts.
    • Renamed all its properties to XyzCost instead of XyzPenalty: sketchViolationPenalty to sketchViolationCost, edgeLengthPenalty to edgeLengthCost, bendPenalty to bendCost, edgeCrossingPenalty to edgeCrossingCost, adjacentEdgeCrossingPenalty to adjacentEdgeCrossingCost, selfCrossingPenalty to selfCrossingCost, nodeCrossingPenalty to nodeCrossingCost, portCrossingPenalty to portCrossingCost, groupNodeCrossingPenalty to groupNodeCrossingCost, nodeLabelCrossingPenalty to nodeLabelCrossingCost, edgeLabelCrossingPenalty to edgeLabelCrossingCost, minimumNodeToEdgeDistancePenalty to minimumNodeToEdgeDistanceCost, minimumGroupNodeToEdgeDistancePenalty to minimumGroupNodeToEdgeDistanceCost, minimumEdgeToEdgeDistancePenalty to minimumEdgeDistanceCost, minimumNodeCornerDistancePenalty to minimumNodeCornerDistanceCost, minimumFirstLastSegmentLengthPenalty to minimumFirstLastSegmentLengthCost, bendsInNodeToEdgeDistancePenalty to bendsInNodeToEdgeDistanceCost, monotonyViolationPenalty to monotonyViolationCost, partitionGridCellReentrancePenalty to layoutGridCellReentranceCost, portViolationPenalty to portViolationCost, invalidEdgeGroupingPenalty to invalidEdgeGroupingCost, and singleSideSelfLoopPenalty to singleSideSelfLoopCost.
  • Renamed and moved data key PartitionCellKeys.NODE_LABEL_CROSSING_COST_FACTORS_KEY to EdgeRouter.NODE_LABEL_CROSSING_COST_FACTOR_DATA_KEY.
  • Renamed and moved data key PartitionCellKeys.EDGE_LABEL_CROSSING_COST_FACTORS_KEY to EdgeRouter.EDGE_LABEL_CROSSING_COST_FACTOR_DATA_KEY.
  • Property EdgeRouterData.labelCrossingPenaltyFactors has been replaced by the two new properties EdgeRouterData.nodeLabelCrossingCostFactors and EdgeRouterData.edgeLabelCrossingCostFactors.
  • 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 SeriesParallelLayoutRoutingStyle. 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 protected EdgeRouter.createDefaultEdgeOrderComparer method has been removed. Use EdgeRouterData.edgeProcessingComparator instead.
  • Renamed Obstacle to RoutingObstacle.
  • Renamed Path to PathSearchResult.
  • Renamed PathRequest to PathSearchRequest.
  • Refactored the API for customizing the EdgeRouter class.
    • The classes/interfaces PathSearch, PathSearchResult, CellSegmentInfo, EdgeInfo, Channel, ChannelBasedPathRouting, SegmentInfo, SegmentInfoBase, SegmentGroup, 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.
  • The PolylineLayoutStage class has been renamed to OctilinearRoutingStage. Its preferredPolylineSegmentLength property has been renamed to preferredOctilinearSegmentLength.
  • 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.IGNORE_GROUP_LABELS.
  • The already obsolete properties EdgeRouter.polylineRouting, EdgeRouter.preferredPolylineSegmentLength and EdgeRouter.maximumPolylineSegmentRatio have been removed. They are replaced by respective properties on the EdgeRouterEdgeDescriptor class.
  • Replaced EdgeRouter.edgeComparer property of type IComparer with EdgeRouterData.edgeProcessingComparator of type Comparison function.
  • Class PenaltySettings and EdgeLayoutDescriptor.penaltySettings property where renamed to EdgeRouterCosts and EdgeRouterEdgeDescriptor.edgeRouterCosts.
  • The BusRouter class and all API members related to it have been removed. For bus-style edge routing, use EdgeRouter instead.
  • Method ParallelEdgeRouter.layoutParallelEdges was renamed to routeEdges.

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.

See the related new features.

Labeling

Incompatible API Changes

  • 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.
  • Made enums LabelAngleOnRightSideRotations and LabelAngleReferences non-flags enums.
  • Removed the LabelAngleOnRightSideOffsets enum.
  • Changed EdgeLabelPreferredPlacement.AngleOffsetOnRightSide property to a bool addHalfRotationOnRightSide property.
  • Removed the interfaces INodeLabelLayout and IEdgeLabelLayout. Labels of the LayoutGraph are instead represented by types LayoutNodeLabel and LayoutEdgeLabel.
  • Removed LayoutGraph.getLabelLayout. Labels can instead be retrieved using LayoutNode.labels and LayoutEdge.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 LayoutNodeLabel.absolutePlacement and LayoutEdgeLabel.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 GenericLabeling.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 GenericLabeling.autoFlipping. Automatically flipping labels right-side up is handled by the view, e.g. SmartEdgeLabelModel.autoRotation.
  • Removed the IProfitModel interface and properties GenericLabeling.profitModel and GenericLabeling.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.
  • Renamed LabelSideReferences.ABSOLUTE_WITH_LEFT_IN_NORTH to ABSOLUTE_WITH_LEFT_ABOVE.
  • Renamed LabelSideReferences.ABSOLUTE_WITH_RIGHT_IN_NORTH to ABSOLUTE_WITH_RIGHT_ABOVE.
  • Values of DiscreteNodeLabelPositions enum have been renamed.
    • INTERNAL_MASK to INSIDE.
    • EIGHT_POS_MASK to DiscreteNodeLabelPositions.OUTSIDE.
    • SIDES_MASK to SIDES.
    • CORNER_MASK to RectangleCorners.
    • Removed value SANDWICH_MASK.
  • Values of DiscreteNodeLabelPositions have been renamed:
    • DiscreteNodeLabelPositions.TOP, DiscreteNodeLabelPositions.TOP_LEFT, ... have been renamed to TOP_INSIDE, TOP_LEFT_INSIDE, ...
    • DiscreteNodeLabelPositions.NORTH, DiscreteNodeLabelPositions.NORTH_WEST, ... have been renamed to DiscreteNodeLabelPositions.TOP, DiscreteNodeLabelPositions.TOP_LEFT, ...
  • Renamed LabelCandidate.customProfit to Weight.
  • Renamed SliderMode to EdgeLabelSliderMode.
  • The configuration LabelingData class for the GenericLabeling algorithm has been renamed to GenericLabelingData to be more in line with other LayoutData implementations.
  • Removed DescriptorWrapperLabelModel.
  • ILabelCandidateDescriptor and related interfaces have been removed.
  • LayoutGraphAdapter: removed getLabelCandidateDescriptorProvider and getLabelCandidateDescriptor.
  • MISLabelingBase.reduceAmbiguity is removed. Ambiguous label placements can instead be penalized using LabelingCosts.ambiguousPlacementCost.
  • The PreferredPlacementDescriptor class has been renamed to EdgeLabelPreferredPlacement.
    • IEdgeLabelLayout.The property.PreferredPlacementDescriptor has been removed. Instead the preferred placement can be specified using EdgeLabelPreferredPlacement.EDGE_LABEL_PREFERRED_PLACEMENT_DATA_KEY.

Organic Layout

Incompatible API Changes

  • The OutputRestriction class and the associated properties have been renamed to ShapeConstraint.
  • OrganicConstraintData no longer inherits from LayoutData.
  • Renamed OrganicLayoutData.sourceGroupIds to substructureSourceGroupIds. OrganicLayout now uses OrganicLayout.SUBSTRUCTURE_SOURCE_GROUP_ID_DATA_KEY instead of LayoutKeys.SOURCE_EDGE_GROUP_ID_DATA_KEY.
  • Renamed OrganicLayoutData.targetGroupIds to substructureTargetGroupIds. OrganicLayout now uses OrganicLayout.SUBSTRUCTURE_TARGET_GROUP_ID_DATA_KEY instead of LayoutKeys.TARGET_EDGE_GROUP_ID_DATA_KEY.
  • Renamed the OrganicLayout.GROUP_NODE_MODE_DP_KEY property to GROUP_NODE_HANDLING_POLICY_DATA_KEY.
  • OrganicLayoutTreeSubstructureStyle.BALLOON has been renamed to RADIAL_TREE.
  • 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.
  • OrganicLayout.considerNodeSizes was removed. The OrganicLayout now always considers node sizes.
  • Renamed OrganicLayout.clusterAsGroupSubstructureAllowed to allowClusterAsGroupSubstructure.
  • Renamed OrganicLayout.nodeEdgeOverlapAvoided to avoidNodeEdgeOverlap.
  • Renamed OrganicLayout.nodeOverlapsAllowed to allowNodeOverlaps.
  • Renamed GroupNodeMode.NORMAL to GroupNodeHandlingPolicy.FREE.
  • The OrganicLayout class no longer offers value OrganicLayoutClusteringPolicy.USER_DEFINED. Now, cluster IDs provided by users via OrganicLayoutData.clusterIds property or data key OrganicLayout.CLUSTER_ID_DATA_KEY are always considered first. If none are defined, the specified OrganicLayout.clusteringPolicy is considered.
  • Removed the clusterNodes property from OrganicLayout. It is replaced by OrganicLayoutClusteringPolicy property. To disable the clustering, specify OrganicLayoutClusteringPolicy.NONE. To enable it choose one of the available other policies.
  • Removed the clusteringQuality property from OrganicLayout. Use qualityTimeRatio instead.
  • The ClassicOrganicLayout class has been removed. It is superseded by the more powerful OrganicLayout algorithm that should be used instead.
  • 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.PRESERVE_RELATIVE_LOCATIONS.
  • Removed OrganicLayoutConstraintFactory and OrganicLayout.createConstraintFactory. Use OrganicLayoutData.constraints instead.
  • OrganicConstraintData.addFloatingBoundingBox now accepts Size its deconstructed values.
  • OrganicConstraintData.addFloatingBoundingBox now accepts Rect its deconstructed values.
  • The RecursiveShuffleLayout class has been removed from the API.
  • The OrganicPartitionGridLayoutStage class has been removed.

Incompatible Behavior Changes

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

See the related new features.

Interactive Organic Layout

Incompatible API Changes

  • The InteractiveOrganicLayout algorithm no longer implements the ILayoutAlgorithm interface.
  • The InteractiveOrganicLayoutExecutionContext has been removed. Call directly InteractiveOrganicLayout .startLayout to start the layout calculation.
  • The InteractiveOrganicLayout .stop method has been renamed to InteractiveOrganicLayout .stopLayout.
  • The methods InteractiveOrganicLayout .applyLayout, InteractiveOrganicLayout.stopAndWait, InteractiveOrganicLayout.cancelAndWait have been removed.
  • 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.

See the related new features.

Circular Layout

Incompatible API Changes

  • Renamed the ExteriorEdgeLayoutDescriptor.edgeToEdgeDistance property to CircularLayoutExteriorEdgeDescriptor.edgeDistance.
  • 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 CircularLayoutPartitioningPolicy set to SINGLE_CYCLE 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.
  • The CircularLayout.layoutStyle property has been renamed to CircularLayoutPartitioningPolicy to better reflect the fact that it controls how nodes are partitioned. The corresponding enum has also been renamed from to CircularLayoutPartitioningPolicy.
  • Removed the enum value CircularLayoutEdgeRoutingPolicy.MARKED_EXTERIOR. To manually select which edges should be routed externally, use the CircularLayoutData.exteriorEdges property instead.
  • Renamed CircularLayout.layoutStyle to CircularLayout.partitioningPolicy.
  • Renamed LayoutStyle to CircularLayoutPartitioningPolicy.
  • Removed the enum value LayoutStyle.CUSTOM_GROUPS. 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.nodeComparator property to specify custom node orders.

Incompatible Behavior Changes

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

Radial Layout

Incompatible API Changes

  • Renamed the RadialLayout.minimumNodeToNodeDistance property to minimumNodeDistance.
  • Renamed the RadialLayout.minimumEdgeToEdgeDistance property to minimumEdgeDistance.
  • RadialLayoutNodeInfo has been renamed to RadialLayoutNodePlacementResult.
  • Renamed LayeringStrategy to RadialLayeringStrategy.
  • Replaced ItemMapping outEdgeComparers with ChildOrderData childOrder.
  • Removed the enum value Radial.LayeringStrategy.UserDefined. Custom layers are now always used if defined via RadialLayoutData.layerIds property.
  • Removed the enum value CenterNodesPolicy.CUSTOM. Custom center nodes are now always used if defined via RadialLayoutData.centerNodes property.
  • The read/write centerNodesDpKey property from the RadialLayout class has been removed. It was replaced by the static read-only key RadialLayout.CENTER_NODES_DATA_KEY that must now be used instead to mark the custom center nodes.
  • Replaced properties RadialLayoutData.nodeComparables and RadialLayoutData.outEdgeComparers with new, more powerful childOrder property.

Incompatible Behavior Changes

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

Radial Tree Layout

Incompatible API Changes

  • Renamed RootNodePolicy to RootSelectionPolicy.
  • 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.MARKED_NODES has been removed. To define specific parents for interleaved placed child nodes use the RadialTreeLayoutData.interleavedNodes property.
  • The enum value RootNodePolicy.SELECTED_ROOT has been removed. A custom root node is now always used if defined via RadialTreeLayoutData.treeRoot property.
  • Replaced layout data outEdgeComparer property with ChildOrderData childOrder.
  • Removed BalloonLayout.comparer. Use RadialTreeLayoutData.childOrder instead.
  • 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 default style of the RadialTreeLayout's (formerly BalloonLayout's) ComponentLayout is changed to PACKED_CIRCLE.
  • 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.

See the related new features.

Radial Group Layout

Incompatible API Changes

  • Renamed CactusGroupLayout.groupSizingPolicy to RadialGroupLayout.groupSizePolicy.
  • The CactusGroupLayout has been renamed to RadialGroupLayout, and the CactusGroupLayoutData has been renamed to RadialGroupLayoutData.
  • Property preferredRootWedge has been renamed to preferredRootSectorAngle.
  • Replaced CactusGroupLayout.nodeComparer property of type IComparer with RadialGroupLayoutData.childNodeComparator of type Comparison function.

Incompatible Behavior Changes

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

Series-parallel Layout

Incompatible API Changes

  • The combinations of the enums ForkStyle and TreeLayoutPortAssignmentMode have been integrated into the TreeLayoutPortAssignmentMode enum, and the ForkStyle enum has been removed.
  • DefaultPortAssignment.forkStyle has been removed.
  • Renamed IPortAssignment to ISeriesParallelLayoutPortAssigner.
  • Renamed DefaultPortAssignment to SeriesParallelLayoutPortAssigner.
  • Renamed SeriesParallelLayout.PORT_ASSIGNMENT_DP_KEY to PORT_ASSIGNER_DATA_KEY.
  • Renamed SeriesParallelLayoutData.portAssignments to portAssigners.
  • Renamed the SeriesParallelLayout.verticalAlignment property to parallelSubgraphAlignment.
  • Renamed the SeriesParallelLayout.minimumNodeToNodeDistance property to minimumNodeDistance.
  • Renamed the SeriesParallelLayout.minimumEdgeToEdgeDistance property to minimumEdgeDistance.
  • Renamed EdgeLayoutDescriptor to SeriesParallelLayoutEdgeDescriptor.
  • Renamed SeriesParallelLayout.defaultEdgeLayoutDescriptor to defaultEdgeDescriptor.
  • Renamed SeriesParallelLayout.EDGE_LAYOUT_DESCRIPTOR_DP_KEY to EDGE_DESCRIPTOR_DATA_KEY.
  • Renamed SeriesParallelLayoutData.edgeLayoutDescriptors to edgeDescriptors.
  • 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.
  • Removed SeriesParallelLayout.defaultOutEdgeComparer. Use SeriesParallelLayoutData.childOrder instead. Also removed DefaultOutEdgeComparer class.
  • Replaced SeriesParallelLayoutData property .outEdgeComparers with new, more powerful childOrder property.

Incompatible Behavior Changes

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

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

  • The MultiPageLayout.createProxyReferenceNodes property has been renamed to useProxyReferenceNodes.
  • The EdgeBundleModes enum and the associated properties have been renamed to MultiEdgeConnectorPolicy. The enum values have been renamed to SEPARATE, SHARE_FOR_SAME_DIRECTION and SHARE, respectively. The corresponding EdgeDataKey has been renamed to MULTI_EDGE_CONNECTOR_ID_DATA_KEY (previously EDGE_TYPE_DP_KEY).
  • Renamed GroupingPolicy to MultiPageGroupingPolicy.
  • 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.
  • Renamed NodeType to MultiPageNodeType and its value Normal to MultiPageNodeType.REGULAR.
  • Renamed EdgeType to MultiPageEdgeType and its value Normal to MultiPageEdgeType.REGULAR.
  • 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.EDGE_TYPE_DP_KEY, and MultiPageLayoutData.edgeTypes have been renamed to MultiPageLayout.multiEdgeConnectorPolicy, MultiPageLayout.MULTI_EDGE_CONNECTOR_ID_DATA_KEY, and MultiPageLayoutData.multiEdgeConnectorIds.

Partial Layout

Incompatible API Changes

  • Renamed LayoutOrientation to PartialLayoutOrientation.
  • 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.
  • Removed the enum value ComponentAssignmentStrategy.CUSTOMIZED. Custom components are now always used if defined with PartialLayoutData.componentIds, ClearAreaLayoutData.componentIds or FillAreaLayoutData.componentIds respectively.

Incompatible Behavior Changes

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

See the related new features.

Tabular Layout

Incompatible API Changes

  • Renamed NodeLayoutDescriptor to TabularLayoutNodeDescriptor.
  • Renamed TabularLayout.defaultNodeLayoutDescriptor to defaultNodeDescriptor.
  • Renamed TabularLayout.NODE_LAYOUT_DESCRIPTOR_DP_KEY to NODE_DESCRIPTOR_DATA_KEY.
  • Renamed TabularLayoutData.nodeLayoutDescriptors to nodeDescriptors.
  • Renamed TabularLayoutPolicy to TabularLayoutMode.
  • Replaced TabularLayout.nodeComparer property of type IComparer with TabularLayoutData.freeNodeComparator of type Comparison function.
  • The TabularLayout class now features its own data key (LAYOUT_GRID_CELL_DESCRIPTOR_RESULT_DATA_KEY) where it will publish cell IDs of nodes that it explicitly assigned to the cells. Previously it reused the common data key PartitionGrid.PARTITION_CELL_ID_DP_KEY.

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

  • The ComponentArrangementStyles enum has been renamed to ComponentArrangementStyle, as it is no longer a Flags-Enum.
    • Removed ComponentArrangementStyles.MASK.
    • Replaced ComponentArrangementStyles.MODIFIER_NO_OVERLAP with TRY_KEEP_CENTERS.
    • Replaced ComponentArrangementStyles.MODIFIER_AS_IS with ComponentLayout.fromSketchMode.
  • Renamed ComponentLayout.calculateBounds to calculateComponentBounds.
  • Renamed ComponentLayout.setOrigin to setComponentLocation.
  • The IsolatedGroupComponentLayout class has been removed.
  • Renamed ComponentArrangementStyles.NONE to ComponentArrangementStyle.KEEP_CENTERS.
  • Removed the componentArrangement property from ComponentLayout; use the new ComponentArrangementStyle.NONE instead to avoid arranging components.
  • Removed ComponentLayout.arrangeFields method.
  • Simplified parameter lists of methods ComponentLayout.arrangeComponents and ComponentLayout.setOrigin to now accept instances of Component class.
  • 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.

Incompatible Behavior Changes

  • ComponentArrangementStyle.PACKED_CIRCLE and ComponentArrangementStyle.PACKED_RECTANGLE now consider the convex hulls of components to determine overlaps.

See the related new features.

Tree Map Layout

Incompatible API Changes

  • Renamed TilingPolicy to TilingStrategy and TreeMapLayout.tilingPolicy to TreeMapLayout.tilingStrategy.
  • Replaced TreeMapLayout.nodeComparer property of type IComparer with TreeMapLayoutData.childNodeComparator of type Comparison function.
  • Removed the NodeWeightComparer class.

Recursive Group Layout

Incompatible API Changes

  • RecursiveGroupLayout.NULL_LAYOUT is renamed to RecursiveGroupLayout.FIX_CONTENT_LAYOUT.
  • FixGroupLayoutStage is removed and its functionality is replaced by RecursiveGroupLayout using RecursiveGroupLayout.FIX_GROUP_LAYOUT for all groups.
  • The RecursiveGroupLayout class now ignores empty group nodes by default (see considerEmptyGroups property).
  • The signature of ILayoutGroupBoundsCalculator.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

  • 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.
  • Renamed inset properties on classes LayoutGridColumn (formerly ColumnDescriptor) and LayoutGridRow (formerly RowDescriptor) to now be called padding (e.g., leftPadding instead of leftInset).
  • Removed helper class Swimlanes and SwimlaneRepresentative.
  • Removed the SwimlanesMode enum.
  • 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).
  • 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.
  • Renamed all types, methods and properties containing "CellId" to "CellDescriptor".
  • Removed properties optimizeRowOrder and optimizeColumnOrder from PartitionGridData class.
  • Removed the data key PartitionGrid.PARTITION_GRID_DP_KEY. The key LayoutGrid.LAYOUT_GRID_CELL_DESCRIPTOR_DATA_KEY is now the only data key which can be used to specify layout grids.
  • Removed data key RecursiveGroupLayout.GROUP_NODE_PARTITION_GRID_DP_KEY. The key LayoutGrid.LAYOUT_GRID_CELL_DESCRIPTOR_DATA_KEY is now the only data key which can be used to specify layout grids.

Other Layouts

Incompatible API Changes

  • Renamed CurveFittingLayoutStage to CurveFittingStage.
  • Renamed FixNodeLayoutStage to LayoutAnchoringStage and FixNodeLayoutData to LayoutAnchoringStageData. In addition:
    • Renamed FixPointPolicy to LayoutAnchoringPolicy.
    • Renamed FixNodeLayoutStage.FIXED_NODE_DP_KEY to NODE_ANCHORING_POLICY_DATA_KEY.
    • Renamed calculateFixPoint to calculateAnchorPoint.
    • Removed FixNodeLayoutData.fixedNodes. Graph elements to anchor the graph on can be specified by setting the respective AnchoringPolicies using LayoutAnchoringStageData.
  • Removed the Grouping enum.InterEdgeRoutingStyle.

Algorithms

Incompatible API Changes

  • IntersectionInfo has been renamed to Intersection.
  • Renamed ParallelEdges.findParallelEdges to LayoutGraphAlgorithms.findMultiEdges.
  • Removed the BfsDirection enum. Use TraversalDirection instead.
  • The TreeAnalyzer class has been removed. Use the more convenient and powerful TreeAnalysis class instead.
  • Removed the Intersections class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • Removed the IntersectionAlgorithm 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 GraphConnectivity class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • Removed the IndependentSets class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • The Triangulator algorithm class has been removed.
  • Removed the Substructures class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • Removed the Trees class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • 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.
  • Removed the Centrality class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • Removed the ShortestPaths class. Use corresponding methods of LayoutGraphAlgorithms class instead (e.g. ShortestPath).
  • Removed the Groups class. Use corresponding methods of LayoutGraphAlgorithms instead.
  • Renamed the Groups class.Dendrogram to HierarchicalClusteringDendrogram.
  • Removed the Bfs class. Use LayoutGraphAlgorithms.bfs instead.
  • Removed the Dfs class. Use LayoutGraphAlgorithms.dfs instead.
  • Renamed Component to ConnectedComponent.
  • 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 NodeAggregation class has been renamed to LayoutGraphNodeAggregation, emphasizing that this class is intended for users working with the LayoutGraph API only.
    • Furthermore, its member NODE_TYPE_DP_KEY has been removed. The replacement is key LayoutKeys.NODE_TYPE_DATA_KEY.
    • Also, its member NODE_CENTER_DP_KEY 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 enum value EUCLIDEAN_SQUARED 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 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.

See the related new features.

Analysis

Incompatible API Changes

  • The NodeAggregation.nodeTypeHandling property has been renamed to NodeTypePolicy.
  • The NodeAggregationNodeTypeHandlingPolicy enum has been renamed to NodeTypePolicy.
  • Renamed AggregationInfo to NodeAggregationInfo.
  • Renamed AggregationInfo.parentAggregation to parentNodeAggregation.
  • Renamed NodeAggregation.AggregationPolicy to NodeAggregationPolicy.
  • Renamed NodeAggregation.aggregation to aggregationPolicy.
  • Renamed DistanceMetric to KMeansDistanceMetric.
  • Renamed GraphStructureAnalyzer.hasMultipleEdges to hasMultiEdges.
  • Renamed GraphStructureAnalyzer.getMultipleEdges to getMultiEdges.
  • Replaced enum Linkage with HierarchicalClusteringLinkage.
  • Renamed Substructure to SubstructureItems.
  • Renamed Component to ConnectedComponent.

See the related new features.

Collections

Incompatible API Changes

  • The YList.elementAt method was removed.
  • Renamed ItemMapping.delegate to mapperFunction.
  • Renamed ItemCollection.delegate to predicate.
  • Renamed IUndoUnit.createDelegateUnit to fromHandler.
  • Renamed IAnimation.fromDelegate to fromHandler.
  • Renamed IMapper.fromDelegate to fromHandler.
  • The elementAt method on the IEnumerable interface was removed. Use the at method, instead.
  • The skip method on the IEnumerable interface is now called drop and no longer has a thisArg parameter to match the counterpart in the ECMAScript Iterator Helpers stage 3 proposal.
  • The skipWhile method on the IEnumerable interface is now called dropWhile and no longer has a thisArg parameter.
  • The distinct, groupBy, and sum methods on the IEnumerable interface no longer have a thisArg parameter.
  • The list class constructor no longer has a thisArg parameter.
  • The first and last methods on the IEnumerable interface no longer accept a predicate function. Use find and findLast instead.
  • The predicate function of the find and findLast methods on the IEnumerable interface is no longer optional.
  • The parameter of the includes method on the IEnumerable interface is no longer nullable.
  • The orderBy method of the IEnumerable interface is now called toSorted. The keySelector parameter was removed to match the signature of Array.toSorted.
  • The orderByDescending method has been removed the IEnumerable interface.
  • The sort method has been removed from class YList.
  • The sort method with the IComparer parameter has been removed from class List<T>.
  • 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.size 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.

Incompatible Behavior Changes

  • The first, last and findLast methods on the IEnumerable interface now return null instead of throwing when no element was found.
  • The at method on the IEnumerable interface now returns null instead of undefined when out of range.

See the related new features.

Geometry

Incompatible API Changes

  • 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 size property, instead.
  • The GetBounds overload of the GeneralPath class that returns the approximate bounds for Bézier segments is now called getApproximateBounds.
  • The copy constructors on the Rect, Point, and Size classes were removed. Use the toRect, toPoint, or toSize methods respectively instead.
  • 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 Geom.CalcLineIntersection method to GeometryUtilities class and renamed to getLineLineIntersection.
  • Removed the Geom.projection method. Use Point.getProjectionOnSegment method instead.
  • Removed the methods distanceToLineSegment of Geom class. Use Point.distanceToSegment method instead.
  • The IRectangle interface no longer implements IPoint. You can get the top-left corner of a rectangle with its topLeft 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.
  • Renamed the LineSegment.xOffset property to yIntercept.
  • Made LineSegment class sealed.
  • Renamed the LineSegment.isInXIntervall method to LineSegment.isInXInterval and LineSegment.isInYIntervall method to LineSegment.isInYInterval.

See the related new features.

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

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

E-mail: hello@yworks.com

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