yFiles for JavaFX Changelog
yFiles for JavaFX 3.6
This release brings exciting new major features, and many other minor new features, improvements, and bugfixes to all parts of the library. As always, there are new and improved demos demonstrating these features and improvements.
If you are updating from an older version of yFiles for JavaFX, have a look at the list of incompatible changes.
Major new features
- New styles for graph items
-
The
RectangleNodeStyle
class is a new node style that uses a rectangular shape whose corners are either rounded or cut diagonally. Its properties specify which corners get rounded, the corner radius, its fill, and its border stroke.The new
GroupNodeStyle
class is a node style primarily designed for collapsed and expanded group nodes. It draws a (rounded) rectangle with an optional tab or ribbon, and offers extensive configuration options for an optional icon, its various fills, and paddings. The newGroupNodeLabelModel
is tailored to place labels in the tab or tab background of aGroupNodeStyle
.The new
ArrowNodeStyle
class draws a node as an arrow shape. The arrow can point in one of the four compass directions, and the arrow head slope, the shaft thickness, the fill, and the border stroke can be configured.Similarly, the new
ArrowEdgeStyle
class draws an edge as an arrow shape. This style always points from the source port to the target port, ignoring bends, and can be configured in the same way as the node style.The
DefaultLabelStyle
class now supports different common background shapes.The
ShapeNodeStyle
class now supports three additional shapes:HEXAGON2
(a six-sided polygon with tips at top and bottom),STAR5_UP
(a five-pointed star with one tip pointing upwards), andPILL
(a stadium shape with the shorter sides rounded).Its new property
KeepingIntrinsicAspectRatioEnabled
defines whether to keep the intrinsic aspect ratio of the shape.The new
BridgeEdgeStyle
class renders an edge as a 3-segment bridge with a given height between the edge's source and target port locations. This is especially useful to distinguish parallel multi-edges between the same pair of nodes. - Wrap text to shape
-
The text wrapping feature of
DefaultLabelStyle
now wraps the text inside a given shape instead of just the rectangular label bounds. TheTextWrappingShape
enum provides the predefined shapes, and includes for example pill, ellipse, and hexagon. The newDefaultLabelStyle.TextWrappingPadding
property defines the padding between the chosen shape and the text.If the predefined shapes don't fit your needs, you can override the
DefaultLabelStyleRenderer.getTextWrappingOutline
method to return any custom convex path asGeneralPath
instead. - Compact disk layout
-
The new
CompactDiskLayout
class arranges a graph on a disk, packing the nodes as dense as possible. This layout is mostly suitable for graphs with small components whose loosely connected nodes should be grouped and packed in a small area.The associated new class
CompactDiskLayoutData
allows to specify custom data considered during the layout calculation. - Cactus group layout
-
The new
CactusGroupLayout
class offers an alternative representation of hierarchically nested data. It places the children of a group along the groups circular border, resembling the structure of a cactus.The associated new class
CactusGroupLayoutData
allows to specify custom data considered during the layout calculation.
New Features
View
-
The new class
PortLocationModelParameterSerializer
provides static helper methods which can convert the built-inIPortLocationModelParameter
implementations into key-value pairs. It also supports creatingIPortLocationModelParameter
instances from these key-value pairs. -
Added the new property
AspectRatio
to theGeneralPathNodeStyle
which defines the aspect ratio of the path. -
The new property
CanvasControl#MouseWheelZoomEventRecognizer
can be used to set the modifier for distinguishing between mouse wheel scrolling and zooming. -
The new class
LabelModelParameterSerializer
provides static helper methods which can convert the built-inILabelModelParameter
implementations into key-value pairs. It also supports creatingILabelModelParameter
instances from these key-value pairs. -
The methods
getNodesRevealedAfterExpand
,getEdgesChangedAfterExpand
, andgetEdgesChangedAfterCollapse
have been added toFoldingManager
. They can be used to retrieve information about folding states that would be used when a specified group node would be expanded or collapsed.
Interaction
-
Handles can now react to mouse clicks and touch tap events. The
handleClick
method has been added to theIHandle
interface and is called whenHandleInputMode#ClickedRecognizer
orHandleInputMode#ClickedRecognizerTouch
was triggered on a targeted handle. To customize the general handle click handling, theClicked
event can be listened to or the methodHandleInputMode#handleClick
can be overridden.
Hierarchic Layout
-
The
HierarchicLayout
class now supports so-called tabular group nodes. The children of such groups are arranged in a compact tabular fashion (i.e., like a single column table for layout orientation left-to-right). PropertyHierarchicLayoutData#TabularGroups
allows to mark groups as "tabular" and propertyHierarchicLayoutData#TabularGroupChildComparators
to specify a custom order for the children.
Organic Layout
-
The
OrganicLayout
class now offers the possibility to define a group substructure scope, see propertyGroupSubstructureScope
. Group substructures that lie in the specified scope are treated as substructures in the layout process, i.e., the child nodes are arranged on a disk that is contained in the group node. -
In addition, the new property
ClusterAsGroupStructureAllowed
allows to specify whether or not detected clusters (see propertyClusteringPolicy
) are taken into account as group substructures. -
The
OrganicLayout
class now offers two newChainSubstructureStyles
calledDISK
andDISK_NESTED
that lead to a compact disk-like layout for chains. -
The
OrganicLayout
class now offers the possibility to define tree substructures (stars, chains, cycles and parallel structures are already supported). TheOrganicLayout#TreeSubstructureStyle
property specifies the style of tree substructures and theOrganicLayout#TreeSubstructureSize
property specifies their minimum size (structures of smaller size are not handled as a tree substructure).
Balloon Layout
-
The
BalloonLayout
class now supports node types. The types influence the ordering of child nodes and the subtrees rooted at them such that nodes of the same type are preferably placed next to each other. Node types are weaker than a user-specified custom order defined via a comparison function. Types can be defined via theBalloonLayoutData#NodeTypes
property.
Radial Layout
-
The
RadialLayout
now supports a new layering strategy that produces a circular dendrogram drawing. -
The
RadialLayout
now supports two new edge routing styles, namely a radial polyline style and a curved style. The radial polyline style produces edge paths which consist of a series of straight and arc segments. The curved polyline style routes the edges as curved bezier paths. In the latter case, the edge paths can be also returned as control points that represent cubic bezier control points. -
The
RadialLayout
now supports integrated node labeling i.e., the node labels are taken into consideration when determining the positions for the nodes of the graph and guarantees that labels will not overlap with other objects in the graph.
Circular Layout
-
The
CircularLayout
now supports integrated node labeling i.e., the node labels are taken into consideration when determining the positions for the nodes of the graph and guarantees that labels will not overlap with other objects in the graph. -
The
CircularLayout
class now supports curved edge routing within and between circles.
Analysis
-
Added the new
RankAssignment
analysis algorithm class that solves the rank assignment problem on an acyclic graph using the simplex method. -
The new analysis class
Intersections
finds intersections and overlaps between graph items, featuring flexible configuration options to find only specific intersections. The respectivecom.yworks.yfiles.layout.Intersections
class provides the functionality also for theLayoutGraph
API, but offers less convenience.
Improvements
General
- The documentation about configuring the item visualization has been improved. All styles and their configuration options are now described in a Developer's Guide chapter.
View
-
GraphClipboard
now respects thePasteDelta
value when pasting items without owner (e.g. edges without selected source or target node). -
ModelManager
and its derived classesHighlightIndicatorManager
,SelectionIndicatorManager
, andFocusIndicatorManager
now haveinstall
anduninstall
methods for properly allocating and freeing resources when setting or removing a manager to aCanvasControl
. -
GraphModelManager
: the propertiesNodeManager
,EdgeManager
,PortManager
,EdgeLabelManager
,NodeLabelManager
,PortLabelManager
, andProvideUserObjectOnMainCanvasObject
have been made public.
Interaction
- Pinch-zooming with two fingers now works a lot more reliably when the frame rate is low due to complex and large graphs.
- Touch move events are now guaranteed to be raised up to the location where a touch up event happens.
-
The
MoveViewportInputMode#uninstall
method is now virtual and can be overridden in derived classes. -
Input modes now listen for the
Touch2DLostCapture
event of the associated control, so that this event can be correctly detected in the 'recognizer' properties of an input mode. - The behavior of the inertia during touch inputs has been improved.
-
A
SizeConstraintProvider
property was added toNodeReshapeHandleProvider
andNodeReshapeHandlerHandle
that is queried during node resize gestures if no explicitMinimumSize
,MaximumSize
orMinimumEnclosedArea
is set. - The input modes don't perform hit tests upon auto-repeated key down events for modifier keys anymore.
-
The new
MoveViewportInputMode#SinglePointerMovementAllowed
property can be used to disable moving the viewport with a single touch pointer. Disabling this property is especially useful for apps that allow editing since then, other gestures like moving items or creating edges can be configured to start without a long press. - Cursor property changes of active input modes are now immediately reflected in the application's mouse cursor. Previously, the application mouse cursor might have been updated only after the next mouse event.
-
The new
MoveInputMode#ValidBeginCursor
property offers the possibility to use different cursors for signaling a valid position for beginning a move operation and actually moving items. -
The
ResizeStripeInputMode
class now offers the possibility to customize the cursors for signaling a valid position for beginning a resize operation as well as actually resizing columns or rows. -
The
ResizeStripeInputMode
class now offers properties to set an invalid end cursor for column and row resize. The invalid end cursor is shown during resize operations if the column or row in question cannot be resized to the current mouse position. -
The properties
ValidBeginRecognizer
andValidBeginCursor
have been added toLassoSelectionInputMode
,MarqueeSelectionInputMode
, andMoveViewportInputMode
. TheValidBeginRecognizer
can be used to indicate whether the selection respectively move viewport gesture may begin in which case theValidBeginCursor
is used. -
The property
MouseHoverInputMode#ValidHoverLocationCursor
has been added that is used when theValidHoverLocationHitTestable
returns true for a location. -
The property
ContextMenuInputMode#ValidMenuLocationCursor
has been added that is used when theValidMenuLocationHitTestable
returns true for a location. -
IReparentNodeHandler#isValidParent
is now also called withnull
as new parent during the drag gesture if no real parent node has been tested for the location. -
Keyboard navigation with
NavigationInputMode
now always considers the current item to navigate from, regardless of the value of theNavigableItems
property. -
The
GraphClipboard
now raises the eventsElementsCutting
,ElementsCopying
,ElementsPasting
, andElementsDuplicating
at the very beginning of thecut
,copy
,paste
, andduplicate
methods. -
GraphEditorInputMode
now raises theGroupingSelection
andGroupedSelection
events at the start and end of thegroupSelection
method. Similarly, theUngroupingSelection
andUngroupedSelection
events are raised at the start and end ofungroupSelection
method. -
The new
CreateEdgeInputMode#SourceNodeDraggingCursor
property offers the possibility to customize the cursor that is shown while the mouse is still over the source node after starting the edge creation. -
Changes to
ItemHoverInputMode
'sHoverCursor
property now take effect immediately if the mouse pointer is currently hovering over an item. -
The
TextEditorInputMode
now releases the mutex before dispatching theTextEdited
event.
Styles
-
The
Pen#DashStyle
property is now marked as@Nonnull
, since several internal usages assumed that to be the case anyway. In addition, the documentation of theDashStyle#Dashes
property now clarifies that both an empty collection andnull
result in a solidPen
. -
Added a new property
KeepingAspectRatioEnabled
toImageNodeStyle
andMemoryImageNodeStyle
to support keeping the image's aspect ratio during resizes. -
Nodes rendered with the
ShapeNodeStyle
now respect their actual outline shape when selected with theLassoSelectionInputMode
.
GraphBuilder
-
GraphBuilder
now offers simplified access to a node/edge that has been created with a given ID or data item or accessing the data a node/edge has been created for via the new methodsgetNodeById
,getNodeForItem
,getDataItem(INode)
,getEdgeById
,getEdgeForItem
, andgetDataItem(IEdge)
. -
TreeBuilder
andAdjacencyGraphBuilder
now offer simplified access to a node that has been created with a given ID or data item or accessing the data a node/edge has been created for via the new methodsgetNodeById
,getNodeForItem
,getDataItem(INode)
, andgetDataItem(IEdge)
.
Hierarchic Layout
-
The
HierarchicLayout
class now allows to combine theSimplexNodePlacer#StraightenEdges
andSimplexNodePlacer#BarycenterMode
properties. Previously, edge straightening was not supported in barycenter mode. -
The
HierarchicLayout
class generates more compact results for some cases with edges between nodes of the same layer and integrated edge labeling where previously unnecessarily large distances to the label and edge were kept. -
The
HierarchicLayout
class now places nodes without any edges as far left as possible without violating any constraints. That way they do not disturb the layout for the connected part of the graph. -
For input graphs with a
PartitionGrid
structure, theHierarchicLayout
class now correctly considers the layering produced by theFromScratchLayerer
if it is already compatible with the specified grid structure. Previously, for such cases, the algorithm may have calculated an entirely different layer assignment. -
The
HierarchicLayout
class now considers the flow direction to place the ports of port groups when combined with direct group content edges. -
The
HierarchicLayout
class comes with an improved support for subcomponent layouts (seeHierarchicLayoutData#Subcomponents
). Defining subcomponents now works by assigning instances of the newSubcomponentDescriptor
class to nodes so that nodes mapped to the same descriptor instance form a component. Components that have inter-edges only to a single non-component node are now integrated directly at that node when using the new placement policiesSubcomponentPlacementPolicy#AlwaysIntegrated
orSubcomponentPlacementPolicy#Automatic
(and if the orientation of the sub-layout permits it). The overall results for such cases feature better edge routing quality and more compact drawings. -
The
HierarchicLayout
class now also considers layering constraints between elements of different grouping hierarchies if the recursive group layering is enabled (propertyHierarchicLayout#RecursiveGroupLayering
). Previously, such constraints were ignored in that case. -
The
HierarchicLayout
class now uses a more compact layer placement for graphs with edge labels between layers. -
The
HierarchicLayout
class now requires fewer bends for some inputs with grouped edges and port constraints or port candidates.
Organic Layout
-
The
OrganicLayout
class now produces stable results for inputs with node labels and in deterministic mode, where it previously could generate a slightly different arrangement when applied twice with the same parameters. -
The
OrganicLayout
class now allows to specify custom node clusters by setting theClusteringPolicy
property toClusteringPolicy#USER_DEFINED
. The custom cluster IDs have to be specified by means of theOrganicLayoutData#ClusterIds
property.
Circular Layout
-
The
CircularLayout
class now supports node types (seeCircularLayoutData#NodeTypes
) also for the layout of the cycle partitions. Previously, the types had an influence only on the layout of a partition itself. If all nodes of a partition are of the same type, then the partition gets that type as well, so that partitions of same type are preferably placed next to each other. -
The
CircularLayout
class has received a faster algorithm for calculating edge bundles.
Tree Layout
-
Root Alignment in
GenericTreeLayout
can also factor in the port position to straighten out an edge. -
The
TreeLayout
class now also supports integrated edge labeling for configurations that use aLayeredNodePlacer
.
Edge Router
-
The
EdgeRouter
class now produces better results for some setups with monotonic path restrictions and edges with vertically/horizontally overlapping endpoints. -
The
EdgeRouter
class now tries to avoid routes that cross fixed external ports of other edges as well as fixed internal ports at group nodes of other edges. The new propertyPenaltySettings#PortCrossingPenalty
allows to specify the cost of such crossings. -
The
EdgeRouter
class now supports buses that include self-loops (see classBusDescriptor
). Previously, self-loops were ignored.
Generic Labeling
- The generic labeling algorithm has an additional preset to avoid overlaps of labels and the partition grid.
Layout
- Improved the initialization time and memory consumption of layout animations.
-
The
TemporaryGroupNodeInsertionStage
class now automatically marks inserted group nodes with anIDataProvider
registered to the input graph with the keyINSERTED_GROUP_NODE_DPKEY
. -
The
TemporaryGroupNodeInsertionStage
class now also supports specifying hierarchically nested temporary groups. Therefore, the newTemporaryGroupDescriptor
class has been added.
Analysis
-
The
TraversalDirection
enumeration used by theNeighborhood
andBfs
algorithms has been extended. The enum valueUNDIRECTED
has been added that ignores the edge direction and corresponds semantically with the previous valueBOTH
. The semantic ofBOTH
has been adjusted to indeed return the union of theSUCCESSOR
and thePREDECESSOR
results. To keep the default behavior of theNeighborhood
andBfs
algorithms, the default value of theirTraversalDirection
property has been changed fromBOTH
toUNDIRECTED
. -
The
GraphStructureAnalyzer
class now supports operating on a subset of the graph. -
The new
SubgraphNodes
andSubgraphEdges
properties on theReachability
class allow to define a subset of nodes/edges the algorithm should operate on.
Bugfixes
View
-
Combining
HierarchicNestingPolicy#GROUP_NODES
,LabelLayerPolicy#AT_OWNER
and undo no longer throws aNullPointerException
. -
Viewport animations no longer suddenly stop when the zoom level is near
CanvasControl#MinimumZoom
orMaximumZoom
. - Holding down a scrollbar button no longer scrolls beyond the scrollable area indicated by this scrollbar.
-
Changing the
ICanvasObject#Group
property no longer triggers unnecessary recreation of the visuals anymore. -
Fixed a bug in
SelectionIndicatorManager
that didn't callremoveSelection
when an item was deselected. -
Changing the
GraphControl#GraphModelManager
property no longer leaks memory in certain situations. -
A tooltip which is displayed at a given location by calling the
MouseHoverInputMode#show
method is no longer immediately hidden after each mouse move. It now respects theMouseHoverSize
property. -
Calling
IFoldingView#collapse
on a normal (i.e. non-group) node no longer creates anUndoUnit
or a view state (which included an unexpected call toIFolderNodeConverter#initializeFolderNode
even though the result would have never been used). Now callingIFoldingView#collapse
on a normal node does nothing. - The automatic flipping behavior of labels now also works with projections that distort the labels.
-
ViewportAnimation
s now are properly cleaned up oncancel
. -
GroupNodeStyle
's associatedINodeInsetsProvider
now correctly calculates insets for 'small' nodes, i.e. nodes whose height (or width) is less than the style'sTabHeight
property. -
Inertia in
MoveViewportInputMode
no longer stops working randomly.
Graph
-
Fixed a bug in
FilteredGraphWrapper
'sNodeRemoved
event where the provided old parent might have been present in the wrapped graph but not in the filtered graph. -
The
FilteredGraphWrapper
class now raises the correct events when filtering out port labels. Previously, the events contained incorrect owner information. -
EdgePathLabelModel
'sfindBestParameter
method now creates correct parameters for locations close to bends. -
NinePositionsEdgeLabelModel
center placements above and below the edge have been improved when the angle wasn't close to one of the two coordinate axes and the distance was non-zero. Previously, labels could seem to jump around when the path changed and weren't always close to the center of the path. -
GroupNodeLabelModel
no longer stretches tab labels and tab background labels into the collapse/expand icon of the correspondingGroupNodeStyle
. -
NavigationInputMode#ExpandGroup
,EnterGroup
, and theEXPAND_GROUP
andENTER_GROUP
commands do not create empty undo units anymore if nothing has changed. -
NavigationInputMode#ExitGroup
and theEXIT_GROUP
command now create undo units if the bounds of the exited group node were adjusted. -
GroupingSupport
's methodsenlargeGroupNode
andenlargeAllGroupNodes
do not create empty undo units anymore if nothing has changed. -
EdgePathLabelModel
,EdgeSegmentLabelModel
, andSmartEdgeLabelModel
findBestParameter
implementations now create correct parameters for label boxes that overlap the edge's source or target node.
Interaction
-
The
HandleInputMode#handleIsHitTouch
method now correctly uses the value of theCanvasControl#HitTestRadiusTouch
property instead of the value of theCanvasControl#HitTestRadius
property for its calculations. As a result, dragging handles during touch input should be much easier. -
After pasting, a closed group node within another closed group now stays closed. Previously, it
was open due to a bug in the
GraphClipboard
class. -
The
GraphEditorInputMode#AdjustContentRect
method now only updates theCanvasControl#ContentRect
property once per call. Previously there have been circumstances where the property would have been updated twice unnecessarily. -
The
TableEditorInputMode
class no longer changes theGraphControl#Selection
property unnecessarily when theGraphControl#Graph
property is changed. -
An instance of the
HandleInputMode
class is no longercanceled
if a handle is removed during its ownDragFinished
call. This fixes some very rare exceptions under complicated circumstances. -
Multiple
DropInputMode
instances now correctly consider their respective priorities. -
UndoEngine
no longer adds an empty undo unit for an aborted operation in certain rare cases. -
Fixed an issue where changing the
GraphControl#InputMode
while the context menu is open would lead to a crash. -
Fixed a bug in
MoveViewportInputMode
that caused the inertia feature to mistakenly start moving the viewport after the mouse or touch pointer has stopped before being released. -
Starting a
CanvasControl
/GraphControl
viewport animation now properly stops a runningMoveViewportInputMode
inertia animation. - The direction of the first edge segment during orthogonal edge creation is now correctly determined when the source port candidate lies on the node border.
-
SmartEdgeLabelModel
now properly supports the original position snap line.
Styles
-
Cloning an
ITable
instance now properly clones all of the table's internal state. Previously, changing a cloned table's insets could result in the cloned table's stripes not updating their geometry. -
TableNodeStyle
now allows the table background style to access the table node's tag. - The built-in styles with rounded corners now have the correct outline shape for all calculations.
- Edges with Bézier paths can now also be animated into non-Bézier paths.
-
Edge cropping now works as expected when using the
BezierEdgeStyle
class and the terminating nodes have styles that do not provide an outline in theirIShapeGeometry
implementation. -
Fixed that customer CSS styling of labels breaks the preferred size calculation of the
DefaultLabelStyle
. -
Setting the
Pen
of aShapeNodeStyle
or aGeneralPathNodeStyle
tonull
now correctly clears the shape's stroke. -
Fixed a bug in
GeneralPathNodeStyle
where setting thePen
tonull
on an already rendered node resulted in aNullPointerException
during redraw. -
ShapeNodeStyleRenderer
now always uses the protectedgetPaint
andgetPen
methods for all shapes instead of falling back to the respective style properties for some shapes. -
IconLabelStyle
'supdateVisual
implementation now properly updates if the style's Icon instance is changed. -
DefaultLabelStyle
now adds ellipsis more reliably at the end when the text does not fit into the specified text wrapping shape.
GraphML
-
The
key
parameter ofAbstractInputHandler#setValue
method is now annotated correctly as nullable. The key may benull
when the model item used as key is created after its data has been parsed. -
Fixed GraphML serialization and deserialization for certain configurations of
GeneralPathNodeStyle
,HtmlLabelStyle
, andShapeNodeStyle
. -
Fixed GraphML serialization and deserialization for certain configurations of
GroupNodeStyle
andRectangleNodeStyle
. -
Fixed an issue in
GraphMLIOHandler
'sWriteEvents
where theDataWriting
event has been dispatched after the writing process instead of before.
GraphBuilder
-
Label bindings which don't provide label data (or
null
) no longer add empty labels. Instead, no label will be added. -
Fixed a potential memory leak in
AdjacencyGraphBuilder
. Some internal references were not cleaned up after items have been removed duringupdateGraph
. -
Fixed a bug in
GraphBuilder
where updating an existing edge whose (new) source or target nodes cannot be resolved did not remove the edge from the graph. -
Fixed a potential memory leak in
GraphBuilder
,AdjacencyGraphBuilder
, andTreeBuilder
. Some internal map entries for labels were not discarded after their owner nodes or edges were removed.
Table
-
Fixed a bug in
StretchStripeLabelModel
that was causing incorrect handling of insets.
Hierarchic Layout
-
The
SimplexNodePlacer
class used by theHierarchicLayout
no longer throws an error due to an internal overflow for very wide layouts. -
The
HierarchicLayout
class now correctly considers the specified halos of group nodes when there is a partition grid defined. -
The
HierarchicLayout
class no longer generates broken non-orthogonal edge segments of same-layer edges for some cases in conjunction with integrated edge labeling and edge labels placed at the ports. -
The
HierarchicLayout
class now properly satisfiesPortCandidates
defined for same-layer edges at nodes where other edges with (rather large) source/target port labels additionally exist. -
The
HierarchicLayout
class now produces a correct edge grouping structure for short edges having the same source and target group ID. -
The
HierarchicLayout
class no longer throws an exception when the edge-directedness feature (HierarchicLayoutData#EdgeDirectedness
) is used in conjunction with enabled back-loop routing (HierarchicLayout#BackLoopRouting
). -
The
HierarchicLayout
class no longer creates unnecessary spacing between sub-components (seeHierarchicLayoutData#SubComponents
) and other elements. This previously happened in some cases due to edge/node labels being present. In consequence, these cases are now more compact. -
The
HierarchicLayout
class no longer produces overlaps between (large) external node labels and unrelated edges. -
The
HierarchicLayout
class no longer produces overlaps between sub-component elements (seeHierarchicLayoutData#SubComponents
) and edges that are not part of the component. -
The
HierarchicLayout
class now correctly assigns ports to edges incident to groups if the uniform port assignment is enabled (see propertyHierarchicLayoutData#UniformPortAssignmentGroups
) for some cases where it previously did not yield a uniform port distribution. -
The
HierarchicLayout
now correctly considers thePreferredPlacementDescriptor
settings of an edge label when there are additionally edge groupings defined. Previously, it could, for example, happen that the edge label was placed on the wrong side of the edge. -
The
HierarchicLayout
class now adheres more closely to its maximum duration and itsAbortHandler
. -
The
HierarchicLayout
class now considers thePortCandidate
directions correctly for layout orientations other thanTopToBottom
. This also improves the optimization results withPortCandidateSet
s that allow multiple directions to connect to nodes. -
For input graphs with a
PartitionGrid
structure, theHierarchicLayout
class now correctly considers the layering produced by theFromScratchLayerer
if it is already compatible with the specified grid structure. -
The
HierarchicLayout
class no longer throws an exception for some invalid specifications of alternative group bounds in incremental layout mode. -
The results of the
DefaultLayerSequencer
class are now deterministic by default, since it no longer aborts the calculation after 10s. For this, itsMaximumDuration
value is now unrestricted.
Organic Layout
-
The
OrganicLayout
class no longer produces broken routes of self-loops at group nodes if theScope
is not equal toALL
. -
The
OrganicLayout
class now correctly considers the specifiedPartitionGrid
if substructure detection is enabled. Previously, the grid cell assignment of nodes belonging to a substructure has been ignored. -
The
OrganicLayout
class now correctly considers fix-contents and fix-bounds groups (see enumGroupNodeMode
) if the substructure detection is enabled. -
The
OrganicLayout
class now correctly detects chain substructures if there are nodes of different types (OrganicLayoutData#NodeTypes
). -
The
OrganicLayout
class now satisfies propertyOrganicLayout#DeterministicModeEnabled
for more cases when the maximum duration is restricted. Note, however, that non-deterministic behavior is still possible when restricting the duration. -
The
OrganicLayout
class no longer produces violations of the specified minimum node distance for separated radial substructures (see propertyStarSubstructureStyle#SEPARATED_RADIAL
).
Clear Area Layout
-
The
ClearAreaLayout
class no longer produces results where the specified area is not cleared for some input graphs when propertyClearAreaStrategy
is set toPRESERVE_SHAPES
orPRESERVE_SHAPES_UNIFORM
. -
The
ClearAreaLayout
class now correctly considers the initial partition grid assignment of nodes.
Orthogonal Layout
-
The
OrthogonalLayout
class no longer produces bad edge routes where the path is non-orthogonal and does not connect to the source node anymore for some rare cases containing parallel edges or chain substructures. -
The
OrthogonalLayout
class now correctly considers the specified minimum group node sizes (seeGroupingKeys#MINIMUM_NODE_SIZE_DPKEY
). Previously, the minimum sizes were always enlarged by the groups' insets (seeGroupingKeys#GROUP_NODE_INSETS_DPKEY
). Actually, the minimum size should include the insets. -
The
OrthogonalLayout
class now correctly handles input graphs with parallel edges if theParallelRoutesPreferenceEnabled
property is enabled. Previously, such inputs have caused exceptions in some rare cases. -
The
OrthogonalLayout
class no longer generates overlaps between edge segments (of a parallel edge) and edge labels of other edges for some rare scenarios.
Edge Router
-
The
EdgeRouter
class now correctly interprets specified intermediate points (EdgeLayoutDescriptor#IntermediateRoutingPoints
) as well as bus points (BusDescriptor#BusPoints
) in the case when the algorithm runs inside an orientation layout with an orientation other thanTopToBottom
. -
The
EdgeRouter
class now correctly considers the maximum duration and theAbortHandler
when the octilinear routing style is chosen. Previously, it could happen that the algorithm kept on running even though the time was up. -
The
EdgeRouter
class no longer throws an exception for some rare cases with collinear bends. -
The
EdgeRouter
class now correctly handles direct content edges that are incident to group nodes withPortCandidateSets
. -
The
EdgeRouter
class no longer produces bad layout results for some scenarios with grouped edges and multiplePortCandidates
. Previously, the algorithm selected any of them without considering the alternative options.
Generic Labeling
-
The
GenericLabeling
class no longer produces superfluous label overlaps if one of itsRemoveNodeOverlaps
orRemoveEdgeOverlaps
properties is enabled. -
The
GenericLabeling
class no longer produces bad label placements for edges with direct group content routing, i.e., edges that connect a group node with one of its descendants and are routed directly without leaving the group.
Circular Layout
-
A circular layout with
LayoutStyle#BCC_ISOLATED
can no longer get into an infinite loop for inputs where a component consists only of articulation points.
Single Cycle Layout
-
The
SingleCycleLayout
class no longer produces violations of the specified minimum node distance.
Layout
-
TableLayoutConfigurator
now considers the correctOriginalPosition
s of theRowDescriptor
s andColumnDescriptor
s when table insets are used. -
The
TableLayoutConfigurator
class now treats tables without rows or columns as tables with exactly one row and column instead of throwing an exception. -
The
PolylineLayoutStage
class now correctly considers a registeredAbortHandler
instance so that it is possible to terminate early. Previously, the stage ignored theAbortHandler
. -
The
TabularLayout
class now always uses the correct bounding box values for node labels that are considered. Previously, wrong label bounds could lead to unnecessarily large rows or columns. -
The
IsolatedGroupComponentLayout
class no longer produces unnecessarily large group nodes if the specifiedGridSpacing
is zero.
Incompatible Changes
API
-
Due to the new
install
anduninstall
methods of theModelManager
class, the following of its members have been changed:- The
CanvasControl
constructor parameter has been removed. Instead, you can call the newinstall
method with theCanvasControl
as parameter. Similarly, theCanvasControl
constructor parameters of the derived classes have been removed, too. - Its existing protected methods
install
anduninstall
have been renamed toinstallItem
anduninstallItem
. - Its protected methods
add
andremove
have been renamed toaddItem
andremoveItem
.
- The
-
The optional
SelectionModel
andModel
parameters ofHighlightIndicatorManager
andSelectionIndicatorManager
have been removed from the constructors, too. Instead, you can set the corresponding properties directly. -
The
NavigationInputMode#adjustGroupNodeLocation
method has now an additional parameterexpandedSize
that specifies the size of the group node when it is expanded. -
The
LabelCreator#addLabel
method can returnnull
if no label is added. -
The
LabelCreator#updateLabel
method now returns a boolean value:true
if the label has been updated,false
if the label should be removed. -
The
IHandle
interface has a new methodhandleClick
. This method must be implemented by custom handle implementations. -
The
DataProviderAdapter#defined
method has been removed since it had no effect. -
The
GraphModelManager#ProvideUserObjectOnMainCanvasObject
property has been renamed toProvidingUserObjectOnMainCanvasObjectEnabled
. -
The
NodeLabelingPolicy
enum has been moved fromcom.yworks.yfiles.layout.tree
tocom.yworks.yfiles.layout
. The reason is that the policy is now not only supported byBalloonLayout
but also byCircularLayout
,RadialLayout
andCactusGroupLayout
. -
The type of the
EdgeCellInfo#CellSegmentInfos
property has been changed fromYList
toCellSegmentInfo[]
. -
The
HierarchicLayoutData#SubComponents
property is replaced by the newHierarchicLayoutData#Subcomponents
property with a different signature. The new property uses instances of the newSubcomponentDescriptor
class to define subcomponents, and the layout algorithm responsible for a component is now specified via the newSubcomponentDescriptor#LayoutAlgorithm
property. -
Similarly, the data provider keys
HierarchicLayout#SUB_COMPONENT_ID_DPKEY
andHierarchicLayout#SUB_COMPONENT_LAYOUT_ALGORITHM_DPKEY
are replaced by the new keyHierarchicLayout#SUBCOMPONENT_DESCRIPTOR_ID_DPKEY
that assigns instances of the newSubcomponentDescriptor
class to nodes. -
The
TemporaryGroupNodeInsertionData#Components
property is replaced by the newTemporaryGroups
property of typeTemporaryGroupDescriptor
, which now specifies groups and the applied recursive group layout algorithm. -
Similarly, the data provider key
TemporaryGroupNodeInsertionStage#COMPONENT_LAYOUT_ALGORITHM_DPKEY
was removed and the name of the keyTemporaryGroupNodeInsertionStage#COMPONENT_ID_DPKEY
was changed toTEMPORARY_GROUP_DESCRIPTOR_DPKEY
.
Pen#DashStyle
property is now marked as @Nonnull
, since several
internal usages assumed that to be the case anyway.Changes of Default Behavior
-
The semantic of the
TraversalDirection#BOTH
enumeration value used by theNeighborhood
andBfs
algorithms has been changed and does not ignore the direction anymore, but now returns a union of theSUCCESSOR
and thePREDECESSOR
results instead. The old behavior can be restored by using the newTraversalDirection#UNDIRECTED
enum value. Consequently, the default value of theTraversalDirection
property of both theNeighborhood
and theBfs
algorithm has been changed fromBOTH
toUNDIRECTED
. -
With the graph builder classes, label bindings which don't provide label data (or provide
null
) no longer add empty labels. Instead, no label will be added. Similarly, for label sources, no label will be added for data items for which theLabelCreator#TextProvider
returnsnull
. -
When starting to drag the handle of a selected item, the handle isn't replaced anymore by a new
handle instance provided for the selected item. Previously, this happened automatically, regardless of whether
necessary to support use cases where state changes should result in a different handle instance. Now, the
GraphEditorInputMode#requeryHandles
method has to be called explicitly when changes are made that affect handles that are potentially already visible. Alternatively, a proxy implementation can be used that dynamically dispatches to new instances on its own when required. -
The
HandleInputMode
class doesn't initialize a handle drag as soon as the handle is pressed, anymore. Instead, it waits until theDraggedRecognizer
orDraggedRecognizerTouch
is triggered. When pressed, the mutex is already acquired, which discards other concurrent input modes. This can be turned off by setting theRequestMutexOnPress
property tofalse
. -
The lists returned by the
GraphPartition#getCells
,DynamicObstacleDecomposition#getCells
andDynamicObstacleDecomposition#getObstacles
methods are no longer unmodifiable. -
ResizeStripeInputMode
now always uses theN_RESIZE
cursor for resizing rows and theW_RESIZE
cursor for resizing columns instead of usingN_RESIZE
,S_RESIZE
,W_RESIZE
orE_RESIZE
depending on the dragged side. The old behavior was inconsistent when dragging the border between two stripes and had no visual difference on most platforms. New cursor properties have been added that can be used to set a custom cursor for different usecases. -
The value of the
DefaultLayerSequencer#MaximumDuration
property is now unrestricted. Previously, it was restricted to 10 seconds. It is used by theHierarchicLayout
class, which still adheres to its own maximum duration.
Deprecations
-
The
BevelNodeStyle
,ShinyPlateNodeStyle
, andPanelNodeStyle
classes and their renderers are now deprecated. Their appearance is rather outdated, and some of them are not very configurable. For group nodes, have a look at the newGroupNodeStyle
class.
New Demos
-
The Group Node Style Demo shows the new
GroupNodeStyle
in different configurations. -
The Arrow Node Style Demo shows the new
ArrowNodeStyle
and its setting options. -
The Rectangle Node Style Demo shows the new
RectangleNodeStyle
and its setting options. -
The Shape Node Style Demo shows the shapes that are available for the
ShapeNodeStyle
. -
The Default Label Style Demo shows the background shapes that are now available for the
DefaultLabelStyle
. - The Text Wrapping Demo shows the various options of the new text wrapping feature for labels.
yFiles for JavaFX 3.5
Major New Features
Smooth animations
-
Many viewport transitions are now smoothly animated. This prominently includes scrolling and
zooming with the mouse wheel, but also the various commands, such as zooming via a toolbar button, fitting the graph
into the viewport, interacting with the overview, and many others. This can be turned off for individual
interactions via the new
CanvasControl#AnimatedViewportChanges
property, and customized with the new protected methodCanvasControl#getViewportAnimationDuration
.
Node Types
-
The
CircularLayout
class is now able to separate nodes that are on the same cycle with respect to their node type. For this, the newNodeTypeAwareSequencer
class can be set asNodeSequencer
on theCircularLayout#SingleCycleLayout
. Node types are specified via theCircularLayoutData#NodeTypes
property. -
The
ComponentLayout
class now supports node types. The types influence the arrangement and ordering of the components such that components consisting mostly of nodes of the same type are put close to other components consisting of nodes of that type. Use theComponentLayoutData#NodeTypes
property to define types. -
The
TreeLayout
andClassicTreeLayout
classes now support node types. The types influence the ordering of child nodes and the subtrees rooted at them such that nodes of the same type are preferably placed next to each other. Node types are a weak criterion, i.e., if the ordering and placement is determined by other constraints, these are prioritized. Types can be defined via theTreeLayoutData#NodeTypes
property. -
The
HierarchicLayout
class now supports node types. The types influence the ordering of nodes within their layers as a subordinate optimization criteria. More precisely, nodes of the same type are more likely to be placed next to each other if this does not violate other constraints. -
The
OrganicLayout
class now allows defining node types via the newOrganicLayoutData#NodeTypes
property. The types control the detection of substructures (e.g. stars, parallel structures). When types are defined, only nodes of the same type can form a substructure. For star-like and parallel substructures, it is also possible to have a single substructure with nodes of different types, see properties#ParallelSubstructureTypeSeparationEnabled
and#StarSubstructureTypeSeparationEnabled
. The algorithm still tries to highlight the different types by choosing a suitable layout for these components (e.g., placing nodes of the same type closer together or on the same circle). -
The
OrthogonalLayout
class now allows defining node types via the newOrthogonalLayoutData#NodeTypes
property. The types control the detection of substructures, i.e., chains, cycles and trees. When types are defined, only nodes of the same type can form a substructure. -
The node types feature is shown in the new
NodeTypesDemo
and the newOrganicSubstructuresDemo
.
Edge routing only if needed
-
Added the new penalty property
PenaltySettings#SketchViolationPenalty
supported by theEdgeRouter
class. It defines the cost for a deviation from the original edge path if the new routing policy property is set to#SEGMENTS_AS_NEEDED
. -
Optionally, the
EdgeRouter
,ChannelEdgeRouter
andBusRouter
classes now automatically determine whether a new path should be calculated for a certain edge. This is controlled via the new propertiesEdgeLayoutDescriptor#RoutingPolicy
,ChannelEdgeRouter#RoutingPolicy
andBusDescriptor#RoutingPolicy
, respectively. The decision is based on the quality of the existing routes - edges with strict violations of the routing style or that intersect other elements will be selected for routing. Available options:RoutingPolicy#ALWAYS
: A new route is calculated in any case. This was the previous behavior and remains the default.RoutingPolicy#PATH_AS_NEEDED
: The algorithm determines whether a new route is needed. If an edge is selected, its current path is not considered when computing a new route.RoutingPolicy#SEGMENTS_AS_NEEDED
: The algorithm determines whether a new route is needed. If an edge is selected, its current path is preserved as much as possible. Only the required segments are changed. This is only supported by theEdgeRouter
class.
New Features
Graph, and View
-
The graph and tree builders now support bindings for bend locations. This is implemented by new
bend-related members of the
EdgeCreator
class. -
The new
EdgePathPortLocationModel
for ports owned by edges can be used to define port locations as a ratio of the edge path length. This keeps the port location stable when bends are added onto the edge path, for example during orthogonal edge editing.
Layout and Algorithms
-
The new
TreeAnalysis
algorithm offers a convenient way of analyzing tree structures and querying tree-related properties (e.g. leaf nodes, parent-child relations and more). -
The new
ParallelEdges#findParallelEdges
method allows to find all sets of parallel edges contained in a given graph or incident to a specific node. -
The new
GenericLayoutData
class is a generic implementation ofLayoutData
that allows to pass arbitrary data to layout stages. As a consequence, theLayoutData#apply
,ItemCollection#provideMapper
andItemMapping#provideMapper
methods were removed. -
The new
SelfLoopRouterData
class specifies custom data for theSelfLoopRouter
class. In more details, it allows defining which self-loop edges should be routed and which should keep their current path. -
The new
PortPlacementStageData
class specifies custom data for thePortPlacementStage
class. In more details, it allows defining port candidates, port constraints, and node port candidate sets which are then considered by that layout stage. -
The
SubgraphLayout
class now allows defining which edges must be included or excluded in the subgraph. Previously, only nodes could be specified. The newSubgraphLayoutData
class offers the#SubgraphNodes
and#SubgraphEdges
properties to conveniently define the nodes and edges that should form the subgraph the core layout runs on. -
The
OrganicLayout
class offers the new#ClusteringPolicy
property, which allows to specify the clustering algorithm that is applied to the input graph. Three clustering algorithms are available: Louvain modularity, edge betweenness, and label propagation. Previously, the node clustering was always based on edge betweenness. By default, clustering is disabled. -
The
PartialLayout
class offers a new property#MovingFixedElementsAllowed
to allow moving fixed elements. This often yields a better layout quality even though the preservation of the mental map declines because the fixed elements may change their position. -
The
OrganicLayout
andClassicOrganicLayout
classes support the new scopeMAINLY_SUBSET_GEOMETRIC
. In addition to the actual affected nodes, this scope may to some degree move nodes that are geometrically close to an affected node. The existing scopeMAINLY_SUBSET
is similar, but it does determine the closeness of other nodes by using the graph structure instead of the current geometry (i.e. location).
Improvements
Interaction
-
The new
HandleInputMode#QueryClosestHandle
event can be used to provide the closest handle for a certain query location. -
Tooltip contents can now be provided asynchronously. As an alternative to setting the tooltip
content directly, the
ToolTipQueryEventArgs
class also accepts aCompletionStage
that provides the tooltip content asynchronously. -
The
HandleInputMode#beginDragging
method now returns aCompletionStage
which indicates whether the drag of a handle has been finished or canceled. -
Validation of the text of edited labels can now be provided asynchronously. The new
LabelTextValidatingEventArgs#ValidatedText
property accepts aCompletionStage
that provides the validated text asynchronously. -
The
CanvasControl#zoomToAnimated
method now returns aCompletionStage
that is completed when the animation has finished. The parameter of typeIEventListener<AnimationEventArgs>
has been removed. -
The
CreateEdgeInputMode#doStartEdgeCreation
method now returns aCompletionStage
that completes when the edge creation gestures has been finished or cancelled. - The methods
GraphEditorInputMode#createLabel
,#createLabelCore
,#editLabel
,#editLabelCore
, and#addLabel
now return aCompletionStage
that completes when the label creation, editing or adding has been finished. -
The methods
TableEditorInputMode#createLabel
,#editLabel
, and#addLabel
now return aCompletionStage
that completes when the label has been created, edited or added. -
The
MoveInputMode#doStartDrag
method now returns aCompletionStage
that completes when the move gestures has been finished or cancelled. -
The
MouseHoverInputMode#show
and#onShow
methods now return aCompletionStage
that resolves totrue
if the tool tip will be shown or tofalse
otherwise. The#getToolTip
method now returns anObject
instead of aTooltip
as the return value may now be aTooltip
,CompletionStage
ornull
. - Changing the selection state of a large number of elements is now faster.
-
The
OrthogonalEdgeEditingContext#createOrthogonalEdgeDragHandler
method now accepts anIPortOwner
instead of only anINode
as dragged item. This can be used for custom edge drag handling that should support orthogonal edge editing. -
The
ItemCopiedEventArgs
class now guarantees that its#Original
and#Copy
properties are notnull
.
Graph
-
The
DefaultFolderNodeConverter
andAbstractFoldingEdgeConverter
classes now have#PortLabelStyle
and#PortLabelLayoutParameter
properties to control the style and label layout parameter of copied port labels. -
The new
NodeInsetsProvider
class is anINodeInsetsProvider
that returns the same insets for each node. -
The
GraphBuilder
,TreeBuilder
, andAdjacencyGraphBuilder
classes no longer throw Exceptions during calls to#updateGraph
when the graph was modified.
Organic Layout
-
For the substructures in the
OrganicLayout
it is now possible to explicitly specify whether structures are allowed to be nested or not. Previously, substructures were allowed to be nested by default. New styles were added while the old styles now will not generated nested structures anymore.- Star structures offer the new styles
StarSubstructureStyle#RADIAL_NESTED
andStarSubstructureStyle#CIRCULAR_NESTED
. ChainSubstructureStyle#RECTANGULAR_NESTED
andChainSubstructureStyle#STRAIGHT_LINE_NESTED
are the new styles for nested chains.CycleSubstructureStyle#CIRCULAR_NESTED
is the new style for nested cycles.
- Star structures offer the new styles
-
The
OrganicLayout
class now offers the possibility to define the minimum sizes of substructures (stars, chains, cycles, and parallel structures). Structures of smaller size are not handled as a substructure. For each type of structure a new property was added:OrganicLayout#StarSubstructureSize
,OrganicLayout#ChainSubstructureSize
,OrganicLayout#CycleSubstructureSize
andOrganicLayout#ParallelSubstructureSize
. -
With substructures, the
OrganicLayout
class now often produces more compact results and comes with an improved placement of degree-one nodes. -
When specified for the
OrganicLayout
class, the scopeMAINLY_SUBSET
now works together with more of its other features and constraints, and has a larger impact. For example, it previously had very little or no effect when a partition grid or an output restriction was defined.
Edge Routing
-
When the
EdgeRouter
class runs with a highly restricted maximum duration or is aborted via theAbortHandler
class, i.e., the router operates in the fastest possible mode, the calculated edge routes now are of higher quality. The quality improvements mainly affect cases with fixed port locations. -
The
EdgeRouter
class now allows to explicitly define the costs for different types of edge crossings. The new propertiesPenaltySettings#AdjacentEdgeCrossingPenalty
andPenaltySettings#SelfCrossingPenalty
relate to crossings between two adjacent edges and crossings between two line segments that belong to the same edge, respectively. Previously, all types of crossings were covered by the existingEdgeCrossingPenalty
property.- By default, now, crossings of adjacent edges are more expensive than normal ones and self-crossings are the most expensive.
- Furthermore, the default values of the
EdgeLengthPenalty
andGroupNodeCrossingPenalty
properties were increased to obtain more balanced results.
-
The
EdgeRouter
class now produces more suitable routes for edges with octilinear routing style. Previously, the diagonal segments where often omitted after/before an edge's first/last segment.
Hierarchic Layout
-
The
HierarchicLayout
class now generates shorter paths for edges that cross borders ofPartitionGrid
columns in cases where there are no other obvious constraints that require the edge to be longer. This holds for the default vertical layout orientation; for a horizontal orientation, edges that cross borders of rows are affected by this improvement. -
The
HierarchicLayout
class now considers the edge direction when choosing a port candidate for edges with multiple candidates. This new strategy often leads to fewer bends.
Layout
-
LayoutExecutor#start
,GraphControl#morphLayout
andLayoutUtilities#morphLayout
now return aCompletionStage
instead ofnull
. -
The new
BalloonLayoutData#OutEdgeComparator
property specifies a comparison function used to sort a nodes' outgoing edges. -
The new
LayoutGraphAdapter#ORIGINAL_TAG_DP_KEY
data provider key provides access to the object stored in thetag
property of the original graph item from within custom layout code. -
The quality of the curved edge routing was improved with respect to various aspects and such that
it yields aesthetically nicer curves. To further configure the curve routing, the following settings were added.
CurveShortcutsAllowed
: if shortcuts are allowed, curves can become smoother and more direct but may violate other constraints (e.g. edge-edge distance). Available forHierarchicLayout
(RoutingStyle#CurveShortcutsAllowed
),EdgeRouter
(EdgeLayoutDescriptor#CurveShortcutsAllowed
) andCurveRoutingStage
(CurveEdgeLayoutDescriptor#CurveShortcutsAllowed
).CurveUTurnSymmetry
: allows to specify the symmetry preference for u-turns (180 degree turns) of curved routes. The default is zero so that results are equal to previous results. Available forHierarchicLayout
(RoutingStyle#CurveUTurnSymmetry
),EdgeRouter
(EdgeLayoutDescriptor#CurveUTurnSymmetry
) andCurveRoutingStage
(CurveEdgeLayoutDescriptor#CurveUTurnSymmetry
).
-
The
HierarchicLayout
,EdgeRouter
, andCurveRoutingStage
classes now avoid unnecessary, consecutive Bezier segments for modeling larger straight-line parts of an edge path. The resulting reduced bend count improves the user experience when working with theBezierEdgeStyle
. -
The
ClassicTreeLayout
class now features properties#MinimumFirstSegmentLength
and#MinimumLastSegmentLength
that allow to specify the minimum first and last segment length for the orthogonal routing style. -
The new
ParallelEdgeRouterData#RoutedParallelEdges
property returns which edges theParallelEdgeRouter
class routed and thus were hidden during the core layout. This can be useful if parallel, non-leading edges need further handling, e.g., for placing their labels.
View
-
The
CanvasControl#makeVisible
,CanvasControl#fitContent
, andGraphControl#fitGraphBounds
methods now return aCompletionStage
that completes when the view port adjustment has been finished. -
The
Animator#animate
method now returns aCompletionStage
that is completed when the animation has finished. The parameter of typeIEventListener<AnimationEventArgs>
has been removed together with theAnimationEventArgs
class. -
The new
#install
and#uninstall
methods of theGraphModelManager
class simplify exchanging the manager used by aGraphControl
. They are called when setting/removing aGraphModelManager
asGraphControl#GraphModelManager
and should also be called when combining aGraphModelManager
with aCanvasControl
. -
The new
IAnimation#createDelay
method creates an animation that does nothing. This is especially useful in combination with other animations that run in parallel or in sequence to create complex multi-sequence animations. The accompanying method#createDelayedAnimation
for theIAnimation
interface delays the provided animation. -
The new
IAnimation#fromCallback
method creates an animation for a given animation callback and duration. -
The
CanvasControl#makeVisible
method now respects margins defined by theCanvasControl#ContentMargins
property. Ensure visible is called for example by keyboard navigation,. -
The
ZOOM
command now respects margins defined by theCanvasControl#ContentMargins
property when executed with a rectangle as parameter. -
The
ZOOM_TO_CURRENT_ITEM
command now respects the margins defined in theCanvasControl#ContentMargins
property. -
Setting the various descriptor properties of the
GraphModelManager
class no longer causes updates for every installed item if the descriptor hasn't actually changed. -
The
OverviewInputMode
now renders its handle on top of the viewport rectangle instead of below it. -
The
ViewportLimiter#limitViewport
method now has an overload with a parameter that enforces theViewportLimitingPolicy#STRICT
policy. -
The
CanvasControl#makeVisible
method now has an overload with a parameter to specify insets to keep around what to make visible in the viewport. -
The
CanvasControl#makeVisible
method now has an additional overload to make a set of points visible in the viewport. This is mainly useful when using a Projection and trying to make something visible that is not a rectangle in world coordinates. -
All the following features no longer block user interaction: the viewport animations for
CanvasControl#makeVisible
, executing scroll commands when theCanvasControl#ScrollCommandAnimationEnabled
property is enabled, and executingICommand#ZOOM_TO_CURRENT_ITEM
. -
The
CanvasControl#fitContent
andGraphControl#fitGraphBounds
methods now have an overload with a parameter that allows changing the viewport in an animated fashion.
Styles
-
Edge cropping now works as expected when using
BezierEdgeStyle
and the terminating nodes have styles that don't provide an outline in theirIShapeGeometry
implementation.
Bugfixes
Interaction
-
When expanding a closed group, the parent groups of the expanded group no longer become
unnecessarily large. The incorrect behavior could be observed only under certain conditions and was caused by a bug
in the
NavigationInputMode
class. - Auto dragging was not stopped in certain cases.
-
The text area shown by the
TextEditorInputMode
class is now correctly placed if theTextAreaPlacementPolicy#MOVE_TEXT_AREA
is set and a projection is used. -
Fixed editing self-loops with
PolylineEdgeStyle
and orthogonal edge editing enabled. -
HandleInputMode
is no longer canceled if a handle is removed during its ownDragFinished
call. This fixes some very rare exceptions under complicated circumstances. -
Fixed a bug in
CreateEdgeInputMode
which prevented toggling the direction of an orthogonal edge segment when the mouse was over a potential target.
Graph
-
The
ITable#StripeChanged
event now reports the correct parent when re-parenting will be undone or redone. -
A label with
EdgeSegmentLabelModel
orEdgePathLabelModel
now moves steadily when the segment to which it belongs moves. -
The
FilteredGraphWrapper
class now dispatchesParentChanged
events in the correct order after predicate changes. -
All
#setFactory
methods of theNode
-,Edge
-,Label
-,Port
-, andBendDecorator
classes now respect the#nullIsFallback
property. -
FilteredGraphWrapper
now fires the correct events when filtering out port labels. Previously, the events contained incorrect owner information. -
Fixed
CompositeUndoUnit#UndoName
setting theRedoName
instead.
Styles
-
The parameter of type
IShapeGeometry
of theDefaultEdgePathCropper#isInside
and#getIntersection
methods is now nullable. - Built-in styles with rounded corners now have the correct outline shape for certain calculations.
- Edges with Bezier paths can now also be animated to non-Bezier paths.
Geometry
-
The
#Area
property of an emptyRectD
instance (includingRectD#EMPTY
) is now always zero, and no longer a negative value.
Hierarchic Layout
-
The
HierarchicLayout
class now correctly processes input graphs with sub-components (HierarchicLayoutData#SubComponents
) and curved edge routing style. Previously, such setups may have a caused an exception. -
The
HierarchicLayout
class now correctly handles grouped input graphs if the node compaction is enabled (see propertySimplexNodePlacer#NodeCompactionEnabled
). Previously, the algorithm sometimes produced less compact results for such inputs. -
The
HierarchicLayout
class now correctly considers the specified port groups for edges (seeHierarchicLayoutData#SourcePortGroupIds
). Previously, such groups were not always considered properly if there are either critical edges or propertySimplexNodePlacer#EdgeStraighteningEnabled
istrue
. -
The
HierarchicLayout
class now correctly considers the specified critical edge priorities (seeHierarchicLayoutData#CriticalEdgePriorities
) if the input graph contains grouped edges. -
The
HierarchicLayout
class now adheres more closely to its maximum duration and itsAbortHandler
. -
The
HierarchicLayout
now considers thePortCandidate
directions correctly for layout orientations other thanTOP_TO_BOTTOM
. This also improves the optimization results withPortCandidateSets
that allow multiple directions to connect to nodes. -
The
HierarchicLayout
class now correctly considers input graphs with group nodes and aPartitionGrid
. Previously, in some rare cases, such inputs may have caused overlapping group nodes. -
The
HierarchicLayout
class no longer generates broken non-orthogonal edge segments of same-layer edges for some cases in conjunction with integrated edge labeling and edge labels placed at the ports. -
The
HierarchicLayout
class now correctly routes grouped edges where in some rare cases it could previously lead to node-edge overlaps. -
The
HierarchicLayout
class not properly satisfiesPortCandidates
defined for same-layer edges at nodes where additionally other edges with (rather large) source/target port labels exist. -
The
HierarchicLayout
class now produces a correct edge grouping structure for short edges having the same source and target group ID. -
The
HierarchicLayout
class no longer produces superfluous port overlaps if there are edges with strong port constraints. -
The
HierarchicLayout
class now correctly assigns ports to edges incident to groups if the uniform port assignment is enabled (see propertyHierarchicLayoutData#UniformPortAssignmentGroups
) for some cases where it previously did not yield a uniform port distribution. -
The
HierarchicLayout
now correctly considers thePreferredPlacementDescriptor
settings of an edge label when there are additionally edge groupings defined. Previously, it could, for example, happen that the edge label was placed on the wrong side of the edge. -
The
HierarchicLayout
no longer throws an Exception when the edge directedness feature (HierchicLayoutData#EdgeDirectedness
) is used in conjunction with enabled backloop-routing (HierarchicLayout#BackLoopRoutingEnabled
). -
The
HierarchicLayout
class no longer creates unnecessary spacing between sub-components (seeHierarchicLayoutData#SubComponents
) and other elements, which previously happened in some cases due to edge/node labels being present. In consequence, these cases are now more compact. -
The
HierarchicLayout
class no longer produces overlaps between (large) external node labels and unrelated edges. -
The
HierarchicLayout
class no longer produces overlaps between sub-component elements (seeHierarchicLayoutData#SubComponents
) and edges that are not part of the component.
Organic Layout
-
The
OrganicLayout
class no longer throws an exception when running it on a graph with a partition grid, group nodes and such that the IDs of the group nodes (see provider keyGroupingKeys#NODE_ID_DPKEY
) are defined using a provider that cannot handlenull
as argument to its get method. -
The
OrganicLayout
andClassicOrganicLayout
classes no longer cause undesired layout side effects when a mapper is registered with keyRecursiveGroupLayout#GROUP_NODE_LAYOUT_DPKEY
or when data is provided via theRecursiveGroupLayoutData#GroupNodeLayouts
property. Previously, the layout algorithms registered there could be applied to nodes that should actually be kept fix by the organic layout. -
The
OrganicLayout
class now produces correct results if auto-clustering is enabled (i.e., propertyClusteringPolicy
is notNONE
) and theGroupNodeMode
is set toFIX_BOUNDS
orFIX_CONTENTS
. -
The
OrganicLayout
class now correctly considers fix-contents and fix-bounds groups (see enumGroupNodeMode
) if the substructure detection is enabled. -
The
OrganicLayout
class now correctly handles nodes with several degree-one neighbors. Previously, such inputs could cause arrangement artifacts if theStarSubstructureStyle
isNONE
. -
The
OrganicLayout
class now correctly detects chain substructures if there are nodes of different types (OrganicLayoutData#NodeTypes
).
Circular Layout
-
The
CircularLayout
class no longer crashes when enabling edge bundling, defining node types (CircularLayoutData#NodeTypes
) and applying it on a graph that contains parallel edges. -
The
CircularLayout
class no longer produces node overlaps if propertySingleCycleLayout#MinimumNodeDistance
is set to 0.
Partial Layout
-
The
PartialLayout
class now correctly routes the edges if propertyMovingFixedElementsAllowed
is enabled. Previously, in some rare cases, this setting could cause broken edge routes.
Clear Area Layout
-
The
ClearAreaLayout
class now correctly routes the edges if propertyEdgeRoutingStrategy
is set toSTRAIGHTLINE
. Previously, in some rare cases, this setting could cause broken edge routes.
Edge Routing
-
The
EdgeRouter
class no longer generates unnecessary detours in the routes when it is configured withMonotonicPathRestriction#BOTH
. -
The
CurveRoutingStage
class now correctly considers the minimum distance to nodes specified as value of theCurveEdgeLayoutDescriptor#MinimumNodeToEdgeDistance
property. Previously, the curves could violate the distance and get too close to nodes. -
The
EdgeRouter
class no longer has a problem that occasionally resulted in bad edge routing artifacts if edge grouping is enabled and non-affected edges are grouped at both end points. -
The
EdgeRouter
class no longer occasionally throws an exception if the input contains bus edges (defined viaBusDescriptor
). -
The
OrganicEdgeRouter#KeepingExistingBendsEnabled
property now correctly obeys its definition and actually keeps the absolute coordinates of the existing bends. -
The
EdgeRouter
class no longer produces artifacts if there are edges with curved routing style and labels, and the integrated edge labeling is disabled (see propertyEdgeRouter#IntegratedEdgeLabelingEnabled
).
Layout
-
The comparison delegates defined in
TreeLayoutData#OutEdgeComparators
andSeriesParallelLayoutData#OutEdgeComparators
no longer receivenull
elements during runtime. -
The
SimpleProfitModel
class now computes meaningful different profits based on thePreferredPlacementDescriptor
for candidates that belong to aSliderEdgeLabelLayoutModel
or aDiscreteEdgeLabelLayoutModel
. Previously, the computed profit was equal for all candidates. -
Fixed a bug in
LayoutExecutor
which caused port labels not to be placed in their calculated position after a layout animation. -
The
LayoutExecutor
class now uses the correct target bounds when a projection is set on theGraphControl
. -
The
CircularLayout
class no longer produces node label overlaps when itsPlacingChildrenOnCommonRadiusEnabled
property is disabled. -
The
ClearAreaLayout
class now correctly considers node labels. Previously, there could be results where node labels intersected with the specified area to be cleared. -
The
ParallelEdgeRouter
class now produces correct parallel routes if itsJoiningEndsEnabled
property is enabled. -
Curved edge routes generated by
HierarchicLayout
,EdgeRouter
andCurveRoutingStage
no longer contain a self-crossing for edges that connect to a group node and where the connection styleCurveConnectionStyle#ORGANIC
is specified. -
Fixed a bug in
TableLayoutConfigurator
that resulted in wrongOriginalPositions
of theRowDescriptors
andColumnDescriptors
when table insets were used. - Fixed a bug that caused errors in shear transformations.
-
Fixed the
UndoEngine
getting corrupted after a layout exception has been catched. -
The
TabularLayout
class now correctly handles the case that the input graph contains only a single node. Previously, the node was not properly assigned to a partition cell and the partition cell row/column did not get correct values for its computed width, height and position.
View
- The mouse event coordinates are no longer quantized to very large steps if a projection is used and the viewport is zoomed in afterwards.
-
The clipboard now doesn't copy labels or ports if they are not selected and their owner's
IClipboardHelper
forbids copying the owner. -
The
ZOOM_TO_CURRENT_ITEM
command no longer moves the current item outside the visible area in rare cases. This was caused by a problem in theViewportLimiter
class. -
Callbacks registered for removed visuals on the
CanvasObject
tree now reliably run after the visual is indeed no longer visible. -
Callbacks registered with the
IRenderContext#setDisposeCallback
method now are reliably called, even when a canvas object has been explicitly removed. -
The
CanvasControl#makeVisible
method no longer ignores the limited viewport size in certain cases. -
Fixed a potential memory leak that could occur when changing the
GraphControl#GraphModelManager
. -
The
CanvasControl#ZoomToAnimated
method now works correctly when aProjection
is used. This has previously been reported as fixed, but was not.
Incompatible Changes
-
The protected method
HandleInputMode#isHovering
has been removed. To customize what handle should be used for a certain query location, the newHandleInputMode#QueryClosestHandle
event can be used. -
The methods
MouseHoverInputMode#onShow
and#show
now return aCompletionStage
that completes when the tooltip content is available and provides whether the tooltip is actually displayed. -
The
HandleInputMode#beginDragging
method now returns aCompletionStage
. -
The
CanvasControl#Projection
property no longer accepts transforms with a non-zero translation component. -
The
CanvasControl#ContentViewMargins
property has been renamed to#ContentMargins
. Accordingly, the#onFitContentViewMarginsChanged
method and the#FitContentViewMarginsChanged
event have been renamed to#onContentMarginsChanged
and#ContentMarginsChanged
, respectively. -
The
CanvasControl#zoomToAnimated
method now returns aCompletionStage
that is completed when the animation has finished. The parameter of typeIEventListener<AnimationEventArgs>
has been removed. -
The
CreateEdgeInputMode#doStartEdgeCreation
method now returns aCompletionStage
that completes when the edge creation gestures has been finished or cancelled. -
The
GraphEditorInputMode#onLabelTextEdited
method now returns aCompletionStage
that completes when the text validation is done and provides whether the validation succeeded or was canceled. - The methods
GraphEditorInputMode#createLabel
,#createLabelCore
,#editLabel
,#editLabelCore
, and#addLabel
now return aCompletionStage
that completes when the label creation, editing or adding has been finished. -
The methods
TableEditorInputMode#createLabel
,#editLabel
, and#addLabel
now return aCompletionStage
that completes when the label has been created, edited or added. -
The
MoveInputMode#doStartDrag
method now returns aCompletionStage
that completes when the move gestures has been finished or cancelled. -
The
MouseHoverInputMode#show
and#onShow
methods now return aCompletionStage
that resolves totrue
if the tool tip will be shown or tofalse
otherwise. The#getToolTip
method now returns anObject
instead of aTooltip
as the return value may now be aTooltip
,CompletionStage
ornull
. -
LayoutExecutor#start
,GraphControl#morphLayout
andLayoutUtilities#morphLayout
now return aCompletionStage
instead ofnull
. -
The
Animator#animate
method now returns aCompletionStage
that is completed when the animation has finished. The parameter of typeIEventListener<AnimationEventArgs>
has been removed together with theAnimationEventArgs
class. -
Animator#animateAndWait
has been removed as the waiting didn't work correctly. -
The
TextEditorInputMode#getTextAreaBounds
method has been removed. -
The new
GenericLayoutData
class is a generic implementation ofLayoutData
that allows to pass arbitrary data to layout stages. As a consequence, theLayoutData#apply
,ItemCollection#provideMapper
andItemMapping#provideMapper
methods were removed. -
The
PolylineEdgeRouterData
class has been renamed toEdgeRouterData
to match the name of the layout algorithm it supports. -
The overload of
Centrality#pageRank
taking just aGraph
parameter has been removed as it only returned the sum of all pageRanks. Use the overload taking aGraph
and anINodeMap
instead.
Behavior
-
The provider returned by
IEdgeReconnectionPortCandidateProvider#ALL_NODE_AND_EDGE_CANDIDATES
now doesn't return port candidates of the reconnected edge itself anymore as this lead to an unstable reconnection behavior. -
The
FIT_CONTENT
andFIT_GRAPH_BOUNDS
commands now change the viewport in an animated fashion. -
Zooming with the mouse wheel to the center of the viewport by using
CanvasControl
'sCenterZoomEventRecognizer
no longer uses theINCREASE_ZOOM
andDECREASE_ZOOM
commands. - During animated viewport transitions, for performance reasons, mouse events are not redispatched, anymore, except for the last frame of the animation.
-
LayoutExecutor#start
doesn't throw an exception anymore if an error occurred during the layout that wasn't handled in the#LayoutFinished
event. Instead theCompletionStage
returned by#start
is completed exceptionally. -
The
OrganicLayout
substructure stylesStarSubstructureStyle#RADIAL
,StarSubstructureStyle#CIRCULAR
,ChainSubstructureStyle#RECTANGULAR
,ChainSubstructureStyle#STRAIGHT_LINE
andCycleSubstructureStyle#CIRCULAR
do no longer allow that the detected substructures are nested inside other substructures. To get the old behavior and allow nesting, new style values were added (e.g.StarSubstructureStyle#RADIAL_NESTED
). -
The following behavior change applies to class
HierarchicLayout
with polyline edge routing style: the default value of propertyEdgeLayoutDescriptor#MinimumSlope
was changed from0.3
to0.2
which makes the sloped segments less steep and the overall results more compact. -
In organic layout, the way edge grouping influences the layout of certain substructures has
changed. Structures are not split-up anymore into several ones when edges of nodes in the structure have different
group IDs. Now, the new node types can be used to split-up structures (see
OrganicLayoutData#NodeTypes
). If a structure contains different edge groups, the grouping is properly considered and may influence the sorting of elements within the structure. Affected substructure styles areStarSubstructureStyle#SEPARATED_RADIAL
,ParallelSubstructureStyle#RADIAL
,ParallelSubstructureStyle#STRAIGHT_LINE
andParallelSubstructureStyle#RECTANGULAR
. -
The
OrganicEdgeRouter#KeepingExistingBendsEnabled
property now correctly obeys its definition and actually keeps the absolute coordinates of the existing bends. Therefore, the new propertyOrganicEdgeRouter#ExistingBendsConsiderationEnabled
was introduced to get the old behavior. Existing bends are considered, but their absolute coordinates are not kept. -
The default value of the
ClassicTreeLayout#MinimumLayerDistance
property was changed from40.0
to20.0
and the default value of theClassicTreeLayout#BusAlignment
property was changed from0.3
to0.5
. In addition, the new#MinimumFirstSegmentLength
and#MinimumLastSegmentLength
properties may lead to different results compared to previous versions. Setting both properties to zero will neutralize their influence on the result. -
For the
DefaultNodePlacer
class that is used by theTreeLayout
, the default values of the#HorizontalDistance
and#VerticalDistance
properties were changed from40.0
to20.0
, and the default values of the#MinimumFirstSegmentLength
andMinimumLastSegmentLength
properties were changed from0.0
to20.0
. -
For the
CompactNodePlacer
class that is used by theTreeLayout
, the default values of the#HorizontalDistance
and#VerticalDistance
properties were changed from40.0
to20.0
, and the default values of the#MinimumFirstSegmentLength
and#MinimumLastSegmentLength
properties were changed from10.0
to20.0
. -
The default value of the
LayeredNodePlacer#BusAlignment
property was changed from0.3
to0.5
.
Deprecations
-
The
CanvasControl#ScrollCommandAnimationEnabled
property has been deprecated in favor of the newAnimatedViewportChanges
property, which offers more control over viewport animations, not just the scroll commands. -
The
OrganicLayout#NodeClusteringEnabled
property is now deprecated. It is replaced by the newOrganicLayout#ClusteringPolicy
property. To disable clustering specifyClusteringPolicy#NONE
. To enable it and use the same algorithm as before, specifyClusteringPolicy#EDGE_BETWEENNESS
. -
The class
com.yworks.yfiles.analysis.TreeAnalyzer
has been deprecated. The more powerful classTreeAnalysis
should be used instead.
New Demos
-
The new
LensInputMode
demo shows how to create anInputMode
to show a magnifying glass effect on the canvas. -
The new
NodeTypesDemo
shows you how the new node types feature is supported by several layout algorithms. -
The new
OrganicSubstructuresDemo
shows you how substructures are supported by theOrganicLayout
algorithm. -
The new
ReshapeHandleProviderConfigurationDemo
shows you how to use a customIReshapeHandleProvider
implementation. TheReshapeHandleProviderDemo
has been re-written to show how to use the built-in providers. -
CompositeNodeStyle
demo shows how to combine multiple styles into one. -
The
NetworkFlowsDemo
has been added that shows how to use different network flow algorithms using a network of water pipes. -
The new
MavenDemo
shows how to set up a basic yFiles for JavaFX project using Apache Maven. -
The new
GradleDemo
shows how to set up a basic yFiles for JavaFX project using Gradle.
Demo Improvements
-
More sample graphs and configuration options have been added to the
LayoutStyle
demo. -
A bug in
SimpleEditorDemo
has been fixed that sometimes caused performance issues due to unnecessary checks whether printing is currently possible.
yFiles for JavaFX 3.4.0.1
Improvements
View
-
The
ViewportLimiter
class now always centers the viewport if itsHonoringBothDimensionsEnabled
property is disabled.
Layout
-
The
HierarchicLayout
class now has an improved strategy for choosing the port candidates for same-layer edges with multiple available candidates. Previously, the chosen candidate may have led to superfluous back-loops.
Algorithms
-
The
LabelPropagationClustering
algorithm now produces normalized, continuous clustering IDs. In other words, for example, if it finds 5 clusters, they get IDs from 0 to 4. Previously, the range of IDs may have contained holes. If initial label values are provided, this normalization is omitted.
GraphML
-
The
ValueSerializer
for well-known color names now supports screaming snake case in addition to camel case and lower case names.
Bugfixes
View
-
The clipboard now doesn't copy labels or ports if they are not selected and their owner's
IClipboardHelper
forbids copying the owner. -
The
CanvasControl.ZoomToAnimated
method now works correctly when a Projection is used. -
The
ZOOM_TO_CURRENT_ITEM
command no longer moves the current item outside the visible area in rare cases. This was caused by a problem in theViewportLimiter
class. -
Fixed a bug in
CanvasControl.FitContent
andGraphControl.FitGraphBounds
which causedFitContentViewMargins
being incorrectly applied in case aProjection
has been set. -
The following issues of the
ZOOM_TO_CURRENT_ITEM
command have been corrected:- The item is now longer placed slightly out of center if scrollbars appear during the operation.
- If the current item is too large to fit the viewport at zoom 1, the command now zooms out.
-
Fixed incorrect margins on an
GraphOverviewControl
with aProjection
set. -
Fixed a bug which caused the
ZOOM
command to disrespect theViewportLimiter
if executed with a rectangle as parameter. - The mouse event coordinates are no longer quantized to very large steps if a projection is used and the viewport is zoomed in afterwards.
Graph
-
The
DefaultFolderNodeConverter
andAbstractFoldingEdgeConverter
classes (and thus, also theDefaultFoldingEdgeConverter
andMergingFoldingEdgeConverter
classes) no longer ignore port labels. -
A label with
EdgeSegmentLabelModel
orEdgePathLabelModel
now moves steadily when the segment to which it belongs moves.
Input
-
The
CreateEdgeInputMode
class no longer has an error which prevented the removal of port candidate visualizations after another input mode claimed to be active. -
ItemDropInputMode
and its submodes now setDragEvent#setDropComplete
correctly.
GraphML
- Labels at ports of collapsed nodes are no longer lost during GraphML serialization.
Layout
-
The
TabularLayout
class no longer throws an exception about a missingPartitionGrid
when used withinRecursiveGroupLayout
andRecursiveGroupLayoutData
andTabularLayoutData
are used without an explicit cell-id mapping. -
The
LayoutExecutor
class now uses the correct target bounds when a projection is set on theGraphControl
. -
When the
MaximumDuration
of theEdgeRouter
class is exceeded, it now still uses the same port for edges that are grouped. Previously, edge grouping constraints were mostly ignored when the time was up. -
Improved the reaction time of the
EdgeRouter
class when theMaximumDuration
is exceeded or the algorithm should stop due toAbortHandler
for some cases where previously the search for a path kept on running for a long time. -
The
RadialLayout
class is now much faster if the input graph is a very large tree structure. -
The
OrganicLayout
andClassicOrganicLayout
classes no longer produce an internal integer overflow that may lead to an early exit and, thus, poor layout results for very large input graphs. -
The
ClearAreaLayout
class no longer throws an exception for some scenarios where the same algorithm instance was first applied to a graph withPartitionGrid
and later to a graph without grid. -
The
EdgeRouter
andPolylineLayoutStage
classes no longer produce broken routes for edges with polyline segments. Previously, such broken routes may have appeared in rare cases. -
The
HierarchicLayout
class now correctly considers the back-loop routing style (HierarchicLayout#BackLoopRoutingEnabled
) for graphs with critical edges (seeHierarchicLayoutData#CriticalEdgePriorities
). -
The
ClearAreaLayout
andFillAreaLayout
classes no longer throw an exception for some input graphs with edge labels if propertyEdgeLabelConsiderationEnabled
is enabled. -
The
GenericLabeling
class no longer throws an exception for edge labels with preferred placement descriptor if propertyEdgeLabelPlacementEnabled
is disabled. -
The
TreeLayout
class now correctly handles trees with group nodes. Previously, it sometimes produced overlapping elements and halo violations for such inputs. -
The curved edge routes produced by
HierarchicLayout
,EdgeRouter
orCurveRoutingStage
no longer violate the minimum node-edge distance or intersect the node. Intersections could previously happen especially when the specified node-edge distance was zero. -
The
RecursiveGroupLayout
class now correctly handles setups that use both recursive and non-recursive group nodes. Previously, such use-cases may have led to invisible/ignored edges and, thus, broken edge routes. -
The
PartialLayout
class now transfers the value of itsPartialLayout#MaximumDuration
property to the internally used edge routing algorithm. This means that when the partial layout has a restricted running time, the routing part will be restricted, too. Previously, the duration of the edge routing was unrestricted. Note that if the router instance is user-specified, this instance will not get a maximum duration. -
The
HierarchicLayout
,EdgeRouter
andCurveRoutingStage
classes no longer occasionally throw an exception when the curved routing style is used for graphs that have self-loop edges. -
The
ClearAreaLayout
class now produces correct orthogonal routes for edges if itsClearAreaStrategy
property is set to a local strategy. Previously, some of the edges may have received a non-orthogonal route. -
The
EdgeRouter
class no longer throws an exception if the input contains a bus defined viaBusDescriptor
where all the associated edges are actually fixed.
Hierarchic Layout
-
The
HierarchicLayout
class no longer produces an infinite looping issue in the incremental layout mode for some input graphs with layer constraints that specify that a node should be placed in the topmost/bottommost layer. -
The
HierarchicLayout
class no longer produces unnecessary edge crossings between self-loop edges at the same node in cases where a larger number of self-loops exist at a node. -
The
HierarchicLayout
class no longer ignores edges connected to group nodes when the group node contains a bus structure (seeHierarchicLayoutData#Buses
) and no other elements. Such edges were previously actually removed from the layout graph such that other stages (e.g. theComponentLayout
) could have failed with an exception. -
The
HierarchicLayout
class no longer occasionally throws an exception when enablingHierarchicLayout#GroupCompactionEnabled
and in conjunction with layering constraints and/or a group node marked as incremental. -
The
HierarchicLayout
class does no longer violate the specified minimum length for edges incident to group nodes. -
The sequencing phase of the
HierarchicLayout
class is now faster for large graphs with sequence constraints and non-incremental layout mode.
Edge Routing
-
The
BusRouter
class now produces more suitable edge routes for rare cases that were caused by an unsuitable bus placement. -
The
EdgeRouter
class now uses the given ports for edges of a bus with fixed edges. -
The
EdgeRouter
class now correctly considers edges incident to a fixed inner port of a group node when the routing algorithm has restricted maximum duration. Previously, this setup sometimes led to strange edge routes with many superfluous bends. -
The
EdgeRouter
class no longer contains edges with self-crossings in some rare cases where it previously failed to eliminate them. -
The
EdgeRouter
andCurveRoutingStage
classes no longer change the path of unaffected (fixed) edges when theControlPointCreationEnabled
property of their associatedEdgeLayoutDescriptor
instance (CurveEdgeLayoutDescriptor
respectively) is enabled. -
The
EdgeRouter
class now correctly supports the use case that a subset of edges is routed with the curved routing style while another subset is routed with another routing style and different settings on the associated individualEdgeLayoutDescriptor
instances. Previously, with some edges being curved, the settings of the other edges got lost and the default settings were used. -
The
OrthogonalSegmentDistributionStage
class does no longer crash when receiving input graphs with a very large edge count (greater than approximately 22000). Note that theChannelEdgeRouter
class is affected too, as the stage is by default called from within the router.
Analysis
-
The
Cycles#FindCycleEdges
algorithm no longer crashes when the given input graph contains self-loops.
yFiles for JavaFX 3.4
This release contains many new major features and lots of other new features, improvements, and bugfixes for all parts of the library. In addition to the new demos, there are some notable demo improvements, too.
If you are updating from an older version of yFiles for JavaFX, have a look at the list of incompatible changes.
Major New Features
- Isometric Drawing and Other Projections
-
CanvasControl
(and thusGraphControl
) now has an additionalProjection
property that can be used to transform the viewport into a different parallel projection, e.g. isometric or cabinet projection. Predefined useful projections are provided as constants on the newProjections
class. Interaction, including graph editing, snapping, orthogonal edge editing, etc. still work as expected, just within the new projection. That is, orthogonal edge editing becomes isometric edge editing with an isometric projection. There is a corresponding chapter in the Developer's Guide that goes into further detail what has changed and which customization options exist.The
IsometricDrawingDemo
displays graphs in an isometric fashion to create an impression of a 3-dimensional view. - Fill Area Layout and Clear Area Layout
-
The new
ClearAreaLayout
algorithm clears a user-specified area in an existing layout by moving elements. It is suitable if the rest of the layout should not change much but some free space is required, e.g., because new elements need to be inserted into the drawing or have been resized.The new
The following two new demos showcase the new layout algorithms:FillAreaLayout
algorithm fills a user-specified area in an existing layout by moving elements into or towards it. It can make layouts around the specified area more compact and is suitable if, e.g., elements were removed from the graph or their size has changed substantially.-
The new
MarqueeClearAreaLayoutDemo
shows how to make space in a diagram by dragging a marquee rectangle. -
The new
FillAreaAfterDeletionDemo
shows how to fill free space after deleting nodes using theFillAreaLayout
algorithm.
-
The new
- Aggregation and Analysis of (Large) Graphs
-
Many new algorithms for analyzing graphs are now included, for example to detect components and clusters, to aggregate sub-graphs, and to calculate centrality values. In addition, the analysis algorithms now have the option to define a subset of the graph to work on. In detail, the new classes are:
-
The new
NodeAggregation
class provides an algorithm that intelligently aggregates nodes of (large) input graphs. It does not require complex configuration and can be used without knowledge of specific clustering or aggregation techniques. -
The
KCoreComponents
class provides a component detection algorithm that finds k-cores. -
The classes
LouvainModularityClustering
andLabelPropagationClustering
provide two new algorithms for cluster detection. -
The
EigenvectorCentrality
class offers a centrality algorithm that measures the influence of a node in a network based on the Eigenvector score. -
The
PageRank
class provides a centrality algorithm that calculates the so-called page rank for the nodes. -
The classes
ChainSubstructures
,CliqueSubstructures
,CycleSubstructures
,StarSubstructures
, andSubtreeSubstructures
provide new algorithms that detect isolated substructures like chains, cliques, cycles, stars, or subtrees. This can be used as an input to other (layout) algorithms. -
The class
GraphStructureAnalyzer
now offers additional methods to calculate the average degree, the average weighted degree, the diameter, and the density of a given graph.
-
The new
- Support for Curved Edges
-
The new
BezierEdgeStyle
renders edges with smooth Bezier-curve paths.In addition, the new edge label models
BezierEdgePathLabelModel
andBezierEdgeSegmentLabelModel
place labels optimally on curved edges rendered with this style.Support for curved edges has been added to the layout and edge routing algorithms
EdgeRouter
and theCurveRoutingStage
, andHierarchicLayout
. - Interactive Node Resizing
-
Resizing nodes using their handles now supports two new behaviors:
- Center resizing keeps the center fixed and scales the node in all directions. It is active when the
NodeReshapeHandleProvider#CenterReshapeRecognizer
is triggered which defaults to theAlt
key held down. - Aspect ratio resizing maintains the aspect ratio of a node. It is active when the
NodeReshapeHandleProvider#RatioReshapeRecognizer
is triggered which defaults theShift
key held down. - The
NodeReshapeHandleProvider#ReshapePolicy
property determines how the mouse location is interpreted when aspect ratio resizing is active.
The
ReshapeHandleProviderDemo
showcases these different resizing behaviors. - Center resizing keeps the center fixed and scales the node in all directions. It is active when the
- Graph Builder
-
The new
GraphBuilder
,TreeBuilder
,AdjacencyGraphBuilder
have been added. These new classes facilitate building graphs from arbitrary data:GraphBuilder
can be used when the data consists of one or more collections of nodes, edges, and optionally, groups.TreeBuilder
can be used when the data consists of one or more collections of nodes, each of which knows its child nodes, and optionally, groups.AdjacencyGraphBuilder
can be used when the data consists of one or more collections of nodes, each of which knows its neighbors, and optionally, groups.
New Features
Graph
-
The new
NodeLabelModelStripeLabelModelAdapter
class allows using node label model parameters for the positioning of the row and column labels of a table.
Algorithms
-
New methods of the
GraphChecker
andGroups
classes compute several additional network statistics, namelyGraphChecker#getAverageDegree
,GraphChecker#getAverageWeightedDegree
,GraphChecker#getDiameter
,GraphChecker#getDensity
, andGroups#getModularity
. -
The new
NodeAggregation
class provides an algorithm that intelligently aggregates nodes of (large) input graphs. It does not require complex configuration and can be used without knowledge of specific clustering or aggregation techniques. -
The new
Transitivity#TransitiveEdges
method creates the transitive edges that connect the visible nodes in an input graph. -
The new
GraphConnectivity#kCore
overloaded methods compute the so-called k-cores of an undirected input graph. -
The new
Centrality#eigenvectorCentrality
method computes the eigenvector centrality for each node in an undirected graph. -
The new
Centrality#pageRank
method provides an implementation of the page rank algorithm that computes a rank for each node. -
The new
Groups#labelPropagation
method implements the label propagation algorithm which detects communities in the input graph. -
The new
Groups#louvainModularity
method detects the communities of an input graph by applying the well-known Louvain method for community detection. -
The new
Groups#getClusteringCoefficient
method computes the local clustering coefficient for each node as well as the average clustering coefficient. -
The new
Substructures
class offers methods to detect the following graph structures: Chains, Cliques, Cycles, Stars, and Trees.
Layout
-
The new routing style
EdgeRoutingStyle#CURVED
of theHierarchicLayout
class results in edge paths that consist of smooth curves that are constructed using cubic bezier splines. -
The new property
EdgeLayoutDescriptor#RoutingStyle
allows specifying the routing style individually for each edge routed by theEdgeRouter
class. Furthermore, the new propertiesMaximumOctilinearSegmentRatio
andPreferredOctilinearSegmentLength
on the descriptor provide means to configure the octilinear routing style. -
The
EdgeRouter
class now supports a new routing style that generates curved edge paths. It can be specified for each edge individually using theEdgeRoutingStyle#CURVED
enum value. -
The new layout stage
CurveRoutingStage
replaces polyline edge paths with curved segments using cubic bezier splines and provides a generic way to produce layouts with curved edges. -
The
CircularLayout
class now supports exterior edges that are routed around the exterior of the circle as smooth arcs. This can be specified with the newCircularLayout#EdgeRoutingPolicy
property. -
The new
EdgeBundlingStage
class offers edge bundling for general undirected graphs. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes. -
The
RadialLayout
class now supports a user-defined layer/circle assignment strategy. This can be specified with theLayeringStrategy#USER_DEFINED
enum value and the layout data propertyRadialLayoutData#LayerIds
.
Improvements
-
IListEnumerable#create
can now be called with any Iterable instead of only with Lists. -
The license mechanism now only logs license messages when no valid license has been found.
Previously it was also logged to
System#err
that a license is valid. -
Added property
LicensePath
to classLicenseConfig
to support license files in places other than the classpath root.
Graph
-
The
ITable#addLabel
method no longer accepts label model parameters that do not supportIStripe
instances. Previously node label models could be used, but did not work properly at runtime. -
The default method
getPathPoints
was added for theIEdge
interface. The returnedIListEnumerable
contains a snapshot of the source port location, followed by the bend locations, followed by the target port location of an edge. -
The
FilteredGraphWrapper
class now has a new overload without the edge predicate, which often just returnstrue
anyway. -
GraphMLIOHandler
has been improved to prevent external entity injection attacks by default. To prevent these attacks,GraphMLIOHandler
disallowsDTD
declarations in readXML
documents.
View
-
The
CanvasControl#updateContentRect
method now throws anIllegalStateException
if an element on the canvas provided invalid bounds, e.g. one with infinite values. -
The
CanvasControl#fitContent
method now respects theLimitedFitContentZoom
property if aViewportLimiter
is enabled. -
A new policy has been added to the
ViewportLimiter
class which allows for zooming and panning towards the limits but not away from them. This prevents the viewport from "jumping" from out-of-limit coordinates into the limited bounds. -
The methods
raise
,lower
,toFront
andtoBack
on classGraphModelManager
are not final anymore, thus, can now be overridden. -
The new
GraphModelManager#ProvideUserObjectOnMainCanvasObject
property can be set so that a model is accessible as its main canvas object's user object. -
The classes
DefaultFolderNodeConverter
andAbstractFoldingEdgeConverter
provide a new protected methodcreatePreferredLabelSize
to allow for overriding the default implementations. -
The classes
NodeStyleLabelStyleAdapter
,NodeStylePortStyleAdapter
, andNodeStyleStripeStyleAdapter
now propagate the tags of labels, ports, and stripes to the node that's rendered with the node style. -
The
GridVisualCreator
class can now draw only horizontal lines or only vertical lines when itsGridStyle
property is set to one of the new enum valuesGridStyle#HORIZONTAL_LINES
orGridStyle#VERTICAL_LINES
. -
OverviewInputMode
now has a protected methodupdateVisibleArea
which is the callback that fits the client canvas' content rectangle into the overview again after it has changed. -
An
Animation
can now be paused and unpaused by setting thePaused
property on theAnimator
class after the animation has started. -
AbstractTemplateStyle
'screateControl
has been improved to register the created control's associated controller as a dispose callback if the controller implementsIDisposeVisualCallback
. -
Consolidated the API and behavior of
TemplateLabelStyleRenderer
,TemplateNodeStyleRenderer
,TemplatePortStyleRenderer
, andTemplateStripeStyleRenderer
. All four classes now have protectedconfigureManaged
,arrange
, andgetLayout
methods to simplify customization.
Projections Feature
-
The image export and printing classes (
ContextConfigurator
,PixelImageExporter
,CanvasPrinter
) have been improved to work better with the new Projections feature by being able to define an arbitrary list of points as well as the projection that should be used for export/printing. The export chooses the exported area in a way that all these points are enclosed in a rectangular area which is axis-parallel to the output coordinates under the given projection. -
The property
CanvasPrinter#printRectangleProperty
was replaced by a #printPointsProperty
and a #printPoints
property was added which contains the points in world coordinates which determine the region to print. The property #PrintRectangle
that was previously used to determine the world bounds to print now delegates to #PrintPoints
. -
The
CanvasControl
class has additional methods to convert between the world, the new intermediate, and the view coordinate system. -
The
MarqueeSelectionInputMode
,NavigationInputMode
, andHandleInputMode
classes now have a propertyUseViewCoordinates
, which controls whether the input mode draws its decorations and processes input in view coordinates. -
When the
MarqueeSelectionInputMode
class uses view coordinates, the resulting shape of the marquee in world coordinates may not be a rectangle. Therefore theMarqueeSelectionEventArgs
class now has aPath
property of typeGeneralPath
to describe the marquee shape and aUsePath
property that determines whether thePath
property or theRectangle
property shall be used. -
MarqueeSelectionInputMode
now has a propertySelectionPath
that returns aGeneralPath
representing the current or last selection rectangle in world coordinates. This is necessary for projections where the marquee selection rectangle is not a rectangle in world coordinates. -
The
EdgeDecorationInstaller
,RectangleIndicatorInstaller
,PointSelectionIndicatorInstaller
, andDefaultPortCandidateDescriptor
classes now have a propertyUseViewCoordinates
that controls whether the decoration is rendered in view coordinates. -
The
CreateEdgeInputMode#measureDistance
method now has to return the distance in view coordinates if and only ifCanvasControl
'sProjection
is used. -
The
IRenderContext
interface now has the following additional members that are useful with the new projections feature:getProjection
,getIntermediateTransform
,worldToIntermediateCoordinates
, andintermediateToViewCoordinates
.
Input
-
It is now easier to customize the
GroupingNodePositionHandler
class. The boolean propertiesAdjustingParentNodeLayoutEnabled
,MovingChildNodesEnabled
andReparentingEnabled
have been added to control whether an ancestors' node layout should be adjusted when a node is moved, to not move the contents of a group node when a group node is moved or forbid any interactive reparenting. -
The
GraphEditorInputMode#requeryHandles
method has been made public and can now be used to refresh the displayed handles, ifIHandleProvider
implementations return different handles over time. -
The
GraphClipboard
andGraphEditorInputMode
classes now provide the newElementsDuplicated
event that occurs when a duplicate operation finished successfully. -
The
undo
andredo
methods of theUndoEngine
class now throw anIllegalStateException
if the current state does not allow performingundo
orredo
. Previously eitherUnsupportedOperationException
orRuntimeException
have been thrown. - The default position handler for edges now creates fewer additional bends when the edge is dragged while orthogonal edge editing is enabled.
-
A
MaximumBoundingArea
can now be set on the classesAbstractReshapeHandleProvider
,ReshapeHandlerHandle
,RectangleHandle
, andReshapeRectangleContext
to restrict reshaping to stay inside the given bounds. -
The
ReshapeHandlerHandle
class has new getters for theIReshapeHandler
and theHandlePositions
. -
The new
NodeDecorator#ReshapeHandlerDecorator
property simplifies using customIReshapeHandler
implementations for nodes. -
The new
ReshapeRectangleContext#Ratio
property specifies the width/height ratio that is kept for aspect ratio resizing. -
The new classes
NodeReshapeHandleProvider
andNodeReshapeHandlerHandle
are used as default implementation for node resize handles. -
With the new
ReshapeRectangleContext#ReshapePolicy
property,INodeReshapeSnapResultProvider
implementations can respect the node aspect ratio for according resize gestures. -
The new
NavigationInputMode#fitContent
method is called after collapse, expand, enter, and exit operations if theFitContentAfterGroupActions
property is enabled. -
The
NavigationInputMode
class doesn't fit the content anymore after expand and collapse operations if anAutoGroupNodeAlignmentPolicy
other thenNONE
is used. -
TextEditorInputMode
now supports opening the text editor parallel to the edited label or parallel to the screen coordinates. The newTextAreaRotationEnabled
property controls this. -
An optional parameter
preferredSnapType
has been added to theSnapLineSnapResult
constructor and theSnapResults#createSnapLineSnapResult
factory method. -
The new factory method
OrthogonalEdgeEditingContext#createOrthogonalEdgeDragHandler
can be used for custom node position handler and reshape handler to keep orthogonal edges attached to a node orthogonal during the drag/reshape gesture. -
The properties
GridSnapDistance
andGridSnapType
of theGraphSnapContext
class have been pulled up to theSnapContext
class. -
The zoom-invariant
GridSnapDistance
property has been added to theCollectSnapResultsEventArgs
class. -
The
SnapResults#createResizeSnapResult
method now takes aPointD
as delta parameter instead of a double so it is possible to create resize snap results where the orientation of the mouse delta differs from the orientation of the snapped size. -
Class
ResizeStripeInputMode
now has anIsDragging
property, indicating whether a drag currently is in progress. -
Class
DropInputMode
now has anIsDragging
property, indicating whether a drag on the canvas currently is in progress. -
Class
HandleInputMode
now has anIsDragging
property, indicating whether a drag currently is in progress. -
The
CompositeLabelModel
class now supports label snapping.
Geometry
-
The new method
PointD#interpolate
calculates the linear interpolation between two points. -
GeneralPath
has a few new helper methods, mostly related to cubic Bézier curves:findCurveIntersection
finds the intersection between a cubic Bézier curve and the path.getCubicSplitPoints
determines new control points for splitting a cubic Bézier curve.getProjection
calculates the projection of a point onto a specific segment of the path.
Analysis
-
Most of the algorithms in namespace
Analysis
provide propertiesSubgraphNodes
andSubgraphEdges
which facilitate to analyze only a subset of the given graph. -
The
GraphStructureAnalyzer
class has now methods to determine whether there are multiple edges between the same pair of nodes. -
The
GraphCentrality
andClosenessCentrality
analysis algorithms now calculate the centrality individually per component instead of returning a centrality value of 0.0 for nodes in graphs that are not connected. -
In a single node graph, the single node's closeness centrality and graph centrality value is now
1.0. (Previously, it was infinity.) This also affects derived values such as minimum, maximum, and normalized
centrality. The backing algorithms in the
Centrality
class are unchanged. -
When
EdgeBetweennessClustering
andFeedbackEdgeSet
are executed, the specified edge weights are checked and in case they are not positive or finite, anIllegalStateException
is thrown.
Layout
- Frequently used types of the layout part have now nullability annotations.
-
The
DefaultPortAllocator
class has a new propertyConsiderFixedPorts
that allows to specify whether edges with strong port constraints or fixed port candidates should be considered during the port assignment. Previously, such edges were ignored which could lead to intersections with the ports of the other edges. This new feature is enabled by default. -
The
EdgeRouter
class now provides an improved support for early exits. The routing algorithm now often reacts more sensibly to the case that the specifiedMaximumDuration
is reached. -
If the
EdgeRouter
algorithm runs with highly restricted time (seeEdgeRouter#MaximumDuration
) or when it gets stopped by means ofAbortHandler
, it now keeps the minimum edge to edge distance better. -
The
PartialLayout
class now produces more stable results if it is multiple times applied to the same input graph and propertySubgraphPlacement
is set toSubgraphPlacement#FROM_SKETCH
. -
The
HideGroupStage
class now offers a new propertyResetEdgePaths
that allows to specify whether or not the stage resets the path of edges incident to group nodes. -
The
ComponentLayout
class now correctly considers node and edge labels when using the packed layout styles, e.g.,ComponentArrangementStyles#PACKED_RECTANGLE
orComponentArrangementStyles#PackedCircle
. Previously, labels could overlap other elements when using these component arrangement styles. -
Constructor overloads have been added to classes
SingleItem
,ItemCollection
,ItemMapping
, andContextItemMapping
that initialize one of their properties on construction. -
The
LayoutExecutor
class now generates more specific port constraints with theFixPorts
property enabled, resulting in better edge paths. -
If the
Mapper
property of classHierarchicLayoutData#EdgeDirectedness
is directly accessed (not explicitly set) its default for unset values is 1.0 (directed edge). -
If the
Mapper
property of classOrganicLayoutData#GroupNodeModes
is directly accessed (not explicitly set) its default for unset values isGroupNodeMode#NORMAL
. This doesn't change the result of the layout. -
For the
RootPlacements
,SubtreeRoutingPolicies
, andSubtreeAspectRatio
properties of theAspectRatioTreeLayoutData
class, the type of the mapped values has been made nullable. Fornull
or unset values, the settings on theAspectRatioTreeLayout
will now be taken. -
Relaxed the strict type requirements for
IncrementalHintItemMapping
'ssetIncrementalSequencingItems(Iterable)
overload to accept specificIModelItem
sub-types as well. -
Relaxed the strict type requirements for
LayoutData
setter overloads that take mappings of one kind or the other to accept sub-types of the required value type. This also applies toLayoutExecutor#setPortLabelPolicies
andLayoutGraphAdapter#setPortLabelPolicies
.
Bugfixes
View
- Layout animations for graphs with ports that are owned by edges no longer throw an exception.
-
An animation created with the
Animations#createGraphAnimation
method no longer throws an exception if the providedIMapper
with new bend locations doesn't provide bend locations for all edges. -
The
ViewportAnimation
no longer throws an Exception when applied on a zero-sizeGraphControl
. -
Fixed a bug which caused the
ZOOM_TO_CURRENT_ITEM
command to ignore theViewportLimiter
of the correspondingCanvasControl
. -
The
CanvasControl#zoomTo
method no longer triggers twoViewportChanged
events. - Scrolling the viewport with the mouse wheel no longer scrolls in the wrong direction if the mouse wheel is set to scroll one page at a time (instead of several lines).
-
The
GraphModelManager#getMainCanvasObject
method no longer throws aNullPointerException
when overriding itsgetCanvasObject
methods for items in an unexpected way. -
Due to better
null
checks, several styles and input modes no longer throw an exception in the rare case that anIRenderContext
doesn't provide aCanvasControl
instance. -
Fixed a bug in
FoldingManager
where a predicate change in aFilteredGraphWrapper
which serves asMasterGraph
could trigger an Exception if a child of a folder node has been hidden. -
The methods
ICanvasObject#above
andbelow
don't unnecessarily triggerIRenderContext#ChildVisual
anymore. -
Callbacks registered via
IRenderContext#setDisposeCallback
are now always called when the visual was disposed. Previously there have been some cases, such as creating visuals outside of rendering (e.g. for measuring), where the callback would never be called. - Edges between deeper nested nodes are now displayed correctly in front of a common ancestor after that ancestor has been added or removed.
-
Fixed a bug in the
GraphCopier
class which caused theLabelCopied
event to be dispatched twice for port labels on folder nodes. -
GraphControl
'ssaveFileAs
method now appends the file name extension appropriate for the file filter chosen in the corresponding save file dialog. -
Fixed path calculation in
PathBasedEdgeStyleRenderer
whenPathRenderPolicy
LINES
is used with a path that contains cubic curve segments. -
Fixed path calculation in
EdgeDecorationInstaller
whenPathRenderPolicy
LINES
is used with a path that contains cubic curve segments.
Input
- Pinch-zoom no longer stops periodically during the gesture.
-
Calling the
GraphInputMode#findItems
andGraphInputMode#HitTester#enumerateHits
methods with a customIInputModeContext
will now always pass that context to theIHitTestable
implementations of the items being hit-tested. Previously, the main input mode's ownIInputModeContext
was used in certain cases. -
The paste and duplicate operations now honor the
GraphEditorInputMode#shouldSelect
predicate. -
The
NodeDropInputMode
class now correctly considers port labels, both for creating the new node and for the preview. -
The
ICommand#SET_CURRENT_ITEM
command can now also be used to “reset” the current item tonull
by passingnull
as the command parameter. This also fixes that theNavigationInputMode#SetCurrentItem
andGraphInputMode#SetCurrentItem
methods did nothing whennull
was passed as an argument. -
The
TextEditorInputMode
class now correctly queries theViewportLimiter
ifTextBoxPlacementPolicy#SCROLL_CANVAS
is used. If the text box is still not visible because it's outside the limited viewport, the text box will be moved as well. - Undo and redo of additions and removals of bends on folding edges now correctly restores the bends at the location they had at the time of removal.
-
The
NavigationInputMode#FitContentAfterGroupActions
property is no longer ignored when theNavigationInputMode
class is used as a child input mode of theGraphEditorInputMode
class. -
The
NavigationInputMode
class now also updates theCanvasControl#ContentRect
property when it is not used as a child input mode of theGraphEditorInputMode
class. -
The
SnapContext#GridSnapDistance
andSnapContext#SnapDistance
properties are no longer incorrectly interpreted in world coordinates when calculatingSnapResults
. -
MouseWheelEventArgs
are now set toHandled = true
whenCanvasControl
scrolls or zooms to avoid those events from bubbling to parent controls. - Orthogonal edge editing does not add bends anymore to edges that are marked as not orthogonal.
- Input modes are no longer left in an undefined state if another input mode has been activated in an event handler of the first input mode. This usually resulted in the wrong cursor being displayed.
Geometry
-
Fixed the
MaxX
andMaxY
properties ofRectD#INFINITE
which now returnDouble#POSITIVE_INIFINITY
instead ofNaN
. In turn,RectD#INFINITE
'sTopRight
,BottomRight
, andBottomLeft
corners were fixed, too.
Analysis
-
The
EdgeBetweennessClustering#run
method no longer throws an exception with its default setting for theMaximumClusterCount
property. -
The Manhattan distance metric for
HierarchicalClustering
no longer ignores the vertical distance component. -
The
HierarchicalClustering
class no longer throws an exception when applied to an empty graph. -
The results of the
Chains
class are now correct for undirected cycles, too. If such cycles are not connected to other parts of the graph, theNodes
collection of a resultingPath
could have been in an incorrect order. -
The
ClosenessCentrality
class no longer calculatesNaN
as result of theNormalizedNodeCentrality
property if the graph consists of one single node. Instead, the value of theNormalizedNodeCentrality
property is now positive infinity. -
The
ClosenessCentrality#run
method no longer throws an exception for unconnected graphs. Instead, all values of theNodeCentrality
andNormalizedNodeCentrality
properties will be0.0
as the documentation states. -
A number of spurious
NullPointerException
s in various graph analysis algorithms do no longer happen when configuring them with aMapper
that doesn't have an explicit value for every node/edge in the graph.
Layout
-
The
morphLayout
andLayoutExecutor#start
methods no longer throw an exception when applied on a zero-sizeGraphControl
. -
Fixed a bug in
ItemCollectionMapping
that could result in aNullPointerException
for addedItemCollections
where no items were specified. -
The
HierarchicLayout
class now correctly handles inputs that have both bus structures and edges with recursive style. Previously, an exception could be triggered when an edge was marked as recursive and belonged to a bus at the same time. -
The
HierarchicLayout
class no longer throws an exception that was previously triggered in some cases with bus structures (see propertyHierarchicLayoutData#Buses
) and in conjunction with layering constraints. -
Fixed a bug in the
HierarchicLayout
class that in some cases caused a violation of the minimum first or last segment length (EdgeLayoutDescriptor#MinimumFirstSegmentLength
andEdgeLayoutDescriptor#MinimumLastSegmentLength
). The bug was only triggered when the minimum length values were relatively large. -
The
OrganicLayout
class no longer throws an exception when having aPartitionGrid
and at the same time the scope set toSUBSET
orMAINLY_SUBSET
where all nodes of the graph are marked as affected (could have used scopeALL
instead). -
The
EdgeRouter
class no longer produces unnecessary overlaps for cases where the source or target node is overlapped by (several) label elements. This generally improves the ability of the router to deal with input that contains source/target nodes that are overlapped by other elements and are required to be crossed by an edge route. -
The
EdgeRouter
class no longer throws an exception whenEdgeLayoutDescriptor#IntermediateRoutingPoints
are too close together. -
The
EdgeRouter
class no longer has a problem that appeared with a bus containing affected as well as non-affected (fixed) edges at the same time. Previously, this could trigger an exception or lead to the incorrect behavior that an actually affected other edge was not routed. -
The
EdgeRouter
class no longer occasionally throws an exception if the input contains bus edges defined viaBusDescriptor
. -
The
EdgeRouter
class no longer has a problem that occasionally resulted in bad edge routing artifacts if edge grouping is enabled and non-affected edges are grouped at both end points. -
The
EdgeRouter
class no longer yields edge labels that overlap with unrelated group nodes when using the integrated label placement feature. -
Resolved a bug in the
EdgeRouter
class which caused that grouped edges were sometimes actually not grouped together. This mainly appeared in conjunction with a large value of either the minimum first or last segment length. -
The
EdgeRouter
class no longer produces an exception for some rare cases with fixed grouped edges and octilinear paths. -
The
EdgeRouter
class now correctly observes inputs where the user specifies buses with both fixed and non-fixed edges at the same time. -
The
EdgeRouter
class now properly considers ports provided by aPortCandidateSet
when the set contains multiple candidates with single capacities and where the candidates are on the same node side. Previously, it could happen that only one of several edges connecting to the node correctly considered the ports. -
The
EdgeRouter
class does no longer use the same fixedPortCandidate
out of a specifiedPortCandidateSet
if another non-saturated candidate can be chosen. Thus, overlapping edge segments are avoided. -
The
EdgeRouter
class no longer occasionally throws an exception if the input contains bus edges (defined viaBusDescriptor
). -
The
BusRouter
class no longer fails to generate connected buses for cases with fixed and incremental edges on the same bus. Previously it sometimes generated a disjoint bus even though the bus IDs were equal. -
The
BusRouter
class no longer ignores edges that should be routed when a they are on a bus with fixed edges (seeBusDescriptor#Fixed
property) and when they share both source and target port with a fixed edge. -
The element processing order in the
BendConverter
layout stage is now deterministic. The previous non-deterministic order of inserting and removing elements could lead to non-deterministic behavior for consecutive layout calculations. -
The
ParallelEdgeRouter
class no longer throws an exception if the input has both a large number of parallel edges and a leading edge with ports on the node border. -
The
OrthogonalLayout
class now correctly handles input graphs with parallel edges if thePreferParallelRoutes
property is enabled. Previously, such inputs have caused exceptions in some rare cases. -
The
FamilyTreeLayout
class now properly handles the case that the family tree contains cycles, e.g., due to a family founded by parent and (step-)child. Previously, it sometimes produced a stack overflow or non-orthogonal routes for such an input. -
The
AspectRatioTreeLayout
class no longer crashes, causing a stack overflow, when applied to a large chain graph. -
The
AbstractNodePlacer#placeSubtree
method now clears its internal caches, especially the graph cached in fieldAbstractNodePlacer#graph
. Previously, holding onto a node placer instance could lead to subtle memory leaks. -
The
OrthogonalSegmentDistributionStage
no longer produces degenerated (very large or small) coordinates for edges that contain zero-length segments, that is, duplicate edge path points. -
The
ChannelEdgeRouter
class no longer yields degenerated routing results (very large or small coordinates) when using theOrthogonalPatternEdgeRouter
as path finder strategy and setting its minimum distance to zero. TheOrthogonalPatternEdgeRouter
class now avoids duplicate points when theMinimumDistance
property is set to zero. -
The
RecursiveGroupLayout
class now correctly moves child nodes along with their group also in case theRecursiveGroupLayout#CoreLayout
isnull
. Previously, if additionally a group node had a specific layout algorithm associated to it, the content was not correctly moved along. If the core layout was notnull
, the issue did not occur.
Incompatible Changes
API
-
The
GraphBuilder
,TreeBuilder
, andAdjacentNodesGraphBuilder
in thecom.yworks.yfiles.graph
package have been replaced with incompatible, new implementations in thecom.yworks.yfiles.graph.builder
package. API-compatible adapters to the old API can be found in thebuilder.compatibility
demo. -
The return type of
ContextConfigurator
'screateClip
method has been changed fromRectD
toShape
. The return value of this method is intended to be passed toGraphics2D#clip(Shape)
to constrain the painting area. -
The method
CanvasControl#createInputModeContext
is protected again, after having been made public accidentally previously. -
The
GraphEditorInputMode#requeryHandles
method is now public. -
The optional
IPortLocationModelParameter
andIPortStyle
parameters of theIGraph#addPort
andGraphExtensions#addPort
methods can now benull
. -
The
ModelManager#unInstall
method has been renamed to the canonical nameuninstall
. -
The
NodeReshapeSnapResultProvider#getSnapLines
method now takesCollectSnapResultsEventArgs
as additional parameter. -
Several methods related to snapping now take a
PointD
instead of adouble
asdelta
parameter. In detail, these areSnapResults#createResizeSnapResult
,NodeReshapeSnapResultProvider#addSnaplineSnapResult
,NodeReshapeSnapResultProvider#addGridLineSnapResult
, andNodeReshapeSnapResultProvider#addSameSizeSnapResult
. -
All overloads of
YGraphAdapter#createMapper
now require an additional parameter specifying theClass
of the type argument. This is required for correct fallback values if an item is not explicitly mapped. -
CanvasPrinter#createContextConfigurator
now takes an Iterable ofPointD
instead of aRectD
to suit the new projection feature. -
IGraph
methodsgetBends
,getEdgeLabels
,getNodeLabels
, andgetPortLabels
have been changed to return a "live" view of corresponding objects in the graph. Previously, these methods returned a cached view. This change necessitated changing the return type of these methods fromIListEnumerable
toIEnumerable
. -
The
HierarchicalClustering#Result#DendrogramRoot
property can now returnnull
if the result has been obtained from an empty graph.
Behavior
- The view coordinate system now includes the projection. For customers who do not use a projection, nothing will change. However, when the (old) view coordinate system has been used to render parts of the visualization in a zoom-invariant manner, the equivalent now is called the intermediate coordinate system. The view coordinate system is still necessary when coordinates relative to the control are needed, e.g. for tooltips or a context menu.
-
When using the new projections feature, the
CanvasControl#ContentRect
property no longer has an effect on scrollbars or theGraphControl#fitGraphBounds
method. -
The
CanvasControl
class ignores itsViewportLimiter
when projections are used. -
The
ViewportLimiter
no longer jumps to the limited viewports if the current viewport is outside the limited area. This behavior can be restored by setting theViewportLimiter#LimitingPolicy
property toLimitingPolicy#STRICT
. - Visuals that are rendered in view coordinates relative to the viewport may appear in a different location when exporting an image.
-
The
NavigationInputMode#adjustContentRect
method doesn't fit the graph bounds in the viewport anymore. -
NavigationInputMode#FittingContentAfterGroupActionsEnabled
now isfalse
by default. -
The
NavigationInputMode
class doesn't fit the content after expand and collapse operations anymore. This can be re-enabled by setting theAutoGroupNodeAlignmentPolicy
to a value other thanNONE
andFittingContentAfterGroupActionsEnabled
totrue
. -
The default value of the
MoveViewportInputMode#PinchZoomThreshold
property has been changed from 100 to 50 to prevent pinch gestures from stopping periodically. -
For the
RootPlacements
,SubtreeRoutingPolicies
, andSubtreeAspectRatio
properties of theAspectRatioTreeLayoutData
class, the type of the mapped values has been made nullable. Fornull
or unset values, the settings on theAspectRatioTreeLayout
will now be taken. This is the documented behavior, though. -
GraphMLIOHandler
has been improved to prevent external entity injection attacks by default. To prevent these attacks,GraphMLIOHandler
disallowsDTD
declarations in readXML
documents. -
TemplateLabelStyleRenderer
andTemplatePortStyleRenderer
explicitly set theManaged
property of the created template control to false in theircreateVisual
andupdateVisual
methods. To revert to the previous behavior, overwrite the renderers'configureManaged
method. -
Added serialization property
PARSE_TEMPLATE_STYLES
that controls whether or not template styles are parsed from GraphML files. See chapter Known Vulnerabilities in the yFiles forJavaFX
Developer's Guide for additional information. -
IGraph
methodsgetBends
,getEdgeLabels
,getNodeLabels
, andgetPortLabels
have been changed to return a "live" view of corresponding objects in the graph. Previously, these methods returned a cached view. This change necessitated changing the return type of these methods fromIListEnumerable
toIEnumerable
. -
The following places now throw a
ConcurrentModificationException
instead of anIllegalStateException
:IGraph
: changing graph items while iterating those using theIListEnumerable
returned byIGraph#getNodes
orIGraph#getEdges
.IGraph
: changing the bends, labels, or ports at an edge while iterating those using theIListEnumerable
returned by the respectivegetBends
,getLabels
, orgetPorts
method.IGraph
: changing the labels or ports at a node while iterating those items using theIListEnumerable
returned by the respectivegetLabels
orgetPorts
method.IGraph
: changing nodes while iterating those using theIListEnumerable
returned byIGraph#getChildren
.
-
The
GraphCentrality
andClosenessCentrality
analysis algorithms now calculate the centrality individually per component instead of returning a centrality value of 0.0 for nodes in graphs that are not connected. -
HierarchicLayoutData#EdgeDirectedness
: If theMapper
property is directly accessed (not explicitly set), its default for unset values is now 1.0 instead of 0.0. These means that such edges are now treated as directed instead of undirected. -
The value of the read-only property
EdgeRouter#Partition
is nownull
after applying the routing algorithm. It is only intended to be used during the execution. Previously, it was cached, even though the documentation stated otherwise.
Deprecations
-
The properties
EdgeRouter#PolylineRouting
,EdgeRouter#PreferredPolylineSegmentLength
andEdgeRouter#MaximumPolylineSegmentRatio
are now deprecated. To enable polyline routing, specifyEdgeRoutingStyle#OCTILINEAR
as routing style viaEdgeLayoutDescriptor#RoutingStyle
. The other two properties are also replaced by respective properties on theEdgeLayoutDescriptor
class.
New Demos
-
The
GanttChartDemo
shows how to create a project schedule visualization. -
The
MarqueeClearAreaLayoutDemo
shows how to make space in a diagram by dragging a marquee rectangle. -
The
FillAreaAfterDeletionDemo
shows how to fill free space after deleting nodes using theFillAreaLayout
algorithm. -
The
ZoomInvariantLabelStyleDemo
demonstrates zoom-invariant label rendering. -
EdgeBundlingDemo
: shows how to reduce visual clutter through edge bundling. -
IsometricDrawingDemo
: displays graphs in an isometric fashion to create an impression of a 3-dimensional view.
Demo Improvements
-
The
LayoutStyles
demo has been enhanced to include new layout features:- Exterior edge routing for
CircularLayout
. - Curved edge routing style for
HierarchicLayout
and PolylineEdgeRouter
. - Bus routing for
HierarchicLayout
and PolylineEdgeRouter
. - Integrated Edge Labeling for Polyline
EdgeRouter
.
- Exterior edge routing for
-
Improved support for parsing the
BPMN
Diagram Interchanged format. -
The
BPMN
node styles now support setting colors. -
The
BPMN
demo has been improved to provide more flexibility. Its code now can easier be used in custom projects. -
BpmnDiParser
has been improved to prevent external entity injection attacks by default. To prevent these attacks,BpmnDiParser
disallowsDTD
declarations in readXML
documents.
yFiles for JavaFX 3.3.0.1
Bugfixes
-
IFoldingView#Collapse
and#Expand
now throw anIllegalArgumentException
when called with a node not belonging to the graph (instead of aNullPointerException
). -
FoldingManager#hasFoldingEdgeState
now returnsfalse
for non-dummy edges instead of throwing an exception. -
FilteredGraphWrapper
: Fixed a possibleIllegalArgumentException
("Node not in this graph") which could occur when the parent of a node which is not visible in the filtered graph has been changed in the wrapped graph. -
FoldingManager#getFoldingEdgeState
now throws anIllegalArgumentException
with a meaningful message instead of aNullPointerException
if the state is queried for a master edge (both source and target node are expanded). -
Fixed a bug in
TableLayoutConfigurator
which in rare cases could cause exceptions in additional layout stages. -
ILabelCandidateDescriptor
's#getProfit
now is considered properly by the labeling algorithms. -
FoldingManager
: Invoking#hasFoldingEdgeState
for a master edge (both source and target are expanded) yields now anIllegalArgumentException
with an explaining message text instead of throwing a simpleNullPointerException
. -
Fixed an issue where
NavigationInputMode
's#AutoGroupNodeAlignmentPolicy
would sometimes not work when the expanded and collapsed group node sizes differ. -
The
FilteredGraphWrapper
class now correctly handles port labels of filtered items. -
The
GeneralPath#prepend
method no longer loses a part of the combined path in certain circumstances. -
GraphMLIOHandler
: Fixed an error that prevented parsingnull
values by input handlers added via#createMapperInputHandler
. - Fixed a bug that leads to unexpected zoom behavior using the mouse wheel on Mac.
- Fixed a bug that could cause unwanted behavior when zooming or scrolling with mouse wheel.
Layout
-
Fixed a bug in the
HierarchicLayout
class that could cause unnecessary (double) edge crossings when the algorithm was executed in incremental layout mode with edge grouping and alternative group bounds. -
The
EdgeRouter
class now correctly observes fixed ports for some cases where it previously ignored them due to incorrect path cost calculations. -
The
EdgeRouter
class now considers the correct shape of non-affected, fixed edges. Previously, it sometimes incorrectly parsed their shape which could lead to undesired effects like incorrect path cost calculation of affected edges. -
The
BalloonLayout
class now longer crashes due to a stack overflow for inputs containing very long chain graphs. -
The
HierarchicLayout
class now produces better results for input graphs with grouped edges and aPartitionGrid
. Previously, such inputs may have produced edge routes with superfluous bends. -
The
HierarchicLayout
class now correctly considers the propertiesMaximumNodesAfterBus
andMaximumNodesBeforeBus
of theBusDescriptor
for single line (layer) buses. In addition, for multiple layer buses, the specified minimum node to edge distance is now considered for the distance between nodes and the vertical bus segment. -
The
OrganicLayout
class now correctly removes node overlaps if itsScope
is set to
and itsNodeOverlapsAllowed
property is disabled. Previously, the layout sometimes produced superfluous overlaps for such cases. -
The
TreeMapLayout
class no longer produces results that may have infinite coordinates. -
The
HierarchicLayout
class no longer throws an exception that was previously triggered in some cases with bus structures (see propertyHierarchicLayoutData#Buses
) and in conjunction with undirected edges (seeHierarchicLayoutData#EdgeDirectedness
). -
The constants
EdgeLabelLayoutDpKey
andNodeLabelLayoutDpKey
of theLabelLayoutKeys
class now specify correctly that their generic type parameter isLabelLayoutData
[] and not justLabelLayoutData
.
Input
-
Fixed that
NavigationInputMode
ignores the#shouldSelectItem
and#shouldFocus
predicate methods ofGraphEditorInputMode
andGraphViewerInputMode
.
Incompatible Changes
-
FoldingManager#getFoldingEdgeState
now throws anIllegalArgumentException
instead of aNullPointerException
if the state is queried for a master edge (both source and target node are expanded). -
FoldingManager#hasFoldingEdgeState
now throws anIllegalArgumentException
instead of aNullPointerException
if the state is queried for a master edge (both source and target node are expanded). -
FoldingManager#hasFoldingEdgeState
now returnsfalse
for non-dummy edges instead of throwing an exception.
Demos and Tutorials
The Getting Started
and Custom Styles
tutorial
trails have been moved into the demos
directory to simplify
project setup for yFiles for JavaFX's programming samples in IDEs.
New Demos
-
The
LabelHandlerProviderDemo
shows how to implement custom handles for interactive rotation and resizing of labels. -
The
SplitEdgesDemo
shows how to align edges at group nodes usingRecursiveGroupLayout
together withHierarchicLayout
. -
The
EdgeGroupingDemo
shows the effects of edge and port grouping when arranging graphs withHierachicLayout
. -
The
PartialLayoutDemo
shows how to arrange some elements in a graph while keeping other elements fixed. -
The
CriticalPathsDemo
shows how to emphazise important paths with hierarchic and tree layout algorithms. -
The
CustomLabelModelDemo
shows how to create and use a custom label model. -
The
SmartClickNavigationDemo
shows how to navigate in a large graph, especially when only a part of the graph is visible in the viewport. -
The
ToolTipDemo
shows how to add tooltips to graph items. -
The
GridSnappingDemo
shows how to enable grid snapping during interactive changes. -
The
SnappingDemo
shows how to enable snapping (guide lines) for interactive changes. -
The
LevelOfDetailDemo
shows how to display different levels of detail depending on the current zoom factor. -
The
FamilyTreeDemo
usesFamilyTreeLayout
to arrange genealogical graphs. -
The
TreeLayoutDemo
shows the tree layout style and the different ways in which this algorithm can arrange a node and its children. -
The
ClickableStyleDecoratorDemo
shows how to handle mouse clicks in specific areas of a node's visualization. -
The
BackgroundImageDemo
shows how to add background visualizations to a graph component. -
The
FilteringAndFoldingDemo
shows how to configure filtering and folding in the same application. -
The
FoldingDemo
shows how to enable collapsing and expanding of group nodes. -
The
FilteringDemo
shows how to temporarily remove nodes or edges from the graph with filtering. -
The
GraphCopyDemo
shows how to copy a graph or part of it to another graph. -
The
SankeyDemo
uses theHierarchicLayout
to layout Sankey diagrams. -
The
TreeMapDemo
usesTreeMapLayout
to arrange file system nodes.
yFiles for JavaFX 3.3
Major New Features
- A large number of code examples has been added to the API Documentation.
-
The
HierarchicLayout
class is now able to arrange children of a specific root node in a compact bus-like way. These bus substructures are defined by theHierarchicLayoutData#Buses
property, and the newBusDescriptor
class provides more individual settings for the buses. -
The
EdgeRouter
class now features integrated edge label placement. Labels are automatically placed when the new propertyIntegratedEdgeLabelingEnabled
is enabled. The placement considers the optionalPreferredPlacementDescriptor
of a label. -
The
EdgeRouter
class now supports port grouping of edges at their source and target. To specify the port group IDs, see the associated properties in thePolylineEdgeRouterData
class. -
The
EdgeRouter
class now supports orthogonal bus routing. The newBusDescriptor
class specifies the settings for a single bus. - The powerful analysis algorithms got a new API that is based on the
IGraph
interface and streamlines working with the results. In particular, it makes working with a special analysis graph class obsolete. The algorithms that are available with the new API include centrality measures, clustering, flow calculation, rank assignment, spanning tree, shortest path, and more. This is accompanied by the newGraphStructureAnalyzer
class that provides methods to check structural properties of a given graph.
New Features
Layout
-
The
HierarchicLayout
class is now able to consider individual costs for crossing a group node border. These costs are defined with theHierarchicLayoutData#GroupBorderCrossingCosts
property. -
The
HierarchicLayout
class is now able to consider individual crossing costs for edges. They can be defined with theHierarchicLayoutData#EdgeCrossingCosts
property. -
The new callback method
DefaultLayerSequencer#getCrossingCost
allows for defining an individual crossing cost value for a specific pair of edges when using the said sequencer implementation for theHierarchicLayout
algorithm. -
In order to easily retrieve the original edge instance when customizing the hierarchic layout
algorithm, the
HierarchicLayout#getOriginalEdge
method was added. -
The
HierarchicLayout
class is now able to uniformly distribute ports at group nodes - with a few restrictions. The new propertyHierarchicLayoutData#UniformPortAssignmentGroups
. defines the groups for which the feature should be enabled. -
The
OrganicLayout
class is now able to produce 3D layout results. -
The
OrganicLayout
class is now able to consider user-specified inertia and stress values for nodes. -
The new property
InteractiveOrganicLayout#CompactnessFactor
specifies the compactness of the result. If the graph contains several components, this feature can prevent that the components drift apart. -
The
LeftRightNodePlacer
class now supports layouts with multiple branches. With this feature, subtrees can not only be placed left/right of a single vertical bus, but left/right of multiple vertical buses (the branches). The new propertyBranchCount
allows to configure the number of branches. -
The tree node placer
GridNodePlacer
offers the following new features:- The placement of the bus for routes to its children can now be configured using the new enumeration
BusPlacement
. Available placements areLEADING
,TRAILING
andCENTER
. - Child sub-trees can be assigned to rows automatically using the new property
GridNodePlacer#AutomaticRowAssignmentEnabled
. - The new alignment policy
GridNodePlacer#BUS_ALIGNED
aligns the root node with the bus.
- The placement of the bus for routes to its children can now be configured using the new enumeration
-
The
OrthogonalLayout
class is now able to consider custom crossing and bend costs for edges. They can be specified using the new propertiesOrthogonalLayoutData#EdgeCrossingCosts
andOrthogonalLayoutData#EdgeBendCosts
respectively. -
The new class
GivenCoordinatesStage
changes node locations and edge paths to user-specified values before invoking the core layout algorithm. To specify locations and paths, use the newGivenCoordinatesStageData
class. -
The new
GenericPartitionGridStage
class offers generic support for partition grid structures.
Viewer
-
The
GraphEditorInputMode
class provides the new methodsraiseSelection
,lowerSelection
,selectionToFront
andselectionToBack
that change the z-order of all selectedIModelItems
. -
The
GraphModelManager
class has the new methodsraise
,lower
,toFront
andtoBack
that allow for changing the z-order ofIModelItems
. All these z-order-related methods can also be triggered by the new commandsRAISE
,LOWER
,TO_FRONT
andTO_BACK
. -
CreateEdgeInputMode
can now create edges in reversed direction, i.e. starting from target port.- The new
EdgeDirectionPolicy
supports starting creation at source, target, in the last direction, or depending on the port candidate. - A configurable
ToggleDirectionRecognizer
allows for changing the edge direction during creation.
- The new
-
The method
CreateEdgeInputMode#doStartEdgeCreation
that is used to programmatically start an interactive edge creation gesture now returns aFuture
with the newly created edge as result. -
The method
MoveInputMode#doStartDrag
that is used to programmatically start an interactive drag gesture now returns aFuture
with the affected items as result. -
The new property
MoveLabelInputMode#MovingUnselectedLabelsAllowed
enables moving labels without having to select them first.
New Demos
-
The
GraphAnalysisDemo
shows how to use the new interfaces for the graph analysis algorithms and how to visualize their results. -
The
CssDemo
shows how to customize the visualizations of yFiles for JavaFX with the help of CSS. -
The
LogicGateDemo
shows how yFiles can be used for the visualization of a digital system consisted of logic gates. -
The
Neo4jDemo
shows how to integrate a Neo4j graph data base in your application.
Improvements
Algorithms
-
The new
GraphStructureAnalyzer
class provides methods to check structural properties of a given graph.
Layout
-
Added convenience overloads for
ItemCollection
andItemMapping
property setters toLayoutData
classes with properties of typeItemCollection
orItemMapping
. E.g.hierarchicLayoutData#getEdgeLayoutDescriptors().setConstant(newDescriptor)
can now be abbreviated tohierarchicLayoutData#setEdgeLayoutDescriptors(newDescriptor)
. -
The
HierarchicLayout
class now correctly calculates the group node bounds. Previously, the groups' insets were slightly too large (up to one pixel). -
The
HierarchicLayout
class now always places a port in the middle of a node side, if it is the only port on that side. Previously the port was only centered if the label was additionally placed on the edge. -
The
HierarchicLayout
class now also considers critical edge priorities for grouped edges. -
The
HierarchicLayout
class now requires less memory for graphs with sequence constraints. -
The
HierarchicLayout
class now uses the specified layer alignment (seeNodeLayoutDescriptor#LayerAlignment
) to align sub-components (seeHierarchicLayoutData#SubComponents
). -
The
HierarchicLayout
class no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges. -
With
HierarchicLayout
, the number of edges crossing through group nodes without starting or ending in them when using the default algorithm settings was reduced. Furthermore, the behavior can be customized using the new group node border crossing costs (see propertyHierarchicLayoutData#GroupBorderCrossingCosts
). -
The
HierarchicLayout
class now also considers sequence constraints for grouped edges. -
The layering of
HierarchicLayout
was improved with respect to the resulting edge lengths if the recursive group layering is enabled. -
The
HierarchicLayout
class now produces less overlapping elements for graphs with fixed coordinate hints. -
The new property
OrthogonalLayout#ParallelRoutesPreferenceEnabled
allows for controlling how parallel edges (multi-edges) are routed. -
The
RecursiveGroupLayout
class now allows to define a localPartitionGrid
structure for each recursively handled group node. See the new propertyRecursiveGroupLayoutData#GroupNodePartitionGrids
for details. -
The
EdgeRouter
class now generates less edge-edge overlaps and a better distribution of edge segments when theEdgeRouter#MaximumDuration
is strongly restricted or set to zero, or when the algorithm is stopped via theAbortHandler#stop
method. -
The
EdgeRouter
class now avoids superfluous bends that were in some cases caused by group nodes with (small) inset values. -
The path search performance of the
EdgeRouter
class has been improved for cases where an edge has a strong, externalPortConstraint
or a fixed, externalPortCandidate
. -
The
EdgeRouter
now supports edge grouping on both endpoints. Previously, an edge could only be part of either a source or a target group. -
The
EdgeRouter
class now generates a proper routing from a group node border to a port location inside this group node defined by a strongPortConstraint
or a fixedPortCandidate
. Previously, the route was only calculated to the border and then the last segment was extended without consideration of obstacles and other elements. -
The performance of the
GenericLabeling
algorithm and the quality of the label placements were improved. -
The quality of edge label placement of the
GenericLabeling
class was improved in case that there are multiple labels with a source or target preference near the same node. They may now be placed further away but avoid undesired overlaps. -
The
PortCalculator
class now considers edge label positions such that they are not affected by whether this stage is applied or not. Previously, label positions could be changed if the label position was stored relative to the first/last segment or the port. -
If the master edge is clipped on the bounds of its source or target, the
ParallelEdgeRouter
class now always clips the associated parallel edges on that bounds, too. -
The
RemoveCollinearBendsStage
.Scale
property now also allows zero and negative numbers as its value. This makes it possible to internally round coordinates to full integer values for the comparison of bend points and, thus, the stage can be made more fuzzy. -
The
TreeReductionStage
now marks non-tree edges if anIDataAcceptor
is registered with the input graph with keyTreeReductionStage#NonTreeEdgeSelectionKey
. This way a user is able to query which edges the algorithm determined to be the non-tree edges. -
New options on class
PlaceNodesAtBarycenterStage
allow for specifying the size of affected nodes, considering the grouping structure when calculating the barycenter of nodes as well as removing the bends of edges incident to affected nodes. -
The properties
Rows
andColumns
of classPartitionGrid
are now of typeIEnumerable<RowDescriptor>
andIEnumerable<ColumnDescriptor>
instead of an un-typedYList
. -
The
PartitionGridData
class has new propertiesRowOrderOptimizationEnabled
andColumnOrderOptimizationEnabled
to indicate whether or not the order of the rows respectively columns should be chosen automatically to minimize edge lengths. -
The new
ChannelRoutingTool
class brings back the features of theChannelRouter
class that was removed in version 3.0. -
Combining multiple
LayoutData
classes is now easier:- The base class
LayoutData
offers a new methodcombineWith
that combines the current instance with anotherLayoutData
instance. - The class
CompositeLayoutData
has an additional constructor that takes a variable number ofLayoutData
instances.
- The base class
-
The new properties
AbortHandler
,SourcePortConstraints
,TargetPortConstraints
,SourcePortCandidates
, andTargetPortCandidates
ofChannelEdgeRouterData
facilitate using these features withChannelEdgeRouter
. -
The
RowIndices
andColumnIndices
properties of thePartitionGridData
class can now also be used in combination with theGrid
property. -
The
ImprovingPortAssignment
boolean property ofLayoutExecutor
andLayoutGraphAdapter
was replaced by thePortAdjustmentPolicy
property that offers more options how port locations should be adjusted after a layout calculation.
Viewer
- The parameter of the scroll command, that can be used to specify an additional scroll factor, can now be any numeric value of type Number.
-
CanvasControl
: AddedzoomToAnimated
overloads which take an optional event listener that is notified of the animation's end. -
IMapperRegistry#createDelegateMapper
has been renamed tocreateFunctionMapper
. -
The property
ItemMapping#Delegate
has been renamed to Function. -
The property
ContextItemMapping#ContextDelegate
has been renamed toContextBiFunction
. -
The property
ItemCollection#Delegate
has been renamed to Predicate. -
The default methods
toList
andtoArray
have been added toIEnumerable
. -
HandleInputMode
now clears theAffectedItems
after theCanceled
event has been raised instead of before. -
DefaultEdgePathCropper
's methodscropEdgePath
andcropEdgePathAtArrow
are no longer final. -
The viewport animation of the
LayoutExecutor
class considers now the value of theLimitingFitContentZoomEnabled
property of the correspondingGraphControl
. -
NodeStylePortStyleAdapter
andTemplatePortStyle
now have anOffset
property that allows to shift the port visualization so that it no longer is centered over the port. -
The
GraphModelManager
class has new factory methods for creating theItemModelManager
of each item group. -
The
GraphModelManager#getModelItem
method now always returns theIModelItem
for anICanvasObject
retrieved for it viagetMainCanvasObject
. Previously this only worked in all cases for theICanvasObject
retrieved viagetCanvasObject
. - Mouse move and drag events now correctly report the changed modifier keys.
- Reduced number of cases where a new label was created by interactive editing instead of editing an existing one.
-
The methods
addLabel
,createLabel
andeditLabel
ofGraphEditorInputMode
andTableEditorInputMode
that are used to start the respective interactive label editing gesture programmatically return now aFuture
with the edited or newly created label as result. -
GraphEditorInputMode
provides new protected methodscreateLabelCore
andeditLabelCore
to allow for overriding the default implementations. -
GraphEditorInputMode
provides aTextEditorInputModeConfigurator
to allow for configuring theTextEditorInputMode
before each label editing. -
The
GraphEditorInputMode#DeletedItem
event provides now context information about the state before the item has been deleted. For example, if a label has been deleted you now can get its old owner. -
The method
GraphEditorInputMode#onDeletedItem
is no longer final. -
Added the
GraphClipboard#getId
method to facilitate retrieving the original item from which an item to be pasted has been copied from. -
The new property
GraphClipboard#ClipboardContext
provides access to the currentIGraphClipboardContext
during a clipboard operation. -
The new property
CreateEdgeInputMode#ShowingTargetHighlightEnabled
specifies whether to enable or disable highlighting of potential targets for edge creation. Also, the methodupdateTargetHighlight
has been added to allow for further customization of the highlight. -
NavigationInputMode
: Added a propertyScrollingToSelectionEnabled
that controls whether a node that is focused or selected with a keyboard gesture is automatically scrolled into the viewport if necessary. -
The new properties
PortRelocationHandle#ShowingTargetHighlightEnabled
andPortRelocationHandleProvider#ShowingTargetHighlightEnabled
specify whether to enable or disable highlighting of potential targets for edge creation. Also, the methodupdateHighlight
has been added to thePortRelocationHandle
class to allow for further customization of the highlight. -
The new properties
PortRelocationHandle#ShowingPortCandidatesEnabled
andPortRelocationHandleProvider#ShowingPortCandidatesEnabled
specify whether to enable or disable showing port candidates during edge relocation. -
The new
PortStyleDecorationInstaller
class allows the use of anIPortStyle
to render the selection, highlight, or focus indicator of ports. -
The properties
RectangleIndicatorInstaller#Template
andOrientedRectangleIndicatorInstaller#Template
now return always the value that has been set by client code and are not modified by internal code anymore. - Snaplines are now infinitely long by default.
-
The performance of
EdgePathLabelModel#getGeometry
andEdgeSegmentLabelModel#getGeometry
has been strongly increased. -
The
GraphMLIOHandler
class now supports reading and writing arbitrary objects at graph level. -
GraphML deserialization now supports the symbolic names "Zero" and "Infinite" for reading
SizeD
values. -
GraphML deserialization now supports the symbolic name "Infinite" for reading
RectD
values. -
GraphML deserialization now supports the symbolic name "Origin" for reading
PointD
values. -
The type of property
GraphBuilder#EdgeLabelProvider
was generalized fromFunction<TEdge,String>
toFunction<TEdge,Object>
.
Bugfixes
Algorithms
-
The
Paths#findAllChains
method now correctly calculates the chains of input graphs with cycles. -
The
GraphChecker#isMultipleEdgeFree
method now returns the correct result for input graphs with self-loops. -
The
Bfs#getLayers
method now correctly stores the layer indices in the specifiedINodeMap
. Previously, the maximum layer index stored in the map exceeded the number of returned layers.
Layout
-
The
EdgeRouter
class no longer produces bad, non-orthogonal edge segments in cases where a selected edge is grouped together with an un-selected edge and where both edges have strongPortConstraints
at their common source/target node. -
The
PortPlacementStage
class no longer destroys the grouping information for the core layout algorithm. -
The
EdgeRouter
class now correctly considers strong port constraints of edges that belong to a bus structure. -
The
HierarchicLayout
class no longer throws an exception if the component arrangement policy is set toComponentArrangementPolicy#COMPACT
and bus routing is enabled (see propertyHierarchicLayoutData#Buses
). -
The
OrganicLayout
class now correctly considers input graphs where substructure handling is enabled and all nodes are located at coordinate(0,0)
. Previously, such inputs may have triggered anArgumentException
. -
Class
EdgeRouter
no longer throws an exception if all fixed edges of a bus are non orthogonal/octilinear. -
The
GenericLabeling
class no longer throws anArgumentException
for some input graphs containing labeled edges with zero length. -
The
HierarchicLayout
class no longer throws an exception if it is wrapped by an instance ofRecursiveGroupLayout
and the input graph contains layering constraints between elements of different groups. -
The
HierarchicLayout
class now correctly considers the group insets for input graphs with nested group nodes. Previously, it sometimes produced too large insets for inner groups. -
The
HierarchicLayout
class no longer throws anIllegalArgumentException
for some rare cases in incremental layout mode. -
The
HierarchicLayout
class now produces shorter, more direct edge routes for edges connecting at a group node and leaving on the the left/right group side. This only affects cases where the relevant group node also contains direct-content edges (seeEdgeLayoutDescriptor#DirectGroupContentEdgeRoutingEnabled
). -
Self-loop segments generated by the
HierarchicLayout
class 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. -
The
HierarchicLayout
class now produces less superfluous crossings if there are same-layer edges withPortConstraints
orPortCandidates
. -
The
HierarchicLayout
class now correctly handles port labels with zero height/width. Previously, such labels may have caused very large distances between some nodes. -
The
HierarchicLayout
class sometimes threw anIllegalArgumentException
for input graphs that contained incremental elements in combination with groups. -
The
HierarchicLayout
class sometimes threw anIllegalArgumentException
for input graphs that contained fixed elements in combination with both swimlanes and groups. -
The
HierarchicLayout
class 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. -
The
HierarchicLayout
class no longer causes non-orthogonal segments when the input contained port labels in conjunction with edge grouping. -
The
HierarchicLayout
class now correctly considers fixed nodes with layering constraints. In previous versions there were some rare cases where such inputs caused infinite looping issues. -
The
HierarchicLayout
class no longer produces intersections between edges and elements of a sub-component (seeHierarchicLayoutData#SubComponents
). Note that this fix may sometimes cause less compact results within a layer. -
Improved the path search performance of the
EdgeRouter
class for cases where a large number of fixed and overlapping edge segments exist. Previously, the search could become very slow in such scenarios. -
The
EdgeRouter
class now correctly groups edges associated with equal group IDs that have a different object ID. -
The
EdgeRouter
class now avoids unnecessary bends in cases that containPortCandidates
with fixed offsets (or strongPortConstraints
) where the fixed port locations have a very similar x- or y-coordinate such that the path must consist of three segments with a single, very short middle segment. Previously, five segments in total were generated. -
A rare exception that was triggered by the
EdgeRouter
class during routing when aGrid
is defined on which edges need to be routed is now fixed. -
The
EdgeRouter
class now correctly handles edges with external ports. Previously, such inputs may have caused an exception. -
The
EdgeRouter
class now correctly routes direct content edges with strong port constraints at the group nodes. Previously, the algorithm sometimes produced weird routes for such edges. -
Fixed a bug in the
EdgeRouter
class that sometimes caused a non-deterministic behavior. -
Fixed two issues in the
EdgeRouter
class that resulted in the violation of aPortCandidate
with fixed offsets or a strongPortConstraint
. 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). -
The
EdgeRouter
class no longer throws an exception if itsPolylineRoutingEnabled
property is enabled and the input contains fixed, grouped edges. -
The
EdgeRouter
class now considers the correctNodeHalo
associated 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. -
The
EdgeRouter
class now correctly considers intersections between edges and labels of fixed edges if propertyEdgeLabelConsiderationEnabled
is enabled. -
The
EdgeRouter
class no longer throws an exception during routing in cases where the source or target node is covered by obstacles (i.e. by other nodes or labels). -
The
EdgeRouter
class 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. -
The
EdgeRouter
class no longer throws an exception during the routing of some graphs with grouped edges. -
The
EdgeRouter
class no longer considers allPortCandidates
with multiple directions as fixedPortCandidates
. -
The
EdgeRouter
class now correctly handles cases where the maximum duration is exceeded and where previously an exception was triggered. -
Fixed a
StackOverflowError
inEdgeRouter
. -
The
OrganicLayout
class no longer throws an exception when usingCycleSubstructureStyle#CIRCULAR
and arranging a cycle structure where at least one cycle node is also connected to a group node outside the cycle. -
The
OrganicLayout
class now produces deterministic results for group nodes if its propertyDeterministicModeEnabled
is enabled. -
The
OrthogonalLayout
class no longer causes an exception for some input graphs when propertyFaceMaximizationEnabled
is enabled. -
The
OrthogonalLayout
class no longer runs into an infinite loop for some input graphs that are tree structures with mixed edge directedness (see propertyOrthogonalLayout#EdgeDirectednessDpKey
). Note that the problem only occurred if propertyOrthogonalLayout#TreeStyle
is not set toTreeLayoutStyle#NONE
. -
The
OrthogonalLayout
class no longer throws an exception when its propertyUniformPortAssignmentEnabled
is enabled and the input contains parallel edges. -
When using
RecursiveGroupLayout
, the values of the propertiesComputedWidth
,ComputedHeight
andComputedPosition
of the classesColumnDescriptor
andRowDescriptor
are now correctly set after the layout ifEdgeRouter
is the correspondingInterEdgeRouter
. -
The
CompactNodePlacer
class no longer throws an exception for input graphs with specified memento strategies (seeTreeLayoutData#CompactNodePlacerStrategyMementos
orCompactNodePlacer#STRATEGY_MEMENTO_DPKEY
). -
The
CompactNodePlacer
class now correctly considers the specified values of theVerticalDistance
andHorizontalDistance
properties. -
The
CompactNodePlacer
class no longer throws an exception for some inputs with specified strategy memento information (either via propertyTreeLayoutData#CompactNodePlacerStrategyMementos
or with a mapper registered with keyCompactNodePlacer#STRATEGY_MEMENTO_DPKEY
). -
The
SimpleNodePlacer
class no longer produces very long horizontal edge segments for inputs where it isn't required. -
The
GenericLabeling
class now correctly places labels of direct content edges (edges that directly connect a group node with a descendant, without leaving the group) with a free edge label model. -
The
GenericLabeling
class no longer calculates wrong label profit values (AbstractLabeling#getProfit
) for some edge labels. Previously, edges that had aPreferredPlacementDescriptor
were sometimes affected. -
The
GenericLabeling
class now produces valid results for edge labels that have a preferred distance to the edge (PreferredPlacementDescriptor#DistanceToEdge
) and at the same time multipleSideOfEdge
preferences (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. -
The
GenericLabeling
class now always prefersLabelCandidates
with higher profit values over others with lower profit (seeAbstractLabeling#getProfit
). Previously, this sometimes happened even though both candidates did not intersect with other elements. -
The
GenericLabeling
class does no longer assume that allLabelCandidates
associated to a label have the same size. Previously, this caused unexpected labeling results if custom candidates with different sizes were given. -
Fixed a rare bug in the
GenericLabeling
that may have caused anIllegalArgumentException
for some input graphs that contain edges with zero length segments and labels associated with a free edge label model. -
The
SeriesParallelLayout
class now correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception. -
The
PartialLayout
class now correctly considers the specifiedPortCandidates
during orthogonal or octilinear routing of edges. -
The
PartialLayout
class does no longer reduce the size of fixed group nodes if the optionPartialLayout#ResizeFixedGroups
is disabled. -
The
ComponentLayout
class now correctly handles input graphs with user-specified components that contain nodes withnull
as their component ID (see propertyComponentLayoutData#ComponentIds
). Previously, such inputs may have caused an exception. -
The
PolylineLayoutStage
does no longer generate overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes). -
The
OrganicRemoveOverlapsStage
no longer produces infinite loops in some rare cases. -
Fixed a bug in
YGraphAdapter
that could trigger aNullPointerException
when boolean, integer or double values were requested from registeredIMapper
but no value had been set beforehand.
Viewer
-
Fixed a bug in
GraphEditorInputMode
where changing the value ofShowHandleItems
while handles were already displayed resulted in duplicate handles. -
Fixed a bug in
EdgePathLabelModel
which could return an invalid geometry for parameters with a ratio < 0 and zero length edge segments. -
A bug in
CanvasComponent#fitContent
has been fixed that sometimes resulted in a short flickering. -
Mapper: Fixed default value handling for the
null
key. -
Mapper: Ensured that mappings for the
null
key are taking into account by methodgetEntries
. -
GeneralPath#flatten()
: Fixed unexpected behavior if a curve follows after a close operation. - Zooming the viewport during interaction no longer synthesizes mouse-move events in the wrong locations.
-
Labels at folder nodes and their adjacent edges are no longer lost during GraphML deserialization
if the
DefaultFolderNodeConverter#CopyFirstLabel
property is enabled. -
Fixed a bug in
PortRelocationHandleProvider
where the settingsShowPortCandidates
andShowTargetHighlight
were ignored. -
Fixed a bug in
CreateEdgeInputMode#getPortOwner
which could return edges even ifEdgeToEdgeConnectionsAllowed
was set to false. This could result in the edge'sIPortCandidateProvider
being queried for candidates erroneously. - Fixed a bug in the graph implementation that sometimes lead to a runtime that was quadratic in the number of nodes when creating large graphs.
- Reparenting an expanded group node into a collapsed group node no longer throws an exception.
-
Fixed an exception which could occur in
CanvasControl
's methodcompareRenderOrder
and when usingGraphModelManager
'sComparator
property. -
GraphClipboard
's methodsonElementCut
andonElementCopied
are no longer called for graph items which are not copied themselves but are owners of copied items. -
When an edge is duplicated using
GraphClipboard
and a port is newly created during this operation, the new port now gets the old port's style and tag. -
Fixed a memory leak in the
UndoEngine
class if the tokens returned bygetToken
were not disposed when theUndoEngine
got cleared. -
The
CreateEdgeInputMode
class now considers the value of theCanvasControl#HitTestRadius
property when itsStartingOverCandidateOnlyEnabled
property is enabled. -
The visualization of source port candidates by the
CreateEdgeInputMode
class does not flicker, anymore. -
With
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. -
The
null
check for theGridVisualCreator#Pen
property works correctly now. -
The type
IGridConstraintProvider
cannot be used in lookup methods since it has a generic type parameter. Therefore, new specific interfaces have been added for each item type (for exampleINodeGridConstraintProvider
). -
The
EdgeStyleDecorationInstaller
class no longer causes an exception when used on edges that are attached to other edges. - Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an exception.
- In rare cases, saving a graph with folding to GraphML threw an exception.
Incompatible Changes
Layout
-
The
ImprovingPortAssignment
boolean property ofLayoutExecutor
andLayoutGraphAdapter
has been replaced by thePortAdjustmentPolicy
property. -
SingleItemCollection
'sItem
property has been pulled up toItemCollection
. ClassSingleItemCollection
has been removed, its usages have been replaced byItemCollection
. -
The property
HierarchicLayoutData#AlternativeEdgePath
has been renamed toHierarchicLayoutData#AlternativeEdgePaths
. -
The property
HierarchicLayoutData#AlternativeEdgePaths
now expectsIterable<IPoint>
instead ofYPointPath
as mapped values. -
The property
HierarchicLayoutData#AlternativeGroupBounds
now expectsIRectangle
instead ofYRectangle
as mapped values. -
The type of the properties
BalloonLayoutData#TreeRoot
andTreeLayoutData#TreeRoot
has been changed toSingleItem<INode>
. -
The property
TreeLayoutData#LeftRightPlacersLeftNodes
has been renamed toTreeLayoutData#LeftRightNodePlacerLeftNodes
. -
The property
TreeLayoutData#DelegatingNodePlacersPrimaryNodes
has been renamed toTreeLayoutData#DelegatingNodePlacerPrimaryNodes
. -
The properties
SourceGroups
andTargetGroups
ofRadialLayoutData
have been removed since edge grouping is not supported by theRadialLayout
class. -
The properties
Rows
andColumns
of classPartitionGrid
are now of typeIEnumerable<RowDescriptor>
andIEnumerable<ColumnDescriptor>
instead of an un-typedYList
. -
The
PenaltySettings#InvalidEdgeGroupingPenalty
property has been removed. If edge groups are defined, theEdgeRouter
class now always considers them. Therefore, this setting no longer applies. -
The following changes regarding the expert API related to the
EdgeRouter
class were made:- The first parameter of the constructors in class
AbstractSegmentInfo
is now of typeObject
instead ofEdge
. The provided type should be eitherPathRequest
for affected edges orEdge
for non-affected, fixed ones. Furthermore, the propertyAbstractSegmentInfo#Edge
has been removed as the info is not necessarily associated with an edge anymore. - Simialrly, the first parameter of the constructor in class
EdgeCellInfo
is now of typeObject
instead ofEdge
. The provided type should be eitherPathRequest
for affected edges orEdge
for non-affected, fixed ones. - The constructor of class
EdgeInfo
now additionally takes a parameter of typeEdge
. - The parameter of type
Edge
from the constructor ofPath
as well as the respective property were removed. A path is now not necessarily associated with an edge but only with the newly introducedPathRequest
. - The method
PathSearchResult#getEdgeInfo(Path)
was removed.
- The first parameter of the constructors in class
Viewer
-
IMapperRegistry#createDelegateMapper
has been renamed tocreateFunctionMapper
. -
The property
ItemMapping#Delegate
has been renamed toFunction
. -
The property
ContextItemMapping#ContextDelegate
has been renamed toContextBiFunction
. -
The property
ItemCollection#Delegate
has been renamed toPredicate
. -
GraphClipboard
's methodsonElementCut
andonElementCopied
are no longer called for graph items which are not copied themselves but are owners of copied items. As a consequence, the methodscut
andcopy
of theIClipboardHelper
implementations of these elements are no longer called, either. -
The classes
GeneralPath
andGeneralPath.PathCursor
are now final.
Changes of Default Behavior
Layout
-
Renamed property
PartialLayout#ResizeFixedGroups
toFixedGroupResizingEnabled
. -
The
HierarchicLayout
class now uses a higher crossing cost for group node borders. To specify custom values, use the propertyHierarchicLayoutData#GroupBorderCrossingCosts
. -
The
GroupingSupport
class no longer throws anIllegalArgumentException
if there is a node without associated ID (seeGroupingKeys#NODE_ID_DPKEY
). Instead the class uses the node itself as ID. -
The
SimplexNodePlacer#BarycenterMode
property is now enabled by default. Thus, theHierarchicLayout
class with default settings now produces different (usually more symmetric) layouts. -
The default value of the property
GridNodePlacer#RootAlignment
was changed toGridNodePlacer#BUS_ALIGNED
fromAbstractRotatableNodePlacer#RootAlignment#TRAILING
. -
If the master edge is clipped on the bounds of its source or target, the
ParallelEdgeRouter
class now always clips the associated parallel edges on that bounds, too.
Viewer
-
The following places now throw a
ConcurrentModificationException
instead of anIllegalStateException
:-
FilteredGraphWrapper
: Changing graph items while iterating those using theIListEnumerable
returned byFilteredGraphWrapper#getNodes
,FilteredGraphWrapper#getEdges
,FilteredGraphWrapper#getLabels
orFilteredGraphWrapper#getPorts
. -
FilteredGraphWrapper
: Changing the edges at a port or node while iterating those edges using theIListEnumerable
returned byedgesAt
. -
GeneralPath
: Changing the path's structure while iterating the path using aPathCursor
returned byGeneralPath#createCursor
.
-
-
The default tooltip in the class
ToolTipQueryEventArgs
is now set tonull
. Thus, the tooltip is not displayed when the event is handled without setting the tooltip content. -
The properties
RectangleIndicatorInstaller#Template
andOrientedRectangleIndicatorInstaller#Template
now return always the value that has been set by client code and are not modified by internal code anymore.
yFiles for JavaFX 3.2.0.2
Bugfixes
Viewer
- With
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. - Fixed an exception which could occur in
CanvasControl
's method#compareRenderOrder
and when usingGraphModelManager
's#Comparator
property. - Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an exception.
- In rare cases, saving a graph with folding to GraphML threw an exception.
- The
NodeAlignmentPolicy
valuesCENTER_LEFT
,CENTER_RIGHT
,TOP_CENTER
,BOTTOM_CENTER
, andBOTTOM_LEFT
now work correctly. - Reparenting an expanded group node into a collapsed group node no longer throws an exception.
Layout
- Fixed a potential exception in
LayoutExecutor
which could occur when a layout is applied to a graph which contains table nodes which are not group nodes.
yFiles for JavaFX 3.2.0.1
Improvements
Layout
- Slightly improved the performance of the
GenericLabeling
algorithm and improved the quality of the label placements for some cases.
Bugfixes
View
- Fixed a bug in the
UndoEngine
that could lead to memory leaks if the tokens returned bygetToken
were not disposed when theUndoEngine
got cleared. - Fixed a bug that rendered labels or ports neither in a separate layer nor at their owner when
exactly one of
LabelLayerPolicy#AT_OWNER
orPortLayerPolicy#AT_OWNER
was used. CollapsibleNodeStyleDecorator
:IsHit
respects buttons outside the node bounds.- Fixed null check for
GridVisualCreator#Pen
property. - Fixed an issue where
EdgeStyleDecorationInstaller
would cause an exception when used on edges that connect to other edges. - Fixed a bug, which might occur in very rare cases in the undo/redo processing of several consecutive reparent actions.
- Fixed a bug in the graph implementation that sometimes led to a runtime that was quadratic in the number of nodes when creating large graphs.
CreateEdgeInputMode
: Fixed a bug that caused the visualization of source port candidates to flicker.- The
EdgeStyleDecorationsInstaller
class now properly displays decorations for edges between group nodes and their descendants when displayed in view coordinates.
Algorithms
- Method
Paths#findAllChains
now correctly calculates the chains of input graphs with cycles.
Layout
- Fixed a bug in class
EdgeRouter
that sometimes caused a non-deterministic behavior. - The
PolylineLayoutStage
does no longer generate overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes). - Fixed a rare exception that was triggered by the
EdgeRouter
class during routing in cases where the input contained grouped edges. - The
GenericLabeling
class now produces better results for edge labels that have a preferred distance to the edge (PreferredPlacementDescriptor#DistanceToEdge
) and at the same time multipleSideOfEdge
preferences (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. - Fixed two issues that induced the violation of a
PortCandidate
with fixed offsets (or a strongPortConstraint
) by theEdgeRouter
class. 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). - The
EdgeRouter
class no longer throws an exception for inputs (rare) containing fixed, grouped edges and whenEdgeRouter#PolylineRoutingEnabled
is enabled. - The
EdgeRouter
now considers the correctNodeHalo
associated 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. - Class
EdgeRouter
now correctly considers intersections between edges and labels of fixed edges if propertyEdgeLabelConsiderationEnabled
is enabled. - Fixed a very rare exception that was triggered by the
EdgeRouter
class during routing in cases where the source/target node is covered by obstacles (i.e. other nodes, labels). - The
EdgeRouter
class 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. - Class
PartialLayout
now correctly considers the specifiedPortCandidates
during the orthogonal/octilinear routing of edges. - Class
EdgeRouter
no longer considers allPortCandidates
with multiple directions as fixedPortCandidates
. - The
OrthogonalLayout
class no longer throws an exception when propertyOrthogonalLayout#UniformPortAssignmentEnabled
is enabled and the input contains parallel edges. - The
CompactNodePlacer
class now correctly considers the specified values of theVerticalDistance
andHorizontalDistance
properties. - Class
OrganicRemoveOverlapsStage
no longer produces infinite loops for some rare cases. - The
CompactNodePlacer
class no longer throws an exception for some inputs with specified strategy memento information (either via propertyTreeLayoutData#CompactNodePlacerStrategyMementos
or with a mapper registered with keyCompactNodePlacer#STRATEGY_MEMENTO_DPKEY
). - Self-loop segments generated by the
HierarchicLayout
class 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. - When using
RecursiveGroupLayout
, the values of the propertiesComputedWidth
,ComputedHeight
andComputedPosition
of the classesColumnDescriptor
andRowDescriptor
are now correctly set after the layout ifEdgeRouter
is the correspondingInterEdgeRouter
. - The
HierarchicLayout
class now produces less superfluous crossings if there are same-layer edges withPortConstraints
orPortCandidates
. - Improved the path search performance of the
EdgeRouter
class for cases where a large number of fixed and overlapping edge segments exist. Previously, the search could become very slow in such scenarios. - The
HierarchicLayout
class now correctly handles port labels with zero height/width. Previously, such labels may have caused very large distances between some nodes. - The
HierarchicLayout
class sometimes threw anArgumentException
for input graphs that contained incremental elements in combination with groups. - The
HierarchicLayout
class now prevents intersections between labels and the horizontal grid lines of aPartitionGrid
. - The
EdgeRouter
class no longer throws an exception for some inputs containing edges with intermediate routing points. - The
HierarchicLayout
class 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. - Class
SeriesParallelLayout
now correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception. - Fixed a bug in the
HierarchicLayout
that could cause non-orthogonal segments when the input contained port labels in conjunction with edge grouping. - The
OrganicLayout
class now produces deterministic results for group nodes (if propertyDeterministicModeEnabled
is enabled). - Fixed a
StackOverflowError
inEdgeRouter
.
yFiles for JavaFX 3.2
Major New Features
- The new
LabelDropInputMode
andPortDropInputMode
classes implement drag and drop for labels and ports, respectively. The API of these classes is similar toNodeDropInputMode
for nodes. - Labels can now be added to ports and the new label models
FreePortLabelModel
andInsideOutsideLabelModel
can be used to place such labels. On the technical side,IPort
now extends theILabelOwner
interface and the enum constantGraphItemTypes#PORT_LABEL
was added. - The new
LassoSelectionInputMode
selects all model items inside a hand-drawn lasso region. This mode allows combinations of free-hand and straight-line sections during path creation. The following types and methods were added to support this mode.- Added the
GraphEditorInputMode#LassoSelectionInputMode
andGraphViewerInputMode#LassoSelectionInputMode
properties and a corresponding factory method.LassoSelectionInputMode
is disabled per default. - The new
GraphEditorInputMode#lassoSelect
andGraphViewerInputMode#lassoSelect
methods programmatically selects all items in the providedGeneralPath
. - The new
ILassoTestable
interface specifies whether the item is considered to be inside the lasso path. This is analog to theIMarqueeTestable
interface for marquee selection. - Any model item can be decorated with an instance of
ILassoTestable
or provide one in its lookup. For this, theNode
/Edge
/Port
/Label
/BendDecorator
classes got the newLassoTestableDecorator
property for decorating an item with a customILassoTestable
. - The new
#isInPath
method ofAbstractNode
/Edge
/Port
/LabelStyle
can be overridden to customize the lasso testing behavior. - The visualization of the lasso selection can be customized using CSS.
- Added the
- Labels and ports can now optionally be rendered directly in front of their owner. Such a rendering
order can make the ownership of labels and ports more clear if nodes overlap. Previously, all label and ports were
rendered in front of all nodes. The new rendering order can be enabled by setting the new properties
LabelLayerPolicy
andPortLayerPolicy
ofGraphModelManager
toLabelLayerPolicy#AT_OWNER
andPortLayerPolicy#AT_OWNER
.
New Features
- The new
GraphBuilder
,TreeBuilder
, andAdjacentNodesGraphBuilder
classes can be used to build a graph from custom data. - The nesting options of
GraphModelManager
for the visualizations of nodes and edges have been improved and clearified.- The properties
HierarchicNodeNestingEnabled
andHierarchicEdgeNestingEnabled
are superseded by the newHierarchicNestingPolicy
property. This property has the enum typeHierarchicNestingPolicy
. - The new option
HierarchicNestingPolicy#GROUP_NODES
configuresGraphModelManager
to visualize all leaf nodes in one canvas object group while nesting all group nodes depending on their hierarchical depth.
- The properties
- The mouse wheel behavior of the overview can now be switched between
ZOOM
,SCROLL
, andNONE
, and optionally, the action can be performed only when the control is focused. This can be configured with the newOverviewInputMode#MouseWheelBehavior
property. TableEditorInputMode
: Double clicking a stripe or stripe label now edits the label in the same way as for other graph items.-
RectD
andInsetsD
: Added methods toreduce
the size of anRectD
andInsetsD
instance, respectively. - The new static methods
IPositionHandler#combine
combine multiple position handler instances into a single instance. - Added the events
ElementsCopied
,ElementsCut
, andElementsPasted
toGraphEditorInputMode
, and the eventElementsCopied
toGraphViewerInputMode
. - The new static
IAnimation#createSequentialAnimation
method creates an animation that animates multiple animations in sequence. - The rectangle of the marquee selection can now be customized with the new protected method
MarqueeSelectionInputModes#calculateMarqueeRectangle
. - Added new decorator implementations for table items. You can access these new decorators via
the new method
ITable#getDecorator
with theRowDecorator
,ColumnDecorator
andStripeLabelDecorator
properties. - If the new
CanvasControl#QuantizingInputCoordinatesEnabled
property is enabled, world coordinates of mouse and touch events are rounded to nicer values to avoid unnecessary precision. For example, you'll get the value 326.375 instead of 326.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.
Layout
-
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 propertyMaximumDuration
, which enables to control the preferred time limit of the layout algorithms. -
OrthogonalLayout
: Added propertyUniformPortAssignmentEnabled
that allows to obtain results with a more uniform port assignment. -
Added convenience layout stage
TemporaryGroupNodesInsertionStage
that automatically generates a (non-nested) grouping structure from a given mapping of nodes to a component Id. This temporary grouping is meant for use during the run of the core layout algorithm of the stage. It allows, for example, easy use ofRecursiveGroupLayout
without the need for a real grouping structure when the requirement is that different sub-graphs need to be arranged with different layout algorithms. - Added the
TemporaryGroupNodeInsertionData
configuration class for the newTemporaryGroupNodeInsertionStage
layout stage. -
TreeLayout
: Added node placerCompactNodePlacer
that produces more compact tree layouts. It uses a dynamic optimization approach that chooses a placement strategy of the children such that the overall result is compact with respect to a specified aspect ratio, see propertyCompactNodePlacer#PreferredAspectRatio
. - The new
TreeLayoutData#CompactNodePlacerStrategyMementos
property can be used to to maintain similar layout styles over subsequent runs of compact tree layout. -
Added the new layout algorithm
TabularLayout
that 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. - Added the
TabularLayoutData
configuration class for the newTabularLayout
algorithm. -
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 propertiesOrthogonalLayout#TreeStyle
,OrthogonalLayout#ChainStyle
andOrthogonalLayout#CycleStyle
. In addition to the style, the new feature offers more settings, like, for example, the desired tree layout orientation (seeOrthogonalLayout#TreeOrientation
). The orthogonal layout styleLayoutStyle#NORMAL_TREE
has been removed as the new tree style feature allows more settings for the arrangement of tree-like graphs. -
Added the new layout algorithm
TreeMapLayout
that generates tree maps. Tree maps present hierarchical data using nested rectangles (nodes) where each rectangle (node) gets its size depending on a specific dimension of data associated to it. - Added the
TreeMapLayoutData
configuration class for the newTreeMapLayout
algorithm. -
Polyline.EdgeRouter
now supports routing through user-specified intermediate points. All specified points will lie on the edge route in the given order. See new propertyEdgeLayoutDescriptor#IntermediateRoutingPoints
. -
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 propertyEdgeLayoutDescriptor#DirectGroupContentEdgeRoutingEnabled
. -
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 keyHierarchicLayout.SUB_COMPONENT_ID_DPKEY
or with the newHierarchicLayoutData#SubComponents
property . -
ShortestPaths
: Added a-star (A*) algorithm for finding the shortest path between two nodes in a directed or undirected, arbitrary graph.
Improvements
Graph Model
- All methods that set a node layout or a bend location are now fail-fast if the provided layout or
location contains a
NaN
value. Previously, this resulted not in an immediate error but broke subsequent code like an automatic layout or a content rectangle calculation. - The performance of
FilteredGraphWrapper
has 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 usingFilteredGraphWrapper
. - For
ITable
's default methodsfindRow
,findColumn
,findStripe
andfindStripes
, overloads without thePredicate
parameter have been added. -
DefaultGraph
has new factory methods to customize undo unit creation. -
DefaultGraph
now fills the undo engine and triggers events in a consistent manner for all graph element factory methods. - Many label model
createParameter
methods now have overloads without those parameters that are not needed every time. InteriorStretchLabelModel
: Added new parametersCENTER_HORIZONTAL
andCENTER_VERTICAL
for horizontal or vertical centered one-line labels.- The factory method
IMapper#fromMap
has been added which returns an implementation ofIMapper
that delegates to ajava.util.Map
. IMapperRegistry
: The value type parameter was removed from all default methods takingNodeDpKey
,EdgeDpKey
orILabelLayoutDpKey
.
View
- The new method
GraphModelManager#getMainCanvasObject
returns the canvas object that should be used when changing the visibility or z-order of a model item. - Assigning a new graph instance to
GraphOverviewControl
now keeps configuration changes made to the overview'sGraphVisualCreator
instance. - Selfloop edges are now properly displayed in the
GraphOverviewControl
. - Animations after a layout don't break anymore if the graph is modified concurrently.
- Added the new
CanvasControl#LimitingFitContentZoomEnabled
property which controls whether the maximum zoom level for theCanvasControl#fitContent
method as well as theFitContent
command is restricted to1
or the value of theMaximumZoom
property. - Akin to the two
CanvasControl#zoomTo
methods, there are now twoCanvasControl#zoomToAnimated
methods that animate the viewport change. ICanvasObjectGroup#addChild
: A default method without theICanvasObjectDescriptor
parameter was added as overload which uses theICanvasObjectDescriptor#ALWAYS_DIRTY_INSTANCE
.-
GraphModelManager
now avoids unnecessary re-installation of items if they keep theirICanvasObjectGroup
. By these re-installations the z-order of the item in its group was lost and a new visual was created. - The factory method
IAnimation#createLayoutAnimation
has been added which delegates toLayoutUtilities#createLayoutAnimation
as the method is easier to find inIAnimation
. - The factory methods
IAnimation#createParallelAnimation
now takes covariantIterables
, i.e.Iterable<T extends IAnimation>
instead ofIterable<IAnimation>
. - Inertia scrolling of the viewport behaves now in a more natural way. The scrolling stops now after a fixed amount of time and we fixed several problems that caused erratic behavior.
- The stroke thickness is now considered for the calculation of the origin of the default arrow visualizations. Therefore, the visualizations no longer extend into the node bounds.
Input
- The new properties
MoveViewportInputMode#SnapPanning
andSnapPanningThreshold
allow for snapping touch panning to one axis. -
The events
ItemTapped
,ItemDoubleTapped
, andCanvasTapped
have been added toGraphEditorInputMode
andGraphViewerInputMode
. - The new
CanvasControl#HitTestRadiusTouch
property controls the hit test radius for touch interaction. The existingHitTestRadius
property now only applies to mouse interaction. TheICanvasContext#HitTestRadius
property automatically uses one or the other value, depending on the last input event. -
Touch3DEventArgs
now provides the modifier keys that were pressed when the event was dispatched as well as those that have changed their state since the lastTouch3DEventArgs
. - The new
CanvasControl#LastInputEvent
property contains theLastMouseEvent
orLastTouchEvent
depending on which was dispatched last. -
The new
TapEventArgs#TapCount
andTouch3DEvent#TapCount
properties can be used to distinguish between single and multiple taps. - Panning with two fingers held down does no longer change the zoom level.
-
The
CreateEdgeInputMode#CancelGestureOnInvalidTarget
property was sometimes ignored on touch-enabled devices. - The
IEventRecognizer
sSHIFT_PRESSED
,ALT_PRESSED
,CTRL_PRESSED
andSHORTCUT_PRESSED
now also recognize the modifier forTouch3DEvent
. -
The following event recognizer of input modes and input-related classes can now also be used with touch gestures:
CreateBendInputMode#SplitOrthogonalSegmentRecognizer
.ResizeStripeInputMode#ResizeNeighborsRecognizer
andIgnoreContentRecognizer
.CreateEdgeInputMode#PortCandidateResolutionRecognizer
andEnforceBendCreationRecognizer
.GraphEditorInputMode#MultiSelectionRecognizer
.GraphViewerInputMode#MultiSelectionRecognizer
.TableEditorInputMode#MultiSelectionRecognizer
.ReparentNodeHandler#ReparentRecognizer
.PortRelocationHandle#PortCandidateResolutionRecognizer
.
- Don't run unneccessary hit tests when a mode is canceled.
- The
INode
parameter of theNavigationInputMode#enterGroup
method is now optional. If it isnull
the whole graph will be revealed. - The
CanvasControl#createInputModeContext
method is now public instead of protected. -
ItemClickedEventArgs
now extendsClickEventArgs
and therefore provides additional information like theInputModeContext
. - The new overload of the
CreateEdgeInputMode#doStartEdgeCreation
method taking aninitialTargetLocation
parameter can be used to define the initial location that shall be used to find a target node. -
CreateEdgeInputMode
now removes coinciding bends if orthogonal edge creation is enabled. -
CreateEdgeInputMode
provides access to a dummy target node which is used during the interactive edge creation. This allows making the node visible during creation by setting a style and size. -
CreateEdgeInputMode
now supports edges ending without a valid target port candidate. This allows for creating new target nodes together with newly created edges. - The new property
CreateEdgeInputMode#PrematureEndHitTestable
allows for considering any location as valid target point for an edge. - The new
CreateEdgeInputMode#DragCursor
property specifies the cursor that is used during edge creation when no bend may be created at the current location. -
CreateEdgeInputMode
now supports showing port candidates at potential sources for edge creation, too. -
CreateEdgeInputMode
now always creates dummy ports during a gesture, instead of temporarily reusing real ports if available. This makes it possible to change e.g. the dummy edge's source port's style during the gesture. - The new
CreateEdgeInputMode#StartingOverCandidateOnlyEnabled
property can be used to restrict the start of an edge creation gesture to directly hovered port candidates. - The new protected
CreateEdgeInputMode#getSourcePortCandidates
method makes determining source port candidates more flexible. -
GraphEditorInputMode
andTableEditorInputMode
: MethodeditLabel
now also returns aFuture
, similar toaddLabel
andcreateLabel
. -
ClickInputMode
now dispatches the clicked events in the same order asGraphEditorInputMode
andGraphViewerInputMode
, i.e. the more specific eventsLeftClicked
,RightClicked
,LeftDoubleClicked
andRightDoubleClicked
are now dispatched beforeClicked
andDoubleClicked
. Hence,Clicked
andDoubleClicked
will only be triggered if the event wasn't handled before. -
TableEditorInputMode
now handles clicks and taps similar toGraphEditorInputMode
:- New
ItemClicked
,ItemLeftClicked
,ItemRightClicked
,ItemDoubleClicked
,ItemLeftDoubleClicked
,ItemRightDoubleClicked
,ItemTapped
,ItemDoubleTapped
events are raised. - If an event is handled, its default behavior is prevented.
- The new properties
ClickableItems
andClickableRegions
determine for which items and regions a click event will be raised.
- New
- The properties
MaximumSnapDistance
,ShowingHitPortOwnerCandidatesOnlyEnabled
andVisualization
have been added toPortRelocationHandleProvider
and are applied to eachPortRelocationHandle
created by this provider. - The default value of
DefaultPortCandidate#LocationParameter
is nowFreeNodePortLocationModel#NODE_CENTER_ANCHORED
for nodes andBendAnchoredPortLocationModel#FIRST_BEND
for edges instead of a parameter of an internal model. - During interactive edge creation, the tip of a newly created edge now only snaps to valid target port candidates to create orthogonal end segments.
- Moving a node with the
MoveInputMode
for unselected nodes now moves the bends of adjacent self-loops, too. - Added overridable methods to
PortRelocationHandle
to allow customization of the port candidates. - The new
TextEditorInputMode#TextAreaPlacementPolicy
property provides finer control of what happens when theTextArea
is (partially) outside of the viewport. - The new
TextEditorInputMode#TextAreaPadding
property controls the padding between theTextArea
and the border of the canvas. - The
CanvasControl#Mouse2DClicked
event now reports the position of the mouse down event as its location and theCanvasControl#Touch3DTapped
event reports the location of the touch down event as its location. Previously, this was the location of the up events which can be slightly different. - The new
PortRelocationHandle#Visualization
property controls how the preview during edge reconnection is handled. A new option is to change the edge during the gesture, which improves fidelity of the preview in certain cases. MoveLabelInputMode
: The visualization of a moved label has been improved. The new propertyVisualization
allows easy switching between a symbolic preview, a preview or a live view.- The following input modes now release the mutex before dispatching their final event:
-
CreateEdgeInputMode
now releases the mutex before dispatching theEdgeCreated
event. -
MoveInputMode
now releases the mutex before dispatching theDragFinished
event. -
ResizeStripeInputMode
now releases the mutex before dispatching theDragFinished
event.
-
- The new methods
#findNextItem
and#findNearestItem
ofNavigationInputMode
can be used to configure the determination of the "next" item. - The type parameter
T
of classItemDropInputMode
<T> is no longer restricted toIModelItem
. - Overloads of the methods
GraphCopier#copy
andGraphClipboard#duplicate
without theIElementCopiedCallback
parameter have been added. - The new
GraphEditorInputMode#MoveUnselectedInputMode
property provides a child input mode for moving unselected items. It supersedes the previous#createMoveUnselectedInputMode
method. This input mode is disabled by default. - The static constants
SELECTED_MOVABLES_POSITION_HANDLER
andSELECTED_MOVABLES_HIT_TESTABLE
have been added toGraphEditorInputMode
. These are used as defaultPositionHandler
andHitTestable
properties ofGraphEditorInputMode#MoveInputMode
and can be reused for other input modes. -
KeyEventArgs
now provides the#EventType
and#KeyValue
of the originalKeyEvent
.
Layout
-
OrganicLayoutData
: The new propertiesSourceGroupIds
andTargetGroupIds
can be used to group edges when some preconditions are met. -
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 viaAbortHandler
or when the maximum duration time limit is up. Previously, such edges might not have been handled in this case, whereas now they always get a simple but valid orthogonal route. -
HierarchicLayout
: Improved handling of sequence and layering constraints between sub-components, seeHierarchicLayout#SUB_COMPONENT_ID_DPKEY
orHierarchicLayoutData#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 (seeBusDescriptor#isFixed
) or transforms them into orthogonal edges if they are octilinear. In previous versions, the layout algorithm simply throws anIllegalArgumentException
in such cases. -
OrthogonalLayout
: Improved compactness of the layout results. -
OrthogonalLayout
: Improved result of the perceived bends optimization (seeOrthogonalLayout#PerceivedBendsOptimizationEnabled
). -
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#CoreLayout
is either an instance of classTreeLayout
orClassicTreeLayout
. Furthermore, propertyMultiPageLayout#AdditionalParentCount
allows 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#ProxyReferenceNodeCreationEnabled
that allows for disabling the creation of proxy reference nodes as well as property#MultipleComponentsOnSinglePagePlacementEnabled
that allows to prevent that elements of different connected components are placed on the same page. -
PortPlacementStage
now additionally considers port grouping constraints. If two edges are port-grouped at a certain node, the stage assigns the same port location to the edges. For more information about port grouping, seePortConstraintKeys#SOURCE_PORT_GROUP_ID_DPKEY
andPortConstraintKeys#TARGET_PORT_GROUP_ID_DPKEY
. -
TreeComponentLayout
: Added propertyUndirectedTreeConsiderationEnabled
that 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, seeOrthogonalLayout#PerceivedBendsOptimizationEnabled
. -
HierarchicLayout
: Fixed problem that sometimes caused an unnecessarily large distance between adjacent layers. -
Added new stage
PlaceNodesAtBarycenterStage
that places a user-specified subset of nodes on the barycenter of their neighbors. During the core layout, these node are hidden. -
DefaultNodePlacer
andSimpleNodePlacer
now both support to specify a minimum distance between the edge segments that are routed orthogonally in the channel between the root node and the child nodes, see methodDefaultNodePlacer#MinimumChannelSegmentDistance
andSimpleNodePlacer#MinimumChannelSegmentDistance
respectively. -
ClassicTreeLayout
now allows for specifying a minimum vertical distance for the horizontal edge segments of the bus, seeClassicTreeLayout#MinimumBusSegmentDistance
. -
Major performance improvement for
Polyline.EdgeRouter
and 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. -
Several minor performance improvements for
Polyline.EdgeRouter
that affect the path search phase as well as the segment location assignment phase. - The new
TreeLayoutData#CriticalEdgePriorities
property can be used to specify critical edges. - The new
LayoutExecutor#createLayoutGraphAdapter
callback method makes it possible to configure theLayoutGraphAdapter
that is used for the layout calculation. -
SmartEdgeLabelModel
now is properly handled by labeling algorithms, resulting in better label placements. - The new
ImprovingPortAssignmentEnabled
property ofLayoutExecutor
andLayoutGraphAdapter
enablesPortCalculator
to improve the port assignment. - The combination of
PartitionGridData
andTableLayoutConfigurator
has been improved:-
PartitionGridData
now reuses thePartitionGrid
created by theTableLayoutConfigurator
. - Several methods have been added to
TableLayoutConfigurator
which provide access to thePartitionCellId
assignment of the configurator as well as the mappings betweenIRow
/IColumn
andRowDescriptor
/ColumnDescriptor
.
-
- The new properties
LayerConstraints
andSequenceConstraints
ofHierarchicLayoutData
can be used to configure layer and sequence constraints for theHierarchicLayout
. These supersede the previousLayerConstraintFactory
andSequenceConstraintFactory
properties. - The property
ItemMapping#Map
has been added that allows you to use ajava.util.Map
for the mapping from items to values.
Demos
- Added
GraphBuilderDemo
andInteractiveNodesGraphBuilderDemo
demonstrating basic usage of yFiles' newGraphBuilder
classes. - Added
RotatableNodesDemo
that shows how support for rotated node visualizations can be implemented on top of the yFiles library. - Added
PartitionGridDemo
that shows how aPartitionGrid
can be used in layout calculations to restrict the node positions to grid cells. - Added
RenderingOrderDemo
that shows the effect of different render policies on the z-order of nodes, edges, labels and ports. - Added
EdgeToEdgeDemo
that demonstrates the use of edge-to-edge connections. - Added
LargeGraphsDemo
that shows some strategies how to keep a smoothUI
when large graphs shall be visualized.
Further improvements
- The
PointD#toMutablePoint
andRectD#toMutableRectangle
methods now return aMutablePoint
instead ofIMutablePoint
and aMutableRectangle
instead of aIMutableRectangle
, respectively. - The following factory methods for easy conversion between yFiles geometry classes,
yFiles layout geometry and
JavaFX
geometry classes have been added:IPoint#toPoint2D
andPointD#fromPoint2D
.IPoint#toYPoint
andPointD#fromYPoint
.ISize#toDimension2D
andSizeD#fromDimension2D
.ISize#toYDimension
andSizeD#fromYDimension
.IRectangle#toBounds
andRectD#fromBounds
.IRectangle#toRectangle2D
andRectD#fromRectangle2D
.IRectangle#toYRectangle
andRectD#fromYRectangle
.IOrientedRectangle#toYOrientedRectangle
andOrientedRectangle#fromYRectangle
.InsetsD#toInsets
andInsetsD#fromInsets
.InsetsD#toYInsets
andInsetsD#fromYInsets
.
- The new method
GeneralPath#intersects(GeneralPath)
determines whether the path intersects with anotherGeneralPath
. - The
GeneralPath#createSmoothedPath
method now has additional parameters to change how smoothing is applied. Those new options result in nicer smoothing when combined with large smoothing lengths and many different segment lengths in the path. - When reading GraphML with the deserialization property
IgnoreXamlDeserializationErrors
enabled, invalid property content is now skipped instead of discarding the whole object with such content. - Added a
remove
method toNodeDecorator
,LabelDecorator
,EdgeDecorator
,PortDecorator
, andBendDecorator
for easy removal of decorations. -
PolylineEdgeStyle
renders better looking paths for self loop edges whose ports are near the node border. - The class
CanvasResourceBundle
has been added which can be used to replace the default command binding key strokes and command names viaResourceBundles
. - The new class
LicenseConfig
has been added whose staticINSTANCE
can be optionally used to configure the license resolving:- If the content of the license file is set as
LicenseString
property, it is used directly instead of trying to load a license file. - Otherwise if the
LicenseClassLoader
property is set, thisClassLoader
is used to load the license file.
- If the content of the license file is set as
- The
PlatformClassloader
introduced withJDK 9
is now recognized per default when writing GraphML. ForJDK
classes ofJDK 9
that are no longer known to the bootstrap classloader but only to the platform classloader no explicitXamlNamespaceMapping
has to be added toGraphMLIOHandler
.
Bugfixes
Graph Model
- Fixed an exception which might occur upon user interactions in a folded graph which contains labels at ports.
- Fixed a bug which might have caused an edge in a folded view to lose its bends and labels after repeatedly reversing the edge.
- The
SmartEdgeLabelModel#findBestParameter
method 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. - The graph of an
IFoldingView
now raises theNodeCreated
,EdgeCreated
,PortAdded
,LabelAdded
, andBendAdded
events after the created element is registered. This fixes a bug where the master item of the created item was not available in handlers for these events. Table
: The methodssetLabelText
,remove
,setLabelPreferredSize
andsetLabelLayoutParameter
now throw anIllegalArgumentException
instead of anInvalidStateException
.-
DefaultGraph
now calls theonRemovingEdge
andonRemovingPort
methods before their incident items are removed. - When a stripe is removed,
ITable#LabelRemoved
events for the implicitly removed associated labels are now raised, too. - The implementations of
IStripeHitTestHelper
andIBoundsProvider
in the lookup of anIStripe
could neither be decorated nor overridden by the context lookup provided by a stripe style. - The
INodeInsetsProvider
implementations which can be retrieved fromInteriorLabelModel
andInteriorStretchLabelModel
now correctly sum up the space required by overlapping labels.
View
-
Scrolling with
CanvasControl#ScrollCommandAnimationEnabled
enabled no longer changes the zoom level. - The methods
getBounds
andisVisible
describing theRectangleIndicatorInstaller
returned 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. GraphModelManager
: FixedNullPointerException
that occured when any of the Descriptor properties were set while theGraphModelManager
instance was not yet associated to anIGraph
.- Bridges: For edges which cross each other with the same absolute slope now a bridge is added on exactly one of these edges, depending on the crossing policy (was: either on both edges or none of them).
- Reduced memory consumption of
DefaultEdgePathCropper
. - Removing an item that is currently highlighted with a custom
HighlightIndicatorManager
,FocusIndicatorManager
, orSelectionIndicatorManager
no longer results in aNullPointerException
. - Selected stripe labels no longer remain selected after their owning stripe is deleted.
- Selected stripe labels no longer cause exceptions when hovering over them.
- The selection indicator for selected stripe labels is now shown correctly.
- The methods
GraphClipboard#copy
andGraphClipboard#cut
don't copy items anymore which depend on items that are selected but not included inGraphClipboard#CopyItems
. - Undo units created by the execution of a layout algorithm are now correctly merged with undo units of the previously executed interactive gesture.
- Corrected weird scrolling behavior of the scroll bar when the viewport was outside the content rectangle.
- The commands
COPY
,CUT
, andDUPLICATE
are no longer enabled if there are no elements to cut, copy or duplicate. - Fixed a bug that sometimes prevented dispatching the mouse up event.
CanvasControl#fitContent
now takes into account that scroll bars that are currently visible may vanish.-
IVisualTemplate#createVisual
was sometimes called with wrong bounds andIVisualTemplate#updateVisual
was often not called at all. - Mouse wheel scrolling and scroll commands no longer move the view to the top left corner if a the
viewport is limited by a
ViewportLimiter
. - Bridges did sometimes not appear on edges when they were scrolled into the viewport.
-
RectangleIndicatorInstaller
andOrientedRectangleIndicatorInstaller
: If an installer is created without a template key or if no template is registered for the template key that is passed to the installer's constructor, the installer's#Template
property will now be initialized to a non-null default template. - Fixed a bug in
RectangleIndicatorInstaller
and in default arrows,SnapResultProvider
andSnapResult
implementations, that has caused aNullPointerException
when the corresponding template is null. - Fixed CSS support for edge selection. Previously customizing the edge selection visualization using the edge-selection-indicator style class was sometimes ignored.
Input
-
PortRelocationHandleProvider
now can handlenull
asgraph
constructor parameter. -
PortRelocationHandle#GHOST_VISUALIZATION_PEN_KEY
now is excluded from obfuscation. - Fixed
IHitTestable
implementation ofDefaultPortCandidateDescriptor
which used incorrect coordinates. - The
ParentInputMode
property of theInputModeEventArgs
now is the input mode which has raised the event. Previously, some input modes erroneously set theParentInputMode
to the containingGraphEditorInputMode
orGraphViewerInputMode
. - Switching the input mode in an event handler of the current input mode no longer throws an exception.
-
ItemHoverInputMode
updates the hovered item upon mouse drag events, too. This is the documented behavior. Previously, the hovered item was only updated on mouse move events. -
ItemHoverInputMode
removes the hovered item uponcancel
. 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.- Fixed an exception when an edge or label is pasted without selected target while its original owner is not in the current view.
-
ClickInputMode
provided wrong click locations in theClicked
event if aMouse2DEventTypes#CLICKED
event without precedingMouse2DEventTypes#PRESSED
event was processed. -
CreateEdgeInputMode
did not show port candidates after re-installation of the input mode. - To distinguish touch move events from touch press events, the
CanvasControl#LongPressTime
property was used instead of theCanvasControl#DragTime
property. - Moving an edge label with
SmartEdgeLabelModel
that is owned by an edge without visible path no longer throws an exception. -
ItemHoverInputMode
now resets the hovered item when moving the mouse out of the control. -
GraphEditorInputMode
andGraphViewerInputMode
no longer ignore changes to their sub-input modes after having been installed once. - The
HitTestRadius
property of the following implementations ofICanvasContext
now correctly contain the value in world coordinates instead of view coordinates:- The context created by
ICanvasContext#create
when passing aCanvasControl
but no hit test radius. - The context passed to
IDisposeVisualCallback
. - The context passed to
IPositionHandlers
byMoveInputMode
. - The context passed to adjacent handles when moving a bend handle.
- The context created by
- Disabling
MarqueeSelectionInputMode
during the gesture via code left the marquee visible on the screen. - When a selected stripe label is edited its
TextArea
now is correctly placed. - While relocating edges, dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.
- The
Clicked
andDoubleClicked
events ofClickInputMode
were sometimes missing when clicking on a node or edge. Now, they are always triggered unless the event was handled before. - Snap lines which indicate the same size are no longer shown for implicitly re-sized parent group nodes.
TextEditorInputMode
: Inserting a line break now replaces selected text.- Node-to-edge snapping is now disabled by default which is the documented and intended value.
For this, the initial value of the
GraphSnapContext#NodeToEdgeDistance
property is set to-1.0
. - The
LabelEditingEventArgs#Context#ParentInputMode
property provided in the eventsGraphEditorInputMode#LabelAdding
,GraphEditorInputMode#LabelEditing
,TableEditorInputMode#LabelAdding
andTableEditorInputMode#LabelEditing
now contains the correspondingGraphEditorInputMode
orTableEditorInputMode
instance. - The default implementation of
IPortSnapResultProvider
never returned any snap results. CreateEdgeInputMode
: TheValidBeginCursor
is now correctly hidden during edge creation when bend creation isn't allowed.-
CreateEdgeInputMode
didn't always update the highlight of possible source port candidates when itsShowPortCandidates
property was configured to show the source port candidates. GraphEditorInputMode
/GraphViewerInputMode
: Corrected the context menu location if the menu is opened using the keyboard. Previously, the menu could appear outside theGraphControl
if the selected items or the current item were not completely inside the current viewport. Now the context menu location (i.e. the menu's upper left corner) will be always inside theGraphControl
.AbstractContextMenuInputMode
: TheValidMenuLocationHitTestable
was erroneously called with view coordinates instead of world coordinates.ReparentStripePositionHandler
: The source and target ghost visualization was not always updated correctly when custom ghosts were used.- Changing the values of the
CreateEdgeInputMode#DummyEdgeGraph#EdgeDefaults
property had no effect for some interactions. - Fixed a possible infinite loop in
OrthogonalEdgeHelper
. - The cursor is now correctly reset after editing an orthogonal edge.
- The
CreateEdgeInputMode
doesn't show port candidates anymore if bend creation is enforced (by pressingCTRL
key during edge creation). - The indicators for bend grid snapping were not always drawn at the correct position for bends which were implicitly moved with a selected edge.
- On fast consecutive taps sometimes a
NullPointerException
was thrown.
Layout
-
ComponentLayout
: Fixed anIllegalArgumentException
that was triggered for some input graphs with user-defined components (seeCOMPONENT_ID_DPKEY
) where at least one node hadnull
as its component id. -
HierarchicLayout
: Fixed a problem that sometimes caused too long straight-line same-layer edges. Note that the additional length was equal to the value ofHierarchicLayout#NodeToEdgeDistance
-
Polyline.EdgeRouter
: Fixed a rareNullPointerException
that was triggered for some input graphs when the maximum duration was exceeded. -
CompactNodePlacer
: FixedNullPointerException
that was triggered when the tree root was marked as assistant node, seeAssistantNodePlacer#ASSISTANT_NODE_DPKEY
. -
CompactNodePlacer
: FixedIllegalStateException
that could occur for input graphs that contain assistant nodes (seeAssistantNodePlacer#ASSISTANT_NODE_DPKEY
) and given placement strategies (seeCompactNodePlacer#STRATEGY_MEMENTO_DPKEY
). -
TreeLayout
: Fixed bug that caused less compact results when using theCompactNodePlacer
. -
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. -
RadialLayout
: FixedNullPointerException
that was triggered when there was aDataProvider
registered with the graph with keyHierarchicalLayout.SUB_COMPONENT_ID_DPKEY
. -
HierarchicLayout
: Fixed endless loop issue causing aStackOverflowError
if a sub-component with a nested layout algorithm that again applied an instance ofHierarchicLayout
was defined. -
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. -
OrthogonalLayout
: FixedNullPointerException
that occurred when the subtree layout styleTreeLayoutStyle#INTEGRATED
was 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. -
HierarchicLayout
: Fixed possibleNullPointerException
for input graphs with source/target port labels (seeLabelPlacements#AT_SOURCE_PORT
andLabelPlacements.AT_TARGET_PORT
) and with a subset of nodes associated with halos (seeNodeHalo
). -
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 (seeHierarchicLayout.CRITICAL_EDGE_DPKEY
) or propertySimplexNodePlacer.EdgeStraighteningEnabled
was enabled. -
GenericLabeling
: Fixed a very rareIllegalArgumentException
that was caused by some input graphs that contain edges with zero length segments and labels associated with a free edge label model (i.e.,SmartEdgeLabelModel
orFreeEdgeLabelModel
). -
HierarchicLayout
andSimplexNodePlacer
: Fixed a very rareIllegalArgumentException
that was caused by some input graphs that contain both swimlanes and groups as well as fixed elements. -
RecursiveGroupLayout
: Fixed a bug that caused violation of PortConstraints or PortCandidates for self-loops where both endpoints were restricted to the same node side. -
PolylineLayoutStage
: Fixed a bug that caused collinear bends to be removed from fixed edges. Now, such fixed edges are not changed anymore. -
OrganicLayout
: Fixed bug that caused that movable nodes kept their initial location if the scope is set toSUBSET
orMAINLY_SUBSET
and if there are output restrictions (seeOrganicLayout#OutputRestriction
). -
HierarchicLayout
: Fixed bug that could cause the violation of fixed port candidates if there were critical edges (seeHierarchicLayout.CRITICAL_EDGE_DPKEY
) and edges connecting to group nodes. -
SeriesParallelLayout
: Fixed a rare bug that triggered aNullPointerException
when 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. -
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. -
Polyline.EdgeRouter
: FixedNullPointerException
that was triggered when the list of intermediate points for an edge consisted of exactly two equal points. -
OrganicLayout
: FixedIllegalArgumentException
that could appear if cycle substructure detection is enabled, seeOrganicLayout#CycleSubstructureStyle
. -
HierarchicLayout
: Fixed an issue that caused non-symmetric results for grouped edges even though propertySimplexNodePlacer#BaryCenterModeEnabled
was enabled. -
OrthogonalLayout
: Fixed rare infinite loop issue for grouped graphs. -
Polyline.EdgeRouter
: Fixed rareNullPointerException
. -
Polyline.EdgeRouter
: FixedNullPointerException
that occurred when there were intermediate routing points and the path search got aborted (e.g. because of maximum duration time limit). -
ShortestPaths
: Fixed possibleNullPointerException
that occurred when the a-star algorithm was applied to a graph with non-monotonic heuristic costs. -
HierarchicLayout
: FixedUnsupportedOperationException
that was triggered when aDataProviderAdapter
that does not implementIDataProvider#get
was registered with keyGivenLayersLayerer#LAYER_ID_DPKEY
. The issue only appeared in conjunction with sub-components, seeHierarchicLayout#SUB_COMPONENT_ID_DPKEY
. -
FamilyTreeLayout
: Fixed bug that caused that the preferred family member order wasn't considered, seeFamilyTreeLayout#FamilyMembersSortingPolicy
. -
GenericLabeling
: Fixed bug that could cause that a label candidate with a lower profit (seeAbstractLabeling#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 aNullPointerException
if the input graph contains port groups, seePortConstraintKeys#SOURCE_PORT_GROUP_ID_DPKEY
andPortConstraintKeys#TARGET_PORT_GROUP_ID_DPKEY
. -
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 propertyNodeLayoutDescriptor#GridReference
. -
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 (seeEdgeBundleDescriptor#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. - Corrected an error in the
Rectangle2D#Contains(Rectangle2D)
method. As a consequence of this error, the results of various algorithms and automatic layouts could have been wrong. -
OrthogonalLayout
now considers edge grouping also if there are no directed edges specified.
Demos
SwingDemo
: Fixed dead locks when using the system look and feel onGTK
-based desktop environments like the popularGNOME
desktop environment.
Further Bugfixes
-
GenericLabelModel
serialization: Fixed cyclic reference in GraphML which could happen while serializing aGenericLabelModel
with a parameter with associated descriptor. -
PolylineEdgeStyle
now takes arrow heads into account for visibility checks. - The default method
IOrientedRectangle#getCenter
didn't return the correct center if the width or height of the rectangle was equal to 0. - Sometimes the
GroupNodeDefaults#LabelDefaults#AutoAdjustingPreferredSizeEnabled
property and theGroupNodeDefaults#PortDefaults#AutoCleanupEnabled
property were not considered for labels and ports of groups. - The
GroupingSupport#hasGroupNodes
method now returns only true if there are actually group nodes in the graph. Previously, it returned also true if there once were group nodes which had been removed in the meantime. TableNodeStyle
: Fixed missing default visualization.- Fixed a possible
NullPointerException
inTableNodeStyleRenderer
when aTableNodeStyle
is rendered with#Table
set tonull
. - The
clone
method now is overridable in all style implementations. - Fixed calculation of the preferred size of
TemplateNodeStyleRenderer
,TemplateLabelStyleRenderer
andTemplatePortStyleRenderer
.
Incompatible Changes
ReparentStripePositionHandler
: All callback methods dealing with ghost objects have been renamed consistently:UpdateXyzVisualization
toUpdateXyzGhost
.UpdateTargetVisualizationBounds
toUpdateTargetGhostBounds
.
- The method
Arrow#getAsFrozen
was removed as there was no benefit in converting the Arrow instance in an immutable instance. - The protected factory method
MoveLabelInputMode#createLabelHitTestable
has been removed. Developers who want to set a custom instance need to set it directly to theHitTestable
property. - The
#CanvasClicked
event ofGraphEditorInputMode/GraphViewerInputMode
now provides theGraphEditorInputMode/GraphViewerInputMode
as parent input mode in theContext
property of itsClickEventArgs
. - The
ITable#RelativeLocation
property has been removed. UseITable#Insets
with correspondingLeft
andTop
values instead. - Renamed all occurrences of
Cleanup
toCleanUp
in API names. -
ItemClickedEventArgs
now extendsClickEventArgs
. CreateEdgeInputMode
'sEdgeCreator
might receivenull
astargetPortCandidate
parameter. Callbacks must handle this case by either creating a target port of their own or canceling the edge creation by returningnull
.- The
StripeSubregion#TargetTableNode
property is now read-only. - Renamed the enumeration value
ShowFocusPolicy#WHEN_FOCUSED
toONLY_WHEN_FOCUSED
. - Renamed the
Animator#destroy
method tostop
. - The
GraphEditorInputMode#createMoveUnselectedInputMode
method has been removed. Use the propertyMoveUnselectedInputMode
instead. - The
boolean
CreateEdgeInputMode#PortCandidateShowingEnabled
property has been replaced by theCreateEdgeInputMode#ShowPortCandidates
property which has the enum typeShowPortCandidates
. - The
boolean
OverviewInputMode#AutoMouseWheelZoomEnabled
property has been replaced by theOverviewInputMode#MouseWheelBehavior
property which has the enum typeMouseWheelBehaviors
. - The utility methods
CanvasControl#createVisualFromTemplate
have been removed. Usages should call theIVisualTemplate
'screateVisual
method directly instead. - The utility method
CanvasControl#setTemplateLocation
has been removed. Usages should add an appropriate Transform directly to the Node instead. -
The property
CanvasControl#ZoomAnimationEnabled
has been removed. Instead the new methods#zoomToAnimated
shall be used for animated zoom. DpKeyBase
has been renamed toAbstractDpKey
and made an abstract class.AbstractDpKey
and all subclasses now take the value type as additional constructor parameter. This value type may be retrieved through read-only propertyValueType
.IMapperRegistry
: The value type parameter was removed from all default methods takingNodeDpKey
,EdgeDpKey
orILabelLayoutDpKey
.MoveViewportInputMode
: The properties that controlled the inertia behavior have been removed since they no longer apply to the new algorithm. Instead, the new propertyInertiaDuration
can be used to specify the duration of the inertia scrolling.-
GraphModelManager#HierarchicNodeNestingEnabled
has been removed. Set the newHierarchicNestingPolicy
property toHierarchicNestingPolicy#NONE
to disable node nesting or to eitherHierarchicNestingPolicy#NODES
orHierarchicNestingPolicy#NODES_AND_EDGES
to use nesting. Similarly,GraphModelManager#HierarchicEdgeNestingEnabled
has been removed. Use eitherHierarchicNestingPolicy#NODES_AND_EDGES
to enable edge nesting or any other policy to disable it. - The method
CanvasControl#animateScrollTo
has been removed and is superseded by the new#zoomToAnimated
methods. -
The property
SliderEdgeLabelLayoutModel#AutoFlipping
has been renamed to#AutoFlippingEnabled
. -
The property
TableLayoutConfigurator#Compaction
has been renamed to#CompactionEnabled
. -
The property
GraphPartitionManager#FiringGraphEventsEnabled
has been removed. -
The overloads of
ValueSerializer#getSerializerFor
taking no context have been removed. -
The class
com.yworks.yfiles.layout.hierarchic.GroupingSupport
has been removed. -
The property
KeyEventArgs#Key
has been renamed to#KeyCode
.
Changes of Default Behavior
- The
IGraph#setNodeLayout
method and the various methods to create a node now throw anIllegalArgumentException
if the layout rectangle contains one or moreNaN
values. Similarly, theIGraph#setBendLocation
and the various methods to add a bend to an edge now throw anIllegalArgumentException
if the location point contains one or twoNaN
values. - By default, stripe labels that are programmatically selected or highlighted don't show a selection or highlight indicator anymore.
- Inertia scrolling of the viewport behaves now in a more natural way. The scrolling stops now after a fixed amount of time. Previously, the duration depended on the initial inertia velocity.
- GraphML: Duplicate properties on XAML input are now considered an error in accordance with the XAML specification.
- The stroke thickness is now considered for the calculation of the origin of the default arrow visualizations. This can result in a slightly different rendering of the arrows.
- The
CreateEdgeInputMode#DummyEdge
property is now always reset after the edge creation was finished or canceled. -
RectD#isFinite
andSizeD#isFinite
now also consider empty instances as not finite. MoveLabelInputMode
: The moved label now is visualized as a preview instead of a symbolic rectangle. Set theVisualization
property toVisualization#GHOST
to restore the old mode.- The
LayoutExecutor#ContentRectUpdatingEnabled
property is now enabled by default. CreateEdgeInputMode
: The determination whether the mouse hovers over a valid end has changed. IfForcingSnapToCandidateEnabled
is disabled, theEndHitTestable
now is queried first and a target port candidate is only searched if the hit testable returnstrue
. Previously, the hit testable was only queried if no target port candidate was found at the current location.- Previously, even if the
GraphModelManager#UsingHierarchicEdgeNestingEnabled
property was set totrue
, canvas objects for edges were added to theGraphModelManager#EdgeGroup
as long as no group nodes were part of the graph. The corresponding newHierarchicNestingPolicy
NODES_AND_EDGES
has no such behavior and thus,EdgeGroup
is empty by default. Use one of the other polices if canvas objects for edges should be part ofEdgeGroup
. -
PolylineEdgeStyle
defaults to an improved smoothing algorithm when using theSmoothingLength
property. This is especially apparent when using large values forSmoothingLength
. - The method
CollapsibleNodeStyleDecorator#createSelectionInstaller
has been removed. - The
CanvasControl#DragSize
property no longer applies to touch input. Use the new property#DragSizeTouch
for controlling the drag size for touch input. - The
CanvasControl#HitTestRadius
property no longer applies to touch input. Use the new property#HitTestRadiusTouch
for controlling the hit test radius of touch input. CanvasControl
: Changing the view point of the control no longer re-dispatches mouse events to registeredMouse2DEvent
handlers.-
ClickInputMode
now dispatches the more specific eventsLeftClicked
,RightClicked
,LeftDoubleClicked
andRightDoubleClicked
before the generalClicked
andDoubleClicked
events. Hence,Clicked
andDoubleClicked
will only be triggered if the event wasn't handled before.
Deprecated
- The properties
LayerConstraintFactory
andSequenceConstraintFactory
ofHierarchicLayoutData
have been marked as deprecated. The new propertiesLayerConstraints
andSequenceConstraints
should be used instead. Similarly, the factory methodsLayoutUtilities#createLayerConstraintFactory(IGraph)
andLayoutUtilities#createSequenceConstraintFactory(IGraph)
have been marked as@Deprecated
. -
PartitionGrid#hasAtLeastTwoNonEmptyRows
has been marked as@Deprecated
and may be removed in future releases.
yFiles for JavaFX 3.1.0.1
Improvements
View
IArrow#CIRCLE
now uses a real circle for rendering.
Demos
LayoutStylesDemo
: A new sample graph was added to showcase the substructures feature of the organic layout.
Bugfixes
View
- The visualization for snapping to a grid now correctly uses the
SnapLine#SNAP_TO_GRID_KEY
and can be customized using this key. - Fixed a bug in
ViewportAnimation
that sometimes moved the viewport a bit before the animation started. - Fixed a bug in
CreateEdgeInputMode
which caused port candidates not to be shown after re-installation of the input mode. - Removing an item that is currently highlighted with a custom
HighlightIndicatorManager
,FocusIndicatorManager
, orSelectionIndicatorManager
no longer results in aNullPointerException
. - The default method
IOrientedRectangle#getCenter
didn't return the correct center if the width or height of the rectangle was equal to 0. - Moving an edge label with
SmartEdgeLabelModel
that is owned by an edge without visible path no longer throws an exception. GraphEditorInputMode
andGraphViewerInputMode
no longer ignore changes to their sub-input modes after having been installed once.- The
HitTestRadius
property of the following implementations ofICanvasContext
now correctly contain the value in world coordinates instead of view coordinates:- The context created by
IContext#create
when passing aCanvasControl
but no hit test radius. - The context passed to
IDisposeVisualCallback
. - The context passed to
IPositionHandler
s byMoveInputMode
. - The context passed to adjacent handles when moving a bend handle.
- The context created by
- The
InteriorStretchLabelModel#getMinimumNodeSize
method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width. - Relocation of edges: dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.
- Sometimes, the
GroupNodeDefaults#LabelDefaults#AutoAdjustingPreferredSizeEnabled
property and theGroupNodeDefaults#PortDefaults#AutoCleanupEnabled
property were not considered for labels and ports of groups. - The
NodeStyleStripeStyleAdapter#updateVisual
method always created a new visual by delegating to thecreateVisual
method. - The
ICommand#COPY
command is no longer executed twice. FreeEdgeLabelModel
: static propertyINSTANCE
is now excluded from obfuscation.MoveViewportInputMode
: TheDragging
,Dragged
,DragCanceling
,DragCanceled
,DragFinishing
andDragFinished
events did not fire reliably for touch input and when mouse inertia was active.TextEditorInputMode
: inserting a line break now replaces selected text.- Fixed an exception in
DropInputMode
which occurred if a drag enter was recognized while another drag action was still running. CreateEdgeInputMode
no longer fires gesture cancel events if it has not been started before.- Mouse wheel zoom during an input gesture no longer results in incorrect coordinates for the subsequently dispatched mouse event.
StripeDropInputMode
no longer callsItemCreator
twice.- The
StripeDropInputMode#ItemCreated
event was not raised.
Layout
- Corrected an error in the
Rectangle2D#contains(Rectangle2D)
method. As a consequence of this error, the results of various algorithms and automatic layouts could have been wrong. -
PortPlacementStage
: Fixed bug that causedNullPointerException
when the ports of edges in the input graph were outside the node bounds. -
BusRouter
: Fixed rareNullPointerException
that 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#getBoundingBox
was 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 typeEdgeType.PROXY
was never used. -
Polyline.EdgeRouter
: FixedRuntimeException
that could be triggered when the graph contained fixed edges (seeEdgeRouter.Scope
) with very short segments. -
HierarchicLayout
: FixedIllegalArgumentException
that could be triggered when the user specified both edge directedness (seeHierarchicLayout.EDGE_DIRECTEDNESS_DPKEY
) and layering constraints. -
OrthogonalLayout
: Fixed rare bug that caused node-edge overlaps. -
HierarchicLayout
andSimplexNodePlacer
: Fixed rareIllegalArgumentException
that could be triggered when the input graph had a partition grid andPortCandidate
s orPortConstraint
s. -
OrganicRemoveOverlapsStage
: Improved adherence to the specified maximum duration. -
HierarchicLayout
: Improved port assignment for edges incident to group nodes that are routed directly (seeEdgeLayoutDescriptor#DirectGroupContentEdgeRoutingEnabled
). Previously, such edges were often reversed. -
HierarchicLayout
: Fixed bug that caused violation of specifiedPortCandidate
s of edges with labels with preferred placement specifierLabelPlacements.AT_SOURCE_PORT
orLabelPlacements.AT_TARGET_PORT
when 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 classPortCandidateOptimizer
. Previously, this class didn't have any runtime restrictions. -
OrthogonalLayout
: Fixed rare bug that caused overlapping nodes. -
OrthogonalLayout
: Improved from-sketch mode (see#FromSketchModeEnabled
) 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 propertyHierarchicLayout#ComponentArrangementPolicy
was not correctly considered when there are undirected edges (seeHierarchicLayout.EDGE_DIRECTEDNESS_DPKEY
). -
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, seeHierarchicLayout.EDGE_THICKNESS_DPKEY
) together with a (rather large) grid spacing value and the default port assignmentPortAssignmentMode.DEFAULT
. -
HierarchicLayout
: Fixed bug that caused unnecessarily large layer distances in case that there exist empty partition grid rows with a minimum row height. -
HierarchicLayout
with partition grid: Fixed bug that in some cases caused anIllegalArgumentException
when the layout algorithm was configured to stop after the layering or sequencing phase (seeHierarchicLayout#StopAfterLayeringEnabled
andHierarchicLayout#StopAfterSequencingEnabled
. -
DefaultNodePlacer
: Fixed bug inDefaultNodePlacer#MinimumLastSegmentLength
that caused that the value ofDefaultNodePlacer.MinimumFirstSegmentLength
was returned. -
TreeLayout
: Fixed bug inDefaultPortAssignment
that 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. -
Polyline.EdgeRouter
: Fixed possibleNullPointerException
that appeared if grouped edges were assigned to different fixed port locations (either specified withPortCandidate
s orPortConstraint
s) at their grouped end.
Demos
- Custom style tutorial, step 25: Fixed memory leak in custom edge style.
GraphViewerDemo
: Fixed a bug when opening a link on Linux.
yFiles for JavaFX 3.1
Improvements
Performance
Major performance improvements of the viewer part and new performance-related configuration options:- Improved general render performance especially for large graphs dramatically.
PolylineEdgeStyle
has a new property#PathRenderPolicy
that allows to choose how the path of the edge is transformed tojavafx.scene.Node
. ChoosingPathRenderPolicy#LINES
boosts the render performance a lot but reduces the render quality at bends.PolylineEdgeStyle
: Rendering of straight-line edges was sped up as they are always rendered withPathRenderPolicy#LINES
without the reduced render quality at bends.PolylineEdgeStyle
has a new property#PathClippingPolicy
that allows to choose if the path of the edge should be clipped at the viewport before transforming it to ajavafx.scene.Node
. This especially boosts the performance if non-solid pens are used.EdgeDecorationInstaller
has the new properties#PathRenderingPolicy
and#PathClippingPolicy
and usesPathRenderPolicy#LINES
andPathClippingPolicy#ROUGH
per default which results in a great render performance improvement for edge selection, focus and highlight indication.- The property
GraphModelManager#VirtualizationZoomThreshold
has been added that allows to switch of the virtualization of all model items below the specified zoom value. This is useful for large graphs where removing elements outside the viewport from the visual tree is more expensive then updating them.
Eclipse E4 RCP Demo
The Eclipse RCP demo has been completely redesigned and adapted for the e4 framework. The demo shows in detail how to integrate yFiles for JavaFX into an Eclipse e4 application. The following features have been implemented:- menu and toolbar using the Eclipse framework with commands for
- changing the language at runtime
- printing and image export
- loading and saving graphs in GraphML format
- undo, redo and clipboard support
- zooming
- performing layout calculation
- grouping and folding
- perspectives for editing and for viewing and navigating the graph
- many parts providing
- palettes for different node and edge styles
- various layout algorithms with extensive configuration options
- a graph overview
- a panel for changing the properties of nodes and edges
- a structure view showing the hierarchical structure of the graph
- context views showing neighbors, predecessors and successors of selected nodes or the content of a selected folder
General
- The naming of classes, members and parameters has been reviewed and now uses more consistent and intuitive names. Please consult the Developer's Guide for a complete list of renamings.
- Some functionality has been removed from the API to reduce its complexity and some of the functionality has been moved to different classes or packages. Again, see the Developer's Guide to get a full list of moved/removed functionality.
Viewer
- Some methods that threw a
NullPointException
if one of their parameters were null now throw anIllegalArgumentException
instead.
Styles
DefaultLabelStyle
: A new property#TextOverrun
specifies the behavior to use if the text of the label exceeds the available space for rendering the text.-
The types of the
#INSTANCE
fields ofVoidNodeStyle
,VoidEdgeStyle
,VoidLabelStyle
,VoidPortStyle
, andVoidStripeStyle
have been changed to the concrete types instead of the interface types (e.g.INodeStyle
). TemplateNodeStyle
,TemplateLabelStyle
,TemplatePortStyle
andTemplateStripeStyle
throw nowRuntimeExceptions
when the control could not be loaded from a specified FXML file.-
TemplateLabelStyle
,TemplateNodeStyle
,TemplatePortStyle
, andTemplateStripeStyle
now support URLs referencing FXML files in addition to the existing lookup approach using style resource keys.
Input Modes
- Nodes will now show their target grouping hierarchy z-order during a reparenting gesture.
MouseHoverInputMode
: TheOwnerNode
of aTooltip
is now set to theCanvasControl
on which theTooltip
is displayed.
GraphML
-
GraphMLIOHandler
now has#addXamlNamespaceMapping
methods for easier control of the XML namespace for certain types. -
GraphMLIOHandler
has two new events,#QueryType
and#QueryName
that allow for fine-grained control over XML namespace writing and parsing for certain types.
Model
-
An initially collapsed group node as a result of a
ICommand#GROUP_SELECTION
command now has a reasonable size.
Layout
-
LayoutUtilities#applyLayout
now supports layout of tables. -
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 orientationsLayoutOrientation#LEFT_TO_RIGHT
,LayoutOrientation#RIGHT_TO_LEFT
andLayoutOrientation#BOTTOM_TO_TOP
. Geometry information registered with data providers with keysHierarchicLayout#ALTERNATIVE_GROUP_BOUNDS_DP_KEY
andHierarchicLayout#ALTERNATIVE_EDGE_PATH_DP_KEY
is now automatically rotated according to the specified layout orientation. -
AspectRatioTreeLayout#RootPlacementDpKey
is now of typeNodeDpKey<RootPlacement>
. -
AspectRatioTreeLayout#SubtreeRoutingPolicyDpKey
is now of typeNodeDpKey<SubtreeArrangement>
.
Demos
- The new
GraphML
compatibility demo that shows how to loadGraphML
files created by yFiles for JavaFX 2.0.x and 3.0.x was added. - Polished and simplified BPMN Editor demo.
- SWTDemo and SVGImageExportDemo : Made the build script Java 9 ready.
Bugfixes
Viewer
- Fixed a bug that slowed down the render performance of the
CanvasControl
especially for larger graphs. -
Switching the
GraphControl
's#InputMode
in a key event handler no longer throws an exception. -
UndoEngine
now 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#AutoMergeDuration
. - Fixed a bug that creates folders with empty size when manually creating groups and the folding view is configured to collapse group nodes by default.
-
Fixed a bug in
GraphModelManager
that didn't update the child groups if a new#ContentGroup
is set. - Fixed right-to-left orientation handling for:
- image export and printing,
- moving focus,
- mouse scrolling and scroll commands,
- resize cursors,
- drop shadow of
BevelNodeStyle
,PanelNodeStyle
, andShinyPlateNodeStyle
.
Mouse2DEvent#ChangedModifiers
sometimes provided wrong values.- Fixed a bug that prevents to free resources which are occupied by a visual when the visual leaves the viewport.
-
Fixed an issue where
Touch3DEvent
s of typeTouch3DEvent#EXITED
were never raised. - The shortcut for command
Toggle Item Selection
has been replaced byControl+Space
for Macintosh. The former shortcutCommand+Space
was reserved by the operation system. - Fixed the maximum y-coordinate for horizontal grid lines produced by
GridVisualCreator
with grid styleLINES
. CanvasControl
: Re-enabled mouse wheel scrolling for Linux and Mac OS.CanvasControl
: Fixed a bug that prevented slow mouse wheel zooming and scrolling with some devices.
Styles
-
Fixed a bug that might occur when changing wrapped
styles in
CollapsibleNodeStyleDecorator
,ShadowNodeStyleDecorator
,NodeStyleLabelStyleAdapter
andNodeStylePortStyleAdapter
. TemplateStripeStyle
: Implemented method#createControl(IRenderContext, IStripe)
.- Fixed an exception that occurred when using
MemoryIconLabelStyle
. -
Fixed some styles to call
IRenderContext#childVisualRemoved
after the Visual actually has been removed instead of just before the removal. Arrow
now considers all properties of itsArrow#Pen
instead of only itsPaint
and can handlenull
asPen
.- Fixed a bug that prevented
TemplateNodeStyleRenderer
to use implementations ofIShapeGeometry
,IMarqueeTestable
,IBoundsProvider
orIHitTestable
provided by theTemplateNodeStyle
. - Fixed
NodeStyleLabelStyleAdapter
which neither showed the label text nor did it move with its owner. DefaultLabelStyle
: Fixed#updateVisual
to take all style properties into account when determining whether or not the visualization has to be re-created.DefaultLabelStyle
: Fixed a bug that placed the text incorrectly when the width or height of the label was very small.AbstractTemplateStyle
: Fixed a bug that prevented serialization of the#ContextLookup
property after obfuscating the library.
Input Modes
- During reparenting, the edges at reparenting nodes were drawn below the group(s) and thus they were not visible. If reparenting was canceled, these edges stayed behind the group(s) and remained invisible.
-
CreateEdgeInputMode
did not always start correctly for quick gestures on slow devices. -
CreateEdgeInputMode
did not trigger the#EdgeCreationStarted
event for programmatic initialization of the edge creation gesture. -
Fixed a bug in
CreateEdgeInputMode
that didn't show the edge preview when the edge would be created between a node and one of its ancestors or vice versa. -
Setting
CreateEdgeInputMode
's#CancelRecognizer
could potentially get the input mode into a broken state. -
Fixed a bug in
CreateEdgeInputMode
that broke the edge preview after the input mode was uninstalled and reinstalled again. -
CreateEdgeInputMode
fired gesture cancel events even if it was not started before. - Fixed a bug in bend creation for orthogonal edges when grid snapping was enabled.
-
HandleInputMode
's#CurrentHandle
property could not always be obtained during the#DragFinished
,#DragFinishing
,#DragCanceling
, and#DragCanceled
events ofHandleInputMode
-
Fixed a possible exception in
NodeDropInputMode
when snapping is enabled, but preview disabled. -
Fixed a bug in
StripeDropInputMode
that could result in nodes being moved to a wrong stripe when a new stripe was created or an exising one relocated. -
StripeDropInputMode
no longer callsItemCreator
twice. -
Fixed an exception in
DropInputMode
which occurred if a drag enter was recognized while another drag action was still running. -
Setting a new
OverviewInputMode
forGraphOverviewControl
now updates the#InputMode
property accordingly. - Fixed reparent highlighting when multiple nodes are reparented together.
- Fixed a bug in
MoveInputMode
that sometimes prevented the input mode from starting the move gesture so that other input modes likeCreateEdgeInputMode
could jump in. TextEditorInputMode
: Fixed a bug that inserts a linebreak after a label has been edited.TextEditorInputMode
: Fixed a bug that prevents the usage of the properties#CancelRecognizer
,#StopRecognizer
and#LineBreakRecognizer
.-
Stopped
TextEditorInputMode
from firing#EditingCanceled
events if text editing has not been cancelled.
GraphML
- Fixed shared reference handling in GraphML for
java.util.Collection
andjava.util.Map
instances. Collections and maps are only shared if the same instances are used. - Fixed a bug that could result in an exception when parsing a GraphML file with empty text elements.
- GraphML serialization now uses the correct schema location
http://www.yworks.com/xml/schema/graphml.java.fx/3.0/ygraphml.xsd
. - Fixed GraphML deserialization of
IconLabelStyle
instances. - Fixed a bug in
GraphMLIOHandler
that prevented that packages with a predefined xml namespace could be mapped to another xml namespace. - Fixed structured
GraphML
serialization ofURL
instances. - Fixed structured
GraphML
deserialization of label model position enum values. - Fixed
GraphML
(de-)serialization of ports usingSegmentRatioPortLocationModel
and corresponding port location parameter instances. - Fixed a bug in
GraphML
serialization that always always looked for singletons on classes that were annotated with@GraphML
even if the@GraphML#singletonContainers
property was not set.
Model
-
Fixed an unnecessary exception in
IGraph#calculateLabelPreferredSize
which 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 appropriateLabelDefaults
and thus the question of whether the owner is in the graph or not is irrelevant. -
Fixed a bug in
IGraph#addLabel
that ignored an explicitly specified preferred size if folding is enabled. -
Fixed some incorrect usages of exceptions in
IGraph
. -
MapperRegistry#addMapper
no longer throws an exception when trying to replace a mapper for an existing key.
Labels
-
Labels with
NinePositionsEdgeLabelModel
now disappear when the owner edge has no visible edge path. This can happen for example when nodes are moved onto each other. Previously they appeared at unexpected locations, including the origin(0,0)
and the upper left corner of the source node. -
FreeLabelModel#INSTANCE
,FreeEdgeLabelModel#INSTANCE
, andFreeNodeLabelModel#INSTANCE
are now serialized correctly toGraphML
when not used as part of their parameters (e.g. withinCompositeLabelModel
). -
Fixed incorrect default value attribute for
SandwichLabelModel
parameters. -
Fixed an issue where the parameter finder for
FreeEdgeLabelModel
cannot place the label correctly for self-loops. Labels previously always appeared at the port location in this case.
Geometry
-
GeneralPath#getTangent
now returnsnull
if there is no tangent at the requested position. Previously, it returned a bogus tangent. -
Fixed
GeneralPath#isVisible
to no longer returntrue
for invisible paths.
Layout
-
HierarchicLayout
: Fixed bug that caused node-edge overlaps in conjunction with some complex edge grouping specifications. -
HierarchicLayout
: Fixed bug that may lead to too large group nodes if there are grouped edges. -
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 (seeHierarchicLayout#EDGE_DIRECTEDNESS_DP_KEY
). -
OrganicLayout
andClassicOrganicLayout
: Fixed bug that caused the algorithm to not consider the specified customGroupBoundsCalculator
(seeClassicOrganicLayout#GroupBoundsCalculator
). -
OrganicLayout
,ClassicOrganicLayout
andInteractiveOrganicLayout
: FixedIllegalArgumentException
that was triggered due to NaN values that could occur in case the input graph has a very large number of nodes. -
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 (seeCoreLayout
) is an instance of classHierarchicLayout
. -
Polyline.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
. -
Polyline.EdgeRouter
: Fixed rare node overlaps in conjunction with monotonic path restrictions (seeEdgeLayoutDescriptor#MonotonicPathRestriction
). -
MultiPageLayout
: Fixed rare bug that sometimes caused straight-line edge routes instead of orthogonal routes. -
CircularLayout
andRadialLayout
: Fixed bug that caused that always all edges are bundled if bundling is enabled for at least one single edge. More precisely, propertyEdgeBundleDescriptor#isBundled
wasn't considered correctly. -
SingleCycleLayout
: Fixed bug that may lead to aClassCastException
if edge bundling is enabled and a custom node sequencer is specified (seeSingleCycleLayout#NodeSequencer
). -
CircularLayout
: Fixed bug that in some cases produced self-intersecting edges when edge bundling is enabled. -
Polyline.EdgeRouter
: Fixed rareIllegalArgumentException
that was triggered when having multiple target port candidates, where at least one must be fixed. Furthermore, to trigger the exception it is necessary that the path search algorithm tries to perform an early exit due to maximum duration restrictions or a stop request viaAbortHandler
. -
IsolatedGroupComponentLayout
: Fixed bug that caused edge labels that intersect with group nodes even though optionComponentLayout#isLabelAwareness
is enabled. -
Fixed
OrganicLayout
ignoring theGroupNodeMode
settings -
AspectRatioTreeLayoutData
did not register the correct values with the graph for the root placement and the subtree routing policy. -
Fixed
NullPointerException
s in someLayoutData
implementations that could happen if some of the mappings where accessed but were never really used in client code.
Incompatible Changes
Viewer
-
GraphControl
's protected method#getGraphMLIOHandler
has been replaced with public property#GraphMLIOHandler
. - The shortcut for command
Toggle Item Selection
has been replaced byControl+Space
for Macintosh. The former shortcutCommand+Space
is reserved by the operating system. - The
#Editable
property has been removed fromCanvasControl
. It had no effect on almost all input modes anyway. To no longer allow editing aGraphControl
use a different input mode instead, e.g.GraphViewerInputMode
, or configure the current input mode in a way that it no longer allows changes. CompoundKeyEvent
as well as all related methods have been removed. The nativeKeyEvent
should be used instead.ModifierKeys#Windows
has been renamed to#Meta
to correspond to the native modifier names.- The constructor of
GeneralPath
that takes a JavaFXPath
has been removed. - The property
FlowDirection
ofDefaultLabelStyle
is not necessary for changing theNodeOrientation
and has therefore been removed. - The unused constant
XamlNamespaceConstants#YFILES_JAVA_FX_WPF_BRIDGE_NS
was removed. - The
Paint
andPen
parameters ofGeneralPath#CreatePath
andGeneralPath#UpdatePath
have been removed. A Paint can still be applied asPath#Fill
property while a Pen can be applied viaPen#styleShape
.
Styles
-
TemplateLabelStyle
: ChangedTemplateLabelStyle(String, TemplateLabelStyleRenderer)
toTemplateLabelStyle(TemplateLabelStyleRenderer)
.
TemplateNodeStyle
: ChangedTemplateNodeStyle(String, TemplateNodeStyleRenderer)
toTemplateNodeStyle(TemplateNodeStyleRenderer)
.
TemplatePortStyle
: ChangedTemplatePortStyle(String, TemplatePortStyleRenderer)
toTemplatePortStyle(TemplatePortStyleRenderer)
.
TemplateStripeStyle
: ChangedTemplateStripeStyle(String, TemplateStripeStyleRenderer)
toTemplateStripeStyle(TemplateStripeStyleRenderer)
.
If a custom renderer has to be used, the style resource or the style resource key has to be set using the corresponding property. -
AbstractTemplateStyle
: Changed type of static property#ClassLoader
fromDelegatingClassLoader
toClassLoader
. TemplateStripeStyle
: Changed return value type of method#getStyle(IRenderContext,IModelItem)
fromjava.lang.Object
tojava.net.URL
.IconLabelStyleRenderer#Style
is now of typeILabelStyle
instead ofIconLabelStyle
as it is also used as renderer of theMemoryIconLabelStyle
.
Input Modes
-
CreateEdgeInputMode
now triggers the#EdgeCreationStarted
event for programmatic edge creation with the#doStartEdgeCreation
method. KeyboardInputMode
: The methods#addHandler(IEventRecognizer,ExecuteCommandHandler)
,#addRecognizerBinding
and#getRecognizerBindings
as well as the classKeyboardInputModeRecognizerBinding
has been removed.-
DropInputMode
has been redesigned to take ajavafx.scene.input.DataFormat
instead of an expected type to retrieve transfer data from a drag operation. Checking for expected (model item) types has been moved toItemDropInputMode
. As part of this redesign, the following API changes were made:3.0 3.1 DropInputMode#DropInputMode(Class)
DropInputMode#DropInputMode(DataFormat)
DropInputMode#getDropData(Dragboard)
DropInputMode#getDropData(Dragboard, DataFormat)
DropInputMode#adjustTransferMode(DragEvent)
DropInputMode#acceptDrag(DragEvent)
DropInputMode#onDragEntered(InputModeEventArgs)
DropInputMode#onDragEntered(DragEvent)
DropInputMode#onDraggedOver(InputModeEventArgs)
DropInputMode#onDraggedOver(DragEvent)
DropInputMode#onDragDropped(InputModeEventArgs)
DropInputMode#onDragDropped(DragEvent)
DropInputMode#onDragExited(InputModeEventArgs)
DropInputMode#onDragExited(DragEvent)
DropInputMode#createInputModeEventArgs()
DropInputMode#createInputModeEventArgs(DragEvent)
ItemDropInputMode#ItemDropInputMode(Class<T>, Class)
ItemDropInputMode#ItemDropInputMode(Class<T>, DataFormat)
NodeDropInputMode#NodeDropInputMode(Class)
NodeDropInputMode#NodeDropInputMode(DataFormat)
DropDataMap
property has been changed to accept null values. If theDropDataMap
isnull
, the DropInputMode classes will process the transfer data from the drag operation instead of querying theDropDataMap
for data.
Finally, the genericInputModeEventArgs
event type for drag entered, drag over, drag dropped, and drag left events has been replaced with the new event typeDragEventArgs
.
GraphML
-
GraphML reading is now more strict with regards to GraphML-renamings.
When reading a member of a serialized type with a corresponding
@GraphML(name = "NewName")
annotation, the GraphML reader previously accepted both the actual member name andNewName
. Now the GraphML reader will no longer accept the actual member name but only the annotatedNewName
. -
Added parameter of type
Class<T>
describing the target type to methodsIWriteContext#getCurrent
andIParseContext#getCurrent
.
Model
-
IGraph
and its implementations now always throw anIllegalArgumentException
for operations on elements which are not in the graph. (Previously, some of those methods threw anIllegalStateException
.)
Geometry
-
GeneralPath
no longer overwrites#equals
. To compare twoGeneralPath
instances as if they were values, use the#isEquivalentTo
method.
Layout
-
HierarchicLayout
may now place source/target labels in layers that contain common nodes. In previous versions such labels were always placed in separate layers which often led to less compact drawings with superfluous bends. -
SingleCycleLayout
: MethodNodeSequencer
now allows to specifynull
to return to the default sequencer. In previous versions, specifyingnull
leads to anIllegalStateException
. -
HierarchicLayout
: Geometry information registered with data providers with keysHierarchicLayout#ALTERNATIVE_GROUP_BOUNDS_DP_KEY
andHierarchicLayout#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. User that
Changes in Default Behavior
Viewer
-
Decorating the lookup of
GraphControl
orIGraph
to set theGraphMLIOHandler
used by the IO commands and convenience IO methods onGraphControl
is no longer supported. Use theGraphMLIOHandler
property onGraphControl
instead. -
CreateEdgeInputMode
now respects the settings#SnappingBendsToSnapLinesEnabled
and#SnappingBendAdjacentSegmentsEnabled
onGraphSnapContext
. It also handles grid snapping according to the configuration for snapping. -
CreateEdgeInputMode
will no longer cancel edge creation when using touch and trying to create a bend where#ValidBendHitTestable
returnsfalse
.
yFiles for JavaFX 3.0
General
Package structure
All classes have been reorganized into a new package hierarchy.
-
Generally all classes that relate to the graph structure can be found in
com.yworks.yfiles.graph
now, styles, including the void styles, are incom.yworks.yfiles.graph.styles
, label layout models are incom.yworks.yfiles.graph.labelmodels
, port location models are incom.yworks.yfiles.graph.portlocationmodels
. -
All classes related to GraphControl can now be found in
com.yworks.yfiles.view
. The animation and export related classes have been moved to this package as well. Input-related classes (e.g. input modes and supporting types) can be found incom.yworks.yfiles.view.input
. -
Layout classes can be found in
com.yworks.yfiles.layout
and its respective sub-packages.
Functionality moved to interfaces or base classes
-
ICanvasContext
: factory methods replace the removed classCanvasContext
. -
IInputModeContext
: factory methods replace the removed classSimpleInputModeContext
. -
ILookup
,IContextLookup
andIContextLookupChainLink
: factory methods were moved from the removed classLookups
. -
IContextLookupChainLink
: factory methods replace the removed propertiesHidingLookupChainLink
,FactoryLookupChainLink
andAddingLookupChainLink
. -
IEnumerable
(previouslyEnumerable
): factory methods replace the removed classesEmptyEnumerable
,CompositeEnumerable
andCompositeEnumerator
. -
IListEnumerable
: factory methods replace the removed classesEmptyListEnumerable
,ListEnumerable
andListEnumerableExtensions
. -
IEventRecognizer
: factory methods replace the removed classesEventRecognizers
,EventRecognizerExtensions
,EventRecognizerCallback
,Mouse2DEvents
,Touch3DEvents
andKeyEvents
. -
IArrow
: contains static members of the classArrow
. -
IAnimation
: factory methods replace the removed classesEasedAnimation
andParallelAnimation
.-
Animations
: factory methods replace the removed classesGeneralPathAnimation
. -
GraphAnimations
: factory methods replace the removed classesLayoutMorpher
,LayoutMorpherWrapper
,EdgeAnimation
,LabelAnimation
,NodeAnimation
andPortAnimation
.
-
-
ICommand
: contains members of the removed classesGraphCommands
,ApplicationCommands
,ComponentCommands
andNavigationCommands
. -
IPortCandidateProvider
: factory methods replace all existing implementations exceptAbstractPortCandidateProvider
. -
IEdgeReconnectionPortCandidateProvider
: factory methods replace all implementations. -
IHitTestable
: contain members of removed classHitTestable
. -
IMarqueeTestable
: contain members of removed classMarqueeTestable
. -
IVisibilityTest
: contain members of removed classVisibilityTest
. -
ICanvasObjectDescriptor
: contains members of the removed classCanvasObjectDescriptor
. -
IMapper
: contains members of removed classMappers
. -
IBoundsProvider
: contains members of removed classBoundsProvider
. -
The following classes have been removed:
OrientedRectangleExtensions
,PointExtensions
,RectangleExtensions
,SizeExtensions
,FoldingViewExtensions
,GeomExtensions
,GraphDecoratorExtensions
,GraphExtensions
,GroupedGraphExtensions
,MapperRegistryExtensions
,StripeExtensions
,LookupExtensions
,TableExtensions
,ParseContextExtensions
,WriteContextExtensions
,RenderContextExtensions
,RenderContextExtensions
andXmlWriterExtensions
. All methods of these classes are available on related interfaces as default methods. -
GraphItemTypes
: contains members of removed classGraphItemType
. -
Pen
: contains members of removed classPens
. -
DashStyle
: contains members of removed classDashStyles
.
Further general improvements
-
The naming of classes, members and parameters has been reviewed and now uses more consistent and intuitive names.
-
All methods that take a context parameter of type
ICanvasContext
,IRenderContext
,IInputModeContext
,IParseContext
,IWriteContext
,SnapContext
,GraphSnapContext
, orLabelSnapContext
now have that parameter as their first parameter. -
Some classes are now usable in try-with-resources statements since
IDisposable
now extends theAutoClosable
interface. -
Replaced many reference parameters with actual return values. Methods that returned a boolean value to indicate the validity of the reference parameter now return either a proper value or
null
if they could not provide one. Most prominent example of this change are the various#getTangent
methods inIPathGeometry
andGeneralPath
that now return aTangent
object. -
The return type of several methods has been changed from IEnumerator<T> to IEnumerable<T>, which has the benefit that those can now be consumed as streams.
Documentation
-
The Developer’s Guide has been completely revised. Now it consists of two parts: The first part covers the basics of yFiles for JavaFX, while the second part describes in detail how the behavior of the library can be adapted to the customer’s requirements.
Model
IGraph
-
Support for grouped graphs has been simplified to a large extent:
-
IGraph
now supports grouping by default. The#GroupingSupported
property has been removed fromDefaultGraph
. Grouping is now always enabled for graphs. -
The new property
#GroupingOperationsAllowed
onGraphEditorInputMode
allows for switching interactive grouping operations on or off. Grouping operations are disabled by default and have to be enabled explicitly if the input mode should support them. -
The grouping support interfaces
IGroupedGraph
andIHierarchy<T>
have been removed and folded withIGraph
. -
The property
IHierarchy<T>#Root
is no longer available. The root of a grouping hierarchy is now represented bynull
.
-
-
#createNode
,#createEdge
,#addLabel
,#addPort
: Ambiguous overloads were removed, missing overloads were added and parameters were ordered to be consistent throughout all overloads. -
#Nodes
,#Edges
,#Labels
and#Ports
: The type of these properties has been changed fromICollectionModel
toIListEnumerable
. To be notified of created or removed items, the correspondingIGraph
events should be used instead. -
#NodeLabels
and#EdgeLabels
: These properties have been replaced by default methods that delegate to the merged#Labels
property. -
#CollectionModel
and#Bends
have been removed together with the classesBendList
andListLabelCollection
. UseListEnumerable<IBend>
andListEnumerable<ILabel>
instead. -
IGraph
now provides events for property changes on model items, e.g.#NodeStyleChanged
and#NodeLayoutChanged
. Those events replace the dedicated change reporters available previously (e.g.INodeBoundsChangeReporter
,ILabelTextChangeReporter
) which have been removed. -
The signatures of event handlers throughout the
IGraph
API have been unified by usingEventHander
with appropriateEventArgs
. Exceptions are a few events that are raised very often which retain an argument list. -
#isLeaf
,#setLeaf
and related properties and events have been replaced by#isGroupNode
and#setIsGroupNode
which have the exact opposite meaning from the old ones. -
#addBend
: The signature has changed. The index parameter has been moved to the end. -
IGraphStructure
and its implementation have been removed, as well as the constructor ofDefaultGraph
that accepted anIGraphStructure
. -
IGraph
now extends theITagOwner
interface. Thus graphs now have a#Tag
property. -
DefaultGraph
now raises removal events for labels, ports and bends which are implicitly removed when their owner is removed. -
Various protected factory methods of
DefaultGraph
have been removed:#createNodeDefaults
,#createEdgeDefaults
and#createMapperRegistry
, amongst others. -
DefaultGraph#getBounds
has been removed. -
#UsingPortCandidateProvidersEnabled
has been removed from bothDefaultGraph
andGraphSettings
. Creating an edge using port candidate providers has to be done by manually querying the provider and calling#createEdge(IPort, IPort)
. -
Added convenience methods
#applyLayout
for arranging graph elements.
Folding
-
The
#expand
,#collapse
and#isExpanded
methods onIFoldingView
(previouselyIFoldedGraph
) now also work with nodes that belong to the master graph instead of the view graph. Thus the collapsed/expanded state can be set or queried for items that are currently not in the view graph. -
IFoldingView#isInitiallyExpanded
has been removed. -
FoldingManager
:#isInitiallyExpanded
,#setInitiallyExpanded
and#DefaultExpandedPredicate
have been removed. -
The interfaces
IChangeDummyNodeAppearanceCallback
,IChangeDummyEdgeAppearanceCallback
andIChangeLabeledItemAppearanceCallback
as well asFoldingManager#getChangeDummyAppearanceCallback
have been removed. The view state properties can now be changed directly on the view state implementations returned byFoldingManager#getFolderNodeState
andFoldingManager#getFoldingEdgeState
, respectively. -
Lots of other small changes around folding.
Labels
-
The property
ILabel#Layout
has been replaced by the new default method#getLayout
. -
The order of the parameters of
ILabelModel#getGeometry
has been changed toILabelModel#getGeometry(ILabel, ILabelModelParameter)
. -
The factory methods
FreeNodeLabelModel#createNodeCenterAnchored
andFreeNodeLabelModel#createNodeLayoutAnchored
have been removed. -
FreeNodeLabelModel#createDefaultParameter
now uses the label’s center as its anchor point. -
The new edge label models
EdgeSegmentLabelModel
andEdgePathLabelModel
have been added and replaceRotatingEdgeLabelModel
,SliderEdgeLabelModel
,SideSliderEdgeLabelModel
,RotatedSliderEdgeLabelModel
andRotatedSideSliderEdgeLabelModel
.-
EdgeSegmentLabelModel
allows to create parameters for a segment index and segment ratio. -
EdgePathLabelModel
creates parameters using a ratio of the edge path. -
The label model parameter of the edge label defaults now uses the
EdgeSegmentLabelModel
.
-
Ports
-
The property
IPort#Location
was removed since it was only a convenience method to access the location from theIPortLocationModelParameter
.-
To retrieve a live view of the location of a port, use the new default method
IPort#getDynamicLocation
. -
To retrieve a simple snapshot of the current location instead, use
IPort#getLocation
.
-
-
NodeScaledPortLocationModel
has been replaced byFreeNodePortLocationModel
that allows to specify the port location by a ratio of the node layout’s size and an additional offset. -
AnchoredPortLocationModel
has been removed.
Table
-
ITable
:-
The signature of
#createRow
and#createColumn
has changed. The index parameter has been moved to the end. -
The events
#StripeChanged
and#StripeRemoved
useStripeEventArgs
now. -
The event
#LabelRemoved
usesLabelEventArgs
now. -
The default methods:
#findColumn
,#findRow
and#getCellBounds
have been added.
-
-
Table
:-
The table’s lookup decorator can now decorate stripe labels, too.
-
The factory methods for the individual properties of
RowDefaults
andColumnsDefaults
have been removed. -
The methods
#removeUndoSupport
as well as some overloads of#createRow
,#createColumn
and#addLabel
have been removed. -
The new properties
#DefaultStripeLookup
,#DefaultColumnLookup
and#DefaultRowLookup
replace the removed classes with the same same.
-
-
TableExtensions
: method#getElementsToMove
has been removed -
IStripeDefaults
: the three argument constructor has been removed. -
IStripeSelection#SelectedStripes
has been removed. Use the individual properties for#SelectedRows
and#SelectedColumns
instead. -
StripeSelection
: the surplus overloads of#isSelected
and#setSelected
taking anIRow
orIColumn
have been removed. -
The default method
#placeNodeInCell
has been added toIGraph
to easily move a node into a specific table cell.
Undo support
-
IGraph
: default methods to enable or disable Undo support have been added. -
Setting the
#Tag
property on model items and the graph now works with Undo. -
Undo operations for the removal of graph elements now keep the proper item order. This improves the consistency especially for layouts between undo operations.
-
IGraph#beginEdit
:-
Overloads that work with
IMementoSupport
(either viaILookup
or anIMementoSupportProvider
) have been added. -
The overload that accepted an
IEnumerable
ofIModelItems
has been removed.
-
-
IUndoSupport
,MementoUndoUnit
,MementoUndoableEdit
andMementoStateStruct
have been removed. -
IUndoUnit
: the methods#canUndo
and#canRedo
have been removed. -
AbstractUndoUnit
: the methods#undoImpl
and#redoImpl
have been removed. Implementations should use#undo
and#redo
from theIUndoUnit
interface instead. -
UndoEndgine
: the properties#UndoText
and#RedoText
have been removed. -
IGraphUndoUnitSupport
has been removed. Its methods#create…UndoUnit
have been moved toDefaultGraph
as overridable methods. Developers who have created a custom implementation have to derive fromDefaultGraph
and override the corresponding method(s).
Geometry
Package com.yworks.yfiles.geometry
was purified:
-
The basic geometry types
PointD
,SizeD
,RectD
andInsetsD
have been made immutable. -
ImmutablePoint
,ImmutableSize
,ImmutableRectangle
andImmutableOrientedRectangle
have been removed. The immutable typesPointD
,SizeD
andRectD
as well as the immutable instance provided by the new static methodOrientedRectangle#createImmutable
can be used instead. -
IPointSetter
andISizeSetter
have been removed. Instead their prior sub interfacesIMutablePoint
andIMutableSize
are used. -
IReshapeable
has been removed. The various overloads of the#reshape
method have been implemented as default methods onIMutableRectangle
instead. -
IMovable
has been removed as well. Instead anIPositionHandler
can be used. -
PointD#fromPoint
,SizeD#fromSize
andRectD#fromRectangle
have been replaced by the default methodsIPoint#toPointD
,ISize#toSizeD
andIRectangle#toRectD
. -
Various other geometry-related classes and interfaces have been removed.
-
IOrientedRectangle
: the default method#getTopLeftLocation
has been added. -
The
OrientedRectangle.EMPTY
constant has been moved to theIOrientedRectangle
interface. -
ImmutableSize
: The static fields#UNBOUND
,#EMPTY
and#ZERO
have been added. -
Most of the static convenience methods in the geometry classes have been removed. Only a few basic methods such as the union operation on
RectD
and the vector arithmetic onPointD
remain.
View
Styles
-
Styles no longer implement
IModelItemInstaller
which simplifies certain custom style implementations. -
The style and style renderer hierarchies have been flattened:
-
IModelItemStyle
,ITaggedModelItemStyle
with subinterfaces as well as all subinterfaces ofINodeStyle
,IEdgeStyle
,ILabelStyle
andIPortStyle
have been removed. -
AbstractEdgeStyle
,AbstractStyleRenderer
,AbstractNodeStyleRenderer
,AbstractEdgeStyleRenderer
,AbstractLabelStyleRenderer
,AbstractShapedNodeStyleRenderer
,AbstractShapedLabelStyleRenderer
,VoidVisualStyle
andVoidStyleRenderer
have been removed. -
Abstract base class
AbstractTableNodeStyle
and classDynamicTableNodeStyle
have been removed and the funtionality has been merged with classTableNodeStyle
. -
ITableProvider
as well as its implementations have been removed and methodAbstractTableNodeStyle#getTable
has been moved to classTableNodeStyleRenderer
.
-
-
UserTagProvider
and all implementations have been removed. -
SimplePortStyle
has been removed. You can useNodeStylePortStyleAdapter
together with aShapeNodeStyle
instead. -
Removed superfluous constructors from all style implementations.
-
The generics of the classes
AbstractNode/Edge/Port/LabelStyle
(formerSimpleAbstractNode/Edge/Port/LabelStyle
) have been removed. For example the class parameter from the constructor and the generic type parameterTVisual extends IVisual
of the classes themselves have been removed. This means that the signature of the method#updateVisual
changed as well and overrides of this method have to cast theNode
parameter to the concrete type manually. -
All
IStyleRenderer
implementations: the public#Style
property has been reduced in accessibility to protected. -
All
IStyleRenderer
implementations: the public#Item
property has been reduced in accessibility to protected and named#Node
,#Label
,#Edge
or#Port
depending on the handled model item. -
ILabelStyleRenderer
implementations: the protected field#layout
has been removed and the accessibility of the public property#Layout
has been reduced to protected. -
Columns and rows don’t use node styles anylonger but got their own style classes:
-
The new interface
IStripeStyle
is used for styles visualizingIColumns
andIRows
. -
IStripeStyle
,IStripeStyleRenderer
and the implementorsAbstractStripeStyle
,NodeStyleStripeStyleAdapter
, andAbstractJComponentStripeStyle
have been added.
-
-
The class
TextFormat
and the corresponding propertyDefaultLabelStyle#TextFormat
have been removed. The properties ofTextformat
have been added onDefaultLabelStyle
instead and the enumTextWrapping
has been added. -
DefaultLabelStyle#Insets
has been added that can be used to define a distance between the label border and the label content via insets. Per default the style now uses insets with thickness 2 instead of 0. -
PathBasedEdgeStyleRenderer
: The scope of the factory methods#createRectangleSelfLoop
and#createRoundSelfLoop
has been reduced frompublic
toprotected
.
Visualization support
-
CSS support for visualizations of non-graph elements like indicators and decorations has been added. Those elements can be styled by inserting a style sheet into the scene that has definitions for certain style classes that address these decorations. For a detailed description, read the relating chapter in the Developer’s Guide.
-
Customizing the visualization via data templating has been refactored:
-
The new interface
IDataTemplate
replaced the abstract classDataTemplate
and is used to create and update ajavafx.scene.Node
very similar to theIVisualCreator
interface. In contrast toIVisualCreator
it takes the data object to visualize as well as its bounds as additional parameter information. -
The
DataTemplate
class with its context-free#creatInstance
method as well as its subclasses have been removed.
-
-
GraphModelManager
: The protected factory methods that supplied the initial value for the#*Installer
properties (#EdgeStyleInstaller
,#NodeStyleInstaller
, etc.) have been removed. -
GraphModelManager#invalidate
has been removed. -
Added a mechanism to support disposing and caching the
Node
which is created byIVisualCreator#createVisual
:-
IRenderContext
:#setDisposeCallback
,#childVisualRemoved
and#registerForChildrenIfNecessary
have been added to support the registration of a callback for disposal. -
Added the interface
IDisposeVisualCallback
for this purpose.
-
-
VisualGroup
is now managed and autosizes its children. This allows to add arbitraryJavaFX
controls without the need to layout them manually. -
IRenderContext#getCanvas
has been pulled up toICanvasContext
and renamed to#getCanvasControl
. -
IInputModeContext
now extendsICanvasContext
so its#getCanvasControl
was removed. -
IRenderContext#Transform
has been removed -
Class
RenderContext
was replaced by the factory methodContextConfigurator#createRenderContext
. -
DefaultEdgePathCropper
now uses the new method#handleEmptyPath
if cropping the edge would result in an empty path. Per default this method only crops at the ports. -
DefaultEdgeIntersectionCalculator
: the callback method#getNodeGeometry
has been added. -
ModelManager#CanvasObjectGroupProviderCallback
has been replaced with#getCanvasObjectGroup
.ItemModelManager#CanvasObjectGroupProviderCallback
has been replaced by#CanvasObjectGroup
and the virtual method#getCanvasObjectGroup
. The default implementation just defers to the property, just like#getDescriptor
. -
ItemModelManager#invalidate
has been removed. -
IGroupAction
as well asICanvasObjectGroup#getGroupAction
have been removed as they had hardly any use. -
ICanvasGroupProvider
and the delegateCanvasObjectGroupProviderCallback
have been removed. Accessing the individual canvas object groups can be done via the properties ofCanvasControl
instead. -
ICanvasObjectTreeEventSource
as well as the corresponding classesCanvasObjectAddEventArgs
,CanvasObjectRemoveEventArgs
,CanvasObjectMoveEventArgs
andCanvasObjectInvalidateEventArgs
have been removed. -
ScrollBarVisibility
has been replaced by the JavaFX enumScrollPane.ScrollBarPolicy
.
Input Modes (General)
-
The type hierarchy for input modes has been simplified considerably:
-
All input modes except
OverviewInputMode
,GraphViewerInputMode
andGraphEditorInputMode
now directly implementIInputMode
without any abstract base classes in between. -
IConcurrentInputMode
has been merged intoIInputMode
. The property#Enabled
has been removed but is still present on all concrete implementations. -
All abstract input mode base classes except
AbstractInputMode
have been removed.AbstractConcurrentInputMode
has been merged intoAbstractInputMode
. -
AbstractInputMode
:#requestMouse
,#requestTouch
,#releaseMouse
and#releaseTouch
have been combined in#requestPointer
and#releasePointer
-
StateMachineInputMode
as well as all state machine related classes has been removed. Input modes now no longer have protected methods for state machine transitions but instead those methods are mostly parameterless now.
-
-
Input mutex handling has been refactored considerably:
-
IInputMode#ConcurrencyController
has been removed. Input modes now get aConcurrencyController
as parameter of their#install
method. -
The
ConcurrencyController
has been refactored and is now only responsible for a single input mode. Its property#Active
indicates if it currently has or may request the mutex. -
InputMutex
has been removed. -
The property
PreferredCursor
has been moved fromIInputMode
toConcurrencyController
. -
The input mutex should be requested and released using the according methods on
ConcurrencyController
. Most input modes don’t provide the methods#hasMutex
,#canRequestMutex
,#requestMutex
and#releaseMutex
anymore. -
The property
IInputMode#Enabled
is not set to false anymore if another input mode acquires the mutex. Instead theirConcurrencyController
is deactivated. This provides a clear separation between suppressing input modes (while another mode holds the mutex) and explicitly disabling a mode from code (via the#Enabled
property). -
As a consequence most input modes don’t provide the event
#EnabledChanged
and the protected methods#onEnabled
and#onDisabled
anymore, but#onConcurrencyControllerActivated
and#onConcurrencyControllerDeactivated
instead.
-
-
IInputMode#Priority
has been added which defines the installation priority of the input mode. It replaces the corresponding properties onGraphViewerInputMode
,GraphEditorInputMode
andTableEditorInputMode
which previously defined the installation order. -
All input modes no longer raise
#Stopped
and#Canceled
events. Developers who want to get notified when an input mode gets stopped or canceled have to override the methods#onStopped
and#onCanceled
. The events#Initializing
and#Initialized
have been removed as well. Input modes that need to perform one-time initialization on first#install
can keep track of that themselves. -
MultiplexingInputMode
:-
#addConcurrent
as well as the overload of#add
that takes an additional priority parameter have been removed. There is only the#add
method left that takes an input mode as its only parameter. -
Priority is now determined by the input mode’s
#Priority
property. -
Whether an input mode runs exclusive or always active alongside other input modes is determined by the input mode’s
ConcurrencyController
which has an#Exclusive
property controlling that. -
The mode is now aware of changes to the priority of already installed input modes and will update the installation order accordingly when an input mode’s priority is changed.
-
-
IInputMode
implementations:-
The setter for properties
#Graph
and#GraphSelection
, if present, and its associated#set*
methods have been removed. Both are now always retrieved from the input mode context. -
The read-only property
#InputModeContext
has been introduced to expose theIInputModeContext
the mode is installed in.
-
-
The Command mechanism has been refactored:
-
Classes
Command
,CommandBinding
,CommandManager
and related as well as the related properties onCanvasControl
have been removed from public API. All commands are now handled by interfaceICommand
and theKeyboardInputMode
using the new methods#addCommandBinding
,#addKeyBinding
and#addRecognizerBinding
. -
KeyboardInputMode
has been refactored: interaction with keys recognized by this input mode are now handled by commands solely.
-
GraphEditorInputMode and GraphViewerInputMode
-
GraphViewerInputMode
andGraphEditorInputMode
have been made more similar regarding customization in the capabilities they both provide:-
GraphViewerInputMode
now supports the same click and selection behavior asGraphEditorInputMode
. This includes detail selection (Shift+Click
) and cyclic selection (Alt+Click
) as well as finer control over behavior like the property#ClickSelectableItems
and the method#shouldClickSelect
. -
The methods
#click
and#doubleClick
now take anIModelItem
andClickEventArgs
as arguments and have no return value. Instead of returning a boolean, the property#Handled
on theClickEventArgs
should be set. -
Their
#ClickInputMode
now delivers both left and right clicks. -
The default click actions that change the selection and create new nodes are now only triggered on left mouse clicks.
-
The new property
#DoubleClickHitTestOrder
provides an explicit hit test order for double clicks. By default, this hit test order prefers labels over other graph elements. -
GraphViewerInputMode
now also has the property#AvailableCommands
already known fromGraphEditorInputMode
orNavigationInputMode
. -
Several child input mode priorities in
GraphViewerInputMode
have been changed and most of them now have the same priorities as inGraphEditorInputMode
. -
The new event
#CanvasClicked
reports clicks on an empty canvas location. -
The new property
#SelectablePredicate
allows finer control over what particular items should be selectable without the need to create a custom subclass. -
The new method
#createSelectionEventArgs
createsSelectionEventArgs
using the#GraphSelection
. -
The events
#MultiSelectionStarted
and#MultiSelectionFinished
now useSelectionEventArgs<IModelItem>
. -
By default, graph items styled with a void style (
VoidNodeStyle
,VoidEdgeStyle
,VoidLabelStyle
andVoidPortStyle
) are not selected or focused anymore. The new property#VoidStylesIgnored
specifies whether this feature is enabled. -
GraphViewerInputMode
now has improved support for marquee selection. Marquee selection is no longer turned on or off via#MarqueeSelectableItems
but instead directly on theMarqueeSelectionInputMode
. The recognizer for marquee selection isShift+Drag
and the child input mode priorities have been adjusted accordingly so that marquee selection and viewport movement can co-exist. The sub-input mode still defaults to being disabled, though. -
GraphViewerInputMode
now also has aKeyboardInputMode
. -
GraphViewerInputMode
now allows copying items (including the convenience methods) and handles the commands appropriately.
-
-
Improved functionality of
GraphEditorInputMode
-
Changing the property
#ShowHandleItems
will now immediately update the currently visible handles. -
The new property
#DeletablePredicate
allows finer control over what particular items should be deletable without the need to create a custom subclass. -
The new property
#OrthogonalBendRemovalEnabled
toggles the new support for deleting bends in a way that an orthogonal edge remains orthogonal after removing the bends. -
A new default action for duplicating single graph items or whole subgraphs is provided. 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
ICommand#DUPLICATE
(shortcut:Ctrl-D
) and the new methodGraphClipboard#duplicate
can be used to duplicate selected items without altering the clipboard contents.GraphClipboard#adjustGroupNodeBounds
adjusts the bounds of parent nodes of pasted or duplicated nodes. -
A new default action for reversing edges is provided. To this end, the methods
#reverseEdge
,#reverseEdges
and#reverseSelectedEdges
have been added toGraphEditorInputMode
and the command#REVERSE_EDGE
(shortcut:Ctrl-R
) toICommand
. -
Support for cyclic click selection was added. This helps in conveniently selecting items that are hidden behind other items. By default, this features is bound to the
Alt
key being pressed. It can be disabled by setting the#CyclicSelectionRecognizer
property toIEventRecognizer#NEVER
. -
The property
#ReparentToLeavesAllowed
was added. When enabled, leaf nodes can be the target of a reparenting gesture in which case they are converted into group nodes. -
The new protected method
#shouldSelect
can be overridden to determine whether an item can be selected in general. -
The new events
#LabelAdding
and#LabelEditing
were added. Those allow fine-grained control over adding or editing labels and tie into the existing functionality provided byIEditLabelHelper
.
-
-
Cleanup of the old
GraphEditorInputMode
API:-
The type of the property
#OrthogonalBendRemoval
has been changed fromboolean
toOrthogonalEdgeEditingPolicy
. -
The events
#DeletingSelection
and#DeletedSelection
now useSelectionEventArgs<IModelItem>
. -
The constructor that take additional
IGraph
andIGraphSelection
arguments have been removed, as well as the protected methods#setGraph
,#setGraphControl
,#onGraphChanged
and the protected setter for the property#GraphSelection
. Instead, theIGraph
instance is now always taken from the#InputModeContext
and can’t be changed after the mode is installed. -
The method
#createDefaultLabelConfiguration
has been removed -
The method
#marqueeSelect<T>(RectD,IEnumerable<T>)
has been removed. -
The property
#SelectionModel
has been removed. Instead the property#GraphSelection
is used. -
The properties
#CollectionModel
and#GraphInputModeController
have been removed. -
The method
#findItem
has been removed. An additional overload of#findItems
without the context parameter has been added. To replicate the previous behavior of#findItem
,#findItems
can be called and the first element taken from the resulting enumeration. -
The method
#shouldBeMovableForMoveInputMode
has been removed.
-
-
Improved
GraphViewerInputMode
API:-
Added support for the
ICommand#COPY
. -
Added support for multi-selection via
Ctrl+Click
and marquee selection. The latter is disabled by default. -
The click hit test order can now be configured by property
#ClickHitTestOrder
. -
By default, clipboard commands are now disabled. This can be controlled with the new property
#ClipboardOperationsAllowed
. -
The event
#ItemSelected
has been removed.
-
CreateEdgeInputMode
-
CreateEdgeInputMode
was refactored and streamlined:-
Orthogonal edge creation will be automatically enabled if orthogonal edge editing is enabled on the containing
GraphEditorInputMode
. -
Property
#ConnectingToCandidatesOnlyEnabled
was removed. Now edge creation always uses port candidates. -
The creation callbacks
#NodeBasedEdgeCreationCallback
and#PortBasedEdgeCreationCallback
have been replaced by the new#EdgeCreator
which is port-based. -
The methods
#getSourcePortOwner
,#getTargetPortOwner
,#getSourceNode
and#getTargetNode
have been replaced by#getSource
and#getTarget
. -
The properties
#SourcePortCandidate
and#TargetPortCandidate
now have public setter. -
The methods
#determineEdgeStyle
,#assignSourcePortPosition
,#assignEdgeStyle
as well as the property#EdgeStyle
have been removed. Instead the new#EdgeDefaults
property can be used to customize the new edge. -
Property
#UsingHitNodeTargetCandidatesOnlyEnabled
was replaced by the new property#UsingHitItemsCandidatesOnlyEnabled
. -
The type of the property
#OrthogonalEdgeCreationEnabled
has been changed fromboolean
toOrthogonalEdgeEditingPolicy
. -
The new property
#DummyEdgeGraph
is used to create the dummy edge that visualizes the edge during creation. -
The preview edge which is displayed during edge creation now shows the edge as it will be created, i.e. the preview edge has the same style, port visualization, and labels as the created edge will have.
-
The property
#SnapToTargetCandidateOwner
has been removed. The preview edge now is always being cropped at the candidate owner’s borders. -
A new property
#CancelGestureOnInvalidTarget
has been added that makes it possible to cancel the gesture immediately if ended on an invalid target. -
#assignBends
has been removed and its functionality folded into the default#EdgeCreator
implementation. -
The methods
#isPortCandidateResolutionEnabled
,#isValidEnd
,#isValidBegin
,#isCancelGesture
,#isBendCreationEnforced
,#isValidBend
,#isSourceNodeDraggingFinished
,#isRemoveBendEvent
have been removed. The corresponding event recognizer can be used instead to customize the behavior. -
#createBend(PointD)
,#startCreateEdge
,#onTargetLocationChanged
,#getNodes
,#NodeComparer
and#PortOwnerComparer
have been removed.
-
Other InputModes
-
AbstractContextMenuInputMode
: Support for different context menu trigger events has been added. Currently only mouse (right-click) and keyboard (Shift+F10
, application / context menu key) are distinguished, more may be added in the future. The source can be queried from the property#EventSource
inPopulateMenuEventArgs
andPopulateItemContextMenuEventArgs
. -
An additional eventSource parameter has been added as well to the constructors of
PopulatePopupMenuEventArgs
andPopulateItemPopupMenuEventArgs
as to the overload ofAbstractContextMenuInputMode#onPopulateMenu
which takes a context menu. -
ClickInputMode
:-
The property
#ValidClickHitCursor
has been added. This cursor is used when hovering over a valid hit region. -
The new method
#preventNextDoubleClick
can be used in event handlers for single clicks to prevent that this click can become part of a double click event. -
If
#ActiveButtons
includesMouseButtons#RIGHT
andClickInputMode
's event handlers mark the corresponding click event as handled, the original right click event is marked as handled as well. Especially, no context menu will be shown if the right click is handled byClickInputMode
itself.
-
-
CreateBendInputMode#CancelEventRecognizer
has been removed. -
HandleInputMode#Active
has been removed. The mode can be manually deactivated using the property#Enabled
instead. -
HandleInputMode#arm
now has a handle parameter for the handle that is under the mouse cursor. -
The class
ItemDropInputMode
is a newDropInputMode
that facilitates subclasses that 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. -
In
NodeDropInputMode
, callback#NodeCreator
, event#NodeCreated
and method#getDraggedNode
have been removed. The callback#ItemCreator
, event#ItemCreated
and property#DraggedItem
from superclassItemDropInputMode
should be used instead.
-
-
NodeDropInputMode
can now optionally drop nodes onto leaf nodes and thus convert the leaves into group nodes. It is also 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. -
ItemHoverInputMode
is a newIInputMode
that fires events when the mouse enters or leaves the visualization of a graph item. -
OverviewInputMode
:-
The mode now extends
MultiplexingInputMode
. -
It 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 new property
#Margins
specifies margins for the visible area of the boundGraphOverviewControl
. The new protected method#updateVisibleArea
provides further means for customizing the visible area.
-
-
MarqueeSelectionInputMode
:-
The events
#DragStarting
,#DragStarted
,#Dragging
,#Dragged
,#DragFinishing
,#DragFinished
,#DragCanceling
andDragCanceled
now useMarqueeSelectionEventArgs
that provide the current selection rectangle. -
The event
#MarqueeSelected
has been removed. The event#DragFinished
can be used instead. -
Property
#LastModifierState
has been removed.
-
-
MoveInputMode
:-
The new event
#QueryPositionHandler
queries anIPositionHandler
each time a drag is started. -
The property
#AffectedItems
has been added which can be used to get a collection of items currently being moved. -
Mouse hovers with the
Shift
key held down again are now accepted.
-
-
MoveViewportInputMode
: Mouse cursor handling is now also done by protected methods#arm
and#disarm
, similar to other input modes. -
MultiplexingInputMode
:#ChildController
and#createChildConcurrencyController
have been removed. -
TableEditorInputMode
:-
The new events
#LabelAdding
and#LabelEditing
allow fine-grained control over adding or editing labels and tie into the existing functionality provided byIEditLabelHelper
. -
The events
#DeletingSelection
and#DeletedSelection
now useSelectionEventArgs<IStripe>
. -
The property
#AllowMixedSelection
has been moved here from the removed classCompositeStripeSelection
.
-
-
WaitInputMode#getMultiplexingInputMode
has been removed. -
TextEditorInputMode
: The events#EditingStarted
,#EditingCanceled
and#TextEdited
now useTextEventArgs
. -
TextEditorInputMode
: The properties#StopRecognizer
,#CancelRecognizer
and#LineBreakRecognizer
have been added which allow for easy customization of the key gestures used to add new line breaks and to cancel or stop the text editing.
Label Editing
-
IEditLabelHelper
was refactored:-
#addLabel
and#editLabel
were replaced by the methods#onLabelAdding
and#onLabelEditing
which take the newLabelEditingEventArgs
as only argument. -
Adding labels now can, depending on event handlers for
LabelAdding
orIEditLabelHelper
implementations, optionally edit existing labels instead. This is similar to how editing labels can also add labels, e.g. if no labels are present on an item. -
The method
IEditLabelHelper#configureTextEditorInputMode
has been removed. It has been replaced by the propertyLabelEditingEventArgs#TextEditorInputModeConfigurator
. -
The customizations possible from
IEditLabelHelper
are the same as those from the#LabelAdding
and#LabelEditing
events onGraphEditorInputMode
andTableEditorInputMode
.IEditLabelHelper
is conceptually used as another event handler for those events. -
The property
#Owner
of the implementing classEditLabelHelper
has been removed, along with the respective constructor. The label owner can usually be queried from theLabelEditingEventArgs
. Custom subclasses can of course still opt to store the item they were created for and use that field.
-
-
The label that is edited respectively the label owner for which a label is added 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 condition mentioned above 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 no such label exists, a new label is added, provided that the owner allows adding. In either case, no other candidates are tried.
-
If there are multiple selected labels, the first selected label for which the previous condition is satisfied is edited.
-
If multiple label owners are selected, the first owner that has a label for which the previous condition is satisfied is chosen and that label is edited.
-
If
IEditLabelHelper#editLabel
for either an editable label or its owner provides a different label instance, this instance is edited instead. -
Otherwise, a label is added if an eligible owner can be found.
-
-
If an
IEditLabelHelper
implementation is present in anILabeledItem
's lookup, its#addLabel
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 return true, whether edit helpers are present or not. If the new label should be edited interactively after it’s creation (the default behavior), it also must be editable, following the rules above. Therefore anIEditLabelHelper
implementation usually should allow editing of label instances that it has created itself in#addLabel
. -
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#HidingLabelDuringEditingEnabled
. -
GraphEditorInputMode
andTableEditorInputMode
provide new events#LabelTextEditingStarted
and#LabelTextEditingCanceled
that are raised directly before the label text editor is shown and after the label editing has been canceled, respectively. -
Double clicking nodes and edges now opens the label editor. An existing label can be double clicked to edit the label text. This feature can be disabled with the property
GraphEditorInputMode#EditLabelOnDoubleClickAllowed
. -
IEditLabelHelper
implementations provided by theILabel
's lookup can now be used to forbid or customize the editing of individual labels. ClassLabelDecorator
provides a new property#EditLabelHelperDecorator
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.
-
Snapping
-
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
. -
SnapContext
:-
A
boolean
parametersnappingDisabled
has been added to the methods#handleMove
and#dragFinished
. This parameter has to be set totrue
to handle moves or finish a drag when snapping is temporarily disabled. This replaces the call toSnapContext#disableSnapping
. -
The events
#Initializing
,#Initialized
and#CleanedUp
as well as associated methods now useInputModeEventArgs
. -
#VoidInstance
has been removed.
-
-
GraphSnapContext
:-
The return type of
#getMovementInfos
has been changed toIListEnumerable<MovementInfo>
and the classesNodeMovementInfo
,PortMovementInfo
,BendMovementInfo
andEdgeEndMovementInfo
have been removed. -
The info parameter’s type of
#addEdgeEndToBeMoved
has been changed to the more generalMovementInfo
. Aboolean
parameter atSource has been added. -
The methods
#addSameWidthEntries
and#addSameHeightEntries
now return anIListEnumerable<RectD>
containing the rectangles whose widths respectively heights are closest to the given size. The parametersresultingSize
andrects
have been removed.
-
-
IEdgeSnapResultProvider
:-
The methods
#initializeSnapping
and#cleanupSnapping
have been removed. -
The info parameter’s type of
#CollectSnapResults
has been changed toIListEnumerable<MovementInfo>
.
-
-
SnapResult
now has more factory methods. The classSnapLineSnapResult
has been replaced by a factory method as well. -
The Classes
SnapLineContainer
,SingleLineSnapLineContainer
,EdgeSegmentSnapLineContainer
,FixedDistanceSnapLineContainer
andInBetweenSnapLineContainer
have been removed.
Clipboard
-
GraphClipboard
has been improved:-
GraphClipboard
can be customized easier now. The filter factory#createDefaultCopyFilter
takes the graph the copy filter is for. For the duplicate actions the new#createDefaultDuplicateFilter
method and the property#DuplicateCopier
can be used. Copied labels now use the model parameter returned by the callback#getLabelModelParameter
. -
The new properties
#CopyItems
,#IndependentCopyItems
and#DependentCopyItems
allow for restricting the types of items that can be copied at all, independently from their owners, or implicitly through their owners, respectively. -
The various protected
#adjustPosition
methods have been removed, as applying the#PasteDelta
is now done byGraphCopier
. -
The property
#ClipboardContext
has been removed.
-
-
The
#copy
methods inGraphCopier
now have a newPointD
offset parameter that shifts nodes and bends by a given amount upon copying them. -
The signature of
IClipboardIdProvider#getId
has changed. The context parameter has been moved to the front.
Other input related changes
-
Events
-
The properties
#LastMouse2DEventArgs
and#LastEventLocation
have been removed from all input modes. Instead, the properties#LastMouse2DEventArgs
and#LastEventLocation
onCanvasControl
can be used. -
EdgeEventArgs
now also contains the owner of the source and target port. -
ItemClickedEventArgs
now also contains the location of the click. -
StripeEventArgs
now also contains theITable
for this event . -
OrthogonalEdgeEditingContext
: The events#Initializing
,#Initialized
and#CleanedUp
as well as associated methods now useInputModeEventArgs
.
-
-
Keyboard Shortcuts have been changed:
-
Ctrl+O
is now bound toICommand#OPEN
. -
Ctrl+S
is now bound toICommand#SAVE
. -
Ctrl+Ins
is now bound toICommand#COPY
. -
Shift+Ins
is now bound toICommand#PASTE
. -
Shift+Del
is now bound toICommand#CUT
. -
Ctrl+PageDown
is now bound toICommand#MOVE_FOCUS_PAGE_DOWN
. -
Ctrl+PageUp
is now bound toICommand#MOVE_FOCUS_PAGE_UP
. -
Shift+PageDown
is now bound toICommand#SELECT_TO_PAGE_DOWN
. -
Shift+PageUp
is now bound toICommand#SELECT_TO_PAGE_UP
. -
ICommand#ADJUST_GROUP_NODE_SIZE
now always processes the nodes in bottom to top order instead of using the order in which the nodes were selected -
The default keyboard shortcut for deselecting elements (
ICommand#DESELECT_ALL
) has been changed toCtrl+Shift+A
.Ctrl+D
is now the default shortcut for duplicating selected elements (ICommand#DUPLICATE
). Duplicating elements can be disabled viaGraphEditorInputMode#DuplicateAllowed
.
-
-
For MacOS, shortscuts using the
CTRL
key now work with theCOMMAND
key instead.-
ModifierKey
: the enum value#SHORTCUT
has been added. -
KeyEventArgs
: the property#ShortcutDown
has been added. -
IEventRecognizer
: the static fields#SHORTCUT_DOWN
,#SHORTCUT_UP
and#SHORTCUT_PRESSED
have been added.
-
-
Touch3DEvent
: The modifier keys that are pressed during a touch event are now provided by the#Modifiers
and#ChangedModifiers
properties. -
All hit-testing methods as well as the methods in
IPortSelectionTester
andIBendSelectionTester
now take anIInputModeContext
instead ofICanvasContext
as their context parameter -
IPositionHandler
andIHandle
implementations no longer also implementIPoint
. -
IPositionHandler#setPosition
has been removed. The interface is now used as flagging interface only. -
The classes
DefaultPositionHandler
andPointHandle
have been removed -
INodeCreationCallback#createNode
now has aparent
parameter which can be used as the parent node for creating a new node.GraphEditorInputMode
tries to find a group node at the click location to pass as parent to the#NodeCreator
. -
Opening a context menu from the keyboard no longer uses the last known mouse pointer location for opening the context menu. Instead, the current selection or the current item are used.
-
IPortCandidateProvider
: The two method overloads#getSourcePortCandidates
and#getTargetPortCandidates
that had anIEdge
parameter have been removed. -
The property
AbstractPortCandidateProvider#PortOwner
has been removed, along with the methods that made use of it. -
AbstractPortCandidateProvider
: create overloads of#createCandidate
taking anIPort
and optionally anIPortLocationModel
have been removed. -
DefaultPortCandidate
: a constructor overload taking thePortCandidateValidity
additionally has been added. -
OrthogonalEdgeEditingContext#addMovedEdgeEnd
: The type of the parametermovementInfo
has been changed to the more generalMovementInfo
. Aboolean
parameteratSource
has been added. -
PortRelocationHandle
: The method#configureDummyEdge
has been folded into#createDummyEdge
. -
The methods
IDragHandler#handleMove
andIReshapeHandler#handleReshape
don’t return anymore whether they had a visual effect. -
The classes
InputModeController
andGraphInputModeController
have been removed. -
The abstract class
EdgeEndMoveHandle
has been removed. -
The
StateMachine
class as well as the delegatesStateHandler
andTransitionHandler
have been removed. -
When the command
ICommand#DELETE
is executed when editing a table and some graph items are selected together with a stripe all selected items (including the stripe) will be deleted (was: only the stripe was deleted). -
The classes
FilteredCollectionModel
andCancelEventArgs
have been removed.
CanvasControl and GraphControl
-
CanvasControl
:-
The new property
#LastEventLocation
always contains the location of the last mouse event. -
The property
#MouseWheelBehavior
taking a value of typeMouseWheelBehaviors
replaces the previous property#AutoMouseWheelZoomEnabled
. -
The scroll bars now scroll 5 view units per unit scroll (was 1 world unit) and 90 % of the visible width/height per block scroll (was 50 %).
-
The methods
#add
,#addCreator
,#addGroup
and#addGroupToGroup
have been removed as the new methods#addChild
and#addGroup
ofICanvasObjectGroup
provide a more intuitive way to add child elements to e.g. theGraphControl#getBackgroundGroup
. -
The property
#InputModes
has been removed. Developers who want to install multiple input modes on aCanvasControl
have to set aMultiplexingInputMode
asCanvasControl#InputMode
and add their input modes to that mode. -
The properties
#AllMouseInputCapturingEnabled
and#AllTouchInputCapturingEnabled
have been combined in property#AllPointerInputCapturingEnabled
. -
The properties
#OnCompoundKeyReleased
,#onCompoundKeyTyped
and#onCompoundKeyPressed
have been added. -
The property
#collectCanvasObjects
has been removed. -
The method
#renderContent
was removed. Despite its name this method wasn't used to render the content.
-
-
GraphControl
:-
The
#ContentRect
will now also be updated when creating edges, adding, editing or moving labels or deleting all graph item types. -
The methods
#openFile
,#saveFile
and#saveFileAs
have been reduced in accessibility to protected. The respective commands should be used instead of calling those methods. -
The commands
ICommand#CUT
,ICommand#COPY
andICommand#PASTE
are no longer handled and the respective convenience methods have been removed as well. Command bindings for#COPY
are still supplied byGraphViewerInputMode
andGraphEditorInputMode
. Command bindings for#CUT
and#PASTE
are still supplied byGraphEditorInputMode
. -
The commands
ICommand#UNDO
andICommand#REDO
are no longer handled and the respective convenience methods have been removed as well. Command bindings for#UNDO
and#REDO
are still supplied byGraphEditorInputMode
. Furthermore, the respective methods can still be called on theUndoEngine
directly. -
Property
#UndoabilityEnabled
has been removed. The commandsICommand#UNDO
andICommand#REDO
can be enabled on theGraphEditorInputMode
. -
Property
#ClipboardEnabled
has been removed. The clipboard commands can be enabled on theGraphEditorInputMode
. -
Method
#getUndoEngine
has been removed. The currentUndoEngine
can be retrieved from theGraphControl#Graph
. -
Event
#SelectionChanged
has been removed. -
Added convenience methods
#morphLayout
for arranging graph elements in an animated fashion. -
Added a convenient way to set a custom
GraphMLIOHandler
to aGraphControl
. Previously the lookup of the class needed to be decorated.
-
-
Most of the properties of the classes
CanvasControl
,GraphControl
andGraphOverviewControl
now have correspondentJavaFX
properties for databinding and events previously reporting their changes have been removed.
GraphML
The XML namespaces and GraphML naming conventions have been updated. The mapping from yfiles classes to the corresponding XML namespaces has been changed, as well as some of the naming conventions:
-
All platform independent model classes are now mapped to
http://www.yworks.com/xml/yfiles-common/3.0
. This includes the following packages:-
com.yworks.yfiles.graph
-
com.yworks.yfiles.graph.labelmodels
-
com.yworks.yfiles.graph.portlocationmodels
-
com.yworks.yfiles.graph.styles.common
-
com.yworks.yfiles.markup.common
-
-
All platform independent graphml support classes are now mapped to
http://www.yworks.com/xml/yfiles-common/markup/3.0
. This includes the following packages:-
com.yworks.yfiles.markup.system
-
-
All platform independent framework classes are now mapped to
http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0
. This includes the following classes:-
primitive types (
int
,double
,boolean
,char
) -
java.lang.String
-
-
All types and members in these namespaces use the WPF naming convention in GraphML files:
-
WPF type and property names (if applicable)
-
UpperCamelCase for properties, fields, constants and enum members
-
-
All platform dependent library classes are now mapped to
http://www.yworks.com/xml/yfiles-java-fx/3.0/xaml
. This includes the following packages:-
com.yworks.yfiles.styles
-
com.yworks.yfiles.markup.platform.java
-
-
All types and members in this namespace use the native naming convention in GraphML files:
-
actual type and property names (if applicable)
-
UpperCamelCase for properties
-
UPPERCASE_UNDERSCORE for fields, constants and enum members
-
-
The performance of parsing GraphML files has been improved. The speed-up is especially notable for large graphs with several thousands of nodes.
-
The following events have been added to signal the end of the write or parse process, respectively:
GraphMLIOHandler#Parsed
,GraphMLParser#Parsed
,GraphMLIOHandler#Written
,GraphMLWriter#Written
, together with the corresponding event raiser methods. -
SerializationProperties
:-
The new property
#ParseLabelSize
optionally disables parsing of the preferred size of a label. -
#DISABLE_USER_TAGS
changed its type fromTypedKey<boolean>
toTypedKey<GraphItemTypes>
. -
#DISABLE_STRIPE_USER_TAGS
changed its type fromTypedKey<boolean>
toTypedKey<StripeTypes>
. -
#WRITE_GRAPH_SETTINGS
and#DISABLE_GRAPH_SETTINGS
have been merged to a single#DISABLE_GRAPH_SETTINGS
property which is interpreted according to the context where it is set. -
#INDENT_OUTPUT
has been added that allows to define whether the XML output should be properly indented.
-
-
A few abstract base classes have been merged:
-
AbstractXmlWriter
andDirectXmlWriter
have been merged intoXmlWriter
. -
AbstractMapperInputHandler
andComplexMapperInputHandler
have been merged intoMapperInputHandler
. -
AbstractMapperOutputHandler
andComplexMapperOutputHandler
have been merged intoMapperOutputHandler
.
-
-
TypeConverter
and all subclasses have been removed and were replaced either byValueSerializer
s or by implementations of the new interfaceIMarkupExtensionConverter
. -
The generic types of collection properties are now better (de-)serialized. To achieve this, method
PropertyInfo#getPropertyType
now returns aType
instead of aClass
. -
The legacy interface
IDeserializer
and all implementations have been removed. For custom deserialization an event handler forGraphMLIOHandler#HandleDeserialization
can be used. -
The legacy interface
ISerializer
and all implementations have been removed. For custom serialization an event handler forGraphMLIOHandler#HandleSerialization
can be used. -
ArrayValueSerializer
andNullXmlWriter
have been removed. -
IXamlNameMapper
has been refactored:-
The methods
#addMapping
have been removed -
The method
#getXmlNamespace
has been removed -
The return type of
#getName
has been changed fromString
toXmlName
, so theXmlNamespace
of a type can be retrieved viaXmlName#getXmlNamespace
.
-
-
QueryOutputHandlersEventArgs
: The overload of#addOutputHandler
taking an object id has been removed -
XmlWriter
: constructor overloads taking aboolean
parameterindent
have been added that allow to define whether the XML output should be properly indented. -
XmlWriter
: the constructor overload taking anInternalXmlWriter
as well as the corresponding property#DelegateWriter
have been removed. -
GraphMLSerializationMode
has been removed. TheGraphMLMemberVisibility
can be used instead. -
The annotations
ContentProperty
,ValueSerializer
andSingletonSerialization
have been replaced by corresponding properties on annotationGraphML
. AnnotationMarkupExtensionReturnType
has been removed.
Utility classes
-
Removed a lot of utility classes and interfaces:
-
Reference
and all subclasses. -
EmptyCollection<T>
,EmptyList<T>
,DoubleCollection
CompositeEnumerable
,CompositeListEnumerable
,SingleListEnumerable
,SingletonCollection
,SingletonList
,SingletonEnumerator
andCompositeEnumerator
. -
CompositeHandle<T>
andCompositePositionHandler
. -
IStruct
,ElementFoundCallback
andILookupProvider
. -
Replaced
IMapperDelegate
andFactoryDelegate<TResult,TContext>
byjava.util.function.Function
. -
ILookupCallback
andContextLookups
. UseIContextLookup
instead. -
CompositeCollectionModel
,CallbackLookup
,AbstractContextLookupChainLink
,GenericYList
,GenericListCell
andHashSet
. -
CollectionChangedEventArgs
,CollectionChangeType
,CollectionExtensions
andICollectionChangeReporter
. -
ComponentResourceKey
was removed and usages replaced by its base classResourceKey
which got a new constructor taking aClass
and anObject
as parameter. -
The class
GraphCopier
for layout graphs and related classes and methods have been removed. Note that theGraphCopier
implementation forIGraph
still exists. -
The classes
DefaultNodeLookup
,DefaultEdgeLookup
,DefaultPortLookup
,DefaultLabelLookup
,DefaultBendLookup
andDefaultItemLookup
have been removed. Instead the properties#DefaultNodeLookup
,#DefaultEdgeLookup
,#DefaultPortLookup
,#DefaultLabelLookup
and#DefaultBendLookup
have been added toDefaultGraph
. -
Class
ItemDecorator<TModelItem>
has been removed. Its members have been pushed down to its former sub classesNodeDecorator
,EdgeDecorator
,LabelDecorator
,PortDecorator
andBendDecorator
.
-
-
The events
#ItemSelected
and#ItemDeselected
onISelectionModel
have been merged into the#ItemSelectionChanged
event. -
Changed the return type for some methods from
IEnumerable
to the less restrictive typeIterable
where possible inIHitTester
,IBendSelectionTester
,IHandleProvider
,IPortCandidateProvider
and many more. This makes it easier for clients to implement or extend those classes. -
GeomSupport
: method#createSmoothedPath
has been moved to classGeneralPath
. -
Usage of
EventHandler
was made more consistent:-
The sub interfaces
ItemEventHandler
,HierarchyItemEventHandler
,Mouse2DEventHandler
andCompoundKeyEventHandler
have been replaced byEventHandler
s typed with the specificEventArgs
likeEventHandler<ItemEventArgs>
. -
More usages of
EventHandler
have been typed to the specificEventArgs
that are used by the handler.
-
-
The methods
#contains
,#notContains
and#containsAll
have been added toFlagsEnum
. -
GeneralPath
: Removed the#FillMode
parameter from methods#createPath
and#updatePath
. -
GeneralPath
: Removed the unused methods#createGeometry
. -
The interface
IMapperMetadata
has been removed and its single implementationMapperMetadata
is now used instead. -
IMapper
: The method#removeValue
has been removed. It depends on the specific implementation of the mapper whether a mapping can be removed. If an implementation provides a way to remove a mapping, that should be preferred over setting anull
value. -
TagOwnerMapper
has been removed. Use this or similar code instead to accessTag
s via anIMapper
:Mappers#createMapper<ITagOwner, object>(key ⇒ key.Tag)
. -
CanvasPrinter
: The property#PageMarkPrintingEnabled
and the protected method#createPageMarks
have been added to support adding page marks to the print output. The interface
IPropertyChangeReporter
has been removed. Usages have been replaced by regular events.The classes
TypedKey
andTypedKeyMapper
have been moved to packagecom.yworks.yfiles.graphml
.The interface
ICollectionModel
has been renamed toIObservableCollection
and its implementing classes accordingly.
Layout
Layout execution
-
LayoutExecutor
:-
The method
#stop
now stops a running layout calculation as soon as possible and then immediately shows the result so far, skipping any animation. In addition, the new method#cancel
immediately cancels a running calculation and doesn’t change theGraphControl#Graph
unless the animation was already running. -
The method
#setAbortHandler
has been removed. Instead there is a protected factory method#createAbortHandler
which can be overridden to create a customAbortHandler
implementation. -
Labels are now taken into account for the final content rectangle and viewport animation.
-
The property
#FinishedHandler
has been replaced by the event#LayoutFinished
that uses the newLayoutEventArgs
.LayoutExceptionEventArgs
have been replaced byLayoutEventArgs
whose property#Exception
isnull
when no exception occured. -
The new property
#ConsiderViewportLimiter
can be enabled to let the target viewport after a layout respect theViewportLimiter
of theGraphControl
. TheViewportAnimation
has a new property#ConsiderViewportLimiter
for the same purpose. -
Classes
LayoutExecutor
andLayoutGraphAdapter
now have a property#AutomaticEdgeGrouping
that automatically configures edge groups for ports with multiple incoming or outgoing edges. This feature is enabled by default. -
Classes
LayoutExecutor
andLayoutGraphAdapter
now have a property#FixPorts
that automatically configures strong source and target port constraints for all edges in the graph. This feature is disabled by default.
-
-
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
. -
The factory methods
#createEdgeBetweennessPartitionFinder
,#createComponentPartitionPlacer
,#createPolylineInterEdgeRouter
,#createChannelInterEdgeRouter
and their overloads have been moved from thePartitionLayout
class to appropriate interfacesIPartitionFinder
,IPartitionPlacer
andIInterEdgeRouter
.
Streamlined Layout API
-
The legacy hierarchic layout
com.yworks.yfiles.layout.hierarchic.HierarchicLayouter
,com.yworks.yfiles.layout.hierarchic.HierarchicGroupLayouter
, and the associated legacy interfacesILayerer
,IDrawer
,IMementoSupport
,ILayerSequencer
, together with their implementations, have been removed. Instead,IncrementalHierarchicLayouter
has been renamed toHierarchicLayout
and is now the only implementation of the hierarchic layout style. All associated interfaces and implementations from the packagecom.yworks.yfiles.layout.hierarchic.incremental
have been moved up tocom.yworks.yfiles.layout.hierarchic
. -
Legacy classes
OrthogonalGroupLayouter
andDirectedOrthogonalLayouter
have been removed and their features have been incorporated inOrthogonalLayout
. ClassDirectedOrthogonalLayoutData
has been removed and its features have been incorporated intoOrthogonalLayoutData
. -
Legacy class
OrthogonalEdgeRouter
and all associated classes have been removed. -
Class
HVTreeLayouter
has been removed and its features have been incorporated intoTreeLayout
. -
Class
DefaultGraphLayout
has been removed. -
Class
ParentEdgeAugmentationStage
has been removed. -
Method
Graph#moveSubgraph
has been removed. -
CopiedLayoutIGraph
was removed. An instance of the super typeCopiedLayoutGraph
with the same functionality can be obtained from factory method#createCopiedLayoutGraph
inLayoutGraphAdapter
. -
The method
canLayout
has been removed from all layout algorithms. Previously it pretty much always returnedtrue
.
Major Features Added
- Added support for Sankey diagrams which visualize flow quantity between entities like e.g., cost or energy flow.
-
HierarchicLayout
: Added support for port grouping, seePortConstraintKeys#SOURCE_PORT_GROUP_ID_DPKEY
andPortConstraintKeys#TARGET_PORT_GROUP_ID_DPKEY
. Edges are bundled at their ports, but routed independently. -
HierarchicLayout
now allows to specify the directedness of edges, seeHierarchicLayout#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, seeHierarchicLayout#EDGE_THICKNESS_DPKEY
. -
Added preferred placement specifiers
LabelLayoutConstants#PLACE_AT_SOURCE_PORT
andLabelLayoutConstants#PLACE_AT_TARGET_PORT
for edge labels which express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of theHierarchicLayout
. -
OrganicLayout
now supports the detection of regular substructures in the graph (seeOrganicLayout#setChainSubstructureStyle(ChainSubstructureStyle)
,OrganicLayout#setStarSubstructureStyle(StarSubstructureStyle)
,OrganicLayout#setCycleSubstructureStyle(CycleSubstructureStyle)
, andOrganicLayout#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 propertiesTreeReductionStage#setNonTreeEdgeLabelingAlgorithm
andTreeReductionStage#setNonTreeEdgeLabelSelectionKey
. -
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 propertiesSeriesParallelLayout#setNonSeriesParallelEdgeLabelingAlgorithm
andSeriesParallelLayout#getNonSeriesParallelEdgeLabelSelectionKey
. -
HierarchicLayout
supports recursively routed edges. Edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node. This routing style is specified usingEdgeLayoutDescriptor#setRecursiveEdgeStyle(RecursiveEdgeStyle)
. -
HierarchicLayout
: Improved from-sketch behavior for groups with changed bounds (e.g. after folding or expanding a group node). -
Added edge bundling feature. Bundling together multiple edges means that their
common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability
of graph drawings with a high number of edges that connect a comparably small number of nodes. The following
layout algorithms support edge bundling:
CircularLayout
: Edge bundling is applied to edges of the same partition.TreeReductionStage
: Edge bundling is applied to non-tree edges.RadialLayout
: Edge bundling is applied to non-tree edges.
-
Added new layout algorithm
SeriesParallelLayout
for graphs that are constructed only by series (combining two series parallel graphs by merging the source of one graph with the sink of the other) and parallel (combining two series parallel graphs by merging the sources and the sinks) operations. -
Added multi-parent support to
TreeLayout
. 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
HierarchicLayout
. -
Passing data to a layout algorithm has been simplified by the new
LayoutData
classes. For each major and many minor layout algorithms a subclass ofLayoutData
has been added that allows to set data relevant for this algorithm using properties. ThisLayoutData
object can be set onLayoutExecutor
or passed to theIGraph#applyLayout
orGraphControl#morphLayout
method. The following layout data classes have been added:ARTreeLayoutData
for theARTreeLayouter
BalloonLayoutData
for theBalloonLayouter
BusRouterData
for theBusRouter
ChannelEdgeRouterData
for theChannelEdgeRouter
CircularLayoutData
for theCircularLayouter
ComponentLayoutData
for theComponentLayouter
CompositeLayoutData
to combine different layout data objectsDirectedOrthogonalLayoutData
for theDirectedOrthogonalLayouter
FamilyTreeLayoutData
for theFamilyTreeLayouter
FixedGroupLayoutData
for theFixedGroupLayoutStage
GenericTreeLayoutData
for theGenericTreeLayouter
HVTreeLayoutData
for theHVTreeLayouter
IncrementalHierarchicLayoutData
for theHierarchicLayout
LabelingData
for theSALabeling
andGreedyMISLabeling
MultiPageLayoutData
for theMultiPageLayouter
OrganicEdgeRouterData
for theOrganicEdgeRouter
OrthogonalEdgeRouterData
for theOrthogonalEdgeRouter
OrthogonalLayoutData
for theOrthogonalLayouter
OrthogonalPatternEdgeRouterData
for theOrthogonalPatternEdgeRouter
ParallelEdgeLayoutData
for theParallelEdgeLayouter
PartialLayoutData
for thePartialLayouter
PartitionLayoutData
for thePartitionLayouter
PolylineEdgeRouterData
for thecom.yworks.yfiles.layout.router.polyline.EdgeRouter
RadialLayoutData
for theRadialLayouter
RecursiveGroupLayoutData
for theRecursiveGroupLayouter
SelfloopCalculatorLayoutData
for theSelfloopCalculator
SmartOrganicLayoutData
for theSmartOrganicLayouter
StraightLineEdgeRouterData
for theStraightLineEdgeRouter
TreeReductionStageData
for theTreeReductionStage
Minor Features Added
-
HierarchicLayout
: Added support for sequence constraints between edges as well as nodes and edges, seeSequenceConstraintFactory
. -
HierarchicLayout
: 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. -
HierarchicLayout
: Added feature that allows for edges that connect group nodes with their descendants to directly connect from inside to the group node's border. It can be activated for each edge individually on theEdgeLayoutDescriptor
by callingEdgeLayoutDescriptor#setDirectGroupContentEdgeRoutingEnabled(boolean)
. -
RecursiveGroupLayout
: Added edge splitting for inter-edges and the possibility to align edges that connect to the group border from inside and outside. -
GenericLabeling
: Added optionAbstractMISLabeling#setAmbiguityReductionEnabled(boolean)
that reduces the ambiguity of label placements. When enabled, the labeling algorithms try to avoid placing labels at positions where it is not clear to which graph element a label belongs. -
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. -
AbortHandler
: Added methodhasCheckFailed()
that allows to query whether a check method was called after a stop or cancel event. -
Added interface
LabelLayoutFactory
that provides methods for creating, adding and removing node/edge labels forLayoutGraph
s. -
HierarchicLayout
: Added support for incremental group nodes (seeIncrementalHintsFactory#createIncrementalGroupHint(Object)
). Incremental groups will be placed on a suitable position. The hints of their descendants are interpreted relative to the group node. -
SimplexNodePlacer
: Added optionsetNodeCompactionEnabled(boolean)
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. -
TreeLayout
: Added support for critical edges inDefaultNodePlacer
,DendrogramNodePlacer
,SimpleNodePlacer
,LayeredNodePlacer
andDoubleLineNodePlacer
. Nodes connected to a critical edge will be center aligned which can be used to highlight certain paths in the tree. -
TreeLayout
: Added support for grouped edges inDefaultPortAssignment
. Grouped edges will share the same port location at local root. -
Added class
GroupedNodePlacer
that allowsTreeLayout
to place siblings into different groups. -
RecursiveGroupLayout
: Added optionsetInterEdgeRouter(ILayoutAlgorithm)
to specify an edge router to layout edges that cross group node bounds. Thus, it is not necessary to subclass the layouter to change inter-edge routing anymore. -
Added layout stage
FixPortLocationStage
which ensures that layout algorithms that cannot handle port constraints keep the ports of edges with strong port constraints. -
Added layout stage
PortPlacementStage
which assigns edges to the ports specified byPortConstraint
s orPortCandidate
s after calling the core layout. -
Groups
: Added k-means clustering algorithm that partitions a given graph in k-clusters. -
Groups
: Added 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).
Improvements
-
HierarchicLayout
: Improved support forPortCandidate
s 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. -
Improved the performance of
OrthogonalSegmentDistributionStage
and thus alsoChannelEdgeRouter
which by default uses the mentioned stage as edge distribution strategy. -
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 optionMultiPageLayout#setStrictClusterSeparationEnabled(boolean)
that allows to specify whether or not nodes with different cluster IDs may be placed onto the same page. -
The following tree algorithms now support custom selection of the root node of the tree:
- BalloonLayout
- TreeLayout
- ClassicTreeLayout
- AspectRatioTreeLayout
-
BalloonLayout
: Interleaved child placement now works in conjunction with from sketch-mode and custom child order comparators. This means that the settingsBalloonLayout#setFromSketchModeEnabled(boolean)
andBalloonLayout#setComparator(Comparator)
are no longer ignored when enabling the interleaved placement mode (seeBalloonLayout#setInterleavedMode(InterleavedMode)
). -
TreeLayout
andClassicTreeLayout
: Now take into consideration the minimum group node size specified by the user with aDataProvider
registered with the graph with keyGroupingKeys#MINIMUM_NODE_SIZE_DPKEY
. -
ChannelRouter
: Improved order of segments to avoid edge crossings when there are multiple segments that have one common end point. -
New convenience method
LayoutGraphUtilities#getPathClippedOnBB(YPointPath, YRectangle, YRectangle)
that computes a clipped edge path given aYPointPath
and twoYRectangle
s to clip on. -
HierarchicLayout
: Added properties that allow for stopping 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. -
HierarchicLayout
: Fixed edges which have segments that should be horizontal or vertical but are slightly non-orthogonal. -
HierarchicLayout
: 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. -
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 (PortConstraint
,PortCandidate
), self-loops may start and end at the same side of the node. -
InteractiveOrganicLayout
: Fixed possible performance problem after changing the inertia/stress of some nodes. -
The directed style of the
OrthogonalLayout
: Now always produces planar drawings for trees. -
GenericLabeling
: Generic labeling algorithms do not consider any more labels of zero width or height. Before, bad labeling results were possible. -
GenericLabeling
: Improved performance - especially for large graph instances. -
Improved support for
PreferredPlacementDescriptor
side preference (left, on-edge, right) when using generic labeling algorithmsGenericLabeling
. Now, the side preference is considered for edge labels with arbitraryEdgeLabelModel
implementations. -
TreeLayout
: 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. -
RadialLayout
: If the data provider registered with keyRadialLayout.NODE_INFO_DPKEY
also implementsDataAcceptor
interface, it will be filled with the accordingRadialLayout.NodeInfo
object for each node. -
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. -
Several smaller runtime improvements for the following layout algorithms:
HierarchicLayout
ChannelRouter
OrganicLayout
OrthogonalLayout
CircularLayout
RadialLayout
-
HierarchicLayout
: Reduced number of group node overlaps that may appear for groups containing elements with tail/head constraints, seeSequenceConstraintFactory#addPlaceNodeAtTailConstraint(Object)
andSequenceConstraintFactory#addPlaceNodeAtHeadConstraint(Object)
. -
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
. -
HierarchicLayout
: The group transposition feature (seeDefaultLayerSequencer.setGroupTranspositionEnabled(boolean)
) can now also be used in incremental layout mode. -
ConstraintIncrementalLayerer
: Improved handling of same layer constraints. In previous versions the layerer sometimes ignores same layer constraints even though there is a valid layering. -
HierarchicLayout
: More compact placement of rotated as well as stacked labels. -
OrganicLayout
: Now also considers the group node compactness (see optionsetGroupNodeCompactness(double)
) if optionsetNodeEdgeOverlapAvoided(boolean)
is enabled. -
OrganicLayout
: Improved node overlap removal (see optionsetNodeOverlapsAllowed(boolean)
). Now, if the scope is set toSUBSET
orMAINLY_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
andDendrogramNodePlacer
: 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. -
TreeLayout
now ignores labels with zero width or height in all distance calculations. -
TreeLayout
:INodePlacer
implementations now also use the specified spacing as minimum distance between different subtrees. -
PartialLayout
: Reduced number of element overlaps if there are partial group nodes. -
ParallelEdgeRouter
: Now always separates parallel edges according to their direction, i.e., edges (v,w) and (w,v) are never placed interleaved. -
GenericLabeling
now also considers the node/edge overlap penalty specified by aLabelCandidate
.
Changes in Default Behavior
-
HierarchicLayout
: Creating layer constraints (seeLayerConstraintFactory
) or sequence constraints (seeSequenceConstraintFactory
) using a disposed of factory now throws anIllegalStateException
. -
GenericLabeling
: ChangedLabelCandidate
s default for overlap penalty of nodes and edges from 0 to 1. This means label overlaps are now considered more severe. -
HierarchicLayout
: 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. -
The following default values of properties have been changed:
-
MultiStageLayout
andMultiPageLayout
: The defaultLabelLayout
is now set to an instance ofGenericLabeling
. -
PartialLayout
: Default value of propertyMinimalNodeDistance
is now10d
instead of0.0
. -
MultiParentDescriptor
: Default value of propertyMinimumNodeDistance
is now15d
instead of10.0
. -
BalloonLayout
: Default value of propertyMinimalNodeDistance
is now10.0
instead of0.0
. -
GenericLabeling
: Default value of propertyDeterministicModeEnabled
is nowtrue
instead offalse
. -
SplitEdgeLayoutStage
: Default value of propertyProxyNodeSize
is now1.0
instead of0.0
.
-
-
HierarchicLayout
: 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 behaviour 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 ofPortCandidate
s was selected without trying to match with node port candidates. -
GraphTransformer
: MethodsetOperation(int)
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. -
Centrality
: The following methods can now take emptyINodeMap
s andIEdgeMap
s as arguments for returning the resulting centrality values.Centrality#edgeBetweenness(Graph, IEdgeMap, boolean, DataProvider)
Centrality#nodeBetweenness(Graph, INodeMap, boolean, DataProvider)
Centrality#nodeEdgeBetweenness(Graph, INodeMap, IEdgeMap, boolean, DataProvider)
-
Most of the setter methods of the properties of package
layout
now throw anIllegalArgumentException
if an unexpected/illegal ornull
argument is given as input. -
DelegatingNodePlacer
: MethoddetermineChildConnector(Node)
now throws anIllegalStateException
instead of anIllegalArgumentException
. -
OrthogonalLayout
: MethodsetIntegratedEdgeLabelingEnabled(boolean)
throws anIllegalStateException
if the current label layouter is not of typeLabelLayoutTranslator
. -
TreeComponentLayout
: ConstructorTreeComponentLayout(ILayouterAlgorithm)
throws anIllegalArgumentException
ifnull
is given as argument.
Other API Changes
-
Groups.Dendrogram
does no longer extend classGraph
. To enable convenient iteration of a dendrogram, methodGroups.Dendrogram.getChildren(Node)
was added. -
The following constructors have been removed:
Bipartitions.Bipartitions()
Centrality.Centrality()
Cycles.Cycles()
GraphConnectivity.GraphConnectivity()
NetworkFlows.NetworkFlows()
NodeOrders.NodeOrders()
Paths.Paths()
RankAssignments.RankAssignments()
SpanningTrees.SpanningTrees
Transitivity.Transitivity()
Bfs.Bfs()
Grouping.Grouping()
Swimlanes.Swimlanes()
RecursiveGroupLayout.RecursiveGroupLayout(ILayoutAlgorithm,IGroupBoundsCalculator)
-
FixedGroupLayoutStage
: MethodgetInterEdgeroutingStyle()
has been renamed togetInterEdgeRoutingStyle()
. -
EdgeReverser
: MethodreverseEdges(Graph,EdgeList)
has become static. -
The following classes, constructors, and methods have been deprecated:
PortConstraint
: All constructorsPortCandidate
: All constructors-
SequenceConstraintFactory
: MethodsaddPlaceNodeAfterConstraint(Object, Object)
addPlaceNodeAtHeadConstraint(Object)
addPlaceNodeAtTailConstraint(Object)
addPlaceNodeBeforeConstraint(Object, Object)
WeightedLayerer
: MethoddownShiftNodes(Graph, INodeMap, int)
BendConverter
: The data provider keyScopeDpKey
has been renamed toAffectedEdgesDpKey
.BendConverter
: PropertyAdoptSelection
has been renamed toAdoptEdgeMarking
.BendConverter
: PropertySelectedEdgesDpKey
has been renamed toMarkedEdgesDpKey
.CircularLayouter
: The data provider keyCircleIdHolderDpKey
has been renamed toCircleIdDpKey
.CircularLayouter
: The data provider keyCircularCustomGroupsDpKey
has been renamed toCustomGroupsDpKey
.com.yworks.yfiles.layout.circular.LayoutStyle
: Enum typeCircularCustomGroups
has been renamed toCustomGroups
.ComponentLayouter
: The data provider keyLayoutNodeDpKey
has been renamed toAffectedComponentsDpKey
.ComponentLayouter
: The data provider keyGivenComponentDpKey
has been renamed toComponentIdDpKey
.EdgeReversalStage
: The data provider keyReverseEdgesDpKey
has been renamed toAffectedEdgesDpKey
.-
FamilyTreeLayouter
: The data provider keyDpKeyFamilyType
has been renamed toFamilyTypeDpKey
and data provider registered with this key have to return values of the newcom.yworks.yfiles.layout.genealogy.FamilyType
enum. PartitionGrid
: The data provider keyPartitionCellDpKey
has been renamed toPartitionCellIdDpKey
.ConstraintIncrementalLayerer
: The data provider keyEdgeWeightsDpKey
has been renamed toAdditionalEdgeWeightDpKey
.com.yworks.yfiles.layout.hierarchic.HierarchicLayouter
: The data provider keyLayerValueHolderDpKey
has been renamed toLayerIndexDpKey
.com.yworks.yfiles.layout.hierarchic.HierarchicLayouter
: The data provider keySequenceValueHolderDpKey
has been renamed toSequenceIndexDpKey
.com.yworks.yfiles.layout.hierarchic.IEdgeData
: The propertySourceCandidates
has been renamed toSourcePortCandidates
.com.yworks.yfiles.layout.hierarchic.IEdgeData
: The propertyTargetCandidates
has been renamed toTargetPortCandidates
.SelfloopCalculator
: The data provider keyIsOctilinearDpKey
has been renamed toOctilinearEdgesDpKey
.HierarchicLayout
: The data provider keyCriticalEdgeDpKey
has been renamed toCriticalEdgePriorityDpKey
.HierarchicLayout
: The data provider keyLayerValueHolderDpKey
has been renamed toLayerIndexDpKey
.HierarchicLayout
: The data provider keySequenceValueHolderDpKey
has been renamed toSequenceIndexDpKey
.LayouterKeys
: The data provider keySelectedNodesDpKey
has been renamed toAffectedNodesDpKey
.LayouterKeys
: The data provider keySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.LabelLayoutKeys
: The data provider keyIgnoreLabelDpKey
has been renamed toIgnoredLabelsDpKey
.LabelingBase
: PropertySelectedLabelsDpKey
has been renamed toAffectedLabelsDpKey
.NormalizingGraphElementOrderStage
: The data provider keyComparableNodeDpKey
has been renamed toNodeComparableDpKey
.NormalizingGraphElementOrderStage
: The data provider keyComparableEdgeDpKey
has been renamed toEdgeComparableDpKey
.-
The enum
com.yworks.yfiles.layout.organic.SphereOfAction
has been removed. Earlier usages have been replaced bycom.yworks.yfiles.layout.organic.Scope
.SphereOfAction.ALL
has been mapped toScope.ALL
,SphereOfAction.MAINLY_SELECTION
has been mapped toScope.MAINLY_SUBSET
andSphereOfAction.ONLY_SELECTION
has been mapped toScope.SUBSET
. OrganicLayouter
: The data provider keySphereOfActionNodesDpKey
has been renamed toAffectedNodesDpKey
.OrganicLayouter
: PropertySphereOfAction
has been renamed toScope
and is now of typecom.yworks.yfiles.layout.organic.Scope
.ShuffleLayouter
: The data provider keyMinimalDistanceDpKey
has been renamed toMinimalNodeDistanceDpKey
.SmartOrganicLayouter
: The data provider keyNodeSubsetDpKey
has been renamed toAffectedNodesDpKey
.SmartOrganicLayouter
: Data provider registered with the keyGroupNodeModeDpKey
now have to return values of the newcom.yworks.yfiles.layout.organic.GroupNodeMode
enum.SplitEdgeLayoutStage
: PropertySplitEdgesDpKey
has been renamed toAffectedEdgesDpKey
.ParallelEdgeLayouter
: The data provider keyScopeDpKey
has been renamed toAffectedEdgesDpKey
.PartialLayouter
: The data provider keyPartialNodesDpKey
has been renamed toAffectedNodesDpKey
.PartialLayouter
: The data provider keyPartialEdgesDpKey
has been renamed toAffectedEdgesDpKey
.PartialLayouter
: The data provider keyComponentAssignmentDpKey
has been renamed toComponentIdDpKey
.PartitionLayouter.OrthogonalInterEdgeRouter
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.PartitionLayouter.PolylineInterEdgeRouter
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.PortCandidate
: The data provider keySourcePcListDpKey
has been renamed toSourcePortCandidateCollectionDpKey
.PortCandidate
: The data provider keyTargetPcListDpKey
has been renamed toTargetPortCandidateCollectionDpKey
.PortCandidateSet
: The data provider keyNodeDpKey
has been renamed toNodePortCandidateSetDpKey
.com.yworks.yfiles.layout.radial.CenterNodesPolicy
: Enum typeSelection
has been renamed toCustom
.BusRouter
: The data provider keyEdgeSubsetDpKey
has been renamed toAffectedEdgesDefaultDpKey
.BusRouter
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.CollinearBendHider
: The data provider keySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.-
The enum
com.yworks.yfiles.layout.router.SphereOfAction
has been removed. Earlier usages have been replaced bycom.yworks.yfiles.layout.router.Scope
.SphereOfAction.ROUTE_ALL_EDGES
has been mapped toScope.ALL
,SphereOfAction.ROUTE_SELECTED_EDGES
has been mapped toScope.SUBSET
andSphereOfAction.ROUTE_EDGES_AT_SELECTED_NODES
has been mapped to the new enum valueScope.SUBSET_AT_AFFECTED_NODES
. OrganicEdgeRouter
: The data provider keyRouteEdgeDpKey
has been renamed toAffectedEdgesDpKey
.OrthogonalEdgeRouter
: PropertySelectedNodesDpKey
has been renamed toAffectedNodesDpKey
.OrthogonalEdgeRouter
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.OrthogonalEdgeRouter
: PropertySphereOfAction
has been renamed toScope
and is now of typecom.yworks.yfiles.layout.router.Scope
.com.yworks.yfiles.layout.router.Polyline.EdgeRouter
: The data provider keyLabelCrossingCostFactorDpKey
has been renamed toLabelCrossingPenaltyFactorDpKey
.com.yworks.yfiles.layout.router.Polyline.EdgeRouter
: PropertySphereOfAction
has been renamed toScope
and is now of typecom.yworks.yfiles.layout.router.Scope
.com.yworks.yfiles.layout.router.Polyline.EdgeRouter
: PropertySelectedNodesDpKey
has been renamed toAffectedNodesDpKey
.com.yworks.yfiles.layout.router.Polyline.EdgeRouter
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.com.yworks.yfiles.layout.router.Polyline.EdgeRouter
: MethodIsSelected
has been renamed toIsAffected
.PolylineLayoutStage
: PropertySphereOfAction
has been renamed toScope
and is now of typecom.yworks.yfiles.layout.router.Scope
.PolylineLayoutStage
: PropertySelectedNodesDpKey
has been renamed toAffectedNodesDpKey
.PolylineLayoutStage
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.StraightLineEdgeRouter
: PropertySphereOfAction
has been renamed toScope
and is now of typecom.yworks.yfiles.layout.router.Scope
.StraightLineEdgeRouter
: PropertySelectedNodesDpKey
has been renamed toAffectedNodesDpKey
.StraightLineEdgeRouter
: PropertySelectedEdgesDpKey
has been renamed toAffectedEdgesDpKey
.SubgraphLayouter
: PropertySubgraphNodesDpKey
has been renamed toAffectedNodesDpKey
.ARTreeLayouter
: The data provider keyRatioDpKey
has been renamed toSubtreeAspectRatioDpKey
.ARTreeLayouter
: Data provider registered with the keyRootPlacementDpKey
now have to return values of the newcom.yworks.yfiles.layout.tree.RootPlacement
enum.-
ARTreeLayouter
: The data provider keyRoutingPolicyDpKey
has been renamed toSubtreeRoutingPolicyDpKey
and data provider registered with this key now have to return values of the newcom.yworks.yfiles.layout.tree.RoutingPolicy
enum. ARTreeLayouter
: MethodGetRoutingPolicy
now returns aRoutingPolicy
enum value.ARTreeLayouter
: MethodGetRootPlacement
now returns aRootPlacement
enum value.ARTreeLayouter
: PropertyRoutingPolicy
is now of the typeRoutingPolicy
.ARTreeLayouter
: PropertyRootPlacement
is now of the typeRootPlacement
.AssistantPlacer
: The data provider keyAssistantDpKey
has been renamed toAssistantNodeDpKey
.DelegatingNodePlacer
: The data provider keyLeftRightDpKey
has been renamed toPrimaryNodesDpKey
.DelegatingNodePlacer
: MethodGetUpperLeftChildren
has been renamed toPrimaryChildren
.DelegatingNodePlacer
: MethodGetLowerRightChildren
has been renamed toSecondaryChildren
.DelegatingNodePlacer
: PropertyPlacerUpperLeft
has been renamed toPrimaryPlacer
.DelegatingNodePlacer
: PropertyPlacerLowerRight
has been renamed toSecondaryPlacer
.com.yworks.yfiles.layout.tree.InterleavedMode
: Enum typeSelectedNodes
has been renamed toMarkedNodes
.GenericTreeLayouter
: The data provider keyChildComparatorDpKey
has been renamed toOutEdgeComparerDpKey
.GridNodePlacer
: The data provider keyGridDpKey
has been renamed toRowIndexDpKey
.LeftRightPlacer
: The data provider keyLeftRightDpKey
has been renamed toLeftNodeDpKey
.NodeOrderComparator
: The data provider keyNodeOrderDpKey
has been renamed toNodeOrderComparableDpKey
.- Class
HierarchicTreePlacer
has been renamed toHierarchicTreeNodePlacer
. - Class
ParallelEdgeLayouter
has been renamed toParallelEdgeRouter
. - Class
ReducedSphereOfActionStage
has been renamed toReducedScopeStage
. - Class
SelfLoopLayouter
has been renamed toSelfLoopRouter
. - Class
AssistantPlacer
has been renamed toAssistantNodePlacer
. - Class
BusPlacer
has been renamed toBusNodePlacer
. - Class
DendrogramPlacer
has been renamed toDendrogramNodePlacer
. - Class
DoubleLinePlacer
has been renamed toDoubleLineNodePlacer
. - Class
FreePlacer
has been renamed toFreeNodePlacer
. - Class
LeafPlacer
has been renamed toLeafNodePlacer
. - Class
LeftRightPlacer
has been renamed toLeftRightNodePlacer
. EdgeLabelLayoutImpl
: obsolete propertyPreferredPlacement
has been removed.com.yworks.yfiles.layout.hierarchic.EdgeLayoutDescriptor
: obsolete propertyOrthogonallyRouted
has been removed.WeightedLayerer
: deprecated methodAssignNodeLayer
has been removed.LabelingBase
: deprecated propertyUseAlternativeSideHandling
has been removed.-
LabelLayoutData
: deprecated constructorsLabelLayoutData(double,double,LabelPlacements)
andLabelLayoutData(YOrientedRectangle,LabelPlacements)
has been removed. LabelLayoutData
: obsolete propertyPreferredPlacement
has been removed.OrthogonalLayouter
: obsolete propertiesNodeModel
andUseSpacePostprocessing
have been removed.PortConstraint
: the deprecated constructors have been removed.CanvasObjectDescriptor
: deprecated fieldsPaintable
andDynamicDirtyPaintable
have been removed.TapInputMode
: deprecated propertyDoubleTap
has been removed.LayoutExtensions
: deprecated extension methodCreateLayerConstraintFactory
has been removed.
Demos
- Added a demo that shows how to model a Business Process Diagram editor using customized styles and layout algorithms.
- Added a demo that presents different layout algorithms and their configuration properties.
- Added a demo that shows how to extend the export capabilities of yFiles for JavaFX with third-party libraries to export a graph in the SVG format.
- Added a demo that presents the various events dispatched by the model and the input modes that can be listened to.
Bugfixes
Viewer
- A bug in orthogonal edge editing was fixed where an edge could become non-orthogonal when a non-selected bend was moved.
- Fixed an issue with orthogonal edge editing where canceling moving a port or node would add bends to otherwise straight edge segments.
- Fixed an issue where moving edge ports of a self-loop could break edge orthogonality despite orthogonal edge editing.
- Fixed a bug that prevented individually disabling certain grouping commands.
- Fixed a bug with folding that sometimes ignored the view state for a port on a folder node when a folding edge was created.
- A bug in OverviewInputMode has been fixed that could break the overview visualization if the overview has a specific very small width or height.
- Fixed a potential exception when using folding on a filtered graph when either nodes with labels or ports, or edges with bends or labels are shown for the first time after being hidden before.
- Fixed an issue where setting a
BridgeManager
on theRenderContextEvent
had no effect and bridges would not show. - Fixed an issue where setting a custom
Pen
for a grid withGridStyle.DOTS
had no effect. - Fixed incorrect rendering of grids for viewports with aspect ratios smaller than 1.
- Removed remaining dependencies to AWT classes.
- Fixed a bug in
OverviewInputMode
that could break the overview visualization if the overview has a specific very small width or height. This was for example the case when using aGraphOverviewControl
in aTitledPane
that was collapsed/expanded in an animated fashion. - Fixed
NullPointerException
that occurred when calling theGraphOverviewControl
's constructor with a new GraphControl as argument. - Properties
StripeDefaults#Insets
andSimpleLabelStyle#TextFormat
have default values that are intended to be shareable but were mutable which could lead to unwanted side effects. The default values for those properties have been made immutable. SimpleLabelStyleRenderer
: Fixed a bug that caused the border of the label to be clipped away sometimes.- Fixed a bug that prevents disabling the snapping feature by pressing the control key when moving or resizing nodes or creating edges interactively.
- Changing the zoom level by mouse wheel is now the same on all systems.
- Added missing shortcuts for the open (Shortcut+O) and save (Shortcut+S) commands.
- Fixed a ClassCastException that occurs when the CollapsibleNodeStyleDecoratorRenderer specifies a collapse button that is not a JavaFX Button instance.
- Fixed an issue that prevented saving and loading graphs with table nodes.
- PixelImageExporter: fixed a bug that prevented CSS styling to be applied to the exported image.
- MouseHoverInputMode: fixed a
NullPointerException
that sometimes occured when trying to hide a tooltip.
Layout
-
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. -
SimplexNodePlacer
: Fixed bug that caused overlaps between edges and nodes when enabling node compaction (#setNodeCompactionEnabled(boolean)
) and having edges with either strongPortConstraint
s or fixedPortCandidate
s. -
HierarchicLayout
: Fixed bug that caused a violation of minimum first/last segment length for backloop/reversed edges that connect to group nodes. -
HierarchicLayout
: Fixed rare bug that caused overlaps between labels and segments of edges with octilinear routes. -
HierarchicLayout
: fixed possible infinite loop if there are critical edges (see#CRITICAL_EDGE_DPKEY
). -
HierarchicLayout
: Fixed bug that caused critical edges to not be aligned (see#CRITICAL_EDGE_DPKEY
). -
HierarchicLayout
: Fixed rareNullPointerException
triggered inAsIsSequencer
for edges incident to group nodes that have a sketch without bend points as well as port constraints. -
HierarchicLayout
: Fixed bug that caused non-orthogonal segments of grouped edges even though orthogonal edge routing was enabled. -
HierarchicLayout
: Improved compactness of layouts that feature group nodes with insets and (group) nodes with halos (NodeHalo
). Previously, specifying halos could enlarge the insets of group nodes by an unnecessary large amount. -
HierarchicLayout
: Fixed bug that caused a violation of the specified minimum distance or edge overlaps in the case of same-layer edges. -
HierarchicLayout
: FixedNullPointerException
that could happen inAsIsSequencer
when incremental group hints are defined (seeIncrementalHintsFactory#createIncrementalGroupHint(java.lang.Object)
) 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), seeSimplexNodePlacer#setLabelCompactionEnabled(boolean)
. 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). -
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 backloops. -
HierarchicLayout
: Fixed bug that caused the minimum edge-to-edge distance to be violated by edges with strong port constraints that cross each other. -
Fixed
IllegalArgumentException
that is triggered in some cases when using aSequenceConstraintFactory
. -
RecursiveGroupLayout
when used withHierarchicLayout
as core layout algorithm: FixedIllegalStateException
that could be triggered when group nodes of the input graph havePortCandidate
s. -
OrganicLayout
now temporarily hidesDataProvider
s which are registered by the user with keys that are related toRecursiveGroupLayout
and #LayoutMultiplexer
since their presence during the layout process may cause corrupted results. -
PartialLayout
: fixedNullPointerException
that appeared if noDataProvider
with keyPartialLayouter#PARTIAL_NODES_DPKEY
is registered with the input graph. -
GraphPartitionManager
: fixed functionality to hide edges when using methodsGraphPartitionManager#hide(Edge)
,GraphPartitionManager#hideEdges()
,GraphPartitionManager#hide(EdgeCursor)
orGraphPartitionManager#hide(EdgeList)
. Previously, edges were actually not hidden from the graph. -
ParallelEdgeRouter
: Fixed bug that caused wrong (very large) edge port coordinates. These coordinates could also lead to Exceptions later when processing the graph, for example, when calculating placements of edge labels belonging to the edges with bad coordinates. -
TreeLayout
: fixed possible group node overlaps in conjunction with some node placers, for exampleAssistantNodePlacer
. -
TreeLayout
: fixed bug that caused less compact layout results when having node halos (seeNodeHalo
). -
TreeLayout
: 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). -
EdgeRouter
: Fixed rareRuntimeException
that appeared if there were fixed (seeEdgeRouter#setSphereOfAction(byte)
) and grouped edges at the same time. -
EdgeRouter
: Fixed possibleNullPointerException
that may appear if a specifiedPortCandidate
has multiple directions. -
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. -
BusRouter
: Fixed rareIllegalStateException
caused by non-orthogonal edge segments. -
Groups#hierarchicalClustering(Graph, int, INodeMap,INodeDistanceProvider, Linkage):
Fixed
NullPointerException
that occurred when the given maximum number of clusters was0
or1
. -
HierarchicLayout
: Fixed bug that caused grouped edge segments to overlap with one of the adjacent nodes if it is a group node. -
HierarchicLayout
: Fixed bug that caused same layer segments to be too short for the labels that should be placed at those segments. -
HierarchicLayout
: Fixed bug that caused a violation of minimum first/last segment length for edges that connect two neighboring nodes in the same layer. -
HierarchicLayout
: Fixed bug 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. -
HierarchicLayout
: Fixed rareIllegalStateException
that is caused by an inconsistent group node order that may appear for input graphs containing both swimlanes and groups. -
HierarchicLayout
: Fixed bug with some ignored any side strong port constraints. -
HierarchicLayout
: Fixed bug 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
-
EdgeRouter
: Fixed bug that caused edges routed by theEdgeRouter
to sometimes share the same port with edges defined as fixed. -
EdgeRouter
: Fixed bug that caused violations of the node to edge distance between an edge and its target if the edge approaches the target from the opposite side of the target port constraint. -
EdgeRouter
: Fixed bug that caused incorrect routes for grouped edges with intersecting source and target. -
EdgeRouter
: Fixed rareNullPointerException
that may appear during rerouting of edges (seeEdgeRouter.setReroutingEnabled(boolean)
) if the input graph contains overlapping nodes. -
EdgeRouter
: Fixed possibleNullPointerException
that may appear if there are grouped edges consisting of both fixed and non-fixed edges (seeEdgeRouter.setScope(Scope)
). -
EdgeRouter
: Fixed bug that may cause that some edges are not considered during rerouting. It only appears if the graph contains grouped edges. -
EdgeRouter
: Fixed rare bug that may cause aStackOverflowError
. -
GenericLabeling
: Improved placement of edge labels with preferred placement at source/target if the label modelFreeEdgeLabelModel
. -
GenericLabeling
: Fixed bug that may cause that the postprocessing step ignores some node labels with modelFreeNodeLabelModel
. -
Directed style of the
OrthogonalLayout
: Fixed problem that may cause non-directed routes for directed edges if optionOrthogonalLayout.setAlignDegreeOneNodesEnabled(boolean)
is enabled. -
MultiPageLayout
: Fixed possibleNullPointerException
that may appear if an internal layouter queries aDataProvider
for an inserted dummy node. -
CircularLayout
: Fixed a bug that could potentially cause an infinite loop when encountering a node with a very high out-degree. -
CircularLayout
: Fixed bug that caused nodes to be placed outside of the enclosing circle when using layout styleSINGLE_CYCLE
and partition layout stylePARTITION_LAYOUTSTYLE_ORGANIC
. -
ParallelEdgeRouter
: Fixed possibleNullPointerException
that may appear if the parallel edge is almost horizontal/vertical. -
PortCandidateAssignmentStage
: Fixed bug that caused the location of strong port constraints to be ignored when using this stage together with a layout algorithm that cannot handle port constraints. -
RemoveCollinearBendsStage
: Now coincident bend points can also be removed since they produced edge segments of very small length and, thus, in some layout algorithms caused label placement failures. -
FamilyTreeLayout
: Fixed handling of groupingDataProvider
s so they are not changed by the layout algorithm. -
FamilyTreeLayout
: Fixed possibleNullPointerException
that may appear if the input graph contains group nodes. -
HierarchicLayout
: FixedIllegalStateException
that may appear in incremental layout mode if there are group nodes that contain non-incremental elements. -
HierarchicLayout
: Fixed bug that may cause an incorrect order of elements if the graph contains sequence constraints. -
HierarchicLayout
: Fixed problem that may cause a very long runtime if the layouter is applied in incremental mode and the graph contains sequence constraints. -
HierarchicLayout
: Fixed bug that caused that the layer of an incremental group (seeIncrementalHintsFactory.createIncrementalGroupHint(Object)
) depends on the group's location if recursive layering is enabled (seeIncrementalHierarchicLayouter.setRecursiveGroupLayeringEnabled(boolean)
). However, the position of incremental groups should be freely chosen by the layouter. -
HierarchicLayout
: fixed orientation of edge labels on selfloops connected to a group node. -
HierarchicLayout
: FixedNullPointerException
that occurred if an incremental group node has only incremental descendants. -
HierarchicLayout
: Fixed problem that caused bad results when assigning top or bottom layer constraints (i.e.,LayerConstraintFactory.addPlaceNodeAtTopConstraint(Object)
orLayerConstraintFactory#addPlaceNodeAtBottomConstraint(Object)
) to fixed elements. -
HierarchicLayout
: Fixed bug that caused collinear bends in some edge routes. -
HierarchicLayout
: Fixed bug that caused the maximum duration values specified forLayerer
,Sequencer
andNodePlacer
to be overridden and not considered during the hierarchic layout. -
EdgeRouter
: Fixed bug 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. -
EdgeRouter
: Fixed side handling of external strong ports. -
EdgeRouter
: Fixed rareNullPointerException
that may occur for graphs where only a subset of edges is routed, seeEdgeRouter.setScope(Scope)
. -
SimplexNodePlacer
: fixed bug that disabled label compaction feature. -
BalloonLayout
: Fixed bug that causedBalloonLayout.CHILD_ORDERING_POLICY_SYMMETRIC
not to work as desired. -
AssistantNodePlacer
: fixed placement of assistant nodes. When all children of a node are assistants, they are all placed left/right. -
ClassicTreeLayout
: FixedStackOverflowError
occurred in trees with high depth. -
TreeLayout
: 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.setOrientation(Orientation)
andDelegatingNodePlacer#getOrientation()
are deprecated since they had no effect. -
Trees
: fixed methodgetCenterRoot(Graph)
that didn't always return the correct center node of a tree. -
ClassicOrganicLayout
: Fixed bug that caused tree-beautifier feature (seeClassicOrganicLayout#setActivateTreeBeautifier(boolean)
) 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. -
CircularLayout
: Fixed bug that may cause node overlaps. -
SplitEdgeStage
: Fixed bug that caused the user's selection for edges that have to be split to be ignored. Also, fixed bug that caused anIllegalArgumentException
because of nodes with zero width/height. -
ShortestPaths
: FixedNullPointerException
that occurred when applying the Dijkstra or Bellman-Ford algorithm to an empty graph. -
HierarchicLayout
: Fixed label placement for octilinear selfloops with the same side constraints for source and target port. -
HierarchicLayout
: Fixed routing style violations in octilinear grouped edges. -
HierarchicLayout
: FixedNullPointerException
that could occur when octilinear edges are attached to group nodes. -
HierarchicLayout
: Fixed bug that caused first or last segments of edges to be too short to span all associated labels. -
HierarchicLayout
andRankAssignments
: Fixed possibleNullPointerException
that may occur if the maximal duration of the algorithm is limited. -
HierarchicLayout
: Fixed bug that may cause overlaps of edge labels with preferred placement at source/target. -
HierarchicLayout
: Fixed rareIllegalStateException
that may appear for grouped graphs containing nodes with fixed coordinates hint (see, e.g.,IncrementalHintsFactory#createUseExactCoordinatesHint(Object)
). -
HierarchicLayout
: Fixed bug that breaks incremental hints of grouped edges in incremental layout mode. (seeIncrementalHintsFactory#createSequenceIncrementallyHint(Object)
). -
HierarchicLayout
: Fixed bug that may cause an incorrect order of fixed (non-incremental) elements if the layouter is applied in incremental mode and the graph contains sequence constraints. -
OrthogonalLayout
: Fixed bug that caused anIllegalArgumentException
if data provider keyPortConstraintKeys#SOURCE_GROUPID_KEY
is registered to the input graph but data provider keyPortConstraintKeys#TARGET_GROUPID_KEY
is not registered. -
OrthogonalLayout: Fixed possible
IllegalArgumentException
caused by nodes without node IDs. This problem may only appear if the inter edge router is set toPartitionLayout.ChannelInterEdgeRouter
. -
ClassicTreeLayout
: Fixed bug that may cause aClassCastException
if the input graph is aCopiedLayoutGraph
that consists of multiple connected components and the layouter uses theLayeredNodePlacer
(e.g., if property ClassicTreeLayout.setLeafPlacement(LeafPlacement) is set toClassicTreeLayout.ALL_LEAVES_ON_SAME_LAYER
). -
DoubleLineNodePlacer
: 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. -
TreeReductionStage
: Fixed wrong handling of group nodes which may cause aWrongGraphStructure
exception 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. -
MultiPageLayout
: Fixed bug that caused that anAbortHandler
attached to the input graph was ignored. -
MultiPageLayout
: FixedNullPointerException
that may occur if the edge ID data provider (seeMultiPageLayout.EDGE_ID_DPKEY
is an instance ofIEdgeMap
. -
MultiPageLayout
: Fixed bug that may cause non-orthogonal edge routes. -
ComponentLayout
: Fixed bug that caused anArrayIndexOutOfBoundsException
if the style is set toComponentArrangementStyles.MULTI_ROWS_HEIGHT_CONSTRAINT
orComponentArrangementStyles#MULTI_ROWS_HEIGHT_CONSTRAINED_COMPACT
(seeComponentLayout.setStyle(ComponentArrangementStyles)
) and all components exceed the preferred height (seeComponentLayout.setPreferredLayoutSize(double, double)
). -
PortCandidateSet
: Fixed bug that caused methodPortCandidateSet.CandidateMatcher.findMatchingCandidate
() to return the entry with the highest cost instead of the lowest cost if the candidate matcher is created with methodPortCandidateSet.createMatcher()
. -
CopiedLayoutGraph
: FixedNullPointerException
that occurs when nodes or edges are added to the copied graph without removing them before callingcommitLayoutToOriginalGraph()
. -
CopiedLayoutGraph
: Fixed problem that may cause movement of label boxes in the original graph even if methodCopiedLayoutGraph.commitLayoutToOriginalGraph()
is not called. -
BorderLine
: Fixed bug in methodgrow(double, double, boolean)
that may produce anIllegalArgumentException
because the min value of a BorderLine becomes greater than its max value. -
PartialLayout
: Fixed bug that may cause broken edge routes for edges incident to incremental group nodes if optionsetImmediateInterEdgeRoutingEnabled(boolean)
is enabled. -
EdgeRouter
: Fixed rareNullPointerException
that mainly appears if there are overlapping nodes. -
EdgeRouter
: Fixed bug that may cause zero length routes of edges whose start and end point are at the same location. -
AbstractLabeling
: Fixed bug that may cause removal of labels that don't overlap with other elements if optionsetNodeOverlapsRemovalEnabled(boolean)
is enabled.
yFiles for JavaFX 2.0.0.1
Bugfixes
Viewer
CanvasContainer
as well as internally used subclasses ofParent
now callParent#requestLayout
upon changes to their list of children. This serves as a workaround for the JavaFX bug documented inJDK-8130376
. This makes using JavaFX controls as part of the visualization of elements in aCanvasControl
a lot easier because they are now correctly layouted by the framework.- The
AbstractContextMenuInputMode
now opens the context menu on a JavaFX control at the correct location in the canvas. - Fixed a bug where using
NodeStyleDecorationInstaller
and similar classes would cause anIndexOutOfRangeException
. Also extended theGraphViewerDemo
with a showcase for those classes in conjunction with theItemHoverInputMode
. GraphML
: Fixed incorrect parsing of CDATA sections.- A bug in
RotatedSliderEdgeLabelModel
that could only occur in very rare occasions where the first or last edge segment is orthogonal and the source or target port was completely outside the node boundaries, could cause the label to lie at infinite coordinates. In most cases this would result in the label becoming just invisible, 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.
GenericYList
: Calling#add
on an empty list has thrown an exception.MoveViewportInputMode
no longer fires theDragFinishing
andDragFinished
events for simple clicks without any mouse movement.NodeDefaults
,EdgeDefaults
and all otherDefaults
: it was erroneously possible to assignnull
to the#Style
property. Now, the property throws anNullPointerException
in this case.FoldedGraph
detects more carefully what has changed before invoking the methods#createDummyEdgeAppearance
and#changeDummyEdgeAppearance
ofIDummyEdgeConverter
. Previously, in some cases, these methods were called too often or not at all.- 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. - 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.DefaultArrow#getLength
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
. - Explicit null values (
<x:Null/>
) in GraphML could lead toNullPointerException
. - GraphML serialization can be forced to write a class property in element syntax using the
GraphML
annotation's#writeAsAttribute
property with valueXamlAttributeWriteMode#NEVER
. Forcing a property that is shared to be written as element lead to invalid GraphML files. - If property
GraphEditorInputMode#Graph
had been changed, the mode still held a reference to items from the previous graph instance, thus delaying garbage collection of that graph instance. This has been improved. - Orthogonal edge editing could throw an exception if edges were removed during a gesture that would require edge orthogonalization.
- Event location of the various
TapInputMode
events was not always updated properly. - Improved performance of
BridgeManager
and prevented redundantGeneralPath#lineTo
path elements. - Changes to
IGraph#getNodes
,IGraph#getEdges
and other collection properties onAbstractGraphWrapper
implementations were not correctly propagated to the wrappedIGraph
instance. In particular, this affected folding views. NodeDropInputMode
: If the property#LeafAsParentEnabled
was set totrue
, the value of the#FolderAsParentEnabled
property was ignored.
Layout
EdgeRouter
: Fixed rareNullPointerException
that may occur for graphs where only a subset of edges is routed, seeEdgeRouter#setSphereOfAction
.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.ComponentLayouterModule
: Disabled from-sketch option for styles that don't support it.IncrementalHierarchicLayouter
: Fixed label placement for octilinear selfloops with the same side constraints for source and target port.
Demos
- Improved demos to look better with different dpi settings.
ReshapeHandleProviderApplication
: Prevented the demo from crashing when nodes are resized to zero.IncrementalHierarchicLayouterApplication
: Improved demo to support touch input.
Incompatible Changes
Changes in Default Behavior
NodeDropInputMode
: If the property#LeafAsParentEnabled
was set tofalse
, dropping a node onto a leaf node did not consider parent group nodes of the leaf node as possible drag targets. The fixed behavior is slightly incompatible with the previous release.
yFiles for JavaFX 2.0
Major Features Added
Viewer
- Added support for
Java 8
.-
Added support for streams in yFiles collection class
This means that it is now possible to use the stream API with most of the data structures in the yFiles library. For example, it is now possible to writeEnumerable
.
to retrieve all labeled nodes in an IGraph.graph.getNodes().stream().filter(node -> node.getLabels().size() > 0);
- Convenience methods for many yFiles classes defined in utility classes (so-called extension classes) were added as default methods to yFiles interfaces and are thus easier to find and to use. For example, to remove all entities in proper order from a graph, instead of calling
you can simply call the same method defined as a default method onGraphExtensions.clear(graph)
IGraph
on the graph instance:graph.clear()
-
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.- The
GraphClipboard
now supports an optional target location for pasting and the new methodGraphEditorInputMode#pasteAtLocation
can be used for this end, too. In addition,ApplicationCommands#PASTE_COMMAND
now supports an optional parameter of typeIPoint
to provide a target location. 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 commandGraphCommands#DUPLICATE_SELECTION_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 methods#reverseEdge
and#reverseEdges
have been added toGraphEditorInputMode
. Also, the new commandGraphCommands#REVERSE_EDGES_COMMAND
(shortcut: Ctrl-R) has been added.- 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 anLabelSnapContext
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#HidingLabelDuringEditingEnabled
. 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#LabelEditingOnDoubleClickEnabled
. IEditLabelHelper
implementations provided by theILabel
's lookup can now be used to forbid or customize the editing of individual labels. ClassLabelDecorator
provides a new property#EditLabelHelperDecorator
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
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 for requesting early but graceful termination (see#stop
) and immediate termination (see#cancel
).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
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
EdgeRouter
SALabeling
- Added support for parallel execution of computationally intensive tasks.
Layout algorithmsSmartOrganicLayouter
andOrganicLayouter
may take advantage of multiple threads for layout calculations. Parallel execution is enabled using the algorithms'setMultiThreadingAllowed(boolean)
method.
InterfaceITaskExecutor
and factory classesTaskExecutorFactory
make up the programmatic interface for the new concurrency support. - 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
EdgeRouter
SelfLoopLayouter
GreedyMISLabeling
SALabeling
InsetsGroupBoundsCalculator
MinimumSizeGroupBoundsCalculator
SmartOrganicLayouter
: Added support for partition grid layout. SeePartitionGrid
.
Minor Features Added
Viewer
- Added class
CanvasPrinter
that leverages the new printing API of JavaFX 8 ContextMenuInputMode
has now an abstract subclass to handle non-JavaFX context menu as shown in the interoperability demos.LayoutExecutor
can now safely handle concurrent layout requests. By default an already running layout will be short-cut and the next layout request will be processed. Property#SequentialExecution
can be set tofalse
to revert to the old (unsafe) behavior. The new#stop
method and the#Running
property can also be used in this context.GraphEditorInputMode
got support for cyclic click selection. This helps in conveniently selecting items that are hidden behind other items. By default, this features is bound to the Alt-Key being pressed. It can be disabled by setting the#CyclicSelectionRecognizer
property toEventRecognizers#NEVER
.ItemDropInputMode
is a newDropInputMode
that facilitates subclasses that 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.ItemHoverInputMode
is a newIInputMode
that fires events when the mouse enters or leaves the visualization of a graph item.GraphEditorInputMode
andGraphViewerInputMode
provide a newCanvasClicked
event to detect clicks on an empty canvas location.- Node ports can now be moved by dragging their
IHandle
. - When zooming while editing a label, the label text editor now stays at its minimum (maximum) size when the zoom level becomes smaller (larger) than the specified threshold. Previously, the label text editor jumped back to the size of zoom level
1.0
for such values. GraphClipboard
has new propertiesCopyItems
,IndependentCopyItems
, andDependentCopyItems
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
andGraphEditorInputMode
: TheirClickInputMode
now delivers both left and right clicks.GraphViewerInputMode
: The click hit test order can now be configured by property#ClickHitTestOrder
.GraphEditorInputMode
provides an explicit hit test order for double clicks that can be changed through the#DoubleClickHitTestOrder
property. By default, this hit test order prefers labels over other graph elements.- Added new methods
ClickInputMode#preventNextDoubleClick
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#ReparentingToLeavesEnabled
is enabled. In this case, leaves are converted into group nodes. - Added support for deleting bends in a way that an orthogonal edge remains orthogonal after removing the bends. The new property
GraphEditorInputMode#OrthogonalBendRemovalEnabled
enables/disables this feature. GraphViewerInputMode
now supports multi-selection via 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.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.- Improved
GraphModelManager
to allow for easier customizations. Property#HierarchicNestingEnabled
was added to allow for adding custom logic that uses a different approach to hierarchic nesting. Also the return types of some of the factory methods where made less restrictive to allow for further modifications. FoldingManager
now offers two convenience methods,#updateViewStates(INode)
and#updateViewStates(IEdge)
, that will trigger update calls onIDummyNodeConverter
andIDummyEdgeConverter
for elements that are currently being displayed in a view. This makes it easier to synchronize states between the master graph and the folded graph views in case this is not automatically performed by the default implementation.
Layout
BalloonLayouter
: Added support for integrated node and edge labeling. See new properties#IntegratedEdgeLabelingEnabled
,#IntegratedNodeLabelingEnabled
, and#NodeLabelingPolicy
.BalloonLayouter
: Added support for different policies to align nodes having the same root node. See new property#ChildAlignmentPolicy
.BalloonLayouter
: Added support for interleaved child node placement. With interleaved placement, child nodes are placed at different distances to their parent node to achieve a more compact layout. See new property#InterleavedMode
.IncrementalHierarchicLayouter
: Improved partition grid support. Nodes can now be mapped to a multi-lane partition cell identifier, i.e., a cell spanning multiple columns and rows. SeePartitionGrid
.IncrementalHierarchicLayouter
: Improved edge label placement. Edge labels with preferred placement at source/target are placed closer to the corresponding node. Additionally,SimplexNodePlacer
offers the option to place adjacent edge labels in a compact, stacked style. See new property#LabelCompactionEnabled
.EdgeRouter
: Added a fine-granular configuration option to weigh the crossing costs for each label using the data provider look-up key#LABEL_CROSSING_COST_FACTOR_DPKEY
.EdgeRouter
: Added property#IgnoreInnerNodeLabelsEnabled
for ignoring node labels that are inside the bounds of their owner node. Node labels that are ignored because of this setting may be crossed by edges. This is especially useful if inner labels of group nodes may be crossed but outer labels of normal nodes may not.EdgeRouter
: Added support for customizing the order in which edges are routed. See new property#EdgeOrderComparator
.GenericTreeLayouter
: When enabling the new properties#IntegratedNodeLabeling
and/or#IntegratedEdgeLabeling
, the respective labels will be taken into account during the calculation of group bounds.PartialLayouter
: Now supports handling of directed and undirected edges; see data provider key#DIRECTED_EDGES_DPKEY
.LabelLayoutTranslator
: Added properties#WriteBackRelativeEdgeLabelLocationEnabled
and#WriteBackRelativeNodeLabelLocationEnabled
that allow a core layouter to specify new node or edge label locations relative to the label's owner.LabelLayoutKeys
: Added key#IGNORE_LABEL_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.
Demos
- Added a demo to show how to print the contents of a yFiles CanvasControl using the JavaFX 8 printing API.
- Added a demo to show how to use yFiles for JavaFX in an Eclipe RCP application.
- Added a demo to show how to use the JavaFX 8 rich text API together with yFiles labels.
- Interoperability demos show how to wire up
Command
s of the GraphControl with buttons in the toolbar. - Interoperability demos show how to implement a ContextMenuInputMode that handle non-JavaFX context menu controls.
- Interoperability demos show how to implement drag and drop of nodes from a Swing or SWT palette to the GraphControl.
- Removed Shrinker from obfuscation demo since it is not Java 8 compliant yet.
Tutorials
- Vastly improved the
Getting Started
tutorial in regards to documentation and content.
Improvements
Viewer
- To support proper serialization and deserialization of URLs, we have added the ability to specify the base URI when loading GraphML files via methods that use
java.io.InputStream
orjava.io.Reader
. The added methods in particular are:GraphControl#importFromGraphML(InputStream, URI)
GraphControl#importFromGraphML(Reader, URI)
GraphMLIOHandler#read(IGraph, InputStream, URI)
GraphMLIOHandler#read(IGraph, Reader, URI)
GraphMLParser#parse(InputStream, URI, IGraph, IGraphElementFactory)
GraphMLParser#parse(Reader, URI, IGraph, IGraphElementFactory)
- Added class
RenderContext
as a default implementation of theIRenderContext
interface for use in custom calls to rendering related methods likeIVisualCreator#createVisual(IRenderContext)
orCanvasControl#createContentVisual(IRenderContext)
. An instance of this class can be obtained by callingCanvasControl#createRenderContext
. - Added class
ContextConfigurator
which can be used to createIRenderContexts
that are configured to render certain regions of a CanvasControl with a certain scale and margins. This class is used for image export and printing. - ResizeStripeInputMode uses now the proper cursors for resizing stripes.
- Zooming with the mouse wheel now works with the Shift key pressed.
- The performance of parsing GraphML files has been improved. The speed-up is especially notable for large graphs with several thousands of nodes.
- Optionally,
LayoutExecutor
usesWaitInputMode
while waiting during the calculation of a layout. LayoutGraphAdapter
provides now the originalTag
data for temporary graph objects.ContextMenuInputMode
added support for Menu-Key.- Added serialization and deserialization for
javafx.scene.paint.LinearGradient
,javafx.scene.paint.RadialGradient
andjavafx.scene.paint.ImagePattern
. - Added proper serialization and deserialization for URLs. This means that it is now possible to use relative paths for external resources in GraphML, for example for images in
ImageNodeStyle
. GraphControl
: Added the method#importFromGraphML(URL)
to conveniently load GraphML files from URLs.- Various performance improvements for the rendering and the selection handling. This affects, amongst others, styles that use a
GeneralPath
. - Property
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 property#IgnoringVoidStylesEnabled
specifies whether this feature is enabled.GraphEditorInputMode
andGraphViewerInputMode
: the new protected method#shouldSelect
can be overridden to determine whether an item can be selected in general.DropInputMode
: Added property#LastDragEvent
.OverviewInputMode
: The new property#Margins
specifies margins for the visible area of the boundGraphOverviewControl
. The new protected method#updateVisibleArea
provides further means for customizing the visible area.CompositePositionHandler
: Added methods#getPositionHandler
and#getHandle
to retrieve an earlier addedIPositionHandler
orIHandle
.PortRelocationHandle
s now triggers theEdgePortsChanged
event of theGraphEditorInputMode
.EdgeStyleDecorationInstaller
can now be used with self loops without bends, too.TableLayoutConfigurator
: Improved support for routing algorithms.IGraph
: The collection models of graph items returned by the methods#getNodes
,getEdges
, etc. now support the methods#remove
and#clear
to remove graph items from the graph. Note that calling the method#add
is still not allowed.GraphModelManager
: New callback method#onGraphChanged
.LayoutExecutor
: The new property#ConsideringViewportLimiterEnabled
can be used to let the target viewport after a layout respect theViewportLimiter
of theGraphControl
.
TheViewportAnimation
has a new property#ConsideringViewportLimiterEnabled
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 method#createSmoothedPath
creates a new path as copy of a given one but with smoothed bends.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
: Method#fitContent
now respects the#ViewportLimiter
property. This might result in zoom levels greater than1.0
.DefaultDummyEdgeConverter
now synchronizes the#Tag
property of the first label if label synchronization is enabled.GraphCopier
has been improved to facilitate manipulation of the copied items:- The new events
NodeCopied
,EdgeCopied
,LabelCopied
, andPortCopied
are dispatched after a model item has been copied. - The method
#getOrCreateCopy<T>
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 property#ParentNodeDetection
.
Algorithms
Dfs
: Added method#cancel
that can be used by subclasses to cancel the search.Cycles
: Improved method#findCycle
to stop the search as soon as the first cycle has been found.
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
: 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 method#optimizeAfterSequencing
.SmartOrganicLayouter
: Now uses a more sophisticated approach to remove node overlaps if the scope is set to#SCOPE_ALL
and the quality to time ratio (see#setQualityTimeRatio
) is greater than or equal to0.7
.InteractiveOrganicLayouter
: Method#startLayout
now takes advantage of multiple threads for layout calculation which may reduce the required runtime.PartitionLayouter
: Added nested classPolylineInterEdgeRouter
that routes inter-edges using classEdgeRouter
.PartialLayouter
: Now considers port constraints independent of the specified layout orientation. Note that port constraints are considered only if the core layout algorithm (see#setCoreLayouter
) supports port constraints as well.PartialLayouter$StraightLineEdgeRouter
: Added support for port constraints.RecursiveGroupLayouter
: Added property#ReplacingPortConstraintsEnabled
that replaces port constraints by port candidates and, thus, may improve the layout result.EdgeRouter
: Memory usage has been reduced.EdgeRouter
: Added penalty setting for edge length. See property#EdgeLengthPenalty
.EdgeRouter
: Now avoids very small octilinear segments.EdgeRouter
: Added four predefined optimization strategies. SeePenaltySettings#OPTIMIZATION_BALANCED
,PenaltySettings#OPTIMIZATION_EDGE_BENDS
,PenaltySettings#OPTIMIZATION_EDGE_CROSSINGS
, andPenaltySettings#OPTIMIZATION_EDGE_LENGTHS
.DirectedOrthogonalLayouter
andOrthogonalGroupLayouter
: Added optimization step that reduces the number of perceived bends. See new property#PerceivedBendsOptimizationEnabled
.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 property#AlignDegreeOneNodesEnabled
.OrthogonalGroupLayouter
: Improved routing and edge labeling for self-loops of normal (non-group) nodes.LayoutTool
: Added new rectangle arrangement method#arrangeRectangleMultiRows(java.awt.geom.Rectangle2D[], java.awt.geom.Rectangle2D, double, double, boolean, byte, int)
suitable for arranging rows of rectangles with highly different sizes.ComponentLayouter
: Added new component arrangement strategies#STYLE_MULTI_ROWS
,#STYLE_MULTI_ROWS_COMPACT
,#STYLE_MULTI_ROWS_HEIGHT_CONSTRAINED
,#STYLE_MULTI_ROWS_HEIGHT_CONSTRAINED_COMPACT
,#STYLE_MULTI_ROWS_WIDTH_CONSTRAINED
, and#STYLE_MULTI_ROWS_WIDTH_CONSTRAINED_COMPACT
suitable for components with highly different sizes.
Bugfixes
Viewer
- Fixed static method
FlagsEnum#xor
that called non-static method#and
by mistake. - Fixed unfunctional
PointSelectionIndicatorInstaller
. GraphML
:- Fixed a possible
NullPointException
when deserializing properties of obfuscated enums. Folding
: Source port tags in view states were not parsed correctly.- Properties with a text value containing nested
CDATA
sections were not parsed correctly. - Primitive types like floats and doubles could not be read when used in element syntax.
- Write events were not always raised.
- Fixed a bug were incorrect values for bend tags were written.
- The
#Name
property of the@GraphML
annotation was not considered during deserialization. GraphMLIOHandler
: Method#addNamespace
had no effect, and adding a custom schema with#addSchemaLocation
triggered an exception.
- Fixed a possible
TableEditorInputMode
by default also handled right clicks, which prevented the context menu for stripes from appearing and erroneously toggled the stripe selection state.- Creating a new node as a child of an existing node which was not a group node did not cause the state change to be recorded by the undo engine. After undoing the node creation, the parent node still behaved like a group node. Such an implicit change is now recorded properly and can be reverted through undo as expected.
- Fixed too large dirty regions when using certain kinds of
SnapLines
. - Fixed memory leak that occurred when
CreateEdgeInputMode
was uninstalled. CanvasControl
: Fixed incorrect event propagation.CreateEdgeInputMode
now removes event handlers when it is uninstalled.- It is now possible to set the line spacing and wrapping width for the JavaFX Text nodes that the
SimpleLabelStyle
is producing to render labels via its#TextFormat
property. SimpleLabelStyle
:#ClippingText
property is now useful.ShinyPlateNodeStyleRenderer
now uses its getters to access the properties of its style. This means that overriding them now has an effect.SimpleLabelStyleRenderer:
Prevented NullPointerException for labels with negative width or height.Pen
:- Changed default values for
#LineCap
and#LineJoin
properties. - Fixed incorrect application of the
#DashStyle
property.
- Changed default values for
TextEditorInputMode
: The internal positioning/scaling calculation now respects the values returned by the methods#getMaximumZoom
and#getMinimumZoom
properly.FilteredGraphWrapper:
#dispose
did not clean up all event listeners.- 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.
IUndoSupport
: Manually bracketing undo edits withbeginEdit
might have led to exceptions when folding was active.ClickInputMode
: The property#FocusClickSwallowingEnabled
had only an effect for the very first click.- Copying table stripes did not work correctly.
GraphOverviewControl
: Moving the viewport by clicking into the control did not honor the#ViewPortLimiter
property restrictions ofCanvasControl
.RotatedSliderEdgeLabelModel
can now deal with edge paths that arenull
, e.g. when usingVoidEdgeStyle
.FoldedGraph
detects more carefully what has changed before invoking the methods#createDummyEdgeAppearance
and#changeDummyEdgeAppearance
ofIDummyEdgeConverter
. Previously, in some cases, these methods were called too often or not at all.- 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. - Fixed
LayoutGraphAdapter
producing threading issues whenPortCalculator
was used during a multi-threaded layout. - 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.CreateEdgeInputMode
: Fixed some problems with mixed mouse and touch input.- When using an
IEditLabelHelper
and adding a label interactively, the helper's#editLabel
callback was called instead of#addLabel
. - Newly added labels could have had an empty size when an
IEditLabelHelper
instance was registered. - When a highlighted item was removed from the graph, the highlight was not cleaned up.
- Reparenting an empty group node displayed the target node highlight around the reparented node.
- The modified
MoveInputMode
created 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.
ClickInputMode
: Cancelling the mode during clicks didn't work correctly and as a result, the location reported for the next click might have been wrong.CreateEdgeInputMode
now copies the dummy edge's tag to the created edge. This could have caused issues when theEdgeCreationStarted
event was used to 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.GeneralPath
: Method#transform
, amongst others usingMatrix2D
, applied the transformation matrix incorrectly in the case of a rotation.IconLabelStyle
: Method#getBounds
inIconLabelStyleRenderer
returned a valid rectangle even if the label layout was invalid. As a consequence,IsVisible
erroneously returnedtrue
for labels with invalid bounds.- The lookup of
CollapsibleNodeStyleRenderer
was missing the correct results forIGroupBoundsCalculator
,ISizeConstraintProvider
, andIShapeGeometry
. CanvasControl#ensureVisible
hasn't worked for bounds larger than the current viewport.- Setting the view point on a
CanvasControl
with a width or height of 0.0 could cause an exception if a#ViewportLimiter
was set. GraphCopier
threw anConcurrentModificationException
if the source and the target graph are identical.GraphEditorInputMode
andGraphViewerInputMode
now respect theMultiSelectionRecognizer
for extending an existing selection via marquee.- Fixed
TableEditorInputMode
exhibiting problematic behavior under certain circumstances when theGraphControl
's graph is replaced. 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.FilteredGraphWrapper
: The#edgesAt
methods erroneously returned edges that were marked as hidden by the#EdgePredicate
. The methods#degree
,#inDegree
and#outDegree
are based on these methods and were affected, too.GraphSnapContext
: Snapping nodes to vertical edge segments was not working if property#NodeToEdgeDistance
was set to 0.- The
EdgeStyleDecorationInstaller
did not copy the tags of dummy ports and edges used when displayed in view coordinates (#ZoomMode
=DecorationZoomMode#VIEW_COORDINATES
). GraphEditorInputMode#findItems
: Only the first element in thetest
array parameter was actually checked.
Layout
MultiPageLayouter
: Fixed bug that caused that anAbortHandler
attached to the input graph to be ignored.IncrementalHierarchicLayouter
: Fixed routing style violations in octilinear grouped edges.MultiPageLayouter
: FixedNullPointerException
that may occur if the edge-id DataProvider (seeMultiPageLayouter#EDGE_ID_DPKEY
) is an instance ofEdgeMap
.IncrementalHierarchicLayouter
: FixedNullPointerException
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 methodPortCandidateSet.ICandidateMatcher#findMatchingCandidate()
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 anArgumentException
if DataProvider-KeyPortConstraintKeys#SOURCE_GROUP_ID_DPKEY
is registered to the input graph but DataProvider-KeyPortConstraintKeys#TARGET_GROUP_ID_DPKEY
is not registered.ComponentLayouter
: Fixed bug that caused anArrayIndexOutOfBoundsException
if the style is set toComponentArrangementStyle#MULTI_ROWS_HEIGHT_CONSTRAINT
orComponentArrangementStyle#MULTI_ROWS_HEIGHT_CONSTRAINT_COMPACT
(seeComponentLayouter#Style
) and all components exceed the preferred height (seeComponentLayouter#PreferredLayoutSize
).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 aInvalidGraphStructureException
if the input graph contains group nodes with incident edges.TreeLayouter
: Fixed bug that may cause aClassCastException
if the input graph is aCopiedLayoutGraph
that consists of multiple connected components and the layouter uses theLayeredNodePlacer
(e.g., if optionTreeLayouter#setChildPlacementPolicy
is set toChildPlacementPolicy#ALL_LEAVES_ON_SAME_LAYER
).IncrementalHierarchicLayouter
andRankAssignments
: Fixed possibleNullPointerException
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 rareNullPointerException
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 optionImmediateInterEdgeRoutingEnabled
istrue
.CompactOrthogonalLayouter
: Fixed possibleIllegalArgumentException
caused by nodes without node-ids. This problem may only appear if the inter edge router is set toPartitionLayouter.ChannelInterEdgeRouter
.- Running any label placement algorithm had no effect for node/edge labels if the properties
#NodeOverlapsRemovalEnabled
/#EdgeOverlapsRemovalEnabled
were enabled because all potential candidates were erroneously rejected. 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.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 to node halos.IncrementalHierarchicLayouter
: Fixed minimum edge length for orthogonal edges. It is now also taken into consideration for edges that connect to a node's side and for backloop edges (see property#BackloopRoutingEnabled
).IncrementalHierarchicLayouter
: Fixed possibleArrayIndexOutOfBoundsException
inPCListOptimizer
that may appear if there are port constraints which have no matching port candidate or port candidate set entry.IncrementalHierarchicLayouter
: Fixed possibleIndexOutOfBoundsException
ifPortConstraint
s are used together withPortCandidateSet
s.EdgeRouter
: Minimum first and last segment length and minimum node to edge distance were sometimes ignored when used together with octilinear routing style.GraphGrouping
: Fixed bug in method#getNearestCommonAncestor
that sometimes caused wrong results if one of the specified nodes is the ancestor of the other node.InsetsGroupBoundsCalculator
: Fixed method#calculateBounds
to consider only the given child nodes and all edges between those child nodes instead of all nodes and all edges in the graph.GenericTreeLayouter
: FixedNullPointerException
that occurred when usingLayeredNodePlacer
as default node placer.LayoutTool
: Fixed calculation of lower width bound in method#arrangeRectangleRows(java.awt.geom.Rectangle2D[], java.awt.geom.Rectangle2D, double, int)
. 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 possibleNullPointerException
caused by labels with zero width/height and a "free" edge label model.
Incompatible Changes
Viewer
CanvasControl
: Removed obsolete#PrintCommandsEnabled
property.PixelImageExporter
: instead of using the JavaFXSnapshotParameters
class directly, the exporter now holds an instance ofContextConfigurator
which is designed to make the exporting of a certain region or scale of the contents of aCanvasControl
to an image a lot easier. Clients can still overwrite the new protected method#getSnapshotParameters
to return an instance ofSnapshotParameters
that will be used to make the actual snapshot of the JavaFX node.IRenderContext
: removed obsolete methods#getWorldTransform
and#getTransform
since all calculations related to rendering and transformation of elements can be achieved by the transform returned by#getViewTransform
.- To support proper resize cursors the properties
CanvasCursor#SizeNS
CanvasCursor#SizeWE
CanvasCursor#SizeNWSE
CanvasCursor#SizeNESW
CanvasCursor#SizeSizeAll
CanvasCursor#SizeN
CanvasCursor#SizeS
CanvasCursor#SizeE
CanvasCursor#SizeW
CanvasCursor#SizeSE
CanvasCursor#SizeNE
CanvasCursor#SizeSW
CanvasCursor#SizeNW
CanvasCursor#Move
- To handle non-JavaFX context menu controls
ContextMenuInputMode
has now a super classAbstractContextMenuInputMode
that is used in theMainInputMode
andGraphEditorInputMode
. ThecontextMenu
property of classPopulateContextMenuEventArgs
has now typeObject
and must be cast to the type of the context menu control of the used toolkit. - Obsolete classes
InputGesture
andKeyGesture
were replaced by the JavaFX classjavafx.scene.input.KeyCodeCombination
. CanvasControl
: removed erroneous and obsolete#invalidateWorld
method.Pen
: removed unused#DashCap
property.- Class
DateTime
was replaced by the Java 8 classInstant
. - Class
javafx.util.Duration
was replaced by the more common Java 8 classjava.time.Duration
. - Property URL of class
ImageNodeStyle
is now of typejava.net.URL
instead of string. GraphML files that use this property might not load anymore because of this change. In this case, the specified paths in the file need to be adjusted to URLs. TextEditorInputMode
: The resource key#TEXT_BOX_STYLE_KEY
was removed due to insufficient compatibility with the JavaFX css styling mechanism. Clients that want to change the visual appearence of the text box should instead retrieve the instance of the control via#getTextBox
and use the JavaFX framework methods to change the style.
API Changes
-
Changed
SnapLine
to support non-orthogonal snap lines as well: its properties#From
and#To
have been changed from typedouble
toPointD
, its property#Orientation
was removed, and its constructors have been changed accordingly.Orthogonal snap lines are now modeled by class
OrthogonalSnapLine
. It extendsSnapLine
and provides the property#Orientation
. Existing API uses eitherSnapLine
orOrthogonalSnapLine
, depending on whether it works only with orthogonal snap lines or not.As a consequence, in class
SnapLineSnapResult
, the method#getSnapLine
returns a non-orthogonalSnapLine
and#getDelta
returns aPointD
instead of adouble
. API related toGraphSnapContext
still works only with orthogonal snap lines and usesOrthogonalSnapLine
. - The
#Key
property onSingleLineSnapLineContainer
,FixedDistanceSnapLineContainer
andInBetweenSnapLineContainer
, 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.AlgorithmAbortedException
: Removed overloaded methods#check
. Client code that needs to terminate layout calculations prematurely must use new classAbortHandler
instead.- Moved classes
PartitionGrid
,PartitionCellId
,RowDescriptor
, andColumnDescriptor
from packagecom.yworks.yfiles.layout.incremental
to packagecom.yworks.yfiles.layout.grid
. IItemFactory
: Added method#createRedirectedGroupEdge
.LayeredNodePlacer
: Removed data provider key#DISTANCE_TO_PARENT_MAP_DPKEY
from public API, since it is for internal use only.EdgeRouter
: Penalty settings have been changed to double precision. See classPenaltySettings
.PathSearch
: Signature of method#calculateCosts
has changed. It now takes an additional double array as parameter that is populated with the calculated costs instead of returning a new array.GraphClipboard
's protected method#copy(IGraph, Predicate<IModelItem>, IGraph, ElementCopiedDelegate)
which was called by#cut
,#copy
, and#paste
to invoke theGraphCopier
has been split:#copy(IGraph, Predicate<IModelItem>, IGraph, ElementCopiedDelegate)
now is called only by#cut
and#copy
.#paste
now invokes the new method#paste(IGraph, Predicate<IModelItem>, IGraph, ElementCopiedDelegate, Predicate<IModelItem>)
.- The type of
GraphMLAttribute
's#Serializable
property has been changed fromboolean
to the enumGraphMLSerializationMode
. GraphEditorInputMode
andTableEditorInputMode
: return value of callback methods#onAddLabel
and#onEditLabel
has been changed fromvoid
toboolean
. The return value should specify whether the operation in question was successful.- The
ContextMenuInputMode
's protected methodonPopulateContextMenu(ContextMenu, PointD, boolean)
and the constructors ofPopulateContextMenuEventArgs
andPopulateItemContextMenuEventArgs
now require an additional argument that indicates whether the request to display a context menu was caused by the keyboard.
Behavior Changes
- The default constructor of
TextFormat
andSimpleLabelStyle
uses now the default font of the current UI environment instead of "Arial". TableEditorInputMode
now only handles left mouse clicks by default, which is consistent with the rest of the library.EdgeRouter
: Labels of table nodes are no longer ignored by the router ifTableLayoutConfigurator
is used to prepare the graph for layout calculations. If you want to ignore such labels you can use aIDataProvider
registered with keyLabelLayoutKeys#IGNORE_LABEL_KEY
.EdgeRouter
: Method#doLayout
now throws anIllegalArgumentException
if there is a node with zero width or height in the given graph.FixedGroupLayoutStage
: Method#getOrthogonalEdgeRouter
now returns an instance of classEdgeRouter
instead of classOrthogonalEdgeRouter
.ComponentLayouter
: Method#setPreferredLayoutSize
now throws anIllegalArgumentException
when setting the preferred size to negative values or zero.- Changed default behavior of edge label placement in
OrthogonalLayouter
andLabelLayoutDataRefinement
when usingPreferredPlacementDescriptor#PLACE_ANYWHERE
Now edge labels are placed on the edge and in the center between source and target node. GraphEditorInputMode
now by default supports the newGraphCommands.DUPLICATE_COMMAND
that is bound to keyboard shortcut Ctrl-D. If this behavior is undesired new behavior, the#DuplicationEnabled
property can be set tofalse
.- The clipboard now supports copying and pasting of items independently from their owning elements. E.g. single selected labels can be copied to other elements, as well as edges without their source and target nodes. This behavior can be reverted to the old behavior by setting
GraphClipboard
's#IndependentCopyItems
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 by setting the#EdgeReversalEnabled
property tofalse
.ClickInputMode
: If#ActiveButtons
includesMouseButtons#RIGHT
, the original right click event is marked as handled if ClickInputMode's event handlers mark the higher level click event as handled. Especially, no context menu will be shown if the right click is handled by ClickInputMode itself.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 where no edges attached to them after the operation. Now those empty ports are not copied/pasted anymore unless the
PortDefaults
'#AutoCleanupEnabled
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 edges where 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. GraphEditorInputMode
'sNodeCreated
event may now report nodes that are not part of the graph, when the user has dropped a node viaNodeDropInputMode
and the newNodeDropInputMode#FolderAsParentEnabled
property is enabled. By default this feature is disabled, though.IReparentNodeHandler
's#isValidParent
method may now also be queried if the newGraphEditorInputMode#ReparentingToLeavesEnabled
property is enabled. By default this property is disabled, though. Note that the method will also be queried if the reparent handler is used outside the context ofGraphEditorInputMode
.GraphMLValueSerializerContext
: The property#Instance
now provides the object that should be converted, not the parent object. If you need to access the actual parent object, you can use the#Owner
property.GraphMLIOHandler
: The eventQueryReferenceId
is now never fired forMarkupExtensions
and other proxy objects for serialization, only for the original object references.EdgeRouter
: Method#doLayout
now throws anIllegalArgumentException
if there is a node with zero width or height in the given graph.FixedGroupLayoutStage
: Property#OrthogonalEdgeRouter
now yields an instance of classEdgeRouter
instead of classOrthogonalEdgeRouter
per default.ComponentLayouter
: Method#setPreferredLayoutSize
now throws anIllegalArgumentException
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
. LabelCandidateDescriptor
: The default values of the properties#EdgeOverlapPenalty
and#NodeOverlapPenalty
have been changed to0.0
. Values greater than0.0
trigger a known issue in all generic label placement algorithms that erroneously rejects all potential candidates. As a result, no suitable placement is calculated in this case.MoveInputMode
accepts mouse hovers with the Shift key held down again.GraphEditorInputMode
andGraphViewerInputMode
: By default, graph items styled with a void style (VoidNodeStyle
,VoidEdgeStyle
,VoidLabelStyle
,VoidPortStyle
) won't be selected or get the focus.GraphEditorInputMode
's#ClickHitTestOrder
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 property#ClipboardCommandsEnabled
.- 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_SELECTION_COMMAND
). Duplicating elements can be disabled via theGraphEditorInputMode#DuplicationEnabled
property. GraphEditorInputMode
: Method#shouldBeMarqueeSelectable
is no longer queried by thePaste
command to determine the items which should be selected after paste. Instead, the new method#shouldBeSelectedAfterPaste
is queried. Note that#shouldBeMarqueeSelectable
still is queried to determine the items which should be selected by marquee selection.- Now, all pasted items are selected after a
Paste
(was: only nodes, edges, and bends). This can be configured via the new#PasteSelectableItems
property inGraphEditorInputMode
and the corresponding#shouldBeSelectedAfterPaste
method. - 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 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, its#editLabel
method is now called in addition to an eventual owner's edit helper when the label text is edited. If implementations are present for both the label and the owner, editing is only allowed if both helpers 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 be 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
IEditLabelHelper#editLabel
for either an editable label or its owner provides 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, its#addLabel
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 it's creation (the default behavior), it also must be editable, following the rules above. Therefore anIEditLabelHelper
implementation usually should allow editing of label instances that it has created itself in#addLabel
. - The label owner for which a label is added is now determined in the following order:
- If a label owner is explicitly provided as a command parameter or through a convenience method, or is the only selected element, a label is added if the previous condition is satisfied. No other candidates are tried in that case.
- If multiple label owners are selected, the first one for which the previous condition is satisfied.
yFiles for JavaFX 1.0.0.1
Bugfixes
Viewer
- Fixed a
ConcurrentModificationException
when using newer Java versions (1.8.0_20 and above) inMultiplexingInputMode
that occurred in certain situations (e.g. when resizing a row or column in a table interactively). SimpleLabelStyleRenderer
now updates the location of a label properly (e.g. when using undo).OrientedRectangleExtensions#contains
does not modify the given PointD instance anymore.- GraphML: Prevented an IllegalArgumentException when deserializing images with no image data.
GraphOverviewControl
now adapts its zoom level to size changes of its container.- Node ports can now be moved by dragging their
IHandle
. - Classes of the package
com.yworks.yfiles.geometry
will no longer throw aNullPointerException
when calling#equals
withnull
as parameter. - Key events that are handled by the framework will now be consumed. This prevents that they are processed elsewhere again.
- Looking up typed subclasses of
IHitTestEnumerator
no longer throws aClassCastException
. - Fixed API documentation of method
ImageNodeStyle#clone
which falsely claimed that a deep copy is created.
Layout
IncrementalHierarchicLayouter
: Fixed NPE 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 methodPortCandidateSet.CandidateMatcher#findMatchingCandidate()
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 anIllegalArgumentException
if DataProvider-Keyy.layout.PortConstraintKeys#SOURCE_GROUPID_KEY
is registered to the input graph but DataProvider-Keyy.layout.PortConstraintKeys#TARGET_GROUPID_KEY
is not registered.MultiPageLayouter
: Fixed bug that may cause non-orthogonal edge routes.TreeReductionStage
: Fixed bug that may cause aWrongGraphStructure
-Exception if the input graph contains group nodes with incident edges.TreeLayouter
: Fixed bug that may cause aClassCastException
if the input graph is aCopiedLayoutGraph
that consists of multiple connected components and the layouter uses theLayeredNodePlacer
(e.g., if optionTreeLayouter#getChildPlacementPolicy(byte)
is set toTreeLayouter#CHILD_PLACEMENT_POLICY_ALL_LEAVES_ON_SAME_LAYER
).Polyline.EdgeRouter
: Fixed rareNullReferenceException
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 possibleArgumentException
caused by nodes without node-ids. This problem may only appear if the inter edge router is set toChannelInterEdgeRouter
.AbstractLabelingAlgorithm
: Fixed bug that may cause removal of labels that don't overlap with other elements if optionRemoveNodeOverlaps
is enabled.IncrementalHierarchicLayouter
: Fixed rareInvalidOperationException
that may appear for grouped graphs containing nodes with fixed coordinates hint (see, e.g.,IncrementalHintsFactory.CreateUseExactCoordinatesHint
).IncrementalHierarchicLayouter
: Fixed bug that breaks incremental hints of grouped edges in incremental layout mode. (seeIncrementalHintsFactory.CreateSequenceIncrementallyHint
).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.BorderLine
: Fixed bug in methodGrow
that may result in anArgumentException
because the minimum value of a BorderLine becomes greater than the maximum value.Polyline.EdgeRouter
: Fixed bug that may cause zero length routes of edges whose start and end point are at the same location.IncrementalHierarchicLayouter
: Fixed possibleIndexOutOfRangeException
that may occur for grouped graphs in incremental mode with recursive group layering enabled.BusRouter
: FixedNullReferenceException
that may appear for graphs containing isolated nodes with self-loops.TreeReductionStage
: Fixed wrong handling of group nodes which may cause aWrongGraphStructure
exception as well as broken routes of edges incident to group nodes.- Fixed
NullReferenceException
when usingAssistantPlacer
together with distributed port assignment. IncrementalHierarchicLayouter
: Fixed possibleIllegalArgumentException
caused by an inconsistent order of group nodes.IncrementalHierarchicLayouter
: Fixed broken edge routes that may occur for edges with labels if there are "critical" edges, see#CRITICAL_EDGE_DPKEY
.IncrementalHierarchicLayouter
: FixedIllegalArgumentException
(Graph is not acyclic) inSimplexNodePlacer
that could appear when sequence constraints were added to a graph with swimlanes and group nodes.IncrementalHierarchicLayouter
: FixedIllegalArgumentException
inConstraintIncrementalLayerer
that could appear when layer constraints were added in incremental mode.IncrementalHierarchicLayouter
: Fixed broken edge routes that may occur for edges with labels ifSimplexNodePlacer
's property#EdgeStraighteningOptimizationEnabled
is enabled.IncrementalHierarchicLayouter
: Fixed rareIllegalArgumentException
inBorderLine
that was caused by numerical instability when using swimlanes.SmartOrganicLayouter
: Fixed bug that caused weird placement of fixed elements if the minimal node distance is set to 0.CircularLayouter
: Fixed possibleNullPointerException
when layout style is set to#BCC_ISOLATED
and consider node labels is enabled.- Fixed
NullPointerException
when usingAssistantPlacer
together with distributed port assignment. CircularLayouter
: Fixed issue that may cause infinite/too large node coordinates for unfavorable input settings, e.g., if the maximal deviation angle is chosen to small (see property#MaximalDeviationAngle
). Note that such coordinates may produce infinite looping or other exceptions.MultiPageLayouter
: Fixed possibleNullPointerException
if the input graph contains empty group nodes.MultiPageLayouter
: Fixed possibleClassCastException
if group node insets are specified with classjava.awt.Insets
.PartialLayouter
: Fixed broken edge routes that may appear if option#EdgeRoutingStrategy
is set to#EDGE_ROUTING_STRATEGY_OCTILINEAR
.EdgeRouter
: Fixed wrong heuristic bend calculation if grid is used.BusRouter
: FixedNullPointerException
inBusRepresentations
that could appear if the input graph contains overlapping nodes.AbstractLabelingAlgorithm
: Fixed bug that causes poor results if option#EdgeOverlapsRemovalEnabled
is enabled and the labels should be placed on the edge.FixedGroupLayoutStage
: Fixed#canLayout
which changed the structure and layout of the graph.IncrementalHierarchicLayouter
: Fixed rare bug that caused broken edge routes if edges are routed as polylines.IncrementalHierarchicLayouter
: FixedIllegalArgumentException
that may appear for graphs containing nodes with fixed coordinates.IncrementalHierarchicLayouter
: Fixed bug that caused wrong coordinates of empty rows (see classRowDescriptor
) whose minimum height is zero.LabelLayoutDataRefinement
: Fixed possibleClassCastException
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.DirectedOrthogonalLayouter
: Fixed a bug that sometimes caused misplaced edge labels of grouped edges.TreeLayouter
andGenericTreeLayouter
: Fixed possibleNullPointerException
for trees with empty group nodes.ShuffleLayouter
: Fixed bug that may cause small offsets of fixed nodes.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.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.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.EdgeRouter
: Fixed bug that caused edges that connect a node with an ancestor group node to cross their source nodes when using port constraints.EdgeRouter
: Fixed bug that makes it possible to group the source of one edge and the target of another edge at their common node.EdgeRouter
: Fixed bug that sometimes causes superfluous edge overlaps.EdgeRouter
: Fixed bug that caused minimum distance violation of grouped edges.EdgeRouter
: Fixed rareNullPointerException
while calculating edge crossing costs.EdgeRouter
: Fixed possibleNullPointerException
for edge groups that contain fixed edges.EdgeRouter
: Fixed bug that caused wrong routes for edges grouped with fixed edges.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.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 possibleArrayIndexOutOfBoundsException
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 possibleArrayIndexOutOfBoundsException
.BusRouter
: Fixed possibleIllegalStateException
caused by non-orthogonal edge segments.BusRouter
: Fixed possibleNullPointerException
when routing only a subset of edges without adding aIDataProvider
to the graph that marks edges as selected.EdgeRouter
: Fixed possibleArrayIndexOutOfBoundsException
for graphs with very short fixed edges.IncrementalHierarchicLayouter
: Fixed a bug that could result in infinite y-coordinates when octilinear edge routing was enabled.
Demos
- Fixed the ANT build script to run the demos.
- Fixed the ANT build script to run the SWT interoperability demo with Java 8.