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.
-
ViewportAnimations 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 PortCandidateSets 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 OriginalPositions of
the RowDescriptors and ColumnDescriptors 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.