yFiles for HTML Changelog 1.x
yFiles for HTML 1.4.0.1 - Changes Since 1.4
This is the 1st bugfix release for 1.4. There are no incompatible changes since 1.4.
Note that the improvements and bugfixes of this release are part of yFiles for HTML 2.0.1.1, too.
Improvement
- Input modes that use a combination of mouse gestures and modifier key(s) can now recognize modifier presses independently of mouse events. Previously, a changed modifier was only recognized during the next mouse event. A main benefit is that the cursor changes instantly with the key down and up events, for example during node re-parenting.
-
InteractiveOrganicLayouter
: Significant performance improvements during interactive changes of the graph, for example when a user moves nodes.
Bugfixes
View
-
The event
StripeDropInputMode.StripeCreated
always returned a wrong stripe instance. - When manually creating groups and the folding view is configured to collapse group nodes by default, folders were erroneously created with empty size.
-
TableLayoutConfigurator
erroneously considered left side labels as top labels, and consequently might have created insets of incorrect size.
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
,OrganicLayouter
andInteractiveOrganicLayouter
: 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-registeredDataProvider
with 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.considerLabels
was enabled.
Documentation Viewer Improvements
- The detailed descriptions of the methods for event registration and de-registration were not displayed.
- The inheritance hierarchy of a type was not properly displayed.
- In the code generator, corrected the generated code for events.
- Fixed the display of the sidebar in pinned mode.
- The documentation viewer can now be opened from the file system even if third-party cookies are disabled.
yFiles for HTML 1.4 - Changes Since 1.3.0.7
This release brings the new layout features of yFiles for HTML 2.0 to the yFiles for HTML 1.x branch. Unlike version 2.0, the names of existing API are unchanged and have not been harmonized. The view part is unchanged except for one improvement and a small number of bugfixes.
Therefore, this release has no incompatible API changes except minor changes in the module dependencies. In addition, there are some behavior changes in the layout part. Updating code from 1.3 will require only a very small number of changes, if at all.
Major New Features
- New Hierarchic Layout Features
-
Improved incremental layouts of groups with changing bounds. This is especially useful for hierarchic layout of graphs with expandable and collapsible groups. The new Hierarchic Grouping demo shows the improved behavior.
Port grouping. Edges can be bundled at their ports but routed independently.
Undirected edges. This enables to, for example, support mixed graphs that contain both directed and undirected edges. While directed edges typically point in the main layout direction, the direction of undirected edges doesn't matter and such edges may point to nodes in the same layer. This feature also enables to force some edges to specifically point against the main layout direction.
Edge thickness. Edges can now have specified thickness values and minimum distances in the layout will consider these thicknesses.
Recursively routed edges. With this routing style, edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node.
- 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_PORT
andLabelLayoutConstants.PLACE_AT_TARGET_PORT
for edge labels express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of the hierarchic layout. - Automatic Label Placement
-
If the new option
reduceAmbiguity
ofSALabeling
andGreedyMISLabeling
is enabled, these algorithms try to avoid placing labels at positions where it is not clear to which graph element a label belongs.TreeReductionStage
now supports the automatic placement of labels of non-tree edges. Users do not need to take care of such edge labels themselves after using a tree layout algorithm on a non-tree input graph in conjunction with the reduction stage.Similarly, the series-parallel layout now supports the automatic placement of labels of non-series-parallel edges.
- Planar Embeddings
- A new API for working with the planar embedding of planar graphs allows easy iteration of the faces, darts, and consecutive edges of the embedding.
- Clustering
-
Added a k-means clustering algorithm that partitions a given graph in k-clusters to
Groups
.Added a hierarchical clustering algorithm that partitions a given graph based on agglomerative (i.e., bottom-up) strategy and some linkage function (single-, complete- and average-linkage) to
Groups
.
We added settings for these new layout features to the Layout Styles demo.
Improvements
-
The prefix used by
DefsManager.generateUniqueDefsId
can now be changed. -
IncrementalHierarchicLayouter
: Improved support forPortCandidate
s at group nodes. Previously, they were only obeyed if there was just a single candidate defined. Now, out of the given candidates, one is selected and considered for the routing. Still, fixed candidates are treated like free ones and are not supported at the side of group nodes. -
IncrementalHierarchicLayouter
: Routing of grouped edges that connect to nodes of different groups now assures that the whole bus segment remains outside the different group nodes. This avoids that group nodes get unnecessarily large and potentially makes drawings more symmetric. -
IncrementalHierarchicLayouter
: Improved edge grouping such that it is now possible to group incoming/outgoing edges as well as same-layer/backloop edges with common edges. -
IncrementalHierarchicLayouter
: Reduced the number of bends when integrated edge labeling is enabled. -
IncrementalHierarchicLayouter
now takes the original edge route into account to determine the route of a self-loop. -
IncrementalHierarchicLayouter
: Added properties that allow to stop the layout algorithm after the layering or the sequencing phase while skipping the subsequent phases. This may be useful when using two layout runs to collect layering and/or sequencing information in the first run that will be used during the second run. -
IncrementalHierarchicLayouter
: Fixed edges which have segments that should be horizontal or vertical but are slightly non-orthogonal. -
IncrementalHierarchicLayouter
: Improved behavior in incremental mode that moved normal nodes that were in different layers (in the initial layout) to the same layer. This behavior occurred in case there were group nodes that extended into the layer above or below to get a compact result. -
IncrementalHierarchicLayouter
: Added support for overlapping layers. The strict layer structure can be compacted by moving layers up into the space of previous layers. Layers are only moved if it won't produce overlaps with nodes or edges. -
IncrementalHierarchicLayouter
: Added support for sequence constraints between edges as well as nodes and edges, 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.fromSketchMode
andBalloonLayouter.comparator
are no longer ignored when enabling the interleaved placement mode. -
TreeLayouter
andGenericTreeLayouter
now take into consideration the minimum group node size specified by the user with aDataProvider
registered with the graph with keyGroupingKeys.MINIMUM_NODE_SIZE_DP_KEY
. -
GenericTreeLayouter
: ImprovedDefaultPortAssignment
to considerPortConstraint
s in all modes. If a distributed mode is selected, then weak constraints will also be distributed on the according side. -
LayeredNodePlacer
: Improved spacing between labels and bends when polyline labeling is enabled. -
Improved the performance of
SALabeling
andGreedyMISLabeling
, especially for large graphs. -
Improved support for
PreferredPlacementDescriptor
side preference (left, on-edge, right) when using generic labeling algorithmsSALabeling
andGreedyMISLabeling
. Now, the side preference is considered for edge labels with arbitraryEdgeLabelModel
implementations. -
Improved the performance of
EdgeRouter
when routing edges that havePortConstraint
s orPortCandidate
s. -
EdgeRouter
will now consider the target group of an edge if this edge is the only member of its source group. -
EdgeRouter
: Improved edge routes of self-loops to go around at least one corner of the node. Only if both source and target port are restricted to the same side (with aPortConstraint
orPortCandidate
), self-loops may start and end at the same side of the node. -
InteractiveOrganicLayouter
: Fixed possible performance problem after changing the inertia/stress of some nodes. -
SeriesParallelLayouter
now takes into consideration minimum node sizes specified by the user. -
MultiPageLayouter
: Added new optionMultiPageLayouter.strictClusterSeparation
that 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
OrthogonalSegmentDistributionStage
and thus alsoChannelEdgeRouter
which by default uses the mentioned stage as edge distribution strategy. -
ChannelRouter
: Improved order of segments to avoid edge crossings when there are multiple segments that have one common end point. -
Added layout stage
CurveFittingLayoutStage
which allows the approximation of edge paths with cubic Bezier curve control points. The stage is especially useful if curved edges are modeled using a large number of bends connected via straight lines. -
Added layout stage
HandleNaNCoordinatesStage
which prevents layout algorithms that take initial coordinates for nodes and edges into account from failing if some of those graph elements haveNaN
-coordinates. -
Improved the performance of
PartialLayouter
for 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 theautoFlip
ortrimming
properties had no visible effect until a visual was created anew with thecreateVisual
method. -
The property
SizeChangedEventArgs.oldSize
contained the new size instead of the old size in some cases. -
MouseHoverInputMode
: The tooltip of the very first hover did not appear. -
Added the flag
yfiles.workaroundCR701075
that enables a workaround for occasional rendering issues in Chrome 57. This is due to Chrome 57 not properly rendering the applied transform matrix. The workaround is automatically enabled in the yFiles demo applications when opened in Chrome 57.
Incompatible Changes
Breaking API Changes
-
The module
yfiles/layout-circular
has been merged with the moduleyfiles/layout-organic
. If you have references toyfiles/layout-circular
replace them withyfiles/layout-organic
. -
The module
yfiles/layout-planar
has been merged with the moduleyfiles/layout-orthogonal
since it contained no public API and is only used from the latter module. If you have references toyfiles/layout-planar
replace them withyfiles/layout-orthogonal
.
Behavior Changes
-
The following layout algorithms have more sensible default values.
-
CanonicMultiStageLayouter
andMultiPageLayouter
: The defaultlabelLayouter
is now set to an instance ofSALabeling
. -
OrthogonalEdgeRouter.crossingCost
: The default value is now1.5
instead of0.0
. -
CompactOrthogonalLayouter
: TheCompactOrthogonalLayouter.OrthogonalShortestPathPathFinder
which is used as default path finder strategy now uses value1.5
as default for propertycrossingCost
instead of0
. -
PartialLayouter.minimalNodeDistance
: The default value is now10.0
instead of0.0
. -
MultiParentDescriptor.minimumNodeDistance
: The default value is now15.0
instead of10.0
. -
BalloonLayouter.minimalNodeDistance
: The default value is now10.0
instead of0.0
. -
SALabeling.deterministicMode
: The default value is nowtrue
instead offalse
. -
SplitEdgeLayoutStage.proxyNodeSize
: The default value is now1.0
instead of0.0
.
-
-
Most of the property setters of the types of the layout part now throw an error if an invalid, illegal, or
null
argument is given as input. -
IncrementalHierarchicLayouter
may now place source/target labels in layers that contain common nodes. In previous versions such labels were always placed in separate layers which often led to less compact drawings with superfluous bends. -
IncrementalHierarchicLayouter
: The edge grouping now supports to group incoming and outgoing edges of a node. In previous versions incoming and outgoing edges always defined separate groups even though the user specified the same group IDs for such edges. -
Method
IncrementalHierarchicLayouter.integratedEdgeLabeling
does now always returnfalse
if the labeling algorithm is disabled. In previous versions it was only required that an appropriate labeling algorithm was specified, but it was not necessary that it is enabled. Therefore, the integrated labeling state queried from the property might not have corresponded to what the layout algorithm actually did. The same behavior change applies to the following methods:IncrementalHierarchicLayouter.considerNodeLabels
DirectedOrthogonalLayouter.integratedEdgeLabeling
DirectedOrthogonalLayouter.considerNodeLabels
OrthogonalLayouter.integratedEdgeLabeling
OrthogonalLayouter.considerNodeLabels
OrthogonalGroupLayouter.integratedEdgeLabeling
OrthogonalGroupLayouter.considerNodeLabels
-
IncrementalHierarchicLayouter
: Geometry information specified forIncrementalHierarchicLayouter.ALTERNATIVE_GROUP_BOUNDS_DP_KEY
andIncrementalHierarchicLayouter.ALTERNATIVE_EDGE_PATH_DP_KEY
is now automatically rotated according to the specified layout orientation. This fixes unstable from-sketch behavior in incremental layout mode when using an orientation other than top-to-bottom. -
IncrementalHierarchicLayouter
: For input graphs with infeasiblePortConstraint
s andPortCandidate
s/PortCandidateSet
s (i.e., for edges that have non-matching port constraints/candidates), the layout algorithm now always prefersPortConstraint
s. In previous versions, the behavior was not well-defined for such cases. -
PortCandidateAssignmentStage
: Now, if an edge has registeredPortCandidate
s and connects to nodes withPortCandidateSet
s, the stage will try to match both collections to find an appropriate port. In case there is no matching port candidate, aPortCandidate
specified for the edge is preferred. Before, one of thePortCandidate
s was selected without trying to match with node port candidates. -
SmartOrganicLayouter
does no longer resize empty group nodes, possibly ignoring a minimum group node size for them. The behavior with respect to empty group nodes is now in line with the behavior of other common layout algorithms. The same behavior change applies forOrganicLayouter
with group policy settingOrganicLayouter.IGNORE_GROUPS_POLICY
, where previously empty groups were resized too. -
Method
CompositeLayoutStage.canLayout
now checks if all theLayoutStage
s of the pipeline can layout the given graph and does not return alwaystrue
. -
Method
SingleCycleLayouter.canLayoutCore
now returnsfalse
ifnull
is given as input. -
Method
Centrality.closenessCentrality
now sets the closeness of a node toInfinity
if the sum of the shortest path distances is0
. Before, it was set toNaN
in such cases. -
Method
SingleCycleLayouter.nodeSequencer
now allows to specifynull
to return to the default sequencer. In previous versions, specifyingnull
led to an error. -
Method
GraphTransformer.operation
now only sets the operation value and does not disable the automatic selection of best fitting rotation angle if an operation other thanROTATE
is selected. -
Method
OrthogonalLayouter.integratedEdgeLabeling
now throws an error if the current label layouter is not of typeLabelLayoutTranslator
. -
Constructor
TreeComponentLayouter
throws an error ifnull
is given as argument. -
Centrality
: The following methods can now take emptyNodeMap
s andEdgeMap
s as arguments for returning the resulting centrality values.Centrality.edgeBetweenness
Centrality.nodeBetweenness
Centrality.nodeEdgeBetweenness
yFiles for HTML 1.3.0.7 - Changes Since 1.3.0.6
Bugfixes
-
CanvasComponent
: Key events had no effect if the component was part of a shadow DOM. The component's div element always lost the focus on keydown. -
Instances of
GraphEditorInputMode
andGraphViewerInputMode
were not garbage collected due to a non-removed event listener in theclickInputMode
. -
Hiding
INodeSnapResultProvider
orIBendSnapResultProvider
from the lookup no longer leads to a crash when nodes or bends are moved. -
PolylineEdgeStyle
: Toggling the pen between dashed and solid styles did only work once. Then, the SVG path stayed at solid regardless of the pen's dash style. -
SmartEdgeLabelModel
: Once again, labels at the first segment snap properly at the layout of the source node. Since 1.3.0.6, some snap positions were overlapping with the source node.
Layout
-
Fixed a bug in
TableLayoutConfigurator
which altered the size of a column or row if an edge routing algorithm was applied. -
MultiPageLayouter
: Fixed rare bug that caused straight-line edge routes instead of orthogonal routes. -
SmartOrganicLayouter
andOrganicLayouter
: 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.js
able to deal withpaths
syntax. -
Removed unused
LabelInsetsProvider
implementation indemo.yfiles.layout.layoutstyles
.
Bugfixes
-
Added the flag
yfiles.workaroundIE7766782
that enables a workaround for the Internet Explorer JIT bug 7766782, which can cause class initialization errors when using the yFiles for HTML GWT Overlay in Internet Explorer, especially when the GWT Overlay is used in combination with Smart GWT. -
Made the
IEnumerable.getMultiProjection
andEnumerableExtensions.selectMany
implementations non-recursive to avoid stack overflows. -
Made
SvgExport
helper class more resilient against zero sized exports. -
The
CreateEdgeInputMode.EdgeCreated
event triggered before the corresponding undoable edit was committed. This could result in a broken undo queue, if e.g. an animated layout was started during in the event listener. The event now triggers after the edit has been committed. With automatic undo unit merging, this should not make a difference for the end user, however from the perspective of the code there will be two subsequent edits, rather than one compound, if the code in the listener actually modifies the edge. -
The license validation always failed for users of some (mostly older) browsers in specific scenarios:
Locale ISO 639 Code Affected Scenarios Estonian et Only Licenses with watermark Finnish fi Only License with watermark Swedish sv Only License with watermark Hawaiian haw Always Tamazight tzm Always The following browsers were affected:
- IE before version 11
- Firefox before version 29
- Chrome before version 24
- Opera before version 15
- Safari (all versions)
-
Prevent
null
exceptions when interacting with aGraphOverviewControl
before assigning aGraphControl
to theOverviewInputMode
. -
OverviewInputMode
could break the overview visualization if the overview has a very small width or height. -
SmartEdgeLabelModel
: Edge label snap lines have been too short for some positions that are far apart from the edge path. -
SmartEdgeLabelModel
: An exception was thrown if the path of the corresponding edge contained bends that were close together or at the same location. - Folding: the view state of a port on a folder node was sometime ignored when a folding edge was created.
-
Fixed several issues with orthogonal edge editing.
- When dragging the source/target port/node of an orthogonal edge, the bends created during the drag were not cleaned up after canceling the gesture by pressing the ESC key.
- Orthogonal edges could be made non-orthogonal by re-connecting the source port to the target port location (creating a self-loop), or vice versa.
-
Explicit
Arrow
elements in GraphML were sometimes read back incorrectly. The new deserialization propertySerializationProperties.ParseArrowElementAsDefaultArrow
can be used to work around this issue. - GenericPortLocationModel wasn't serialized correctly.
-
Table.setStyle(ILabel, ILabelStyle)
andTable.setLabelModelParameter
ignored the provided style resp. label model parameter. -
PathBasedEdgeStyleRenderer
could leave visual artifacts when switching to an arrow that returned a null visual. -
KeyboardInputMode now passes the original
CompoundKeyEventArgs
to registered event handlers instead ofEmptyArgs
. - Touch move events have an effect only if the corresponding touch down event also happened within the GraphControl.
-
The
IsDown
property of aTouch2DDevice
was alwaysfalse
after the first touch up event of that device, e.g. after the first tap of a double tap.
Layout
-
IncrementalHierarchicLayouter
: fixed rare error triggered inAsIsSequencer
for edges incident to group nodes that have a sketch without bend points as well as port constraints. -
IncrementalHierarchicLayouter
: fixed bug that may cause non-orthogonal segments of grouped edges even though orthogonal edge routing is enabled. -
IncrementalHierarchicLayouter
: improved compactness of layouts that feature group nodes with insets and (group) nodes with halos (NodeHalo
). Previously, the specification of halos could enlarge the insets of group nodes by an unnecessary large amount. -
IncrementalHierarchicLayouter
: Fixed bug that sometimes caused the route of back-loop edges with at least one endpoint incident to a group node to unnecessarily enter this group node. -
IncrementalHierarchicLayouter
: Fixed rare bug that caused same-layer edge to cross through their source or target node, e.g., the port was at the top of the source node but the edge crossed through the source node to leave it at the bottom. -
IncrementalHierarchicLayouter
: Fixed rare bug that may caused overlaps between labels and segments of edges with octilinear routes. -
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 strongPortConstraint
s or fixedPortCandidate
s. -
SmartOrganicLayouter
andOrganicLayouter
: 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 noDataProvider
with keyPARTIAL_NODES_DP_KEY
is registered with the input graph. -
EdgeRouter
: Fixed bug that caused violations of minimum first/last segment lengths of grouped edges when using different edge layout descriptors and, second, made the layout algorithm remove a user-registeredDataProvider
with 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.multipage
that prevents re-entrant layout calls. - Feature
DefaultDummyNodeConverter.initialSize
in Getting Started tutorial steps 11, 12 and 13. - Added custom layout stage to the tree layouter of
demo.yfiles.layout.layoutstyles
which 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.orgchart
was called before the application was initialized. Made sure that the application has been initialized before creating the graph. - The graph in
demo.yfiles.graphml.graphml
is now updated lazily after the GraphML source has not been modified for 1 second to prevent cumulative updates on every keystroke.
Bugfixes
Viewer
- Improved the performance of
yfiles.drawing.TextRenderSupport.determineMeasureMode
for the first label measure call. - Fixed 'not a finite floating-point value' exception which occurred when the size of the
GraphControl
is zero during an animation. - Added the flag
yfiles.workaroundIE2337112
that enables a workaround for disappearing 'use' elements in Internet Explorer 11 on Windows 10. The workaround is automatically enabled in yFiles demo applications that use the demo framework for IE11 on Windows 10. - GraphML deserialization: Changed default value for arrows without an explicit
ArrowType
fromArrowType.NONE
toArrowType.DEFAULT
. - GraphML serialization: Whitespace in XML attributes was not escaped correctly.
- Specifying a
DesignerSerializationVisibility
for collection properties did not work. TypeConverter
was erroneously part of the yFiles for HTML Layout package and has been removed from it.
Layout
IncrementalHierarchicLayouter
: fixed error that could happen inAsIsSequencer
when 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 specifiedPortCandidate
has multiple directions.IncrementalHierarchicLayouter
: Fixed bug with some ignored any side strong port constraints.IncrementalHierarchicLayouter
: Fixed bug that resulted in edges whose segments are not on grid.Polyline.EdgeRouter
: Fixed bug that caused routed edges to sometimes share the same port as fixed edges.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 install
first).
yFiles for HTML 1.3.0.4 - Changes Since 1.3.0.3
New and Improved Demos
- The demo
demo.yfiles.graph.largegraphs
illustrates different approaches and their performance for rendering large graphs. - The demo
demo.yfiles.graphml.graphml
provides a live view of the graph's GraphML representation to provide an insight into GraphML serialization. - The demo
demo.yfiles.graph.neighborhood
shows how to implement a neighborhood view of the selected graph item. - The demo
demo.yfiles.toolkit.react
shows how to integrate the yFiles graph control into a React project. - The
demo.yfiles.graph.svgexport
anddemo.yfiles.graph.pdfexport
demos show how to export the diagram to SVG or PDF, respectively. - The demo
demo.yfiles.graph.tableeditor
shows a new, optimized table style. - The
demo.yfiles.graph.imageexport
demo now also supports server-side image export.
Layout Improvements
IncrementalHierarchicLayouter
: Reduced number of overlaps of group nodes containing elements with head or tail sequence constraints.- Improved abort handling for algorithms that use
ConstraintIncrementalLayerer
,ConstraintLayerer
andTopologicalIncrementalLayerer
. For large graphs these classes may require a long runtime that cannot be canceled by using anAbortHandler
.
Bugfixes
Viewer
TemplateNodeStyle
andStringTemplateNodeStyle
no 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_COMMAND
now 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
NodeDropInputMode
and filtered graphs. - Changed the default value of
GridVisualCreator.abberationTolerance
to 50 to switch off grid hiding by default. - Fixed the visualization of grids of the style
GridStyle.Crosses
. - The property
CanvasControl.fitContentViewMargins
is now considered correctly even if the values for left and right (or top and bottom) are different. Previously, the content was always centered in the view. - GraphML deserialization errors are now ignored if the flag
yfiles.graphml.SerializationProperties.IGNORE_XAML_DESERIALIZATION_ERRORS
is set. - Fixed an error while loading GraphML files that were created with yFiles WPF and contained labels.
Layout
IncrementalHierarchicLayouter
: Fixed an error that causedPortCandidate
s to potentially be ignored or not handled correctly for self-loops when having directions other thanPortCandidate.NORTH
,PortCandidate.SOUTH
,PortCandidate.WEST
orPortCandidate.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 defaultEdgeLayoutDescriptor
instead of aDataProvider
with individual descriptors.Polyline.EdgeRouter
: Fixed side handling of external strong ports.Polyline.EdgeRouter
: Fixed rare bug that may cause a stack overflow.GreedyMISLabeling
andSALabeling
: 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.alignDegreeOneNodes
is enabled.SimplexNodePlacer
: Fixed an error that disabled label compaction feature.BalloonLayouter
: Fixed an error that causedBalloonLayouter.CHILD_ORDERING_POLICY_SYMMETRIC
not 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.VERTICAL
andDelegatingNodePlacer.HORIZONTAL
along with methodsDelegatingNodePlacer.Orientation
are deprecated since they had no effect.Trees
: fixed methodCenterRoot
that 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.paste
exits.
Documentation Viewer Improvements
- Fixed the display of text-only "see also" references.
- Removed the filter text field of the api tree component, because it could easily be mistaken as the main search box, but the search box provides a much better search experience.
- When following a link to a type member, the target tab sometimes didn't scroll to the documentation of that member.
yFiles for HTML 1.3.0.3 - Changes Since 1.3.0.2
Bugfixes and Demo Improvements
Viewer
- 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.workaroundCR570845
property can be set to a delay in milliseconds that should be tolerated before running the queued functions usingwindow.requestAnimationFrame()
. The default value ofyfiles.workaroundCR570845
is-1
, which disables the workaround. The workaround is automatically enabled in yFiles demo applications that use the demo framework for Chrome versions later than 46. - Fixed a dragging bug on IE9 where the node dragging stops if the item is dragged out of the
GraphControl
and back in. - Added
charCode
property toyfiles.input.KeyEventArgs
, which gets the charCode of the original event. Also fixedkeyValue
property inyfiles.input.CompoundKeyEventArgs
, which previously returned an empty string. - Fixed
Control.onKeyPress
, that almost never was called. This also had the effect that theCanvasControl.CompoundKeyTyped
event was not fired. - Fixed a bug in IE11 on Windows 7 where mouse events were fired during dragging although the mouse has not been moved.
- Prevent IE from entering an event loop multiple times on the same coordinate when using touch input in
DragDrop
. Thus touch input behaves the same as mouse input, where this was already in place. - Fixed inconsistent input mode states when dragging the mouse out of an iframe containing the graph control and releasing the mouse button outside the iframe.
- Fixed a bug in browsers without deep
document.importNode
support (e.g. IE9) where attributes of inlined images were wrong after exporting the graph 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
TreeSource
andAdjacentNodesGraphSource
where 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.Mouse2DDragged
events 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.value
is 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.interactiveorganic
where the graph suddenly froze when dragging a node shortly after application start. - New nodes in
demo.yfiles.binding.interactivegraphsource
et al. are not placed into the top layer anymore, but are fitted nicely in the existing layout during update. - Fixed an issue in
demo.yfiles.graph.orgchart
where an exception occurred when changing node selection while no node was currently visible. - New design for social-network graph in
demo.yfiles.graph.viewer
.
Class Framework
fixMethods
is now available in both namespaces,yfiles.util
andyfiles.lang.util
.
Demo Framework
- Fixed possible overlapping and unintentional resize of the side panels.
New Demos
- New
demo.yfiles.graph.networkmonitoring
shows a monitoring tool for a network with simulated traffic and random failures.
yFiles for HTML 1.3.0.1 - Changes Since 1.3
Bugfixes and Demo Improvements
Viewer
- GraphML: Primitive data types such as
string
ornumber
were written to the wrong XAML namespace, thus breaking interoperability with other yFiles platforms. - CSS classes set on the div element before calling
CanvasControl.ForDiv
orCanvasControl.ForId
are not overwritten anymore. Instead the classyfiles-canvascontrol
is appended to the existing classes. - Added a dedicated class for the main
CanvasControl
SVG to prevent implicit CSS styling of all SVGs inside the canvas (e.g. in graph item styles). OverviewInputMode
now uses the value 0.00000001 as minimum zoom, instead 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
TextRenderSupport
whereTextMeasureMode.SVG
was used instead ofTextMeasureMode.CANVAS
. - Text height measurement with
TextMeasureMode.SVG
returned the wrong height on single line string if the string only contained characters lower than full line height, e.g. lower case characters, spaces etc.
Demos
- InteractiveOrganic Demo: Fixed a performance issue caused by newly created unconnected nodes where the graph stuttered while moving the connected components. Also disallowed label adding.
- BPMN Editor Demo: The nodes with blue border are not treated as group nodes anymore.
- Table Editor Demo: A flag prevents re-entrant layout execution.
- Fixed an invalid line of code in the source code comments of step 24 of the Custom Styles Tutorial.
- 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
OrthogonalEdgeRouter
with the newerEdgeRouter
as 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.dragSize
andGraphControl.hitTestRadius
to improve user experience on different input devices (touch, pen and mouse).
yFiles for HTML 1.3 - Changes Since 1.2.1.4
Major Features Added
Viewer
-
GraphControl
integrates itself much better into web pages since it no longer stops the propagation of any keyboard, mouse, touch and pointer events that passes through it. In addition,preventDefault()
is now only called on mouse events, touch events, pointer events, and on keyboard events that actually trigger an interaction. Especially, it leaves all other keyboard events untouched.If the default behavior doesn't fit your requirements, whether or not to call
preventDefault()
on events that pass the GraphControl can be separately specified for the three types of events (keyboard, pointer, and context menu).This makes it possible for example to call a default browser action even if the GraphControl has the focus and to change the focus to and from a GraphControl with the Tab key.
-
With the new property
GraphControl.mouseWheelBehavior
, customers can specify when awheel
/mousewheel
event should be handled: never, always, or only when focused. In addition, it is now easily possible to specify whether the mouse wheel scrolls or zooms the GraphControl.Together with the less restrictive event prevention, this makes it possible to scroll the whole web page even if the cursor is over a GraphControl.
- Graphs can now be saved as file download in several recent browsers, namely Chrome 38+, Firefox 28+, IE 10+, Opera 25+, and recent versions of the related mobile browsers. Saving can be done either with the method
GraphControl.saveFile
or with custom code. The latter is shown in detail in the File Operations demo and allows further customizations, for example adding support for more browsers. - Improved the module file format. The yFiles modules now follow the Universal Module Definition (UMD) pattern, offering compatibility with the most popular script loaders and JavaScript environments.
Using UMD, the yFiles modules easily support a variety of different loading schemes: lazily using an AMD loader like RequireJS, with CommonJS in Node.js applications or Browserify web projects, or simply via an object in the browser's global scope. Several new demos show examples of how to use the different loading schemes.
GraphClipboard
now supports copying independent items. This allows the user to copy labels, ports, bends, or edges to other elements without having to copy their owners. Also this technique allows for copying an item (for example a label) to multiple target elements at once.In addition, the
GraphClipboard
now supports an optional target location for pasting and the new methodGraphEditorInputMode.pasteAtLocation
can be used to this end, too. In addition,ApplicationCommands.PASTE
now supports an optional parameter of typeIPoint
to provide a target location.-
Node and edge labels can now snap to particular locations while moving them interactively. Both types of labels can be aligned horizontally or vertically to their original location. In addition, a node label can be aligned with the borders or the center of its owner, and during resizing of that owner, smartly keeps its relative location to the snapped position. An edge label can be snapped on the path of its owner, or at particular distances of it.
This feature can be enabled and configured with a
LabelSnapContext
and is available for labels with one of these label models:SmartEdgeLabelModel
,FreeEdgeLabelModel
,FreeNodeLabelModel
, 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
. GraphEditorInputMode
andTableEditorInputMode
provide new eventsLabelTextEditingStarted
andLabelTextEditingCanceled
that are raised directly before the label text editor is shown and after the label editing has been canceled, respectively.- Double clicking nodes and edges now opens the label editor. An existing label can be double clicked to edit the label text. This feature can be disabled with the property
GraphEditorInputMode.doubleClickLabelEditingAllowed
. IEditLabelHelper
implementations provided by theILabel
's lookup can now be used to forbid or customize the editing of individual labels. ClassLabelDecorator
provides a new propertyeditLabelHelperDecorator
to customize this feature.GraphEditorInputMode.editLabel
andTableEditorInputMode.editLabel
can now be used withSimpleLabel
instances. This provides editing capabilities for dummy elements such as legends, page headers or other textual elements.
- Uses the various callback methods on
GraphEditorInputMode
,TableEditorInputMode
andIEditLabelHelper
implementations in a consistent way, regardless of how many labels or labeled items are edited or added, and independent from how the editing/label creation process has been started (e.g. through a command or programmatically through the input mode convenience methods). - Determines the actual labeled item that is modified when multiple elements are selected in a consistent way.
- 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
SeriesParallelLayouter
for series-parallel graphs. Such graphs are directed graphs with a single source (a node without incoming edges) and a single sink (a node without outgoing edges) that are build using only the following two rules:- Series composition: The source of a subgraph is merged with the sink of another subgraph.
- Parallel composition: The sources and sinks of two subgraphs are merged.
- Added multi-parent support to
GenericTreeLayouter
. A tree node can have multiple parents that are connected to all of its siblings and share the same parents. This might come to use in organizational charts where a team answers to multiple superiors. - Added grid placement support for nodes and edges to
IncrementalHierarchicLayouter
.
Minor Features Added
Viewer
GraphEditorInputMode
got support for cyclic click selection. This helps in conveniently selecting items that are hidden behind other items. By default, this features is bound to the Alt key being pressed. It can be disabled by setting thecyclicSelectionRecognizer
property toEventRecognizers.NEVER
.-
GraphEditorInputMode
now provides default action for duplicating single graph items or whole subgraphs. This also works with incomplete subgraphs, for example in a tree, it is possible to duplicate a subtree and the tree will never be disconnected.In addition, the new command
GraphCommands.DUPLICATE_COMMAND
(shortcut: Ctrl-D) and the new methodGraphClipboard.duplicate
can be used to duplicate selected items without altering the clipboard contents. GraphEditorInputMode
now provides a default action for reversing edges. To this end, the methodsreverseEdge
andreverseEdges
have 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
. GraphClipboard
has new propertiescopyItems
,independentItems
, anddependentItems
that allow for restricting the types of items that can be copied at all, independently from their owners, or implicitly through their owners, respectively.GraphViewerInputMode
: The click hit test order can now be configured by propertyclickHitTestOrder
.GraphEditorInputMode
andGraphViewerInputMode
provide an explicit hit test order for double clicks that can be changed through thedoubleClickHitTestOrder
property. By default, this hit test order prefers labels over other graph elements.- Added new methods
ClickInputMode.preventNextDoubleClick
andTapInputMode.preventNextDoubleTap
that can be used in event handlers for single clicks/taps to prevent that this click can become part of a double click event. NodeDropInputMode
can now optionally drop nodes onto leaf nodes and thus convert the leaves into group nodes. Also it is possible to drop nodes into collapsed folder nodes. For both use-cases, an opt-in property has been added and a predicate property allows for fine-grained control over this feature.- Similarly, leaf nodes can now be the target of a reparenting gesture if the property
GraphEditorInputMode.reparentToLeavesAllowed
is enabled. In this case, leaves are converted into group nodes. ItemDropInputMode
does now support touch gestures to Drag'n'Drop graph items into a graph.- Added support for deleting bends in a way that an orthogonal edge remains orthogonal after removing the bends. The new property
GraphEditorInputMode.orthogonalBendRemoval
enables/disables this feature. GraphViewerInputMode
now supports multi-selection with Ctrl+Click and marquee selection. The latter is disabled by default.OverviewInputMode
and theGraphOverviewControl
have been optimized to improve the user experience when used on touch devices.-
SvgExport
can now correctly handle styles with external image references. This requires an asynchronous approach and therefore, the API of this class has been changed accordingly. The new API is shown in the Image Export demo. The compatibility layer describes how to map the previous API to the new one.In addition, characters that are not part of the Unicode Basic Multilingual Plane are now exported correctly.
- Improved
GraphModelManager
to allow for easier customizations. PropertyuseHierarchicNesting
was added to allow for adding custom logic that uses a different approach to hierarchic nesting. In addition, the return types of some of the factory methods where made less restrictive to allow for further modifications. FoldingManager
now offers two convenience methods,updateViewStatesForNode
andupdateViewStatesForEdge
, that will trigger update calls onIDummyNodeConverter
andIDummyEdgeConverter
for elements that are currently being displayed in a view. This makes it easier to synchronize state between the master graph and the folded graph views in case this is not automatically performed by the default implementation.
Layout
AbortHandler
: Added the methodhasCheckFailed
that allows to query whether a check method was called after a stop or cancel event.- Added the interface
ILabelLayoutFactory
that provides methods for creating, adding and removing node/edge labels to 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 propertynodeCompaction
that allows to place adjacent nodes of a layer in a more compact, stacked style.- Added vertical alignment option for
DefaultNodePlacer
andSimpleNodePlacer
. 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
,LayeredNodePlacer
andDoubleLinePlacer
. 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
GroupedNodePlacer
that allowsGenericTreeLayouter
to place siblings into different groups. RecursiveGroupLayouter
: Added the propertyInterEdgeRouter
to specify the edge router that layouts the edges that cross group node bounds. Thus, it is not necessary to subclass the layouter to change inter-edge routing anymore.- Added the layout stage
KeepStrongPortConstraintsStage
which ensures that layout algorithms that cannot handle port constraints keep the ports of edges with strong port constraints. - Added the layout stage
PortCandidateAssignmentStage
which assigns edges to the ports specified byPortConstraint
s orPortCandidate
s after calling the core layout.
Improvements
Viewer
- Simplified the API related to context menus. Namely, custom context menus need no longer implement the interface
yfiles.input.IContextMenu
, and thus that interface and its usages in the API have been removed. See the API Changes for details.In addition, the context menu implementation of the demo framework was refactored accordingly. It is now a short, standalone class that depicts the integration of a custom context menu much clearer.
The new property
ContextMenuInputMode.swallowCloseClick
specifies whether a mouse click in the canvas while a context menu is open should create a node or just close the menu. - Modernized the CSS styling of the scrollbars of the
GraphControl
. The new styling was already part of the demo framework and thus used by various demos but it was not included in the library's CSS 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,
ShapeNodeStyle
and styles that use aGeneralPath
. GraphEditorInputMode.detailSelectionRecognizer
is now also applied for double clicks to determine the clicked item.GraphEditorInputMode
andGraphViewerInputMode
don't select or focus graph items styled with a void style (VoidNodeStyle
,VoidEdgeStyle
,VoidLabelStyle
, andVoidPortStyle
). The new propertyvoidStylesIgnored
specifies whether this feature is enabled.GraphEditorInputMode
andGraphViewerInputMode
: the new protected methodshouldSelect
can be overridden to determine whether an item can be selected in general.OverviewInputMode
: The new propertymargins
specifies margins for the visible area of the boundGraphOverviewControl
. The new protected methodupdateVisibleArea
provides further means for customizing the visible area.CompositePositionHandler
: Added methodsgetPositionHandler
andgetHandle
to retrieve an earlier addedIPositionHandler
orIHandle
.PortRelocationHandle
s now triggers theEdgePortsChanged
event of theGraphEditorInputMode
.TableLayoutConfigurator
: Improved support for routing algorithms.IGraph
: The collection models of graph items returned by the propertiesnodes
,edges
, etc. now support the methodsremove
andclear
to remove graph items from the graph. Note that calling the methodadd
is still not allowed.GraphModelManager
: New callback methodonGraphChanged
.LayoutExecutor
: The new propertyconsiderViewportLimiter
can be enabled to let the target viewport after a layout respect theViewportLimiter
of theGraphControl
.
TheViewportAnimation
has a new propertyconsiderViewportLimiter
for the same purpose.LayoutGraphAdapter
now adds data providers that map each node, edge and label of aLayoutGraph
to their correspondingIModelItem
in the originalIGraph
. Especially, these data providers are available if a layout is run with aLayoutExecutor
or the convenience methodsLayoutExtensions.morphLayout
andLayoutExtensions.applyLayout
.GeomSupport
: The new methodcreateSmoothedPath
creates a new path as copy of a given one but with smoothed bends.SimpleAbstractEdgeStyle
: The new methodupdateArrows
can by called fromupdateVisual
to update the arrow visualisation if needed. Previously, the arrows had to be created anew in this case.- A template style now automatically updates a visual it has created if the object in the item's
tag
is exchanged. Note that this check considers 'reference equality' not 'value equality'. CollapsibleNodeStyleDecoratorRenderer
: The methodaddToggleGroupStateCommand
is now public and static to make it easier to use it from custom code. Due to this, its signature was slightly changed.IconLabelStyle
: The icon is added to the hit test area for mouse clicks and marquee selection. This can be switched off by overridingIconLabelStyleRenderer.shouldHitTestIcon
.CanvasControl
: MethodfitContent
now respects theViewportLimiter
. This might result in zoom levels greater than1.0
.CanvasControl
: The new size change detection techniqueSizeChangedDetectionMode.SENSOR
supersedes the previous timer-based technique as default since it provides instant notification about size changes. The propertysizeChangedDetection
can be used to specify the desired technique explicitly.DefaultDummyEdgeConverter
now synchronizes thetag
property of the first label if label synchronization is enabled.GraphCopier
has been improved to facilitate manipulation of the copied items:- The new events
NodeCopied
,EdgeCopied
,LabelCopied
, andPortCopied
are dispatched after a model item has been copied. - The method
getOrCreateCopy
is 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
GraphSource
andTreeSource
got new methods to get the graph item for a business object and vice versa. GraphSource
andAdjacentEdgesGraphSource
can now be used with only anedgesSource
(in other words, without anodesSource
) if the propertylazyNodeDefinition
is enabled.TreeSource
got support for group and location bindings, similar to the other data binding classes. Due to this, the signature of its methodscreateNode
andupdateNode
changed.- The HTML5
WheelEvent
is now used as primary API for mouse wheel events. This does not change the behavior and the previousMouseEventWheel
andMouseScrollEvent
are 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 propertynodeEdgeOverlapAvoided
is enabled (see propertygroupNodeCompactness
).SmartOrganicLayouter
: Improved node overlap removal (see propertynodeOverlapsAllowed
). Now, if the scope is set toSCOPE_SUBSET
orSCOPE_MAINLY_SUBSET
, the number of node overlaps that cannot be removed is reduced.LayeredNodePlacer
: Reduced overlaps between edges and node labels for all routing styles.GridNodePlacer
: Corrected alignment of child nodes and edge routing when there are node labels.AbstractRotatableNodePlacer.RootAlignment
,DefaultNodePlacer
andDendrogramPlacer
: Instead of aligning bounding boxes including nodes and their labels, nodes are aligned directly with other nodes. Therefore a layout with node labels gets more compact and the alignment is consistent with that of graphs without node labels.DelegatingNodePlacer
: Added support for a child comparator for children of local root nodes.GenericTreeLayouter
now ignores labels with zero width or height in all distance calculations.GenericTreeLayouter
:NodePlacer
implementations now also use the specified spacing as minimum distance between different subtrees.PartialLayouter
: Reduced the number of element overlaps if there are partial group nodes.ParallelEdgeLayouter
now always separates parallel edges according to their direction. In other words, edges (v,w) and (w,v) are never placed interleaved.SALabeling
andGreedyMISLabeling
: Both algorithms now also consider the node/edge overlap penalty specified by aLabelCandidate
.- Improved abort handling for algorithms that use
ConstraintIncrementalLayerer
,ConstraintLayerer
andTopologicalIncrementalLayerer
. 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.browserify
shows how to use yFiles with Browserify. - The new demos
demo.yfiles.loading.amdbundle
anddemo.yfiles.loading.scriptbundle
explain how to create a single-file bundle of a yFiles-powered application. - The new demo
demo.yfiles.loading.noglobals
shows how to use yFiles without creating an object in the global namespace. - Two new tutorial steps show the automatic text wrapping and clipping feature of the classes
TextRenderSupport
andSimpleLabelStyle
.
Demo Improvements and Bugfixes
- New modern styles for the nodes, edges, groups, and tables in the demos. These new styles show best practices with regards to both the various duties of a custom style in yFiles and good rendering performance, and last but not least they provide a contemporary look for the demos.
- The context menu of the demo framework is now a short, standalone class that depicts the main parts of the implementation and integration of a custom context menu much clearer.
- Improved the compatibility of the demo
require.js
implementation with the one of RequireJS and the AMD specification.- Return values are now passed to callbacks, as required by the AMD specification.
- The
baseUrl
can now be configured with the methodconfig
in the same way as RequireJS. - Callbacks of the
require
function are now always executed asynchronously, like it is done by RequireJS.
- The Layout Style demos got support for the new features of the layout part.
- The hierarchic layout style now has settings for (overall) grid placement and stacked placement of the nodes within a layer.
- Added a settings panel and a sample graph for the new series-parallel layout style.
- The tree layout style automatically uses its new multi-parent feature if appropriate for the current graph.
- The File Operations demo now shows in detail how a graph can be saved as file download.
- Reorganized the Incremental Hierarchic Grouping demo to make the relevant layout configuration more clear. In addition, the demo now uses the
FixNodeLayoutStage
that is part of the library instead of its custom implementation. - BPMN Editor demo: The
bpmn-layout
andbpmn-viewer
modules now list all of their dependencies to make AMD loading easier. To reduce startup time, the layout module is now loaded lazily in the demo when the first layout is actually calculated. - WebWorker and Node.js demos: The Graph-To-JSON converter now supports group nodes. Moreover, the content rectangle is updated correctly after a layout calculation and only a single undo step is created for each calculation.
- Performance improvements for the node styles in the Custom Styles tutorial. When updating, these styles no longer set new
transform
if nothing actually has changed. Setting a new transform can trigger a complete re-paint even if the values of the transform remain the same. - HTML Label Style demo: Corrected the placement of large labels.
Incompatible Changes
Changes in Default Behavior
CanvasControl
: The eventsMouse2DEntered
andMouse2DExited
have been erroneously fired when the mouse moved between inner elements. Now, these events are only fired when the mouse enters or leaves the bounds of the control, which is the intended and documented behavior.In addition, if a mouse button is pressed while leaving the bounds of the control, the
Mouse2DExited
event is now deferred until the button was released. As a result, this event does not interfere with the typical events of a mouse click and custom click handling code typically needs no special handling for this event. See the notes about known issues with mouse events for other peculiarities.Similarly, the methods
onMouseEnter
andonMouseLeave
ofControl
were erroneously invoked in these cases. This has been corrected, too.TextEditorInputMode
now ensures that the TextBox is visible in the viewport when starting editing. This behavior can be adjusted by creating a custom subclass and overridingensureVisible()
.FoldedGraph.isDummy
now throws anArgumentOutOfRangeException
for labels and ports that are not part of this view. Previously, this method returnedtrue
for such items. Since this exception is already thrown for nodes, edges, and bends that are not part of this view, the behavior is now the same for all types of graph items.GraphEditorInputMode
now by default supports the newGraphCommands.DUPLICATE_COMMAND
that is bound to keyboard shortcut Ctrl-D. This new behavior can be turned off with theduplicateAllowed
property.- The clipboard now supports copying and pasting of items independently from their owning elements. For example, single selected labels can be copied to other elements, as well as edges without their source and target nodes. This behavior can be reverted to the old behavior by setting
GraphClipboard
'sindependentCopyItems
toGraphItemTypes.NONE
. GraphEditorInputMode
now 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 theedgeReversalAllowed
property.ClickInputMode
: IfactiveButtons
includesMouseButtons.RIGHT
, the original right click event is marked as handled if ClickInputMode's event handlers mark the higher level click event as handled.GraphEditorInputMode
andGraphViewerInputMode
: The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.- Previously, ports at nodes and edges that were copied and pasted to and from the clipboard were all copied, even if there were no edges attached to them after the operation. Now those empty ports are not copied/pasted anymore unless the
PortDefaults
'autoCleanup
property is set to false or they were unoccupied before the operation already. In order to restore the old behavior, where all ports were copied regardless of whether edges were adjacent to them, make sure to include them in the core predicate, since this behavior change just affects ports that had previously not been accepted by the core predicate function. CanvasControl
: MethodfitContent
now 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 value1
was set which inadvertently resulted in a high priority for keyboard focus changes. You can set any other priority at any time.GraphEditorInputMode
'sNodeCreated
event may now report nodes that are not part of the graph, when the user has dropped a node viaNodeDropInputMode
and its newfolderNodeParentsAllowed
property is enabled. By default this feature is disabled, though.IReparentNodeHandler
'sisValidParent
method may now also be queried if the new propertyreparentToLeavesAllowed
ofGraphEditorInputMode
is enabled. By default this property is disabled, though. Note that the method will also be queried if the reparent handler is used outside of the context ofGraphEditorInputMode
.IValueSerializerContext
: In GraphML-writing code, the propertyinstance
now provides the object that should be converted, not the parent object. If you need to access the actual parent object, you can use theowner
property on theGraphMLValueSerializerContext
implementation of this interface.- The event
GraphMLIOHandler.QueryReferenceId
is no longer fired forMarkupExtensions
and other proxy objects for serialization. Now, it is only fired for the original object references. GraphEditorInputMode
andGraphViewerInputMode
: By default, graph items styled with a void style (VoidNodeStyle
,VoidEdgeStyle
,VoidLabelStyle
,VoidPortStyle
) won't be selected and won't get the focus.GraphEditorInputMode
'sclickHitTestOrder
property default value has changed. Now it does not contain the redundantGraphItemTypes.ALL
as 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+D
is now the default shortcut for duplicating selected elements (GraphCommand.DUPLICATE_COMMAND
). The latter can be disabled via theduplicateAllowed
property. GraphEditorInputMode.shouldBeMarqueeSelected
is no longer queried by thePaste
command to determine the items which should be selected after paste. Instead, the new methodGraphEditorInputMode.shouldBeSelectedAfterPaste
is queried. Note thatGraphEditorInputMode.shouldBeMarqueeSelected
still is queried to determine the items which should be selected by marquee selection.- Now, all pasted items are selected after a
paste
(previously: only nodes, edges, and bends). This can be configured via the newpasteSelectableItems
property inGraphEditorInputMode
and the correspondingshouldBeSelectedAfterPaste
method. - The hit test order for double clicks in
GraphEditorInputMode
andGraphViewerInputMode
is now controlled through the dedicateddoubleClickHitTestOrder
property. By default, this hit test order prefers labels over other graph elements. - If
ClickInputMode
is configured to deliver both single and double clicks, double clicks are not reported if the first click has created a new node or if cyclic selection is currently active. The same holds forTapInputMode
and single/double taps. - The visualization of the
HandleType.ROTATE
is now a single circle, its very thin central point has been removed. - The segment index for label model parameters of
SliderEdgeLabelModel
andSideSliderEdgeLabelModel
now is related to the visible segments for edges styled withPolylineEdgeStyle
. - If an
IEditLabelHelper
implementation is present in anILabel
's lookup, itseditLabel
method is now called in addition to an eventual owner's edit helper when the label text is edited. If implementations are present for both the label and the owner, editing is only allowed if both helpers returntrue
. Additionally, the predicate methodGraphEditorInputMode.shouldLabelBeEdited
always 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.editLabel
provides, for either an editable label or its owner, a different label instance, this instance is edited instead. - Otherwise, a label is added if an eligible owner can be found (see below).
- If an
IEditLabelHelper
implementation is present in anILabeledItem
's lookup, itsaddLabel
method is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate methodGraphEditorInputMode.shouldLabelBeAdded
always 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 anIEditLabelHelper
implementation 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 (seeLayerConstraintFactory
andSequenceConstraintFactory
).SALabeling
andGreedyMISLabeling
: ChangedLabelCandidate
s default for overlap penalty of nodes and edges from 0 to 1. This means label overlaps are now considered more severe.
API Changes
- The event
SizeChanged
and related methods and properties have been moved fromControl
toCanvasControl
. In addition, sometimer
-related properties have been replaced by more general variants to account for the newSizeChangedDetectionMode.SENSOR
size change detection mode. Likely, customer code is not affected by neither change since the other classes that extendControl
did not use the size changed-feature anyways. Control
: Due to the improved event handling policy, the propertiespreventDefault
,preventContextMenuPropagation
, andpreventEventPropagation
are no longer needed and have been removed. Instead, the new propertiespreventKeyboardDefault
,preventPointerDefault
, andpreventContextMenuDefault
can be enabled to prevent the default action of the respective types of events.-
Changed
SnapLine
to support non-orthogonal snap lines as well: its propertiesfrom
andto
have been changed from typenumber
toPointD
, its propertyorientation
was removed, and its constructors have been changed accordingly.Orthogonal snap lines are now modeled by class
OrthogonalSnapLine
. It extendsSnapLine
and provides the propertyorientation
. Existing API uses eitherSnapLine
orOrthogonalSnapLine
, depending on whether it works only with orthogonal snap lines or not.As a consequence, in class
SnapLineSnapResult
, the propertysnapLine
returns a non-orthogonalSnapLine
and the propertydelta
returns aPointD
instead of anumber
. API related toGraphSnapContext
still works only with orthogonal snap lines and usesOrthogonalSnapLine
. - The
key
property 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 methodcopyGraphToRoot
which was called bycut
,copy
, andpaste
to invoke theGraphCopier
has been split:copyGraphToRoot
now is called only bycut
andcopy
.paste
now invokes the new methodpasteSubsetWithTargetAndCallback
.- The type of
GraphMLAttribute
'sserializable
property has been changed fromboolean
to the enumGraphMLSerializationMode
. GraphEditorInputMode
andTableEditorInputMode
: return type of callback methodsonAddLabel
andonEditLabel
has been changed fromvoid
toboolean
. The return value should specify whether the operation in question was successful.- Context menus need no longer implement any interface, and the interface
yfiles.input.IContextMenu
was removed. The members using that interface, namely the propertiesContextMenuInputMode.menu
,ContextMenuInputMode.clearMenu
andPopulateContextMenuEventArgs.contextMenu
, and the methodContextMenuInputMode.createMenu
were removed as well. Since users create the context menu by themselves, there was no real need for these API members.Note that you'll now have to explicitly set the property
PopulateItemContextMenuEventArgs.showMenu
totrue
in your listener for the eventPopulateItemContextMenu
to show your menu. This was previously done automatically by the input mode if the propertyIContextMenu.isEmpty
returnedfalse
. CollapsibleNodeStyleDecoratorRenderer
: The methodaddToggleGroupStateCommand
is now public and static, and its signature was slightly changed.TreeSource
: Due to the new support for group and location bindings, the signature of its methodscreateNode
andupdateNode
changed.ToolTip
does no longer extend the classControl
. This has no effect on its behavior.
Bugfixes
Viewer
CanvasControl
: The eventsMouse2DEntered
andMouse2DExited
have been erroneously fired when the mouse moved between inner elements. Now, these events are only fired when the mouse enters or leaves the bounds of the control, which is the intended and documented behavior.Similarly, the methods
onMouseEnter
andonMouseLeave
ofControl
were erroneously invoked in these cases. This has been corrected, too.- Properties
ShinyPlateNodeStyleRenderer.radius
,ShinyPlateNodeStyleRenderer.brush
,ShinyPlateNodeStyleRenderer.pen
andBevelNodeStyleRenderer.radius
were not used consistently. - Fixed memory leak that occurred when
CreateEdgeInputMode
was uninstalled. CreateEdgeInputMode
: Fixed some problems with mixed mouse and touch input.- When using an
IEditLabelHelper
and adding a label interactively, the helper'seditLabel
callback was called instead ofaddLabel
. - Newly added labels could have had an empty size when an
IEditLabelHelper
instance was registered. - When a highlighted item was removed from the graph, the highlight was not cleaned up.
- Reparenting an empty group node displayed the target node highlight around the reparented node.
- The modified
MoveInputMode
created byMainInputMode.createMoveUnselectedInputMode
changed the cursor to indicate a movable object even when themodifierRecognizer
disabled moving. - When both a group node and its child node were resized together the group node bounds shrunk to its original bounds once the child had reached the original bounds.
CreateEdgeInputMode
now copies the dummy edge's tag to the created edge. This could have caused issues when a listener for the eventEdgeCreationStarted
set a custom tag on the dummy edge.- When the pressed status of the Shift key changed during a reparenting gesture of a node, the bounds of its containing group node were not immediately updated.
- The secondary multi-tap gesture was not recognized correctly.
- Labels whose positions were determined by
NinePositionsEdgeLabelModel
,SliderEdgeLabelModel
, andSideSliderEdgeLabelModel
might have disappeared when one or more edge segments were hidden under the source or target node. SnapContext
: Snap results with anull
tag were erroneously always discarded.BevelNodeStyle
: Fixed update of drop shadow afterradius
has been changed.IconLabelStyle
: MethodgetBounds
inIconLabelStyleRenderer
returned a valid rectangle even if the label layout was invalid. As a consequence,isVisible
erroneously returnedtrue
for labels with invalid bounds.- The
name
property of the classGraphMLAttribute
was not considered during deserialization. - Write events in
GraphML
were not always raised. - After setting an
ICanvasObjectGroup
'svisible
property tofalse
the group was still visible. CanvasControl.ensureVisible
hasn't worked for bounds larger than the current viewport.- Setting the view point on a
CanvasControl
with a width or height of 0.0 could cause an exception if aViewportLimiter
was enabled. GraphCopier
threw an error if the source and the target graph were identical.- When the
SelectionPaintManager
was disabled and a customFocusPaintManager
was used nodes styled withTemplateNodeStyle
might not always have been updated after selection changes. GraphEditorInputMode
andGraphViewerInputMode
now respect their respectivemultiSelectionRecognizer
for extending an existing selection via marquee.- Fixed
TableEditorInputMode
exhibiting problematic behavior under certain circumstances when theGraphControl
's graph is replaced. - GraphML could write incorrect values for bend tags.
Layout
SimplexNodePlacer
fixed bug that disabled label compaction feature.AssistantPlacer
fixed 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
,Sequencer
andNodePlacer
to 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.addPlaceNodeAtTopConstraint
orLayerConstraintFactory.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 aWrongGraphStructure
error as well as broken routes of edges incident to group nodes.SimpleNodePlacer
: Fixed broken edge routes that may appear for edges on nodes with external labels if integrated node labeling is enabled.CopiedLayoutGraph
: Fixed an error that occurs when nodes or edges are added to the copied graph without removing them before 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 ifstringTrimming
was 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
TapInputMode
events was not always updated properly. - Orthogonal edge editing could throw an error if edges were removed during interaction with an orthogonal edge.
- Fixed problems when exporting SVG content from the CanvasControl if HTML5 Canvas rendering was used and non-default viewport settings were applied. As a result, images could have been clipped incorrectly.
- Fixed a regression introduced in 1.2 which rendered the
shapeRendering
andimageRendering
properties inCanvasControl
useless. The properties are now applied correctly to the SVG DOM during rendering and image export. - In Internet Explorer,
DragOver
events could have been reported although the actual mouse location did not change. This happened if the DOM element under the mouse pointer was switched without the mouse being moved, and possibly resulted in a loop and excessive CPU usage, e.g. during drag and drop operations onto the GraphControl with preview and snapping enabled. - Included a workaround for a shortcoming of Internet Explorer: multiple consecutive whitespace characters in label text are displayed as a single space. The workaround replaces each non-newline whitespace with the unicode non-breaking space character
\u00A0
. This workaround must be enabled explicitly. Its details are described in the Known Issues . GraphControl
: Prevent an error during updateVisual if the GraphControls's HTML elements were removed by external code. This could happen especially in Internet Explorer if one of the parent elements of the GraphControl was cleared withelement.innerHTML = ""
.- GraphML serialization could not correctly handle undefined values and has thrown an error instead. The new property
SerializationProperties.UndefinedHandling
controls how undefined values are serialized. MouseEventArgs.button
was set toMIDDLE
for all but the left and right mouse button. This two were correctly reported. As a consequence,Mouse2DEventArgs.changedButtons
had the same error.GraphSourceBase.updateGraph
threw an error if the object instances ingroupsSource
had 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.
MoveViewportInputMode
no longer fires theDragFinishing
andDragFinished
events for simple clicks without any mouse movement.GraphViewerInputMode
: The eventCanvasClicked
specifies now the correct type for its event args, that isClickEventArgs
.- In Internet Explorer,
Mouse2DMoved
events could have been reported although the actual mouse location was not changed. This happened if the DOM element under the mouse pointer was switched without the mouse being moved, and possibly resulted in a loop and excessive CPU usage. - Moving the focus to the left was not possible since the command was not connected to the intended keyboard shortcut
Control + Left Arrow
. NodeDefaults
,EdgeDefaults
and all otherDefaults
: it was erroneously possible to assignnull
to thestyle
property. Now, the property throws anArgumentNullException
in this case.GenericYList
: Callinginsert
on an empty list has thrown an exception.- Custom handles for graph items might not have been updated correctly after changes of the selection due to a problem in
InputModeController
. The default handles were not affected by this problem.
Layout
CircularLayouter
: Fixed bug that may cause node overlaps.CopiedLayoutGraph
: Fixed problem that may cause movement of label boxes in the original graph even if methodCopiedLayoutGraph.commitLayoutToOriginalGraph
is not called.IncrementalHierarchicLayouter
: Fixed label placement for octilinear selfloops with the same side constraints for source and target port.IncrementalHierarchicLayouter
: Fixed rare error that may appear in incremental layout mode if there are group nodes that contain non-incremental elements.
Demo Improvements and Bugfixes
- Deployment tool: The default blacklist of the obfuscation step contains now much more names of common HTML5 and JavaScript APIs. Thus, the tool will no longer erroneously obfuscate these API usages in your source code.
- All demos that use a
LayoutExecutor
or themorphLayout
method now set a customfinishHandler
that checks for exceptions during the layout calculation and handle them appropriately. If a custom finishHandler is set, handling such exceptions is its responsibility.
Documentation Viewer Improvements
- Camel-Case search results were not listed in the search results page.
- Navigating to a type member now automatically expands the member's documentation.
- Typing now automatically focuses the search field.
- Improved layout of the search results page.
- The middle mouse button now closes tabs.
- Added a "Constants" category for static final fields.
- Type parameters were not correctly replaced in type parameter bounds.
- The quick search results box did not always close when choosing a search hit.
- Improved linking from overrides and implementations to the overridden/implemented members.
- Fixed sporadic error messages about circular JSON structure.
- The type member overview bar sometimes highlighted the wrong member section.
- Types that are mentioned in the Developer's Guide are now considered more important search hits.
- Inherited member documentation was sometimes missing.
- Tables were not rendered correctly in Internet Explorer 9.
- The viewer sometimes did not start correctly in Internet Explorer 9.
- "Show Usages" now also shows developer's guide references.
- Searching for event add/remove methods did not work.
- Filtering the Developer's Guide tree view now works correctly.
- Links to relevant demo applications were missing for some API members.
- Closing a tab sometimes opened an additional tab with a nonfunctional URL.
yFiles for HTML 1.2.1.1 - Changes Since 1.2.1
This bugfix release brings improvements for the new documentation viewer and for some of the demo applications. The yFiles for HTML library is not changed by this release, except for the incremented version number.
Demo Improvements and Bugfixes
- Include the new Events demo and the new Sparkline Styles demo in the Viewer package.
- Layout Styles demo: The initial layout might have failed because the needed module
yfiles/layout-misc
was not properly 'required'. - All demos with a layout algorithm now use the
MinNodeSizeStage
to gracefully handle graphs with nodes with a width or a height of '0'. Without that stage, the layout will throw an exception if the graph contains such a node. - In some cases, errors did not trigger the error reporting dialog but were only shown in the developer tools of the browser.
- Mindmap demo: Moving nodes without text resulted in an error.
- Mindmap demo: If opening the initial data file fails, the demo now shows a fallback graph.
- ReshapeHandleProvider demo: Shrinking the nodes that preserve their aspect ratio no longer throws an error when their width or height becomes '0'.
Documentation Viewer Improvements
- The drop-down menus of the member navigation bar were not visible.
- Added missing images for some API pages.
- Camel case search hits were visible only in the quick search results box. They are now also listed on the search results page.
- Because the number of search results was unlimited, the browser would freeze for searches with a large number of hits. The maximum number of search results is now limited.
yFiles for HTML 1.2.1 - Changes Since 1.2.0.6
The main focus of this release is on new and enhanced tools for developers and on more and improved demo applications.
The yFiles for HTML library in this release maintains compatibility with the previous versions of 1.2 and brings small improvements and corrections like a regular bugfix release. All users of previous versions of 1.2 are therefore strongly encouraged to update to this release.
Enhanced Development Support
- Support for IntelliSense for the yFiles API in Visual Studio 2012 and newer. That includes statement completion, parameter information for methods, and descriptions in the Quick Info pop-ups.
- 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@static
annotations, fixed links to events and framework classes, improved documentation for inherited members, improved the formatting, added information about runtime complexity and preconditions of algorithms. - New Grunt-based deployment tool that replaces the previous Java-based obfuscator and offers additional features: It can combine the three files that form a yFiles module into a single file and simplify the yFiles AMD 'define' statements in a standard conform way. See the tool's description for more details.
- The tool
yfiles.help
now shows the inheritance hierarchy and implemented interfaces of yFiles types. - Method and property parameter checks now display which parameters were wrong instead of just warning about a mismatch.
New and Improved Demos
- Added install and start scripts for a local Node.js Express server that can serve the demo content. Using a server prevents security issues when running the demo applications directly from the filesystem.
- The demo
demo.yfiles.layout.LayoutStyles
now provides a convenient graphical user interface to explore the vast configuration options of the most used yFiles layout algorithms. - Added new showcase application
demo.yfiles.graph.mindmap
. - The new demo
demo.yfiles.graph.basiclayouter
can serve as a starting point for custom yFiles for HTML applications. - Added new demo
demo.yfiles.angular
that shows the integration of yFiles for HTML with Angular JS. - Added new demo
demo.yfiles.graph.events
that demonstrates the various events of the input mode, the graph control, and the graph. - Added new demo
demo.yfiles.style.sparkline
that shows how to use a third party visualization framework for a custom node style. - Added new demo
demo.yfiles.loading.nodejs
that runs a yFiles layout algorithm in a Node.js server.
Improvements and Corrections
- Prevent overlaps of collapse buttons and group node labels in several demos.
- Simple Custom Style Demo and Style tutorial: Show a custom group node style.
- Simple Custom Style Demo and Style tutorial: Label didn't show line breaks created with Ctrl+Return.
- Image Export Demo: Prevent timing issues by calling the export code in an event handler of the
load
event instead of calling it directly. - Completely revised the Simple Dojo Demo: More concise and clean code, use of modern Dojo syntax and theme.
- The File Operations demo now uses a Node.js server for the server-based load/save operations.
- All Data Binding demos now use
yfiles.drawing.StringTemplateNodeStyle
instead ofyfiles.drawing.TemplateNodeStyle
since it is better suited for this use case. - Preferred Label Placement Demo: Switched off the label style's
autoFlip
feature so the "Add 180° on Right Side" option has a visible effect. - Bpmn Editor Demo: The implementation of the method
ConnectedIconLabelStyle.isVisible
was not correct, resulting in a disappearing icon during movements. - Bpmn Editor Demo: Make sure that a new label of a pool node gets a suitable location by using a custom
EditLabelHelper
inPoolNodeStyle
. - The
StylePanel
used for the palette in several demos and some other helper GUI components are now implemented in plain JavaScript/HTML and no longer extend 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
finishHandler
now check for exceptions during the calculation and handle them appropriately. If a custom finishHandler is set, handling such exceptions is its responsibility, and thus, such exceptions were previously silently discarded in these demos. - Context menus are now opened centered on the GraphControl if the context menu key is pressed. Demo code shows how to correctly handle this key event in Chrome, Firefox, and Internet Explorer.
- 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.
GraphViewerInputMode
andGraphEditorInputMode
: The childclickInputMode
now delivers both left and right clicks.OverviewInputMode
andGraphOverviewControl
have been optimized to improve the user experience when used on touch devices.OverviewInputMode
can be customized more easily. Minor modes can be replaced and adjusted, as well as the list of available default command bindings can be modified.- The tooltip is now a child of the <body> instead of the <html> element.
- The adapter classes
GraphSource
,AdjacentNodesGraphSource
,AdjacentEdgesGraphSource
, andTreeSource
now acceptIEnumerable
s as values for the propertiesnodesSource
,edgesSource
andgroupsSource
, in addition to arrays and plain JavaScript objects.
Bugfixes
DefaultArrow.length
did not take thescale
factor into account, sometimes leading to gaps between the edge and the arrow.- Custom selection visualizations using
EdgeStyleDecorationInstaller
were not animated correctly. - Custom selection visualizations using
EdgeStyleDecorationInstaller
inDecorationZoomMode.MIXED
orDecorationZoomMode.VIEW_COORDINATES
did not work correctly together withBridgeManager
. EdgeStyleDecorationInstaller
can now be used with self loops without bends, too.ClickInputMode
: Canceling the mode during clicks didn't work correctly and as a result, the location reported for the next click might have been wrong.GeneralPath.transform
and other GeneralPath methods usingMatrix2D
applied the transformation matrix incorrectly in the case of a rotation.- Running any label placement algorithm had no effect for node/edge labels if the properties
removeNodeOverlaps
/removeEdgeOverlaps
were enabled because all potential candidates were erroneously rejected. NavigationInputMode
tries to request the mutex when an expand/collapse or enter/exit command is executed. This fixes an issue where ClickInputMode was inadvertently handling the click on a group collapse button in case thatClickInputMode.clickHandlingMode
was 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
GraphEditorInputMode
andGraphViewerInputMode
: The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.
yFiles for HTML 1.2.0.6 - Changes Since 1.2.0.5
Bugfixes
- The validation of a license that contains a watermark always failed for users of Internet Explorer with a Finnish locale. Only this specific setup is affected.
UndoEngine
: due to incorrect calculation of time, successive commands that should have been part of the same undo unit were in fact placed in different units.- Group nodes were resized unexpectedly when moving them together with their children if the children were selected before the group.
- GraphML serialization of arrays was broken when the file
yfiles-typeinfo.js
was included. - The modules
yfiles/complete
andyfiles/layout
did not list all modules from the layout part as dependencies.yfiles/layout-familytree
,yfiles/layout-orthogonal-compact
,yfiles/layout-polyline
, andyfiles/layout-radial
were missing.
Layout
MultiPageLayouter
: Fixed bug that caused that anAbortHandler
attached 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 methodfindMatchingCandidate
to 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_KEY
is registered to the input graph but no mapper for the keyPortConstraintKeys.TARGET_GROUP_ID_DP_KEY
is registered.ComponentLayouter
: Fixed bug that caused an error if the style is set toyfiles.layout.ComponentArrangementStyles.MULTI_ROWS_HEIGHT_CONSTRAINT
orMULTI_ROWS_HEIGHT_CONSTRAINT_COMPACT
and all components exceed the preferred height.IncrementalHierarchicLayouter
: Fixed bug that caused first or last segments of edges to be too short to span all associated labels.MultiPageLayouter
: Fixed bug that may cause non-orthogonal edge routes.TreeReductionStage
: Fixed bug that may cause aWrongGraphStructure
error if the input graph contains group nodes with incident edges.TreeLayouter
: Fixed bug that may cause an error if the input graph is aCopiedLayoutGraph
that consists of multiple connected components and the layouter uses theLayeredNodePlacer
, if the propertychildPlacementPolicy
is 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.findMembers
and related methods likegetMembers
could return incorrect results.- Utility method
yfiles.help.createStub
was 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#lineJoin
default value attribute differed from the actual default valuePenLineJoin.MITER
.
Automatic Layout
IncrementalHierarchicLayouter
andRankAssignments
: 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 optionrouteInterEdgesImmediately
is 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
LayoutGraphAdapter
where label candidates for edge labels were not always determined correctly. RotatedSideSliderEdgeLabelModel
: Label model parameters of this model were serialized as the respective parameters 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.FoldedGraph
detects more carefully what has changed before invoking the methodsCreateDummyEdgeAppearance
andChangeDummyEdgeAppearance
ofIDummyEdgeConverter
. Previously, in some cases, these methods were called to often or not at all.FilteredGraphWrapper
: The variousedgesAt
methods erroneously returned edges that were marked as hidden by theedgePredicate
. The methodsdegree
,inDegree
, andoutDegree
are based on these methods and were affected, too.GraphSnapContext
: Snapping nodes to vertical edge segments was not working ifnodeToEdgeDistance
was set to 0.0.- When snapping was disabled temporarily (using Ctrl) during a move gesture, the moved item snapped after finishing the gesture, anyway.
FoldedGraphUndoSupport
didn't add the correct bend information to its internal data structures.TemplateLabelStyle
: ThepreferredSize
was not correctly read from GraphML files.CollapsibleNodeStyleDecorator
andShadowNodeStyleDecorator
: Lookup requests forISizeConstraintProvider
,IGroupBoundsCalculator
, andIShapeGeometry
are now correctly delegated to the wrapped style.- The
EdgeStyleDecorationInstaller
did not copy the tags of dummy ports and edges used when displayed in view coordinates (zoomMode
==DecorationZoomMode.VIEW_COORDINATES
).
Automatic Layout
OrthogonalLayouter
failed 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.IncrementalHierarchicLayouter
Fixed 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
AssistantPlacer
together with distributed port assignment. CircularLayouter
: Fixed issue that may cause infinite/too large node coordinates for unfavorable input settings, for example, if the maximal deviation angle is to small. Note that such coordinates may produce infinite looping or other exceptions.BorderLine
: Fixed bug in methodgrow
that may result in an exception because the minimum value of a BorderLine becomes greater than the maximum value.AbstractLabelingAlgorithm
: Fixed bug that may cause removal of labels that don't overlap with other elements if optionremoveNodeOverlaps
is enabled.Polyline.EdgeRouter
: Fixed bug that may cause zero length routes of edges whose start and end point are at the same location.BusRouter
: Fixed exception that may appear for graphs containing isolated nodes with self-loops.
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,
SvgExporter
did 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
SimpleLabelStyle
andTextRenderSupport
due to source code file encoding issues. - Template Styles: Fixed non-functional bindings in certain attributes like 'x' and 'y' in Internet Explorer.
- The
IRenderContext
instance created byCanvasControl.createRenderContext
was not usable for SVG export withCanvasControl.createVisualContent
. Note that for SVG export, it is still recommended to use classSvgExport
instead. GraphSnapContext
: Snapping nodes to vertical edge segments was not working ifnodeToEdgeDistance
was set to 0.- Fixed broken methods
LayoutExtensions.createIncrementalLayerConstraintFactory
andLayoutExtensions.createSequenceConstraintFactory.
GraphMLIOHandler
: methodaddNamespace
had no effect, and adding a custom schema withaddSchemaLocation
triggered an error.SvgExport
: Fixed clip-path not working in Firefox when exporting an SVG.SvgExport
: propertyscale
did 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.IncrementalHierarchicLayouter
andTopologicalIncrementalLayerer
: 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.
SimpleLabelStyle
constructors 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.PlaceText
always returning the original text ifStringTrimming.NONE
was passed in.
Layout
- Integrated labeling of the hierarchic layout style: preferred label placements
Along Edge
were not calculated correctly. yfiles.router.polyline.EdgeRouter
: Fixed wrong heuristic bend calculation if grid is used.BusRouter
: Fixed error inBusRepresentations
that could appear if the input graph contains overlapping nodes.FixedGroupLayoutStage
: FixedcanLayout
which changed the structure and layout of the graph.
yFiles for HTML 1.2 - Changes Since 1.1.1.6
Major Features Added
- Support for HTML5 Canvas-based rendering has been added. Especially suitable for low-detail, high-volume renderings, HTML5 Canvas rendering is now directly supported. SVG and Canvas-based renderings may be mixed and rendering can be switched on the fly for level-of-detail scenarios, etc.
- Complete TypeScript 1.0 language bindings included in the package simplify type-safe and compiler-checked development in Visual Studio and other IDEs.
- A new 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
AdjacentNodesGraphSource
andAdjacentEdgesGraphSource
provide data binding support for a much larger number of user data models. - New and improved template styling support can now intelligently handle definition references and allows for embedding templates directly into GraphML or special
script
tags. - Built-in support for text-wrapping, clipping, and ellipses, as well as performance optimized text-measuring has been added for the built-in styles and is made available for custom style implementations.
- Added
ItemHoverInputMode
to 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
RadialLayouter
that places nodes on concentric circles. Edges are routed in a radial fashion using one of several routing strategies. - Added support for terminating (layout) algorithms prematurely. To this end, new class
AbortHandler
provides methods to specify how long an algorithm may run until it is gracefully terminated (see 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 BalloonLayouter
CircularLayouter
CompactOrthogonalLayouter
DirectedOrthogonalLayouter
GenericTreeLayouter
GRIP
HierarchicGroupLayouter
HierarchicLayouter
IncrementalHierarchicLayouter
OrganicLayouter
OrthogonalGroupLayouter
OrthogonalLayouter
PartialLayouter
RadialLayouter
RecursiveGroupLayouter
SmartOrganicLayouter
BusRouter
polyline.EdgeRouter
OrganicEdgeRouter
OrthogonalEdgeRouter
GreedyMISLabeling
SALabeling
The following layout algorithms also support graceful early termination: Layout Algorithms Routing Algorithms Other Algorithms HierarchicGroupLayouter
HierarchicLayouter
IncrementalHierarchicLayouter
OrganicLayouter
SmartOrganicLayouter
polyline.EdgeRouter
SALabeling
- Introduced concept of node halos. Halos are reserved space around a node in which layout algorithms will not place other graph elements. Node halos are modelled using class
NodeHalo
.The following layout algorithms support node halos: Layout Algorithms Routing Algorithms Other Algorithms BalloonLayouter
CircularLayouter
CompactOrthogonalLayouter
ComponentLayouter
DirectedOrthogonalLayouter
GenericTreeLayouter
IncrementalHierarchicLayouter
OrthogonalGroupLayouter
OrthogonalLayouter
RadialLayouter
RecursiveGroupLayouter
SmartOrganicLayouter
TreeLayouter
polyline.EdgeRouter
SelfLoopLayouter
GreedyMISLabeling
SALabeling
InsetsGroupBoundsCalculator
MinimumSizeGroupBoundsCalculator
SmartOrganicLayouter
: Added support for partition grid layout. See classPartitionGrid
.- Optimized the module dependencies to reduce loading times. The module
layout-hierarchic
does no longer depend on the moduleslayout-router
andlayout-tree
, and the modulelayout-orthogonal
does no longer depend on the modulelayout-router
.
Minor Features Added
GraphSource
: Added propertylazyNodeDefinition
. If this property is enabled, objects that are not contained innodesSource
can be used as source and target of edges as well.GraphSource
: Added propertynodeLabelBinding
that specifies the label binding for nodes, similar to theedgeLabelBinding
for edges.ItemDropInputMode
is a newDropInputMode
forIModelItem
s that facilitates subclasses to support preview and snapping of the dragged item as well as highlighting potential drop targets.NodeDropInputMode
andStripeDropInputMode
have been refactored to useItemDropInputMode
as base class.- Node ports can now be moved by dragging their
IHandle
. - Code completion now supports generics in supporting IDEs as part of the JSDoc3 support.
Layout
BalloonLayouter
: Added support for integrated node and edge labeling. See new 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,SimplexNodePlacer
offers 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 propertyignoreInnerNodeLabels
that allows to ignore node labels that are inside the bounds of their owner so they may be crossed by edges. This is especially useful if labels of group nodes may be crossed while outer labels of non-group nodes may not.polyline.EdgeRouter
: Added support for customizing the order in which edges are routed. See new propertyedgeOrderComparator
.GenericTreeLayouter
: When enablingGenericTreeLayouter.integratedNodeLabeling
and/orGenericTreeLayouter.integratedEdgeLabeling
, the respective labels will be taken into account during the calculation of group bounds.DelegatingNodePlacer
: Added keyDelegatingNodePlacer.LEFT_RIGHT_DP_KEY
that 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 additionalFixPointPolicy
sUPPER_RIGHT
,LOWER_RIGHT
, andLOWER_LEFT
.LabelLayoutTranslator
: Added propertieswriteBackRelativeEdgeLabelLocation
andwriteBackRelativeNodeLabelLocation
that allow a core layouter to specify new node or edge label locations relative to the label's owner.LabelLayoutKeys
: Added keyIGNORE_LABEL_DP_KEY
that allows specifying which edge and node labels should be ignored during layout calculations.- Added new class
OrganicRemoveOverlapsStage
that removes node overlaps while respecting a specified minimal node distance. Unlike the approach implemented in classRemoveOverlapsLayoutStage
, this approach tries to keep the original layout structure, i.e., it tries to keep the geometric distance between the nodes. - Added class
StraightLineEdgeRouter
that 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.
ImageNodeStyle
now supports fail-over images by default.CollapsibleNodeStyleDecorator
can now conveniently be customized and more easily be subclassed.- Improved touch device input for the default collapse button styles and added multi-touch support for the scrollbars.
DropInputMode
: Added propertylastDragEventArgs
.CompositePositionHandler
: Added methodsgetPositionHandler
andgetHandle
to retrieve an earlier addedIPositionHandler
orIHandle
.TableLayoutConfigurator
: Support for routing algorithms improved.
Algorithms
Dfs
: Added methodcancel
that can be used by subclasses to cancel the search.Cycles
: Improved methodfindCycle
to stop the search as soon as the first cycle has been found.GraphConnectivity
: Improved methodmakeBiconnected
to work with graphs with self-loops (i.e. edges whose source node is also the target node).Groups
: Replaced recursive implementation of methodbiconnectedComponentGrouping
with an iterative algorithm to support larger graphs.
Layout
IncrementalHierarchicLayouter
: The default sequencing phase has been improved to produce less crossings and run faster.IncrementalHierarchicLayouter
: Now prevents overlaps among same layer edges attached to group nodes.IncrementalHierarchicLayouter
: Selfloop routing now takes the layout flow into account. For layout orientation top-to-bottom, selfloops will by default exit on the left or right and enter on top.IncrementalHierarchicLayouter
: Added option to route selfloops like backloops (starting at the bottom of the node and ending at the top of the node) when backloop routing is enabled.IncrementalHierarchicLayouter
: During layering, edges connected to group nodes may be redirected and replaced by dummy edges connected to the children of the group node. For these dummy edgesILayoutDataProvider.getEdgeData
now returns anIEdgeData
of 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.ALL
and the quality to time ratio is greater than or equal to0.7
(propertyqualityTimeRatio
).InteractiveOrganicLayouter
: MethodstartLayout
now takes advantage of multiple threads for layout calculation which may reduce the required runtime.BalloonLayouter
: Reduced gaps between adjacent nodes.PartitionLayouter
: Added nested classPartitionLayouter.PolylineInterEdgeRouter
that 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 optionreplacePortConstraints
that 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.DirectedOrthogonalLayouter
andOrthogonalGroupLayouter
: Added optimization step that reduces the number of perceived bends. See new propertyperceivedBendsOptimization
.OrthogonalLayouter
,OrthogonalGroupLayouter
andDirectedOrthogonalLayouter
: 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 methodarrangeRectangleMultiRows
suitable for arranging rows of rectangles with highly different sizes.ComponentLayouter
: Added the following new component arrangement strategies toComponentArrangementStyles
that are suitable for components with highly different sizes:MULTI_ROWS
,MULTI_ROWS_COMPACT
,MULTI_ROWS_HEIGHT_CONSTRAINED
,MULTI_ROWS_HEIGHT_CONSTRAINED_COMPACT
,MULTI_ROWS_WIDTH_CONSTRAINED
, andMULTI_ROWS_WIDTH_CONSTRAINED_COMPACT
Demos
- Added new showcase application
demo.yfiles.graph.bpmneditor
which allows you to create Business Process Diagrams and to automatically arrange them. The demo provides customized styles which represent the BPMN 2.0 symbols and a specialized BPMN layout algorithm. - The new demo
demo.yfiles.layout.multipage
shows how to use theMultiPageLayouter
to divide a large graph into several smaller pages. - The new demo
demo.yfiles.loading.webworker
shows how to run a yFiles layout algorithm in a Web Worker task in order to prevent the layout calculation from blocking the UI. - Added more data binding demos to show the features of the new classes
AdjacentNodesGraphSource
andAdjacentEdgesGraphSource
. - The new demo
demo.yfiles.graph.htmlpopup
shows HTML pop-up panels that display additional information about a clicked node or edge. - The new demo
demo.yfiles.input.singleselection
shows how to configureGraphEditorInputMode
for single selection mode. - The new demo
demo.yfiles.layout.preferredlabelplacement
shows how thePreferredPlacementDescriptor
for edge labels affects the label placement of layout algorithms. - The new demo
demo.yfiles.style.datatable
shows a node style and a label style that display data in a tabular fashion. - The new demo
demo.yfiles.style.selectionstyling
shows customized selection painting of nodes, edges and labels by decorating these items with a corresponding style. - The new demo
demo.yfiles.style.styledecorators
shows how to create styles for nodes, edges, and labels that wrap existing styles and add visual decorators.
Incompatible Changes
Changes in Default Behavior
polyline.EdgeRouter
: MethoddoLayout
now throws an error if there is a node with zero width or height in the given graph.FixedGroupLayoutStage
: MethodorthogonalEdgeRouter
now returns an instance of classpolyline.EdgeRouter
instead of classOrthogonalEdgeRouter
.ComponentLayouter
: PropertypreferredLayoutSize
now throws an error when setting the preferred size to negative values or zero.- Changed default behavior of edge label placement in layouters with integrated edge labeling when using
LabelPlacements.ANYWHERE
. Now edge labels are placed on the edge and in the center between source and target node. This change affects the following layout algorithms:IncrementalHierarchicLayouter
,OrthogonalLayouter
,OrthogonalGroupLayouter
,DirectedOrthogonalLayouter
,GenericTreeLayouter
, andLabelLayoutDataRefinement
.
API Changes
GraphExtensions
andIGraph
: the following methods have been renamed:createNodeAtLocation
tocreateNodeWithCenter
createNodeAtLocationAndTag
tocreateNodeWithCenterAndTag
createNodeAtLocationWithStyle
tocreateNodeWithCenterAndStyle
GraphOverviewControl
: due to the new general support for HTML5 Canvas rendering, the signatures of the methodcreateGraphCanvasVisualCreator
and the constructorCanvasOverviewGraphVisualCreator
have been changed.GraphSource
: renamed the propertyidBinding
tonodeIdBinding
to be more consistent with the other property names.GraphSource
: the callback methodscreateNode
andupdateNode
got a new additional parameter for the label data of the node, like the similar methods for edges always had. Since these methods are classified asprotected
, this change affects only derived classes but not usages of this class.ResourceManager
: renamed the constructorForType
to the canonicFromGlobalName
and removed other obscure constructors.- Changed module dependencies and affiliation in the layout part:
- Moved classes
PartitionGrid
,PartitionCellId
,RowDescriptor
, andColumnDescriptor
from the namespaceyfiles.hierarchic.incremental
toyfiles.layout
. Additionally, these classes are now part of the modulelayout-core
instead oflayout-hierarchic
. - Moved class
FamilyTreeLayouter
from the modulelayout-hierarchic
to the new modulelayout-familytree
. - Moved class
CompactOrthogonalLayouter
from the modulelayout-orthogonal
to new modulelayout-orthogonal-compact
. - Moved class
ChannelRouter
from the modulelayout-router
to the modulelayout-hierarchic
. - Moved classes
FixedGroupLayoutStage
andPartitionLayouter
from the modulelayout-router
to the modulelayout-polyline
. - Moved rarely used inner class
TreeDrawer.HierarchicTreePlacer
to the top-level of theyfiles.tree
namespace. Consequently, it was moved from the modulelayout-hierarchic
to the modulelayout-tree
. - The module
layout-hierarchic
does no longer depend on the moduleslayout-router
andlayout-tree
. - The module
layout-orthogonal
does 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-hierarchic
to get both the hierarchic and the tree layout algorithms. - Moved classes
IItemFactory
: Added methodcreateRedirectedGroupEdge
.LayeredNodePlacer
: Removed data provider keyDP_KEY_DISTANCE_TO_PARENT_MAP
from public API, since it is for internal use only.DelegatingNodePlacer
: the methodsgetLowerRightChildren
andgetUpperLeftChildren
have now an additional second argument, the current graph.polyline.EdgeRouter
: MethoddoLayout
now throws an error if there is a node with zero width or height in the given graph.polyline.EdgeRouter
: Penalty settings have been changed to double precision. See classPenaltySettings
.polyline.EdgeRouter
: renamed the propertiespolylineRoutingEnabled
andreroutingEnabled
to the canonical namespolylineRouting
andrerouting
, respectively.PathSearch
: Signature of methodcalculateCosts
has 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 methodpreprocessNodes
and protected methodprintStatistics
.RecursiveGroupLayouter.NULL_LAYOUTER_FIELD0
has been renamed toRecursiveGroupLayouter.NULL_LAYOUTER
.- Removed
SimpleLabelStyleRenderer
's static methodsgetTextOffset
,measureText
, andgetTextBBox
. Please useTextRenderSupport.measureText
orTextRenderSupport
's instance methods for text measuring instead.
Bugfixes
GraphSource
: fixed various problems in methodupdateGraph
that caused undesired behavior or even errors.- Property
Touch2DDevice.lastEventTime
is now a regular JavaScriptDate
object. BevelNodeStyle
: Fixed update of drop shadow afterradius
has been changed.- When using an
IEditLabelHelper
and adding a label interactively, the helper'seditLabel
callback 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 optionedgeStraighteningOptimization
is enabled.PCListOptimizer
: Fixed possibleIndexOutOfRangeException
that may appear if there are port constraints which have no matching port candidate or port candidate set entry.IncrementalHierarchicLayouter
: Fixed an error (Graph is not acyclic) inSimplexNodePlacer
that could appear when sequence constraints were added to a graph with swimlanes and group nodes.BorderLine
: Fixed a rare error that was caused by numerical instability.IncrementalHierarchicLayouter
: Fixed an error inConstraintIncrementalLayerer
that could appear when layer constraints were added in incremental mode.CircularLayouter
: Fixed a possible error when layout style is set toBCC_ISOLATED
and consider node labels is enabled.AbstractLabelingAlgorithm
: Fixed bug that causes poor results if optionremoveEdgeOverlaps
is enabled and the labels should be placed on the edge.IncrementalHierarchicLayouter
: Fixed minimum edge length for orthogonal edges. It is now also taken into consideration for edges that connect to a node's side and for backloop edges (see propertybackloopRouting
).IncrementalHierarchicLayouter
: Fixed possible error ifPortConstraint
s are used together withPortCandidateSet
s.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 methodnearestCommonAncestor
that sometimes caused wrong results if one of the specified nodes is the ancestor of the other node.InsetsGroupBoundsCalculator
: Fixed methodcalculateBounds
to consider only the given child nodes and all edges between those child nodes instead of all nodes and all edges in the graph.GenericTreeLayouter
: Fixed error that occurred when usingLayeredNodePlacer
as 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.SALabeling
andGreedyMISLabeling
: 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
clone
method did not copy all field values from the original instance to the newly created instance. BevelNodeStyle
did not update the fill attribute correctly.- Obfuscator: Blacklist
localName
to 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 afterradius
has been changed.FilteredGraphWrapper.dispose
did 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.fromArray
did not check its input for null.- Graph Viewer Demo: load the
graph-style-defaults
module 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.TreeLayouter
andGenericTreeLayouter
: 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 rareNullReferenceException
while 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 ifTableLayoutConfigurator
is used to prepare the graph for layout calculations.Polyline.EdgeRouter
: Fixed bug that sometimes assumed wrong label bounds if the router was used directly after another layout algorithm. This could result in too many bends for edges that were routed around those wrong boxes and/or edges crossing labels because the actual label boxes were ignored.PolylineLayoutStage
: Fixed possible error if there are fixed edges with a single, very short segment.BusRouter
: Fixed clean up of bends that resulted in unnecessary detours in edge paths.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 aDataProvider
to 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 thebackgroundBrush
back tonull
had no effect.- Invisible
CanvasObjectGroup
s did not work.
yFiles for HTML 1.1.1.4 - Changes Since 1.1.1.3
Improvement
LayoutGraphAdapter
provides now the originalTag
data for temporary graph objects.
Bugfixes
- The
yfiles/lang
core module was not able to deal with the minified output of the obfuscator anymore (since 1.1.1.2). This resulted in nested types not being available after minification. - Undoing a reparent grouping gesture might have resulted in inconsistent group node sizes. Note: The fix results in a slightly incompatible behavior when nodes are reparented programmatically and multiple folding views are used. In that case, you need now to subscribe to hierarchy events and manually adjust the group node bounds.
- The default value of
AbstractTableNodeStyle#BackgroundStyle
was not serializable. - Manually bracketing undo edits with
BeginEdit
andEndEdit
might have led to exceptions when folding was active. - Changing properties of
PolylineEdgeStyle.pen
had no visible effect.
Automatic Layout
DirectedOrthogonalLayouter
could throw aindexOf
exception.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.workaroundCR320635
totrue
. - Improved the rendering performance of graph item handles in Internet Explorer.
- Fixed an error that was thrown when uninstalling a
GraphEditorInputMode
after a label editing text box was shown. TextEditorInputMode#anchor
wasn't considered for placing the label editing text box.RotatedSliderEdgeLabelModel
can now deal with edge paths that arenull
, for example when usingVoidEdgeStyle
.- GraphML: Primitive types like floats and doubles could not be read when used in element syntax and the current
CultureInfo
was 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
Printing
and 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
isInstance
andinstanceof
considered the custom implementation as not being of the nested type. Amongst other things, this resulted in wrong type checking errors when using such implementations. - Final obfuscation using the obfuscator broke touch input.
- Fixed the arrow
ArrowType.TRIANGLE
which accidentally was the same asArrowType.DEFAULT
. - Fixed clipping problem in
SvgExport
that affected printing and bitmap export. - Fixed clicking in the overview not honoring viewport limits.
- GraphML: Properties with a text value containing nested
CDATA
sections were not parsed correctly. - Moving the viewport by clicking into the
GraphOverviewControl
did not honorCanvasControl.viewportLimiter
restrictions. - Fixed error when invoking event handlers added with
KeyboardInputMode.addHandlerForGesture
. - Key event handlers are removed from a
Control
when it loses focus. PatternBrush
now respects the value set in theviewBox
property.
Automatic Layout
EdgeRouter
: Fixed bug that may cause anError
if 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 possibleError
if 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
: FixedError
that 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
ICollection
were not serialized in GraphML. Especially,ITable
instances 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#getPreferredSize
threw an exception when creating a new label.Custom Style Tutorial
andSimpleCustomStyle
demo: Reverted field to properties to allow for GraphML serialization.
yFiles for HTML 1.1.1 - Changes Since 1.1.0.1
Enhanced Development Support
- New methods
yfiles.help.info
andyfiles.help.api
display extensive information about types, properties and other members, and API documentation when used in the browser's JavaScript console. - The debug support provided by
yfiles-typeinfo.js
has a new setting to switch between instant failure and logging of problems. To enable logging, set the boolean propertyyfiles.help.logTypeInfoErrors
totrue
.
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 methodcreateGraphCanvasVisualCreator
that allows for easier creation of a canvas based preview rendering.- Added callback method
setEdgePortLocation
toLayoutGraphAdapter
that 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 returnedIRenderContext
new has the correctclip
applied. Typeface
: Added default value annotations to most properties for more compact GraphML serialization.
Automatic Layout
RecursiveGroupLayouter
: Improved performance for graphs with a mainly flat structure.GraphConnectivity
: Improved methodmakeBiconnected
to work with graphs with self-loops (self-loops are edges whose source and target are the same).Groups
: Replaced recursive implementation of methodbiconnectedComponentGrouping
with 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.AlgorithmAbortedException
has been removed. This exception was never thrown by library code and was not intended to be used by client code.
Bugfixes
- In some browsers, event coordinates were not passed correctly when the page was scrolled or when the canvas had a CSS border.
PatternBrush
couldn't be used in documents with more than one graph control.Pen
: The dash style wasn't visualized correctly, and the propertiesdashCap
,lineJoin
, andmiterLimit
had 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.Class
by the correctyfiles.lang.Class
. LabelControlLabelStyle
incorrectly triggered update of preferred label size calculation in folded graph scenarios under certain conditions.- Method
NavigationInputMode.toggleGroupNodeState
did not expand collapsed folder nodes. NavigationInputMode
: MethodscollapseSelection
andexpandSelection
threw 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.isInBox
always returned false. NodeStyleLabelStyleAdapter
: Fixed rendering bug when the style was used for node labels.- In
CreateEdgeInputMode
andMoveInputMode
, 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
:horizontalScrollBarPolicy
andverticalScrollBarPolicy
could not be set to different values at the same time. Instead, the value of the latter was always used for both settings.LabelControlLabelStyle
incorrectly triggered update of preferred label size calculation in folded graph scenarios under certain conditions.MoveInputMode
only considers hovers without modifiers as valid to prevent "cursor fight" withMoveViewportInputMode
.CanvasControl
: Fixed incorrect clipping that could occur when scrollbar visibility has changed.- Fixed
DefsManager
to respect the value of thecleanupTimerInterval
property. - 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 propertyangleRotationOnRightSide
fromLabelAngleOnRightSideOffset
toLabelAngleOnRightSideRotation
.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 typeANY
for 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 optionsrerouting
andlocalCrossingMinimization
are 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.intersectsRectangle
sometimes returnedtrue
for 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.Object
resulted in: "DeserializationNotSupportedException
: Element {x} has collection content for non-collection property {y}." SimpleLabelStyle
'sverticalTextAlignment
did not work correctly in all cases.SimpleLabelStyle
'sclipText
feature sometimes resulted in wrong clips being applied when the style was shared between labels.- GraphML:
Freezable
objects likePen
actually got theirisFrozen
property serialized, which can result in run-time exceptions during parse time for frozen elements. The property is not written anymore and is ignored in old GraphML files for the built-in types. - Edge to edge connections where not parsed correctly when deserialized from GraphML.
yfiles.lang.Object.$class
'sisAssignableFrom
andisSubclassOf
did not work correctly for trait/interface types.- The type-checking debug helper did not accept
function
s as values for the variousBinding
properties atGraphSource
andTreeSource
and threw an error which made parts of theInteractiveGraphSourceDemo
crash when debugging was enabled. - Setting the
DefsManager
'scleanupInterval
property had no effect once the manager was in use. - The optional
PortDefaultsPortCandidateProvider
class did not work correctly and resulted in exceptions being thrown when reconnecting edges. - 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
RotatedSliderEdgeLabelModel
was used withautoRotationEnabled
set 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.SvgExport
adds support for exporting the CanvasControl's content to SVG. - A great number of additional status-indicating events has been added to the various default input modes in order to provide fine-grained callbacks to customization code.
- New pluggable development support to provide runtime type information and convenient debugging support in the browser.
- Major improvements to the overall rendering performance. Up to 200% gain when interacting with diagrams in Internet Explorer.
Also, significant improvements of execution speeds of the automatic layout algorithms. - The library no longer contains Apache licensed third party code.
Automatic Layout
- Class
yfiles.router.polyline.EdgeRouter
is 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.DefaultEdgeIntersectionCalculator
now supports cropping edges directly at the port instead of at the node's geometry. This can be used to easily have edges end at the port instead of at the geometry of the node. See the new 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.LabelLayoutTranslator
added optionautoFlipping
to specify whether or not edge labels should be automatically flipped if they would be upside-down.yfiles.labeling.AbstractLabelingAlgorithm
added optionautoFlipping
to 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.OrthogonalGroupLayouter
supports labels at edges incident to group nodes.yfiles.hierarchic.IncrementalHierarchicLayouter
now 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.GenericTreeLayouter
creates more compact layouts, especially for trees with edge labels.yfiles.partial.PartialLayouter
: Now considers edge ports when calculating the barycenter of a component (ifpositioningStrategy
is set toSubgraphPositioningStrategy.BARYCENTER
).- Added auto-flipping to
yfiles.layout.RotatedDiscreteEdgeLabelLayoutModel
andyfiles.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) ifweightedCycleRemoval
is enabled.- Added the ability to
yfiles.tree.DefaultNodePlacer
to produce polyline style edge routings with sloped edge segments. - Added the ability to
yfiles.tree.DefaultPortAssignment
to distribute edges at the border of the nodes. - Improved the performance of
yfiles.layout.PortCandidate
which potentially improves the performance of theyfiles.hierarchic.IncrementalHierarchicLayouter
with rotated graphs with PortCandidates. - Optimized number of generated
yfiles.layout.PortCandidate
s inyfiles.layout.RecursiveGroupLayouter
for the core layouter.
Demos
- Added context menu to
demo.yfiles.toolkits.jquery.simple
. - Added new demo
demo.yfiles.printing
that shows how to print a CanvasControl's content usingyfiles.canvas.SvgExport
.
Bugfixes
yfiles.drawing.IconLabelStyle
has been fixed.
Automatic Layout
yfiles.hierarchic.IncrementalHierarchicLayouter
: Fixed incorrect handling of port candidates in layouts where rotation and a mirror was set.yfiles.layout.RotatedSliderEdgeLabelLayoutModel
andyfiles.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.IncrementalHierarchicLayouter
while layouting extremely large, deeply nested graphs. - Fixed bad edge routings in
yfiles.genealogy.FamilyTreeLayouter
when there are several marriages between generations. yfiles.layout.IsolatedGroupComponentLayouter
now 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.OrthogonalLayouter
andyfiles.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.ImageNodeStyle
now stretches images to fit the node's bounding box. To restore the old behavior, subclassyfiles.drawing.ImageNodeStyleRenderer
and override methodgetPreserveAspectRatio
with an implementation that returnstrue
.- Since with this release
yfiles.graph.LayoutGraphAdapter
translatesyfiles.model.IMapper
instances in the graph's mapper registry asyfiles.algorithms.IDataMap
implementations that enable data write-back scenarios, the code that deals withIncrementalHierarchicLayouter.LAYER_VALUE_HOLDER_DP_KEY
now behaves differently. In older releases theyfiles.algorithms.IIntValueHolder
interface was queried from the mapper to write back the layer data. Now the data is written directly into the mapper and theIIntValueHolder
implementation is ignored. Seedemo.yfiles.layout.IncrementalHierarchicLayouter
for an example on how to use the respective key.
Automatic Layout
yfiles.partial.PartialLayouter
: PropertyedgeRoutingStrategy
now disables a previously set customized edge router.
Incompatible API Changes
- The interfaces
IComparable
andIObjectComparable
have been moved from namespaceyfiles.system
toyfiles.lang
. - Method
doStartMoveTouch
inyfiles.input.MoveInputMode
has been renamed todoStartDrag
. The old method is available through the compatibility layer. - Methods
GraphMLIOHandler.readFromURI
andGraphMLParser.parseFromURI
have been renamed toreadFromURL
andparseFromURL
, respectively. The old methods are available through the compatibility layer. - The deprecated extension methods in
yfiles.model.MapperExtensions
have been removed. - The deprecated convenience methods
LookupExtensions#get
andLookupExtensions#getWithContext
have been moved to the compatibility layer. - Methods
getTargetPortCandidateProvider
andgetSourcePortCandidateProvider
inyfiles.input.GraphEditorInputMode
changed their signatures to acceptyfiles.graph.IPortOwner
instances instead ofyfiles.graph.INode
instances. This is in conjunction with support for edge-to-edge connections. Overriding methods need to be adjusted accordingly. - Method
showHitNodeCandidatesOnly
in classyfiles.input.PortRelocationHandle
has been renamed toshowHitPortOwnerCandidatesOnly
to support edge-to-edge connections. Also the behavior of this class has been changed to allow edge-to-edge connections if this feature has been enabled by providing port candidates at the edges. Should you wish to disallow edge-to-edge connection even though you are providing edge port candidates, the newedgeToEdgeConnectionsAllowed
property can be set tofalse
. - Previously it was possible to cast
DefaultEdgeIntersectionCalculator.INSTANCE
to the containing type. The singleton is not of the given type anymore. If you require an instance of that type, consider instantiating one instead.
Automatic Layout
yfiles.layout.IEdgeLabelLayout
: Removed propertypreferredPlacement
and added propertypreferredPlacementDescriptor
.yfiles.partial.PartialLayouter
: Replaced methodconfigureOrthogonalEdgeRouter
by 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
GraphOverviewControl
that 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. IEnumerable
got new extension methodsforEach
andforEachWithIndex
that make it easy to iterate over all enumerable implementations in the library.- Enumerations where not properly documented in the IDE-support
yfiles-api.js
file. - The GWT demo has been improved and revised to show client-server interaction with GWT.
- The Dojo demo has been improved to show how to use the Dojo context menu implementation with yFiles.
- Added
AddRegistryOutputMapper
overload that takes a serialization handler. - The clean-up timer handling of type
CanvasControl
and its subclasses has been improved to use less CPU and to prevent memory-leaks. - A workaround for an Safari Javascript bug (on iOS and MacOS) has been added that should prevent Safari from corrupting the state of the Javascript objects during iteration.
- The HTML Api Documentation did not always include inherited members.
- The HTML Api Documentation missed the module name prefix 'yfiles/'.
Bugfixes
CircularLayouter
yielded bad results due to a bug inGroups.biconnectedComponentGrouping
.- Tooltips sometimes caused additional scrollbars to appear in the browser and were not cleaned up correctly after uninstallation.
ImageNodeStyle
'soutlineShape
property was non-functional. Documentation has been updated and the feature can now be used as documented.- The
.css
file for the library has been moved to thelib/yfiles.css
file. The demo-framework css file has been renamed todemo-framework.css
to be less ambiguous. - The gesture for moving the viewport with the mouse (holding ctrl-key while dragging the mouse) did not work in the default configuration of
GraphEditorInputMode
. - The serialization of
ImageNodeStyle
to GraphML was broken and could not be parsed in again. - The serialization of primitive types (Strings, Numbers, Arrays) in GraphML was broken and incompatible with the yFiles editions for .net, WPF, and Silverlight
- The 'File Operations Demo' ceased to work after obfuscation with the standard settings. An exclusion has been added to the obfuscator configuration.
- The 'File Operations Demo' displayed an error dialog when loaded in chrome under same origin restrictions, such as from the file system. This has been improved to show only a warning.
- The Image Export Demo now loads the third party demo code from a cache at our website, avoiding a problem with git-hub's mime-type handling in Internet Explorer and the risk of external changes breaking the demos.
- The Image Export Demo had a workaround for an issue in Chrome that has been fixed in the meantime. The fix broke the workaround, though. The code for the workaround has been improved to work in both cases, now.
- Expanding and collapsing a folder node programmatically does not require the
yfiles/graph-input
module anymore. - The illegal argument exceptions now correctly carry the parameter of the illegal parameter that caused the exception.
- Several race-conditions during the AMD loading in some of the demos have been removed.
- Some constructors in the sample files called their base constructors twice.
ShadowNodeStyleDecorator
was not displaying a shadow. This has been fixed to use SVG filter effects. We recommend using the built-in drop shadow visualizations, however, since at least for larger visualizations the filter effects do not work very well.BendAnchoredPortLocationModel
could throw an IndexOutOfRangeException under certain circumstances.- Setting
GraphOverviewControl.graphPaintable
had no effect. CanvasOverviewGraphVisualCreator
did not reset the stroke for drawing edges and therefore always used the last stroke that was set used on the canvas.- 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.
RotatedSliderEdgeLabelModel
crashed with an undefined method error.DefaultSelectionModel
was not always cleaned up correctly when the domain was changed.SliderEdgeLabelModel
threw an exception for paths with zero length segments.FilteredGraphWrapper
: The adjacency state of the filtered instance was wrong under certain conditions.FreeEdgeLabelModel
: Fixed bad positions returned by parameter finder.- Accidental debug console output during dragging of labels was removed.
Incompatible Changes
- Obsolete duplicate class
MemoryImageNodeStyle
has been removed from the package. UseImageNodeStyle
instead. - The type of
ImageNodeStyle
'soutlineShape
property (and alsoTemplateNodeStyle
,TemplateLabelStyle
, andTemplatePortStyle
) has been changed to acceptGeneralPath
instances. 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.