Improvements

The new TreeLayoutData.criticalEdgePriorities property can be used to specify critical edges.

The INode parameter of the NavigationInputMode.enterGroup method is now optional. If it is omitted or null the whole graph will be revealed.

The CanvasControl.createInputModeContext method is now public instead of protected.

The PointD.toMutablePoint and RectD.toMutableRectangle methods now return a MutablePoint instead of IMutablePoint and a MutableRectangle instead of a IMutableRectangle, respectively.

The new optional parameter initialTargetLocation of the CreateEdgeInputMode.doStartEdgeCreation method can be used to define the initial location that shall be used to find a target node.

Bugfixes

For some constructors, the automatic type conversion did not work as documented. Also many simple constructors were not type-checked at run-time at all even if yfiles-typeinfo.js was available.

Due to a bug in Safari 10.0 and earlier, using the new automatic type conversion feature for enum values resulted in a TypeError in these browsers. We now avoid the problematic code.

Since version 2.1, the workaround IE7766782 for a problem in Internet Explorer with GWT was not applied to all problematic usages of Array.isArray. Thus, instanceof checks for arrays could have been wrong in rare cases, resulting in different kinds of subsequent errors.

View

yFiles no longer shows an error if WebGL support is not available but no WebGL rendering is used at all. If WebGL support is not available and WebGL rendering is used, the resulting error has now a clear error message.

The Workarounds class now correctly documents that it is exported by the yfiles/core ES6 module.

CreateEdgeInputMode did not show port candidates after re-installation of the input mode.

CreateEdgeInputMode didn't always update the highlight of possible source port candidates when its showPortCandidates property was configured to show the source port candidates.

The default input mode that available view the GraphEditorInputMode.moveUnselectedInputMode property moved the bottom-most item at the cursor position instead of the top-most. This is most apparent when trying to move a child node of a group.

ClickInputMode provided wrong click locations in the Click event if a MouseEventTypes.CLICK event without preceding MouseEventTypes.DOWN event was processed.

If the MouseHoverInputMode.toolTip property was changed while a tool tip was visible, that tool tip was shown forever.

ItemHoverInputMode now resets the hovered item when moving the mouse out of the control.

While relocating edges, dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.

Fixed an exception when an edge or label was pasted without selected target while its original owner was not in the current view.

The marquee visual of the LassoSelectionInputMode class was not updated properly during zooming.

PolylineEdgeStyle now takes arrow heads into account for visibility checks.

Reduced memory consumption of DefaultEdgePathCropper.

EdgeSegmentLabelModel and EdgePathLabelModel placed the label on the wrong side for EdgeSides.ABOVE_EDGE and EdgeSides.BELOW_EDGE if the distance and offset was both 0.

The TextWrapConverter for template styles threw a TypeError if the resolved value was not a string (e.g. for numbers or null). Now, it handles null and undefined like an empty string and converts non-string values to string.

The maximumSize parameter of the TextRenderSupport.addText method is now optional, and consequently handles null arguments as it was already documented.

Layout

The HierarchicLayout now produces less bends if the edges should be routed on a grid and the grid reference point is not (0,0), see NodeLayoutDescriptor.gridReference.

HierarchicLayout did sometimes not correctly consider the edge thickness for grouped edge segments. Even though there would have been space for a thick edge it was placed too close to other elements.

HierarchicLayout now produces more symmetric results for grouped edges if property SimplexNodePlacer.barycenterMode is enabled.

For some input graphs with port groups, the HierarchicLayout threw an exception for layout mode LayoutMode.INCREMENTAL.

Fixed a rare bug in OrthogonalLayout that may have caused infinite looping for grouped input graphs.

For some input graphs the OrganicLayout produced an error if the CycleSubstructureStyle property was set to CycleSubstructureStyle.CIRCULAR.

CircularLayout does now correctly consider the EdgeBundleDescriptor.bundled property for edges between different partitions. Previously, when at least one of these edges had the Bundled property enabled, all of them were bundled, ignoring the property value of the other edges.

Fixed a bug in TreeMapLayout that may have caused NaN-coordinates or infinite looping for input graphs that are non-directed trees.

The EdgeRouter now produces better routes if there are edges with intermediate routing points, see property EdgeLayoutDescriptor.intermediateRoutingPoints.

For grouped segments the GraphLayoutLineWrapper now produces more compact results.

In rare cases the GraphLayoutLineWrapper produced drawings with large empty space between lines.

yFiles for HTML 2.1.0.1 - Changes Since 2.1

In addition, there are new tutorial videos available online. We'll add more videos in the future.

Improvements

Calling a method that is not available because its required module is missing now throws an informative error message. Prominent examples are the LayoutExecutor.morphLayout and the IGraph.applyLayout methods which are only available if the view-layout-bridge module is loaded.

The EdgeRouter class now calculates a better routing for edges between group nodes and their descendants in the case that the routing is aborted via AbortHandler or when the maximum duration time limit is up. Previously, such edges might not have been handled in this case, whereas now they always get a simple but valid orthogonal route.

The HierarchicLayout class now respects the sequence and layering constraints between subcomponents. Previously, such constraints were ignored.

Bugfixes

The amount of time that may pass before a touch movement is considered a drag instead of a press is now correctly read from CanvasComponent.dragTime. Previously, the value of the CanvasComponent.longPressTime property was used instead.

The IOrientedRectangle.orientedRectangleCenter property didn't return the correct center if the width or height of the rectangle was equal to 0.

Moving an edge label with SmartEdgeLabelModel that is owned by an edge without visible path no longer throws an exception.

The behavior of the DefaultObservableCollection.clear method has been corrected. Previously, it always threw an error.

For template-based label and port styles, the binding context was not initialized early enough. As a result, these styles first created the DOM elements for the wrong, uninitialized vales and then updated them to the correct values.

The new CSS classes yfiles-selected, yfiles-highlighted and yfiles-focused for template-based styles were not always applied correctly at element creation time.

Removing an item that is currently highlighted with a custom HighlightIndicatorManager, FocusIndicatorManager, or SelectionIndicatorManager no longer results in an error.

Fixed a bug that resulted in an unresponsive input mode in Safari on iOS. This error happened only if the CollapsibleNodeStyleDecoratorRenderer.addToggleExpansionStateCommand method was used in a custom group node style.

The TypeScript definition files incorrectly required the implementation of some non-abstract properties in the quick-interface implementation constructors of some interfaces.

In EdgeRouter, an error occurred when there were intermediate routing points and the path search got aborted (e.g. because of maximum duration time limit).

In ShortestPaths, an error occurred when the a-star algorithm was applied to a graph with non-monotonic heuristic costs.

In HierarchicLayout, an error was triggered when a yfiles.algorithms.DataProviderAdapter that does not override the DataProvider.get method was registered with key GivenLayersLayerer.LAYER_ID_KEY. This issue only appeared in conjunction with subcomponents.

Shows nodes that can be rotated interactively by dragging a rotation handle. Labels and ports rotate with their node and edges clip perfectly at the rotated node bounds. Automatic layout can deal with rotated nodes, too.

In hierarchic and tree graphs, some paths can be more important than others. This demo shows how the hierarchic and tree layout styles align the nodes and edges of such important, or 'critical', paths to make them more striking.

Other Notable Demo Improvements

The context menu that is used in the demos is now an actual class and its menu items are real input elements. It now returns the focus to its graph component when closed and is easier to open with a touch long-press gesture.

Changes of Default Behavior

The IGraph.setNodeLayout method and the various methods to create a node now throw an ArgumentError if the layout rectangle contains one or more NaN values. Similarly, the IGraph.setBendLocation and the various methods to add a bend to an edge now throw an ArgumentError if the location point contains one or two NaN values.

The ContextMenuInputMode.populateMenu event is now only fired if the current input mode state allows opening the context menu. Previously, the event was fired before the input mode had even checked whether another active input mode would prevent the opening of the menu.

The default value of DragSource.effectAllowed is now DragDropEffects.ALL instead of DragDropEffects.NONE. This was always the intended default value.

yFiles for HTML 2.1 - Changes Since 2.0.1.4

Major New Features

ES6 Modules of the Library

The yFiles package now contains the library as ES6 modules in addition to the existing UMD modules. This makes, amongst others, working with modern IDEs, popular tools like Webpack and Angular CLI, and TypeScript much easier.

WebGL Rendering

Added WebGL as a third rendering option besides the already available SVG and HTML5 Canvas rendering. This allows the rendering of very large graphs with good performance. The Large Graphs demo shows the new technique in action.

Labels at Ports

Labels can now be added to ports and the new label models FreePortLabelModel and InsideOutsideLabelModel can be used to place such labels. On the technical side, IPort now extends the ILabelOwner interface and there is a new enum constant: GraphItemTypes.PortLabel.

Customizable Rendering Order

Labels and ports can now optionally be rendered directly in front of their owner. Such a rendering order can make the ownership of labels and ports clearer if nodes overlap. Previously, all labels and ports were rendered in front of all nodes. The new rendering order can be enabled by setting the new properties LabelLayerPolicy and PortLayerPolicy of GraphModelManager to LabelLayerPolicy.AtOwner and PortLayerPolicy.AtOwner, respectively.

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

Touch Improvements

A completely new Touch demo shows how the user experience can be optimized for touch-only devices, for example with large handles and a context dial menu that is triggered on "long-press".

This is accompanied by several improvements in the library that make touch input more fun. Especially, the hit test radius and drag detection area is now autoamtically enlarged for touch input, inertia scrolling of the viewport behaves now in a more natural way and stops after a fixed amount of time and two-finger panning and zooming now smooths small movements to avoid undesired changes of the zoom level.

Drag and Drop

Native HTML5 drag and drop is now supported in addition to the custom yFiles implementation that is based on mouse and touch event listeners. Both ways can now display a preview image of the dragged item all of the time and not only inside the graph component. Finally, the new LabelDropInputMode and PortDropInputMode classes implement drag and drop for labels and ports, respectively. The API of these classes is similar to the existing NodeDropInputMode for nodes.

Lasso Selection

The new LassoSelectionInputMode selects all model items inside a hand-drawn lasso region. This mode allows combinations of free-hand and straight-line sections during path creation.

Improved Orthogonal Layout

Many parts of the orthogonal layout algorithm have been significantly improved. In many cases, the drawings created by this algorithm are now much more compact and have smaller edge lengths, and they contain less crossings and perceived bends.

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

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

Sub-components in Hierarchic Layouts

In a hierarchic layout, you can now define sub-components of the input graph such that each sub-component is arranged by a user-specified layout algorithm. This allows hierarchical layouts where parts of the graph are arranged in a different fashion, e.g., to emphasize special sub-structures. The new HierarchicLayoutData.SubComponents property can be used to configure the new sub-components feature of the hierarchic layout.

Tree Map Layout

Added the new layout algorithm TreeMapLayout that generates tree maps. Tree maps present hierarchical data using nested rectangles (nodes) where each rectangle (node) gets its size depending on a specific dimension of data associated to it. The new TreeMapLayoutData class provides additional configuration options for this algorithm and the new Tree Map Demo shows a possible use case for the new layout style.

Tabular Layout Style

The new layout algorithm TabularLayout generates simple tabular arrangements of nodes. It allows to place nodes in rows and columns, such that each table cell contains at most one node. Among its features is, for example, a from-sketch mode, the possibility to exactly map nodes to specific cells or different vertical and horizontal alignments. The new TabularLayoutData class provides additional configuration options for this algorithm and the Layout Styles Demo shows the new layout style.

Many common simple types can now be created, or automatically type converted, from a shorthand string or object notation. For example, you can specify a point with {x:100, y: 200}, an arrow with "blue large circle", and an enum just by its name, e.g. "TOP_LEFT". Usages that allow the conversion of a parameter or property value are marked with a 'Conversion' badge in the API Doc and the valid syntax for each type is described with the corresponding type.

The deployment tool can now optimize and obfuscate ES6 sources directly; transpiling the sources to ES5 first is not required anymore.

View

The performance of FilteredGraphWrapper has been significantly improved. Now, it depends mainly on the size of the resulting filtered graph. This makes use cases that load very large graphs into memory and displaying only a subset of them using FilteredGraphWrapper much more reactive.

The new property CanvasComponent.devicePixelRatio can be adjusted to achieve crisp Canvas or WebGL rendering on high DPI devices.

CanvasComponent and GraphComponent can automatically detect (re-)insertions into the DOM now, allowing the size calculation and adjustment to also work in cases where the component previously was not displayed (out of DOM or display:none).

The following types and methods were added to support the new LassoSelectionInputMode:

Added the GraphInputMode.lassoSelectionInputMode property and a corresponding factory method. LassoSelectionInputMode is disabled by default.

The new GraphInputMode.lassoSelect method programmatically selects all items in the provided GeneralPath.

The new ILassoTestable interface specifies whether the item is considered to be inside the lasso path. This is analogous to the IMarqueeTestable interface for marquee selection.

Any model item can be decorated with an instance of ILassoTestable or provide one in its lookup. For this, the Node/Edge/Port/Label/BendDecorator classes got the new lassoTestableDecorator property for decorating an item with a custom ILassoTestable.

The new isInPath method of Node/Edge/Port/LabelStyleBase can be overridden to customize the lasso testing behavior.

With TableEditorInputMode, double clicking a stripe or stripe label now edits the label in the same way as for other graph items.

The rectangle of the marquee selection can now be customized with the new protected method MarqueeSelectionInputModes.calculateMarqueeRectangle.

Added the events ElementsCopied, ElementsCut, and ElementsPasted to GraphEditorInputMode, and the event ElementsCopied to GraphViewerInputMode.

Added new decorator implementations for table items. You can access these new decorators via the new method ITable.GetDecorator with the RowDecorator, ColumnDecorator and StripeLabelDecorator properties.

The mouse wheel behavior of the overview can now be switched between Zoom, Scroll, and None, and optionally the action can be performed only when the control is focused. This can be configured with the new OverviewInputMode.MouseWheelBehavior property.

If the new CanvasControl.QuantizeInputCoordinates property is enabled, world coordinates of mouse and touch events are rounded to nicer values to avoid unnecessary precision. For example, you'll get the value 326.375 instead of 326.3858109495. The rounding is chosen based on the zoom level to ensure that there is almost no visual deviation. Lower zoom levels will result in coarser rounding, higher zoom levels will use exactly as much precision as necessary. By default, this option is enabled.

Added text wrapping support to the template styles. This feature is available through the built-in converter function TextWrapConverter.

Layout

ShortestPaths: Added a-star (A*) algorithm for finding the shortest path between two nodes in a directed or undirected, arbitrary graph.

The new property OrthogonalLayout.maximumDuration controls the preferred time limit of this layout algorithm.

The new OrthogonalLayout.uniformPortAssignment property allows to obtain results with a more uniform port assignment.

TreeLayout: Added node placer CompactNodePlacer that produces more compact tree layouts. It uses a dynamic optimization approach that chooses a placement strategy of the children such that the overall result is compact with respect to a specified aspect ratio, see property CompactNodePlacer.preferredAspectRatio.

The new TreeLayoutData.CompactNodePlacerStrategyMementos property can be used to to maintain similar layout styles over subsequent runs of compact tree layout.

EdgeRouter now supports routing through user-specified intermediate points. All specified points will lie on the edge route in the given order. See new property EdgeLayoutDescriptor.intermediateRoutingPoints.

EdgeRouter: Edges that connect group nodes with their descendants can now directly connect from the inside to the group node border. Previously, an edge needed to always leave the group node before connecting to it. The feature can be enabled/disabled individually for each edge using the new property EdgeLayoutDescriptor.directGroupContentEdgeRouting.

Added convenience layout stage TemporaryGroupNodesInsertionStage that automatically generates a (non-nested) grouping structure from a given mapping of nodes to a component ID. This temporary grouping is meant for use during the run of the core layout algorithm of the stage. It allows, for example, easy use of RecursiveGroupLayout without the need for a real grouping structure when the requirement is that different sub-graphs need to be arranged with different layout algorithms.

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

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

Improvements

General

The TypeScript declaration files now support quick interface implementations.

The new yfiles.lang.Workarounds class provides properties that activate workarounds for known browser issues. This alternative way of setting workarounds is especially useful in ES6 modules where no reference to the yfiles top-level namespace is required anymore.

The new yfiles.lang.License object has a value property that can be set to the license values. This alternative way of setting the license data is especially useful in ES6-style code where no reference to yfiles is required anymore.

Errors thrown during the execution of the default implementations of ICommand.SAVE and ICommand.OPEN can now be caught by setting an error handler function to the yfiles.lang.Exception.handler property.

The IEnumerable.reduce method now uses the same argument order and semantics as the default Array.prototype.reduce method.

Rect and Size: Added methods to reduce the size of a Rect and a Size instance, respectively.

The new method GeneralPath.intersects(GeneralPath) determines whether the path intersects with another GeneralPath.

Saving a GraphML file now works in Safari 10.1 and 11 on macOS.

When reading GraphML with the deserialization property IGNORE_XAML_DESERIALIZATION_ERRORS enabled, invalid property content is now skipped instead of discarding the whole object with such content.

The GraphMLSupport.graphMLIOHandler property is initialized with a GraphMLIOHandler instance.

Graph

The default value of DefaultPortCandidate.locationParameter is now FreeNodePortLocationModel.NODE_CENTER_ANCHORED for nodes and BendAnchoredPortLocationModel.FIRST_BEND for edges instead of a parameter of an internal model.

Added a remove method to NodeDecorator, LabelDecorator, EdgeDecorator, PortDecorator, and BendDecorator for easy removal of decorations.

Many label model createParameter methods now have default values for parameters that are not needed every time.

The elementCopiedCallback or elementDuplicated parameter of the methods GraphCopier.copy and GraphClipboard.duplicate is now optional (and can be null).

DefaultGraph now fills the undo engine and triggers events in a consistent manner for all graph element factory methods.

DefaultGraph has new factory methods to customize undo unit creation.

The performance of GraphBuilder, TreeBuilder, and AdjacentNodesGraphBuilder was drastically improved if node and edge ID bindings are set. Additionally, these types have an improved API that makes it easier to customize the created and updated graph elements.

View

The new CanvasComponent.hitTestRadiusTouch property controls the hit test radius for touch interaction. The existing hitTestRadius property now only applies to mouse interaction. The ICanvasContext.HitTestRadius property automatically uses one or the other value, depending on the last input event.

The new CanvasComponent.dragSizeTouch property specifies the size of the area where a touch point may stay in before a movement is considered a drag. The existing dragSize property now only applies to mouse interaction.

Added the new CanvasComponent.limitFitContentZoom property which controls whether the maximum zoom level for the CanvasComponent.fitContent method as well as the fitContent command is restricted to 1 or the value of the maximumZoom property.

Akin to the two CanvasComponent.zoomTo methods, there are now two CanvasComponent.zoomToAnimatedmethods that animate the viewport change. The CanvasComponent.zoomToAnimated method now returns a Promise that fulfills when the viewport animation has finished.

The new CanvasComponent.updateVisualAsync method behaves like the invalidate method but yields a Promise that can be awaited for.

The new CanvasComponent.lastInputEvent property contains the lastMouseEvent or lastTouchEvent depending on which was dispatched last.

The CanvasComponent.cleanup method new removes all DOM children and attributes created during the lifetime of the CanvasComponent from its div element.

The CanvasComponent.sizeChangedTimerInterval property now is a proper TimeSpan instead of a simple number.

The new CanvasComponent.toWorldFromPage method converts from HTML page coordinates to world coordinates.

Improved styling of scrollbars and provided more CSS classes for different states of the scrollbar.

GraphModelManager now avoids unnecessary re-installation of items if they keep their ICanvasObjectGroup. By these re-installations the z-order of the item in its group was lost and a new visual was created.

The new method GraphModelManager.getMainCanvasObject returns the canvas object that should be used when changing the visibility or z-order of a model item.

ICanvasObjectGroup.addChild(Object,ICanvasObjectDescriptor): The second parameter is now an optional parameter. If no descriptor is passed, ICanvasObjectDescriptor.ALWAYS_DIRTY_INSTANCE is used by the default implementation.

Assigning a new graph instance to GraphOverviewComponent now keeps configuration changes made to the overview's IVisualCreator instance.

Self-loop edges are now properly displayed in the GraphOverviewComponent.

The new Animations.createSequentialAnimation method creates an animation that animates multiple animations in sequence.

Styles

The GeneralPath.createSmoothedPath method now has additional parameters to change how smoothing is applied. Those new options result in nicer smoothing when combined with large smoothing lengths and many different segment lengths of the path.

The stroke thickness is now considered for the calculation of the origin of the default arrow visualizations. Therefore, the visualizations no longer extend into the node bounds.

Template styles now search for binding converter functions in a static converter store object on the template type before checking the `window` object. This helps preventing pollution of the global scope.

Template styles can now bind to the current zoom level of the component.

Template styles now provide yfiles-selected, yfiles-highlighted and yfiles-focused CSS classes depending on their current state.

Some styles unnecessarily added empty SVG <g> elements to the DOM.

New instances of SolidColorFill are now automatically frozen which can result in performance improvements. This type was already immutable anyway.

The new static methods Stroke.setStroke and Fill.setFill are null-safe replacements for the existing applyTo methods of Fill and Stroke.

Input

ItemClickedEventArgs now extends ClickEventArgs and therefore provides additional information like the IInputModeContext.

Added MouseEventRecognizers that recognize a current down state of a mouse button. These can be used to recognize ongoing gestures like drags, in contrast to recognizers for the actual mousedown event.

The static constants SELECTED_MOVABLES_POSITION_HANDLER and SELECTED_MOVABLES_HIT_TESTABLE have been added to GraphEditorInputMode. These are used as default IPositionHandler and IHitTestable properties of GraphEditorInputMode.moveInputMode and can be reused for other input modes.

The new GraphEditorInputMode.moveUnselectedInputMode property provides a child input mode for moving unselected items. It supersedes the previous createMoveUnselectedInputMode method. This input mode is disabled by default.

CreateEdgeInputMode provides access to a dummy target node which is used during the interactive edge creation. This allows making the node visible during creation by setting a style and size.

CreateEdgeInputMode now supports edges ending without a valid target port candidate. This allows creating new target nodes together with a newly created edge.

During interactive edge creation, the tip of a newly created edge now only snaps to valid target port candidates to create orthogonal end segments.

The new CreateEdgeInputMode.dragCursor property specifies the cursor that is used during edge creation when no bend may be created at the current location.

CreateEdgeInputMode now always creates dummy ports during a gesture, instead of temporarily reusing real ports if available. This makes it possible to change, e.g. the dummy edge's source port's style during the gesture.

The new CreateEdgeInputMode.startOverCandidateOnly property can be used to restrict the start of an edge creation gesture to directly hovered port candidates.

Moving a node with the MoveInputMode for unselected nodes now moves the bends of incident self-loops, too.

MoveLabelInputMode: The visualization of a moved label has been improved. The new property visualization allows easy switching between a symbolic preview, a preview or a live view.

The new static methods PositionHandlers.combine combine multiple position handler instances into a single instance.

Added overridable methods to PortRelocationHandle to allow customization of the port candidates.

The new PortRelocationHandle.visualization property controls how the preview during edge reconnection is handled. A new option is to change the edge during the gesture, which improves fidelity of the preview in certain cases.

ClickInputMode now dispatches the clicked events in the same order as GraphInputMode, i.e. the more specific events LeftClicked, RightClicked, LeftDoubleClicked and RightDoubleClicked are now dispatched before Clicked and DoubleClicked. Hence, Clicked and DoubleClicked will only be triggered if the event wasn't handled before.

The events ItemTapped, ItemDoubleTapped, and CanvasTapped have been added to GraphInputMode.

The new TapEventArgs.tapCount property can be used to distinguish between single and multiple taps.

Added a originalEvent property to TapEventArgs and ClickEventArgs.

TouchEventArgs now provides the modifier keys that were pressed when the event was dispatched as well as those that have changed their state since the last TouchEventArgs.

The CanvasComponent.MouseClick event now reports the position of the mouse down event as its location, and the CanvasComponent.TouchClick event reports the location of the touch down event as its location. Previously, this was the location of the up events which can be slightly different.

The new properties MoveViewportInputMode.snapPanning and snapPanningThreshold allow for snapping touch panning to one axis.

The new optional content parameter of the MouseHoverInputMode.show method defines the content of the tool tip to show. Now, the getToolTipContent method only gets called if no content was specified.

The new methods findNextItem and findNearestItem of NavigationInputMode can be used to configure the determination of the "next" item.

The generic type parameter T of class ItemDropInputMode<T> is no longer restricted to IModelItem.

Several improvements of the interactive label editing.

Improved the focus handling of the text box.

Other elements can now be added to the default text box, e.g. buttons.

A new factory method allows replacing the text box with a custom label editor.

The new TextEditorInputMode.textBoxPlacementPolicy property provides finer control of what happens when the TextBox is (partially) outside of the viewport.

The new TextEditorInputMode.TextBoxPadding property controls the padding between the text box and the border of the canvas.

The properties maximumSnapDistance, showHitPortOwnerCandidatesOnly and visualization have been added to PortRelocationHandleProvider and are applied to each PortRelocationHandle created by this provider.

The following input modes now release the mutex before dispatching their final event:

CreateEdgeInputMode now releases the mutex before dispatching the EdgeCreated event.

MoveInputMode now releases the mutex before dispatching the DragFinished event.

ResizeStripeInputMode now releases the mutex before dispatching the DragFinished event.

Table

The last parameter of the following extension methods of ITable is now optional: findRow, findColumn, findStripe, and findStripes.

TableEditorInputMode now handles clicks and taps similar to GraphEditorInputMode:

Layout and Algorithms

The new LayoutExecutor.createLayoutGraphAdapter callback method makes it possible to configure the LayoutGraphAdapter that is used for the layout calculation.

The new improvePortAssignment property of LayoutExecutor and LayoutGraphAdapter enables PortCalculator to improve the port assignment.

Major performance improvement for EdgeRouter in routing scenarios where it is unavoidable to cross obstacles (e.g. other nodes or labels) in order to reach the target. This includes cases where a crossing is necessary to guarantee that port candidates/constraints at the target side are satisfied.

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

EdgeRouter: Improved quality in maze routing scenarios. Previously, it could happen that edge-node overlaps occurred even though there exists a more complicated path that yields no overlaps.

The combination of PartitionGridData and TableLayoutConfigurator has been improved:

PartitionGridData now reuses the PartitionGrid created by the TableLayoutConfigurator.

Several methods have been added to TableLayoutConfigurator which provide access to the PartitionCellId assignment of the configurator as well as the mappings between IRow/IColumn and RowDescriptor/ColumnDescriptor.

BusRouter: Now automatically ignores non-orthogonal edges with fixed bus descriptor (see BusDescriptor.fixed) or transforms them into orthogonal edges if they are octilinear. In previous versions, the layout algorithm simply throws an error in such cases.

MultiPageLayout: Improved runtime as well as layout quality if the input is a tree structure and the specified coreLayout is either an instance of class TreeLayout or ClassicTreeLayout. Furthermore, property MultiPageLayout.additionalParentCount allows to specify the number of additional proxies that the algorithm tries to add to a subtree. The original nodes associated with these proxies lie on the path of the tree's root to the subtree placed on a page.

MultiPageLayout: Added property createProxyReferenceNodes that allows to disable the creation of proxy reference nodes as well as property multipleComponentsOnSinglePage that allows to prevent that elements of different connected components are placed on the same page.

PortPlacementStage now additionally considers port grouping constraints. If two edges are port-grouped at a certain node, the stage assigns the same port location to the edges. Port groups are marked using DataProviders registered with PortConstraintKeys.SOURCE_PORT_GROUP_ID_DP_KEY and PortConstraintKeys.TARGET_PORT_GROUP_ID_DP_KEY.

TreeComponentLayout: Added property considerUndirectedTreesthat allows to specify whether or not undirected tree structures should be handled or not. Previously, only directed tree structures were considered.

DefaultNodePlacer and SimpleNodePlacer now both support to specify a minimum distance between the edge segments that are routed orthogonally in the channel between the root node and the child nodes, see method DefaultNodePlacer.minimumChannelSegmentDistance and SimpleNodePlacer.minimumChannelSegmentDistance respectively.

ClassicTreeLayout now allows to specify a minimum vertical distance for the horizontal edge segments of the bus, see ClassicTreeLayout.minimumBusSegmentDistance.

The new properties layerConstraints and sequenceConstraints of HierarchicLayoutData can be used to configure layer and sequence constraints for the HierarchicLayout. These supersede the previous layerConstraintFactory and sequenceConstraintFactory properties.

Bugfixes

Graph and View

Corrected weird scrolling behavior of the scroll bar when the viewport was outside the content rectangle.

DefaultGraph now calls the onRemovingEdge and onRemovingPort methods before their incident items are removed.

The GroupingSupport.hasGroupNodes method now returns only true if there are actually group nodes in the graph. Previously, it returned also true if there once were group nodes which had been removed in the meantime.

Undo units created by the execution of a layout algorithm are now correctly merged with undo units of the previously executed interactive gesture.

The graph of IFoldingView.graph now raises the NodeCreated, EdgeCreated, PortAdded, LabelAdded, and BendAdded events after the created element is registered. This fixes a bug where the master item of the created item was not available in handlers for these events.

Sometimes, the GroupNodeDefaults.Labels.AutoAdjustPreferredSize property and the GroupNodeDefaults.Ports.AutoCleanup property were not considered for labels and ports of groups.

The commands COPY, CUT, and DUPLICATE are no longer enabled if there are no elements to cut, copy, or duplicate.

The ICommand.COPY command is no longer executed twice.

The methods GraphClipboard.copy and GraphClipboard.cut don't copy items anymore which depend on items that are selected but not included in GraphClipboard.copyItems.

The InteriorStretchLabelModel.getMinimumNodeSize method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.

Labels rendered using DefaultLabelStyle and TextRenderSupport now properly consider the ascent for the first line of text and are thus rendered in a slightly higher location than before.

BevelNodeStyleRenderer, PanelNodeStyleRenderer, ShadowNodeStyleDecorator and ShinyPlateNodeStyleRenderer now consider the shadow in their isVisible and getBounds methods.

GraphML serialization: Write the IconLabelStyle.wrapped property with the correct name.

The GraphML compatibility layer can now deserialize ports placed with AnchoredPortLocationModel of yFiles for HTML 1.x.

Input

GraphEditorInputMode and GraphViewerInputMode no longer ignore changes to their sub-input modes after having been installed once.

The KeyEventRecognizersSHIFT_IS_DOWN, ALT_IS_DOWN and CTRL_IS_DOWN now also recognize the modifier for touch events.

The following event recognizer of input modes and input-related classes can now also be used with touch gestures:

CreateBendInputMode.splitOrthogonalSegmentRecognizer.

ResizeStripeInputMode.resizeNeighborsRecognizer and ignoreContentRecognizer.

CreateEdgeInputMode.portCandidateResolutionRecognizer and enforceBendCreationRecognizer.

GraphInputMode.multiSelectionRecognizer.

TableEditorInputMode.multiSelectionRecognizer.

ReparentNodeHandler.reparentRecognizer.

PortRelocationHandle.portCandidateResolutionRecognizer.

The hitTestRadius property of the following implementations of ICanvasContext now correctly contain the value in world coordinates instead of view coordinates:

The context created by ICanvasContext.createCanvasContext when passing a CanvasComponent but no hit test radius.

The context passed to IPositionHandlers by MoveInputMode.

The context passed to adjacent handles when moving a bend handle.

The context passed to callback parameter in the IRenderContext.setDisposeCallback method.

Disabling MarqueeSelectionInputMode during the gesture via code left the marquee visible on the screen.

Panning with two fingers held down does no longer change the zoom level.

The Clicked and DoubleClicked events of ClickInputMode were sometimes missing when clicking on a node or edge. Now, they are always triggered unless the event was handled before.

Changing the values of the CreateEdgeInputMode.dummyEdgeGraph.edgeDefaults property had no effect for some interactions.

Node-to-edge snapping is now disabled by default which is the documented and intended value. For this, the initial value of the GraphSnapContext.nodeToEdgeDistance property is set to -1.0.

Snap lines which indicate the same size are no longer shown for implicitly re-sized parent group nodes.

The default implementation of IPortSnapResultProvider never returned any snap results.

The LabelEditingEventArgs.context.parentInputMode property provided in the events GraphEditorInputMode.LabelAdding, GraphEditorInputMode.LabelEditing, TableEditorInputMode.LabelAdding and TableEditorInputMode.LabelEditing now contains the corresponding GraphEditorInputMode or TableEditorInputMode instance.

The CreateEdgeInputMode.cancelGestureOnInvalidTarget property was sometimes ignored on touch-enabled devices.

CreateEdgeInputMode: The validBeginCursor is now correctly hidden during edge creation when bend creation isn't allowed.

Fixed an exception when enabling TextEditorInputMode.rotateTextBox.

Pen input was not handled at all on Android devices. Now, it is treated as mouse input.

Table

When a stripe is removed, ITable.LabelRemoved events for the implicitly removed associated labels are now raised, too.

When a selected stripe label is edited its text box now is correctly placed.

ReparentStripePositionHandler: The source and target ghost visualization was not always updated correctly when custom ghosts were used.

Selected stripe labels no longer remain selected after their owning stripe is deleted.

The selection indicator for selected stripe labels is now shown correctly.

The implementations of IStripeHitTestHelper and IBoundsProvider in the lookup of an IStripe could neither be decorated nor overridden by the context lookup provided by a stripe style.

Layout

Corrected an error in the Rectangle2D.contains(Rectangle2D) method. As a consequence of this error, the results of various algorithms and automatic layouts could have been wrong.

HierarchicLayout: Fixed problem that sometimes caused an unnecessarily large distance between adjacent layers.

OrthogonalLayout now considers edge grouping also if there are no directed edges specified.

Incompatible Changes

See the Migration Guide document (of your local yFiles for HTML installation) for more details and advice on migrating.

Incompatible API Changes

The IEnumerable.reduce method now uses the same argument order and semantics as the default Array.prototype.reduce method. This means the initialValue parameter is now the (optional) last parameter and the first element of the enumerable becomes the initialValue if that is undefined. Previously, the order of these two parameters was reversed.

Renamed MouseEventRecognizers and TouchEventRecognizers to be in line with the common JavaScript notation.

Renamed the values of the KeyEventType enum to match the corresponding JavaScript event type.

The CanvasComponent.sizeChangedTimerInterval property now is a proper TimeSpan instead of a simple number.

CanvasComponent: Removed the events MouseWheelZoomFactorChanged, MouseWheelScrollFactorChanged, AutoDragChanged and HitTestRadiusChanged. These events are unneeded since the corresponding properties are not changed by library code.

CanvasComponent: Removed the events GotFocus and LostFocus. These just duplicated the focus and blur events on the CanvasComponent.div element. Use these events instead.

The CanvasComponent.animateScrollTo method has been removed and is superseded by the new zoomToAnimated methods.

GraphModelManager.useHierarchicNodeNesting has been removed. Set the new hierarchicNestingPolicy property to HierarchicNestingPolicy.NONE to disable node nesting or to either HierarchicNestingPolicy.NODES or HierarchicNestingPolicy.NODES_AND_EDGES to use nesting. Similarly, GraphModelManager.useHierarchicEdgeNesting has been removed. Use either HierarchicNestingPolicy.NODES_AND_EDGES to enable edge nesting or any other policy to disable it.

ItemClickedEventArgs now extends ClickEventArgs.

The GraphInputMode.canvasClicked event now provides the GraphEditorInputMode or the GraphViewerInputMode as parent input mode in the context property of its ClickEventArgs.

The GraphEditorInputMode.createMoveUnselectedInputMode method has been removed. Use the property moveUnselectedInputMode instead.

CreateEdgeInputMode's edgeCreator might receive null as targetPortCandidate parameter. Callbacks must handle this case by either creating a target port of their own or canceling the edge creation by returning null.

The CreateEdgeInputMode.showPortCandidates property has now the enum type ShowPortCandidates instead of boolean.

The OverviewInputMode.autoMouseWheelZoom property is superseded by the new mouseWheelBehavior property.

The protected factory method MoveLabelInputMode.createLabelHitTestable has been removed. Developers who want to set a custom instance need to set it directly to the hitTestable property.

MoveViewportInputMode: The properties that controlled the inertia behavior have been removed since they no longer apply to the new algorithm. Instead, the new property inertiaDuration can be used to specify the duration of the inertia scrolling.

Replaced overloaded methods that are intended to be overwritten with non-overloading sets of methods since the latter are easier to actually override one by one. See the migration guide for details. The following methods are affected.

CreateEdgeInputMode.createEdge.

CreateEdgeInputMode.getSourcePortCandidate.

CreateEdgeInputMode.getSourcePortCandidateProvider.

CreateEdgeInputMode.getTargetPortCandidateProvider.

IPortCandidateProvider.getSourcePortCandidates.

IPortCandidateProvider.getTargetPortCandidates.

GraphClipboard.paste.

GraphCopier.copyNode.

Removed unnecessary Enabled parts from the following property names.

EdgeSegmentLabelModel.autoRotationEnabled is now autoRotation.

EdgePathLabelModel.autoRotationEnabled is now autoRotation.

LabelLayoutTranslator.autoFlippingEnabled is now autoFlipping.

SingleCycleLayout.fromSketchModeEnabled is now fromSketchMode.

SliderEdgeLabelLayoutModel.autoRotationEnabled is now autoRotation.

DiscreteEdgeLabelLayoutModel.autoRotationEnabled is now autoRotation.

CanvasComponent.mouseCaptureEnabled is now mouseCapture.

ReparentStripePositionHandler: All callback methods dealing with ghost objects have been renamed consistently:

Renamed the methods CanvasComponent.globalToLocal to toViewFromPage and localToGlobal to toPageFromView.

The ITable.relativeLocation property has been removed. Use ITable.insets with corresponding left and top values instead.

The properties layerConstraintFactory and sequenceConstraintFactory of HierarchicLayoutData have been marked as obsolete. The new properties layerConstraints and sequenceConstraints should be used instead. Similarly, the extension methods HierarchicLayout.createLayerConstraintFactory(IGraph) and HierarchicLayout.createSequenceConstraintFactory(IGraph) have been marked as obsolete.

Changes of Default Behavior

Previously, even if the GraphModelManager.useHierarchicEdgeNesting property was set to true, canvas objects for edges were added to the GraphModelManager.edgeGroup as long as no group nodes were part of the graph. The corresponding new HierarchicNestingPolicyNODES_AND_EDGES has no such behavior and thus, edgeGroup is empty by default. Use one of the other polices if canvas objects for edges should be part of edgeGroup.

ClickInputMode now dispatches the more specific events LeftClicked, RightClicked, LeftDoubleClicked and RightDoubleClicked before the general Clicked and DoubleClicked events. Hence, Clicked and DoubleClicked will only be triggered if the event wasn't handled before.

The CanvasComponent.dragSize property no longer applies to touch input. Use the new property dragSizeTouch for controlling the drag size for touch input.

The CanvasComponent.hitTestRadius property no longer applies to touch input. Use the new property hitTestRadiusTouch for controlling the hit test radius of touch input.

Inertia scrolling of the viewport behaves now in a more natural way. The scrolling stops now after a fixed amount of time. Previously, the duration depended on the initial inertia velocity.

The LayoutExecutor.updateContentRect property is now enabled by default.

GraphBuilder, TreeBuilder and AdjacentNodesGraphBuilder: The values returned by a node or edge ID binding must now be a string or number.

If the TreeBuilder.idBinding property is specified, the childBinding must now resolve to values that contain the node IDs. Previously, it was fine if the values contained either the business objects or the IDs. If your childBinding resolves to values that contain the business objects, simply don't set an idBinding.

The CreateEdgeInputMode.dummyEdge property is now always reset after the edge creation was finished or canceled.

MoveLabelInputMode: The moved label now is visualized as a preview instead of a symbolic rectangle. Set the visualization property to Visualization.GHOST to restore the old mode.

In CreateEdgeInputMode the determination whether the mouse hovers over a valid end has changed. If forceSnapToCandidate is disabled, the endHitTestable now is queried first and a target port candidate is only searched if the hit testable returns true. Previously, the hit testable was only queried if no target port candidate was found at the current location.

GraphML: Duplicate properties on XAML input are now considered an error in accordance with the XAML specification.

PolylineEdgeStyle defaults to an improved smoothing algorithm when using the smoothingLength property. This is especially apparent when using large values for smoothingLength.

The stroke thickness is now considered for the calculation of the origin of the default arrow visualizations. This can result in a slightly different rendering of the arrows.

The default edge style of an IGraph now has a target arrowhead. This is in coherence with the default styling on other yFiles products.

Brightened the color of the marquee and lasso selection visualization.

By default, stripe labels that are programmatically selected or highlighted don't show a selection or highlight indicator anymore.

Rect.isFinite and Size.isFinite now also consider empty instances as not finite.

Minor Incompatible Changes

The changes listed in this section are incompatible changes that we consider as unlikely to break customer code. For most of them it is unlikely that the corresponding API was used in customer code.

The return type of the TextRenderSupport.measureText method is now Rect instead of Size.

The AnchoredPortLocationModelExtension class has been moved to the GraphML compatibility demo where it was really needed.

SolidColorFill, PatternFill, and all types related to gradients are now final. They were never intended to be extended. Brush is now abstract since it is pointless to instantiate this base class.

There is no constructor that only takes a renderer in StringTemplateLabelStyle and StringTemplatePortStyle anymore. A renderer may still be specified in the existing constructor as second parameter together with an optional template string.

The Property.defaultValue property has been removed since it was not intended to be part of the public API.

Removed the GraphMLSupport.getGraphMLIOHandler protected method in favor of the graphMLIOHandler property.

Removed the LayoutGraphAdapter.applyLayout static method which is the same as the IGraph.applyLayout method.

Removed the TextDecorations enum since it was an unused duplicate of TextDecoration.

Remove the unused InteractiveOrganicLayout.workingRatio property.

The protected method CollapsibleNodeStyleDecorator.createSelectionInstaller has been removed.

Error messages don't start with the error name anymore. The error name can be obtained through the dedicated name property of the error.

The following static methods were available at two different types, one intended and documented and one unintended and undocumented. The undocumented methods have been removed:

yfiles.graph.TableAnimation.createTableAnimation, use yfiles.view.IAnimation.createTableAnimation.

yfiles.graph.Table.getCellBounds, use yfiles.graph.ITable.getCellBounds.

yfiles.graph.Table.placeNodeInCell, use yfiles.graph.ITable.placeNodeInCell.

yfiles.layout.PartitionLayout.createPolylineInterEdgeRouter, use yfiles.layout.IPartitionInterEdgeRouter.createPolylineInterEdgeRouter.

Most Notable Demo Improvements

The renewed Angular demo demo shows how easy it is to integrate yFiles for HTML with Angular CLI. This is possible since this demo uses the ES6 module version of the library. The previous Angular demo is now available as Angular (SystemJS) demo.

Instead of an AMD loader, the TypeScript demo now uses import statements and webpack together with the ES6 module version of the library. Consequently, the previous version of the demo was renamed to TypeScript (AMD) demo.

A new step for the Getting Started Tutorial demonstrates the minimal source code to add drag and drop to an application.

The graph-to-JSON converter of the demos now supports labels. This enhances the data exchange with other services and with code that runs as a web worker.

In addition, the rendering of SVGs that contain nested <svg> elements is slow, too. Such nested <svg> elements are not used in library styles and should be replaced with <g> elements in custom styles whenever possible.

In Edge 16 (Windows 10 Fall Creators Update), SVG <marker> elements may crash the current tab. The default demo styles use <path> elements instead of <marker> elements for arrows in this browser and custom styles should be changed in this way, too.

Find more details about these and other browser issues in the Known Issues document (of your local yFiles for HTML installation).

Improvements

Event listeners that invoke preventDefault are now registered with the option passive: false to conform to the new DOM spec and to prevent warnings on the browser's console.

Images which cannot be exported due to cross origin restriction are now replaced with a fallback image instead of throwing an error. Additionally, an optional 'strict' mode can be enabled which will cause the export to fail for these types of errors. The resulting errors can be caught in the export promise.

Bugfixes

In rare cases, ES6 classes that extend a yFiles class did not initialize correctly and threw errors on member access.

View

CanvasComponent: The value and the width of the scrollbar thumb sometimes were displayed incorrectly after the component was resized.

Fixed missing drop shadow of PanelNodeStyle.

ImageNodeStyle: The fallback image for an unresolved image is now correctly displayed in Internet Explorer.

The NodeStyleStripeStyleAdapter.updateVisual method always created a new visual by delegating to the createVisual method.

MoveViewportInputMode: The Dragging, Dragged, DragCanceling, DragCanceled, DragFinishing and DragFinished events did not fire reliably for touch input and when mouse inertia was active.

The ICommand.COPY command is no longer executed twice.

Fixed a bug in ViewportAnimation that sometimes moved the viewport a bit before the animation started.

Pen input was not handled at all on Android devices. Now, it is treated as mouse input.

In Internet Explorer, users could interact with the viewport indicator of the OverviewComponent even if the component was set to visibility="hidden".

Layout

HierarchicLayout: Fixed an error that occurred when both layering constraints and edge directedness (with HierarchicLayout.EDGE_DIRECTEDNESS_DP_KEY) were specified.

HierarchicLayout and SimplexNodePlacer: Fixed a rare error that could be triggered when the input graph had a partition grid and PortCandidates or PortConstraints.

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

HierarchicLayout creates better port assignments for edges incident to group nodes that are routed directly. Previously, such edges were often reversed.

HierarchicLayout no longer violates the specified PortCandidates of edges with labels with preferred placement specifier LabelLayoutConstants.PLACE_AT_SOURCE_PORT or LabelLayoutConstants.PLACE_AT_TARGET_PORT when using an orientation other than top-to-bottom.

HierarchicLayout with partition grid: Avoid an error when the layout algorithm is configured to stop after the layering or sequencing phase (see HierarchicLayout.stopAfterLayering and HierarchicLayout.stopAfterSequencing).

EdgeRouter: Fixed an error that occurred for graphs with fixed edges and very short segments.

SeriesParallelLayout no longer misplaces edge labels for graphs with only a single edge.

Incompatible Change

The module yfiles/view-graphml no longer depends on yfiles/view-table and yfiles/view-editor. These dependencies were undocumented and unintended. If you use the GraphML feature and the table or editor feature, make sure to require the corresponding module(s) explicitly.

Notable Demo Improvements

Optimized several styles used in demos for better rendering performance in Firefox and iOS browsers. See the performance notices in the documentation for details and tips.

Context menus now open on iOS devices.

Enabled a workaround in the default demo styles that avoids a fatal error in Edge 16 (Windows 10 Fall Creators Update) that ultimately prevented the loading of the web page. For more details, see the Known Issues document (of your local yFiles for HTML installation).

Additionally, we have released a TypeScript migration tool on GitHub that helps with the migration of TypeScript files that reference yFiles for HTML 1.x API to the yFiles for HTML 2.x API.

New Demos

Decision Tree

An interactive decision making app with automatic incremental layout. You can explore the existing samples, and create or load your own decision tree.

Partition Grid

An interactive explorer for the PartitionGrid class. A partition grid distributes the nodes into rows and/or columns during an automatic layout. This can be used, for example, to realize layouts of graphs with swimlanes or tables.

Workarounds for Browser Issues

Safari 11 and all WebKit browsers on iOS 11 are affected by a rendering issue that causes missing or not correctly zoomed graph elements, seemingly broken user interaction, and other artifacts. This can be prevented by enabling the already existing workaround yfiles.workaroundCR320635 which was originally added for a Chrome bug. See the related Knowledge Base article for more information on enabling this workaround and the WebKit bug report for more details on the issue.

Find more details about these and other browser issues in the Known Issues document (of your local yFiles for HTML installation).

Improvements

TypeScript: Made the typings provided by yfiles-api.d.ts compatible with TypeScript 2.5.

yfiles.styles.IArrow.NONE and yfiles.input.HandleTypes.INVISIBLE insert an empty <g> element into the DOM instead of an empty <use> element. The latter resulted in validation errors with exported SVG images in some SVG validators.

Bugfixes

View

In some cases, removing an event listener which was not created using yfiles.lang.delegate caused an error.

Creating an ES6 subclass of a subclass with overridden yFiles members resulted in incorrect run-time behavior when the lower subclass was instantiated before its super classes.

TouchEnter event: The value of the location property was not correct.

LayoutExecutor.stop() did not immediately stop the layout animation as it is supposed to.

MoveInputMode did not correctly recognize move interactions when triggered using touch gestures in Edge and Internet Explorer.

CreateEdgeInputMode fired gesture cancel events even if it was not started before.

DropInputMode: An error occurred if a DragEnter event was recognized while another drag action was still running.

StripeDropInputMode no longer calls itemCreator twice.

The StripeDropInputMode.ItemCreated event was not raised.

GeneralPath.IsVisible often returned true for invisible paths.

Layout

OrthogonalLayout: Fixed rare bug that caused overlapping nodes.

OrthogonalLayout: Improved from-sketch mode in conjunction with node labels or node halos. Previously, in the presence of the mentioned elements, the layout results did not always correctly resemble the sketch drawing, even if it was a good sketch.

HierarchicLayout: Fixed edge ports lying outside the node boundaries when using the edge thickness feature (i.e. edges with thickness greater than zero) together with a (rather large) grid spacing value and the default port assignment PortAssignmentMode.DEFAULT.

Notable Demo Improvements

Improved printing support to prevent the initial print document from being empty in some browsers.

Flowchart node style: The updateVisual() method now correctly handles changes of the flowchart type of a node.

The demos use larger values for the dragSize and the hitTestRadius if the input device is a touch device.

New Demos

An editor for Flowchart diagrams that features interactive editing, tailored Flowchart node styles, and a specialized layout algorithm.

Tree Layout Demo

Shows how to use different node placers with the automatic tree layout.

Clustering Algorithms Demo

Showcases a selection of clustering algorithms:

Edge Betweenness Clustering

k-Means

Hierarchical Clustering

Biconnected Components Clustering

Neo4j Demo

Shows how to load data from a Neo4j database and display it with yFiles for HTML.

CSS3 Animations and Transition Demo

Shows how CSS3 transformations and animations can be applied to graph items.

Edge Bundling Demo

Shows edge bundling which reduces visual clutter in dense graphs.

Node Label Placement Demo

Shows how to place edge labels at the preferred location with a labeling algorithm.

Edge-to-edge Connections Demo

Shows how edge-to-edge connections can be realized. More precisely, it shows how to configure the input mode to allow edges to be connected not only to nodes but also to other edges.

Move Unselected Nodes Demo

Shows a special input mode that allows moving nodes without selecting them first.

Improvements

Improved performance when the webcomponents.js polyfill for the Shadow DOM API is used.

FilteredGraphWrapper can now deal with node and edge predicates that evaluate to truthy or falsy values. Previously, predicates that did not strictly return true or false resulted in an error with messages like "Node not in this graph".

SvgExport: 'id' attributes are now copied to the wrapping <g> element of inlined images. This retains the possibility for the image to be referenced in the exported SVG document. This frequently occurs if the inlined image is part of the <defs> section of an <svg> element.

By default, SvgExport modifies the copied 'id' attributes to make sure they are unique. This behavior can be switched off with the new property SvgExport.ensureUniqueIds.

TypeScript: The static isInstance method of all yFiles classes and interfaces is now part of the typings and specified as user-defined type guard function to avoid superfluous type casts and improve coding experience in IDEs.

TypeScript: The typings now use any instead of Object for property types and method parameters to allow usage of primitive types. Most prominently, the ITagOwner.tag property can now be set to a string value without explicitly casting it to any.

Bugfixes

View

During reparenting, the edges at reparenting nodes were drawn below the group(s) and thus they were not visible. If reparenting was canceled, these edges stayed behind the group(s) and remained invisible.

The promise returned by GraphEditorInputMode.addLabel and TableEditorInputMode.addLabel now fulfills with null instead of the label if the editing was canceled or the text did not validate. This is the documented behavior.

CreateEdgeInputMode did not always start correctly for quick gestures on slow devices.

CreateEdgeInputMode did not trigger the EdgeCreationStarted event for programmatic initialization of the edge creation gesture.

Setting CreateEdgeInputMode.cancelRecognizer could potentially get the input mode into a broken state.

In the unusual case that a validBendHitTestable is used, CreateEdgeInputMode will no longer cancel edge creation when using touch and trying to create a bend at an invalid location. Therefore, touch input behaves now in the same way as mouse input.

Fixed a possible error in NodeDropInputMode when snapping is enabled and preview is disabled.

Drag and drop did not work if the GraphComponent was in a shadow DOM.

Changing HandleInputMode.pressedRecognizerTouch had no effect if the input mode was already installed.

HandleInputMode.currentHandle could not always be obtained during the DragFinished, DragFinishing, DragCanceling, and DragCanceled events.

Switching the GraphComponent's inputMode in a key event handler threw an exception.

The 'S' and 'T' keys are now correctly reported as these keys by the KeyEventArgs.key property. Previously, they were swapped, 'S' was reported as 'T' and vice versa.

FreeLabelModel.INSTANCE, FreeEdgeLabelModel.INSTANCE, and FreeNodeLabelModel.INSTANCE are now serialized correctly to GraphML even when not used as part of their parameters (e.g. within CompositeLabelModel).

Labels with NinePositionsEdgeLabelModel now disappear when the owner edge has no visible edge path. This can happen for example when nodes are moved onto each other. Previously they appeared at unexpected locations, including the origin (0,0) and the upper left corner of the source node.

GeneralPath.getTangent now returns null if there is no tangent at the requested position. Previously, it returned a bogus tangent.

Prevent errors with the message "TypeError:Attempting to change access mechanism for an unconfigurable property" in Safari 10. This error was thrown when a constructor was declared using the yFiles class framework in code that was not using "strict-mode".

In Safari for macOS, changed the default shortcut for the Toggle Item Selection command from Command+Space to Control+Space. Command+Space is reserved for Spotlight.

The last row and column of the grid were sometimes not display, especially after zooming and panning.

Creating subclasses of subclasses with abstract yFiles members using the class framework resulted in incorrect runtime behavior when the lowest subclass was instantiated first.

GraphMLSupport.openFile: After a user canceled the file open dialog once, promises returned by this method stayed always in pending state and were never fulfilled.

GraphML: Writing an item's tag threw an error if a value was an array.

GraphML: The TextTrimming enum was erroneously obfuscated by the deployment tool and, as a result, the obfuscated name could have been used in GraphML files in rare cases. Reading such a file with a new build of your app resulted in an error since the obfuscated name had likely changed.

The following static methods internally called the wrong code and always threw an error: IAnimation.createTableAnimation, ITable.getCellBounds, and ITable.placeNodeInCell.

Layout

HierarchicLayout: PropertyHierarchicLayout.componentArrangementPolicy was not correctly considered when there are undirected edges.

Tree layout: DefaultNodePlacer.minLastSegmentLength erroneously returned the value of minFirstSegmentLength.

Tree layout: Prevent a memory leak in DefaultPortAssignment.

If PartialLayout.edgeRoutingStrategy was set to STRAIGHTLINE, all edges were rerouted in the graph, instead of just the ones that were required.

EdgeRouter: The minimum first and last segment length were sometimes not respected if they were set to relatively large values.

Image Export Demo: Added two workarounds for problems with Internet Explorer and current Firefox versions, respectively.

Improvements

Improved rendering performance mostly in Chrome. In bad case scenarios, the frame rate now is up to three times as high.

InteractiveOrganicLayout: Significant performance improvements during interactive changes of the graph, for example when a user moves nodes.

Input modes that use a combination of mouse gestures and modifier key(s) can now be started by the key press. Previously, such an input mode was only started by the first mouse event, e.g. a mouse move. The main benefit is that the cursor changes instantly with the key down to the input mode's one.

CanvasComponent: Overridable methods maybePreventPointerDefault and maybePreventContextMenuDefault have been added to control which event's default behavior should be prevented by the component.

Added the alias yfiles.lang.Interface for yfiles.lang.Trait. Interface is the intended name since 2.0 and most documentation was already referring to Interface instead of Trait. Note that we keep yfiles.lang.Trait for compatibility reasons for now.

Bugfixes

View

The event StripeDropInputMode.StripeCreated always returned a wrong stripe instance.

The EditLabel command was not working directly on labels when a TableEditorInputMode was active.

TableLayoutConfigurator erroneously considered labels on the left side as top labels, and consequently might have created insets of incorrect size.

RecursiveGroupLayout: Fixed bug that caused edges to share the same port even though they should have been assigned to different ports. Note that this problem only appeared if the core layout algorithm was an instance of class HierarchicLayout.

IsolatedGroupComponentLayout: Fixed bug that caused edge labels that intersected with group nodes even though option ComponentLayout.considerLabels was enabled.

ComponentLayout , IsolatedGroupComponentLayout, and BusRouter: Fix a problem with rounding that could result in erroneous layouts in rare cases.

Documentation Viewer Improvements

The detailed descriptions of the methods for event registration and de-registration were not displayed.

The inheritance hierarchy of a type was not properly displayed.

In the code generator, corrected the generated code for events.

Fixed the display of the sidebar in pinned mode.

The documentation viewer can now be opened from the file system even if third-party cookies are disabled.

yFiles for HTML 2.0.1 - Changes Since 2.0.0.1

This maintenance release for yFiles for HTML 2.0 contains several brand-new demos, brings back most demos that were part of yFiles for HTML 1.3 but not of 2.0, and the GWT extension is available again. In addition, we corrected several errors and included small improvements.

New Demos

An editor for Business Process Diagrams that features interactive editing, BPMN node styles and a specialized BPMN layout algorithm.

Network Monitoring Demo

Example of a monitoring tool for computer networks.

Network Flow Demo

Presents three network flow graph analysis algorithms that are applied on a network of water pipes. Flow algorithms can be applied to various other problem domains from everyday life, for example electricity/power, internet, and transportation.

Transitivity Demo

Shows how transitivity graph analysis algorithms can be applied to graphs to answer reachability questions. The demo presents two example graphs: the dependencies between the yFiles for HTML modules and the dependents and the dependencies of an npm package.

Mindmap Demo

A Mindmap viewer and editor.

React Demo

Shows a React component that renders the yFiles for HTML graph component.

Loading and Bundling Demos

AMD Loading: Loads the yFiles module resources using the require function that is defined in the AMD loading standard.

Layout

BalloonLayoutData, HierarchicLayoutData, LabelingData, OrthogonalLayoutData, SeriesParallelLayoutData, and TreeLayoutData now have an edgeLabelPreferredPlacement property which supports an ItemMapping for edge labels to provide a PreferredPlacementDescriptor. This can replace mappers registered with the key LayoutGraphAdapter.EDGE_LABEL_LAYOUT_PREFERRED_PLACEMENT_DESCRIPTOR_DP_KEY.

PartitionGridData: It is now sufficient to specify one of row mapping and column mapping. The unspecified one will automatically be set to 0, resulting in a single row or column being used.

The ItemMapping.mapper property is now automatically set on first read-access to the property, enabling more convenient use of the mapper without first having to instantiate a matching instance.

HierarchicLayout: Slightly reduced the number of bends when integrated edge labeling is enabled.

HierarchicLayout: Fixed unstable from-sketch behavior for non-default layout orientations when group nodes are folded or expanded. Applies to orientations LayoutOrientation.LEFT_TO_RIGHT, LayoutOrientation.RIGHT_TO_LEFT and LayoutOrientation.BOTTOM_TO_TOP. Geometry information registered with data providers with keys HierarchicLayout.ALTERNATIVE_GROUP_BOUNDS_DP_KEY and HierarchicLayout.ALTERNATIVE_EDGE_PATH_DP_KEY is now automatically rotated according to the specified layout orientation.

Added the flag yfiles.workaroundIE7766782 that enables a workaround for the Internet Explorer JIT bug 7766782, which can cause class initialization errors when using the yFiles for HTML GWT Overlay in Internet Explorer, especially when the GWT Overlay is used in combination with Smart GWT (more information on browser issue workarounds).

View

Fixed missing browser prefix of certain cursors.

Fixed visibility of scrollbar handles of CanvasComponent. The handles were not displayed for ScrollBarVisibility.ALWAYS.

FilteredGraphWrapper no longer re-checks its predicates when labels or ports are removed nor when properties of graph items are changed. This prevents inconsistent filtering when the filtering predicate changed recently and changes are made to the graph before nodePredicateChanged or edgePredicateChanged have been called.

Some styles erroneously called IRenderContext.childVisualRemoved after the visual was removed instead of just before the removal.

Fixed dispose callback invocation of custom visuals.

PolylineEdgeStyle: Toggling the pen between dashed and solid styles did only work once. Then, the SVG path stayed at solid regardless of the pen's dash style.

Fixed missing TemplateBindings for labelText, isFlipped and isUpsideDown for styles of type TemplateLabelStyleBase.

Fixed a bug that might occur when changing wrapped styles in CollapsibleNodeStyleDecorator, ShadowNodeStyleDecorator, NodeStyleLabelStyleAdapter and NodeStylePortStyleAdapter.

Rendering of BevelNodeStyle inset rectangle position was wrong when inset value was changed.

CircularLayout and RadialLayout: Fixed bug that caused that always all edges were bundled if bundling is enabled for at least one single edge. More precisely, property EdgeBundleDescriptor.isBundled wasn't considered correctly.

SingleCycleLayout: Fixed bug that could lead to an error if edge bundling is enabled and a custom node sequencer is specified.

CircularLayout: Fixed bug that in some cases produced self-intersecting edges when edge bundling is enabled.

EdgeRouter: Fixed rare error that was triggered when having multiple target port candidates, where at least one must be fixed. Furthermore, to trigger the exception it is necessary that the path search algorithm tries to perform an early exit due to maximum duration restrictions or a stop request via AbortHandler.

Removed property InteractiveOrganicLayout.automaticStructureUpdate since this couldn't be used with LayoutExecutor or LayoutGraphAdapter.

Removed property CanvasComponent.enabled since it had the same effect as the autoDrag property.

Removed property CanvasComponent.autoMouseWheelZoom since it had no effect anyway. It was replaced by the mouseWheelBehavior property in release 2.0.

Removed property CanvasComponent.editable since it had no effect on almost all input modes anyway. The preferred way to disable editing is using GraphViewerInputMode or GraphEditorInputMode with suitable settings.

Removed unused enum yfiles.router.ChannelOrientation.

VisualCachingPolicy.ALWAYS replaces both VisualCachingPolicy.WEAK and VisualCachingPolicy.STRONG. These two had the same effect.

Changed some API members of the yfiles.graphml.Property type which is very rarely used in customer code.

Behavior Changes

IGraph and its implementations now always throw an ArgumentError for operations on elements which are not in the graph (was: ArgumentError, ArgumentOutOfRangeError, IllegalOperationError).

IGraph and its implementations now always throw an IllegalOperationError for operations which are not allowed (was: ArgumentError).

GraphML parsing: For properties which are renamed using the GraphMLAttribute only the explicitly set name is accepted. The property's actual name is no longer accepted as fallback.

HierarchicLayout may now place source/target labels in layers that contain common nodes. In previous versions such labels were always placed in separate layers which often led to less compact drawings with superfluous bends.

SingleCycleLayout.nodeSequencer now allows to specify null to return to the default sequencer. In previous versions, specifying null led to an error.

HierarchicLayout: Geometry information registered with data providers with keys HierarchicLayout.ALTERNATIVE_GROUP_BOUNDS_DP_KEY and HierarchicLayout.ALTERNATIVE_EDGE_PATH_DP_KEY is now automatically rotated according to the specified layout orientation. This fixes unstable from-sketch behavior in incremental layout mode when using an orientation other than top-to-bottom.

yFiles for HTML 2.0.0.1 - Changes Since 2.0

This is the first bugfix release for 2.0. It focuses on new demos, performance improvements, and bugfixes. It contains one minor incompatible API change and two incompatible interaction behavior changes.

Most Notable Changes

Better Layout Performance

Performance improvements for most layout and analysis algorithms. Most layout algorithms are now between 15% and 70% faster than their 1.3 version counterparts. Speed-up varies depending on graph structure, settings, and graph size.

This demo shows decorator styles for nodes, labels, and edges that add a visual decoration to a base visualization, for example a status icon to a rectangular shape.

Incremental Hierarchic Demo

This demo shows the incremental mode of the hierarchic layout algorithm.

HTML Popup Demo

This demo shows pop-up panels that display additional information about a clicked node or edge. In general, such panels can contain any HTML elements.

Improvements

The class framework now also understands classes generated by the TypeScript compiler if the compiler target is ES5.

SvgVisual now has two static members for helping with the efficient implementation of SVG transform manipulations: SvgVisual.setTranslate and SvgVisual.setScale

The performance of StripeControlStyle was improved substantially.

The AMD meta modules now only ever load the effective modules, resulting in less requests made for AMD loading.

The simple Promise shim included with the library now allows for chaining .catch calls.

The yfiles-typeinfo.js debug helper code now adds the yfiles.debug() API.

On MacOS, the multi-selection feature, the pan viewport feature, and the force bend creation feature now also accept Command mouse clicks as an alternative gesture. This avoids conflicts with the default gesture to open the context menu, namely Ctrl mouse clicks.

The default keyboard shortcuts for MacOS devices have been updated to follow MacOS conventions. Where previously the Ctrl key needed to be pressed for many of the default keyboard shortcuts, now the Command key will be used.

The default keyboard shortcuts for cut, copy, and paste have been updated to also react to Shift+Delete, Ctrl+Insert, and Shift+Insert respectively. The exact behavior can be fine-tuned via resource customization.

Demo Improvements

The require.js sample implementation for the demos now properly understands the AMD paths configuration known from requirejs.org's implementation.

In most demos, all JavaScript initialization code was moved to the main JavaScript file from the index.html file. Note that if our simple require implementation is used for loading the demos, the improved version of the same file is required now, too.

The demos now show a friendly warning if viewed in a browser that does not natively support ES6. It explains how to run the required pre-compilation step, first.

The performance of the graph item styles used in the demos was improved.

Visualization of self-loops of the demo edge style was improved.

The layout style demo now show-cases the integrated edge-labeling feature for tree layouts.

Many more fixes and improvements in the demos.

Bugfixes

Loading a new GraphML file could result in an error when loading was initiated from inside a folder node.

Table columns were read in the reverse order from GraphML. The file content itself is correct since GraphML writing was not affected.

Subclassing yFiles types did not work properly for the second level of subclasses.

Subclassing a yFiles type with abstract members and implementing interfaces at the same time did not work.

Using folding on a filtered graph could result in errors, for example after calculating an automatic layout.

The TypeScript demo did not properly compile if tsc's noImplicitAny option was set.

GraphML serialization of ArcEdgeStyle did not work properly.

The JavaScript code completion file in ide-support did not properly mark constructors for generic types, possibly resulting in warnings in IDEs.

The simple Promise shim included with the library could throw an error during promise resolution.

Calling contains(p:Point) on an IRectangle other than a Rect did not work.

The simple constructor of MapperInputHandler did not set the value type correctly.

CircularLayout produced self-intersecting edges when edge bundling was enabled.

Incompatible Changes

The three static helper methods on GraphItemTypes were poorly named and the method contains did not behave according to the documentation. contains is now called enumerableContainsTypes, notContains is now called enumerableNotContainsTypes, and is is now called itemIsOfTypes.

On MacOS systems where previously the Ctrl key needed to be pressed for many of the default keyboard shortcuts, now the Command key will be used instead. This behavior can be fine-tuned via resource customization.

Default keyboard shortcuts for cut, copy, and paste now also react to Shift+Delete, Ctrl+Insert, and Shift+Insert respectively. This behavior can be fine-tuned via resource customization.

yFiles for HTML 2.0 - Changes Since 1.3.0.5

Major New Features Added

The whole API has been thoroughly reviewed and refactored resulting in a massively improved user/developer experience. New features can be understood more quickly and are easier to implement on top of the existing APIs. Consistent API names and hierarchies can be memorized more easily. Infrequently used and inconvenient APIs have been removed from the public API which means a leaner framework. This results in a much improved learning curve.

Improved the overall JavaScript experience throughout the API with function overloads, optional arguments, and option parameter objects. This adds more flexibility while at the same time enhances developer productivity.

The API´s compatibility to third party class frameworks was improved, enabling convenient and efficient use of EcmaScript 6 and TypeScript classes. Not having to use the old class-framework anymore improves tooling support and enhances developer productivity.

The API supports modern EcmaScript concepts and types like Promises and a collections API that is inline with the most recent EcmaScript Array and Iterable API.

The performance of the view component has been improved on average between 20% and 35% for larger graphs where previously 60 FPS could not be achieved.

The developer's guide has been rewritten and revised almost entirely. A lot more code examples and a whole set of new chapters that deal with the customization of the various features provided enable developers to more easily and more quickly implement their requirements. The layout documentation now also contains sample graphs that visually show the effects of the various settings.

The yFiles modules have been restructured and are now smaller in total size. The complete layout demo now requires only slightly more than 1.5 megabytes of compressed code to be transferred to the client when loaded for the first time. In addition to that module dependencies have been optimized so that for many use-cases less modules need to be loaded for an application to work, resulting in quicker overall startup times.

Support for Sankey diagrams. These diagrams visualize flow quantity between entities, for example cost or energy flow.

Support for edge bundling. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes. The following layout algorithms support edge bundling:

Circular Layout: Edge bundling is applied to edges of the same circle.

Radial Layout: Edge bundling is applied to non-tree edges.

TreeReductionStage: Edge bundling is applied to non-tree edges.

HierarchicLayout has now proper support for incremental layouts of groups with changing bounds. This is especially useful for hierarchic layout of graphs with expandable and collapsible groups. The new Hierarchic Grouping demo shows the improved behavior.

HierarchicLayout now supports port grouping. Edges are bundled at their ports, but routed independently. See PortConstraintKeys.SOURCE_PORT_GROUP_ID_DP_KEY and PortConstraintKeys.TARGET_PORT_GROUP_ID_DP_KEY.

HierarchicLayout now allows to specify the directedness of edges, see HierarchicLayout.EDGE_DIRECTEDNESS_DP_KEY. This new feature enables to, for example, support mixed graphs that contain both directed and undirected edges: While for directed edges the layering step tries to find a solution where the source of an edge is placed above the target (with respect to the main layout direction), for undirected edges the direction doesn't matter and the edge may also be inserted as same-layer edge. This feature also enables to force some edges to specifically point against the main layout direction.

HierarchicLayout now supports edges with specified thickness values. Minimum distances in the layout will consider these thicknesses, see HierarchicLayout.EDGE_THICKNESS_DP_KEY.

HierarchicLayout now supports recursively routed edges. Edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node. This routing style is specified using EdgeLayoutDescriptor.RecursiveEdgeStyle.

Added preferred placement specifiers LabelLayoutConstants.PLACE_AT_SOURCE_PORT and LabelLayoutConstants.PLACE_AT_TARGET_PORT for edge labels which express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of the HierarchicLayout.

OrganicLayout now supports the detection of regular substructures in the graph and applies a specific layout style to them such that they can be better recognized. See OrganicLayout.ChainSubstructureStyle, OrganicLayout.StarSubstructureStyle, OrganicLayout.CycleSubstructureStyle, and OrganicLayout.ParallelSubstructureStyle.

TreeReductionStage now supports the automatic placement of labels of non-tree edges. Users do not need to take care of such edge labels themselves after using a tree layout algorithm on a non-tree input graph in conjunction with the reduction stage. See properties TreeReductionStage.NonTreeEdgeLabelingAlgorithm and TreeReductionStage.NonTreeEdgeLabelSelectionKey.

SeriesParallelLayout now supports the automatic placement of labels of non-series-parallel edges. Users do not need to take care of such edge labels themselves after running the algorithm with a non-series-parallel input graph. See properties SeriesParallelLayout.NonSeriesParallelEdgeLabelingAlgorithm and SeriesParallelLayout.NonSeriesParallelEdgeLabelSelectionKey.

New API for working with the planar embedding of planar graphs. The API allows for easy iteration of the faces, darts, and consecutive edges of the embedding.

Major New Demos Added

The 2.0 release contains a sophisticated new demo that shows the graph analysis features provided by yFiles for HTML. This demo also shows how to use modern CSS animations and transitions to achieve a better user experience.

All provided demos have been refactored to not make use of the old demo framework anymore, making it much easier to reuse code from the demos in custom applications.

The demos have been rewritten using EcmaScript 6 and a conversion tool has been added that shows how to code in EcmaScript 6 and deploy to older browsers (only Internet Explorer is affected) that do not support this level of EcmaScript.

yFiles for HTML 1.4.0.1 - Changes Since 1.4

This is the 1st bugfix release for 1.4. There are no incompatible changes since 1.4.

Note that the improvements and bugfixes of this release are part of yFiles for HTML 2.0.1.1, too.

Improvement

Input modes that use a combination of mouse gestures and modifier key(s) can now recognize modifier presses independently of mouse events. Previously, a changed modifier was only recognized during the next mouse event. A main benefit is that the cursor changes instantly with the key down and up events, for example during node re-parenting.

InteractiveOrganicLayouter: Significant performance improvements during interactive changes of the graph, for example when a user moves nodes.

Bugfixes

View

The event StripeDropInputMode.StripeCreated always returned a wrong stripe instance.

When manually creating groups and the folding view is configured to collapse group nodes by default, folders were erroneously created with empty size.

TableLayoutConfigurator erroneously considered left side labels as top labels, and consequently might have created insets of incorrect size.

RecursiveGroupLayouter: Fixed bug that caused edges to share the same port even though they should have been assigned to different ports. Note that this problem only appeared if the core layout algorithm was an instance of class IncrementalHierarchicLayouter.

IsolatedGroupComponentLayouter: Fixed bug that caused edge labels that intersected with group nodes even though option ComponentLayouter.considerLabels was enabled.

Documentation Viewer Improvements

The detailed descriptions of the methods for event registration and de-registration were not displayed.

The inheritance hierarchy of a type was not properly displayed.

In the code generator, corrected the generated code for events.

Fixed the display of the sidebar in pinned mode.

The documentation viewer can now be opened from the file system even if third-party cookies are disabled.

yFiles for HTML 1.4 - Changes Since 1.3.0.7

This release brings the new layout features of yFiles for HTML 2.0 to the yFiles for HTML 1.x branch. Unlike version 2.0, the names of existing API are unchanged and have not been harmonized. The view part is unchanged except for one improvement and a small number of bugfixes.

Therefore, this release has no incompatible API changes except minor changes in the module dependencies. In addition, there are some behavior changes in the layout part. Updating code from 1.3 will require only a very small number of changes, if at all.

Major New Features

New Hierarchic Layout Features

Improved incremental layouts of groups with changing bounds. This is especially useful for hierarchic layout of graphs with expandable and collapsible groups. The new Hierarchic Grouping demo shows the improved behavior.

Port grouping. Edges can be bundled at their ports but routed independently.

Undirected edges. This enables to, for example, support mixed graphs that contain both directed and undirected edges. While directed edges typically point in the main layout direction, the direction of undirected edges doesn't matter and such edges may point to nodes in the same layer. This feature also enables to force some edges to specifically point against the main layout direction.

Edge thickness. Edges can now have specified thickness values and minimum distances in the layout will consider these thicknesses.

Recursively routed edges. With this routing style, edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node.

Bundling multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes. Edge bundling is supported by

Circular Layout: Edge bundling is applied to edges of the same circle.

Radial Layout: Edge bundling is applied to non-tree edges.

TreeReductionStage: Edge bundling is applied to non-tree edges.

Regular Substructures in Organic Layouts

Organic Layout now supports the detection of regular substructures in the graph and applies a specific layout style to them such that they can be better recognized. These substructures include chains, stars, cycles, and parallel structures.

More Preferred Label Placement Specifiers

The new preferred placement specifiers LabelLayoutConstants.PLACE_AT_SOURCE_PORT and LabelLayoutConstants.PLACE_AT_TARGET_PORT for edge labels express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of the hierarchic layout.

Automatic Label Placement

If the new option reduceAmbiguity of SALabeling and GreedyMISLabeling is enabled, these algorithms try to avoid placing labels at positions where it is not clear to which graph element a label belongs.

TreeReductionStage now supports the automatic placement of labels of non-tree edges. Users do not need to take care of such edge labels themselves after using a tree layout algorithm on a non-tree input graph in conjunction with the reduction stage.

Similarly, the series-parallel layout now supports the automatic placement of labels of non-series-parallel edges.

Planar Embeddings

A new API for working with the planar embedding of planar graphs allows easy iteration of the faces, darts, and consecutive edges of the embedding.

Clustering

Added a k-means clustering algorithm that partitions a given graph in k-clusters to Groups.

Added a hierarchical clustering algorithm that partitions a given graph based on agglomerative (i.e., bottom-up) strategy and some linkage function (single-, complete- and average-linkage) to Groups.

We added settings for these new layout features to the Layout Styles demo.

Improvements

The prefix used by DefsManager.generateUniqueDefsId can now be changed.

IncrementalHierarchicLayouter: Improved support for PortCandidates at group nodes. Previously, they were only obeyed if there was just a single candidate defined. Now, out of the given candidates, one is selected and considered for the routing. Still, fixed candidates are treated like free ones and are not supported at the side of group nodes.

IncrementalHierarchicLayouter: Routing of grouped edges that connect to nodes of different groups now assures that the whole bus segment remains outside the different group nodes. This avoids that group nodes get unnecessarily large and potentially makes drawings more symmetric.

IncrementalHierarchicLayouter: Improved edge grouping such that it is now possible to group incoming/outgoing edges as well as same-layer/backloop edges with common edges.

IncrementalHierarchicLayouter: Reduced the number of bends when integrated edge labeling is enabled.

IncrementalHierarchicLayouter now takes the original edge route into account to determine the route of a self-loop.

IncrementalHierarchicLayouter: Added properties that allow to stop the layout algorithm after the layering or the sequencing phase while skipping the subsequent phases. This may be useful when using two layout runs to collect layering and/or sequencing information in the first run that will be used during the second run.

IncrementalHierarchicLayouter: Fixed edges which have segments that should be horizontal or vertical but are slightly non-orthogonal.

IncrementalHierarchicLayouter: Improved behavior in incremental mode that moved normal nodes that were in different layers (in the initial layout) to the same layer. This behavior occurred in case there were group nodes that extended into the layer above or below to get a compact result.

IncrementalHierarchicLayouter: Added support for overlapping layers. The strict layer structure can be compacted by moving layers up into the space of previous layers. Layers are only moved if it won't produce overlaps with nodes or edges.

IncrementalHierarchicLayouter: Added support for sequence constraints between edges as well as nodes and edges, see SequenceConstraintFactory.

The following tree layouts now support custom selection of the root node of the tree: BalloonLayouter, GenericTreeLayouter, TreeLayouter, ARTreeLayouter, and HVTreeLayouter

BalloonLayouter: Interleaved child placement now works in conjunction with 'from sketch' mode and custom child order comparators. This means that the settings BalloonLayouter.fromSketchMode and BalloonLayouter.comparator are no longer ignored when enabling the interleaved placement mode.

TreeLayouter and GenericTreeLayouter now take into consideration the minimum group node size specified by the user with a DataProvider registered with the graph with key GroupingKeys.MINIMUM_NODE_SIZE_DP_KEY.

GenericTreeLayouter: Improved DefaultPortAssignment to consider PortConstraints in all modes. If a distributed mode is selected, then weak constraints will also be distributed on the according side.

LayeredNodePlacer: Improved spacing between labels and bends when polyline labeling is enabled.

Improved the performance of SALabeling and GreedyMISLabeling, especially for large graphs.

Improved support for PreferredPlacementDescriptor side preference (left, on-edge, right) when using generic labeling algorithms SALabeling and GreedyMISLabeling. Now, the side preference is considered for edge labels with arbitrary EdgeLabelModel implementations.

Improved the performance of EdgeRouter when routing edges that have PortConstraints or PortCandidates.

EdgeRouter will now consider the target group of an edge if this edge is the only member of its source group.

EdgeRouter: Improved edge routes of self-loops to go around at least one corner of the node. Only if both source and target port are restricted to the same side (with a PortConstraint or PortCandidate), self-loops may start and end at the same side of the node.

InteractiveOrganicLayouter: Fixed possible performance problem after changing the inertia/stress of some nodes.

SeriesParallelLayouter now takes into consideration minimum node sizes specified by the user.

MultiPageLayouter: Added new option MultiPageLayouter.strictClusterSeparation that allows to specify whether or not nodes with different cluster IDs may be placed onto the same page.

Improved the performance of OrthogonalSegmentDistributionStage and thus also ChannelEdgeRouter which by default uses the mentioned stage as edge distribution strategy.

ChannelRouter: Improved order of segments to avoid edge crossings when there are multiple segments that have one common end point.

Added layout stage CurveFittingLayoutStage which allows the approximation of edge paths with cubic Bezier curve control points. The stage is especially useful if curved edges are modeled using a large number of bends connected via straight lines.

Added layout stage HandleNaNCoordinatesStage which prevents layout algorithms that take initial coordinates for nodes and edges into account from failing if some of those graph elements have NaN-coordinates.

Improved the performance of PartialLayouter for input graphs that feature a high number of large subgraph components. Does not apply to component assignment strategy PartialLayouter.COMPONENT_ASSIGNMENT_STRATEGY_SINGLE.

Bugfixes

SimpleLabelStyle: Changing the autoFlip or trimming properties had no visible effect until a visual was created anew with the createVisual method.

The property SizeChangedEventArgs.oldSize contained the new size instead of the old size in some cases.

MouseHoverInputMode: The tooltip of the very first hover did not appear.

Added the flag yfiles.workaroundCR701075 that enables a workaround for occasional rendering issues in Chrome 57. This is due to Chrome 57 not properly rendering the applied transform matrix. The workaround is automatically enabled in the yFiles demo applications when opened in Chrome 57.

Incompatible Changes

Breaking API Changes

The module yfiles/layout-circular has been merged with the module yfiles/layout-organic. If you have references to yfiles/layout-circular replace them with yfiles/layout-organic.

The module yfiles/layout-planar has been merged with the module yfiles/layout-orthogonal since it contained no public API and is only used from the latter module. If you have references to yfiles/layout-planar replace them with yfiles/layout-orthogonal.

Behavior Changes

The following layout algorithms have more sensible default values.

CanonicMultiStageLayouter and MultiPageLayouter: The default labelLayouter is now set to an instance of SALabeling.

OrthogonalEdgeRouter.crossingCost: The default value is now 1.5 instead of 0.0.

CompactOrthogonalLayouter: The CompactOrthogonalLayouter.OrthogonalShortestPathPathFinder which is used as default path finder strategy now uses value 1.5 as default for property crossingCost instead of 0.

PartialLayouter.minimalNodeDistance: The default value is now 10.0 instead of 0.0.

MultiParentDescriptor.minimumNodeDistance: The default value is now 15.0 instead of 10.0.

BalloonLayouter.minimalNodeDistance: The default value is now 10.0 instead of 0.0.

SALabeling.deterministicMode: The default value is now true instead of false.

SplitEdgeLayoutStage.proxyNodeSize: The default value is now 1.0 instead of 0.0.

Most of the property setters of the types of the layout part now throw an error if an invalid, illegal, or null argument is given as input.

IncrementalHierarchicLayouter may now place source/target labels in layers that contain common nodes. In previous versions such labels were always placed in separate layers which often led to less compact drawings with superfluous bends.

IncrementalHierarchicLayouter: The edge grouping now supports to group incoming and outgoing edges of a node. In previous versions incoming and outgoing edges always defined separate groups even though the user specified the same group IDs for such edges.

Method IncrementalHierarchicLayouter.integratedEdgeLabeling does now always return false if the labeling algorithm is disabled. In previous versions it was only required that an appropriate labeling algorithm was specified, but it was not necessary that it is enabled. Therefore, the integrated labeling state queried from the property might not have corresponded to what the layout algorithm actually did. The same behavior change applies to the following methods:

IncrementalHierarchicLayouter.considerNodeLabels

DirectedOrthogonalLayouter.integratedEdgeLabeling

DirectedOrthogonalLayouter.considerNodeLabels

OrthogonalLayouter.integratedEdgeLabeling

OrthogonalLayouter.considerNodeLabels

OrthogonalGroupLayouter.integratedEdgeLabeling

OrthogonalGroupLayouter.considerNodeLabels

IncrementalHierarchicLayouter: Geometry information specified for IncrementalHierarchicLayouter.ALTERNATIVE_GROUP_BOUNDS_DP_KEY and IncrementalHierarchicLayouter.ALTERNATIVE_EDGE_PATH_DP_KEY is now automatically rotated according to the specified layout orientation. This fixes unstable from-sketch behavior in incremental layout mode when using an orientation other than top-to-bottom.

IncrementalHierarchicLayouter: For input graphs with infeasible PortConstraints and PortCandidates/PortCandidateSets (i.e., for edges that have non-matching port constraints/candidates), the layout algorithm now always prefers PortConstraints. In previous versions, the behavior was not well-defined for such cases.

PortCandidateAssignmentStage: Now, if an edge has registered PortCandidates and connects to nodes with PortCandidateSets, the stage will try to match both collections to find an appropriate port. In case there is no matching port candidate, a PortCandidate specified for the edge is preferred. Before, one of the PortCandidates was selected without trying to match with node port candidates.

SmartOrganicLayouter does no longer resize empty group nodes, possibly ignoring a minimum group node size for them. The behavior with respect to empty group nodes is now in line with the behavior of other common layout algorithms. The same behavior change applies for OrganicLayouter with group policy setting OrganicLayouter.IGNORE_GROUPS_POLICY, where previously empty groups were resized too.

Method CompositeLayoutStage.canLayout now checks if all the LayoutStages of the pipeline can layout the given graph and does not return always true.

Method SingleCycleLayouter.canLayoutCore now returns false if null is given as input.

Method Centrality.closenessCentrality now sets the closeness of a node to Infinity if the sum of the shortest path distances is 0. Before, it was set to NaN in such cases.

Method SingleCycleLayouter.nodeSequencer now allows to specify null to return to the default sequencer. In previous versions, specifying null led to an error.

Method GraphTransformer.operation now only sets the operation value and does not disable the automatic selection of best fitting rotation angle if an operation other than ROTATE is selected.

Method OrthogonalLayouter.integratedEdgeLabeling now throws an error if the current label layouter is not of type LabelLayoutTranslator.

Constructor TreeComponentLayouter throws an error if null is given as argument.

Centrality: The following methods can now take empty NodeMaps and EdgeMaps as arguments for returning the resulting centrality values.

Centrality.edgeBetweenness

Centrality.nodeBetweenness

Centrality.nodeEdgeBetweenness

yFiles for HTML 1.3.0.7 - Changes Since 1.3.0.6

Bugfixes

CanvasComponent: Key events had no effect if the component was part of a shadow DOM. The component's div element always lost the focus on keydown.

Instances of GraphEditorInputMode and GraphViewerInputMode were not garbage collected due to a non-removed event listener in the clickInputMode.

Hiding INodeSnapResultProvider or IBendSnapResultProvider from the lookup no longer leads to a crash when nodes or bends are moved.

PolylineEdgeStyle: Toggling the pen between dashed and solid styles did only work once. Then, the SVG path stayed at solid regardless of the pen's dash style.

SmartEdgeLabelModel: Once again, labels at the first segment snap properly at the layout of the source node. Since 1.3.0.6, some snap positions were overlapping with the source node.

Layout

Fixed a bug in TableLayoutConfigurator which altered the size of a column or row if an edge routing algorithm was applied.

yFiles for HTML 1.3.0.6 - Changes Since 1.3.0.5

Demo Improvements

Bugfixes

Added the flag yfiles.workaroundIE7766782 that enables a workaround for the Internet Explorer JIT bug 7766782, which can cause class initialization errors when using the yFiles for HTML GWT Overlay in Internet Explorer, especially when the GWT Overlay is used in combination with Smart GWT.

Made the IEnumerable.getMultiProjection and EnumerableExtensions.selectMany implementations non-recursive to avoid stack overflows.

Made SvgExport helper class more resilient against zero sized exports.

The CreateEdgeInputMode.EdgeCreated event triggered before the corresponding undoable edit was committed. This could result in a broken undo queue, if e.g. an animated layout was started during in the event listener. The event now triggers after the edit has been committed. With automatic undo unit merging, this should not make a difference for the end user, however from the perspective of the code there will be two subsequent edits, rather than one compound, if the code in the listener actually modifies the edge.

The license validation always failed for users of some (mostly older) browsers in specific scenarios:

Locale

ISO 639 Code

Affected Scenarios

Estonian

et

Only Licenses with watermark

Finnish

fi

Only License with watermark

Swedish

sv

Only License with watermark

Hawaiian

haw

Always

Tamazight

tzm

Always

The following browsers were affected:

IE before version 11

Firefox before version 29

Chrome before version 24

Opera before version 15

Safari (all versions)

Prevent null exceptions when interacting with a GraphOverviewControl before assigning a GraphControl to the OverviewInputMode.

OverviewInputMode could break the overview visualization if the overview has a very small width or height.

SmartEdgeLabelModel: Edge label snap lines have been too short for some positions that are far apart from the edge path.

SmartEdgeLabelModel: An exception was thrown if the path of the corresponding edge contained bends that were close together or at the same location.

Folding: the view state of a port on a folder node was sometime ignored when a folding edge was created.

Fixed several issues with orthogonal edge editing.

When dragging the source/target port/node of an orthogonal edge, the bends created during the drag were not cleaned up after canceling the gesture by pressing the ESC key.

Orthogonal edges could be made non-orthogonal by re-connecting the source port to the target port location (creating a self-loop), or vice versa.

Explicit Arrow elements in GraphML were sometimes read back incorrectly. The new deserialization property SerializationProperties.ParseArrowElementAsDefaultArrow can be used to work around this issue.

PathBasedEdgeStyleRenderer could leave visual artifacts when switching to an arrow that returned a null visual.

KeyboardInputMode now passes the original CompoundKeyEventArgs to registered event handlers instead of EmptyArgs.

Touch move events have an effect only if the corresponding touch down event also happened within the GraphControl.

The IsDown property of a Touch2DDevice was always false after the first touch up event of that device, e.g. after the first tap of a double tap.

Layout

IncrementalHierarchicLayouter: fixed rare error triggered in AsIsSequencer for edges incident to group nodes that have a sketch without bend points as well as port constraints.

IncrementalHierarchicLayouter: fixed bug that may cause non-orthogonal segments of grouped edges even though orthogonal edge routing is enabled.

IncrementalHierarchicLayouter: improved compactness of layouts that feature group nodes with insets and (group) nodes with halos (NodeHalo). Previously, the specification of halos could enlarge the insets of group nodes by an unnecessary large amount.

IncrementalHierarchicLayouter: Fixed bug that sometimes caused the route of back-loop edges with at least one endpoint incident to a group node to unnecessarily enter this group node.

IncrementalHierarchicLayouter: Fixed rare bug that caused same-layer edge to cross through their source or target node, e.g., the port was at the top of the source node but the edge crossed through the source node to leave it at the bottom.

IncrementalHierarchicLayouter: Fixed rare bug that may caused overlaps between labels and segments of edges with octilinear routes.

SimplexNodePlacer: Fixed bug that caused overlaps between edges and nodes when node compaction is enabled and edges have either strong PortConstraints or fixed PortCandidates.

SmartOrganicLayouter and OrganicLayouter: Fixed bug that caused group nodes with zero height/width in the layout result. The bug appeared when having empty groups, group node insets smaller than one (defined viaGroupingKeys#GROUP_NODE_INSETS_DP_KEY) and no minimum group node size specified (GroupingKeys#MINIMUM_NODE_SIZE_DP_KEY).

GenericTreeLayouter: fixed possible group node overlaps in conjunction with some node placers, for example AssistantPlacer.

PartialLayouter: fixed error that appeared if no DataProvider with key PARTIAL_NODES_DP_KEY is registered with the input graph.

EdgeRouter: Fixed bug that caused violations of minimum first/last segment lengths of grouped edges when using different edge layout descriptors and, second, made the layout algorithm remove a user-registered DataProvider with key EdgeRouter.EDGE_LAYOUT_DESCRIPTOR_DP_KEY.

EdgeRouter: Fixed rare error that may appear if there are fixed and grouped edges at the same time.

ChannelEdgeRouter: Fixed routing of self-loops that have both source and target end point at the same side of the node. Previously, when multiple such self-loops were present at the same node, the routing produced bad end points located outside of the node.

OrthogonalEdgeRouter: Fixed error that appeared if there were node labels with zero height/width.

Updated demo.yfiles.graph.pdfexport's references for the svg to pdf libraries. Beside other bugfixes, the updated svg to pdf libraries now support svg patterns and correct export of nodes that use ImageNodeStyle.

In some rare cases, the graph creation code in demo.yfiles.graph.orgchart was called before the application was initialized. Made sure that the application has been initialized before creating the graph.

The graph in demo.yfiles.graphml.graphml is now updated lazily after the GraphML source has not been modified for 1 second to prevent cumulative updates on every keystroke.

Bugfixes

Viewer

Improved the performance of yfiles.drawing.TextRenderSupport.determineMeasureMode for the first label measure call.

Fixed 'not a finite floating-point value' exception which occurred when the size of the GraphControl is zero during an animation.

Added the flag yfiles.workaroundIE2337112 that enables a workaround for disappearing 'use' elements in Internet Explorer 11 on Windows 10. The workaround is automatically enabled in yFiles demo applications that use the demo framework for IE11 on Windows 10.

GraphML deserialization: Changed default value for arrows without an explicit ArrowType from ArrowType.NONE to ArrowType.DEFAULT.

GraphML serialization: Whitespace in XML attributes was not escaped correctly.

Specifying a DesignerSerializationVisibility for collection properties did not work.

TypeConverter was erroneously part of the yFiles for HTML Layout package and has been removed from it.

Layout

IncrementalHierarchicLayouter: fixed error that could happen in AsIsSequencer when incremental group hints are defined (see IncrementalHintsFactory.createIncrementalGroupHint) along with specific port constraints on edges incident to an incremental group node.

IncrementalHierarchicLayouter: Improved result if compact label placement is enabled (which is the default), see SimplexNodePlacer.LabelCompaction. In previous versions the labels may have been placed in a stacked style even if this did not make the result more compact (e.g. if all labels are placed to the right of the edges).

GraphPartitionManager: fixed functionality to hide edges when using methods GraphPartitionManager.hide, GraphPartitionManager.hide. Previously, edges were actually not hidden from the graph.

IncrementalHierarchicLayouter: Fixed distance between vertical (in a top-to-bottom layout) segments of same layer edges that connect to group nodes. This also applies to self-loops that connect to the top or bottom of a group node with both ends as well as same layer parts of other edges like back-loops.

IncrementalHierarchicLayouter: Fixed bug that caused the minimum edge-to-edge distance to be violated by edges with strong port constraints that cross each other.

ParallelEdgeLayouter: Fixed bug that caused wrong (very large) edge port coordinates. These coordinates could also lead to Exceptions when later processing the graph, for example, when calculating placements of edge labels belonging to the edges with bad coordinates using model SmartEdgeLabelModel.

SeriesParallelLayouter: Fixed violations of the minimum first and last segment length and self-crossings of octilinear edges.

SeriesParallelLayouter: Fixed bug that caused node-to-node or node-to-edge overlaps in the case where the graph contained group nodes and node/edge labels.

CircularLayouter: Fixed a bug that could potentially cause an infinite loop when encountering a node with a very high out-degree.

IncrementalHierarchicLayouter: Fixed bug that caused critical edges to not be aligned (see CRITICAL_EDGE_DP_KEY).

BusRouter: Fixed rare error caused by non-orthogonal edge segments.

GenericTreeLayouter: Fixed bug that caused edges which are reversed during the layout and have a port constraint only to one endpoint (e.g., source) to obtain the same port constraint also to the other endpoint (e.g., target).

Polyline.EdgeRouter: Fixed possible error that may appear if a specified PortCandidate has multiple directions.

IncrementalHierarchicLayouter: Fixed bug with some ignored any side strong port constraints.

IncrementalHierarchicLayouter: Fixed bug that resulted in edges whose segments are not on grid.

Polyline.EdgeRouter: Fixed bug that caused routed edges to sometimes share the same port as fixed edges.

The demo.yfiles.graph.imageexport demo now also supports server-side image export.

Layout Improvements

IncrementalHierarchicLayouter: Reduced number of overlaps of group nodes containing elements with head or tail sequence constraints.

Improved abort handling for algorithms that use ConstraintIncrementalLayerer, ConstraintLayerer and TopologicalIncrementalLayerer. For large graphs these classes may require a long runtime that cannot be canceled by using an AbortHandler.

Bugfixes

Viewer

TemplateNodeStyle and StringTemplateNodeStyle no longer throw an exception on template re-evaluation if a bound value is null.

Fixed an error that could occur when the graph control has no actual size but visible scrollbars.

Corrected the interactive resizing of selected nested group nodes. Previously, the result was depended on the order in which the nodes were selected. Now, GraphCommands.ADJUST_GROUP_NODE_SIZE_COMMAND now always processes the nodes from innermost to outermost groups.

GraphClipboard: Corrected the selection after a paste command for clipboards which are shared among GraphControls.

Fixed an error when resizing nodes in a filtered graph that contains tables.

Fixed an issue with NodeDropInputMode and filtered graphs.

Changed the default value of GridVisualCreator.abberationTolerance to 50 to switch off grid hiding by default.

Fixed the visualization of grids of the style GridStyle.Crosses.

The property CanvasControl.fitContentViewMargins is now considered correctly even if the values for left and right (or top and bottom) are different. Previously, the content was always centered in the view.

GraphML deserialization errors are now ignored if the flag yfiles.graphml.SerializationProperties.IGNORE_XAML_DESERIALIZATION_ERRORS is set.

Fixed an error while loading GraphML files that were created with yFiles WPF and contained labels.

Layout

IncrementalHierarchicLayouter: Fixed an error that caused PortCandidates to potentially be ignored or not handled correctly for self-loops when having directions other than PortCandidate.NORTH, PortCandidate.SOUTH, PortCandidate.WEST or PortCandidate.EAST.

IncrementalHierarchicLayouter: Fixed an error that caused that the layer of an incremental group (see IncrementalHintsFactory.createIncrementalGroupHint) depends on the group's location if recursive layering is enabled (see IncrementalHierarchicLayouter.recursiveGroupLayering). However, the position of incremental groups should be freely chosen by the layouter.

IncrementalHierarchicLayouter: Fixed an error that caused grouped edge segments to overlap with one of the adjacent nodes if that is a group node.

IncrementalHierarchicLayouter: Fixed an error that caused same layer segments to be too short for the labels that should be placed at those segments.

IncrementalHierarchicLayouter: Fixed an error that caused a violation of minimum first/last segment length for edges that connect two neighboring nodes in the same layer.

IncrementalHierarchicLayouter: Fixed an error that caused a violation of minimum first/last segment length for edges that connect to group nodes. Now, the first/last segments of those edges will have at least the length of the largest minimum first/last segment length of all edges connected to the same group node.

IncrementalHierarchicLayouter: Fixed rare error that was caused by an inconsistent group node order that may appear for input graphs containing both swimlanes and groups.

IncrementalHierarchicLayouter: Fixed an error that prevented that fixed any side port constraints were considered for edges between a group and a node within this group.

Polyline.EdgeRouter: Fixed rare error that may appear during rerouting of edges (see Rerouting) if the input graph contains overlapping nodes.

Polyline.EdgeRouter: Fixed possible error that may appear if there are grouped edges consisting of both fixed and non-fixed edges (see EdgeRouter.SphereOfAction).

Polyline.EdgeRouter: Fixed an error that caused violations of the minimum first or last segment length for target grouped edges. This only happened when these distances were defined in the default EdgeLayoutDescriptor instead of a DataProvider with individual descriptors.

Polyline.EdgeRouter: Fixed side handling of external strong ports.

Polyline.EdgeRouter: Fixed rare bug that may cause a stack overflow.

GreedyMISLabeling and SALabeling: Improved placement of edge labels with preferred placement at source or target.

ParallelEdgeLayouter: Fixed possible error that may appear if the parallel edge is almost horizontal or vertical.

ChannelEdgeRouter: Fixed an error that may cause segments with infinite coordinates for edges incident to group nodes if the path finder strategy is set to ChannelEdgeRouter.OrthogonalShortestPathPathFinder.

MultiPageLayouter: Fixed possible error that may appear if an internal layouter queries a DataProvider for an inserted dummy node.

DirectedOrthogonalLayouter: Fixed problem that may cause non-directed routes for directed edges if option DirectedOrthogonalLayouter.alignDegreeOneNodes is enabled.

OrganicLayouter: Fixed an error that caused tree-beautifier feature (see OrganicLayouter.ActivateTreeBeautifier) to have no effect if activated when the graph is actually flat (i.e., there is no group node that contains child nodes) but data providers for groups (see GroupingKeys) are registered with the graph.

CircularLayouter: Fixed an error that may cause node overlaps.

SplitEdgeLayoutStage: Fixed an error that caused the user's selection for edges that have to be split to be ignored. Also, Fixed an error that caused an error because of nodes with zero width/height.

ShortestPaths: Fixed error that occurred when applying the Dijkstra or Bellman-Ford algorithm to an empty graph.

Incompatible Changes

Paste Command: the selection is now updated before the method GraphClipboard.paste exits.

Documentation Viewer Improvements

Fixed the display of text-only "see also" references.

Removed the filter text field of the api tree component, because it could easily be mistaken as the main search box, but the search box provides a much better search experience.

When following a link to a type member, the target tab sometimes didn't scroll to the documentation of that member.

yFiles for HTML 1.3.0.3 - Changes Since 1.3.0.2

Bugfixes and Demo Improvements

Viewer

Added an activatable workaround (yfiles.workaroundEDGE2057021) for the StringTemplateNodeStyle. It converts attribute names consisting of only upper case characters to lower case attribute names. This refers to Microsoft Edge's DOMParser issue.

Added an activatable workaround (yfiles.workaroundCR570845) for a Chrome problem that can prevent queued display updates from being executed during touch/mouse gestures. The yfiles.workaroundCR570845 property can be set to a delay in milliseconds that should be tolerated before running the queued functions using window.requestAnimationFrame(). The default value of yfiles.workaroundCR570845 is -1, which disables the workaround. The workaround is automatically enabled in yFiles demo applications that use the demo framework for Chrome versions later than 46.

Fixed a dragging bug on IE9 where the node dragging stops if the item is dragged out of the GraphControl and back in.

Added charCode property to yfiles.input.KeyEventArgs, which gets the charCode of the original event. Also fixed keyValue property in yfiles.input.CompoundKeyEventArgs, which previously returned an empty string.

Fixed Control.onKeyPress, that almost never was called. This also had the effect that the CanvasControl.CompoundKeyTyped event was not fired.

Fixed a bug in IE11 on Windows 7 where mouse events were fired during dragging although the mouse has not been moved.

Prevent IE from entering an event loop multiple times on the same coordinate when using touch input in DragDrop. Thus touch input behaves the same as mouse input, where this was already in place.

Fixed inconsistent input mode states when dragging the mouse out of an iframe containing the graph control and releasing the mouse button outside the iframe.

Fixed a bug in browsers without deep document.importNode support (e.g. IE9) where attributes of inlined images were wrong after exporting the graph with SvgExport

Improved Scrollbar behavior when ScrollBar.value is changed from the outside while dragging the slider, e.g. when changing the GraphControl's contentRect. Previously, the scrollbar slider jumped to the new mouse location, resulting in discontinuous scrolling. The new code keeps the difference between the slider and the mouse location, that was caused by the external value change.

Demos

Demo.yfiles.graph.mindmap: Fixed various issues like re-ordering edges at the root node, root node icon and expanding the root node on touch devices.

Fixed an issue in demo.yfiles.layout.interactiveorganic where the graph suddenly froze when dragging a node shortly after application start.

New nodes in demo.yfiles.binding.interactivegraphsource et al. are not placed into the top layer anymore, but are fitted nicely in the existing layout during update.

Fixed an issue in demo.yfiles.graph.orgchart where an exception occurred when changing node selection while no node was currently visible.

New design for social-network graph in demo.yfiles.graph.viewer.

Class Framework

fixMethods is now available in both namespaces, yfiles.util and yfiles.lang.util.

Demo Framework

Fixed possible overlapping and unintentional resize of the side panels.

New Demos

New demo.yfiles.graph.networkmonitoring shows a monitoring tool for a network with simulated traffic and random failures.

yFiles for HTML 1.3.0.1 - Changes Since 1.3

Bugfixes and Demo Improvements

Viewer

GraphML: Primitive data types such as string or number were written to the wrong XAML namespace, thus breaking interoperability with other yFiles platforms.

CSS classes set on the div element before calling CanvasControl.ForDiv or CanvasControl.ForId are not overwritten anymore. Instead the class yfiles-canvascontrol is appended to the existing classes.

Added a dedicated class for the main CanvasControl SVG to prevent implicit CSS styling of all SVGs inside the canvas (e.g. in graph item styles).

OverviewInputMode now uses the value 0.00000001 as minimum zoom, instead of Number.MIN_VALUE, which is zero in Chrome on iOS.

Fixed a visual glitch where devices with touch input using the WebKit Javascript engine (e.g. Android tablets, MacBook with TouchPad, Mac with MagicMouse etc.) displayed scrollbars in the graph control that should not be visible.

Improved performance of SimpleLabelStyleRenderer. The label's text size was calculated even if it was not needed subsequently.

Fixed a bug in TextRenderSupport where TextMeasureMode.SVG was used instead of TextMeasureMode.CANVAS.

Text height measurement with TextMeasureMode.SVG returned the wrong height on single line string if the string only contained characters lower than full line height, e.g. lower case characters, spaces etc.

Demos

InteractiveOrganic Demo: Fixed a performance issue caused by newly created unconnected nodes where the graph stuttered while moving the connected components. Also disallowed label adding.

BPMN Editor Demo: The nodes with blue border are not treated as group nodes anymore.

Table Editor Demo: A flag prevents re-entrant layout execution.

Fixed an invalid line of code in the source code comments of step 24 of the Custom Styles Tutorial.

SimpleCustomStyle Demo and Tutorial 02, Step 19 (Animated Edge Selection): Minor bugfix in the animated edge style where the time delta result was wrong for the first frame request.

Demo Framework

The style panel, which is used in demos where nodes can be dragged into the graph control, now displays nodes with large labels correctly.

Fixed touch input gestures on on Microsoft Surface devices.

Implemented auto-adjust of GraphControl.dragSize and GraphControl.hitTestRadius to improve user experience on different input devices (touch, pen and mouse).

yFiles for HTML 1.3 - Changes Since 1.2.1.4

Major Features Added

Viewer

GraphControl integrates itself much better into web pages since it no longer stops the propagation of any keyboard, mouse, touch and pointer events that passes through it. In addition, preventDefault() is now only called on mouse events, touch events, pointer events, and on keyboard events that actually trigger an interaction. Especially, it leaves all other keyboard events untouched.

If the default behavior doesn't fit your requirements, whether or not to call preventDefault() on events that pass the GraphControl can be separately specified for the three types of events (keyboard, pointer, and context menu).

This makes it possible for example to call a default browser action even if the GraphControl has the focus and to change the focus to and from a GraphControl with the Tab key.

With the new property GraphControl.mouseWheelBehavior, customers can specify when a wheel/mousewheel event should be handled: never, always, or only when focused. In addition, it is now easily possible to specify whether the mouse wheel scrolls or zooms the GraphControl.

Together with the less restrictive event prevention, this makes it possible to scroll the whole web page even if the cursor is over a GraphControl.

Graphs can now be saved as file download in several recent browsers, namely Chrome 38+, Firefox 28+, IE 10+, Opera 25+, and recent versions of the related mobile browsers. Saving can be done either with the method GraphControl.saveFile or with custom code. The latter is shown in detail in the File Operations demo and allows further customizations, for example adding support for more browsers.

Improved the module file format. The yFiles modules now follow the Universal Module Definition (UMD) pattern, offering compatibility with the most popular script loaders and JavaScript environments.

Using UMD, the yFiles modules easily support a variety of different loading schemes: lazily using an AMD loader like RequireJS, with CommonJS in Node.js applications or Browserify web projects, or simply via an object in the browser's global scope. Several new demos show examples of how to use the different loading schemes.

GraphClipboard now supports copying independent items. This allows the user to copy labels, ports, bends, or edges to other elements without having to copy their owners. Also this technique allows for copying an item (for example a label) to multiple target elements at once.

In addition, the GraphClipboard now supports an optional target location for pasting and the new method GraphEditorInputMode.pasteAtLocation can be used to this end, too. In addition, ApplicationCommands.PASTE now supports an optional parameter of type IPoint to provide a target location.

Node and edge labels can now snap to particular locations while moving them interactively. Both types of labels can be aligned horizontally or vertically to their original location. In addition, a node label can be aligned with the borders or the center of its owner, and during resizing of that owner, smartly keeps its relative location to the snapped position. An edge label can be snapped on the path of its owner, or at particular distances of it.

This feature can be enabled and configured with a LabelSnapContext and is available for labels with one of these label models: SmartEdgeLabelModel, FreeEdgeLabelModel, FreeNodeLabelModel, and FreeLabelModel.

Interactive label editing and creation has the following new features:

The current label visual can be hidden while the text editor is shown to reduce visual clutter. This feature is enabled by default and can be controlled through the property GraphEditorInputMode.hideLabelDuringEditing.

GraphEditorInputMode and TableEditorInputMode provide new events LabelTextEditingStarted and LabelTextEditingCanceled that are raised directly before the label text editor is shown and after the label editing has been canceled, respectively.

Double clicking nodes and edges now opens the label editor. An existing label can be double clicked to edit the label text. This feature can be disabled with the property GraphEditorInputMode.doubleClickLabelEditingAllowed.

IEditLabelHelper implementations provided by the ILabel's lookup can now be used to forbid or customize the editing of individual labels. Class LabelDecorator provides a new property editLabelHelperDecorator to customize this feature.

GraphEditorInputMode.editLabel and TableEditorInputMode.editLabel can now be used with SimpleLabel instances. This provides editing capabilities for dummy elements such as legends, page headers or other textual elements.

In addition, label editing has been reworked for a more consistent user experience. Especially, label editing now:

Uses the various callback methods on GraphEditorInputMode, TableEditorInputMode and IEditLabelHelper implementations in a consistent way, regardless of how many labels or labeled items are edited or added, and independent from how the editing/label creation process has been started (e.g. through a command or programmatically through the input mode convenience methods).

Determines the actual labeled item that is modified when multiple elements are selected in a consistent way.

Development Support

The documentation viewer got many improvements and corrections that make browsing the API and the Developer's Guide much more convenient. The most notable additions are

The new code generator provides a GUI for creating an implementation of any class and interface and optionally adds stubs for methods, properties and events you want to override

Improved experience on small screens and touch devices

Added a selection of UI themes

Customizable keyboard shortcuts

Support for favorites

Layout

Added new layout algorithm SeriesParallelLayouter for series-parallel graphs. Such graphs are directed graphs with a single source (a node without incoming edges) and a single sink (a node without outgoing edges) that are build using only the following two rules:

Series composition: The source of a subgraph is merged with the sink of another subgraph.

Parallel composition: The sources and sinks of two subgraphs are merged.

Added multi-parent support to GenericTreeLayouter. A tree node can have multiple parents that are connected to all of its siblings and share the same parents. This might come to use in organizational charts where a team answers to multiple superiors.

Added grid placement support for nodes and edges to IncrementalHierarchicLayouter.

Minor Features Added

Viewer

GraphEditorInputMode got support for cyclic click selection. This helps in conveniently selecting items that are hidden behind other items. By default, this features is bound to the Alt key being pressed. It can be disabled by setting the cyclicSelectionRecognizer property to EventRecognizers.NEVER.

GraphEditorInputMode now provides default action for duplicating single graph items or whole subgraphs. This also works with incomplete subgraphs, for example in a tree, it is possible to duplicate a subtree and the tree will never be disconnected.

In addition, the new command GraphCommands.DUPLICATE_COMMAND (shortcut: Ctrl-D) and the new method GraphClipboard.duplicate can be used to duplicate selected items without altering the clipboard contents.

GraphEditorInputMode now provides a default action for reversing edges. To this end, the methods reverseEdge and reverseEdges have been added to GraphEditorInputMode. Also, the new command GraphCommands.REVERSE_EDGES_COMMAND (shortcut: Ctrl-R) has been added.

Node ports can now be moved by dragging their IHandle.

GraphClipboard has new properties copyItems, independentItems, and dependentItems that allow for restricting the types of items that can be copied at all, independently from their owners, or implicitly through their owners, respectively.

GraphViewerInputMode: The click hit test order can now be configured by property clickHitTestOrder.

GraphEditorInputMode and GraphViewerInputMode provide an explicit hit test order for double clicks that can be changed through the doubleClickHitTestOrder property. By default, this hit test order prefers labels over other graph elements.

Added new methods ClickInputMode.preventNextDoubleClick and TapInputMode.preventNextDoubleTap that can be used in event handlers for single clicks/taps to prevent that this click can become part of a double click event.

NodeDropInputMode can now optionally drop nodes onto leaf nodes and thus convert the leaves into group nodes. Also it is possible to drop nodes into collapsed folder nodes. For both use-cases, an opt-in property has been added and a predicate property allows for fine-grained control over this feature.

Similarly, leaf nodes can now be the target of a reparenting gesture if the property GraphEditorInputMode.reparentToLeavesAllowed is enabled. In this case, leaves are converted into group nodes.

ItemDropInputMode does now support touch gestures to Drag'n'Drop graph items into a graph.

Added support for deleting bends in a way that an orthogonal edge remains orthogonal after removing the bends. The new property GraphEditorInputMode.orthogonalBendRemoval enables/disables this feature.

GraphViewerInputMode now supports multi-selection with Ctrl+Click and marquee selection. The latter is disabled by default.

OverviewInputMode and the GraphOverviewControl have been optimized to improve the user experience when used on touch devices.

SvgExport can now correctly handle styles with external image references. This requires an asynchronous approach and therefore, the API of this class has been changed accordingly. The new API is shown in the Image Export demo. The compatibility layer describes how to map the previous API to the new one.

In addition, characters that are not part of the Unicode Basic Multilingual Plane are now exported correctly.

Improved GraphModelManager to allow for easier customizations. Property useHierarchicNesting was added to allow for adding custom logic that uses a different approach to hierarchic nesting. In addition, the return types of some of the factory methods where made less restrictive to allow for further modifications.

FoldingManager now offers two convenience methods, updateViewStatesForNode and updateViewStatesForEdge, that will trigger update calls on IDummyNodeConverter and IDummyEdgeConverter for elements that are currently being displayed in a view. This makes it easier to synchronize state between the master graph and the folded graph views in case this is not automatically performed by the default implementation.

Layout

AbortHandler: Added the method hasCheckFailed that allows to query whether a check method was called after a stop or cancel event.

Added the interface ILabelLayoutFactory that provides methods for creating, adding and removing node/edge labels to a LayoutGraph.

IncrementalHierarchicLayouter: Added support for incremental group nodes (see IIncrementalHintsFactory.createIncrementalGroupHint). Incremental groups will be placed on a suitable position. The hints of their descendants are interpreted relative to the group node.

SimplexNodePlacer: Added the property nodeCompaction that allows to place adjacent nodes of a layer in a more compact, stacked style.

Added vertical alignment option for DefaultNodePlacer and SimpleNodePlacer. In addition to the previous compact child placement, siblings can now be aligned at top, center or bottom for example.

GenericTreeLayouter: Added support for critical edges in DefaultNodePlacer, DendrogramPlacer, SimpleNodePlacer, LayeredNodePlacer and DoubleLinePlacer. Nodes connected to a critical edge will be center aligned. This highlights the paths along critical edges in the tree.

GenericTreeLayouter: Added support for grouped edges in DefaultPortAssignment. Grouped edges will share the same port location at local root.

Added the class GroupedNodePlacer that allows GenericTreeLayouter to place siblings into different groups.

RecursiveGroupLayouter: Added the property InterEdgeRouter to specify the edge router that layouts the edges that cross group node bounds. Thus, it is not necessary to subclass the layouter to change inter-edge routing anymore.

Added the layout stage PortCandidateAssignmentStage which assigns edges to the ports specified by PortConstraints or PortCandidates after calling the core layout.

Improvements

Viewer

Simplified the API related to context menus. Namely, custom context menus need no longer implement the interface yfiles.input.IContextMenu, and thus that interface and its usages in the API have been removed. See the API Changes for details.

In addition, the context menu implementation of the demo framework was refactored accordingly. It is now a short, standalone class that depicts the integration of a custom context menu much clearer.

The new property ContextMenuInputMode.swallowCloseClick specifies whether a mouse click in the canvas while a context menu is open should create a node or just close the menu.

Modernized the CSS styling of the scrollbars of the GraphControl. The new styling was already part of the demo framework and thus used by various demos but it was not included in the library's CSS file lib/yfiles.css. Since the CSS class names have not been changed, custom styling will not be affected.

In addition, the thumbs of the scrollbars now have a reasonable minimum size.

Various performance improvements for the rendering and the selection handling. This affects, amongst others, ShapeNodeStyle and styles that use a GeneralPath.

GraphEditorInputMode.detailSelectionRecognizer is now also applied for double clicks to determine the clicked item.

GraphEditorInputMode and GraphViewerInputMode don't select or focus graph items styled with a void style (VoidNodeStyle, VoidEdgeStyle, VoidLabelStyle, and VoidPortStyle). The new property voidStylesIgnored specifies whether this feature is enabled.

GraphEditorInputMode and GraphViewerInputMode: the new protected method shouldSelect can be overridden to determine whether an item can be selected in general.

OverviewInputMode: The new property margins specifies margins for the visible area of the bound GraphOverviewControl. The new protected method updateVisibleArea provides further means for customizing the visible area.

PortRelocationHandles now triggers the EdgePortsChanged event of the GraphEditorInputMode.

TableLayoutConfigurator: Improved support for routing algorithms.

IGraph: The collection models of graph items returned by the properties nodes, edges, etc. now support the methods remove and clear to remove graph items from the graph. Note that calling the method add is still not allowed.

GraphModelManager: New callback method onGraphChanged.

LayoutExecutor: The new property considerViewportLimiter can be enabled to let the target viewport after a layout respect the ViewportLimiter of the GraphControl.The ViewportAnimation has a new property considerViewportLimiter for the same purpose.

LayoutGraphAdapter now adds data providers that map each node, edge and label of a LayoutGraph to their corresponding IModelItem in the original IGraph. Especially, these data providers are available if a layout is run with a LayoutExecutor or the convenience methods LayoutExtensions.morphLayout and LayoutExtensions.applyLayout.

GeomSupport: The new method createSmoothedPath creates a new path as copy of a given one but with smoothed bends.

SimpleAbstractEdgeStyle: The new method updateArrows can by called from updateVisual to update the arrow visualisation if needed. Previously, the arrows had to be created anew in this case.

A template style now automatically updates a visual it has created if the object in the item's tag is exchanged. Note that this check considers 'reference equality' not 'value equality'.

CollapsibleNodeStyleDecoratorRenderer: The method addToggleGroupStateCommand is now public and static to make it easier to use it from custom code. Due to this, its signature was slightly changed.

IconLabelStyle: The icon is added to the hit test area for mouse clicks and marquee selection. This can be switched off by overriding IconLabelStyleRenderer.shouldHitTestIcon.

CanvasControl: Method fitContent now respects the ViewportLimiter. This might result in zoom levels greater than 1.0.

CanvasControl: The new size change detection technique SizeChangedDetectionMode.SENSOR supersedes the previous timer-based technique as default since it provides instant notification about size changes. The property sizeChangedDetection can be used to specify the desired technique explicitly.

DefaultDummyEdgeConverter now synchronizes the tag property of the first label if label synchronization is enabled.

GraphCopier has been improved to facilitate manipulation of the copied items:

The new events NodeCopied, EdgeCopied, LabelCopied, and PortCopied are dispatched after a model item has been copied.

The method getOrCreateCopy is now public to facilitate copying of, for example, node tags.

GraphClipboard: In hierarchically organized graphs, nodes are now pasted into their previous parent group, the group at their target position, or the root, depending on the new property parentNodeDetection.

All data binding classes like GraphSource and TreeSource got new methods to get the graph item for a business object and vice versa.

GraphSource and AdjacentEdgesGraphSource can now be used with only an edgesSource (in other words, without a nodesSource) if the property lazyNodeDefinition is enabled.

TreeSource got support for group and location bindings, similar to the other data binding classes. Due to this, the signature of its methods createNode and updateNode changed.

The HTML5 WheelEvent is now used as primary API for mouse wheel events. This does not change the behavior and the previous MouseEventWheel and MouseScrollEvent are still supported for older browsers.

Layout

IncrementalHierarchicLayouter: The group transposition feature can now also be used in incremental layout mode (see DefaultLayerSequencer.groupTranspositionEnabled).

ConstraintIncrementalLayerer: Improved handling of same layer constraints. In previous versions the layerer sometimes ignored same layer constraints even though there was a valid layering.

IncrementalHierarchicLayouter: More compact placement of rotated as well as stacked labels.

SmartOrganicLayouter: Now also considers the group node compactness if the property nodeEdgeOverlapAvoided is enabled (see property groupNodeCompactness).

SmartOrganicLayouter: Improved node overlap removal (see property nodeOverlapsAllowed). Now, if the scope is set to SCOPE_SUBSET or SCOPE_MAINLY_SUBSET, the number of node overlaps that cannot be removed is reduced.

LayeredNodePlacer: Reduced overlaps between edges and node labels for all routing styles.

GridNodePlacer: Corrected alignment of child nodes and edge routing when there are node labels.

AbstractRotatableNodePlacer.RootAlignment, DefaultNodePlacer and DendrogramPlacer: Instead of aligning bounding boxes including nodes and their labels, nodes are aligned directly with other nodes. Therefore a layout with node labels gets more compact and the alignment is consistent with that of graphs without node labels.

DelegatingNodePlacer: Added support for a child comparator for children of local root nodes.

GenericTreeLayouter now ignores labels with zero width or height in all distance calculations.

GenericTreeLayouter: NodePlacer implementations now also use the specified spacing as minimum distance between different subtrees.

PartialLayouter: Reduced the number of element overlaps if there are partial group nodes.

ParallelEdgeLayouter now always separates parallel edges according to their direction. In other words, edges (v,w) and (w,v) are never placed interleaved.

SALabeling and GreedyMISLabeling: Both algorithms now also consider the node/edge overlap penalty specified by a LabelCandidate.

Improved abort handling for algorithms that use ConstraintIncrementalLayerer, ConstraintLayerer and TopologicalIncrementalLayerer. For large graphs these classes may require a long runtime that cannot be canceled by using an AbortHandler.

New Demos

The new demo demo.yfiles.loading.browserify shows how to use yFiles with Browserify.

The new demos demo.yfiles.loading.amdbundle and demo.yfiles.loading.scriptbundle explain how to create a single-file bundle of a yFiles-powered application.

The new demo demo.yfiles.loading.noglobals shows how to use yFiles without creating an object in the global namespace.

Two new tutorial steps show the automatic text wrapping and clipping feature of the classes TextRenderSupport and SimpleLabelStyle.

Demo Improvements and Bugfixes

New modern styles for the nodes, edges, groups, and tables in the demos. These new styles show best practices with regards to both the various duties of a custom style in yFiles and good rendering performance, and last but not least they provide a contemporary look for the demos.

The context menu of the demo framework is now a short, standalone class that depicts the main parts of the implementation and integration of a custom context menu much clearer.

Improved the compatibility of the demo require.js implementation with the one of RequireJS and the AMD specification.

Return values are now passed to callbacks, as required by the AMD specification.

The baseUrl can now be configured with the method config in the same way as RequireJS.

Callbacks of the require function are now always executed asynchronously, like it is done by RequireJS.

The Layout Style demos got support for the new features of the layout part.

The hierarchic layout style now has settings for (overall) grid placement and stacked placement of the nodes within a layer.

Added a settings panel and a sample graph for the new series-parallel layout style.

The tree layout style automatically uses its new multi-parent feature if appropriate for the current graph.

The File Operations demo now shows in detail how a graph can be saved as file download.

Reorganized the Incremental Hierarchic Grouping demo to make the relevant layout configuration more clear. In addition, the demo now uses the FixNodeLayoutStage that is part of the library instead of its custom implementation.

BPMN Editor demo: The bpmn-layout and bpmn-viewer modules now list all of their dependencies to make AMD loading easier. To reduce startup time, the layout module is now loaded lazily in the demo when the first layout is actually calculated.

WebWorker and Node.js demos: The Graph-To-JSON converter now supports group nodes. Moreover, the content rectangle is updated correctly after a layout calculation and only a single undo step is created for each calculation.

Performance improvements for the node styles in the Custom Styles tutorial. When updating, these styles no longer set new transform if nothing actually has changed. Setting a new transform can trigger a complete re-paint even if the values of the transform remain the same.

HTML Label Style demo: Corrected the placement of large labels.

Incompatible Changes

Changes in Default Behavior

CanvasControl: The events Mouse2DEntered and Mouse2DExited have been erroneously fired when the mouse moved between inner elements. Now, these events are only fired when the mouse enters or leaves the bounds of the control, which is the intended and documented behavior.

In addition, if a mouse button is pressed while leaving the bounds of the control, the Mouse2DExited event is now deferred until the button was released. As a result, this event does not interfere with the typical events of a mouse click and custom click handling code typically needs no special handling for this event. See the notes about known issues with mouse events for other peculiarities.

Similarly, the methods onMouseEnter and onMouseLeave of Control were erroneously invoked in these cases. This has been corrected, too.

TextEditorInputMode now ensures that the TextBox is visible in the viewport when starting editing. This behavior can be adjusted by creating a custom subclass and overriding ensureVisible().

FoldedGraph.isDummy now throws an ArgumentOutOfRangeException for labels and ports that are not part of this view. Previously, this method returned true for such items. Since this exception is already thrown for nodes, edges, and bends that are not part of this view, the behavior is now the same for all types of graph items.

GraphEditorInputMode now by default supports the new GraphCommands.DUPLICATE_COMMAND that is bound to keyboard shortcut Ctrl-D. This new behavior can be turned off with the duplicateAllowed property.

The clipboard now supports copying and pasting of items independently from their owning elements. For example, single selected labels can be copied to other elements, as well as edges without their source and target nodes. This behavior can be reverted to the old behavior by setting GraphClipboard's independentCopyItems to GraphItemTypes.NONE.

GraphEditorInputMode now by default allows for reversing selected edges using the Ctrl-R keyboard shortcut and the new GraphCommands.REVERSE_EDGE_COMMAND. This new behavior can be turned off with the edgeReversalAllowed property.

ClickInputMode: If activeButtons includes MouseButtons.RIGHT, the original right click event is marked as handled if ClickInputMode's event handlers mark the higher level click event as handled.

GraphEditorInputMode and GraphViewerInputMode: The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.

Previously, ports at nodes and edges that were copied and pasted to and from the clipboard were all copied, even if there were no edges attached to them after the operation. Now those empty ports are not copied/pasted anymore unless the PortDefaults' autoCleanup property is set to false or they were unoccupied before the operation already. In order to restore the old behavior, where all ports were copied regardless of whether edges were adjacent to them, make sure to include them in the core predicate, since this behavior change just affects ports that had previously not been accepted by the core predicate function.

CanvasControl: Method fitContent now respects the ViewportLimiter. This might result in zoom levels greater than 1.0.

CanvasControl: The constructor sets the attribute tabindex="0" on the HTML element of the control if no such attribute is present. Previously, the value 1 was set which inadvertently resulted in a high priority for keyboard focus changes. You can set any other priority at any time.

GraphEditorInputMode's NodeCreated event may now report nodes that are not part of the graph, when the user has dropped a node via NodeDropInputMode and its new folderNodeParentsAllowed property is enabled. By default this feature is disabled, though.

IReparentNodeHandler's isValidParent method may now also be queried if the new property reparentToLeavesAllowed of GraphEditorInputMode is enabled. By default this property is disabled, though. Note that the method will also be queried if the reparent handler is used outside of the context of GraphEditorInputMode.

IValueSerializerContext: In GraphML-writing code, the property instance now provides the object that should be converted, not the parent object. If you need to access the actual parent object, you can use the owner property on the GraphMLValueSerializerContext implementation of this interface.

The event GraphMLIOHandler.QueryReferenceId is no longer fired for MarkupExtensions and other proxy objects for serialization. Now, it is only fired for the original object references.

GraphEditorInputMode and GraphViewerInputMode: By default, graph items styled with a void style (VoidNodeStyle, VoidEdgeStyle, VoidLabelStyle, VoidPortStyle) won't be selected and won't get the focus.

GraphEditorInputMode's clickHitTestOrder property default value has changed. Now it does not contain the redundant GraphItemTypes.ALL as the last element in the array anymore.

GraphViewerInputMode: By default, clipboard commands are now disabled. This can be controlled with the new property clipboardCommandsEnabled.

The default keyboard shortcut for deselecting elements (GraphCommand.DESELECT_ALL_COMMAND) has been changed to Ctrl+Shift+A. Ctrl+D is now the default shortcut for duplicating selected elements (GraphCommand.DUPLICATE_COMMAND). The latter can be disabled via the duplicateAllowed property.

GraphEditorInputMode.shouldBeMarqueeSelected is no longer queried by the Paste command to determine the items which should be selected after paste. Instead, the new method GraphEditorInputMode.shouldBeSelectedAfterPaste is queried. Note that GraphEditorInputMode.shouldBeMarqueeSelected still is queried to determine the items which should be selected by marquee selection.

Now, all pasted items are selected after a paste (previously: only nodes, edges, and bends). This can be configured via the new pasteSelectableItems property in GraphEditorInputMode and the corresponding shouldBeSelectedAfterPaste method.

The hit test order for double clicks in GraphEditorInputMode and GraphViewerInputMode is now controlled through the dedicated doubleClickHitTestOrder property. By default, this hit test order prefers labels over other graph elements.

If ClickInputMode is configured to deliver both single and double clicks, double clicks are not reported if the first click has created a new node or if cyclic selection is currently active. The same holds for TapInputMode and single/double taps.

The visualization of the HandleType.ROTATE is now a single circle, its very thin central point has been removed.

The segment index for label model parameters of SliderEdgeLabelModel and SideSliderEdgeLabelModel now is related to the visible segments for edges styled with PolylineEdgeStyle.

If an IEditLabelHelper implementation is present in an ILabel's lookup, its editLabel method is now called in addition to an eventual owner's edit helper when the label text is edited. If implementations are present for both the label and the owner, editing is only allowed if both helpers return true. Additionally, the predicate method GraphEditorInputMode.shouldLabelBeEdited always has to return true, whether edit helpers are present or not.

The label that is edited is now determined in the following order:

If a label is explicitly provided as a command parameter or through a convenience method or is the only selected element, it is edited if the previous condition is satisfied. No other candidates are tried in that case.

If a label owner is explicitly provided as a command parameter or through a convenience method, or is the only selected element, the first label that satisfies the condition above is edited if the previous condition is satisfied. If no such label exists, a new label is added, provided that the owner allows adding. In either case, no other candidates are tried.

The first selected label for which the previous condition is satisfied.

If multiple label owners are selected, the first owner that has a label for which the previous condition is satisfied (in which case that label is edited).

If the method IEditLabelHelper.editLabel provides, for either an editable label or its owner, a different label instance, this instance is edited instead.

Otherwise, a label is added if an eligible owner can be found (see below).

If an IEditLabelHelper implementation is present in an ILabeledItem's lookup, its addLabel method is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate method GraphEditorInputMode.shouldLabelBeAdded always has to return true, whether edit helpers are present or not. If the new label should be edited interactively after its creation (the default behavior), it must be editable, too, following the rules above. Therefore an IEditLabelHelper implementation usually should allow editing of label instances that it has created itself in addLabel.

The label owner for which a label is added is now determined in the following order:

If a label owner is explicitly provided as a command parameter or through a convenience method, or is the only selected element, a label is added if the previous condition is satisfied. No other candidates are tried in that case.

If multiple label owners are selected, the first one for which the previous condition is satisfied.

IncrementalHierarchicLayouter: Creating layer constraints or sequence constraints using a disposed of factory now throws an error (see LayerConstraintFactory and SequenceConstraintFactory).

SALabeling and GreedyMISLabeling: Changed LabelCandidates default for overlap penalty of nodes and edges from 0 to 1. This means label overlaps are now considered more severe.

API Changes

The event SizeChanged and related methods and properties have been moved from Control to CanvasControl. In addition, some timer-related properties have been replaced by more general variants to account for the new SizeChangedDetectionMode.SENSOR size change detection mode. Likely, customer code is not affected by neither change since the other classes that extend Control did not use the size changed-feature anyways.

Control: Due to the improved event handling policy, the properties preventDefault, preventContextMenuPropagation, and preventEventPropagation are no longer needed and have been removed. Instead, the new properties preventKeyboardDefault, preventPointerDefault, and preventContextMenuDefault can be enabled to prevent the default action of the respective types of events.

Changed SnapLine to support non-orthogonal snap lines as well: its properties from and to have been changed from type number to PointD, its property orientation was removed, and its constructors have been changed accordingly.

Orthogonal snap lines are now modeled by class OrthogonalSnapLine. It extends SnapLine and provides the property orientation. Existing API uses either SnapLine or OrthogonalSnapLine, depending on whether it works only with orthogonal snap lines or not.

As a consequence, in class SnapLineSnapResult, the property snapLine returns a non-orthogonal SnapLine and the property delta returns a PointD instead of a number. API related to GraphSnapContext still works only with orthogonal snap lines and uses OrthogonalSnapLine.

The key property on SingleLineSnapLineVisual, FixedDistanceSnapLineVisual, and InBetweenSnapLineVisual, has been made read only.

GraphModelManager's factory methods for creating the installers now have a less restrictive return type. The default implementation still returns the same types as before, though.

GraphClipboard's factory methods for creating the predicates for the various cut and copy operations now require a second argument that is the graph that the predicate is working on. Usages typically use the graph in the graph control where the selection is also being used. If the default graph selection implementation is used. The graph instance can be obtained from its corresponding property.

GraphModelManager's installer related properties now use a weaker return type to simplify subclassing with new functionality. The instances used are the same and can be down-casted accordingly to the more specific types as documented.

IItemFactory: Added method createRedirectedGroupEdge.

GraphClipboard's protected method copyGraphToRoot which was called by cut, copy, and paste to invoke the GraphCopier has been split: copyGraphToRoot now is called only by cut and copy. paste now invokes the new method pasteSubsetWithTargetAndCallback.

The type of GraphMLAttribute's serializable property has been changed from boolean to the enum GraphMLSerializationMode.

GraphEditorInputMode and TableEditorInputMode: return type of callback methods onAddLabel and onEditLabel has been changed from void to boolean. The return value should specify whether the operation in question was successful.

Context menus need no longer implement any interface, and the interface yfiles.input.IContextMenu was removed. The members using that interface, namely the properties ContextMenuInputMode.menu, ContextMenuInputMode.clearMenu and PopulateContextMenuEventArgs.contextMenu, and the method ContextMenuInputMode.createMenu were removed as well. Since users create the context menu by themselves, there was no real need for these API members.

Note that you'll now have to explicitly set the property PopulateItemContextMenuEventArgs.showMenu to true in your listener for the event PopulateItemContextMenu to show your menu. This was previously done automatically by the input mode if the property IContextMenu.isEmpty returned false.

CollapsibleNodeStyleDecoratorRenderer: The method addToggleGroupStateCommand is now public and static, and its signature was slightly changed.

TreeSource: Due to the new support for group and location bindings, the signature of its methods createNode and updateNode changed.

ToolTip does no longer extend the class Control. This has no effect on its behavior.

Bugfixes

Viewer

CanvasControl: The events Mouse2DEntered and Mouse2DExited have been erroneously fired when the mouse moved between inner elements. Now, these events are only fired when the mouse enters or leaves the bounds of the control, which is the intended and documented behavior.

Similarly, the methods onMouseEnter and onMouseLeave of Control were erroneously invoked in these cases. This has been corrected, too.

Properties ShinyPlateNodeStyleRenderer.radius, ShinyPlateNodeStyleRenderer.brush, ShinyPlateNodeStyleRenderer.pen and BevelNodeStyleRenderer.radius were not used consistently.

Fixed memory leak that occurred when CreateEdgeInputMode was uninstalled.

CreateEdgeInputMode: Fixed some problems with mixed mouse and touch input.

When using an IEditLabelHelper and adding a label interactively, the helper's editLabel callback was called instead of addLabel.

Newly added labels could have had an empty size when an IEditLabelHelper instance was registered.

When a highlighted item was removed from the graph, the highlight was not cleaned up.

Reparenting an empty group node displayed the target node highlight around the reparented node.

The modified MoveInputMode created by MainInputMode.createMoveUnselectedInputMode changed the cursor to indicate a movable object even when the modifierRecognizer disabled moving.

When both a group node and its child node were resized together the group node bounds shrunk to its original bounds once the child had reached the original bounds.

CreateEdgeInputMode now copies the dummy edge's tag to the created edge. This could have caused issues when a listener for the event EdgeCreationStarted set a custom tag on the dummy edge.

When the pressed status of the Shift key changed during a reparenting gesture of a node, the bounds of its containing group node were not immediately updated.

The secondary multi-tap gesture was not recognized correctly.

Labels whose positions were determined by NinePositionsEdgeLabelModel, SliderEdgeLabelModel, and SideSliderEdgeLabelModel might have disappeared when one or more edge segments were hidden under the source or target node.

BevelNodeStyle: Fixed update of drop shadow after radius has been changed.

IconLabelStyle: Method getBounds in IconLabelStyleRenderer returned a valid rectangle even if the label layout was invalid. As a consequence, isVisible erroneously returned true for labels with invalid bounds.

The name property of the class GraphMLAttribute was not considered during deserialization.

Write events in GraphML were not always raised.

After setting an ICanvasObjectGroup's visible property to false the group was still visible.

CanvasControl.ensureVisible hasn't worked for bounds larger than the current viewport.

Setting the view point on a CanvasControl with a width or height of 0.0 could cause an exception if a ViewportLimiter was enabled.

GraphCopier threw an error if the source and the target graph were identical.

When the SelectionPaintManager was disabled and a custom FocusPaintManager was used nodes styled with TemplateNodeStyle might not always have been updated after selection changes.

GraphEditorInputMode and GraphViewerInputMode now respect their respective multiSelectionRecognizer for extending an existing selection via marquee.

IncrementalHierarchicalLayouter: Fixed a bug that caused collinear bends in some edge routes.

DoubleLinePlacer: Fixed the distance between the local root and the upper line to match the specified spacing. The distance between the two lines can now be defined in relation to the spacing.

ClassicTreeLayouter: Fixed StackOverflow exception occurred in trees with high depth.

TreeReductionStage: Fixed wrong handling of group nodes which may cause a WrongGraphStructure error as well as broken routes of edges incident to group nodes.

SimpleNodePlacer: Fixed broken edge routes that may appear for edges on nodes with external labels if integrated node labeling is enabled.

CopiedLayoutGraph: Fixed an error that occurs when nodes or edges are added to the copied graph without removing them before calling commitLayoutToOriginalGraph.

ShortestPaths: Fixed an error that occurred when applying the Dijkstra or Bellman-Ford algorithm to an empty graph.

yFiles for HTML 1.2.1.4 - Changes Since 1.2.1.3

Bugfixes

SimpleLabelStyle: In multi-line labels, each line repeated the text of the first line if stringTrimming was set to another value than StringTrimming.NONE. Since the actual bug was in class TextRenderSupport, customer code that used that class directly was affected as well.

IncrementalHierarchicLayouter: In non-incremental mode, sequence constraints may not have been respected.

IncrementalHierarchicLayouter: Optimized the sequence of group nodes if 'place at head/tail' sequence constraints are defined.

GraphSource, AdjacentEdgesGraphSource, and AdjacentNodesGraphSource: Corrected several problems in the method updateGraph() that could result in errors like 'Key not found' and 'Edge not in this graph'.

yFiles for HTML 1.2.1.3 - Changes Since 1.2.1.2

Bugfixes

Viewer

Event location of the various TapInputMode events was not always updated properly.

Orthogonal edge editing could throw an error if edges were removed during interaction with an orthogonal edge.

Fixed problems when exporting SVG content from the CanvasControl if HTML5 Canvas rendering was used and non-default viewport settings were applied. As a result, images could have been clipped incorrectly.

Fixed a regression introduced in 1.2 which rendered the shapeRendering and imageRendering properties in CanvasControl useless. The properties are now applied correctly to the SVG DOM during rendering and image export.

In Internet Explorer, DragOver events could have been reported although the actual mouse location did not change. This happened if the DOM element under the mouse pointer was switched without the mouse being moved, and possibly resulted in a loop and excessive CPU usage, e.g. during drag and drop operations onto the GraphControl with preview and snapping enabled.

Included a workaround for a shortcoming of Internet Explorer: multiple consecutive whitespace characters in label text are displayed as a single space. The workaround replaces each non-newline whitespace with the unicode non-breaking space character \u00A0. This workaround must be enabled explicitly. Its details are described in the Known Issues .

GraphControl: Prevent an error during updateVisual if the GraphControls's HTML elements were removed by external code. This could happen especially in Internet Explorer if one of the parent elements of the GraphControl was cleared with element.innerHTML = "".

GraphML serialization could not correctly handle undefined values and has thrown an error instead. The new property SerializationProperties.UndefinedHandling controls how undefined values are serialized.

MouseEventArgs.button was set to MIDDLE for all but the left and right mouse button. This two were correctly reported. As a consequence, Mouse2DEventArgs.changedButtons had the same error.

GraphSourceBase.updateGraph threw an error if the object instances in groupsSource had been changed. This error affected GraphSource, AdjacentNodesGraphSource, and AdjacentEdgesGraphSource.

AdjacentEdgesGraphSource.updateGraph: instead of retaining edges that should remain in the graph, the edges were deleted and re-created anew.

Correct the Developer's Guide section about custom XML namespace mappings for GraphML serialization and showcase the described annotations in the Custom Styles tutorial and other demos.

Layout

Polyline.EdgeRouter: Fixed rare error that may occur for graphs where only a subset of edges is routed, see EdgeRouter.SphereOfAction.

yFiles for HTML 1.2.1.2 - Changes Since 1.2.1.1

Bugfixes

Viewer

RotatedSliderEdgeLabelModel: A bug could cause the label to lie at infinite coordinates. This could only occur in very rare occasions if the first or last edge segment is orthogonal and the source or target port is completely outside the node boundaries. As a result, the label becomes just invisible in most cases, but code that does not properly handle infinite coordinates could possibly break due to numeric instabilities.

An edge whose source or target port is owned by another edge (edge-to-edge connection) was always drawn in the background if grouping was enabled instead of in front of the related groups. Now, such an edge is drawn in front of these groups, with the same z-index as a similar edge from node to node would get.

Nodes can now be reparented with a touch gesture, by touch-dragging a node onto its new parent. Previously, that was only possible with a mouse drag.

MoveViewportInputMode no longer fires the DragFinishing and DragFinished events for simple clicks without any mouse movement.

GraphViewerInputMode: The event CanvasClicked specifies now the correct type for its event args, that is ClickEventArgs.

In Internet Explorer, Mouse2DMoved events could have been reported although the actual mouse location was not changed. This happened if the DOM element under the mouse pointer was switched without the mouse being moved, and possibly resulted in a loop and excessive CPU usage.

Moving the focus to the left was not possible since the command was not connected to the intended keyboard shortcut Control + Left Arrow.

NodeDefaults, EdgeDefaults and all other Defaults: it was erroneously possible to assign null to the style property. Now, the property throws an ArgumentNullException in this case.

GenericYList: Calling insert on an empty list has thrown an exception.

Custom handles for graph items might not have been updated correctly after changes of the selection due to a problem in InputModeController. The default handles were not affected by this problem.

Layout

CircularLayouter: Fixed bug that may cause node overlaps.

CopiedLayoutGraph: Fixed problem that may cause movement of label boxes in the original graph even if method CopiedLayoutGraph.commitLayoutToOriginalGraph is not called.

IncrementalHierarchicLayouter: Fixed label placement for octilinear selfloops with the same side constraints for source and target port.

IncrementalHierarchicLayouter: Fixed rare error that may appear in incremental layout mode if there are group nodes that contain non-incremental elements.

Demo Improvements and Bugfixes

Deployment tool: The default blacklist of the obfuscation step contains now much more names of common HTML5 and JavaScript APIs. Thus, the tool will no longer erroneously obfuscate these API usages in your source code.

All demos that use a LayoutExecutor or the morphLayout method now set a custom finishHandler that checks for exceptions during the layout calculation and handle them appropriately. If a custom finishHandler is set, handling such exceptions is its responsibility.

Documentation Viewer Improvements

Camel-Case search results were not listed in the search results page.

Navigating to a type member now automatically expands the member's documentation.

Typing now automatically focuses the search field.

Improved layout of the search results page.

The middle mouse button now closes tabs.

Added a "Constants" category for static final fields.

Type parameters were not correctly replaced in type parameter bounds.

The quick search results box did not always close when choosing a search hit.

Improved linking from overrides and implementations to the overridden/implemented members.

Fixed sporadic error messages about circular JSON structure.

The type member overview bar sometimes highlighted the wrong member section.

Types that are mentioned in the Developer's Guide are now considered more important search hits.

Inherited member documentation was sometimes missing.

Tables were not rendered correctly in Internet Explorer 9.

The viewer sometimes did not start correctly in Internet Explorer 9.

"Show Usages" now also shows developer's guide references.

Searching for event add/remove methods did not work.

Filtering the Developer's Guide tree view now works correctly.

Links to relevant demo applications were missing for some API members.

Closing a tab sometimes opened an additional tab with a nonfunctional URL.

yFiles for HTML 1.2.1.1 - Changes Since 1.2.1

This bugfix release brings improvements for the new documentation viewer and for some of the demo applications. The yFiles for HTML library is not changed by this release, except for the incremented version number.

Demo Improvements and Bugfixes

Include the new Events demo and the new Sparkline Styles demo in the Viewer package.

Layout Styles demo: The initial layout might have failed because the needed module yfiles/layout-misc was not properly 'required'.

All demos with a layout algorithm now use the MinNodeSizeStage to gracefully handle graphs with nodes with a width or a height of '0'. Without that stage, the layout will throw an exception if the graph contains such a node.

In some cases, errors did not trigger the error reporting dialog but were only shown in the developer tools of the browser.

Mindmap demo: Moving nodes without text resulted in an error.

Mindmap demo: If opening the initial data file fails, the demo now shows a fallback graph.

ReshapeHandleProvider demo: Shrinking the nodes that preserve their aspect ratio no longer throws an error when their width or height becomes '0'.

Documentation Viewer Improvements

The drop-down menus of the member navigation bar were not visible.

Added missing images for some API pages.

Camel case search hits were visible only in the quick search results box. They are now also listed on the search results page.

Because the number of search results was unlimited, the browser would freeze for searches with a large number of hits. The maximum number of search results is now limited.

yFiles for HTML 1.2.1 - Changes Since 1.2.0.6

The main focus of this release is on new and enhanced tools for developers and on more and improved demo applications.

The yFiles for HTML library in this release maintains compatibility with the previous versions of 1.2 and brings small improvements and corrections like a regular bugfix release. All users of previous versions of 1.2 are therefore strongly encouraged to update to this release.

Enhanced Development Support

Support for IntelliSense for the yFiles API in Visual Studio 2012 and newer. That includes statement completion, parameter information for methods, and descriptions in the Quick Info pop-ups.

Various improvements and corrections of the documentation in yfiles-api.js: Removed left over private API members, replaced invalid annotations, added @static annotations, fixed links to events and framework classes, improved documentation for inherited members, improved the formatting, added information about runtime complexity and preconditions of algorithms.

New Grunt-based deployment tool that replaces the previous Java-based obfuscator and offers additional features: It can combine the three files that form a yFiles module into a single file and simplify the yFiles AMD 'define' statements in a standard conform way. See the tool's description for more details.

The tool yfiles.help now shows the inheritance hierarchy and implemented interfaces of yFiles types.

Method and property parameter checks now display which parameters were wrong instead of just warning about a mismatch.

New and Improved Demos

Added install and start scripts for a local Node.js Express server that can serve the demo content. Using a server prevents security issues when running the demo applications directly from the filesystem.

The demo demo.yfiles.layout.LayoutStyles now provides a convenient graphical user interface to explore the vast configuration options of the most used yFiles layout algorithms.

Added new showcase application demo.yfiles.graph.mindmap.

The new demo demo.yfiles.graph.basiclayouter can serve as a starting point for custom yFiles for HTML applications.

Added new demo demo.yfiles.angular that shows the integration of yFiles for HTML with Angular JS.

Added new demo demo.yfiles.graph.events that demonstrates the various events of the input mode, the graph control, and the graph.

Added new demo demo.yfiles.style.sparkline that shows how to use a third party visualization framework for a custom node style.

Added new demo demo.yfiles.loading.nodejs that runs a yFiles layout algorithm in a Node.js server.

Improvements and Corrections

Prevent overlaps of collapse buttons and group node labels in several demos.

Simple Custom Style Demo and Style tutorial: Show a custom group node style.

Simple Custom Style Demo and Style tutorial: Label didn't show line breaks created with Ctrl+Return.

Image Export Demo: Prevent timing issues by calling the export code in an event handler of the load event instead of calling it directly.

Completely revised the Simple Dojo Demo: More concise and clean code, use of modern Dojo syntax and theme.

The File Operations demo now uses a Node.js server for the server-based load/save operations.

All Data Binding demos now use yfiles.drawing.StringTemplateNodeStyle instead of yfiles.drawing.TemplateNodeStyle since it is better suited for this use case.

Preferred Label Placement Demo: Switched off the label style's autoFlip feature so the "Add 180° on Right Side" option has a visible effect.

Bpmn Editor Demo: The implementation of the methodConnectedIconLabelStyle.isVisible was not correct, resulting in a disappearing icon during movements.

Bpmn Editor Demo: Make sure that a new label of a pool node gets a suitable location by using a custom EditLabelHelper in PoolNodeStyle.

The StylePanel used for the palette in several demos and some other helper GUI components are now implemented in plain JavaScript/HTML and no longer extend class yfiles.canvas.Control.

Various code and documentation improvements in the Input demos, for example switched off unnecessary interaction to highlight the main point of each demo.

Various smaller code improvements in the Getting Started tutorial.

All demos that execute a layout and set a custom finishHandler now check for exceptions during the calculation and handle them appropriately. If a custom finishHandler is set, handling such exceptions is its responsibility, and thus, such exceptions were previously silently discarded in these demos.

Context menus are now opened centered on the GraphControl if the context menu key is pressed. Demo code shows how to correctly handle this key event in Chrome, Firefox, and Internet Explorer.

Minor Improvements

The rendering performance of the built-in node styles has been optimized, especially in Chrome and Internet Explorer.

GraphViewerInputMode and GraphEditorInputMode: The child clickInputMode now delivers both left and right clicks.

OverviewInputMode and GraphOverviewControl have been optimized to improve the user experience when used on touch devices.

OverviewInputMode can be customized more easily. Minor modes can be replaced and adjusted, as well as the list of available default command bindings can be modified.

The tooltip is now a child of the <body> instead of the <html> element.

The adapter classes GraphSource, AdjacentNodesGraphSource, AdjacentEdgesGraphSource, and TreeSource now accept IEnumerables as values for the properties nodesSource, edgesSource and groupsSource, in addition to arrays and plain JavaScript objects.

Bugfixes

DefaultArrow.length did not take the scale factor into account, sometimes leading to gaps between the edge and the arrow.

Custom selection visualizations using EdgeStyleDecorationInstaller were not animated correctly.

Custom selection visualizations using EdgeStyleDecorationInstaller in DecorationZoomMode.MIXED or DecorationZoomMode.VIEW_COORDINATES did not work correctly together with BridgeManager.

EdgeStyleDecorationInstaller can now be used with self loops without bends, too.

ClickInputMode: Canceling the mode during clicks didn't work correctly and as a result, the location reported for the next click might have been wrong.

GeneralPath.transform and other GeneralPath methods using Matrix2D applied the transformation matrix incorrectly in the case of a rotation.

Running any label placement algorithm had no effect for node/edge labels if the properties removeNodeOverlaps/removeEdgeOverlaps were enabled because all potential candidates were erroneously rejected.

NavigationInputMode tries to request the mutex when an expand/collapse or enter/exit command is executed. This fixes an issue where ClickInputMode was inadvertently handling the click on a group collapse button in case that ClickInputMode.clickHandlingMode was set to DOUBLE_CLICK_ONLY.

Included a workaround for a problem with the context menu key in Google Chrome. Since the workaround requires auxiliary changes in customer code, it must be enabled explicitly. The details are described in the Known Issues .

Changes in Default Behavior

GraphEditorInputMode and GraphViewerInputMode: The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.

yFiles for HTML 1.2.0.6 - Changes Since 1.2.0.5

Bugfixes

The validation of a license that contains a watermark always failed for users of Internet Explorer with a Finnish locale. Only this specific setup is affected.

UndoEngine: due to incorrect calculation of time, successive commands that should have been part of the same undo unit were in fact placed in different units.

Group nodes were resized unexpectedly when moving them together with their children if the children were selected before the group.

GraphML serialization of arrays was broken when the file yfiles-typeinfo.js was included.

The modules yfiles/complete and yfiles/layout did not list all modules from the layout part as dependencies. yfiles/layout-familytree, yfiles/layout-orthogonal-compact, yfiles/layout-polyline, and yfiles/layout-radial were missing.

Layout

MultiPageLayouter: Fixed bug that caused that an AbortHandler attached to the input graph was ignored.

MultiPageLayouter: Fixed error that may occur for specific mappers for the key MultiPageLayouter.EDGE_ID_DP_KEY.

IncrementalHierarchicLayouter: Fixed error that could occur when octilinear edges are attached to group nodes.

HVTreeLayouter: Fixed bug that may cause edges with reversed direction if the layout isn't run in buffered mode.

PortCandidateSet: Fixed bug that caused method findMatchingCandidate to return the entry with the highest cost instead of the lowest cost if the candidate matcher is created with method PortCandidateSet.createMatcher.

DirectedOrthogonalLayouter: Fixed bug that caused an error if a mapper for the key PortConstraintKeys.SOURCE_GROUP_ID_DP_KEY is registered to the input graph but no mapper for the key PortConstraintKeys.TARGET_GROUP_ID_DP_KEY is registered.

ComponentLayouter: Fixed bug that caused an error if the style is set to yfiles.layout.ComponentArrangementStyles.MULTI_ROWS_HEIGHT_CONSTRAINT or MULTI_ROWS_HEIGHT_CONSTRAINT_COMPACT and all components exceed the preferred height.

IncrementalHierarchicLayouter: Fixed bug that caused first or last segments of edges to be too short to span all associated labels.

TreeReductionStage: Fixed bug that may cause a WrongGraphStructure error if the input graph contains group nodes with incident edges.

TreeLayouter: Fixed bug that may cause an error if the input graph is a CopiedLayoutGraph that consists of multiple connected components and the layouter uses the LayeredNodePlacer, if the property childPlacementPolicy is set to yfiles.tree.ChildPlacementPolicy.ALL_LEAVES_ON_SAME_LAYER.

yFiles for HTML 1.2.0.5 - Changes Since 1.2.0.4

Bugfixes

Strings where the last entry would consist of a single character were not tokenized correctly.

Obfuscator: Building the obfuscator failed because the download location of one of the prerequisites of Mozilla Rhino (xmlbeans) is no longer valid. As a workaround, that library is now downloaded from the new location in advance.

yfiles.lang.Class.findMembers and related methods like getMembers could return incorrect results.

Automatic Layout

IncrementalHierarchicLayouter and RankAssignments: Fixed possible exception that may occur if the maximal duration of the algorithm is limited.

IncrementalHierarchicLayouter: Fixed bug that may cause overlaps of edge labels with preferred placement at source/target.

polyline.EdgeRouter: Fixed rare exception that mainly appears if there are overlapping nodes.

PartialLayouter: Fixed bug that may cause broken edge routes for edges incident to incremental group nodes if option routeInterEdgesImmediately is enabled.

CompactOrthogonalLayouter: Fixed possible exception caused by nodes without node-ids. This problem may only appear if the inter edge router is set to ChannelInterEdgeRouter.

yFiles for HTML 1.2.0.4 - Changes Since 1.2.0.3

Bugfixes

Corrected an error in the image export that prevented creating images for (text) labels with non-ASCII characters. Ultimately, the problem was in the method SvgExport.exportSvgDataUrl.

When both a group node and its child node were resized together the group node bounds shrunk to its original bounds once the child had reached the original bounds.

Fixed problem in LayoutGraphAdapter where label candidates for edge labels were not always determined correctly.

RotatedSideSliderEdgeLabelModel: Label model parameters of this model were serialized as the respective parameters of RotatedSliderEdgeLabelModel. Thus, after loading, the positions of the labels are the expected ones but the label models changed.

RotatedSliderEdgeLabelModel: Parameters with ratio 0.5 were not correctly deserialized from GraphML.

FoldedGraph detects more carefully what has changed before invoking the methods CreateDummyEdgeAppearance and ChangeDummyEdgeAppearance of IDummyEdgeConverter. Previously, in some cases, these methods were called to often or not at all.

FilteredGraphWrapper: The various edgesAt methods erroneously returned edges that were marked as hidden by the edgePredicate. The methods degree, inDegree, and outDegree are based on these methods and were affected, too.

GraphSnapContext: Snapping nodes to vertical edge segments was not working if nodeToEdgeDistance was set to 0.0.

When snapping was disabled temporarily (using Ctrl) during a move gesture, the moved item snapped after finishing the gesture, anyway.

GenericTreeLayouter: Fixed issue that caused too large group nodes when label consideration is enabled and the layout is not oriented top-to-bottom.

GenericTreeLayouter: Fixed issue that causes group nodes to be too small to include all edge labels when the edge connects to a child of an inner group node.

GenericTreeLayouter: Fixed issue that causes group nodes to be too small for node halos.

GenericTreeLayouter: Fixed issue that produces unnecessary large group nodes if node labels are considered.

TreeReductionStage: Fixed wrong handling of group nodes which may cause a exception as well as broken routes of edges incident to group nodes.

Fixed exception when using AssistantPlacer together with distributed port assignment.

CircularLayouter: Fixed issue that may cause infinite/too large node coordinates for unfavorable input settings, for example, if the maximal deviation angle is to small. Note that such coordinates may produce infinite looping or other exceptions.

BorderLine: Fixed bug in method grow that may result in an exception because the minimum value of a BorderLine becomes greater than the maximum value.

AbstractLabelingAlgorithm: Fixed bug that may cause removal of labels that don't overlap with other elements if option removeNodeOverlaps is enabled.

Polyline.EdgeRouter: Fixed bug that may cause zero length routes of edges whose start and end point are at the same location.

BusRouter: Fixed exception that may appear for graphs containing isolated nodes with self-loops.

The IRenderContext instance created by CanvasControl.createRenderContext was not usable for SVG export with CanvasControl.createVisualContent. Note that for SVG export, it is still recommended to use class SvgExport instead.

GraphSnapContext: Snapping nodes to vertical edge segments was not working if nodeToEdgeDistance was set to 0.

IncrementalHierarchicLayouter: Fixed possible error caused by an inconsistent order of group nodes.

CircularLayouter: Fixed issue that may cause infinite/too large node coordinates for unfavorable input settings, for example, if the maximal deviation angle is chosen to small. Note that such coordinates may produce infinite looping or other errors.

yFiles for HTML 1.2.0.1 - Changes Since 1.2

Improvements

Changed the way HTML5 Canvas based rendering looks when the canvas is being resized. The previous implementation caused artifacts that could be noticed during resize operations in hybrid rendering mode.

Moved some consistency checks that were erroneously part of the main library to the type checking development aid. This will result in a slight performance improvement.

The new development assistance features that were introduced in 1.2 are now described in detail in the developer's guide in the chapter Getting Started.

The Simple Dojo Demo can now be loaded from the file system in all browsers since its custom Dojo widget doesn't depend on a separate HTML file anymore.

Bugfixes

Restored compatibility with older template style definitions. Now, it's possible to dynamically add templates to the 'template_svg' svg element after instantiating another template style. Existing instantiated templates will not be updated until a new template is created, though. The incompatible changes section of version 1.2 was updated accordingly.

Fixed repaint issues in the Graph Overview for future (at the time of writing) Chrome releases that were caused by subpixel layouts.

Fixed non-dirty background RenderVisuals not always being repainted during resize and transform changes.

Fixed the error handling in yFiles demo framework applications that were created with the option catchErrors:'true'.

BPMN Demo: use the correct CSS class names for the styling of the cursor during drag-and-drop.

BPMN Demo: Improved creation of new edges to not share the same port instances which previously could result in bogus edge paths.

Fixed broken API documentation in places where generic type parameters were used and referenced in both the developer's guide and the API Reference.

SimpleLabelStyle constructors that take a Typeface, but not a font size as a parameter do not override the typeface's font size with the default value of 12 anymore.

Fixed TextRenderSupport.PlaceText always returning the original text if StringTrimming.NONE was passed in.

Layout

Integrated labeling of the hierarchic layout style: preferred label placements Along Edge were not calculated correctly.

BusRouter: Fixed error in BusRepresentations that could appear if the input graph contains overlapping nodes.

FixedGroupLayoutStage: Fixed canLayout which changed the structure and layout of the graph.

yFiles for HTML 1.2 - Changes Since 1.1.1.6

Major Features Added

Support for HTML5 Canvas-based rendering has been added. Especially suitable for low-detail, high-volume renderings, HTML5 Canvas rendering is now directly supported. SVG and Canvas-based renderings may be mixed and rendering can be switched on the fly for level-of-detail scenarios, etc.

Complete TypeScript 1.0 language bindings included in the package simplify type-safe and compiler-checked development in Visual Studio and other IDEs.

A new optionalGWT overlay enables convenient coding in Java and Java IDEs against the library. The bundled demos in the main package have been adjusted accordingly.

Improved developer productivity with added development aids like debugging support, dynamic source code generation tooling, and live object manipulation utilities to enable interoperability with third party OOP JavaScript frameworks.

Added easy support for HTML overlays, fly-outs, and pop-ups to the graph control.

New classes AdjacentNodesGraphSource and AdjacentEdgesGraphSource provide data binding support for a much larger number of user data models.

New and improved template styling support can now intelligently handle definition references and allows for embedding templates directly into GraphML or special script tags.

Built-in support for text-wrapping, clipping, and ellipses, as well as performance optimized text-measuring has been added for the built-in styles and is made available for custom style implementations.

Layout

Added new layout algorithm RadialLayouter that places nodes on concentric circles. Edges are routed in a radial fashion using one of several routing strategies.

Added support for terminating (layout) algorithms prematurely. To this end, new class AbortHandler provides methods to specify how long an algorithm may run until it is gracefully terminated (see method stopDuration) and immediately terminated (see method cancelDuration), respectively.

The following layout algorithms have at least rudimentary support for immediate termination:

Layout Algorithms

Routing Algorithms

Other Algorithms

BalloonLayouter

CircularLayouter

CompactOrthogonalLayouter

DirectedOrthogonalLayouter

GenericTreeLayouter

GRIP

HierarchicGroupLayouter

HierarchicLayouter

IncrementalHierarchicLayouter

OrganicLayouter

OrthogonalGroupLayouter

OrthogonalLayouter

PartialLayouter

RadialLayouter

RecursiveGroupLayouter

SmartOrganicLayouter

BusRouter

polyline.EdgeRouter

OrganicEdgeRouter

OrthogonalEdgeRouter

GreedyMISLabeling

SALabeling

The following layout algorithms also support graceful early termination:

Layout Algorithms

Routing Algorithms

Other Algorithms

HierarchicGroupLayouter

HierarchicLayouter

IncrementalHierarchicLayouter

OrganicLayouter

SmartOrganicLayouter

polyline.EdgeRouter

SALabeling

Introduced concept of node halos. Halos are reserved space around a node in which layout algorithms will not place other graph elements. Node halos are modelled using class NodeHalo.

The following layout algorithms support node halos:

Layout Algorithms

Routing Algorithms

Other Algorithms

BalloonLayouter

CircularLayouter

CompactOrthogonalLayouter

ComponentLayouter

DirectedOrthogonalLayouter

GenericTreeLayouter

IncrementalHierarchicLayouter

OrthogonalGroupLayouter

OrthogonalLayouter

RadialLayouter

RecursiveGroupLayouter

SmartOrganicLayouter

TreeLayouter

polyline.EdgeRouter

SelfLoopLayouter

GreedyMISLabeling

SALabeling

InsetsGroupBoundsCalculator

MinimumSizeGroupBoundsCalculator

SmartOrganicLayouter: Added support for partition grid layout. See class PartitionGrid.

Optimized the module dependencies to reduce loading times. The module layout-hierarchic does no longer depend on the modules layout-router and layout-tree, and the module layout-orthogonal does no longer depend on the module layout-router.

Minor Features Added

GraphSource: Added property lazyNodeDefinition. If this property is enabled, objects that are not contained in nodesSource can be used as source and target of edges as well.

GraphSource: Added property nodeLabelBinding that specifies the label binding for nodes, similar to the edgeLabelBinding for edges.

ItemDropInputMode is a new DropInputMode for IModelItems that facilitates subclasses to support preview and snapping of the dragged item as well as highlighting potential drop targets.NodeDropInputMode and StripeDropInputMode have been refactored to use ItemDropInputMode as base class.

Node ports can now be moved by dragging their IHandle.

Code completion now supports generics in supporting IDEs as part of the JSDoc3 support.

Layout

BalloonLayouter: Added support for integrated node and edge labeling. See new properties integratedEdgeLabeling, integratedNodeLabeling, and nodeLabelingPolicy.

BalloonLayouter: Added support for different policies to align nodes having the same root node. See new property childAlignmentPolicy.

BalloonLayouter: Added support for interleaved child node placement. With interleaved placement, child nodes are placed at different distances to their parent node to achieve a more compact layout. See new property interleavedMode.

IncrementalHierarchicLayouter: Improved edge label placement. Edge labels with preferred placement at source/target are placed closer to the corresponding node. Additionally, SimplexNodePlacer offers the option to place adjacent edge labels in a compact, stacked style. See new property labelCompaction.

polyline.EdgeRouter: Added a fine-granular configuration option to weigh the crossing costs for each label using the data provider look-up key EdgeRouter.LABEL_CROSSING_COST_FACTOR_DP_KEY.

polyline.EdgeRouter: Added property ignoreInnerNodeLabels that allows to ignore node labels that are inside the bounds of their owner so they may be crossed by edges. This is especially useful if labels of group nodes may be crossed while outer labels of non-group nodes may not.

polyline.EdgeRouter: Added support for customizing the order in which edges are routed. See new property edgeOrderComparator.

GenericTreeLayouter: When enabling GenericTreeLayouter.integratedNodeLabeling and/or GenericTreeLayouter.integratedEdgeLabeling, the respective labels will be taken into account during the calculation of group bounds.

DelegatingNodePlacer: Added key DelegatingNodePlacer.LEFT_RIGHT_DP_KEY that allows choosing on which side a node is placed.

LabelLayoutTranslator: Added properties writeBackRelativeEdgeLabelLocation and writeBackRelativeNodeLabelLocation that allow a core layouter to specify new node or edge label locations relative to the label's owner.

LabelLayoutKeys: Added key IGNORE_LABEL_DP_KEY that allows specifying which edge and node labels should be ignored during layout calculations.

Added new class OrganicRemoveOverlapsStage that removes node overlaps while respecting a specified minimal node distance. Unlike the approach implemented in class RemoveOverlapsLayoutStage, this approach tries to keep the original layout structure, i.e., it tries to keep the geometric distance between the nodes.

Improvements

The library module files now support the relative AMD loading mechanism for easier configuration.

The custom style tutorial has been reworked and custom steps for creating group nodes and folder nodes have been added. Also, bridge support for edges and level-of-detail rendering using HTML5 Canvas are now available in separate tutorial steps.

ImageNodeStyle now supports fail-over images by default.

CollapsibleNodeStyleDecorator can now conveniently be customized and more easily be subclassed.

Improved touch device input for the default collapse button styles and added multi-touch support for the scrollbars.

Algorithms

Dfs: Added method cancel that can be used by subclasses to cancel the search.

Cycles: Improved method findCycle to stop the search as soon as the first cycle has been found.

GraphConnectivity: Improved method makeBiconnected to work with graphs with self-loops (i.e. edges whose source node is also the target node).

Groups: Replaced recursive implementation of method biconnectedComponentGrouping with an iterative algorithm to support larger graphs.

Layout

IncrementalHierarchicLayouter: The default sequencing phase has been improved to produce less crossings and run faster.

IncrementalHierarchicLayouter: Now prevents overlaps among same layer edges attached to group nodes.

IncrementalHierarchicLayouter: Selfloop routing now takes the layout flow into account. For layout orientation top-to-bottom, selfloops will by default exit on the left or right and enter on top.

IncrementalHierarchicLayouter: Added option to route selfloops like backloops (starting at the bottom of the node and ending at the top of the node) when backloop routing is enabled.

IncrementalHierarchicLayouter: During layering, edges connected to group nodes may be redirected and replaced by dummy edges connected to the children of the group node. For these dummy edges ILayoutDataProvider.getEdgeData now returns an IEdgeData of the new type EdgeDataType.REDIRECTED_GROUP_EDGE.

SmartOrganicLayouter: Now uses a more sophisticated approach to remove node overlaps if the scope is set to Scope.ALL and the quality to time ratio is greater than or equal to 0.7 (property qualityTimeRatio).

InteractiveOrganicLayouter: Method startLayout now takes advantage of multiple threads for layout calculation which may reduce the required runtime.

PartialLayouter: Now considers port constraints independent of the specified layout orientation. Note that port constraints are only considered if the core layout algorithm supports port constraints as well.

PartialLayouter.StraightLineEdgeRouter: Added support for port constraints.

polyline.EdgeRouter: Default penalty settings for minimal node to edge distance, minimal group node to edge distance, minimal first and last segment length, and bends in node to edge distance increased. As a result, these restrictions are considered more strongly.

polyline.EdgeRouter: Now avoids very small octilinear segments.

polyline.EdgeRouter: Edge grouping improved to keep edge segments grouped longer and to consider the paths of fixed edges when calculating the paths of edges having the same edge group.

polyline.EdgeRouter: When using polyline routing, short orthogonal edge segments in a monotonic path section are replaced by a single diagonal segment instead of a short diagonal segment followed by an orthogonal segment followed by a second short diagonal segment.

DirectedOrthogonalLayouter and OrthogonalGroupLayouter: Added optimization step that reduces the number of perceived bends. See new property perceivedBendsOptimization.

OrthogonalLayouter, OrthogonalGroupLayouter and DirectedOrthogonalLayouter: Added optimization step that aligns degree one nodes (i.e. nodes with one incident edge) that have the same neighbor. See new property alignDegreeOneNodes.

ComponentLayouter: Added the following new component arrangement strategies to ComponentArrangementStyles that are suitable for components with highly different sizes: MULTI_ROWS, MULTI_ROWS_COMPACT, MULTI_ROWS_HEIGHT_CONSTRAINED, MULTI_ROWS_HEIGHT_CONSTRAINED_COMPACT, MULTI_ROWS_WIDTH_CONSTRAINED, and MULTI_ROWS_WIDTH_CONSTRAINED_COMPACT

Demos

Added new showcase application demo.yfiles.graph.bpmneditor which allows you to create Business Process Diagrams and to automatically arrange them. The demo provides customized styles which represent the BPMN 2.0 symbols and a specialized BPMN layout algorithm.

The new demo demo.yfiles.layout.multipage shows how to use the MultiPageLayouter to divide a large graph into several smaller pages.

The new demo demo.yfiles.loading.webworker shows how to run a yFiles layout algorithm in a Web Worker task in order to prevent the layout calculation from blocking the UI.

Added more data binding demos to show the features of the new classes AdjacentNodesGraphSource and AdjacentEdgesGraphSource.

The new demo demo.yfiles.graph.htmlpopup shows HTML pop-up panels that display additional information about a clicked node or edge.

The new demo demo.yfiles.input.singleselection shows how to configure GraphEditorInputMode for single selection mode.

The new demo demo.yfiles.layout.preferredlabelplacement shows how the PreferredPlacementDescriptor for edge labels affects the label placement of layout algorithms.

The new demo demo.yfiles.style.datatable shows a node style and a label style that display data in a tabular fashion.

The new demo demo.yfiles.style.selectionstyling shows customized selection painting of nodes, edges and labels by decorating these items with a corresponding style.

The new demo demo.yfiles.style.styledecorators shows how to create styles for nodes, edges, and labels that wrap existing styles and add visual decorators.

Incompatible Changes

Changes in Default Behavior

polyline.EdgeRouter: Method doLayout now throws an error if there is a node with zero width or height in the given graph.

ComponentLayouter: Property preferredLayoutSize now throws an error when setting the preferred size to negative values or zero.

Changed default behavior of edge label placement in layouters with integrated edge labeling when using LabelPlacements.ANYWHERE. Now edge labels are placed on the edge and in the center between source and target node. This change affects the following layout algorithms: IncrementalHierarchicLayouter, OrthogonalLayouter, OrthogonalGroupLayouter, DirectedOrthogonalLayouter, GenericTreeLayouter, and LabelLayoutDataRefinement.

API Changes

GraphExtensions and IGraph: the following methods have been renamed:

createNodeAtLocation to createNodeWithCenter

createNodeAtLocationAndTag to createNodeWithCenterAndTag

createNodeAtLocationWithStyle to createNodeWithCenterAndStyle

GraphOverviewControl: due to the new general support for HTML5 Canvas rendering, the signatures of the method createGraphCanvasVisualCreator and the constructor CanvasOverviewGraphVisualCreator have been changed.

GraphSource: renamed the property idBinding to nodeIdBinding to be more consistent with the other property names.

GraphSource: the callback methods createNode and updateNode got a new additional parameter for the label data of the node, like the similar methods for edges always had. Since these methods are classified as protected, this change affects only derived classes but not usages of this class.

ResourceManager: renamed the constructor ForType to the canonic FromGlobalName and removed other obscure constructors.

Changed module dependencies and affiliation in the layout part:

Moved classes PartitionGrid, PartitionCellId, RowDescriptor, and ColumnDescriptor from the namespace yfiles.hierarchic.incremental to yfiles.layout. Additionally, these classes are now part of the module layout-core instead of layout-hierarchic.

Moved class FamilyTreeLayouter from the module layout-hierarchic to the new module layout-familytree.

Moved class CompactOrthogonalLayouter from the module layout-orthogonal to new module layout-orthogonal-compact.

Moved class ChannelRouter from the module layout-router to the module layout-hierarchic.

Moved classes FixedGroupLayoutStage and PartitionLayouter from the module layout-router to the module layout-polyline.

Moved rarely used inner class TreeDrawer.HierarchicTreePlacer to the top-level of the yfiles.tree namespace. Consequently, it was moved from the module layout-hierarchic to the module layout-tree.

The module layout-hierarchic does no longer depend on the modules layout-router and layout-tree.

The module layout-orthogonal does no longer depend on the module layout-router.

Adjust your require calls and/or script elements accordingly, if you're using any of these classes or if you relied on the removed dependencies, for example if you required only layout-hierarchic to get both the hierarchic and the tree layout algorithms.

IItemFactory: Added method createRedirectedGroupEdge.

LayeredNodePlacer: Removed data provider key DP_KEY_DISTANCE_TO_PARENT_MAP from public API, since it is for internal use only.

DelegatingNodePlacer: the methods getLowerRightChildren and getUpperLeftChildren have now an additional second argument, the current graph.

polyline.EdgeRouter: Method doLayout now throws an error if there is a node with zero width or height in the given graph.

polyline.EdgeRouter: Penalty settings have been changed to double precision. See class PenaltySettings.

polyline.EdgeRouter: renamed the properties polylineRoutingEnabled and reroutingEnabled to the canonical names polylineRouting and rerouting, respectively.

PathSearch: Signature of method calculateCosts has changed. It now takes an additional double array as parameter that is populated with the calculated costs instead of returning a new array.

IncrementalHierarchicLayouter: Fixed broken edge routes that may occur for edges with labels if there are "critical" edges.

SimplexNodePlacer: Fixed broken edge routes that may occur for edges with labels if option edgeStraighteningOptimization is enabled.

PCListOptimizer: Fixed possible IndexOutOfRangeException that may appear if there are port constraints which have no matching port candidate or port candidate set entry.

IncrementalHierarchicLayouter: Fixed an error (Graph is not acyclic) in SimplexNodePlacer that could appear when sequence constraints were added to a graph with swimlanes and group nodes.

BorderLine: Fixed a rare error that was caused by numerical instability.

IncrementalHierarchicLayouter: Fixed an error in ConstraintIncrementalLayerer that could appear when layer constraints were added in incremental mode.

CircularLayouter: Fixed a possible error when layout style is set to BCC_ISOLATED and consider node labels is enabled.

AbstractLabelingAlgorithm: Fixed bug that causes poor results if option removeEdgeOverlaps is enabled and the labels should be placed on the edge.

IncrementalHierarchicLayouter: Fixed minimum edge length for orthogonal edges. It is now also taken into consideration for edges that connect to a node's side and for backloop edges (see property backloopRouting).

IncrementalHierarchicLayouter: Fixed possible error if PortConstraints are used together with PortCandidateSets.

polyline.EdgeRouter: Minimum first and last segment length and minimum node to edge distance were sometimes ignored when used together with octilinear routing style.

Grouping: Fixed bug in method nearestCommonAncestor that sometimes caused wrong results if one of the specified nodes is the ancestor of the other node.

InsetsGroupBoundsCalculator: Fixed method calculateBounds to consider only the given child nodes and all edges between those child nodes instead of all nodes and all edges in the graph.

GenericTreeLayouter: Fixed error that occurred when using LayeredNodePlacer as default node placer.

LayoutTool: Fixed calculation of lower width bound in method arrangeRectangleRows. Due to the better bound, the optimization procedure now needs less steps, especially for graphs with very wide components. Note, that the results may also slightly differ, because the optimization may now stop with slightly different values.

Polyline.EdgeRouter: Fixed bug that sometimes assumed wrong label bounds for labels of table nodes. This could result in too many bends for edges that were routed around those wrong boxes. Labels of table nodes are now ignored by the router if TableLayoutConfigurator is used to prepare the graph for layout calculations.

Polyline.EdgeRouter: Fixed bug that sometimes assumed wrong label bounds if the router was used directly after another layout algorithm. This could result in too many bends for edges that were routed around those wrong boxes and/or edges crossing labels because the actual label boxes were ignored.

PolylineLayoutStage: Fixed possible error if there are fixed edges with a single, very short segment.

BusRouter: Fixed clean up of bends that resulted in unnecessary detours in edge paths.

yFiles for HTML 1.1.1.5 - Changes Since 1.1.1.4

Bugfixes

SimpleLabelStyle: Setting the backgroundBrush back to null had no effect.

Invisible CanvasObjectGroups did not work.

yFiles for HTML 1.1.1.4 - Changes Since 1.1.1.3

Improvement

LayoutGraphAdapter provides now the original Tag data for temporary graph objects.

Bugfixes

The yfiles/lang core module was not able to deal with the minified output of the obfuscator anymore (since 1.1.1.2). This resulted in nested types not being available after minification.

Undoing a reparent grouping gesture might have resulted in inconsistent group node sizes. Note: The fix results in a slightly incompatible behavior when nodes are reparented programmatically and multiple folding views are used. In that case, you need now to subscribe to hierarchy events and manually adjust the group node bounds.

The default value of AbstractTableNodeStyle#BackgroundStyle was not serializable.

Manually bracketing undo edits with BeginEdit and EndEdit might have led to exceptions when folding was active.

Automatic Layout

IncrementalHierarchicLayouter: Fixed a bug that sometimes placed elements at an infinite y-coordinate if octilinear edge routing was enabled.

yFiles for HTML 1.1.1.3 - Changes Since 1.1.1.2

Bugfixes

Added a workaround for a memory leak error in Google Chrome (some DOM nodes are never cleaned up). Since this workaround comes with a slight performance penalty, it is not enabled by default. To enable it, set the property yfiles.workaroundCR320635 to true.

Fixed an error that was thrown when uninstalling a GraphEditorInputMode after a label editing text box was shown.

TextEditorInputMode#anchor wasn't considered for placing the label editing text box.

RotatedSliderEdgeLabelModel can now deal with edge paths that are null, for example when using VoidEdgeStyle.

GraphML: Primitive types like floats and doubles could not be read when used in element syntax and the current CultureInfo was not Invariant.

yFiles for HTML 1.1.1.2 - Changes Since 1.1.1.1

Improvements

Included a workaround for an unresolved error in Internet Explorer 11 on Windows 7. Under certain circumstances, IE stops to respond to mouse events and seems to be crashed. Other versions of Windows and IE, especially IE 11 on Windows 8 and 8.1, are not affected.

Demos

Various improvements and bug fixes for Printing and the Printing Demo:

Printing is now more robust in all major browsers.

Added support for printing of template styles.

Moved printing into a stand-alone class that is easy to use in custom applications.

Organizational Chart Demo: added support for printing.

Bugfixes

For customer implementations of nested types, both isInstance and instanceof considered the custom implementation as not being of the nested type. Amongst other things, this resulted in wrong type checking errors when using such implementations.

Final obfuscation using the obfuscator broke touch input.

Fixed the arrow ArrowType.TRIANGLE which accidentally was the same as ArrowType.DEFAULT.

Demos

Custom Style Tutorial: Method MySimpleLabelStyle#getPreferredSize threw an exception when creating a new label.

Custom Style Tutorial and SimpleCustomStyle demo: Reverted field to properties to allow for GraphML serialization.

yFiles for HTML 1.1.1 - Changes Since 1.1.0.1

Enhanced Development Support

New methods yfiles.help.info and yfiles.help.api display extensive information about types, properties and other members, and API documentation when used in the browser's JavaScript console.

The debug support provided by yfiles-typeinfo.js has a new setting to switch between instant failure and logging of problems. To enable logging, set the boolean property yfiles.help.logTypeInfoErrors to true.

Improvements

Improved performance of several of the extension methods of IList.

BevelNodeStyle: Improved performance when drop shadows are used (IE only).

GraphOverviewControl: Added new factory method createGraphCanvasVisualCreator that allows for easier creation of a canvas based preview rendering.

Added callback method setEdgePortLocation to LayoutGraphAdapter that is called while assigning a new location to a port that is owned by an edge.

Arrow: Setting the various properties now only recreates the arrow template if something actually changed.

Method SvgExport.setup: The returned IRenderContext new has the correct clip applied.

Typeface: Added default value annotations to most properties for more compact GraphML serialization.

Automatic Layout

RecursiveGroupLayouter: Improved performance for graphs with a mainly flat structure.

GraphConnectivity: Improved method makeBiconnected to work with graphs with self-loops (self-loops are edges whose source and target are the same).

Groups: Replaced recursive implementation of method biconnectedComponentGrouping with an iterative algorithm to support larger graphs.

Trees: Added method isForestWithDirection.

Demos

Added new demo demo.yfiles.graph.bridges, which shows how to set up and configure automatic edge bridges.

Added new demo demo.yfiles.graph.clipboard, that shows how to customize clipboard operations.

Revised and improved Custom Styles tutorial best practices.

Incompatible API Changes

Automatic Layout

Class yfiles.algorithms.AlgorithmAbortedException has been removed. This exception was never thrown by library code and was not intended to be used by client code.

Bugfixes

In some browsers, event coordinates were not passed correctly when the page was scrolled or when the canvas had a CSS border.

PatternBrush couldn't be used in documents with more than one graph control.

Pen: The dash style wasn't visualized correctly, and the properties dashCap, lineJoin, and miterLimit had no effect. Consequently, visualizations of lines that use one of these properties might look different.

SimpleLabelStyle's verticalTextAlignment did not work correctly in all cases.

SimpleLabelStyle's clipText feature sometimes resulted in wrong clips being applied when the style was shared between labels.

GraphML: Freezable objects like Pen actually got their isFrozen property serialized, which can result in run-time exceptions during parse time for frozen elements. The property is not written anymore and is ignored in old GraphML files for the built-in types.

Edge to edge connections where not parsed correctly when deserialized from GraphML.

yfiles.lang.Object.$class's isAssignableFrom and isSubclassOf did not work correctly for trait/interface types.

The type-checking debug helper did not accept functions as values for the various Binding properties at GraphSource and TreeSource and threw an error which made parts of the InteractiveGraphSourceDemo crash when debugging was enabled.

Setting the DefsManager's cleanupInterval property had no effect once the manager was in use.

The optional PortDefaultsPortCandidateProvider class did not work correctly and resulted in exceptions being thrown when reconnecting edges.

New class yfiles.canvas.SvgExport adds support for exporting the CanvasControl's content to SVG.

A great number of additional status-indicating events has been added to the various default input modes in order to provide fine-grained callbacks to customization code.

New pluggable development support to provide runtime type information and convenient debugging support in the browser.

Major improvements to the overall rendering performance. Up to 200% gain when interacting with diagrams in Internet Explorer.Also, significant improvements of execution speeds of the automatic layout algorithms.

yfiles.router.polyline.PolylineLayoutStage: A layout stage that adds polyline segments to the orthogonal edge paths of a graph.

yfiles.hierarchic.IncrementalHierarchicLayouter: Added support for octilinear edge routing, i.e., a routing style where the slope of each edge segment is a multiple of 45 degrees. Different edge routing styles can be specified using class yfiles.hierarchic.incremental.RoutingStyle.

Minor Features Added

yfiles.graph.DefaultEdgeIntersectionCalculator now supports cropping edges directly at the port instead of at the node's geometry. This can be used to easily have edges end at the port instead of at the geometry of the node. See the new properties cropAtPort, extraCropLength, and callback method getPortGeometry.

Automatic Layout

yfiles.tree.BalloonLayouter: New option to take into account the bounds of node labels when calculating a layout.

yfiles.layout.LabelLayoutTranslator added option autoFlipping to specify whether or not edge labels should be automatically flipped if they would be upside-down.

yfiles.labeling.AbstractLabelingAlgorithm added option autoFlipping to specify whether or not edge labels associated with a "free" label model should be automatically flipped if they would be upside-down.

Changes in Default Behavior

yfiles.drawing.ImageNodeStyle now stretches images to fit the node's bounding box. To restore the old behavior, subclass yfiles.drawing.ImageNodeStyleRenderer and override method getPreserveAspectRatio with an implementation that returns true.

Since with this release yfiles.graph.LayoutGraphAdapter translates yfiles.model.IMapper instances in the graph's mapper registry as yfiles.algorithms.IDataMap implementations that enable data write-back scenarios, the code that deals with IncrementalHierarchicLayouter.LAYER_VALUE_HOLDER_DP_KEY now behaves differently. In older releases the yfiles.algorithms.IIntValueHolder interface was queried from the mapper to write back the layer data. Now the data is written directly into the mapper and the IIntValueHolder implementation is ignored. See demo.yfiles.layout.IncrementalHierarchicLayouter for an example on how to use the respective key.

Automatic Layout

Incompatible API Changes

The interfaces IComparable and IObjectComparable have been moved from namespace yfiles.system to yfiles.lang.

Method doStartMoveTouch in yfiles.input.MoveInputMode has been renamed to doStartDrag. The old method is available through the compatibility layer.

Methods GraphMLIOHandler.readFromURI and GraphMLParser.parseFromURI have been renamed to readFromURL and parseFromURL, respectively. The old methods are available through the compatibility layer.

The deprecated extension methods in yfiles.model.MapperExtensions have been removed.

The deprecated convenience methods LookupExtensions#get and LookupExtensions#getWithContext have been moved to the compatibility layer.

Methods getTargetPortCandidateProvider and getSourcePortCandidateProvider in yfiles.input.GraphEditorInputMode changed their signatures to accept yfiles.graph.IPortOwner instances instead of yfiles.graph.INode instances. This is in conjunction with support for edge-to-edge connections. Overriding methods need to be adjusted accordingly.

Method showHitNodeCandidatesOnly in class yfiles.input.PortRelocationHandle has been renamed to showHitPortOwnerCandidatesOnly to support edge-to-edge connections. Also the behavior of this class has been changed to allow edge-to-edge connections if this feature has been enabled by providing port candidates at the edges. Should you wish to disallow edge-to-edge connection even though you are providing edge port candidates, the new edgeToEdgeConnectionsAllowed property can be set to false.

Previously it was possible to cast DefaultEdgeIntersectionCalculator.INSTANCE to the containing type. The singleton is not of the given type anymore. If you require an instance of that type, consider instantiating one instead.

yFiles for HTML 1.0.1 - Changes Since 1.0

Minor Improvements

The 'Getting Started' steps in the Developer's Guide have been revised and improved.

The Developers' Guide's code snippets and IDE configuration examples have been updated and improved. A guide on how to configure WebStorm has been added.

Two convenience constructors have been added to GraphOverviewControl that have the same signature as the ones used in the GraphControl: GraphOverviewControl.ForDiv(HTMLDivElement) and GraphOverviewControl.ForId(String).

The Getting Started Tutorial Step 1 has been simplified to not make use of the demo framework.

A convenience constructor has been added to ImageNodeStyle. ImageNodeStyle.WithPath(String) takes the image source string as an argument for the creation of the style.

IEnumerable got new extension methods forEach and forEachWithIndex that make it easy to iterate over all enumerable implementations in the library.

Enumerations where not properly documented in the IDE-support yfiles-api.js file.

The GWT demo has been improved and revised to show client-server interaction with GWT.

The Dojo demo has been improved to show how to use the Dojo context menu implementation with yFiles.

The clean-up timer handling of type CanvasControl and its subclasses has been improved to use less CPU and to prevent memory-leaks.

A workaround for an Safari Javascript bug (on iOS and MacOS) has been added that should prevent Safari from corrupting the state of the Javascript objects during iteration.

The HTML Api Documentation did not always include inherited members.

The HTML Api Documentation missed the module name prefix 'yfiles/'.

Bugfixes

CircularLayouter yielded bad results due to a bug in Groups.biconnectedComponentGrouping.

Tooltips sometimes caused additional scrollbars to appear in the browser and were not cleaned up correctly after uninstallation.

ImageNodeStyle's outlineShape property was non-functional. Documentation has been updated and the feature can now be used as documented.

The .css file for the library has been moved to the lib/yfiles.css file. The demo-framework css file has been renamed to demo-framework.css to be less ambiguous.

The gesture for moving the viewport with the mouse (holding ctrl-key while dragging the mouse) did not work in the default configuration of GraphEditorInputMode.

The serialization of ImageNodeStyle to GraphML was broken and could not be parsed in again.

The serialization of primitive types (Strings, Numbers, Arrays) in GraphML was broken and incompatible with the yFiles editions for .net, WPF, and Silverlight

The 'File Operations Demo' ceased to work after obfuscation with the standard settings. An exclusion has been added to the obfuscator configuration.

The 'File Operations Demo' displayed an error dialog when loaded in chrome under same origin restrictions, such as from the file system. This has been improved to show only a warning.

The Image Export Demo now loads the third party demo code from a cache at our website, avoiding a problem with git-hub's mime-type handling in Internet Explorer and the risk of external changes breaking the demos.

The Image Export Demo had a workaround for an issue in Chrome that has been fixed in the meantime. The fix broke the workaround, though. The code for the workaround has been improved to work in both cases, now.

Expanding and collapsing a folder node programmatically does not require the yfiles/graph-input module anymore.

The illegal argument exceptions now correctly carry the parameter of the illegal parameter that caused the exception.

Several race-conditions during the AMD loading in some of the demos have been removed.

Some constructors in the sample files called their base constructors twice.

ShadowNodeStyleDecorator was not displaying a shadow. This has been fixed to use SVG filter effects. We recommend using the built-in drop shadow visualizations, however, since at least for larger visualizations the filter effects do not work very well.

BendAnchoredPortLocationModel could throw an IndexOutOfRangeException under certain circumstances.

Setting GraphOverviewControl.graphPaintable had no effect.

CanvasOverviewGraphVisualCreator did not reset the stroke for drawing edges and therefore always used the last stroke that was set used on the canvas.

Group node visualizations were not always removed correctly when the group node was deleted.

Some of the special label model implementations where missing reflection meta-data and could not be serialized to GraphML.

RotatedSliderEdgeLabelModel crashed with an undefined method error.

DefaultSelectionModel was not always cleaned up correctly when the domain was changed.

SliderEdgeLabelModel threw an exception for paths with zero length segments.

FilteredGraphWrapper: The adjacency state of the filtered instance was wrong under certain conditions.

FreeEdgeLabelModel: Fixed bad positions returned by parameter finder.

Accidental debug console output during dragging of labels was removed.

Incompatible Changes

Obsolete duplicate class MemoryImageNodeStyle has been removed from the package. Use ImageNodeStyle instead.

The type of ImageNodeStyle's outlineShape property (and also TemplateNodeStyle, TemplateLabelStyle, and TemplatePortStyle) has been changed to accept GeneralPath instances. The previous implementation was unusable and had no effect.