SmartEdgeLabelModel, it was impossible to move a label from the left side of an edge to the right side. Instead, the label stopped at the edge.
#compareRenderOrderand when using
BOTTOM_LEFTnow work correctly.
DefaultLabelStyle: Fixed insets calculation.
LayoutExecutorwhich could occur when a layout is applied to a graph which contains table nodes which are not group nodes.
RotatableNodesDemothat shows how support for rotated node visualizations can be implemented on top of the yFiles library.
PartitionGridDemothat shows how a
PartitionGridcan be used in layout calculations to restrict the node positions to grid cells.
RenderingOrderDemothat shows the effect of different render policies on the z-order of nodes, edges, labels and ports.
EdgeToEdgeDemothat demonstrates the use of edge-to-edge connections.
GenericLabelingalgorithm and improved the quality of the label placements for some cases.
EdgeStyleDecorationInstallerwould cause an exception when used on edges that connect to other edges.
CreateEdgeInputMode: Fixed a bug that caused the visualization of source port candidates to flicker.
EdgeStyleDecorationsInstallerclass now properly displays decorations for edges between group nodes and their descendants when displayed in view coordinates.
CollapsibleNodeStyleDecorator: Although the wrapped style has its own
IClickListenerdefined in its lookup, it was not always used by the
UndoEnginethat could lead to memory leaks if the tokens returned by
getTokenwere not disposed of when the
GridVisualCreatorthat rendered the grid at the wrong location when the viewport contained negative coordinates.
IsHitrespects buttons outside the node bounds.
Paths#findAllChainsnow correctly calculates the chains of input graphs with cycles.
EdgeRouterthat sometimes caused a non-deterministic behavior.
PolylineLayoutStagedoes no longer generate overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes).
EdgeRouterclass during routing in cases where the input contained grouped edges.
GenericLabelingclass now produces better results for edge labels that have a preferred distance to the edge (
PreferredPlacementDescriptor#DistanceToEdge) and at the same time multiple
SideOfEdgepreferences (e.g. left of edge and on the edge). Previously, the algorithm sometimes violated the preferred distance even though it would have been possible to keep it.
PortCandidatewith fixed offsets (or a strong
PortConstraint) by the
EdgeRouterclass. The first was only triggered for constraints at the target side and only when the target node was additionally partly or fully covered by other obstacles (e.g. node labels). The second issue appeared in cases with the source and target node fully overlapping (e.g. an edge from a group to a child node).
EdgeRouterclass no longer throws an exception for inputs (rare) containing fixed, grouped edges and when
EdgeRouternow considers the correct
NodeHaloassociated with the target node when handling the minimum last segment length setting. Previously it incorrectly considered the halo of the source node which could lead to unnecessarily long or too short last segments.
EdgeRouternow correctly considers intersections between edges and labels of fixed edges if property
EdgeRouterclass during routing in cases where the source/target node is covered by obstacles (i.e. other nodes, labels).
EdgeRouterclass now correctly considers intermediate routing points when using the polyline routing style (
EdgeRouter#PolylineRoutingEnabled). Previously, it could happen that intermediate points were not part of the final polyline edge path.
PartialLayoutnow correctly considers the specified
PortCandidatesduring the orthogonal/octilinear routing of edges.
EdgeRouterno longer considers all
PortCandidateswith multiple directions as fixed
OrthogonalLayoutclass no longer throws an exception when property
OrthogonalLayout#UniformPortAssignmentEnabledis enabled and the input contains parallel edges.
CompactNodePlacerclass now correctly considers the specified values of the
OrganicRemoveOverlapsStageno longer produces infinite loops for some rare cases.
CompactNodePlacerclass no longer throws an exception for some inputs with specified strategy memento information (either via property
TreeLayoutData#CompactNodePlacerStrategyMementosor with a mapper registered with key
HierarchicLayoutclass are now shorter and take up less space if possible. Previously, segments were sometimes unnecessarily long even though the minimum length settings allowed shorter segments.
RecursiveGroupLayout, the values of the properties
ComputedPositionof the classes
RowDescriptorare now correctly set after the layout if
EdgeRouteris the corresponding
HierarchicLayoutclass now produces less superfluous crossings if there are same-layer edges with
EdgeRouterclass for cases where a large number of fixed and overlapping edge segments exist. Previously, the search could become very slow in such scenarios.
HierarchicLayoutclass now correctly handles port labels with zero height/width. Previously, such labels may have caused very large distances between some nodes.
HierarchicLayoutclass sometimes threw an
ArgumentExceptionfor input graphs that contained incremental elements in combination with groups.
HierarchicLayoutclass now prevents intersections between labels and the horizontal grid lines of a
EdgeRouterclass no longer throws an exception for some inputs containing edges with intermediate routing points.
HierarchicLayoutclass now places sloped segments of grouped octilinear edges such that they are perfectly overlapping each other. Previously, it could happen that segments were slightly displaced with respect to each other.
SeriesParallelLayoutnow correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception.
HierarchicLayoutthat could cause non-orthogonal segments when the input contained port labels in conjunction with edge grouping.
OrganicLayoutclass now produces deterministic results for group nodes (if property
ArcEdgeStylenow consider property changes of their source and target arrows. Previously the source or target arrow properties had to be changed to instantly see the effect.
OrganicLayoutData: The new properties
TargetGroupIdscan be used to group edges when some preconditions are met.
CanvasComponent#ScrollCommandAnimationEnabledenabled no longer changes the zoom level.
SnapResultimplementations, that has caused a
NullPointerExceptionwhen the corresponding template is null.
DefaultLabelStyleRenderer: Fixed vanishing text when using a shared renderer instance between labels with non-empty text and label with empty text.
PortDropInputMode: The labels of dragged ports were not displayed correctly.
HierarchicLayout: Fixed a problem that sometimes caused too long straight-line same-layer edges. Note that the additional length was equal to the value of
HierarchicLayout: Fixed endless loop issue causing a
StackOverflowErrorif a sub-component with a nested layout algorithm that again applied an instance of
HierarchicLayout: Fixed possible
NullPointerExceptionfor input graphs with source/target port labels (see
LabelPlacements.AT_TARGET_PORT) and with a subset of nodes associated with halos (see
HierarchicLayout: Fixed a bug that sometimes caused a wrong placement of source/target edge labels when integrated edge labeling was enabled and if there were either critical edges (see
HierarchicLayout.CRITICAL_EDGE_DPKEY) or property
SimplexNodePlacer: Fixed a very rare
IllegalArgumentExceptionthat was caused by some input graphs that contain both swimlanes and groups as well as fixed elements.
HierarchicLayout: Fixed bug that could cause the violation of fixed port candidates if there were critical edges (see
HierarchicLayout.CRITICAL_EDGE_DPKEY) and edges connecting to group nodes.
OrganicLayout: Fixed bug that caused that movable nodes kept their initial location if the scope is set to
MAINLY_SUBSETand if there are output restrictions (see
TreeLayout: Fixed bug that caused less compact results when using the
TreeLayout: Fixed bug that caused that the layout algorithm sometimes did not pass on exceptions that occurred during the layout calculation but caught them without proper handling.
NullPointerExceptionthat was triggered when the tree root was marked as assistant node, see
IllegalStateExceptionthat could occur for input graphs that contain assistant nodes (see
AssistantNodePlacer#ASSISTANT_DPKEY) and given placement strategies (see
NullPointerExceptionthat occurred when the subtree layout style
TreeLayoutStyle#INTEGRATEDwas specified, the subtree orientation was fixed and the graph was almost a tree graph with the exception that the root node contained additional self-loop edges.
SeriesParallelLayout: Fixed a rare bug that triggered a
NullPointerExceptionwhen the input location of a node was set to a very large value (e.g. largest possible floating-point value). This applies if the algorithm is not in from-sketch mode. For the from-sketch mode, an exception can still occur - this case is considered to be bad input.
NullPointerExceptionthat was triggered when there was a
DataProviderregistered with the graph with key
ComponentLayout: Fixed an
IllegalArgumentExceptionthat was triggered for some input graphs with user-defined components (see
COMPONENT_ID_DPKEY) where at least one node had
nullas its component id.
RecursiveGroupLayout: Fixed a bug that caused violation of PortConstraints or PortCandidates for self-loops where both endpoints were restricted to the same node side.
Polyline.EdgeRouter: Fixed a rare
NullPointerExceptionthat was triggered for some input graphs when the maximum duration was exceeded.
Polyline.EdgeRouter: Fixed bug that could cause unnecessary bends for edges that need to cross group node borders.
Polyline.EdgeRouter: Fixed an issue that caused edge-to-edge distance violations (for segments directly connecting at a node) even if a cheaper route that e.g., introduces a bend - which costs less by default - was available.
PolylineLayoutStage: Fixed a bug that caused collinear bends to be removed from fixed edges. Now, such fixed edges are not changed anymore.
GenericLabeling: Fixed a very rare
IllegalArgumentExceptionthat was caused by some input graphs that contain edges with zero length segments and labels associated with a free edge label model (i.e.,
PortDropInputModeclasses implement drag and drop for labels and ports, respectively. The API of these classes is similar to
InsideOutsideLabelModelcan be used to place such labels. On the technical side,
IPortnow extends the
ILabelOwnerinterface and the enum constant
LassoSelectionInputModeselects all model items inside a hand-drawn lasso region. This mode allows combinations of free-hand and straight-line sections during path creation. The following types and methods were added to support this mode.
GraphViewerInputMode#LassoSelectionInputModeproperties and a corresponding factory method.
LassoSelectionInputModeis disabled per default.
GraphViewerInputMode#lassoSelectmethods programmatically selects all items in the provided
ILassoTestableinterface specifies whether the item is considered to be inside the lasso path. This is analog to the
IMarqueeTestableinterface for marquee selection.
ILassoTestableor provide one in its lookup. For this, the
BendDecoratorclasses got the new
LassoTestableDecoratorproperty for decorating an item with a custom
LabelStylecan be overridden to customize the lasso testing behavior.
AdjacentNodesGraphBuilderclasses can be used to build a graph from custom data.
GraphModelManagerfor the visualizations of nodes and edges have been improved and clearified.
HierarchicEdgeNestingEnabledare superseded by the new
HierarchicNestingPolicyproperty. This property has the enum type
GraphModelManagerto visualize all leaf nodes in one canvas object group while nesting all group nodes depending on their hierarchical depth.
NONE, and optionally, the action can be performed only when the control is focused. This can be configured with the new
TableEditorInputMode: Double clicking a stripe or stripe label now edits the label in the same way as for other graph items.
InsetsD: Added methods to
reducethe size of an
IPositionHandler#combinecombine multiple position handler instances into a single instance.
GraphEditorInputMode, and the event
IAnimation#createSequentialAnimationmethod creates an animation that animates multiple animations in sequence.
CanvasComponent#QuantizingInputCoordinatesEnabledproperty is enabled, world coordinates of mouse events are rounded to nicer values to avoid unnecessary precision. For example, you'll get the value 326.375 instead of 326.3758109495. The rounding is chosen based on the zoom level to ensure that there is almost no visual deviation. Lower zoom levels will result in coarser rounding, higher zoom levels will use exactly as much precision as necessary. By default, this option is enabled.
OrthogonalLayout: Added support for parallel routing of parallel edges (multi-edges that share the same source and target node). They are routed as parallel as possible; if there are edge labels, the routes must differ somewhat. Previously, parallel edges were not handled explicitly and their routes were often very different, making the recognition of parallel structures difficult.
OrthogonalLayout: Added new property
MaximumDuration, which enables to control the preferred time limit of the layout algorithms.
OrthogonalLayout: Added property
UniformPortAssignmentEnabledthat allows to obtain results with a more uniform port assignment.
TemporaryGroupNodesInsertionStagethat automatically generates a (non-nested) grouping structure from a given mapping of nodes to a component Id. This temporary grouping is meant for use during the run of the core layout algorithm of the stage. It allows, for example, easy use of
RecursiveGroupLayoutwithout the need for a real grouping structure when the requirement is that different sub-graphs need to be arranged with different layout algorithms.
TemporaryGroupNodeInsertionDataconfiguration class for the new
TreeLayout: Added node placer
CompactNodePlacerthat produces more compact tree layouts. It uses a dynamic optimization approach that chooses a placement strategy of the children such that the overall result is compact with respect to a specified aspect ratio, see property
TreeLayoutData#CompactNodePlacerStrategyMementosproperty can be used to to maintain similar layout styles over subsequent runs of compact tree layout.
TabularLayoutthat generates simple tabular arrangements of nodes. It allows for placing nodes in rows and columns, such that each table cell contains at most one node. Among its features is, for example, a from-sketch mode, the possibility to exactly map nodes to specific cells or different vertical and horizontal alignments.
TabularLayoutDataconfiguration class for the new
OrthogonalLayout: Added support for special layout styles of various substructures that are automatically detected in the input graph. Supported substructures are trees, chains and cycles - see the according properties
OrthogonalLayout#CycleStyle. In addition to the style, the new feature offers more settings, like, for example, the desired tree layout orientation (see
OrthogonalLayout#TreeOrientation). The orthogonal layout style
LayoutStyle#NORMAL_TREEhas been removed as the new tree style feature allows more settings for the arrangement of tree-like graphs.
TreeMapLayoutthat generates tree maps. Tree maps present hierarchical data using nested rectangles (nodes) where each rectangle (node) gets its size depending on a specific dimension of data associated to it.
TreeMapLayoutDataconfiguration class for the new
Polyline.EdgeRouternow supports routing through user-specified intermediate points. All specified points will lie on the edge route in the given order. See new property
Polyline.EdgeRouter: Edges that connect group nodes with their descendants can now directly connect from the inside to the group node border. Previously, an edge needed to always leave the group node before connecting to it. The feature can be enabled/disabled individually for each edge using the new property
HierarchicLayout: Added feature that allows to define sub-components of the input graph such that each sub-component is arranged by a user-specified layout algorithm. This allows for hierarchical layouts where parts of the graph are arranged in a different fashion, e.g., to emphasize special sub-structures. The sub-components can be specified by a data provider registered with the input graph with key
HierarchicLayout.SUB_COMPONENT_ID_DPKEYor with the new
ShortestPaths: Added a-star (A*) algorithm for finding the shortest path between two nodes in a directed or undirected, arbitrary graph.
NaNvalue. Previously, this resulted not in an immediate error but broke subsequent code like an automatic layout or a content rectangle calculation.
FilteredGraphWrapperhas been improved. Now, it depends mainly on the size of the resulting filtered graph. This allows for loading very large graphs into memory and displaying only a subset of them using
ITable's default methods
findStripes, overloads without the
Predicateparameter have been added.
DefaultGraphhas new factory methods to customize undo unit creation.
DefaultGraphnow fills the undo engine and triggers events in a consistent manner for all graph element factory methods.
createParametermethods now have overloads without those parameters that are not needed every time.
InteriorStretchLabelModel: Added new parameters
CENTER_VERTICALfor horizontal or vertical centered one-line labels.
IMapper#fromMaphas been added which returns an implementation of
IMapperthat delegates to a
GraphModelManager#getMainCanvasObjectreturns the canvas object that should be used when changing the visibility or z-order of a model item.
GraphOverviewComponentnow keeps configuration changes made to the overview's
CanvasComponent#LimitingFitContentZoomEnabledproperty which controls whether the maximum zoom level for the
CanvasComponent#fitContentmethod as well as the
FitContentcommand is restricted to
1or the value of the
CanvasComponent#zoomTomethods, there are now two
CanvasComponent#zoomToAnimatedmethods that animate the viewport change.
ICanvasObjectGroup#addChild: A default method without the
ICanvasObjectDescriptorparameter was added as overload which uses the
GraphModelManagernow avoids unnecessary re-installation of items if they keep their
ICanvasObjectGroup. By these re-installations the z-order of the item in its group was lost and a new visual was created.
IAnimation#createLayoutAnimationhas been added which delegates to
LayoutUtilities#createLayoutAnimationas the method is easier to find in
IAnimation#createParallelAnimationnow takes covariant Iterables, i.e.
Iterable<T extends IAnimation>instead of
INodeparameter of the
NavigationInputMode#enterGroupmethod is now optional. If it is
nullthe whole graph will be revealed.
CanvasComponent#createInputModeContextmethod is now public instead of protected.
ClickEventArgsand therefore provides additional information like the
CreateEdgeInputMode#doStartEdgeCreationmethod taking an
initialTargetLocationparameter can be used to define the initial location that shall be used to find a target node.
CreateEdgeInputModenow removes coinciding bends if orthogonal edge creation is enabled.
CreateEdgeInputModeprovides access to a dummy target node which is used during the interactive edge creation. This allows making the node visible during creation by setting a style and size.
CreateEdgeInputModenow supports edges ending without a valid target port candidate. This allows for creating new target nodes together with newly created edges.
CreateEdgeInputMode#PrematureEndHitTestableallows for considering any location as valid target point for an edge.
CreateEdgeInputMode#DragCursorproperty specifies the cursor that is used during edge creation when no bend may be created at the current location.
CreateEdgeInputModenow supports showing port candidates at potential sources for edge creation, too.
CreateEdgeInputModenow always creates dummy ports during a gesture, instead of temporarily reusing real ports if available. This makes it possible to change e.g. the dummy edge's source port's style during the gesture.
CreateEdgeInputMode#StartingOverCandidateOnlyEnabledproperty can be used to restrict the start of an edge creation gesture to directly hovered port candidates.
CreateEdgeInputMode#getSourcePortCandidatesmethod makes determining source port candidates more flexible.
editLabelnow also returns a
Future, similar to
ClickInputModenow dispatches the clicked events in the same order as
GraphViewerInputMode, i.e. the more specific events
RightDoubleClickedare now dispatched before
DoubleClickedwill only be triggered if the event wasn't handled before.
TableEditorInputModenow handles clicks similar to
ItemRightDoubleClickedevents are raised.
ClickableRegionsdetermine for which items and regions a click event will be raised.
Visualizationhave been added to
PortRelocationHandleProviderand are applied to each
PortRelocationHandlecreated by this provider.
FreeNodePortLocationModel#NODE_CENTER_ANCHOREDfor nodes and
BendAnchoredPortLocationModel#FIRST_BENDfor edges instead of a parameter of an internal model.
MoveInputModefor unselected nodes now moves the bends of adjacent self-loops, too.
PortRelocationHandleto allow customization of the port candidates.
TextEditorInputMode#TextAreaPlacementPolicyproperty provides finer control of what happens when the
TextAreais (partially) outside of the viewport.
TextEditorInputMode#TextAreaPaddingproperty controls the padding between the
TextAreaand the border of the canvas.
CanvasComponent#Mouse2DClickedevent now reports the position of the mouse down event as its location. Previously, this was the location of the up events which can be slightly different.
PortRelocationHandle#Visualizationproperty controls how the preview during edge reconnection is handled. A new option is to change the edge during the gesture, which improves fidelity of the preview in certain cases.
MoveLabelInputMode: The visualization of a moved label has been improved. The new property
Visualizationallows easy switching between a symbolic preview, a preview or a live view.
CreateEdgeInputModenow releases the mutex before dispatching the
MoveInputModenow releases the mutex before dispatching the
ResizeStripeInputModenow releases the mutex before dispatching the
NavigationInputModecan be used to configure the determination of the "next" item.
ItemDropInputMode<T> is no longer restricted to
IElementCopiedCallbackparameter have been added.
GraphEditorInputMode#MoveUnselectedInputModeproperty provides a child input mode for moving unselected items. It supersedes the previous
#createMoveUnselectedInputModemethod. This input mode is disabled by default.
SELECTED_MOVABLES_HIT_TESTABLEhave been added to
GraphEditorInputMode. These are used as default
GraphEditorInputMode#MoveInputModeand can be reused for other input modes.
HierarchicLayout: Reduced required memory for graphs with sequence constraints.
Polyline.EdgeRouter: Improved routing quality for edges between group nodes and their descendants in the case that the routing is aborted via
AbortHandleror when the maximum duration time limit is up. Previously, such edges might not have been handled in this case, whereas now they always get a simple but valid orthogonal route.
HierarchicLayout: Improved handling of sequence and layering constraints between sub-components, see
HierarchicLayoutData#SubComponent. Previously, such constraints were ignored.
OrthogonalLayout: Reduced the number of bends of directed edges.
OrthogonalLayout: Reduced number of crossings for directed edges.
BusRouter: Now automatically ignores non-orthogonal edges with fixed bus descriptor (see
BusDescriptor#isFixed) or transforms them into orthogonal edges if they are octilinear. In previous versions, the layout algorithm simply throws an
IllegalArgumentExceptionin such cases.
OrthogonalLayout: Improved compactness of the layout results.
OrthogonalLayout: Improved result of the perceived bends optimization (see
OrthogonalLayout: The postprocessing step now also applies special transformations that can reduce the overall edge length.
MultiPageLayout: Improved runtime as well as layout quality if the input is a tree structure and the specified
#CoreLayoutis either an instance of class
ClassicTreeLayout. Furthermore, property
MultiPageLayout#AdditionalParentCountallows for specifing the number of additional proxies that the algorithm tries to add to a subtree. The original nodes associated with these proxies lie on the path of the tree's root to the subtree placed on a page.
MultiPageLayout: Added property
#ProxyReferenceNodeCreationEnabledthat allows for disabling the creation of proxy reference nodes as well as property
#MultipleComponentsOnSinglePagePlacementEnabledthat allows to prevent that elements of different connected components are placed on the same page.
PortPlacementStagenow additionally considers port grouping constraints. If two edges are port-grouped at a certain node, the stage assigns the same port location to the edges. For more information about port grouping, see
TreeComponentLayout: Added property
UndirectedTreeConsiderationEnabledthat allows for specifing whether or not undirected tree structures should be handled or not. Previously, only directed tree structures were considered.
OrthogonalLayout: Reduced the length of straight-line edges which can lead to layouts that are significantly more compact.
OrthogonalLayout: Improved optimization that reduces the number of perceived bends, see
HierarchicLayout: Fixed problem that sometimes caused an unnecessarily large distance between adjacent layers.
PlaceNodesAtBarycenterStagethat places a user-specified subset of nodes on the barycenter of their neighbors. During the core layout, these node are hidden.
SimpleNodePlacernow both support to specify a minimum distance between the edge segments that are routed orthogonally in the channel between the root node and the child nodes, see method
ClassicTreeLayoutnow allows for specifying a minimum vertical distance for the horizontal edge segments of the bus, see
Polyline.EdgeRouterand routing scenarios where it is unavoidable to cross obstacles (e.g. other nodes, labels) in order to reach the target, including cases where a crossing is necessary to guarantee that port candidates/constraints at the target side are satisfied.
Polyline.EdgeRouter: Improved quality in maze routing scenarios. Previously, it could happen that edge-node overlaps occurred even though there exists a more complicated path that yields no overlaps.
Polyline.EdgeRouterthat affect the path search phase as well as the segment location assignment phase.
TreeLayoutData#CriticalEdgePrioritiesproperty can be used to specify critical edges.
LayoutExecutor#createLayoutGraphAdaptercallback method makes it possible to configure the
LayoutGraphAdapterthat is used for the layout calculation.
SmartEdgeLabelModelnow is properly handled by labeling algorithms, resulting in better label placements.
PortCalculatorto improve the port assignment.
TableLayoutConfiguratorhas been improved:
PartitionGridDatanow reuses the
PartitionGridcreated by the
TableLayoutConfiguratorwhich provide access to the
PartitionCellIdassignment of the configurator as well as the mappings between
HierarchicLayoutDatacan be used to configure layer and sequence constraints for the
HierarchicLayout. These supersede the previous
ItemMapping#Maphas been added that allows you to use a
java.util.Mapfor the mapping from items to values.
LargeGraphsDemohas been added that shows some strategies how to keep a smooth
UIwhen large graphs shall be visualized.
InteractiveNodesGraphBuilderDemohave been added that demonstrate basic usage of yFiles' new
CustomPortModelDemohas been added that shows how to create and use a custom
RectD#toMutableRectanglemethods now return a
MutableRectangleinstead of a
GeneralPath#intersects(GeneralPath)determines whether the path intersects with another
GeneralPath#createSmoothedPathmethod now has additional parameters to change how smoothing is applied. Those new options result in nicer smoothing when combined with large smoothing lengths and many different segment lengths in the path.
IgnoreXamlDeserializationErrorsenabled, invalid property content is now skipped instead of discarding the whole object with such content.
BendDecoratorfor easy removal of decorations.
PolylineEdgeStylerenders better looking paths for self loop edges whose ports are near the node border.
DefaultLabelStylehas been improved. Using another
VisualCachingPolicy#Nevernow also speeds up the
CanvasResourceBundlehas been added which can be used to replace the default command binding key strokes and command names via
LicenseConfighas been added whose static
INSTANCEcan be optionally used to configure the license resolving:
LicenseStringproperty, it is used directly instead of trying to load a license file.
LicenseClassLoaderproperty is set, this
ClassLoaderis used to load the license file.
JDK 9is now recognized per default when writing GraphML. For
JDK 9that are no longer known to the bootstrap classloader but only to the platform classloader no explicit
XamlNamespaceMappinghas to be added to
SmartEdgeLabelModel#findBestParametermethod returned a parameter that was centered on the edge even if the desired label layout overlapped only a little bit with an edge segment or was directly aside of one.
IFoldingViewnow raises the
BendAddedevents after the created element is registered. This fixes a bug where the master item of the created item was not available in handlers for these events.
Table: The methods
setLabelLayoutParameternow throw an
IllegalArgumentExceptioninstead of an
DefaultGraphnow calls the
onRemovingPortmethods before their incident items are removed.
ITable#LabelRemovedevents for the implicitly removed associated labels are now raised, too.
IBoundsProviderin the lookup of an
IStripecould neither be decorated nor overridden by the context lookup provided by a stripe style.
INodeInsetsProviderimplementations which can be retrieved from
InteriorStretchLabelModelnow correctly sum up the space required by overlapping labels.
RectangleIndicatorInstallerreturned wrong values. This could impact the performance as e.g. some node selection highlights were updated although they were not in the view port and result in unnecessary large content rectangles.
NullPointerExceptionthat occured when any of the Descriptor properties were set while the
GraphModelManagerinstance was not yet associated to an
SelectionIndicatorManagerno longer results in a
GraphClipboard#cutdon't copy items anymore which depend on items that are selected but not included in
DUPLICATEare no longer enabled if there are no elements to cut, copy or duplicate.
CanvasComponent#fitContentnow takes into account that scroll bars that are currently visible may vanish.
PortRelocationHandleProvidernow can handle
PortRelocationHandle#GHOST_VISUALIZATION_PEN_KEYnow is excluded from obfuscation.
DefaultPortCandidateDescriptorwhich used incorrect coordinates.
ParentInputModeproperty of the
InputModeEventArgsnow is the input mode which has raised the event. Previously, some input modes erroneously set the
ParentInputModeto the containing
ItemHoverInputModeupdates the hovered item upon mouse drag events, too. This is the documented behavior. Previously, the hovered item was only updated on mouse move events.
ItemHoverInputModeremoves the hovered item upon
GraphClipboard: The contents of a folder node was not copied if the folder was copied from within a group view, i.e. if the user entered a group node. In the worst case, this might have frozen the complete application.
ClickInputModeprovided wrong click locations in the
Clickedevent if a
Mouse2DEventTypes#CLICKEDevent without preceding
Mouse2DEventTypes#PRESSEDevent was processed.
CreateBendInputModenow cancel on
CreateEdgeInputModedid not show port candidates after re-installation of the input mode.
SmartEdgeLabelModelthat is owned by an edge without visible path no longer throws an exception.
ItemHoverInputModenow resets the hovered item when moving the mouse out of the component.
GraphViewerInputModeno longer ignore changes to their sub-input modes after having been installed once.
HitTestRadiusproperty of the following implementations of
ICanvasContextnow correctly contain the value in world coordinates instead of view coordinates:
ICanvasContext#createwhen passing a
CanvasComponentbut no hit test radius.
MarqueeSelectionInputModeduring the gesture via code left the marquee visible on the screen.
TextAreanow is correctly placed.
ClickInputModewere sometimes missing when clicking on a node or edge. Now, they are always triggered unless the event was handled before.
TextEditorInputMode: Inserting a line break now replaces selected text.
GraphSnapContext#NodeToEdgeDistanceproperty is set to
LabelEditingEventArgs#Context#ParentInputModeproperty provided in the events
TableEditorInputMode#LabelEditingnow contains the corresponding
IPortSnapResultProvidernever returned any snap results.
ValidBeginCursoris now correctly hidden during edge creation when bend creation isn't allowed.
CreateEdgeInputModedidn't always update the highlight of possible source port candidates when its
ShowPortCandidatesproperty was configured to show the source port candidates.
GraphViewerInputMode: Corrected the popup menu location if the menu is opened using the keyboard. Previously, the menu could appear outside the
GraphComponentif the selected items or the current item were not completely inside the current viewport. Now the popup menu location (i.e. the menu's upper left corner) will be always inside the
ReparentStripePositionHandler: The source and target ghost visualization was not always updated correctly when custom ghosts were used.
CreateEdgeInputMode#DummyEdgeGraph#EdgeDefaultsproperty had no effect for some interactions.
NullPointerExceptionwhich could occur in customized
CreateEdgeInputModedoesn't show port candidates anymore if bend creation is enforced (by pressing
CTRLkey during edge creation).
HierarchicLayout: Fixed problem where edges between group nodes contained superfluous bends if there were grouped edges in the input graph.
Polyline.EdgeRouter: Fixed issue that sometimes caused weird edge routes if there are edges with intermediate routing points.
NullPointerExceptionthat was triggered when the list of intermediate points for an edge consisted of exactly two equal points.
IllegalArgumentExceptionthat could appear if cycle substructure detection is enabled, see
HierarchicLayout: Fixed an issue that caused non-symmetric results for grouped edges even though property
OrthogonalLayout: Fixed rare infinite loop issue for grouped graphs.
Polyline.EdgeRouter: Fixed rare
NullPointerExceptionthat occurred when there were intermediate routing points and the path search got aborted (e.g. because of maximum duration time limit).
ShortestPaths: Fixed possible
NullPointerExceptionthat occurred when the a-star algorithm was applied to a graph with non-monotonic heuristic costs.
UnsupportedOperationExceptionthat was triggered when a
DataProviderAdapterthat does not implement
IDataProvider#getwas registered with key
GivenLayersLayerer#LAYER_ID_DPKEY. The issue only appeared in conjunction with sub-components, see
FamilyTreeLayout: Fixed bug that caused that the preferred family member order wasn't considered, see
GenericLabeling: Fixed bug that could cause that a label candidate with a lower profit (see
AbstractLabeling#Profit) was preferred over another candidate with higher profit even though both candidates did not overlap with any other elements.
GenericLabeling: Fixed unexpected labeling results that occurred if a label had label candidates with different sizes. The labeling algorithm previously calculated profits of candidates under the assumption that all candidates have equal size.
HierarchicLayout: Fixed rare infinite looping issue for input graphs with fixed (i.e., non-incremental) nodes and layering constraints.
Polyline.EdgeRouter: Fixed a rare bug that caused port candidate failures for edges grouped with fixed edges.
Polyline.EdgeRouter: Fixed a bug that caused collinear bends and self-crossings to be removed from fixed edges. Now, such fixed edges are not changed anymore.
HierarchicLayout: Fixed bug that sometimes caused a
NullPointerExceptionif the input graph contains port groups, see
HierarchicLayout: Fixed bug that sometimes caused superfluous bends if the edges were routed on a grid and the grid reference point was different from
(0,0), see property
GraphLayoutLineWrapper: Fixed bug that sometimes caused a large empty space inside the drawing.
CircularLayout: Now correctly considers whether or not an inter-partition edge should be bundled or not (see
EdgeBundleDescriptor#isBundled). Previously, when having multiple partitions, inter-partition edges where sometimes bundled even if the bundling property was disabled.
HierarchicLayout: Fixed a bug where the edge thickness of grouped edge segments was not considered correctly (e.g. there was not enough space for a thick edge).
BusRouter: Fixed non-deterministic behavior with respect to multiple runs that occurred in very rare cases.
Rectangle2D#Contains(Rectangle2D)method. As a consequence of this error, the results of various algorithms and automatic layouts could have been wrong.
OrthogonalLayoutnow considers edge grouping also if there are no directed edges specified.
GenericLabelModelserialization: Fixed cyclic reference in GraphML which could happen while serializing a
GenericLabelModelwith a parameter with associated descriptor.
PolylineEdgeStylenow takes arrow heads into account for visibility checks.
IOrientedRectangle#getCenterdidn't return the correct center if the width or height of the rectangle was equal to 0.
GroupNodeDefaults#LabelDefaults#AutoAdjustingPreferredSizeEnabledproperty and the
GroupNodeDefaults#PortDefaults#AutoCleanupEnabledproperty were not considered for labels and ports of groups.
GroupingSupport#hasGroupNodesmethod now returns only true if there are actually group nodes in the graph. Previously, it returned also true if there once were group nodes which had been removed in the meantime.
TableNodeStyle: Fixed missing default visualization.
TableNodeStyleis rendered with
clonemethod now is overridable in all style implementations.
ReparentStripePositionHandler: All callback methods dealing with ghost objects have been renamed consistently:
Arrow#getAsFrozenwas removed as there was no benefit in converting the Arrow instance in an immutable instance.
MoveLabelInputMode#createLabelHitTestablehas been removed. Developers who want to set a custom instance need to set it directly to the
GraphEditorInputMode/GraphViewerInputModenow provides the
GraphEditorInputMode/GraphViewerInputModeas parent input mode in the
Contextproperty of its
ITable#RelativeLocationproperty has been removed. Use
CleanUpin API names.
targetPortCandidateparameter. Callbacks must handle this case by either creating a target port of their own or canceling the edge creation by returning
StripeSubregion#TargetTableNodeproperty is now read-only.
GraphEditorInputMode#createMoveUnselectedInputModemethod has been removed. Use the property
CreateEdgeInputMode#PortCandidateShowingEnabledproperty has been replaced by the
CreateEdgeInputMode#ShowPortCandidatesproperty which has the enum type
OverviewInputMode#AutoMouseWheelZoomEnabledproperty has been replaced by the
OverviewInputMode#MouseWheelBehaviorproperty which has the enum type
XmlNamewere removed from the layout distribution where they were not used.
CanvasComponent: Removed the events
HitTestRadiusChanged. These events are unneeded since the corresponding properties are not changed by library code.
Pen#adopthas been renamed to
#committo better reflect what it really does.
DpKeyBasehas been renamed to
AbstractDpKeyand made an abstract class.
AbstractDpKeyand all subclasses now take the value type as additional constructor parameter. This value type may be retrieved through read-only property
IMapperRegistry: The value type parameter was removed from all default methods taking
MoveViewportInputMode: The properties that controlled the inertia behavior have been removed since they no longer apply to the new algorithm. Instead, the new property
InertiaDurationcan be used to specify the duration of the inertia scrolling.
GraphModelManager#HierarchicNodeNestingEnabledhas been removed. Set the new
HierarchicNestingPolicy#NONEto disable node nesting or to either
HierarchicNestingPolicy#NODES_AND_EDGESto use nesting. Similarly,
GraphModelManager#HierarchicEdgeNestingEnabledhas been removed. Use either
HierarchicNestingPolicy#NODES_AND_EDGESto enable edge nesting or any other policy to disable it.
CanvasComponent#animateScrollTohas been removed and is superseded by the new
SliderEdgeLabelLayoutModel#AutoFlippinghas been renamed to
TableLayoutConfigurator#Compactionhas been renamed to
GraphPartitionManager#FiringGraphEventsEnabledhas been removed.
ValueSerializer#getSerializerFortaking no context have been removed.
com.yworks.yfiles.layout.hierarchic.GroupingSupporthas been removed.
IGraph#setNodeLayoutmethod and the various methods to create a node now throw an
IllegalArgumentExceptionif the layout rectangle contains one or more
NaNvalues. Similarly, the
IGraph#setBendLocationand the various methods to add a bend to an edge now throw an
IllegalArgumentExceptionif the location point contains one or two
CreateEdgeInputMode#DummyEdgeproperty is now always reset after the edge creation was finished or canceled.
SizeD#isFinitenow also consider empty instances as not finite.
MoveLabelInputMode: The moved label now is visualized as a preview instead of a symbolic rectangle. Set the
Visualization#GHOSTto restore the old mode.
LayoutExecutor#ContentRectUpdatingEnabledproperty is now enabled by default.
CreateEdgeInputMode: The determination whether the mouse hovers over a valid end has changed. If
ForcingSnapToCandidateEnabledis disabled, the
EndHitTestablenow is queried first and a target port candidate is only searched if the hit testable returns
true. Previously, the hit testable was only queried if no target port candidate was found at the current location.
GraphModelManager#UsingHierarchicEdgeNestingEnabledproperty was set to
true, canvas objects for edges were added to the
GraphModelManager#EdgeGroupas long as no group nodes were part of the graph. The corresponding new
NODES_AND_EDGEShas no such behavior and thus,
EdgeGroupis empty by default. Use one of the other polices if canvas objects for edges should be part of
PolylineEdgeStyledefaults to an improved smoothing algorithm when using the
SmoothingLengthproperty. This is especially apparent when using large values for
CollapsibleNodeStyleDecorator#createSelectionInstallerhas been removed.
ClickInputModenow dispatches the more specific events
RightDoubleClickedbefore the general
DoubleClickedwill only be triggered if the event wasn't handled before.
HierarchicLayoutDatahave been marked as deprecated. The new properties
SequenceConstraintsshould be used instead. Similarly, the factory methods
LayoutUtilities#createSequenceConstraintFactory(IGraph)have been marked as
PartitionGrid#hasAtLeastTwoNonEmptyRowshas been marked as
@Deprecatedand may be removed in future releases.
GraphEventsdemo can be used to explore the different kinds of events dispatched by yFiles for Java.
IsometricDrawingdemo displays graphs in an isometric fashion to create an impression of a 3-dimensional view.
EdgeBundlingdemo shows how to reduce visual clutter through edge bundling.
Umldemo shows interactive creation and editing of UML class diagrams.
SVGNodeStyleDemo: Made the build scripts Java 9 ready.
GridVisualCreatornow respects the clip of the render context passed to its
IArrow#CIRCLEnow uses a real circle for rendering.
SnapLineresource keys from
CanvasComponent's client properties.
GraphViewerInputModeno longer ignore changes to the sub-input modes exposed as properties after having been installed once.
CanvasComponentthat moved the viewpoint too much when changing the zoom property.
@GraphMLeven if the
GraphML#singletonContainersproperty was not set.
TextEditorInputMode: The size calculation for the editing
#TextAreawas fixed to respect all properties of the
#LineBreakRecognizerno longer results in two new lines each time
DefaultLabelStyle: Fixed line breaks when text wrapping is enabled.
#updateVisualto take all style properties into account when determining whether or not the visualization has to be re-created.
AbstractJComponentStyle: Fixed a bug that prevented serialization of the
#ContextLookupproperty after obfuscating the library.
XmlWriter: Fixed JDK 9 only additional, undesired whitespace when writing
HitTestRadiusproperty instead of view coordinates:
ICanvasContext.createCanvasContextwhen passing a
CanvasComponent, but no hit test radius.
IInputModeContextpassed to adjacent handles when moving a bend handle.
InteriorStretchLabelModel#getMinimumNodeSizenow uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.
NodeStyleStripeStyleAdapter#updateVisualmethod always created a new visual by delegating to the
#InputModein a key event handler no longer throws an exception.
MapperRegistry#addMapperno longer throws an exception when trying to replace a mapper for an existing key.
NinePositionsEdgeLabelModelnow disappear when the owner edge has no visible edge path. This can happen for example when nodes are moved onto each other. Previously they appeared at unexpected locations, including the origin (0,0) and the upper left corner of the source node.
nullif there is no tangent at the requested position. Previously, it returned a bogus tangent.
FreeNodeLabelModel#INSTANCEare now serialized correctly to GraphML when not used as part of their parameters (e.g. within
IGraph#calculateLabelPreferredSizewhich was thrown when the label owner was not part of the graph, but all optional parameters have been passed anyway. In that case there was no need to fetch the appropriate
LabelDefaultsand thus the question of whether the owner is in the graph or not is irrelevant.
CreateEdgeInputModedid not always start correctly for quick gestures on slow devices.
CreateEdgeInputModedid not trigger the
#EdgeCreationStartedevent for programmatic initialization of the edge creation gesture.
#CurrentHandleproperty could not always be obtained during the
#CancelRecognizercould potentially get the input mode into a broken state.
ICommand#COPYcommand is no longer executed twice.
ViewportAnimationthat sometimes moved the viewport a bit before the animation started.
DropInputModewhich occurred if a drag enter was recognized while another drag action was still running.
CreateEdgeInputModeno longer fires gesture cancel events if it has not been started before.
StripeDropInputModeno longer calls
StripeDropInputMode#ItemCreatedevent was not raised.
GeneralPath#isVisibleoften returned true for invisible paths.
UndoEnginenow uses the end time of the previous undo unit for automatic bracketing instead of the start time. This improves auto-bracketing to work as intended for undo units spanning a time greater than
Rectangle2D#contains(Rectangle2D)method. As a consequence, the results of various algorithms and automatic layouts could have been wrong.
PortPlacementStage: Fixed bug that caused
NullPointerExceptionwhen the ports of edges in the input graph were outside the node bounds.
BusRouter: Fixed rare
NullPointerExceptionthat could be triggered if there are buses with both fixed and movable edges at the same time.
AbstractLabelLayout: Fixed bug that the box returned by
AbstractLabelLayout#BoundingBoxwas not consistent with the bounding box of the oriented box (
AbstractLabelLayout#OrientedBox). This was the case when the mutable oriented box instance was changed.
LayeredNodePlacer: Fixed bug that caused node-edge overlaps for some configurations.
MultiPageLayout: Fixed bug that edge type
EdgeType#PROXYwas never used.
StraightLineerroneously rerouted all edges in the graph instead of just the ones that were required.
RuntimeExceptionthat could be triggered when the graph contained fixed edges (see
EdgeRouter#SphereOfAction) with very short segments.
IllegalArgumentExceptionthat could be triggered when the user specified both edge directedness (see
HierarchicLayout#EDGE_DIRECTEDNESS_DPKEY) and layering constraints.
OrthogonalLayout: Fixed rare bug that caused node-edge overlaps.
SimplexNodePlacer: Fixed rare
IllegalArgumentExceptionthat could be triggered when the input graph had a partition grid and
OrganicRemoveOverlapsStage: Improved adherence to the specified maximum duration.
HierarchicLayout: Improved port assignment for edges incident to group nodes that are routed directly (see
EdgeLayoutDescriptor#DirectGroupContentEdgeRouting). Previously, such edges were often reversed.
HierarchicLayout: Fixed bug that caused violation of specified
PortCandidates of edges with labels with preferred placement specifier
LabelPlacements#AT_TARGET_PORTwhen using an orientation other than top-to-bottom.
SeriesParallelLayout: Fixed bug that caused misplaced edge labels for graphs containing only a single edge.
HierarchicLayout: Improved adherence to the specified maximum duration by applying a suitable runtime restriction to class
PortCandidateOptimizer. Previously, this class didn't have any runtime restrictions.
OrthogonalLayout: Fixed rare bug that caused overlapping nodes.
OrthogonalLayout: Improved from-sketch mode (see
UseSketchDrawing) in conjunction with node labels or node halos. Previously, in the presence of the mentioned elements, the layout results did not always correctly resemble the sketch drawing, even if it was a good sketch.
HierarchicLayout: Fixed bug that caused that property
HierarchicLayout#ComponentArrangementPolicywas not correctly considered when there are undirected edges (see
HierarchicLayout: Fixed bug that lead to edge ports lying outside the node boundaries when using the edge thickness feature (i.e. edges with thickness greater than zero, see
HierarchicLayout#EDGE_THICKNESS_DPKEY) together with a (rather large) grid spacing value and the default port assignment
HierarchicLayout: Fixed bug that caused unnecessarily large layer distances in case that there exist empty partition grid rows with a minimum row height.
HierarchicLayoutwith partition grid: Fixed bug that in some cases caused an
IllegalArgumentExceptionwhen the layout algorithm was configured to stop after the layering or sequencing phase (see
DefaultNodePlacer: Fixed bug in
DefaultNodePlacer#MinimumLastSegmentLengththat caused that the value of
TreeLayout: Fixed bug in
DefaultPortAssignmentthat caused a memory leak.
TreeLayout: Fixed bug in the integrated edge labeling feature that caused that multiple edge labels were not always ordered correctly along the edge with respect to their preferred placement setting (i.e., place at source, center or target preference). For example, a source label should always come before a target label in the direction of the actual edge flow.
polyline.EdgeRouter: Fixed bug that sometimes caused a violation of the minimum first or last segment length if they were set to relatively large values.
OrthogonalLayout: Fixed rare bug that caused non-orthogonal line segments and bad edge end points.
CreateEdgeInputModenow triggers the
EdgeCreationStartedevent for programmatic edge creation with the
HierarchicLayout: Added support for port grouping, see
PortConstraintKeys#TARGET_GROUP_ID_DPKEY. Edges are bundled at their ports, but routed independently.
HierarchicLayoutnow allows to specify the directedness of edges, see
HierarchicLayout#EDGE_DIRECTEDNESS_DPKEY. This new feature enables to, for example, support mixed graphs that contain both directed and undirected edges: While for directed edges the layering step tries to find a solution where the source of an edge is placed above the target (with respect to the main layout direction), for undirected edges the direction doesn't matter and the edge may also be inserted as same-layer edge. This feature also enables to force some edges to specifically point against the main layout direction.
HierarchicLayout: Added support for edges with a specific thickness. Minimum distances in the layout will consider these thicknesses, see
LabelPlacements: Added preferred placement specifiers
#AT_TARGET_PORTfor edge labels which express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of the
HierarchicLayoutand can be specified with property
OrganicLayoutnow supports the detection of regular substructures in the graph (see methods
#setParallelSubstructureStyle(ParallelSubstructureStyle)and applies a specific layout style to them such that they can be better recognized.
TreeReductionStage: Added possibility to specify a custom labeling algorithm that places labels of non-tree edges. Now, users do not need to take care of such edge labels themselves after using a tree layout algorithm on a non-tree input graph in conjunction with the reduction stage. See properties
SeriesParallelLayout: Added possibility to specify a custom labeling algorithm that places labels of non-series-parallel edges. Such labels are now automatically handled. Users do not need to handle them after running the algorithm with a non-series-parallel input graph. See properties
IGraph: The default methods
#applyLayout(ILayoutAlgorithm, LayoutData)have been added.
FilteredGraphWrappernow no longer queries the node and edge predicates as often.
IMapperRegistry: Several overloads for the
#create*Mappermethods have been added that take more specific tags but allow to omit the keyType parameter.
#morphLayoutconvenience methods have been added that run a layout on the graph of the component and animate the results.
GraphComponent#GraphMLIOHandlerhas been added to set a custom
GraphMLIOHandlerto be used by the IO commands and convenience IO methods. Previously the lookup of the class needed to be decorated.
GraphComponent: The overloads
#exportToGraphML(java.io.Writer, java.net.URI)have been added.
Animator: A getter for the
CanvasComponent, which had been passed to the constructor, was added.
VoidStripeStyleRendererhave been changed to the concrete types instead of the interface types (e.g.
IconLabelStyle: A constructor has been added that only takes a custom renderer as argument.
DefaultPortCandidateDescriptor, which is used to visualize
IPortCandidates, now provides static
ResourceKeyfields that are used to lookup
IVisualTemplates for the different states of
IVisualTemplates can be used by either registering them via
CanvasComponent#putClientPropertyor by the new convenience method
CreateEdgeInputModenow respects the settings
GraphSnapContext. It also handles grid snapping according to the configuration for snapping.
#addXamlNamespaceMappingmethods for easier control of the XML namespace for certain types.
GraphMLIOHandlerhas two new events,
#QueryNamethat allow for fine-grained control over XML namespace writing and parsing for certain types.
GraphMLIOHandler: The overloads
#write(IGraph, java.io.OutputStream, java.nio.charset.Charset, java.net.URI)and
#write(IGraph, java.io.Writer, java.net.URI)have been added.
GraphMLParser: The overloads
#parse(IGraph, InputStream, IGraphElementFactory)have been added.
GraphML: The performance for parsing java enums and
FlagsEnumshas been improved.
GraphML: Parsing java enums and
FlagsEnumshas been refactored and now respects
HierarchicLayout: Slightly reduced the number of bends when integrated edge labeling is enabled.
HierarchicLayout: Fixed unstable from-sketch behavior for non-default layout orientations when group nodes are folded or expanded. Applies to orientations
LayoutOrientation#BOTTOM_TO_TOP. Geometry information registered with data providers with keys
HierarchicLayout#ALTERNATIVE_EDGE_PATH_DP_KEYis now automatically rotated according to the specified layout orientation.
HierarchicLayout: Improved support for
PortCandidates at group nodes. Previously, they were only obeyed if there was just a single candidate defined, which also applied to the opposite node (not necessarily a group node). 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.
HierarchicLayout: 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.
HierarchicLayout: Improved edge grouping such that it is now possible to group incoming/outgoing edges as well as same-layer/backloop edges with common edges.
HierarchicLayout: Can now take the original edge route into account to determine the route of a self-loop.
MultiPageLayout: Added new option
#StrictClusterSeparationEnabledthat allows to specify whether or not nodes with different cluster IDs may be placed onto the same page.
AspectRatioTreeLayoutnow support custom selection of the root node of the tree.
BalloonLayout: Interleaved child placement now works in conjunction with from sketch-mode and custom child order comparators. This means that the settings
#Comparatorare no longer ignored when enabling the interleaved placement mode (see
TreeLayout: Now take into consideration the minimum group node size specified by the user with a
IDataProviderregistered with the graph with key
SeriesParallelLayout: Now takes into consideration the minimum node size specified by the user with a
IDataProviderregistered with the graph with key
EdgeRouterwhen routing edges that have
OrthogonalSegmentDistributionStageand thus also
ChannelEdgeRouterwhich 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.
PartialLayoutfor input graphs that feature a high number of large subgraph components. Does not apply for component assignment strategy
LayoutUtilities#applyLayoutnow supports layout of tables.
ItemMapping: The property
#Mapperis now automatically set on first read-access to the property, enabling more convenient use of the mapper without first having to instantiate a matching instance.
PartitionGridData: It is now sufficient to specify one of a row mapping or the column mapping. The unspecified one will automatically be set to 0, resulting in a single row or column being used.
TreeLayoutDatanow have an
EdgeLabelPreferredPlacementproperty which supports an
ItemMappingfor edge labels to provide a
PrefererredPlacementDescriptor. Can be used as alternative to mappers registered with
PlanarEmbeddinghas been added and allows to calculate and query an embedding of a planar graph.
IGraph#addLabelthat ignored an explicitly specified preferred size if folding is enabled.
FilteredGraphWrapper: The fail-fast mechanism to detect concurrent modification changes in the
IListEnumerablesdidn't detect all modifications correctly.
SandwichLabelModel: Fixed incorrect
DefaultValueannotation for some created parameters.
SmartEdgeLabelModel: An exception was thrown if the path of the corresponding edge contained bends that were close together or at the same location.
NinePositionsEdgeLabelModel: Fixed the placement for the positions
GeneralPath#equalsdoes no longer check for path equivalence (same coordinates etc.), but simply checks reference equality. This makes it consistent with the
#hashCodemethod. To check for path value equivalence, use the new method
#importFromGraphML(java.io.File)method to respect the
#ClearingGraphBeforeReadEnabledproperty. (All the other
#importFromGraphMLmethods already did so.)
ComponentOrientation#RIGHT_TO_LEFTis set on the
GraphOverviewComponent: Setting a new
#OverviewInputModeupdates now the
GraphModelManagerthat didn't update the child groups if a new
falsewas not respected when the graph changed or a group node was created first on a yet ungrouped graph.
IVisualactually has been removed instead of just before the removal.
NullPointerExceptionin the graph rendering code when items were removed from the graph during their style's
#updateVisualmethod. This could happen when removing graph items from a different thread (which is still not supported, but at least this particular case won't crash anymore).
GridVisualCreatorwith grid style
Controlkey anymore but the
Commandkey as modifier instead.
CreateEdgeInputMode: Fixed a bug that didn't show the edge preview when the edge would be created between a node and one of its ancestors or vice versa.
#EdgeCreatedevent triggered before the corresponding undoable edit was committed. This could result in a broken undo queue, if e.g. an animated layout was started during in the event listener. The event now triggers after the edit has been committed. With automatic undo unit merging, this should not make a difference for the end user, however from the perspective of the code there will be two subsequent edits, rather than one compound, if the code in the listener actually modifies the edge.
CreateEdgeInputMode: Fixed a bug that broke the edge preview after the input mode was uninstalled and reinstalled again.
ESC, the dragged bend was removed.
OverviewInputMode: Fixed a bug that could break the overview visualization if the overview has a specific very small width or height.
StripeDropInputMode: Fixed a bug that could result in nodes being moved to a wrong stripe when a new stripe was created or an existing one relocated.
NodeDropInputMode: Fixed a possible exception when snapping is enabled, but preview disabled.
SHIFTkey held down the node was erroneously reparented to the root.
FreeEdgeLabelModelcannot place the label correctly for self-loops. Labels previously always appeared at the port location in this case.
IBendSnapResultProviderfrom the lookup no longer leads to a crash when nodes or bends are moved.
ICommand#EDIT_LABELwould not work directly on labels when a
DefaultLabelStyle: Fixed vertical text alignment for instances with non-empty insets.
IconLabelStyle: Fixed a
NullPointerExceptionthat occurred when rendering the style while the
#Iconproperty is set to
@GraphML#contentPropertyof a class.
@GraphMLannotations for static fields.
ValueSerializerused for predefined
IArrows now also respects the
#addRegistryOutputMapper(String, String, Object, IEventListener)created multiple GraphML key definitions for the same mapper instance
@Obfuscationannotation to exclude the class from obfuscation. Excluding
Arrowfrom obfuscation is necessary for properly reading (and writing) GraphML files.
@DefaultValueannotations for the
SegmentRatioPortLocationModeland corresponding port location parameter instances.
HierarchicLayout: Fixed bug that caused a violation of the specified minimum distance or edge overlaps in the case of same-layer edges.
HierarchicLayout: 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.
HierarchicLayout: 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.
HierarchicLayout: Fixed bug that sometimes caused superfluous bends in edge routes when integrated edge labeling was enabled.
HierarchicLayout: Fixed bug that caused that the directedness of edges incident to groups wasn't considered correctly (see
HierarchicLayout: Fixed bug that caused node-edge overlaps in conjunction with some complex edge grouping specifications.
RecursiveGroupLayoutwhen used with
HierarchicLayoutas core layout algorithm: Fixed
IllegalStateExceptionthat could be triggered when group nodes of the input graph have
RecursiveGroupLayout: Fixed bug that caused edges to share the same port even though they should be assigned to different ports. Note that this problem only appeared if the core layout algorithm (see
CoreLayout) is an instance of class
SimplexNodePlacer: Fixed bug that caused overlaps between edges and nodes when enabling node compaction (see
#NodeCompaction) and having edges with either strong
OrganicLayout: 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 via
GroupingKeys#GROUP_NODE_INSETS_DPKEY) and no minimum group node size specified (
ClassicOrganicLayout: Fixed bug that caused the algorithm to not consider the specified custom
IllegalArgumentExceptionthat was triggered due to
NaNvalues that could occur in case the input graph has a very large number of nodes.
RadialLayout: Fixed bug that caused that always all edges are bundled if bundling is enabled for at least one single edge. More precisely, property
EdgeBundleDescriptor#Bundledwasn't considered correctly.
CircularLayout: Fixed bug that in some cases produced self-intersecting edges when edge bundling is enabled.
SingleCycleLayout: Fixed bug that may lead to a
ClassCastExceptionif edge bundling is enabled and a custom node sequencer is specified (see
AspectRatioTreeLayout#ROOT_PLACEMENT_DPKEYis now of type
AspectRatioTreeLayout#SUBTREE_ROUTING_POLICY_DPKEYis now of type
AspectRatioTreeLayoutDatadid not register the correct values with the graph for the root placement and the subtree routing policy.
MultiPageLayout: Fixed rare bug that sometimes caused straight-line edge routes instead of orthogonal routes.
IsolatedGroupComponentLayout: Fixed bug that caused edge labels that intersect with group nodes even though option
EdgeRouter: Fixed rare
RuntimeExceptionthat appeared if there were fixed (see
#Scope) and grouped edges at the same time.
EdgeRouter: Fixed rare
IllegalArgumentExceptionthat was triggered when having multiple target port candidates, where at least one must be fixed. Furthermore, to trigger the exception it is necessary that the path search algorithm tries to perform an early exit due to maximum duration restrictions or a stop request via
EdgeRouter: Fixed bug that caused violations of minimum first/last segment lengths of grouped edges when using different edge layout descriptors and, second, made the layout algorithm remove a user-registered
EdgeRouter: Fixed rare node overlaps in conjunction with monotonic path restrictions (see
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.
NullPointerExceptionthat occurred when the given maximum number of clusters was
NullPointerExceptions in some
LayoutDataimplementations that could happen if some of the mappings where accessed but were never really used in client code.
TableLayoutConfiguratorwhich altered the size of a column or row if an edge routing algorithm has been applied.
TableLayoutConfiguratorwhich sometimes used the wrong table insets.
ILabelsas key and
doubleas value are now correctly translated into data providers for layout algorithms.
LayoutGraphAdapter#EDGE_LABEL_LAYOUT_PREFERRED_PLACEMENT_DESCRIPTOR_DPKEYthat has been filled by a
LayoutDatahas been ignored.
IGraph: The signature of method
#addBend(IEdge, int, PointD)has been changed to
#addBend(IEdge, PointD, int).
IMapperRegistry: Renamed the methods
#create*. The type of property
#MapperMetadatahas been changed from
AbstractGraphWrapper: The signature of method
#addBend(IEdge, int, PointD)has been changed to
#addBend(IEdge, PointD, int).
FoldingEdgeState: The signature of method
#addBend(int, PointD)has been changed to
GeneralPath: The return value type of method
createPathhas been changed from
IAnimationhave been removed and are now available as factory methods in
IAnimation. This included the classes
GraphModelManager: Signature of method
#typedHitElementsAt(IInputModeContext, Class<T>, PointD, ICanvasObjectGroup)has been changed to
#typedHitElementsAt(Class<T>, IInputModeContext, PointD, ICanvasObjectGroup).
CanvasComponent: The property
#Editablehas been removed. It had no effect on almost all input modes anyway. To no longer allow editing a
CanvasComponentuse a different input mode instead, e.g.
GraphViewerInputMode, or configure the current input mode in a way that it no longer allows changes.
GraphComponent: Decorating the lookup of
IGraphto set the
GraphMLIOHandlerused by the IO commands and convenience IO methods on
GraphComponentis no longer supported. Use the
IRectanglePainterhas been replaced by the more powerful interface
IVisualTemplate. Implementations have been adjusted accordingly and members and classes with name
*RectanglePainterhave been renamed to
EdgeDecorationInstaller: The method
IVisualwas replaced by the method
IVisualTemplatethat is used for all bends of the passed edge.
EdgeSelectionIndicatorInstallernow contain static
#BEND_TEMPLATE_KEYthat can be used to register custom
IVisualTemplates for bends on the
The command mechanism has been refactored:
CommandBindingActionhave been moved to package
ExecutedRoutedEventArgsas well as the related properties on
CanvasComponenthave been removed.
KeyboardInputModeoffers new methods
#addKeyBindingfor binding commands to actions and keyboard gestures to commands.
KeyboardInputModehas been refactored. New interfaces
ExecuteCommandHandlerfor handling commands have been introduced. All methods for binding commands to
IEventListenerimplementations have been retrofitted to the aforementioned handlers. All methods for removing command or key bindings have been removed. Methods for adding such bindings now return a
KeyboardInputModeBindinginstance that offers a
#removemethod for this purpose.
OverviewInputModenow allows to zoom out further.
OrthogonalEdgeEditingContext: Changed return value of methods
HandleInputMode: For all
HandleTypes a corresponding
ResourceKeywas added as static field that can be used to register a custom
IVisualTemplatefor this handle type. Per default the
#createVisual(IRenderContext,IHandle)method now looks up the
HandleTypefor the passed
#updateVisualmethod is no longer used and was removed.
ICommand#GROUP_SELECTIONnow has a reasonable size.
IClipboardIdProvider: Signature of method
#getId(IModelItem, IGraphClipboardContext)has been changed to
GraphCopier: Changed signature of method
#addBend(IGraph, IGraph, IEdge, IBend, int, PointD)to
#addBend(IGraph, IGraph, IEdge, IBend, PointD, int).
AbstractStripeStyle: The return type of method
#clone()has been changed from
AbstractEdgeStyle. Furthermore, the return type of methods
#updateVisual(IRenderContext, IVisual, IEdge)has been changed from
TVisual extends IVisualto
#Urlhas been changed from
URLof the icon instead of its
MemoryIconLabelStyle: Simplified constructors that now only allow to specify the image of the icon as well as a custom renderer.
ArcEdgeStyle#Rendererhas been changed from
PolylineEdgeStyle#Rendererhas been changed from
TableNodeStyle: The type of property
#Rendererhas been changed from
TableNodeStyleRenderer. Furthermore, the parameter type of methods
#removePropertyChangedListener(IEventListener<PropertyChangedEventArgs>)has been changed from
VoidStripeStyle#Rendererhas been changed from
GraphMLSerializationModehave been merged to
Property: The properties
#OwnerInstancehave been removed. The new methods
setValuenow take the owner instance as parameter.
HandleSerializationEventArgs: The property
#SourceTypeis now of type
IParseContext: A parameter of type
Class<T>that describes the target type has been added to the
XamlSerializer: Signature of method
#serialize(Type, IWriteContext, Object)has been changed to
IXamlNameMapper: The return type of method
getName(IWriteContext, Type)has been changed from
QueryOutputHandlersEventArgs(IWriteContext, KeyScope, Map<Object, IOutputHandler>)has been changed to
GraphMLWriter: Return type of method
#getOutputHandlers(IWriteContext, KeyScope)has been changed from
AbstractInputHandler: The return type of method
#initializeFromKeyDefinition(IParseContext, Element)has been changed from
YList: The constructor
YList(Collection<Object>)has been changed to
#remove(int)has been deprecated.
#compare(int, int)has been deprecated.
#firePreEvent()have been deprecated.
ClassicOrganicLayout: The return type of method property
#PreferredEdgeLengthhas been changed from
double. Note that this also induces a corresponding change in class
ClassicOrganicLayout: The type of constant
#PREFERRED_EDGE_LENGTH_DPKEYhas been changed from
#getNodeLayout(Object)have been deprecated.
HierarchicLayoutCore.IncrementalHinthas been deprecated. Method
LayoutGraphAdapter: The type of the provided data provider keys have been changed from
Objectto a more specific type.
PartitionCellId: The return type of property
#Cellshas been changed from
#isIntegratedEdgeLabelingEnableddoes now always return
falseif the labeling algorithm is disabled (see
MultiStageLayout#isLabelingEnabled. 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 for the following methods:
HierarchicLayoutmay 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.
#ALTERNATIVE_EDGE_PATH_DP_KEYis now automatically rotated according to the specified layout orientation. This fixes unstable from-sketch behavior in incremental layout mode when using an orientation other than top-to-bottom. User that
OrganicLayoutdoes no longer resize empty group nodes, possible ignoring a minimum group node size for them (see
GroupingKeys#MINIMUM_NODE_SIZE_DPKEY). The behavior with respect to empty group nodes is now in line with the behavior of other common layout algorithms.
Centrality#closenessCentralitynow sets the closeness of a node to
Infinityif the sum of the shortest path distances is
0. Before, it was set to
NaNin such cases.
Groups.Dendrogramdoes no longer extend class
Graph. To enable convenient iteration of a dendrogram, method
#NodeSequencernow allows to specify
nullto return to the default sequencer. In previous versions, specifying
nullleads to an
GraphMLCompatibilityDemothat shows how to load GraphML files created by yFiles for Java 3.0.x was added.
BPMNEditorDemo: The class
BpmnLayoutDatawas added and is now used instead of the
BPMNEditorDemo: Fixed the initialization of snapping and of the default group node style.
LayoutStylesDemo: The bound restrictions of the Organic layout can now be specified explicitly.
LayoutStylesDemo: Fixed the configuration for the minimum node distance of the Organic layout that was not editable before.
Folding: Fixed a bug in the folding mechanism that could lead to an endless loop when loading a GraphML file containing
PathBasedEdgeStyleRenderer: Fixed bug that could leave visual artifacts when switching to an arrow that returned a
CanvasComponent: Fixed a bug in the mouse wheel scroll behavior that moved the viewport in the wrong direction when scrolling page-wise vertically.
java.lang.IllegalArgumentException: Comparison method violates its general contract!problems caused by calling
java.util.Comparatorimplementations that do not imply a total order.
HierarchicLayout: Fixed bug that caused a violation of the minimum first/last segment length for reversed/backloop edges which connect to group nodes.
HierarchicLayout: Fixed rare bug that may cause overlaps between labels and segments of edges with octilinear routes.
HierarchicLayout: Fixed possible infinite loop if there are critical edges (see
TreeLayout: Fixed possible group node overlaps in conjunction with some node placers, for example
TreeLayout: Fixed bug that caused less compact layout results when using node halos (see
OrganicLayout: The type of the dataprovider key
GROUP_NODE_MODE_DPKEYwas fixed from
OrganicLayoutData: The type of the property
GroupNodeModeswas fixed from
FoldingEdgeStaterepresenting multiple edges could become inconsistent after removing or reconnecting some of the edges.
DefaultEdgePathCropper: fixed an issue where
getIntersectionwould not be called when cropping an edge at the source end.
IInputModeContext: fixed a bug in
getGraphthat could cause a stack overflow.
PopupMenuInputMode: moved the default popup menu location one pixel to the right and one pixel down to prevent the mouse cursor from being positioned directly on the popup menu's border. (Mouse clicks on the popup menu's border do neither close the popup menu nor trigger any of the popup menu's entries.)
HierarchicLayout: fixed rare
AsIsSequencerfor edges incident to group nodes that have a sketch without bend points as well as port constraints.
HierarchicLayout: fixed bug that may cause non-orthogonal segments of grouped edges even though orthogonal edge routing is enabled.
HierarchicLayout: 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.
HierarchicLayout: fixed an exception that sometimes got triggered when sequence constraints were used.
NullPointerExceptionthat appeared if no
PARTIAL_NODES_DP_KEYis registered with the input graph.
DropInputModenow carry additional event arguments
DropTargetEventArgswhich hold the original Java Swing drag and drop events.
Ctrl+Ofor the command to open a document.
addRegistryOutputMapper(String, String, Object, IEventListener)wrongly created multiple GraphML key definitions for the same mapper instance.
SmartEdgeLabelModel.AutoRotationEnabledis now annotated
RIGHTvalues are now annotated
WORD_ELLIPSISvalues are now annotated
WRAPvalues are now annotated
EdgePathLabelModel.AutoRotationEnabledis now annotated
EdgeSegmentLabelModel.AutoRotationEnabledis now annotated
FreeEdgeLabelModel.RelativeAngleEnabledis now annotated
AbstractJComponentLabelStyle.AutoFlippingEnabledis now annotated
ArcEdgeStyle.FixedHeightEnabledis now annotated
HtmlLabelStyle.AutoFlippingEnabledis now annotated
NodeStyleLabelStyleAdapter.AutoFlippingEnabledis now annotated
NullPointerExceptionthat could happen in
AsIsSequencerwhen incremental group hints are defined (see
IncrementalHintsFactory.createIncrementalGroupHint) along with specific port constraints on edges incident to an incremental group node.
HierarchicLayout: Improved result if compact label placement is enabled (which is the default), see
SimplexNodePlacer.LabelCompaction. In previous versions the labels may have been placed in a stacked style even if this did not make the result more compact (e.g. if all labels are placed to the right of the edges).
GraphPartitionManager: Fixed functionality to hide edges when using methods
GraphPartitionManager.hide. Previously, edges were actually not hidden from the graph.
HierarchicLayout: 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.
HierarchicLayout: Fixed bug that caused the minimum edge-to-edge distance to be violated by edges with strong port constraints that cross each other.
layout.LayoutStylesDemothat presents all major layout algorithms in an easily explorable and configurable manner.
viewer.svgimageexport.SVGImageExportDemothat shows how to export the contents of a
viewer.pdfimageexport.PDFImageExportDemothat shows how to export the contents of a
GraphComponentto PDF, EPS and EMF.
demo viewer.svgnodestyle.SVGNodeStyleDemothat shows how to use SVG for node visualization.
bpmn.editor.BPMNEditorDemowith corresponding graph element styles and a customized layout algorithm that demonstrates how to use yFiles for BPMN applications
CanvasComponent: Added an event
FitContentViewMarginsChangedthat gets invoked when the propery
#FitContentViewMarginshas been changed.
bower installand opening
CanvasComponent#FitContentViewMarginsis now initialized to (10,10,10,10) as mentioned in its documentation.
SerializationVisibilityannotation as well as the
SerializationVisibilityTypeenum that are used to customize the serialization behavior of properties are now public to work properly.
GraphMLannotations did not work.
CollapsibleNodeStyleDecoratordidn't handle the hit testing correctly when different button sizes for the collapsed and expanded state were used.
NodeStyleLabelStyleAdaptersometimes produced a
NodeStylePortStyleAdapterdidn't work well together with
AbstractComponentNodeStyleas inner style.
PortDefaultswasn't serialized correctly as 'AutoCleanup' due to a missing GraphML rename.
GenericPortLocationModelweren't serialized correctly.
ITable#setLabelModelParameterignored the provided style resp. label model parameter.
SeriesParallelLayout: Fixed possible
NullPointerExceptionwhen handling graphs with group nodes.
ParallelEdgeLayout: Fixed bug that caused wrong edge port coordinates.
SeriesParallelLayout: Fixed violations of the minimum first and last segment length and self-crossings of octilinear edges.
SeriesParallelLayout: 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.
HierarchicLayout: Fixed bug that caused critical edges to not be aligned (see
BusRouter: Fixed rare
IllegalStateExceptioncaused by non-orthogonal edge segments.
TreeLayout: Fixed bug that occurs when edges with single port constraints are reversed during the layout.
Polyline.EdgeRouter: Fixed possible
NullPointerExceptionthat may appear if a specified
PortCandidatehas multiple directions.
OrganicLayout: Fixed a bug that may occur when using
FlagsEnummembers now respect
GraphMLannotations for renaming. Such members can't be read back in prior versions of the library. Reading older files with the current version still works.
This is the initial release of the 3.0 series that brings a modernized API, many new or improved library features and support for current Java language features.
Please see the Developer's Guide for migration instructions from yFiles for Java 2.x