yFiles for HTMLChangelog
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.StripeCreatedalways 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.
-
TableLayoutConfiguratorerroneously considered left side labels as top labels, and consequently might have created insets of incorrect size.
Layout
-
IncrementalHierarchicLayouter: Fixed bug that caused node-edge overlaps in conjunction with some complex edge grouping specifications. -
IncrementalHierarchicLayouter: Fixed bug that led to too large group nodes in graphs with grouped edges. -
SmartOrganicLayouter,OrganicLayouterandInteractiveOrganicLayouter: Fixed error that was triggered due to NaN values that could occur in case the input graph had a very large number of nodes. -
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-registeredDataProviderwith keyEdgeRouter.EDGE_LAYOUT_DESCRIPTOR_DP_KEY. -
EdgeRouter: Fixed rare node overlaps in conjunction with monotonic path restrictions. -
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 classIncrementalHierarchicLayouter. -
IsolatedGroupComponentLayouter: Fixed bug that caused edge labels that intersected with group nodes even though optionComponentLayouter.considerLabelswas 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.
- Sankey Diagrams
- Sankey diagrams visualize flow quantity between entities, for example cost or energy flow.
- Edge Bundling Routing Style
-
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_PORTandLabelLayoutConstants.PLACE_AT_TARGET_PORTfor 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
reduceAmbiguityofSALabelingandGreedyMISLabelingis enabled, these algorithms try to avoid placing labels at positions where it is not clear to which graph element a label belongs.TreeReductionStagenow 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.generateUniqueDefsIdcan now be changed. -
IncrementalHierarchicLayouter: Improved support forPortCandidates 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. -
IncrementalHierarchicLayouternow 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, seeSequenceConstraintFactory. -
The following tree layouts now support custom selection of the root node of the tree:
BalloonLayouter,GenericTreeLayouter,TreeLayouter,ARTreeLayouter, andHVTreeLayouter -
BalloonLayouter: Interleaved child placement now works in conjunction with 'from sketch' mode and custom child order comparators. This means that the settingsBalloonLayouter.fromSketchModeandBalloonLayouter.comparatorare no longer ignored when enabling the interleaved placement mode. -
TreeLayouterandGenericTreeLayouternow take into consideration the minimum group node size specified by the user with aDataProviderregistered with the graph with keyGroupingKeys.MINIMUM_NODE_SIZE_DP_KEY. -
GenericTreeLayouter: ImprovedDefaultPortAssignmentto considerPortConstraints 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
SALabelingandGreedyMISLabeling, especially for large graphs. -
Improved support for
PreferredPlacementDescriptorside preference (left, on-edge, right) when using generic labeling algorithmsSALabelingandGreedyMISLabeling. Now, the side preference is considered for edge labels with arbitraryEdgeLabelModelimplementations. -
Improved the performance of
EdgeRouterwhen routing edges that havePortConstraints orPortCandidates. -
EdgeRouterwill 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 aPortConstraintorPortCandidate), 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. -
SeriesParallelLayouternow takes into consideration minimum node sizes specified by the user. -
MultiPageLayouter: Added new optionMultiPageLayouter.strictClusterSeparationthat allows to specify whether or not nodes with different cluster IDs may be placed onto the same page. -
DirectedOrthogonalLayouter: Now always produces planar drawings for trees. -
Improved the performance of
OrthogonalSegmentDistributionStageand thus alsoChannelEdgeRouterwhich 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
CurveFittingLayoutStagewhich 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
HandleNaNCoordinatesStagewhich prevents layout algorithms that take initial coordinates for nodes and edges into account from failing if some of those graph elements haveNaN-coordinates. -
Improved the performance of
PartialLayouterfor input graphs that feature a high number of large subgraph components. Does not apply to component assignment strategyPartialLayouter.COMPONENT_ASSIGNMENT_STRATEGY_SINGLE. -
Several smaller performance improvements for
IncrementalHierarchicLayouter,SmartOrganicLayouter,OrthogonalLayouter,CircularLayouter,RadialLayouter,SeriesParallelLayouter, andChannelRouter.
Bugfixes
-
SimpleLabelStyle: Changing theautoFliportrimmingproperties had no visible effect until a visual was created anew with thecreateVisualmethod. -
The property
SizeChangedEventArgs.oldSizecontained 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.workaroundCR701075that 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-circularhas been merged with the moduleyfiles/layout-organic. If you have references toyfiles/layout-circularreplace them withyfiles/layout-organic. -
The module
yfiles/layout-planarhas been merged with the moduleyfiles/layout-orthogonalsince it contained no public API and is only used from the latter module. If you have references toyfiles/layout-planarreplace them withyfiles/layout-orthogonal.
Behavior Changes
-
The following layout algorithms have more sensible default values.
-
CanonicMultiStageLayouterandMultiPageLayouter: The defaultlabelLayouteris now set to an instance ofSALabeling. -
OrthogonalEdgeRouter.crossingCost: The default value is now1.5instead of0.0. -
CompactOrthogonalLayouter: TheCompactOrthogonalLayouter.OrthogonalShortestPathPathFinderwhich is used as default path finder strategy now uses value1.5as default for propertycrossingCostinstead of0. -
PartialLayouter.minimalNodeDistance: The default value is now10.0instead of0.0. -
MultiParentDescriptor.minimumNodeDistance: The default value is now15.0instead of10.0. -
BalloonLayouter.minimalNodeDistance: The default value is now10.0instead of0.0. -
SALabeling.deterministicMode: The default value is nowtrueinstead offalse. -
SplitEdgeLayoutStage.proxyNodeSize: The default value is now1.0instead of0.0.
-
-
Most of the property setters of the types of the layout part now throw an error if an invalid, illegal, or
nullargument is given as input. -
IncrementalHierarchicLayoutermay 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.integratedEdgeLabelingdoes now always returnfalseif 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.considerNodeLabelsDirectedOrthogonalLayouter.integratedEdgeLabelingDirectedOrthogonalLayouter.considerNodeLabelsOrthogonalLayouter.integratedEdgeLabelingOrthogonalLayouter.considerNodeLabelsOrthogonalGroupLayouter.integratedEdgeLabelingOrthogonalGroupLayouter.considerNodeLabels
-
IncrementalHierarchicLayouter: Geometry information specified forIncrementalHierarchicLayouter.ALTERNATIVE_GROUP_BOUNDS_DP_KEYandIncrementalHierarchicLayouter.ALTERNATIVE_EDGE_PATH_DP_KEYis 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 infeasiblePortConstraints andPortCandidates/PortCandidateSets (i.e., for edges that have non-matching port constraints/candidates), the layout algorithm now always prefersPortConstraints. In previous versions, the behavior was not well-defined for such cases. -
PortCandidateAssignmentStage: Now, if an edge has registeredPortCandidates and connects to nodes withPortCandidateSets, the stage will try to match both collections to find an appropriate port. In case there is no matching port candidate, aPortCandidatespecified for the edge is preferred. Before, one of thePortCandidates was selected without trying to match with node port candidates. -
SmartOrganicLayouterdoes 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 forOrganicLayouterwith group policy settingOrganicLayouter.IGNORE_GROUPS_POLICY, where previously empty groups were resized too. -
Method
CompositeLayoutStage.canLayoutnow checks if all theLayoutStages of the pipeline can layout the given graph and does not return alwaystrue. -
Method
SingleCycleLayouter.canLayoutCorenow returnsfalseifnullis given as input. -
Method
Centrality.closenessCentralitynow sets the closeness of a node toInfinityif the sum of the shortest path distances is0. Before, it was set toNaNin such cases. -
Method
SingleCycleLayouter.nodeSequencernow allows to specifynullto return to the default sequencer. In previous versions, specifyingnullled to an error. -
Method
GraphTransformer.operationnow only sets the operation value and does not disable the automatic selection of best fitting rotation angle if an operation other thanROTATEis selected. -
Method
OrthogonalLayouter.integratedEdgeLabelingnow throws an error if the current label layouter is not of typeLabelLayoutTranslator. -
Constructor
TreeComponentLayouterthrows an error ifnullis given as argument. -
Centrality: The following methods can now take emptyNodeMaps andEdgeMaps as arguments for returning the resulting centrality values.Centrality.edgeBetweennessCentrality.nodeBetweennessCentrality.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
GraphEditorInputModeandGraphViewerInputModewere not garbage collected due to a non-removed event listener in theclickInputMode. -
Hiding
INodeSnapResultProviderorIBendSnapResultProviderfrom 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
TableLayoutConfiguratorwhich altered the size of a column or row if an edge routing algorithm was applied. -
MultiPageLayouter: Fixed rare bug that caused straight-line edge routes instead of orthogonal routes. -
SmartOrganicLayouterandOrganicLayouter: Fixed bug that caused the algorithm to not consider the specified customGroupBoundsCalculator.
yFiles for HTML 1.3.0.6 - Changes Since 1.3.0.5
Demo Improvements
-
Made
demo-framework/require.jsable to deal withpathssyntax. -
Removed unused
LabelInsetsProviderimplementation indemo.yfiles.layout.layoutstyles.
Bugfixes
-
Added the flag
yfiles.workaroundIE7766782that 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.getMultiProjectionandEnumerableExtensions.selectManyimplementations non-recursive to avoid stack overflows. -
Made
SvgExporthelper class more resilient against zero sized exports. -
The
CreateEdgeInputMode.EdgeCreatedevent 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
nullexceptions when interacting with aGraphOverviewControlbefore assigning aGraphControlto theOverviewInputMode. -
OverviewInputModecould 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
Arrowelements in GraphML were sometimes read back incorrectly. The new deserialization propertySerializationProperties.ParseArrowElementAsDefaultArrowcan be used to work around this issue. - GenericPortLocationModel wasn't serialized correctly.
-
Table.setStyle(ILabel, ILabelStyle)andTable.setLabelModelParameterignored the provided style resp. label model parameter. -
PathBasedEdgeStyleRenderercould leave visual artifacts when switching to an arrow that returned a null visual. -
KeyboardInputMode now passes the original
CompoundKeyEventArgsto registered event handlers instead ofEmptyArgs. - Touch move events have an effect only if the corresponding touch down event also happened within the GraphControl.
-
The
IsDownproperty of aTouch2DDevicewas alwaysfalseafter the first touch up event of that device, e.g. after the first tap of a double tap.
Layout
-
IncrementalHierarchicLayouter: fixed rare error triggered inAsIsSequencerfor 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. -
IncrementalHierarchicLayouter: fixed possible infinite loop if there are critical edges (seeCRITICAL_EDGE_DP_KEY). -
SimplexNodePlacer: Fixed bug that caused overlaps between edges and nodes when node compaction is enabled and edges have either strongPortConstraints or fixedPortCandidates. -
SmartOrganicLayouterandOrganicLayouter: 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 exampleAssistantPlacer. -
GenericTreeLayouter: fixed bug that caused less compact layout results when having node halos (seeNodeHalo). -
PartialLayouter: fixed error that appeared if noDataProviderwith keyPARTIAL_NODES_DP_KEYis 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-registeredDataProviderwith keyEdgeRouter.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.
Documentation Viewer Improvements
- Improved page loading performance for large API pages.
- The integrated code editor now shows correct argument names in delegate and callback function signatures.
- Parameters of delegate functions (e.g. event handlers) are now part of the "Show Usages" results.
yFiles for HTML 1.3.0.5 - Changes Since 1.3.0.4
Demo Improvements
- Added a flag to
demo.yfiles.layout.multipagethat prevents re-entrant layout calls. - Feature
DefaultDummyNodeConverter.initialSizein Getting Started tutorial steps 11, 12 and 13. - Added custom layout stage to the tree layouter of
demo.yfiles.layout.layoutstyleswhich handles edges to group nodes. Fixed vertical preferred edge label placement setting of the label layout. - 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 useImageNodeStyle. - In some rare cases, the graph creation code in
demo.yfiles.graph.orgchartwas called before the application was initialized. Made sure that the application has been initialized before creating the graph. - The graph in
demo.yfiles.graphml.graphmlis 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.determineMeasureModefor the first label measure call. - Fixed 'not a finite floating-point value' exception which occurred when the size of the
GraphControlis zero during an animation. - Added the flag
yfiles.workaroundIE2337112that 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
ArrowTypefromArrowType.NONEtoArrowType.DEFAULT. - GraphML serialization: Whitespace in XML attributes was not escaped correctly.
- Specifying a
DesignerSerializationVisibilityfor collection properties did not work. TypeConverterwas erroneously part of the yFiles for HTML Layout package and has been removed from it.
Layout
IncrementalHierarchicLayouter: fixed error that could happen inAsIsSequencerwhen incremental group hints are defined (seeIncrementalHintsFactory.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), seeSimplexNodePlacer.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 methodsGraphPartitionManager.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 modelSmartEdgeLabelModel.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 (seeCRITICAL_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 specifiedPortCandidatehas 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.Polyline.EdgeRouter: fixed bug that caused incorrect routes for grouped edges with intersecting source and target.FamilyTreeLayouter: Fixed handling of grouping data providers so they are not changed by the layout algorithm.IncrementalHierarchicalLayouter: Fixed grid references to place the nodes on grid correctly for each layout orientation.FamilyTreeLayouter: Fixed possible error that may appear if the input graph contains group nodes.
Documentation Viewer Improvements
- Improved page loading performance for large API types.
- Added an integrated code editor with smart code completion support for yFiles API members.
- Integrated search for related knowledge base articles.
- Added a version that can be viewed offline (
index-offline.html- runnpm installfirst).
yFiles for HTML 1.3.0.4 - Changes Since 1.3.0.3
New and Improved Demos
- The demo
demo.yfiles.graph.largegraphsillustrates different approaches and their performance for rendering large graphs. - The demo
demo.yfiles.graphml.graphmlprovides a live view of the graph's GraphML representation to provide an insight into GraphML serialization. - The demo
demo.yfiles.graph.neighborhoodshows how to implement a neighborhood view of the selected graph item. - The demo
demo.yfiles.toolkit.reactshows how to integrate the yFiles graph control into a React project. - The
demo.yfiles.graph.svgexportanddemo.yfiles.graph.pdfexportdemos show how to export the diagram to SVG or PDF, respectively. - The demo
demo.yfiles.graph.tableeditorshows a new, optimized table style. - The
demo.yfiles.graph.imageexportdemo 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,ConstraintLayererandTopologicalIncrementalLayerer. For large graphs these classes may require a long runtime that cannot be canceled by using anAbortHandler.
Bugfixes
Viewer
TemplateNodeStyleandStringTemplateNodeStyleno longer throw an exception on template re-evaluation if a bound value isnull.- 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_COMMANDnow always processes the nodes from innermost to outermost groups. GraphClipboard: Corrected the selection after a paste command for clipboards which are shared amongGraphControls.- Fixed an error when resizing nodes in a filtered graph that contains tables.
- Fixed an issue with
NodeDropInputModeand filtered graphs. - Changed the default value of
GridVisualCreator.abberationToleranceto 50 to switch off grid hiding by default. - Fixed the visualization of grids of the style
GridStyle.Crosses. - The property
CanvasControl.fitContentViewMarginsis 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_ERRORSis set. - Fixed an error while loading GraphML files that were created with yFiles WPF and contained labels.
Layout
IncrementalHierarchicLayouter: Fixed an error that causedPortCandidates to potentially be ignored or not handled correctly for self-loops when having directions other thanPortCandidate.NORTH,PortCandidate.SOUTH,PortCandidate.WESTorPortCandidate.EAST.IncrementalHierarchicLayouter: Fixed an error that caused that the layer of an incremental group (seeIncrementalHintsFactory.createIncrementalGroupHint) depends on the group's location if recursive layering is enabled (seeIncrementalHierarchicLayouter.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 (seeRerouting) 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 (seeEdgeRouter.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 defaultEdgeLayoutDescriptorinstead of aDataProviderwith individual descriptors.Polyline.EdgeRouter: Fixed side handling of external strong ports.Polyline.EdgeRouter: Fixed rare bug that may cause a stack overflow.GreedyMISLabelingandSALabeling: 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 toChannelEdgeRouter.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 optionDirectedOrthogonalLayouter.alignDegreeOneNodesis enabled.SimplexNodePlacer: Fixed an error that disabled label compaction feature.BalloonLayouter: Fixed an error that causedBalloonLayouter.CHILD_ORDERING_POLICY_SYMMETRICnot to work as desired.AssistantPlacer: Fixed placement of assistant nodes. When all children of a node are assistants, they are all placed left/right.TreeLayouter: Fixed a stack overflow error that could occur for trees with high depth.GenericTreeLayouter: Fixed root alignments to only take the child node bounds into account without considering edge segments in the subtree.DelegatingNodePlacer: ConstantsDelegatingNodePlacer.VERTICALandDelegatingNodePlacer.HORIZONTALalong with methodsDelegatingNodePlacer.Orientationare deprecated since they had no effect.Trees: fixed methodCenterRootthat didn't always return the correct center node of a tree.OrganicLayouter: Fixed an error that caused tree-beautifier feature (seeOrganicLayouter.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 (seeGroupingKeys) 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.pasteexits.
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
- Fixed cleanup of template style bindings, preventing memory leaks caused by accumulating bindings.
- Added an activatable workaround (
yfiles.workaroundEDGE2057021) for theStringTemplateNodeStyle. 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. Theyfiles.workaroundCR570845property can be set to a delay in milliseconds that should be tolerated before running the queued functions usingwindow.requestAnimationFrame(). The default value ofyfiles.workaroundCR570845is-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
GraphControland back in. - Added
charCodeproperty toyfiles.input.KeyEventArgs, which gets the charCode of the original event. Also fixedkeyValueproperty inyfiles.input.CompoundKeyEventArgs, which previously returned an empty string. - Fixed
Control.onKeyPress, that almost never was called. This also had the effect that theCanvasControl.CompoundKeyTypedevent 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.importNodesupport (e.g. IE9) where attributes of inlined images were wrong after exporting the graph withSvgExport
Demos
- Improved custom node and edge style color choices for the custom style tutorial.
- Orgchart-Demo: Fixed exception in IE9.
yFiles for HTML 1.3.0.2 - Changes Since 1.3.0.1
Bugfixes and Demo Improvements
Viewer
- Fixed null exceptions after
GraphControl.CleanUp. - Fixed a bug in
TreeSourceandAdjacentNodesGraphSourcewhere nodes could get removed duringupdateGraph. - Fixed a bug where double clicks weren't delivered correctly when mouse move events were fired between mouse down and release.
CanvasControl.Mouse2DDraggedevents are not delivered anymore if the event coordinates are equal to the last mouse event.- Implemented non-functioning class
yfiles.drawing.PointSelectionInstaller, which adds a default port selection visualization. - Improved Scrollbar behavior when
ScrollBar.valueis changed from the outside while dragging the slider, e.g. when changing the GraphControl'scontentRect. 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.interactiveorganicwhere the graph suddenly froze when dragging a node shortly after application start. - New nodes in
demo.yfiles.binding.interactivegraphsourceet 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.orgchartwhere 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
fixMethodsis now available in both namespaces,yfiles.utilandyfiles.lang.util.
Demo Framework
- Fixed possible overlapping and unintentional resize of the side panels.
New Demos
- New
demo.yfiles.graph.networkmonitoringshows 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
stringornumberwere written to the wrong XAML namespace, thus breaking interoperability with other yFiles platforms. - CSS classes set on the div element before calling
CanvasControl.ForDivorCanvasControl.ForIdare not overwritten anymore. Instead the classyfiles-canvascontrolis appended to the existing classes. - Added a dedicated class for the main
CanvasControlSVG to prevent implicit CSS styling of all SVGs inside the canvas (e.g. in graph item styles). OverviewInputModenow uses the value 0.00000001 as minimum zoom, instead ofNumber.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
TextRenderSupportwhereTextMeasureMode.SVGwas used instead ofTextMeasureMode.CANVAS. - Text height measurement with
TextMeasureMode.SVGreturned 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.
- OrgChart Demo: Updated design and improved the viewport limiter settings.
- MindMap Demo: Improved the viewport limiter settings.
- Interactive data binding demos: Catch and display errors thrown by faulty binding functions.
- LayoutStyles Demo: Replaced
OrthogonalEdgeRouterwith the newerEdgeRouteras router for non-tree edges for theBalloonLayouter. - Tutorial 01, Step 16 (Grid Snapping): 'Show Grid' button now only toggles grid visualization.
- 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.dragSizeandGraphControl.hitTestRadiusto 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
-
GraphControlintegrates 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 awheel/mousewheelevent 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.saveFileor 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.
GraphClipboardnow 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
GraphClipboardnow supports an optional target location for pasting and the new methodGraphEditorInputMode.pasteAtLocationcan be used to this end, too. In addition,ApplicationCommands.PASTEnow supports an optional parameter of typeIPointto 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
LabelSnapContextand is available for labels with one of these label models:SmartEdgeLabelModel,FreeEdgeLabelModel,FreeNodeLabelModel, andFreeLabelModel. -
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. GraphEditorInputModeandTableEditorInputModeprovide new eventsLabelTextEditingStartedandLabelTextEditingCanceledthat 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. IEditLabelHelperimplementations provided by theILabel's lookup can now be used to forbid or customize the editing of individual labels. ClassLabelDecoratorprovides a new propertyeditLabelHelperDecoratorto customize this feature.GraphEditorInputMode.editLabelandTableEditorInputMode.editLabelcan now be used withSimpleLabelinstances. This provides editing capabilities for dummy elements such as legends, page headers or other textual elements.
- Uses the various callback methods on
GraphEditorInputMode,TableEditorInputModeandIEditLabelHelperimplementations 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.
- 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
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
SeriesParallelLayouterfor 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
GraphEditorInputModegot 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 thecyclicSelectionRecognizerproperty toEventRecognizers.NEVER.-
GraphEditorInputModenow 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 methodGraphClipboard.duplicatecan be used to duplicate selected items without altering the clipboard contents. GraphEditorInputModenow provides a default action for reversing edges. To this end, the methodsreverseEdgeandreverseEdgeshave been added toGraphEditorInputMode. Also, the new commandGraphCommands.REVERSE_EDGES_COMMAND(shortcut: Ctrl-R) has been added.- Node ports can now be moved by dragging their
IHandle. GraphClipboardhas new propertiescopyItems,independentItems, anddependentItemsthat 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 propertyclickHitTestOrder.GraphEditorInputModeandGraphViewerInputModeprovide an explicit hit test order for double clicks that can be changed through thedoubleClickHitTestOrderproperty. By default, this hit test order prefers labels over other graph elements.- Added new methods
ClickInputMode.preventNextDoubleClickandTapInputMode.preventNextDoubleTapthat can be used in event handlers for single clicks/taps to prevent that this click can become part of a double click event. NodeDropInputModecan 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.reparentToLeavesAllowedis enabled. In this case, leaves are converted into group nodes. ItemDropInputModedoes 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.orthogonalBendRemovalenables/disables this feature. GraphViewerInputModenow supports multi-selection with Ctrl+Click and marquee selection. The latter is disabled by default.OverviewInputModeand theGraphOverviewControlhave been optimized to improve the user experience when used on touch devices.-
SvgExportcan 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
GraphModelManagerto allow for easier customizations. PropertyuseHierarchicNestingwas 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. FoldingManagernow offers two convenience methods,updateViewStatesForNodeandupdateViewStatesForEdge, that will trigger update calls onIDummyNodeConverterandIDummyEdgeConverterfor 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 methodhasCheckFailedthat allows to query whether a check method was called after a stop or cancel event.- Added the interface
ILabelLayoutFactorythat provides methods for creating, adding and removing node/edge labels to aLayoutGraph. IncrementalHierarchicLayouter: Added support for incremental group nodes (seeIIncrementalHintsFactory.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 propertynodeCompactionthat allows to place adjacent nodes of a layer in a more compact, stacked style.- Added vertical alignment option for
DefaultNodePlacerandSimpleNodePlacer. 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 inDefaultNodePlacer,DendrogramPlacer,SimpleNodePlacer,LayeredNodePlacerandDoubleLinePlacer. 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 inDefaultPortAssignment. Grouped edges will share the same port location at local root.- Added the class
GroupedNodePlacerthat allowsGenericTreeLayouterto place siblings into different groups. RecursiveGroupLayouter: Added the propertyInterEdgeRouterto 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
KeepStrongPortConstraintsStagewhich ensures that layout algorithms that cannot handle port constraints keep the ports of edges with strong port constraints. - Added the layout stage
PortCandidateAssignmentStagewhich assigns edges to the ports specified byPortConstraints orPortCandidates 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.swallowCloseClickspecifies 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 filelib/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,
ShapeNodeStyleand styles that use aGeneralPath. GraphEditorInputMode.detailSelectionRecognizeris now also applied for double clicks to determine the clicked item.GraphEditorInputModeandGraphViewerInputModedon't select or focus graph items styled with a void style (VoidNodeStyle,VoidEdgeStyle,VoidLabelStyle, andVoidPortStyle). The new propertyvoidStylesIgnoredspecifies whether this feature is enabled.GraphEditorInputModeandGraphViewerInputMode: the new protected methodshouldSelectcan be overridden to determine whether an item can be selected in general.OverviewInputMode: The new propertymarginsspecifies margins for the visible area of the boundGraphOverviewControl. The new protected methodupdateVisibleAreaprovides further means for customizing the visible area.CompositePositionHandler: Added methodsgetPositionHandlerandgetHandleto retrieve an earlier addedIPositionHandlerorIHandle.PortRelocationHandles now triggers theEdgePortsChangedevent of theGraphEditorInputMode.TableLayoutConfigurator: Improved support for routing algorithms.IGraph: The collection models of graph items returned by the propertiesnodes,edges, etc. now support the methodsremoveandclearto remove graph items from the graph. Note that calling the methodaddis still not allowed.GraphModelManager: New callback methodonGraphChanged.LayoutExecutor: The new propertyconsiderViewportLimitercan be enabled to let the target viewport after a layout respect theViewportLimiterof theGraphControl.
TheViewportAnimationhas a new propertyconsiderViewportLimiterfor the same purpose.LayoutGraphAdapternow adds data providers that map each node, edge and label of aLayoutGraphto their correspondingIModelItemin the originalIGraph. Especially, these data providers are available if a layout is run with aLayoutExecutoror the convenience methodsLayoutExtensions.morphLayoutandLayoutExtensions.applyLayout.GeomSupport: The new methodcreateSmoothedPathcreates a new path as copy of a given one but with smoothed bends.SimpleAbstractEdgeStyle: The new methodupdateArrowscan by called fromupdateVisualto 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
tagis exchanged. Note that this check considers 'reference equality' not 'value equality'. CollapsibleNodeStyleDecoratorRenderer: The methodaddToggleGroupStateCommandis 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 overridingIconLabelStyleRenderer.shouldHitTestIcon.CanvasControl: MethodfitContentnow respects theViewportLimiter. This might result in zoom levels greater than1.0.CanvasControl: The new size change detection techniqueSizeChangedDetectionMode.SENSORsupersedes the previous timer-based technique as default since it provides instant notification about size changes. The propertysizeChangedDetectioncan be used to specify the desired technique explicitly.DefaultDummyEdgeConverternow synchronizes thetagproperty of the first label if label synchronization is enabled.GraphCopierhas been improved to facilitate manipulation of the copied items:- The new events
NodeCopied,EdgeCopied,LabelCopied, andPortCopiedare dispatched after a model item has been copied. - The method
getOrCreateCopyis now public to facilitate copying of, for example, node tags.
- The new events
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 propertyparentNodeDetection.- All data binding classes like
GraphSourceandTreeSourcegot new methods to get the graph item for a business object and vice versa. GraphSourceandAdjacentEdgesGraphSourcecan now be used with only anedgesSource(in other words, without anodesSource) if the propertylazyNodeDefinitionis enabled.TreeSourcegot support for group and location bindings, similar to the other data binding classes. Due to this, the signature of its methodscreateNodeandupdateNodechanged.- The HTML5
WheelEventis now used as primary API for mouse wheel events. This does not change the behavior and the previousMouseEventWheelandMouseScrollEventare still supported for older browsers.
Layout
IncrementalHierarchicLayouter: The group transposition feature can now also be used in incremental layout mode (seeDefaultLayerSequencer.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 propertynodeEdgeOverlapAvoidedis enabled (see propertygroupNodeCompactness).SmartOrganicLayouter: Improved node overlap removal (see propertynodeOverlapsAllowed). Now, if the scope is set toSCOPE_SUBSETorSCOPE_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,DefaultNodePlacerandDendrogramPlacer: 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.GenericTreeLayouternow ignores labels with zero width or height in all distance calculations.GenericTreeLayouter:NodePlacerimplementations 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.ParallelEdgeLayouternow always separates parallel edges according to their direction. In other words, edges (v,w) and (w,v) are never placed interleaved.SALabelingandGreedyMISLabeling: Both algorithms now also consider the node/edge overlap penalty specified by aLabelCandidate.- Improved abort handling for algorithms that use
ConstraintIncrementalLayerer,ConstraintLayererandTopologicalIncrementalLayerer. For large graphs these classes may require a long runtime that cannot be canceled by using anAbortHandler.
New Demos
- The new demo
demo.yfiles.loading.browserifyshows how to use yFiles with Browserify. - The new demos
demo.yfiles.loading.amdbundleanddemo.yfiles.loading.scriptbundleexplain how to create a single-file bundle of a yFiles-powered application. - The new demo
demo.yfiles.loading.noglobalsshows 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
TextRenderSupportandSimpleLabelStyle.
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.jsimplementation with the one of RequireJS and the AMD specification.- Return values are now passed to callbacks, as required by the AMD specification.
- The
baseUrlcan now be configured with the methodconfigin the same way as RequireJS. - Callbacks of the
requirefunction 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
FixNodeLayoutStagethat is part of the library instead of its custom implementation. - BPMN Editor demo: The
bpmn-layoutandbpmn-viewermodules 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
transformif 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 eventsMouse2DEnteredandMouse2DExitedhave 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
Mouse2DExitedevent 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
onMouseEnterandonMouseLeaveofControlwere erroneously invoked in these cases. This has been corrected, too.TextEditorInputModenow ensures that the TextBox is visible in the viewport when starting editing. This behavior can be adjusted by creating a custom subclass and overridingensureVisible().FoldedGraph.isDummynow throws anArgumentOutOfRangeExceptionfor labels and ports that are not part of this view. Previously, this method returnedtruefor 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.GraphEditorInputModenow by default supports the newGraphCommands.DUPLICATE_COMMANDthat is bound to keyboard shortcut Ctrl-D. This new behavior can be turned off with theduplicateAllowedproperty.- 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'sindependentCopyItemstoGraphItemTypes.NONE. GraphEditorInputModenow by default allows for reversing selected edges using the Ctrl-R keyboard shortcut and the newGraphCommands.REVERSE_EDGE_COMMAND. This new behavior can be turned off with theedgeReversalAllowedproperty.ClickInputMode: IfactiveButtonsincludesMouseButtons.RIGHT, the original right click event is marked as handled if ClickInputMode's event handlers mark the higher level click event as handled.GraphEditorInputModeandGraphViewerInputMode: 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'autoCleanupproperty 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: MethodfitContentnow respects theViewportLimiter. This might result in zoom levels greater than1.0.CanvasControl: The constructor sets the attributetabindex="0"on the HTML element of the control if no such attribute is present. Previously, the value1was set which inadvertently resulted in a high priority for keyboard focus changes. You can set any other priority at any time.GraphEditorInputMode'sNodeCreatedevent may now report nodes that are not part of the graph, when the user has dropped a node viaNodeDropInputModeand its newfolderNodeParentsAllowedproperty is enabled. By default this feature is disabled, though.IReparentNodeHandler'sisValidParentmethod may now also be queried if the new propertyreparentToLeavesAllowedofGraphEditorInputModeis 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 ofGraphEditorInputMode.IValueSerializerContext: In GraphML-writing code, the propertyinstancenow provides the object that should be converted, not the parent object. If you need to access the actual parent object, you can use theownerproperty on theGraphMLValueSerializerContextimplementation of this interface.- The event
GraphMLIOHandler.QueryReferenceIdis no longer fired forMarkupExtensionsand other proxy objects for serialization. Now, it is only fired for the original object references. GraphEditorInputModeandGraphViewerInputMode: By default, graph items styled with a void style (VoidNodeStyle,VoidEdgeStyle,VoidLabelStyle,VoidPortStyle) won't be selected and won't get the focus.GraphEditorInputMode'sclickHitTestOrderproperty default value has changed. Now it does not contain the redundantGraphItemTypes.ALLas the last element in the array anymore.GraphViewerInputMode: By default, clipboard commands are now disabled. This can be controlled with the new propertyclipboardCommandsEnabled.- The default keyboard shortcut for deselecting elements (
GraphCommand.DESELECT_ALL_COMMAND) has been changed toCtrl+Shift+A.Ctrl+Dis now the default shortcut for duplicating selected elements (GraphCommand.DUPLICATE_COMMAND). The latter can be disabled via theduplicateAllowedproperty. GraphEditorInputMode.shouldBeMarqueeSelectedis no longer queried by thePastecommand to determine the items which should be selected after paste. Instead, the new methodGraphEditorInputMode.shouldBeSelectedAfterPasteis queried. Note thatGraphEditorInputMode.shouldBeMarqueeSelectedstill 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 newpasteSelectableItemsproperty inGraphEditorInputModeand the correspondingshouldBeSelectedAfterPastemethod. - The hit test order for double clicks in
GraphEditorInputModeandGraphViewerInputModeis now controlled through the dedicateddoubleClickHitTestOrderproperty. By default, this hit test order prefers labels over other graph elements. - If
ClickInputModeis 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 forTapInputModeand single/double taps. - The visualization of the
HandleType.ROTATEis now a single circle, its very thin central point has been removed. - The segment index for label model parameters of
SliderEdgeLabelModelandSideSliderEdgeLabelModelnow is related to the visible segments for edges styled withPolylineEdgeStyle. - If an
IEditLabelHelperimplementation is present in anILabel's lookup, itseditLabelmethod 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 returntrue. Additionally, the predicate methodGraphEditorInputMode.shouldLabelBeEditedalways has to returntrue, 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.editLabelprovides, 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
IEditLabelHelperimplementation is present in anILabeledItem's lookup, itsaddLabelmethod is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate methodGraphEditorInputMode.shouldLabelBeAddedalways has to returntrue, 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 anIEditLabelHelperimplementation usually should allow editing of label instances that it has created itself inaddLabel. - 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 (seeLayerConstraintFactoryandSequenceConstraintFactory).SALabelingandGreedyMISLabeling: ChangedLabelCandidates 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
SizeChangedand related methods and properties have been moved fromControltoCanvasControl. In addition, sometimer-related properties have been replaced by more general variants to account for the newSizeChangedDetectionMode.SENSORsize change detection mode. Likely, customer code is not affected by neither change since the other classes that extendControldid not use the size changed-feature anyways. Control: Due to the improved event handling policy, the propertiespreventDefault,preventContextMenuPropagation, andpreventEventPropagationare no longer needed and have been removed. Instead, the new propertiespreventKeyboardDefault,preventPointerDefault, andpreventContextMenuDefaultcan be enabled to prevent the default action of the respective types of events.-
Changed
SnapLineto support non-orthogonal snap lines as well: its propertiesfromandtohave been changed from typenumbertoPointD, its propertyorientationwas removed, and its constructors have been changed accordingly.Orthogonal snap lines are now modeled by class
OrthogonalSnapLine. It extendsSnapLineand provides the propertyorientation. Existing API uses eitherSnapLineorOrthogonalSnapLine, depending on whether it works only with orthogonal snap lines or not.As a consequence, in class
SnapLineSnapResult, the propertysnapLinereturns a non-orthogonalSnapLineand the propertydeltareturns aPointDinstead of anumber. API related toGraphSnapContextstill works only with orthogonal snap lines and usesOrthogonalSnapLine. - The
keyproperty onSingleLineSnapLineVisual,FixedDistanceSnapLineVisual, andInBetweenSnapLineVisual, 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 methodcreateRedirectedGroupEdge.GraphClipboard's protected methodcopyGraphToRootwhich was called bycut,copy, andpasteto invoke theGraphCopierhas been split:copyGraphToRootnow is called only bycutandcopy.pastenow invokes the new methodpasteSubsetWithTargetAndCallback.- The type of
GraphMLAttribute'sserializableproperty has been changed frombooleanto the enumGraphMLSerializationMode. GraphEditorInputModeandTableEditorInputMode: return type of callback methodsonAddLabelandonEditLabelhas been changed fromvoidtoboolean. 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.IContextMenuwas removed. The members using that interface, namely the propertiesContextMenuInputMode.menu,ContextMenuInputMode.clearMenuandPopulateContextMenuEventArgs.contextMenu, and the methodContextMenuInputMode.createMenuwere 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.showMenutotruein your listener for the eventPopulateItemContextMenuto show your menu. This was previously done automatically by the input mode if the propertyIContextMenu.isEmptyreturnedfalse. CollapsibleNodeStyleDecoratorRenderer: The methodaddToggleGroupStateCommandis 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 methodscreateNodeandupdateNodechanged.ToolTipdoes no longer extend the classControl. This has no effect on its behavior.
Bugfixes
Viewer
CanvasControl: The eventsMouse2DEnteredandMouse2DExitedhave 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
onMouseEnterandonMouseLeaveofControlwere erroneously invoked in these cases. This has been corrected, too.- Properties
ShinyPlateNodeStyleRenderer.radius,ShinyPlateNodeStyleRenderer.brush,ShinyPlateNodeStyleRenderer.penandBevelNodeStyleRenderer.radiuswere not used consistently. - Fixed memory leak that occurred when
CreateEdgeInputModewas uninstalled. CreateEdgeInputMode: Fixed some problems with mixed mouse and touch input.- When using an
IEditLabelHelperand adding a label interactively, the helper'seditLabelcallback was called instead ofaddLabel. - Newly added labels could have had an empty size when an
IEditLabelHelperinstance 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
MoveInputModecreated byMainInputMode.createMoveUnselectedInputModechanged the cursor to indicate a movable object even when themodifierRecognizerdisabled 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.
CreateEdgeInputModenow copies the dummy edge's tag to the created edge. This could have caused issues when a listener for the eventEdgeCreationStartedset 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, andSideSliderEdgeLabelModelmight have disappeared when one or more edge segments were hidden under the source or target node. SnapContext: Snap results with anulltag were erroneously always discarded.BevelNodeStyle: Fixed update of drop shadow afterradiushas been changed.IconLabelStyle: MethodgetBoundsinIconLabelStyleRendererreturned a valid rectangle even if the label layout was invalid. As a consequence,isVisibleerroneously returnedtruefor labels with invalid bounds.- The
nameproperty of the classGraphMLAttributewas not considered during deserialization. - Write events in
GraphMLwere not always raised. - After setting an
ICanvasObjectGroup'svisibleproperty tofalsethe group was still visible. CanvasControl.ensureVisiblehasn't worked for bounds larger than the current viewport.- Setting the view point on a
CanvasControlwith a width or height of 0.0 could cause an exception if aViewportLimiterwas enabled. GraphCopierthrew an error if the source and the target graph were identical.- When the
SelectionPaintManagerwas disabled and a customFocusPaintManagerwas used nodes styled withTemplateNodeStylemight not always have been updated after selection changes. GraphEditorInputModeandGraphViewerInputModenow respect their respectivemultiSelectionRecognizerfor extending an existing selection via marquee.- Fixed
TableEditorInputModeexhibiting problematic behavior under certain circumstances when theGraphControl's graph is replaced. - GraphML could write incorrect values for bend tags.
Layout
SimplexNodePlacerfixed bug that disabled label compaction feature.AssistantPlacerfixed placement of assistant nodes. When all children of a node are assistants, they are all placed left/right.IncrementalHierarchicLayouter: Fixed bug that may cause an incorrect order of elements if the graph contains sequence constraints.IncrementalHierarchicLayouter: Fixed problem that may cause a very long runtime if the layouter is applied in incremental mode and the graph contains sequence constraints.IncrementalHierarchicLayoutModule: Now also considers incremental group nodes.IncrementalHierarchicalLayouter: Fixed bug that caused the maximum duration values specified forLayerer,SequencerandNodePlacerto be overridden and not considered during the hierarchic layout.IncrementalHierarchicLayouter: Fixed error that may appear in incremental layout mode if there are group nodes that contain non-incremental elements.GenericTreeLayouter: Fixed root alignments to only take the child node bounds into account without considering edge segments in the subtree.IncrementalHierarchicLayouter: Fixed orientation of edge labels on selfloops connected to a group node.IncrementalHierarchicLayouter: Fixed error that occurred if an incremental group node has only incremental descendants.IncrementalHierarchicLayouter: Fixed problem that caused bad results when assigning top or bottom layer constraints (i.e.,LayerConstraintFactory.addPlaceNodeAtTopConstraintorLayerConstraintFactory.addPlaceNodeAtBottomConstraint) to fixed elements.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 aWrongGraphStructureerror 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 callingcommitLayoutToOriginalGraph.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 ifstringTrimmingwas set to another value thanStringTrimming.NONE. Since the actual bug was in classTextRenderSupport, 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, andAdjacentNodesGraphSource: Corrected several problems in the methodupdateGraph()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
TapInputModeevents 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
shapeRenderingandimageRenderingproperties inCanvasControluseless. The properties are now applied correctly to the SVG DOM during rendering and image export. - In Internet Explorer,
DragOverevents 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 withelement.innerHTML = "".- GraphML serialization could not correctly handle undefined values and has thrown an error instead. The new property
SerializationProperties.UndefinedHandlingcontrols how undefined values are serialized. MouseEventArgs.buttonwas set toMIDDLEfor all but the left and right mouse button. This two were correctly reported. As a consequence,Mouse2DEventArgs.changedButtonshad the same error.GraphSourceBase.updateGraphthrew an error if the object instances ingroupsSourcehad been changed. This error affectedGraphSource,AdjacentNodesGraphSource, andAdjacentEdgesGraphSource.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
IncrementalHierarchicLayouter: corrected wrong node placements in graphs with groups if sequence constraints are used.Polyline.EdgeRouter: Fixed rare error that may occur for graphs where only a subset of edges is routed, seeEdgeRouter.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.
MoveViewportInputModeno longer fires theDragFinishingandDragFinishedevents for simple clicks without any mouse movement.GraphViewerInputMode: The eventCanvasClickedspecifies now the correct type for its event args, that isClickEventArgs.- In Internet Explorer,
Mouse2DMovedevents 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,EdgeDefaultsand all otherDefaults: it was erroneously possible to assignnullto thestyleproperty. Now, the property throws anArgumentNullExceptionin this case.GenericYList: Callinginserton 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 methodCopiedLayoutGraph.commitLayoutToOriginalGraphis 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
LayoutExecutoror themorphLayoutmethod now set a customfinishHandlerthat 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-miscwas not properly 'required'. - All demos with a layout algorithm now use the
MinNodeSizeStageto 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.
- The new documentation viewer makes it much easier to quickly find specific API and Developer's Guide documentation.
- Various improvements and corrections of the documentation in
yfiles-api.js: Removed left over private API members, replaced invalid annotations, added@staticannotations, 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.helpnow 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.LayoutStylesnow 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.basiclayoutercan serve as a starting point for custom yFiles for HTML applications. - Added new demo
demo.yfiles.angularthat shows the integration of yFiles for HTML with Angular JS. - Added new demo
demo.yfiles.graph.eventsthat demonstrates the various events of the input mode, the graph control, and the graph. - Added new demo
demo.yfiles.style.sparklinethat shows how to use a third party visualization framework for a custom node style. - Added new demo
demo.yfiles.loading.nodejsthat 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
loadevent 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.StringTemplateNodeStyleinstead ofyfiles.drawing.TemplateNodeStylesince it is better suited for this use case. - Preferred Label Placement Demo: Switched off the label style's
autoFlipfeature so the "Add 180° on Right Side" option has a visible effect. - Bpmn Editor Demo: The implementation of the method
ConnectedIconLabelStyle.isVisiblewas 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
EditLabelHelperinPoolNodeStyle. - The
StylePanelused for the palette in several demos and some other helper GUI components are now implemented in plain JavaScript/HTML and no longer extend classyfiles.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
finishHandlernow 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.
- Context Menu Demo: Fixed context menu opening in empty canvas locations.
- All demos: Added links to related sections in the Developer's Guide and the API doc.
- All demos: Realize private helper methods as private functions to keep the demo API concise.
Minor Improvements
- The rendering performance of the built-in node styles has been optimized, especially in Chrome and Internet Explorer.
GraphViewerInputModeandGraphEditorInputMode: The childclickInputModenow delivers both left and right clicks.OverviewInputModeandGraphOverviewControlhave been optimized to improve the user experience when used on touch devices.OverviewInputModecan 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, andTreeSourcenow acceptIEnumerables as values for the propertiesnodesSource,edgesSourceandgroupsSource, in addition to arrays and plain JavaScript objects.
Bugfixes
DefaultArrow.lengthdid not take thescalefactor into account, sometimes leading to gaps between the edge and the arrow.- Custom selection visualizations using
EdgeStyleDecorationInstallerwere not animated correctly. - Custom selection visualizations using
EdgeStyleDecorationInstallerinDecorationZoomMode.MIXEDorDecorationZoomMode.VIEW_COORDINATESdid not work correctly together withBridgeManager. EdgeStyleDecorationInstallercan 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.transformand other GeneralPath methods usingMatrix2Dapplied 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/removeEdgeOverlapswere enabled because all potential candidates were erroneously rejected. NavigationInputModetries 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 thatClickInputMode.clickHandlingModewas set toDOUBLE_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
GraphEditorInputModeandGraphViewerInputMode: 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.jswas included. - The modules
yfiles/completeandyfiles/layoutdid not list all modules from the layout part as dependencies.yfiles/layout-familytree,yfiles/layout-orthogonal-compact,yfiles/layout-polyline, andyfiles/layout-radialwere missing.
Layout
MultiPageLayouter: Fixed bug that caused that anAbortHandlerattached to the input graph was ignored.IncrementalHierarchicLayouter: Fixed routing style violations in octilinear grouped edges.MultiPageLayouter: Fixed error that may occur for specific mappers for the keyMultiPageLayouter.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 methodfindMatchingCandidateto return the entry with the highest cost instead of the lowest cost if the candidate matcher is created with methodPortCandidateSet.createMatcher.DirectedOrthogonalLayouter: Fixed bug that caused an error if a mapper for the keyPortConstraintKeys.SOURCE_GROUP_ID_DP_KEYis registered to the input graph but no mapper for the keyPortConstraintKeys.TARGET_GROUP_ID_DP_KEYis registered.ComponentLayouter: Fixed bug that caused an error if the style is set toyfiles.layout.ComponentArrangementStyles.MULTI_ROWS_HEIGHT_CONSTRAINTorMULTI_ROWS_HEIGHT_CONSTRAINT_COMPACTand 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.MultiPageLayouter: Fixed bug that may cause non-orthogonal edge routes.TreeReductionStage: Fixed bug that may cause aWrongGraphStructureerror if the input graph contains group nodes with incident edges.TreeLayouter: Fixed bug that may cause an error if the input graph is aCopiedLayoutGraphthat consists of multiple connected components and the layouter uses theLayeredNodePlacer, if the propertychildPlacementPolicyis set toyfiles.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.findMembersand related methods likegetMemberscould return incorrect results.- Utility method
yfiles.help.createStubwas creating incorrect code for 'default' constructors. TemplateNodeStyle,StringTemplateNodeStyle: In Internet Explorer, some elements in template defs sections were removed from the DOM by garbage collection even if still referenced.TemplateNodeStyle,StringTemplateNodeStyle: Elements in defs sections within a template script tag, that are not part of a certain template were never cleaned up if not needed anymore.Pen#lineJoindefault value attribute differed from the actual default valuePenLineJoin.MITER.
Automatic Layout
IncrementalHierarchicLayouterandRankAssignments: 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 optionrouteInterEdgesImmediatelyis enabled.CompactOrthogonalLayouter: Fixed possible exception caused by nodes without node-ids. This problem may only appear if the inter edge router is set toChannelInterEdgeRouter.
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
LayoutGraphAdapterwhere label candidates for edge labels were not always determined correctly. RotatedSideSliderEdgeLabelModel: Label model parameters of this model were serialized as the respective parameters ofRotatedSliderEdgeLabelModel. 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.FoldedGraphdetects more carefully what has changed before invoking the methodsCreateDummyEdgeAppearanceandChangeDummyEdgeAppearanceofIDummyEdgeConverter. Previously, in some cases, these methods were called to often or not at all.FilteredGraphWrapper: The variousedgesAtmethods erroneously returned edges that were marked as hidden by theedgePredicate. The methodsdegree,inDegree, andoutDegreeare based on these methods and were affected, too.GraphSnapContext: Snapping nodes to vertical edge segments was not working ifnodeToEdgeDistancewas set to 0.0.- When snapping was disabled temporarily (using Ctrl) during a move gesture, the moved item snapped after finishing the gesture, anyway.
FoldedGraphUndoSupportdidn't add the correct bend information to its internal data structures.TemplateLabelStyle: ThepreferredSizewas not correctly read from GraphML files.CollapsibleNodeStyleDecoratorandShadowNodeStyleDecorator: Lookup requests forISizeConstraintProvider,IGroupBoundsCalculator, andIShapeGeometryare now correctly delegated to the wrapped style.- The
EdgeStyleDecorationInstallerdid not copy the tags of dummy ports and edges used when displayed in view coordinates (zoomMode==DecorationZoomMode.VIEW_COORDINATES).
Automatic Layout
OrthogonalLayouterfailed almost always with an exception if the Mixed Layout style was used.IncrementalHierarchicalLayouter: Fixed possible exception caused by inconsistent grouping. The problem may only occur in incremental mode and if there are sequence constraints.IncrementalHierarchicLayouter: Fixed rare exception that may appear for grouped graphs containing nodes with fixed coordinates hint.IncrementalHierarchicLayouter: Fixed bug that breaks incremental hints of grouped edges in incremental layout mode.IncrementalHierarchicLayouter: Fixed bug that may cause a wrong order of fixed (non-incremental) elements if the layouter is applied in incremental mode and the graph contains sequence constraints.IncrementalHierarchicLayouter: Fixed possible exception that may occur for grouped graphs in incremental mode with recursive group layering enabled.IncrementalHierarchicLayouterFixed possible exception caused by inconsistent grouping.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
AssistantPlacertogether 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 methodgrowthat 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 optionremoveNodeOverlapsis 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.
yFiles for HTML 1.2.0.3 - Changes Since 1.2.0.2
Bugfixes
- Template styles:
<defs>sections were not handled correctly in 1.2.0.2, only. - In Internet Explorer,
SvgExporterdid not correctly export SVGs with use elements.
yFiles for HTML 1.2.0.2 - Changes Since 1.2.0.1
Bugfixes
- Fixed ellipsis character not always showing correctly in
SimpleLabelStyleandTextRenderSupportdue to source code file encoding issues. - Template Styles: Fixed non-functional bindings in certain attributes like 'x' and 'y' in Internet Explorer.
- The
IRenderContextinstance created byCanvasControl.createRenderContextwas not usable for SVG export withCanvasControl.createVisualContent. Note that for SVG export, it is still recommended to use classSvgExportinstead. GraphSnapContext: Snapping nodes to vertical edge segments was not working ifnodeToEdgeDistancewas set to 0.- Fixed broken methods
LayoutExtensions.createIncrementalLayerConstraintFactoryandLayoutExtensions.createSequenceConstraintFactory. GraphMLIOHandler: methodaddNamespacehad no effect, and adding a custom schema withaddSchemaLocationtriggered an error.SvgExport: Fixed clip-path not working in Firefox when exporting an SVG.SvgExport: propertyscaledid not throw an error for invalid values.- Cordova/PhoneGap toolkit demos: the setup step for the Contacts plugin was missing, some small bugfixes for the contacts functionality, and more status notifications.
Layout
IncrementalHierarchicLayouter: Fixed bug that may cause edges with zig-zag paths if there are swimlanes and integrated edge labeling is enabled.IncrementalHierarchicLayouterandTopologicalIncrementalLayerer: Fixed bug that may cause unwanted same-layer edges between incremental nodes.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.
SimpleLabelStyleconstructors that take aTypeface, 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.PlaceTextalways returning the original text ifStringTrimming.NONEwas passed in.
Layout
- Integrated labeling of the hierarchic layout style: preferred label placements
Along Edgewere not calculated correctly. yfiles.router.polyline.EdgeRouter: Fixed wrong heuristic bend calculation if grid is used.BusRouter: Fixed error inBusRepresentationsthat could appear if the input graph contains overlapping nodes.FixedGroupLayoutStage: FixedcanLayoutwhich 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 optional GWT 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
AdjacentNodesGraphSourceandAdjacentEdgesGraphSourceprovide 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
scripttags. - 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.
- Added
ItemHoverInputModeto conveniently handle hover state changes. - Automatic JSON serialization and deserialization of native JavaScript objects added to GraphML I/O.
- Added customizable internationalization and localization for commands, key bindings, and undo event descriptions.
- Added support for web worker environments. This allows for layout and algorithm calculations in separate threads.
- Added new sample applications that showcase the enhanced labeling features, multi-page layout, new data-binding helper classes, multi-threaded layout execution, edge bridges, preferred label placement, custom snapping and selection handling, style decorations and style implementations.
Layout
- Added new layout algorithm
RadialLayouterthat 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
AbortHandlerprovides methods to specify how long an algorithm may run until it is gracefully terminated (see methodstopDuration) and immediately terminated (see methodcancelDuration), respectively.The following layout algorithms have at least rudimentary support for immediate termination: Layout Algorithms Routing Algorithms Other Algorithms BalloonLayouterCircularLayouterCompactOrthogonalLayouterDirectedOrthogonalLayouterGenericTreeLayouterGRIPHierarchicGroupLayouterHierarchicLayouterIncrementalHierarchicLayouterOrganicLayouterOrthogonalGroupLayouterOrthogonalLayouterPartialLayouterRadialLayouterRecursiveGroupLayouterSmartOrganicLayouter
BusRouterpolyline.EdgeRouterOrganicEdgeRouterOrthogonalEdgeRouter
GreedyMISLabelingSALabeling
The following layout algorithms also support graceful early termination: Layout Algorithms Routing Algorithms Other Algorithms HierarchicGroupLayouterHierarchicLayouterIncrementalHierarchicLayouterOrganicLayouterSmartOrganicLayouter
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 BalloonLayouterCircularLayouterCompactOrthogonalLayouterComponentLayouterDirectedOrthogonalLayouterGenericTreeLayouterIncrementalHierarchicLayouterOrthogonalGroupLayouterOrthogonalLayouterRadialLayouterRecursiveGroupLayouterSmartOrganicLayouterTreeLayouter
polyline.EdgeRouterSelfLoopLayouter
GreedyMISLabelingSALabelingInsetsGroupBoundsCalculatorMinimumSizeGroupBoundsCalculator
SmartOrganicLayouter: Added support for partition grid layout. See classPartitionGrid.- Optimized the module dependencies to reduce loading times. The module
layout-hierarchicdoes no longer depend on the moduleslayout-routerandlayout-tree, and the modulelayout-orthogonaldoes no longer depend on the modulelayout-router.
Minor Features Added
GraphSource: Added propertylazyNodeDefinition. If this property is enabled, objects that are not contained innodesSourcecan be used as source and target of edges as well.GraphSource: Added propertynodeLabelBindingthat specifies the label binding for nodes, similar to theedgeLabelBindingfor edges.ItemDropInputModeis a newDropInputModeforIModelItems that facilitates subclasses to support preview and snapping of the dragged item as well as highlighting potential drop targets.NodeDropInputModeandStripeDropInputModehave been refactored to useItemDropInputModeas 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 propertiesintegratedEdgeLabeling,integratedNodeLabeling, andnodeLabelingPolicy.BalloonLayouter: Added support for different policies to align nodes having the same root node. See new propertychildAlignmentPolicy.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 propertyinterleavedMode.IncrementalHierarchicLayouter: Improved partition grid support. Nodes can now be mapped to a multi-lane partition cell identifier, i.e., a cell spanning multiple columns and rows. See classPartitionGrid.IncrementalHierarchicLayouter: Improved edge label placement. Edge labels with preferred placement at source/target are placed closer to the corresponding node. Additionally,SimplexNodePlaceroffers the option to place adjacent edge labels in a compact, stacked style. See new propertylabelCompaction.polyline.EdgeRouter: Added a fine-granular configuration option to weigh the crossing costs for each label using the data provider look-up keyEdgeRouter.LABEL_CROSSING_COST_FACTOR_DP_KEY.polyline.EdgeRouter: Added propertyignoreInnerNodeLabelsthat 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 propertyedgeOrderComparator.GenericTreeLayouter: When enablingGenericTreeLayouter.integratedNodeLabelingand/orGenericTreeLayouter.integratedEdgeLabeling, the respective labels will be taken into account during the calculation of group bounds.DelegatingNodePlacer: Added keyDelegatingNodePlacer.LEFT_RIGHT_DP_KEYthat allows choosing on which side a node is placed.PartialLayouter: Now supports handling of directed and undirected edges. See data provider keyDIRECTED_EDGES_DP_KEY.FixNodeLayoutStage: Added additionalFixPointPolicysUPPER_RIGHT,LOWER_RIGHT, andLOWER_LEFT.LabelLayoutTranslator: Added propertieswriteBackRelativeEdgeLabelLocationandwriteBackRelativeNodeLabelLocationthat allow a core layouter to specify new node or edge label locations relative to the label's owner.LabelLayoutKeys: Added keyIGNORE_LABEL_DP_KEYthat allows specifying which edge and node labels should be ignored during layout calculations.- Added new class
OrganicRemoveOverlapsStagethat removes node overlaps while respecting a specified minimal node distance. Unlike the approach implemented in classRemoveOverlapsLayoutStage, this approach tries to keep the original layout structure, i.e., it tries to keep the geometric distance between the nodes. - Added class
StraightLineEdgeRouterthat routes edges as straight lines considering specified port constraints.
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.
ImageNodeStylenow supports fail-over images by default.CollapsibleNodeStyleDecoratorcan 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.
DropInputMode: Added propertylastDragEventArgs.CompositePositionHandler: Added methodsgetPositionHandlerandgetHandleto retrieve an earlier addedIPositionHandlerorIHandle.TableLayoutConfigurator: Support for routing algorithms improved.
Algorithms
Dfs: Added methodcancelthat can be used by subclasses to cancel the search.Cycles: Improved methodfindCycleto stop the search as soon as the first cycle has been found.GraphConnectivity: Improved methodmakeBiconnectedto work with graphs with self-loops (i.e. edges whose source node is also the target node).Groups: Replaced recursive implementation of methodbiconnectedComponentGroupingwith 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 edgesILayoutDataProvider.getEdgeDatanow returns anIEdgeDataof the new typeEdgeDataType.REDIRECTED_GROUP_EDGE.PCListOptimizer: Improved port candidate assignment calculated by methodoptimizeAfterSequencing.SmartOrganicLayouter: Now uses a more sophisticated approach to remove node overlaps if the scope is set toScope.ALLand the quality to time ratio is greater than or equal to0.7(propertyqualityTimeRatio).InteractiveOrganicLayouter: MethodstartLayoutnow takes advantage of multiple threads for layout calculation which may reduce the required runtime.BalloonLayouter: Reduced gaps between adjacent nodes.PartitionLayouter: Added nested classPartitionLayouter.PolylineInterEdgeRouterthat routes inter-edges using classpolyline.EdgeRouter.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.RecursiveGroupLayouter: Added optionreplacePortConstraintsthat replaces port constraints by port candidates and, thus, may improve the layout result.polyline.EdgeRouter: Improved support for port candidate sets (see classPortCandidateSet).polyline.EdgeRouter: Rerouting improved to provide better results.polyline.EdgeRouter: Memory usage has been reduced.polyline.EdgeRouter: Added penalty setting for edge length. SeePenaltySettings.edgeLengthPenalty.polyline.EdgeRouter: Added four predefined optimization strategies. SeePenaltySettings.OPTIMIZATION_BALANCED,PenaltySettings.OPTIMIZATION_EDGE_BENDS,PenaltySettings.OPTIMIZATION_EDGE_CROSSINGS, andPenaltySettings.OPTIMIZATION_EDGE_LENGTHS.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.DirectedOrthogonalLayouterandOrthogonalGroupLayouter: Added optimization step that reduces the number of perceived bends. See new propertyperceivedBendsOptimization.OrthogonalLayouter,OrthogonalGroupLayouterandDirectedOrthogonalLayouter: Added optimization step that aligns degree one nodes (i.e. nodes with one incident edge) that have the same neighbor. See new propertyalignDegreeOneNodes.OrthogonalGroupLayouter: Improved routing and edge labeling for self-loops of normal (non-group) nodes.LayoutTool: Added new rectangle arrangement methodarrangeRectangleMultiRowssuitable for arranging rows of rectangles with highly different sizes.ComponentLayouter: Added the following new component arrangement strategies toComponentArrangementStylesthat 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, andMULTI_ROWS_WIDTH_CONSTRAINED_COMPACT
Demos
- Added new showcase application
demo.yfiles.graph.bpmneditorwhich 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.multipageshows how to use theMultiPageLayouterto divide a large graph into several smaller pages. - The new demo
demo.yfiles.loading.webworkershows 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
AdjacentNodesGraphSourceandAdjacentEdgesGraphSource. - The new demo
demo.yfiles.graph.htmlpopupshows HTML pop-up panels that display additional information about a clicked node or edge. - The new demo
demo.yfiles.input.singleselectionshows how to configureGraphEditorInputModefor single selection mode. - The new demo
demo.yfiles.layout.preferredlabelplacementshows how thePreferredPlacementDescriptorfor edge labels affects the label placement of layout algorithms. - The new demo
demo.yfiles.style.datatableshows a node style and a label style that display data in a tabular fashion. - The new demo
demo.yfiles.style.selectionstylingshows customized selection painting of nodes, edges and labels by decorating these items with a corresponding style. - The new demo
demo.yfiles.style.styledecoratorsshows 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: MethoddoLayoutnow throws an error if there is a node with zero width or height in the given graph.FixedGroupLayoutStage: MethodorthogonalEdgeRouternow returns an instance of classpolyline.EdgeRouterinstead of classOrthogonalEdgeRouter.ComponentLayouter: PropertypreferredLayoutSizenow 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, andLabelLayoutDataRefinement.
API Changes
GraphExtensionsandIGraph: the following methods have been renamed:createNodeAtLocationtocreateNodeWithCentercreateNodeAtLocationAndTagtocreateNodeWithCenterAndTagcreateNodeAtLocationWithStyletocreateNodeWithCenterAndStyle
GraphOverviewControl: due to the new general support for HTML5 Canvas rendering, the signatures of the methodcreateGraphCanvasVisualCreatorand the constructorCanvasOverviewGraphVisualCreatorhave been changed.GraphSource: renamed the propertyidBindingtonodeIdBindingto be more consistent with the other property names.GraphSource: the callback methodscreateNodeandupdateNodegot a new additional parameter for the label data of the node, like the similar methods for edges always had. Since these methods are classified asprotected, this change affects only derived classes but not usages of this class.ResourceManager: renamed the constructorForTypeto the canonicFromGlobalNameand removed other obscure constructors.- Changed module dependencies and affiliation in the layout part:
- Moved classes
PartitionGrid,PartitionCellId,RowDescriptor, andColumnDescriptorfrom the namespaceyfiles.hierarchic.incrementaltoyfiles.layout. Additionally, these classes are now part of the modulelayout-coreinstead oflayout-hierarchic. - Moved class
FamilyTreeLayouterfrom the modulelayout-hierarchicto the new modulelayout-familytree. - Moved class
CompactOrthogonalLayouterfrom the modulelayout-orthogonalto new modulelayout-orthogonal-compact. - Moved class
ChannelRouterfrom the modulelayout-routerto the modulelayout-hierarchic. - Moved classes
FixedGroupLayoutStageandPartitionLayouterfrom the modulelayout-routerto the modulelayout-polyline. - Moved rarely used inner class
TreeDrawer.HierarchicTreePlacerto the top-level of theyfiles.treenamespace. Consequently, it was moved from the modulelayout-hierarchicto the modulelayout-tree. - The module
layout-hierarchicdoes no longer depend on the moduleslayout-routerandlayout-tree. - The module
layout-orthogonaldoes no longer depend on the modulelayout-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-hierarchicto get both the hierarchic and the tree layout algorithms. - Moved classes
IItemFactory: Added methodcreateRedirectedGroupEdge.LayeredNodePlacer: Removed data provider keyDP_KEY_DISTANCE_TO_PARENT_MAPfrom public API, since it is for internal use only.DelegatingNodePlacer: the methodsgetLowerRightChildrenandgetUpperLeftChildrenhave now an additional second argument, the current graph.polyline.EdgeRouter: MethoddoLayoutnow 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 classPenaltySettings.polyline.EdgeRouter: renamed the propertiespolylineRoutingEnabledandreroutingEnabledto the canonical namespolylineRoutingandrerouting, respectively.PathSearch: Signature of methodcalculateCostshas changed. It now takes an additional double array as parameter that is populated with the calculated costs instead of returning a new array.DrawingEmbedder: Removed public methodpreprocessNodesand protected methodprintStatistics.RecursiveGroupLayouter.NULL_LAYOUTER_FIELD0has been renamed toRecursiveGroupLayouter.NULL_LAYOUTER.- Removed
SimpleLabelStyleRenderer's static methodsgetTextOffset,measureText, andgetTextBBox. Please useTextRenderSupport.measureTextorTextRenderSupport's instance methods for text measuring instead.
Bugfixes
GraphSource: fixed various problems in methodupdateGraphthat caused undesired behavior or even errors.- Property
Touch2DDevice.lastEventTimeis now a regular JavaScriptDateobject. BevelNodeStyle: Fixed update of drop shadow afterradiushas been changed.- When using an
IEditLabelHelperand adding a label interactively, the helper'seditLabelcallback was called instead ofaddLabel. - Reparenting an empty group node displayed the target node highlight around the reparented node.
SmartOrganicLayouter: Fixed bug that caused weird placement of fixed elements if the minimal node distance is set to 0.MultiPageLayouter: Fixed possible error if the input graph contains empty group nodes.MultiPageLayouter: Fixed possible error.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 optionedgeStraighteningOptimizationis enabled.PCListOptimizer: Fixed possibleIndexOutOfRangeExceptionthat 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) inSimplexNodePlacerthat 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 inConstraintIncrementalLayererthat could appear when layer constraints were added in incremental mode.CircularLayouter: Fixed a possible error when layout style is set toBCC_ISOLATEDand consider node labels is enabled.AbstractLabelingAlgorithm: Fixed bug that causes poor results if optionremoveEdgeOverlapsis 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 propertybackloopRouting).IncrementalHierarchicLayouter: Fixed possible error ifPortConstraints are used together withPortCandidateSets.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 methodnearestCommonAncestorthat sometimes caused wrong results if one of the specified nodes is the ancestor of the other node.InsetsGroupBoundsCalculator: Fixed methodcalculateBoundsto 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 usingLayeredNodePlaceras default node placer.LayoutTool: Fixed calculation of lower width bound in methodarrangeRectangleRows. 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.SALabelingandGreedyMISLabeling: Fixed possible error caused by labels with zero width/height and a "free" edge label model.IncrementalHierarchicLayouter: Fixed bug that caused wrong coordinates of empty rows (see classRowDescriptor) whose minimum height is zero.DirectedOrthogonalLayouter: Fixed a bug that sometimes caused misplaced edge labels of grouped edges.polyline.EdgeRouter: Fixed possible error for edge groups that contain fixed edges.polyline.EdgeRouter: Fixed bug that caused wrong routes for edges grouped with fixed edges.
yFiles for HTML 1.1.1.6 - Changes Since 1.1.1.5
Bugfixes
- Various corrections for touch input in Internet Explorer 11
- Under certain rare conditions, the
clonemethod did not copy all field values from the original instance to the newly created instance. BevelNodeStyledid not update the fill attribute correctly.- Obfuscator: Blacklist
localNameto prevent thee removing of drop shadows in Firefox and Internet Explorer. Folding: Source port tags in view states were not parsed correctly from GraphML.BevelNodeStyle: Fixed update of drop shadow afterradiushas been changed.FilteredGraphWrapper.disposedid not clean up all event listeners.- Node ports could not be moved by dragging their
IHandle. CreateEdgeInputMode: Mixing touch and mouse gestures did not always work as expected.List.fromArraydid not check its input for null.- Graph Viewer Demo: load the
graph-style-defaultsmodule before loading a GraphML file that uses styles defined in it. ImageExportDemo: The hit test for the export rectangle was configured incorrectly.
Automatic Layout
IncrementalHierarchicLayouter: Fixed error that may appear for graphs containing nodes with fixed coordinates.LabelLayoutDataRefinement: Fixed possible error for unbuffered layout runs.RecursiveGroupLayouter: Removed all temporarily inserted port candidates before calling the inter-edge routing because otherwise the edges routes may become corrupted.TreeLayouterandGenericTreeLayouter: Fixed possible error for trees with empty group nodes.ShuffleLayouter: Fixed bug that may cause small offsets of fixed nodes.Polyline.EdgeRouter: Fixed bug in calculation of edge to edge distance penalties which could reduce the space where edges can be routed causing them to take unnecessary long routes.Polyline.EdgeRouter: Fixed bug that caused edges that connect a node with an ancestor group node to violate the minimal node to edge distance for the target node.Polyline.EdgeRouter: Fixed bug that caused edges that connect a node with an ancestor group node to have unnecessary long and bended edge paths when using port constraints.Polyline.EdgeRouter: Fixed bug that caused edges that connect a node with an ancestor group node to cross their source nodes when using port constraints.Polyline.EdgeRouter: Fixed bug that makes it possible to group the source of one edge and the target of another edge at their common node.Polyline.EdgeRouter: Fixed bug that sometimes causes superfluous edge overlaps.Polyline.EdgeRouter: Fixed bug that caused minimum distance violation of grouped edges.Polyline.EdgeRouter: Fixed rareNullReferenceExceptionwhile calculating edge crossing costs.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 ifTableLayoutConfiguratoris 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.BusRouter: Fixed possible error.BusRouter: Fixed possible error caused by non-orthogonal edge segments.BusRouter: Fixed possible error when routing only a subset of edges without adding aDataProviderto the graph that marks edges as selected.IncrementalHierarchicLayouter: Fixed bug that could result in infinite y-coordinates when octilinear edge routing was enabled.Polyline.EdgeRouter: Fixed bug that may cause an error if a grid is specified (see optionGrid).OrthogonalGroupLayouter: Fixed bug that may cause wrong group bounds calculation if a group node label lies outside of the group node.PartialLayouter: Fixed possible error if the algorithm is applied to a graph with partition grid (seePartitionGrid).
yFiles for HTML 1.1.1.5 - Changes Since 1.1.1.4
Bugfixes
- Fixed touch events for Internet Explorer 11.
SimpleLabelStyle.WithFontSizeAndBrush: The font size parameter was ignored.SimpleLabelStyle: Setting thebackgroundBrushback tonullhad no effect.- Invisible
CanvasObjectGroups did not work.
yFiles for HTML 1.1.1.4 - Changes Since 1.1.1.3
Improvement
LayoutGraphAdapterprovides now the originalTagdata for temporary graph objects.
Bugfixes
- The
yfiles/langcore 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#BackgroundStylewas not serializable. - Manually bracketing undo edits with
BeginEditandEndEditmight have led to exceptions when folding was active. - Changing properties of
PolylineEdgeStyle.penhad no visible effect.
Automatic Layout
DirectedOrthogonalLayoutercould throw aindexOfexception.IncrementalHierarchicLayouter: Fixed a rare bug that caused broken edge routes if edges are routed polyline.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.workaroundCR320635totrue. - Improved the rendering performance of graph item handles in Internet Explorer.
- Fixed an error that was thrown when uninstalling a
GraphEditorInputModeafter a label editing text box was shown. TextEditorInputMode#anchorwasn't considered for placing the label editing text box.RotatedSliderEdgeLabelModelcan now deal with edge paths that arenull, for example when usingVoidEdgeStyle.- GraphML: Primitive types like floats and doubles could not be read when used in element syntax and the current
CultureInfowas notInvariant.
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
Printingand thePrinting 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
isInstanceandinstanceofconsidered 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.TRIANGLEwhich accidentally was the same asArrowType.DEFAULT. - Fixed clipping problem in
SvgExportthat affected printing and bitmap export. - Fixed clicking in the overview not honoring viewport limits.
- GraphML: Properties with a text value containing nested
CDATAsections were not parsed correctly. - Moving the viewport by clicking into the
GraphOverviewControldid not honorCanvasControl.viewportLimiterrestrictions. - Fixed error when invoking event handlers added with
KeyboardInputMode.addHandlerForGesture. - Key event handlers are removed from a
Controlwhen it loses focus. PatternBrushnow respects the value set in theviewBoxproperty.
Automatic Layout
EdgeRouter: Fixed bug that may cause anErrorif a grid is specified (see propertygrid).OrthogonalGroupLayouter: Fixed bug that may cause a wrong group bounds calculation if a group node label lies outside of the group node.PartialLayouter: Fixed possibleErrorif the partial layouter is applied to a graph with partition grid (seePartitionGrid).PartialLayouter: Fixed bug that may cause a very long runtime if the algorithm considers node alignment (see propertyconsiderNodeAlignment).IncrementalHierarchicLayouter: Fixed bug that may cause broken edge routes for edges with port candidates if backloop routing is enabled (see propertybackloopRouting).ParallelEdgeLayouter: FixedErrorthat appears if the leading edge has zero length.ParallelEdgeLayouter: Fixed bug that may cause points withDouble.NaN-coordinates for some edges.LayoutTool: Fixed bug in methodrouteEdgesParallel: that may cause points withNumber.NaN-coordinates for some edges.EdgeRouter: Fixed performance problems for graphs with overlapping fixed edges.
yFiles for HTML 1.1.1.1 - Changes Since 1.1.1
Bugfixes
- Some properties of type
ICollectionwere not serialized in GraphML. Especially,ITableinstances were not serialized correctly. - Interactively deleting the last stripe in a table caused an exception.
- Cloning table stripes did not work correctly.
- Restored previous default behavior of edge highlight and focus visualizations.
Demos
Custom Style Tutorial: MethodMySimpleLabelStyle#getPreferredSizethrew an exception when creating a new label.Custom Style TutorialandSimpleCustomStyledemo: 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.infoandyfiles.help.apidisplay 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.jshas a new setting to switch between instant failure and logging of problems. To enable logging, set the boolean propertyyfiles.help.logTypeInfoErrorstotrue.
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 methodcreateGraphCanvasVisualCreatorthat allows for easier creation of a canvas based preview rendering.- Added callback method
setEdgePortLocationtoLayoutGraphAdapterthat is called while assigning a new location to a port that is owned by an edge. - Improved performance of table rendering and interaction.
- Added explicit extension method
IGraph.createNodeAtLocationWithStyle(PointD,INodeStyle). Arrow: Setting the various properties now only recreates the arrow template if something actually changed.- Method
SvgExport.setup: The returnedIRenderContextnew has the correctclipapplied. 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 methodmakeBiconnectedto work with graphs with self-loops (self-loops are edges whose source and target are the same).Groups: Replaced recursive implementation of methodbiconnectedComponentGroupingwith an iterative algorithm to support larger graphs.Trees: Added methodisForestWithDirection.
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.AlgorithmAbortedExceptionhas 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.
PatternBrushcouldn't be used in documents with more than one graph control.Pen: The dash style wasn't visualized correctly, and the propertiesdashCap,lineJoin, andmiterLimithad no effect. Consequently, visualizations of lines that use one of these properties might look different.- Prevent the creation of SVG path elements with empty path data attribute.
NodeStylePortStyleAdapter: Ports were drawn near the origin of the view instead of the real node location.- Debug support: Replaced all occurrences of
java.lang.Classby the correctyfiles.lang.Class. LabelControlLabelStyleincorrectly triggered update of preferred label size calculation in folded graph scenarios under certain conditions.- Method
NavigationInputMode.toggleGroupNodeStatedid not expand collapsed folder nodes. NavigationInputMode: MethodscollapseSelectionandexpandSelectionthrew an exception.- Fixed touch events when starting a gesture on an SVG element that is removed from the DOM during the gesture, e.g. when starting a drag on a node and moving the node out of the visible screen area.
- Method
SimpleAbstractLabelStyle.isInBoxalways returned false. NodeStyleLabelStyleAdapter: Fixed rendering bug when the style was used for node labels.- In
CreateEdgeInputModeandMoveInputMode, snapping may not have been re-enabled after disabling it temporarily. IconLabelStyle: Fixed exception when the icon size was not set or was empty.- Method
GraphClipboard.cut: The filter predicate was evaluated twice, resulting in unexpected behavior if the predicate evaluation depended on state that could change by removing graph elements. CanvasControl:horizontalScrollBarPolicyandverticalScrollBarPolicycould not be set to different values at the same time. Instead, the value of the latter was always used for both settings.LabelControlLabelStyleincorrectly triggered update of preferred label size calculation in folded graph scenarios under certain conditions.MoveInputModeonly considers hovers without modifiers as valid to prevent "cursor fight" withMoveViewportInputMode.CanvasControl: Fixed incorrect clipping that could occur when scrollbar visibility has changed.- Fixed
DefsManagerto respect the value of thecleanupTimerIntervalproperty. - Fixed accidental removal of SVG elements in a defs section, e.g.
<filter>, that were only referenced in a<g>element. This also fixesShadowNodeStyleDecorator.
Automatic Layout
PreferredPlacementDescriptor: Corrected the type of the propertyangleRotationOnRightSidefromLabelAngleOnRightSideOffsettoLabelAngleOnRightSideRotation.IncrementalHierarchicLayouter: Fixed bug that caused unsuitable edge routes for grouped edges within group nodes.IncrementalHierarchicLayouter: Fixed bug that causes a violation of strong port constraints of typeANYfor backloop edges.RecursiveGroupLayouter: Fixed possible exception if there are edges that start or end at group nodes.OrthogonalLayouter: Fixed possible exception for graphs with nodes of high degree.DrawingEmbedder: Fixed possible exception.GroupNodeRouterStage: Fixed possible exception that is caused by the missing removal of a temporarily addedDataProvider.EdgeRouter: Fixed exception that occurs sometimes when sphere of action is not set toROUTE_ALL_EDGES.EdgeRouter: Fixed endless loop which may occur in rare cases.OrthogonalEdgeRouter: Fixed possible exception when both optionsreroutingandlocalCrossingMinimizationare enabled.ParallelEdgeLayouter: Fixed possible exception when the source or target points of parallel edges are outside of the corresponding node.BusRouter: Fixed bug that may cause a broken bus structure.BusRouter: Fixed possible stack overflow.- Method
Rectangle2D.intersectsRectanglesometimes returnedtruefor non-intersecting rectangles. This could cause infinite loops inBusRouter.
yFiles for HTML 1.1.0.1 - Changes Since 1.1
Bugfixes
- GraphML: Reading properties of custom types with no attached meta-data or of declared type
yfiles.lang.Objectresulted in: "DeserializationNotSupportedException: Element {x} has collection content for non-collection property {y}." SimpleLabelStyle'sverticalTextAlignmentdid not work correctly in all cases.SimpleLabelStyle'sclipTextfeature sometimes resulted in wrong clips being applied when the style was shared between labels.- GraphML:
Freezableobjects likePenactually got theirisFrozenproperty 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'sisAssignableFromandisSubclassOfdid not work correctly for trait/interface types.- The type-checking debug helper did not accept
functions as values for the variousBindingproperties atGraphSourceandTreeSourceand threw an error which made parts of theInteractiveGraphSourceDemocrash when debugging was enabled. - Setting the
DefsManager'scleanupIntervalproperty had no effect once the manager was in use. - The optional
PortDefaultsPortCandidateProviderclass did not work correctly and resulted in exceptions being thrown when reconnecting edges. - Trying to read empty label texts (with an empty XML element) from GraphML resulted in an exception.
Matrix2D.invert()did not always work correctly for rotation and skew transformations.- Fixed an "<obfuscated> has no method 'isPositiveInfinity'" exception when
RotatedSliderEdgeLabelModelwas used withautoRotationEnabledset totrue. - Tooltips that would extend beyond the visible document were not always positioned correctly.
yFiles for HTML 1.1 - Changes Since 1.0.1
Major Features Added
- New support for edge-to-edge connections in user interactions. Edges can be connected to other edges during edge creation as well as by reconnecting edge ends.
[To the corresponding section in the yFiles for HTML Developer's Guide...] - New class
yfiles.canvas.SvgExportadds 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. - The library no longer contains Apache licensed third party code.
Automatic Layout
- Class
yfiles.router.polyline.EdgeRouteris a new edge routing algorithm that produces polyline edge routes. The segments of an edge are either orthogonal (i.e., the slope of each segment is a multiple of 90 degrees) or octilinear (i.e., the slope of each segment is a multiple of 45 degrees).
[To the corresponding section in the yFiles for HTML Developer's Guide...] 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 classyfiles.hierarchic.incremental.RoutingStyle.yfiles.layout.PreferredPlacementDescriptor: A new descriptor that allows to specify advanced preferred placement information for edge labels.
[To the corresponding section in the yFiles for HTML Developer's Guide...]
Minor Features Added
yfiles.graph.DefaultEdgeIntersectionCalculatornow 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 propertiescropAtPort,extraCropLength, and callback methodgetPortGeometry.
Automatic Layout
yfiles.tree.BalloonLayouter: New option to take into account the bounds of node labels when calculating a layout.yfiles.layout.LabelLayoutTranslatoradded optionautoFlippingto specify whether or not edge labels should be automatically flipped if they would be upside-down.yfiles.labeling.AbstractLabelingAlgorithmadded optionautoFlippingto specify whether or not edge labels associated with a "free" label model should be automatically flipped if they would be upside-down.
Improvements
Automatic Layout
yfiles.layout.GraphLayoutLineWrapper: Improved edge routing for overlapping edges (e.g., grouped edges).yfiles.orthogonal.OrthogonalGroupLayoutersupports labels at edges incident to group nodes.yfiles.hierarchic.IncrementalHierarchicLayouternow treats edge groups at empty group nodes like those on normal nodes instead of ignoring them like it is done for non-empty group nodes.yfiles.tree.GenericTreeLayoutercreates more compact layouts, especially for trees with edge labels.yfiles.partial.PartialLayouter: Now considers edge ports when calculating the barycenter of a component (ifpositioningStrategyis set toSubgraphPositioningStrategy.BARYCENTER).- Added auto-flipping to
yfiles.layout.RotatedDiscreteEdgeLabelLayoutModelandyfiles.layout.RotatedSliderEdgeLabelLayoutModel. Labels that are placed upside down by a layouter will be flipped. yfiles.organic.SmartOrganicLayouter: Now, fixed nodes are not moved by a fixed offset if scope is set toScope.SUBSET.yfiles.hierarchic.WeightedLayerer: Improved quality (i.e., reduced the number of reversed edges) ifweightedCycleRemovalis enabled.- Added the ability to
yfiles.tree.DefaultNodePlacerto produce polyline style edge routings with sloped edge segments. - Added the ability to
yfiles.tree.DefaultPortAssignmentto distribute edges at the border of the nodes. - Improved the performance of
yfiles.layout.PortCandidatewhich potentially improves the performance of theyfiles.hierarchic.IncrementalHierarchicLayouterwith rotated graphs with PortCandidates. - Optimized number of generated
yfiles.layout.PortCandidates inyfiles.layout.RecursiveGroupLayouterfor the core layouter.
Demos
- Added context menu to
demo.yfiles.toolkits.jquery.simple. - Added new demo
demo.yfiles.printingthat shows how to print a CanvasControl's content usingyfiles.canvas.SvgExport.
Bugfixes
yfiles.drawing.IconLabelStylehas been fixed.
Automatic Layout
yfiles.hierarchic.IncrementalHierarchicLayouter: Fixed incorrect handling of port candidates in layouts where rotation and a mirror was set.yfiles.layout.RotatedSliderEdgeLabelLayoutModelandyfiles.layout.SliderEdgeLabelLayoutModel: Improved label placement at zero-length edge segments.- Fixed bug that caused ArrayIndexOutOfBoundsException in
yfiles.hierarchic.incremental.AspectRatioComponentLayerer. - Fixed integer overflow when group compaction is activated in
yfiles.hierarchic.IncrementalHierarchicLayouterwhile layouting extremely large, deeply nested graphs. - Fixed bad edge routings in
yfiles.genealogy.FamilyTreeLayouterwhen there are several marriages between generations. yfiles.layout.IsolatedGroupComponentLayouternow considers labels in group bounds calculation if label awareness is enabled.yfiles.hierarchic.IncrementalHierarchicLayouter: Fixed port handling of edges with a single edge port candidate that is contained in a set of node port candidates.yfiles.orthogonal.OrthogonalLayouterandyfiles.orthogonal.DirectedOrthogonalLayouter: Fixed bug that caused IllegalArgumentException if input graph contains overlapping parallel edges and from sketch mode is enabled (see propertyuseSketchDrawing).
Changes in Default Behavior
yfiles.drawing.ImageNodeStylenow stretches images to fit the node's bounding box. To restore the old behavior, subclassyfiles.drawing.ImageNodeStyleRendererand override methodgetPreserveAspectRatiowith an implementation that returnstrue.- Since with this release
yfiles.graph.LayoutGraphAdaptertranslatesyfiles.model.IMapperinstances in the graph's mapper registry asyfiles.algorithms.IDataMapimplementations that enable data write-back scenarios, the code that deals withIncrementalHierarchicLayouter.LAYER_VALUE_HOLDER_DP_KEYnow behaves differently. In older releases theyfiles.algorithms.IIntValueHolderinterface was queried from the mapper to write back the layer data. Now the data is written directly into the mapper and theIIntValueHolderimplementation is ignored. Seedemo.yfiles.layout.IncrementalHierarchicLayouterfor an example on how to use the respective key.
Automatic Layout
yfiles.partial.PartialLayouter: PropertyedgeRoutingStrategynow disables a previously set customized edge router.
Incompatible API Changes
- The interfaces
IComparableandIObjectComparablehave been moved from namespaceyfiles.systemtoyfiles.lang. - Method
doStartMoveTouchinyfiles.input.MoveInputModehas been renamed todoStartDrag. The old method is available through the compatibility layer. - Methods
GraphMLIOHandler.readFromURIandGraphMLParser.parseFromURIhave been renamed toreadFromURLandparseFromURL, respectively. The old methods are available through the compatibility layer. - The deprecated extension methods in
yfiles.model.MapperExtensionshave been removed. - The deprecated convenience methods
LookupExtensions#getandLookupExtensions#getWithContexthave been moved to the compatibility layer. - Methods
getTargetPortCandidateProviderandgetSourcePortCandidateProviderinyfiles.input.GraphEditorInputModechanged their signatures to acceptyfiles.graph.IPortOwnerinstances instead ofyfiles.graph.INodeinstances. This is in conjunction with support for edge-to-edge connections. Overriding methods need to be adjusted accordingly. - Method
showHitNodeCandidatesOnlyin classyfiles.input.PortRelocationHandlehas been renamed toshowHitPortOwnerCandidatesOnlyto 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 newedgeToEdgeConnectionsAllowedproperty can be set tofalse. - Previously it was possible to cast
DefaultEdgeIntersectionCalculator.INSTANCEto the containing type. The singleton is not of the given type anymore. If you require an instance of that type, consider instantiating one instead.
Automatic Layout
yfiles.layout.IEdgeLabelLayout: Removed propertypreferredPlacementand added propertypreferredPlacementDescriptor.yfiles.partial.PartialLayouter: Replaced methodconfigureOrthogonalEdgeRouterby methodconfigureEdgeRouter.
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
GraphOverviewControlthat have the same signature as the ones used in theGraphControl:GraphOverviewControl.ForDiv(HTMLDivElement)andGraphOverviewControl.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. IEnumerablegot new extension methodsforEachandforEachWithIndexthat make it easy to iterate over all enumerable implementations in the library.- Enumerations where not properly documented in the IDE-support
yfiles-api.jsfile. - 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.
- Added
AddRegistryOutputMapperoverload that takes a serialization handler. - The clean-up timer handling of type
CanvasControland 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
CircularLayouteryielded bad results due to a bug inGroups.biconnectedComponentGrouping.- Tooltips sometimes caused additional scrollbars to appear in the browser and were not cleaned up correctly after uninstallation.
ImageNodeStyle'soutlineShapeproperty was non-functional. Documentation has been updated and the feature can now be used as documented.- The
.cssfile for the library has been moved to thelib/yfiles.cssfile. The demo-framework css file has been renamed todemo-framework.cssto 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
ImageNodeStyleto 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-inputmodule 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.
ShadowNodeStyleDecoratorwas 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.BendAnchoredPortLocationModelcould throw an IndexOutOfRangeException under certain circumstances.- Setting
GraphOverviewControl.graphPaintablehad no effect. CanvasOverviewGraphVisualCreatordid not reset the stroke for drawing edges and therefore always used the last stroke that was set used on the canvas.- Deleting graph elements during interactive edge creation could throw an exception.
- 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.
RotatedSliderEdgeLabelModelcrashed with an undefined method error.DefaultSelectionModelwas not always cleaned up correctly when the domain was changed.SliderEdgeLabelModelthrew 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
MemoryImageNodeStylehas been removed from the package. UseImageNodeStyleinstead. - The type of
ImageNodeStyle'soutlineShapeproperty (and alsoTemplateNodeStyle,TemplateLabelStyle, andTemplatePortStyle) has been changed to acceptGeneralPathinstances. The previous implementation was unusable and had no effect.
yFiles for HTML 1.0
Major New Features
- yFiles for HTML 1.0 is the initial release of yFiles for HTML.