All changes
Version 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 Java (Swing), have a look at the
list of incompatible changes.
Major new features
New Features
View
-
The new class
PortLocationModelParameterSerializer
provides static helper methods
which can convert the built-in IPortLocationModelParameter
implementations into key-value pairs. It
also supports creating IPortLocationModelParameter
instances from these key-value pairs.
-
Added the new property
AspectRatio
to the GeneralPathNodeStyle
which
defines the aspect ratio of the path.
-
The new property
CanvasComponent#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-in ILabelModelParameter
implementations into key-value pairs. It also supports
creating ILabelModelParameter
instances from these key-value pairs.
-
The methods
getNodesRevealedAfterExpand
, getEdgesChangedAfterExpand
, and
getEdgesChangedAfterCollapse
have been added to FoldingManager
. 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 click events. The
handleClick
method
has been added to the IHandle
interface and is called when
HandleInputMode#ClickedRecognizer
was triggered
on a targeted handle. To customize the general handle click handling, the Clicked
event can be listened
to or the method HandleInputMode#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). Property HierarchicLayoutData#TabularGroups
allows to mark groups as "tabular" and
property HierarchicLayoutData#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 property GroupSubstructureScope
. 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 property ClusteringPolicy
) are taken into account as group substructures.
-
The
OrganicLayout
class now offers two new ChainSubstructureStyles
called
DISK
and DISK_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). The
OrganicLayout#TreeSubstructureStyle
property specifies the style of tree substructures and the
OrganicLayout#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 the BalloonLayoutData#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 respective
com.yworks.yfiles.layout.Intersections
class provides the functionality also for the LayoutGraph
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 the PasteDelta
value when pasting items
without owner (e.g. edges without selected source or target node).
-
ModelManager
and its derived classes HighlightIndicatorManager
,
SelectionIndicatorManager
, and FocusIndicatorManager
now have install
and
uninstall
methods for properly allocating and freeing resources when setting or removing a manager to a
CanvasComponent
.
-
GraphModelManager
: the properties NodeManager
, EdgeManager
,
PortManager
, EdgeLabelManager
, NodeLabelManager
,
PortLabelManager
, and ProvideUserObjectOnMainCanvasObject
have been made public.
Interaction
-
The
MoveViewportInputMode#uninstall
method is now virtual and can be overridden in
derived classes.
-
A
SizeConstraintProvider
property was added to NodeReshapeHandleProvider
and NodeReshapeHandlerHandle
that is queried during node resize gestures if no explicit
MinimumSize
, MaximumSize
or MinimumEnclosedArea
is set.
-
The input modes don't perform hit tests upon auto-repeated key down events for modifier keys
anymore.
-
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
and ValidBeginCursor
have been added
to LassoSelectionInputMode
, MarqueeSelectionInputMode
, and
MoveViewportInputMode
. The ValidBeginRecognizer
can be used to indicate whether the
selection respectively move viewport gesture may begin in which case the ValidBeginCursor
is used.
-
The property
MouseHoverInputMode#ValidHoverLocationCursor
has been added that is used
when the ValidHoverLocationHitTestable
returns true for a location.
-
The property
PopupMenuInputMode#ValidMenuLocationCursor
has been added that is used
when the ValidMenuLocationHitTestable
returns true for a location.
-
IReparentNodeHandler#isValidParent
is now also called with null
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 the NavigableItems
property.
-
The
GraphClipboard
now raises the events ElementsCutting
,
ElementsCopying
, ElementsPasting
, and ElementsDuplicating
at the very
beginning of the cut
, copy
, paste
, and duplicate
methods.
-
GraphEditorInputMode
now raises the GroupingSelection
and
GroupedSelection
events at the start and end of the groupSelection
method. Similarly, the
UngroupingSelection
and UngroupedSelection
events are raised at the start and end of
ungroupSelection
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
's HoverCursor
property now take effect
immediately if the mouse pointer is currently hovering over an item.
-
The
TextEditorInputMode
now releases the mutex before dispatching the
TextEdited
event.
-
CanvasComponent
now has a CursorChanged
event that can be used to react
to cursor changes (which happen primarily when input modes change it).
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 the
DashStyle#Dashes
property now clarifies that both an empty collection and null
result in a
solid Pen
.
-
Added a new property
KeepingAspectRatioEnabled
to ImageNodeStyle
and
MemoryImageNodeStyle
to support keeping the image's aspect ratio during resizes.
-
Nodes rendered with the
ShapeNodeStyle
now respect their actual outline shape when
selected with the LassoSelectionInputMode
.
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 methods
getNodeById
, getNodeForItem
, getDataItem(INode)
, getEdgeById
,
getEdgeForItem
, and getDataItem(IEdge)
.
-
TreeBuilder
and AdjacencyGraphBuilder
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 methods getNodeById
, getNodeForItem
, getDataItem(INode)
, and
getDataItem(IEdge)
.
Hierarchic Layout
-
The
HierarchicLayout
class now allows to combine the
SimplexNodePlacer#StraightenEdges
and SimplexNodePlacer#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, the HierarchicLayout
class now correctly considers the layering produced by the FromScratchLayerer
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
(see HierarchicLayoutData#Subcomponents
). Defining subcomponents now works by assigning instances of
the new SubcomponentDescriptor
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 policies SubcomponentPlacementPolicy#AlwaysIntegrated
or
SubcomponentPlacementPolicy#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 (property
HierarchicLayout#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 the
ClusteringPolicy
property to ClusteringPolicy#USER_DEFINED
. The custom cluster IDs have to
be specified by means of the OrganicLayoutData#ClusterIds
property.
Circular Layout
-
The
CircularLayout
class now supports node types (see
CircularLayoutData#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 a LayeredNodePlacer
.
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 property
PenaltySettings#PortCrossingPenalty
allows to specify the cost of such crossings.
-
The
EdgeRouter
class now supports buses that include self-loops (see class
BusDescriptor
). 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 an IDataProvider
registered to the input graph with the key
INSERTED_GROUP_NODE_DPKEY
.
-
The
TemporaryGroupNodeInsertionStage
class now also supports specifying hierarchically
nested temporary groups. Therefore, the new TemporaryGroupDescriptor
class has been added.
Analysis
-
The
TraversalDirection
enumeration used by the Neighborhood
and
Bfs
algorithms has been extended. The enum value UNDIRECTED
has been added that ignores
the edge direction and corresponds semantically with the previous value BOTH
. The semantic of
BOTH
has been adjusted to indeed return the union of the SUCCESSOR
and the
PREDECESSOR
results. To keep the default behavior of the Neighborhood
and Bfs
algorithms, the default value of their TraversalDirection
property has been changed from
BOTH
to UNDIRECTED
.
-
The
GraphStructureAnalyzer
class now supports operating on a subset of the graph.
-
The new
SubgraphNodes
and SubgraphEdges
properties on the
Reachability
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 a NullPointerException
.
-
Viewport animations no longer suddenly stop when the zoom level is near
CanvasComponent#MinimumZoom
or MaximumZoom
.
-
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 call
removeSelection
when an item was deselected.
-
Changing the
GraphComponent#GraphModelManager
property no longer leaks memory in
certain situations.
-
Calling
IFoldingView#collapse
on a normal (i.e. non-group) node no longer creates an
UndoUnit
or a view state (which included an unexpected call to
IFolderNodeConverter#initializeFolderNode
even though the result would have never been used). Now
calling IFoldingView#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 on cancel
.
-
GroupNodeStyle
's associated INodeInsetsProvider
now correctly calculates
insets for “small” nodes, i.e. nodes whose height (or width) is less than the style's TabHeight
property.
-
Inertia in
MoveViewportInputMode
no longer stops working randomly.
Graph
-
Fixed a bug in
FilteredGraphWrapper
's NodeRemoved
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
's findBestParameter
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 corresponding GroupNodeStyle
.
-
NavigationInputMode#ExpandGroup
, EnterGroup
, and the
EXPAND_GROUP
and ENTER_GROUP
commands do not create empty undo units anymore if nothing has
changed.
-
NavigationInputMode#ExitGroup
and the EXIT_GROUP
command now create undo
units if the bounds of the exited group node were adjusted.
-
GroupingSupport
's methods enlargeGroupNode
and
enlargeAllGroupNodes
do not create empty undo units anymore if nothing has changed.
-
EdgePathLabelModel
, EdgeSegmentLabelModel
, and
SmartEdgeLabelModel
findBestParameter
implementations now create correct parameters for
label boxes that overlap the edge's source or target node.
Interaction
-
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 the
CanvasComponent#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 the
GraphComponent#Selection
property unnecessarily when the GraphComponent#Graph
property is
changed.
-
An instance of the
HandleInputMode
class is no longer canceled
if a
handle is removed during its own DragFinished
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
GraphComponent#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 pointer has stopped before being released.
-
Starting a
CanvasComponent
/GraphComponent
viewport animation now properly
stops a running MoveViewportInputMode
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 their IShapeGeometry
implementation.
-
GroupNodeStyle
's collapse/expand icon can now be reliably hit in all cases. In rare
cases, changing the value of one the properties that affect the icon's location were not taken into account for hit
tests.
-
ShapeNodeStyleRenderer
now always uses the protected getPaint
and
getPen
methods for all shapes instead of falling back to the respective style properties for some
shapes.
-
IconLabelStyle
's updateVisual
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 of AbstractInputHandler#setValue
method is now annotated
correctly as nullable. The key may be null
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
and ShapeNodeStyle
.
-
Fixed GraphML serialization and deserialization for certain configurations of
GroupNodeStyle
and RectangleNodeStyle
.
-
Fixed an issue in
GraphMLIOHandler
's WriteEvents
where the
DataWriting
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 during updateGraph
.
-
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
,
and TreeBuilder
. 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 the HierarchicLayout
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 satisfies PortCandidates
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 (see HierarchicLayoutData#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
(see HierarchicLayoutData#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 property HierarchicLayoutData#UniformPortAssignmentGroups
)
for some cases where it previously did not yield a uniform port distribution.
-
The
HierarchicLayout
now correctly considers the
PreferredPlacementDescriptor
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 its
AbortHandler
.
-
The
HierarchicLayout
class now considers the PortCandidate
directions
correctly for layout orientations other than TopToBottom
. This also improves the optimization results
with PortCandidateSet
s that allow multiple directions to connect to nodes.
-
For input graphs with a
PartitionGrid
structure, the HierarchicLayout
class now correctly considers the layering produced by the FromScratchLayerer
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, its MaximumDuration
value is now unrestricted.
Organic Layout
-
The
OrganicLayout
class no longer produces broken routes of self-loops at group nodes
if the Scope
is not equal to ALL
.
-
The
OrganicLayout
class now correctly considers the specified
PartitionGrid
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 enum GroupNodeMode
) 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 property
OrganicLayout#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 property StarSubstructureStyle#SEPARATED_RADIAL
).
Clear Area Layout
-
The
ClearAreaLayout
class no longer produces results where the specified area is not
cleared for some input graphs when property ClearAreaStrategy
is set to PRESERVE_SHAPES
or
PRESERVE_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 (see GroupingKeys#MINIMUM_NODE_SIZE_DPKEY
). Previously, the minimum sizes were always enlarged by
the groups' insets (see GroupingKeys#GROUP_NODE_INSETS_DPKEY
). Actually, the minimum size should include
the insets.
-
The
OrthogonalLayout
class now correctly handles input graphs with parallel edges if
the ParallelRoutesPreferenceEnabled
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 than TopToBottom
.
-
The
EdgeRouter
class now correctly considers the maximum duration and the
AbortHandler
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 with PortCandidateSets
.
-
The
EdgeRouter
class no longer produces bad layout results for some scenarios with
grouped edges and multiple PortCandidates
. 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 its
RemoveNodeOverlaps
or RemoveEdgeOverlaps
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 correct OriginalPosition
s of
the RowDescriptor
s and ColumnDescriptor
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 registered
AbortHandler
instance so that it is possible to terminate early. Previously, the stage ignored the
AbortHandler
.
-
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 specified GridSpacing
is zero.
Incompatible Changes
API
-
Due to the new
install
and uninstall
methods of the
ModelManager
class, the following of its members have been changed:
- The
CanvasComponent
constructor parameter has been removed. Instead, you can call the new
install
method with the CanvasComponent
as parameter. Similarly, the
CanvasComponent
constructor parameters of the derived classes have been removed, too.
- Its existing protected methods
install
and uninstall
have been renamed to
installItem
and uninstallItem
.
- Its protected methods
add
and remove
have been renamed to addItem
and
removeItem
.
-
The optional
SelectionModel
and Model
parameters of
HighlightIndicatorManager
and SelectionIndicatorManager
have been removed from the
constructors, too. Instead, you can set the corresponding properties directly.
-
The
NavigationInputMode#adjustGroupNodeLocation
method has now an additional
parameter expandedSize
that specifies the size of the group node when it is expanded.
-
The
LabelCreator#addLabel
method can return null
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 method handleClick
. 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 to
ProvidingUserObjectOnMainCanvasObjectEnabled
.
-
The
NodeLabelingPolicy
enum has been moved from com.yworks.yfiles.layout.tree
to
com.yworks.yfiles.layout
. The reason is that the policy is now not only supported by BalloonLayout
but also by CircularLayout
, RadialLayout
and CactusGroupLayout
.
-
The type of the
EdgeCellInfo#CellSegmentInfos
property has been changed from
YList
to CellSegmentInfo[]
.
-
The
HierarchicLayoutData#SubComponents
property is replaced by the new
HierarchicLayoutData#Subcomponents
property with a different signature. The new property uses instances
of the new SubcomponentDescriptor
class to define subcomponents, and the layout algorithm responsible
for a component is now specified via the new SubcomponentDescriptor#LayoutAlgorithm
property.
-
Similarly, the data provider keys
HierarchicLayout#SUB_COMPONENT_ID_DPKEY
and
HierarchicLayout#SUB_COMPONENT_LAYOUT_ALGORITHM_DPKEY
are replaced by the new key
HierarchicLayout#SUBCOMPONENT_DESCRIPTOR_ID_DPKEY
that assigns instances of the new
SubcomponentDescriptor
class to nodes.
-
The
TemporaryGroupNodeInsertionData#Components
property is replaced by the new
TemporaryGroups
property of type TemporaryGroupDescriptor
, 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 key
TemporaryGroupNodeInsertionStage#COMPONENT_ID_DPKEY
was changed to
TEMPORARY_GROUP_DESCRIPTOR_DPKEY
.
-
The
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 the
Neighborhood
and Bfs
algorithms has been changed and does not ignore the direction
anymore, but now returns a union of the SUCCESSOR
and the PREDECESSOR
results instead. The
old behavior can be restored by using the new TraversalDirection#UNDIRECTED
enum value. Consequently,
the default value of the TraversalDirection
property of both the Neighborhood
and the
Bfs
algorithm has been changed from BOTH
to UNDIRECTED
.
-
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 the LabelCreator#TextProvider
returns null
.
-
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 the DraggedRecognizer
is triggered. When pressed, the mutex is already acquired, which discards other concurrent input modes. This can be
turned off by setting the RequestMutexOnPress
property to false
.
-
ResizeStripeInputMode
now always uses the N_RESIZE_CURSOR
for resizing
rows and the W_RESIZE_CURSOR
for resizing columns instead of using N_RESIZE_CURSOR
,
S_RESIZE_CURSOR
, W_RESIZE_CURSOR
or E_RESIZE_CURSOR
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 lists returned by the
GraphPartition#getCells
,
DynamicObstacleDecomposition#getCells
and DynamicObstacleDecomposition#getObstacles
methods are no longer unmodifiable.
-
The value of the
DefaultLayerSequencer#MaximumDuration
property is now unrestricted.
Previously, it was restricted to 10 seconds. It is used by the HierarchicLayout
class, which still
adheres to its own maximum duration.
Deprecations
-
The
BevelNodeStyle
, ShinyPlateNodeStyle
, and PanelNodeStyle
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 new GroupNodeStyle
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.
-
The Layout Without View Demo shows shows how to create a graph, run a graph analysis
algorithm, and calculate a layout without using a view or the
IGraph
API.