HierarchicLayout: Added support for port grouping, see
PortConstraintKeys#TARGET_GROUP_ID_DPKEY. Edges are bundled at their ports, but routed independently.
HierarchicLayoutnow allows to specify the directedness of edges, see
HierarchicLayout#EDGE_DIRECTEDNESS_DPKEY. This new feature enables to, for example, support mixed graphs that contain both directed and undirected edges: While for directed edges the layering step tries to find a solution where the source of an edge is placed above the target (with respect to the main layout direction), for undirected edges the direction doesn't matter and the edge may also be inserted as same-layer edge. This feature also enables to force some edges to specifically point against the main layout direction.
HierarchicLayout: Added support for edges with a specific thickness. Minimum distances in the layout will consider these thicknesses, see
LabelPlacements: Added preferred placement specifiers
#AT_TARGET_PORTfor edge labels which express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of the
HierarchicLayoutand can be specified with property
OrganicLayoutnow supports the detection of regular substructures in the graph (see methods
#setParallelSubstructureStyle(ParallelSubstructureStyle)and applies a specific layout style to them such that they can be better recognized.
TreeReductionStage: Added possibility to specify a custom labeling algorithm that places labels of non-tree edges. Now, users do not need to take care of such edge labels themselves after using a tree layout algorithm on a non-tree input graph in conjunction with the reduction stage. See properties
SeriesParallelLayout: Added possibility to specify a custom labeling algorithm that places labels of non-series-parallel edges. Such labels are now automatically handled. Users do not need to handle them after running the algorithm with a non-series-parallel input graph. See properties
IGraph: The default methods
#applyLayout(ILayoutAlgorithm, LayoutData)have been added.
FilteredGraphWrappernow no longer queries the node and edge predicates as often.
IMapperRegistry: Several overloads for the
#create*Mappermethods have been added that take more specific tags but allow to omit the keyType parameter.
#morphLayoutconvenience methods have been added that run a layout on the graph of the component and animate the results.
GraphComponent#GraphMLIOHandlerhas been added to set a custom
GraphMLIOHandlerto be used by the IO commands and convenience IO methods. Previously the lookup of the class needed to be decorated.
GraphComponent: The overloads
#exportToGraphML(java.io.Writer, java.net.URI)have been added.
Animator: A getter for the
CanvasComponent, which had been passed to the constructor, was added.
VoidStripeStyleRendererhave been changed to the concrete types instead of the interface types (e.g.
IconLabelStyle: A constructor has been added that only takes a custom renderer as argument.
DefaultPortCandidateDescriptor, which is used to visualize
IPortCandidates, now provides static
ResourceKeyfields that are used to lookup
IVisualTemplates for the different states of
IVisualTemplates can be used by either registering them via
CanvasComponent#putClientPropertyor by the new convenience method
CreateEdgeInputModenow respects the settings
GraphSnapContext. It also handles grid snapping according to the configuration for snapping.
#addXamlNamespaceMappingmethods for easier control of the XML namespace for certain types.
GraphMLIOHandlerhas two new events,
#QueryNamethat allow for fine-grained control over XML namespace writing and parsing for certain types.
GraphMLIOHandler: The overloads
#write(IGraph, java.io.OutputStream, java.nio.charset.Charset, java.net.URI)and
#write(IGraph, java.io.Writer, java.net.URI)have been added.
GraphMLParser: The overloads
#parse(IGraph, InputStream, IGraphElementFactory)have been added.
GraphML: The performance for parsing java enums and
FlagsEnumshas been improved.
GraphML: Parsing java enums and
FlagsEnumshas been refactored and now respects
HierarchicLayout: Slightly reduced the number of bends when integrated edge labeling is enabled.
HierarchicLayout: Fixed unstable from-sketch behavior for non-default layout orientations when group nodes are folded or expanded. Applies to orientations
LayoutOrientation#BOTTOM_TO_TOP. Geometry information registered with data providers with keys
HierarchicLayout#ALTERNATIVE_EDGE_PATH_DP_KEYis now automatically rotated according to the specified layout orientation.
HierarchicLayout: Improved support for
PortCandidates at group nodes. Previously, they were only obeyed if there was just a single candidate defined, which also applied to the opposite node (not necessarily a group node). Now, out of the given candidates, one is selected and considered for the routing. Still, fixed candidates are treated like free ones and are not supported at the side of group nodes.
HierarchicLayout: Routing of grouped edges that connect to nodes of different groups now assures that the whole bus segment remains outside the different group nodes. This avoids that group nodes get unnecessarily large and potentially makes drawings more symmetric.
HierarchicLayout: Improved edge grouping such that it is now possible to group incoming/outgoing edges as well as same-layer/backloop edges with common edges.
HierarchicLayout: Can now take the original edge route into account to determine the route of a self-loop.
MultiPageLayout: Added new option
#StrictClusterSeparationEnabledthat allows to specify whether or not nodes with different cluster IDs may be placed onto the same page.
AspectRatioTreeLayoutnow support custom selection of the root node of the tree.
BalloonLayout: Interleaved child placement now works in conjunction with from sketch-mode and custom child order comparators. This means that the settings
#Comparatorare no longer ignored when enabling the interleaved placement mode (see
TreeLayout: Now take into consideration the minimum group node size specified by the user with a
IDataProviderregistered with the graph with key
SeriesParallelLayout: Now takes into consideration the minimum node size specified by the user with a
IDataProviderregistered with the graph with key
EdgeRouterwhen routing edges that have
OrthogonalSegmentDistributionStageand thus also
ChannelEdgeRouterwhich by default uses the mentioned stage as edge distribution strategy.
ChannelRouter: Improved order of segments to avoid edge crossings when there are multiple segments that have one common end point.
PartialLayoutfor input graphs that feature a high number of large subgraph components. Does not apply for component assignment strategy
LayoutUtilities#applyLayoutnow supports layout of tables.
ItemMapping: The property
#Mapperis now automatically set on first read-access to the property, enabling more convenient use of the mapper without first having to instantiate a matching instance.
PartitionGridData: It is now sufficient to specify one of a row mapping or the column mapping. The unspecified one will automatically be set to 0, resulting in a single row or column being used.
TreeLayoutDatanow have an
EdgeLabelPreferredPlacementproperty which supports an
ItemMappingfor edge labels to provide a
PrefererredPlacementDescriptor. Can be used as alternative to mappers registered with
PlanarEmbeddinghas been added and allows to calculate and query an embedding of a planar graph.
IGraph#addLabelthat ignored an explicitly specified preferred size if folding is enabled.
FilteredGraphWrapper: The fail-fast mechanism to detect concurrent modification changes in the
IListEnumerablesdidn't detect all modifications correctly.
SandwichLabelModel: Fixed incorrect
DefaultValueannotation for some created parameters.
SmartEdgeLabelModel: An exception was thrown if the path of the corresponding edge contained bends that were close together or at the same location.
NinePositionsEdgeLabelModel: Fixed the placement for the positions
GeneralPath#equalsdoes no longer check for path equivalence (same coordinates etc.), but simply checks reference equality. This makes it consistent with the
#hashCodemethod. To check for path value equivalence, use the new method
#importFromGraphML(java.io.File)method to respect the
#ClearingGraphBeforeReadEnabledproperty. (All the other
#importFromGraphMLmethods already did so.)
ComponentOrientation#RIGHT_TO_LEFTis set on the
GraphOverviewComponent: Setting a new
#OverviewInputModeupdates now the
GraphModelManagerthat didn't update the child groups if a new
falsewas not respected when the graph changed or a group node was created first on a yet ungrouped graph.
IVisualactually has been removed instead of just before the removal.
NullPointerExceptionin the graph rendering code when items were removed from the graph during their style's
#updateVisualmethod. This could happen when removing graph items from a different thread (which is still not supported, but at least this particular case won't crash anymore).
GridVisualCreatorwith grid style
Controlkey anymore but the
Commandkey as modifier instead.
CreateEdgeInputMode: Fixed a bug that didn't show the edge preview when the edge would be created between a node and one of its ancestors or vice versa.
#EdgeCreatedevent triggered before the corresponding undoable edit was committed. This could result in a broken undo queue, if e.g. an animated layout was started during in the event listener. The event now triggers after the edit has been committed. With automatic undo unit merging, this should not make a difference for the end user, however from the perspective of the code there will be two subsequent edits, rather than one compound, if the code in the listener actually modifies the edge.
CreateEdgeInputMode: Fixed a bug that broke the edge preview after the input mode was uninstalled and reinstalled again.
ESC, the dragged bend was removed.
OverviewInputMode: Fixed a bug that could break the overview visualization if the overview has a specific very small width or height.
StripeDropInputMode: Fixed a bug that could result in nodes being moved to a wrong stripe when a new stripe was created or an existing one relocated.
NodeDropInputMode: Fixed a possible exception when snapping is enabled, but preview disabled.
SHIFTkey held down the node was erroneously reparented to the root.
FreeEdgeLabelModelcannot place the label correctly for self-loops. Labels previously always appeared at the port location in this case.
IBendSnapResultProviderfrom the lookup no longer leads to a crash when nodes or bends are moved.
ICommand#EDIT_LABELwould not work directly on labels when a
DefaultLabelStyle: Fixed vertical text alignment for instances with non-empty insets.
IconLabelStyle: Fixed a
NullPointerExceptionthat occurred when rendering the style while the
#Iconproperty is set to
@GraphML#contentPropertyof a class.
@GraphMLannotations for static fields.
ValueSerializerused for predefined
IArrows now also respects the
#addRegistryOutputMapper(String, String, Object, IEventListener)created multiple GraphML key definitions for the same mapper instance
@Obfuscationannotation to exclude the class from obfuscation. Excluding
Arrowfrom obfuscation is necessary for properly reading (and writing) GraphML files.
@DefaultValueannotations for the
SegmentRatioPortLocationModeland corresponding port location parameter instances.
HierarchicLayout: Fixed bug that caused a violation of the specified minimum distance or edge overlaps in the case of same-layer edges.
HierarchicLayout: Fixed rare bug that caused same-layer edge to cross through their source or target node, e.g., the port was at the top of the source node but the edge crossed through the source node to leave it at the bottom.
HierarchicLayout: Fixed bug that sometimes caused the route of back-loop edges with at least one endpoint incident to a group node to unnecessarily enter this group node.
HierarchicLayout: Fixed bug that sometimes caused superfluous bends in edge routes when integrated edge labeling was enabled.
HierarchicLayout: Fixed bug that caused that the directedness of edges incident to groups wasn't considered correctly (see
HierarchicLayout: Fixed bug that caused node-edge overlaps in conjunction with some complex edge grouping specifications.
RecursiveGroupLayoutwhen used with
HierarchicLayoutas core layout algorithm: Fixed
IllegalStateExceptionthat could be triggered when group nodes of the input graph have
RecursiveGroupLayout: Fixed bug that caused edges to share the same port even though they should be assigned to different ports. Note that this problem only appeared if the core layout algorithm (see
CoreLayout) is an instance of class
SimplexNodePlacer: Fixed bug that caused overlaps between edges and nodes when enabling node compaction (see
#NodeCompaction) and having edges with either strong
OrganicLayout: Fixed bug that caused group nodes with zero height/width in the layout result. The bug appeared when having empty groups, group node insets smaller than one (defined via
GroupingKeys#GROUP_NODE_INSETS_DPKEY) and no minimum group node size specified (
ClassicOrganicLayout: Fixed bug that caused the algorithm to not consider the specified custom
IllegalArgumentExceptionthat was triggered due to
NaNvalues that could occur in case the input graph has a very large number of nodes.
RadialLayout: Fixed bug that caused that always all edges are bundled if bundling is enabled for at least one single edge. More precisely, property
EdgeBundleDescriptor#Bundledwasn't considered correctly.
CircularLayout: Fixed bug that in some cases produced self-intersecting edges when edge bundling is enabled.
SingleCycleLayout: Fixed bug that may lead to a
ClassCastExceptionif edge bundling is enabled and a custom node sequencer is specified (see
AspectRatioTreeLayout#ROOT_PLACEMENT_DPKEYis now of type
AspectRatioTreeLayout#SUBTREE_ROUTING_POLICY_DPKEYis now of type
AspectRatioTreeLayoutDatadid not register the correct values with the graph for the root placement and the subtree routing policy.
MultiPageLayout: Fixed rare bug that sometimes caused straight-line edge routes instead of orthogonal routes.
IsolatedGroupComponentLayout: Fixed bug that caused edge labels that intersect with group nodes even though option
EdgeRouter: Fixed rare
RuntimeExceptionthat appeared if there were fixed (see
#Scope) and grouped edges at the same time.
EdgeRouter: Fixed rare
IllegalArgumentExceptionthat was triggered when having multiple target port candidates, where at least one must be fixed. Furthermore, to trigger the exception it is necessary that the path search algorithm tries to perform an early exit due to maximum duration restrictions or a stop request via
EdgeRouter: Fixed bug that caused violations of minimum first/last segment lengths of grouped edges when using different edge layout descriptors and, second, made the layout algorithm remove a user-registered
EdgeRouter: Fixed rare node overlaps in conjunction with monotonic path restrictions (see
ChannelEdgeRouter: Fixed routing of self-loops that have both source and target end point at the same side of the node. Previously, when multiple such self-loops were present at the same node, the routing produced bad end points located outside of the node.
NullPointerExceptionthat occurred when the given maximum number of clusters was
NullPointerExceptions in some
LayoutDataimplementations that could happen if some of the mappings where accessed but were never really used in client code.
TableLayoutConfiguratorwhich altered the size of a column or row if an edge routing algorithm has been applied.
TableLayoutConfiguratorwhich sometimes used the wrong table insets.
ILabelsas key and
doubleas value are now correctly translated into data providers for layout algorithms.
LayoutGraphAdapter#EDGE_LABEL_LAYOUT_PREFERRED_PLACEMENT_DESCRIPTOR_DPKEYthat has been filled by a
LayoutDatahas been ignored.
IGraph: The signature of method
#addBend(IEdge, int, PointD)has been changed to
#addBend(IEdge, PointD, int).
IMapperRegistry: Renamed the methods
#create*. The type of property
#MapperMetadatahas been changed from
AbstractGraphWrapper: The signature of method
#addBend(IEdge, int, PointD)has been changed to
#addBend(IEdge, PointD, int).
FoldingEdgeState: The signature of method
#addBend(int, PointD)has been changed to
GeneralPath: The return value type of method
createPathhas been changed from
IAnimationhave been removed and are now available as factory methods in
IAnimation. This included the classes
GraphModelManager: Signature of method
#typedHitElementsAt(IInputModeContext, Class<T>, PointD, ICanvasObjectGroup)has been changed to
#typedHitElementsAt(Class<T>, IInputModeContext, PointD, ICanvasObjectGroup).
CanvasComponent: The property
#Editablehas been removed. It had no effect on almost all input modes anyway. To no longer allow editing a
CanvasComponentuse a different input mode instead, e.g.
GraphViewerInputMode, or configure the current input mode in a way that it no longer allows changes.
GraphComponent: Decorating the lookup of
IGraphto set the
GraphMLIOHandlerused by the IO commands and convenience IO methods on
GraphComponentis no longer supported. Use the
IRectanglePainterhas been replaced by the more powerful interface
IVisualTemplate. Implementations have been adjusted accordingly and members and classes with name
*RectanglePainterhave been renamed to
EdgeDecorationInstaller: The method
IVisualwas replaced by the method
IVisualTemplatethat is used for all bends of the passed edge.
EdgeSelectionIndicatorInstallernow contain static
#BEND_TEMPLATE_KEYthat can be used to register custom
IVisualTemplates for bends on the
The command mechanism has been refactored:
CommandBindingActionhave been moved to package
ExecutedRoutedEventArgsas well as the related properties on
CanvasComponenthave been removed.
KeyboardInputModeoffers new methods
#addKeyBindingfor binding commands to actions and keyboard gestures to commands.
KeyboardInputModehas been refactored. New interfaces
ExecuteCommandHandlerfor handling commands have been introduced. All methods for binding commands to
IEventListenerimplementations have been retrofitted to the aforementioned handlers. All methods for removing command or key bindings have been removed. Methods for adding such bindings now return a
KeyboardInputModeBindinginstance that offers a
#removemethod for this purpose.
OverviewInputModenow allows to zoom out further.
OrthogonalEdgeEditingContext: Changed return value of methods
HandleInputMode: For all
HandleTypes a corresponding
ResourceKeywas added as static field that can be used to register a custom
IVisualTemplatefor this handle type. Per default the
#createVisual(IRenderContext,IHandle)method now looks up the
HandleTypefor the passed
#updateVisualmethod is no longer used and was removed.
ICommand#GROUP_SELECTIONnow has a reasonable size.
IClipboardIdProvider: Signature of method
#getId(IModelItem, IGraphClipboardContext)has been changed to
GraphCopier: Changed signature of method
#addBend(IGraph, IGraph, IEdge, IBend, int, PointD)to
#addBend(IGraph, IGraph, IEdge, IBend, PointD, int).
AbstractStripeStyle: The return type of method
#clone()has been changed from
AbstractEdgeStyle. Furthermore, the return type of methods
#updateVisual(IRenderContext, IVisual, IEdge)has been changed from
TVisual extends IVisualto
#Urlhas been changed from
URLof the icon instead of its
MemoryIconLabelStyle: Simplified constructors that now only allow to specify the image of the icon as well as a custom renderer.
ArcEdgeStyle#Rendererhas been changed from
PolylineEdgeStyle#Rendererhas been changed from
TableNodeStyle: The type of property
#Rendererhas been changed from
TableNodeStyleRenderer. Furthermore, the parameter type of methods
#removePropertyChangedListener(IEventListener<PropertyChangedEventArgs>)has been changed from
VoidStripeStyle#Rendererhas been changed from
GraphMLSerializationModehave been merged to
Property: The properties
#OwnerInstancehave been removed. The new methods
setValuenow take the owner instance as parameter.
HandleSerializationEventArgs: The property
#SourceTypeis now of type
IParseContext: A parameter of type
Class<T>that describes the target type has been added to the
XamlSerializer: Signature of method
#serialize(Type, IWriteContext, Object)has been changed to
IXamlNameMapper: The return type of method
getName(IWriteContext, Type)has been changed from
QueryOutputHandlersEventArgs(IWriteContext, KeyScope, Map<Object, IOutputHandler>)has been changed to
GraphMLWriter: Return type of method
#getOutputHandlers(IWriteContext, KeyScope)has been changed from
AbstractInputHandler: The return type of method
#initializeFromKeyDefinition(IParseContext, Element)has been changed from
YList: The constructor
YList(Collection<Object>)has been changed to
#remove(int)has been deprecated.
#compare(int, int)has been deprecated.
#firePreEvent()have been deprecated.
ClassicOrganicLayout: The return type of method property
#PreferredEdgeLengthhas been changed from
double. Note that this also induces a corresponding change in class
ClassicOrganicLayout: The type of constant
#PREFERRED_EDGE_LENGTH_DPKEYhas been changed from
#getNodeLayout(Object)have been deprecated.
HierarchicLayoutCore.IncrementalHinthas been deprecated. Method
LayoutGraphAdapter: The type of the provided data provider keys have been changed from
Objectto a more specific type.
PartitionCellId: The return type of property
#Cellshas been changed from
#isIntegratedEdgeLabelingEnableddoes now always return
falseif the labeling algorithm is disabled (see
MultiStageLayout#isLabelingEnabled. In previous versions it was only required that an appropriate labeling algorithm was specified, but it was not necessary that it is enabled. Therefore, the integrated labeling state queried from the property might not have corresponded to what the layout algorithm actually did. The same behavior change applies for the following methods:
HierarchicLayoutmay now place source/target labels in layers that contain common nodes. In previous versions such labels were always placed in separate layers which often led to less compact drawings with superfluous bends.
#ALTERNATIVE_EDGE_PATH_DP_KEYis now automatically rotated according to the specified layout orientation. This fixes unstable from-sketch behavior in incremental layout mode when using an orientation other than top-to-bottom. User that
OrganicLayoutdoes no longer resize empty group nodes, possible ignoring a minimum group node size for them (see
GroupingKeys#MINIMUM_NODE_SIZE_DPKEY). The behavior with respect to empty group nodes is now in line with the behavior of other common layout algorithms.
Centrality#closenessCentralitynow sets the closeness of a node to
Infinityif the sum of the shortest path distances is
0. Before, it was set to
NaNin such cases.
Groups.Dendrogramdoes no longer extend class
Graph. To enable convenient iteration of a dendrogram, method
#NodeSequencernow allows to specify
nullto return to the default sequencer. In previous versions, specifying
nullleads to an
GraphMLCompatibilityDemothat shows how to load GraphML files created by yFiles for Java 3.0.x was added.