Several context implementations throughout the library now use the correct value in world coordinates for the HitTestRadius property instead of view coordinates:

The context created by ICanvasContext.createCanvasContext when passing a CanvasComponent, but no hit test radius.

The IRenderContext passed to IDisposeVisualCallback.

The IInputModeContext passed to IPositionHandlers by MoveInputMode.

The IInputModeContext passed to adjacent handles when moving a bend handle.

InteriorStretchLabelModel#getMinimumNodeSize now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.

The NodeStyleStripeStyleAdapter#updateVisual method always created a new visual by delegating to the #createVisual method.

Mouse wheel zoom during an input gesture no longer results in incorrect coordinates for the subsequently dispatched mouse event.

Switching the GraphComponent's #InputMode in a key event handler no longer throws an exception.

MapperRegistry#addMapper no longer throws an exception when trying to replace a mapper for an existing key.

Labels with NinePositionsEdgeLabelModel now disappear when the owner edge has no visible edge path. This can happen for example when nodes are moved onto each other. Previously they appeared at unexpected locations, including the origin (0,0) and the upper left corner of the source node.

GeneralPath#getTangent now returns null if there is no tangent at the requested position. Previously, it returned a bogus tangent.

FreeLabelModel#INSTANCE, FreeEdgeLabelModel#INSTANCE, and FreeNodeLabelModel#INSTANCE are now serialized correctly to GraphML when not used as part of their parameters (e.g. within CompositeLabelModel).

Fixed an unnecessary exception in IGraph#calculateLabelPreferredSize which was thrown when the label owner was not part of the graph, but all optional parameters have been passed anyway. In that case there was no need to fetch the appropriate LabelDefaults and thus the question of whether the owner is in the graph or not is irrelevant.

During reparenting, the edges at reparenting nodes were drawn below the group(s) and thus they were not visible. If reparenting was canceled, these edges stayed behind the group(s) and remained invisible.

CreateEdgeInputMode did not always start correctly for quick gestures on slow devices.

CreateEdgeInputMode did not trigger the #EdgeCreationStarted event for programmatic initialization of the edge creation gesture.

HandleInputMode's #CurrentHandle property could not always be obtained during the #DragFinished, #DragFinishing, #DragCanceling, and #DragCanceled events of HandleInputMode.

Setting CreateEdgeInputMode's #CancelRecognizer could potentially get the input mode into a broken state.

The ICommand#COPY command is no longer executed twice.

Fixed a bug in ViewportAnimation that sometimes moved the viewport a bit before the animation started.

Fixed an exception in DropInputMode which occurred if a drag enter was recognized while another drag action was still running.

CreateEdgeInputMode no longer fires gesture cancel events if it has not been started before.

StripeDropInputMode no longer calls #ItemCreator twice.

The StripeDropInputMode#ItemCreated event was not raised.

GeneralPath#isVisible often returned true for invisible paths.

UndoEngine now uses the end time of the previous undo unit for automatic bracketing instead of the start time. This improves auto-bracketing to work as intended for undo units spanning a time greater than #AutoMergeTime.

Layout

Corrected an error in the Rectangle2D#contains(Rectangle2D) method. As a consequence, the results of various algorithms and automatic layouts could have been wrong.

PortPlacementStage: Fixed bug that caused NullPointerException when the ports of edges in the input graph were outside the node bounds.

BusRouter: Fixed rare NullPointerException that could be triggered if there are buses with both fixed and movable edges at the same time.

AbstractLabelLayout: Fixed bug that the box returned by AbstractLabelLayout#BoundingBox was not consistent with the bounding box of the oriented box (AbstractLabelLayout#OrientedBox). This was the case when the mutable oriented box instance was changed.

LayeredNodePlacer: Fixed bug that caused node-edge overlaps for some configurations.

MultiPageLayout: Fixed bug that edge type EdgeType#PROXY was never used.

Setting PartialLayout#EdgeRoutingStrategy to StraightLine erroneously rerouted all edges in the graph instead of just the ones that were required.

polyline.EdgeRouter: Fixed RuntimeException that could be triggered when the graph contained fixed edges (see EdgeRouter#SphereOfAction) with very short segments.

HierarchicLayout: Fixed IllegalArgumentException that could be triggered when the user specified both edge directedness (see HierarchicLayout#EDGE_DIRECTEDNESS_DPKEY) and layering constraints.

OrthogonalLayout: Fixed rare bug that caused node-edge overlaps.

HierarchicLayout and SimplexNodePlacer: Fixed rare IllegalArgumentException that could be triggered when the input graph had a partition grid and PortCandidates or PortConstraints.

HierarchicLayout: Improved port assignment for edges incident to group nodes that are routed directly (see EdgeLayoutDescriptor#DirectGroupContentEdgeRouting). Previously, such edges were often reversed.

HierarchicLayout: Fixed bug that caused violation of specified PortCandidates of edges with labels with preferred placement specifier LabelPlacements#AT_SOURCE_PORT or LabelPlacements#AT_TARGET_PORT when using an orientation other than top-to-bottom.

SeriesParallelLayout: Fixed bug that caused misplaced edge labels for graphs containing only a single edge.

HierarchicLayout: Improved adherence to the specified maximum duration by applying a suitable runtime restriction to class PortCandidateOptimizer. Previously, this class didn't have any runtime restrictions.

OrthogonalLayout: Fixed rare bug that caused overlapping nodes.

OrthogonalLayout: Improved from-sketch mode (see UseSketchDrawing) in conjunction with node labels or node halos. Previously, in the presence of the mentioned elements, the layout results did not always correctly resemble the sketch drawing, even if it was a good sketch.

HierarchicLayout: Fixed bug that caused that property HierarchicLayout#ComponentArrangementPolicy was not correctly considered when there are undirected edges (see HierarchicLayout#EDGE_DIRECTEDNESS_DPKEY).

HierarchicLayout: Fixed bug that lead to edge ports lying outside the node boundaries when using the edge thickness feature (i.e. edges with thickness greater than zero, see HierarchicLayout#EDGE_THICKNESS_DPKEY) together with a (rather large) grid spacing value and the default port assignment PortAssignmentMode#DEFAULT.

HierarchicLayout: Fixed bug that caused unnecessarily large layer distances in case that there exist empty partition grid rows with a minimum row height.

HierarchicLayout with partition grid: Fixed bug that in some cases caused an IllegalArgumentException when the layout algorithm was configured to stop after the layering or sequencing phase (see HierarchicLayout#StopAfterLayeringEnabled and HierarchicLayout#StopAfterSequencingEnabled).

DefaultNodePlacer: Fixed bug in DefaultNodePlacer#MinimumLastSegmentLength that caused that the value of DefaultNodePlacer#MinimumFirstSegmentLength was returned.

TreeLayout: Fixed bug in DefaultPortAssignment that caused a memory leak.

TreeLayout: Fixed bug in the integrated edge labeling feature that caused that multiple edge labels were not always ordered correctly along the edge with respect to their preferred placement setting (i.e., place at source, center or target preference). For example, a source label should always come before a target label in the direction of the actual edge flow.

polyline.EdgeRouter: Fixed bug that sometimes caused a violation of the minimum first or last segment length if they were set to relatively large values.

Incompatible Changes

View

CreateEdgeInputMode now triggers the EdgeCreationStarted event for programmatic edge creation with the doStartEdgeCreation method.

yFiles for Java 3.1 – Changes Since 3.0.0.4

General Improvements

The naming of classes, members and parameters has been reviewed and now uses more consistent and intuitive names. Please consult the Developer's Guide for a complete list of renamings.

Some functionality has been removed from the API to reduce its complexity and some of the functionality has been moved to different classes or packages. Again, see the Developer's Guide to get a full list of moved/removed functionality.

Features

Layout

HierarchicLayout: Added support for port grouping, see PortConstraintKeys#SOURCE_GROUP_ID_DPKEY and PortConstraintKeys#TARGET_GROUP_ID_DPKEY. Edges are bundled at their ports, but routed independently.

HierarchicLayout now 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 HierarchicLayout#EDGE_THICKNESS_DPKEY.

LabelPlacements: Added preferred placement specifiers #AT_SOURCE_PORT and #AT_TARGET_PORT for edge labels which express that the label should be placed directly at the source/target port of the edge. Currently, the specifiers are only considered by the integrated labeling of the HierarchicLayout and can be specified with property PreferredPlacementDescriptor#PlaceAlongEdge.

OrganicLayout now supports the detection of regular substructures in the graph (see methods #setChainSubstructureStyle(ChainSubstructureStyle), #setStarSubstructureStyle(StarSubstructureStyle), #setCycleSubstructureStyle(CycleSubstructureStyle), and #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 #NonTreeEdgeLabelingAlgorithm and #NonTreeEdgeLabelSelectionKey.

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 #NonSeriesParallelEdgeLabelingAlgorithm and #NonSeriesParallelEdgeLabelSelectionKey.

Improvements

Viewer

IGraph: The default methods #applyLayout(ILayoutAlgorithm) and #applyLayout(ILayoutAlgorithm, LayoutData) have been added.

FilteredGraphWrapper now no longer queries the node and edge predicates as often.

IMapperRegistry: Several overloads for the #create*Mapper methods have been added that take more specific tags but allow to omit the keyType parameter.

GraphComponent: Four #morphLayout convenience methods have been added that run a layout on the graph of the component and animate the results.

The property GraphComponent#GraphMLIOHandler has been added to set a custom GraphMLIOHandler to be used by the IO commands and convenience IO methods. Previously the lookup of the class needed to be decorated.

GraphComponent: The overloads #importFromGraphML(java.io.Reader), #importFromGraphML(java.io.InputStream), #exportToGraphML(java.io.OutputStream, java.net.URI) and #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.

The types of the static #INSTANCE fields of VoidNodeStyle, VoidEdgeStyle, VoidLabelStyle, VoidPortStyle, VoidStripeStyle and VoidStripeStyleRenderer have been changed to the concrete types instead of the interface types (e.g. INodeStyle).

IconLabelStyle: A constructor has been added that only takes a custom renderer as argument.

Class DefaultPortCandidateDescriptor, which is used to visualize IPortCandidates, now provides static ResourceKey fields that are used to lookup IVisualTemplates for the different states of IPortCandidates. Custom IVisualTemplates can be used by either registering them via CanvasComponent#putClientProperty or by the new convenience method DefaultPortCandidateDescriptor#setTemplate.

Resizing a table row or column now respects the GraphEditorInputMode#AdjustContentRectPolicy.

CreateEdgeInputMode now respects the settings #SnappingBendsToSnapLinesEnabled and #SnappingBendAdjacentSegmentsEnabled on GraphSnapContext. It also handles grid snapping according to the configuration for snapping.

Nodes now show their target grouping hierarchy z-order during a reparenting gesture.

GraphMLIOHandler now has #addXamlNamespaceMapping methods for easier control of the XML namespace for certain types.

GraphMLIOHandler has two new events, #QueryType and #QueryName that allow for fine-grained control over XML namespace writing and parsing for certain types.

GraphMLParser: The overloads #parse(IGraph,Reader,IGraphElementFactory) and #parse(IGraph, InputStream, IGraphElementFactory) have been added.

GraphML: The performance for parsing java enums and FlagsEnums has been improved.

GraphML: Parsing java enums and FlagsEnums has been refactored and now respects SerializationProperties#IGNORE_PROPERTY_CASE.

Layout

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#LEFT_TO_RIGHT, LayoutOrientation#RIGHT_TO_LEFT and LayoutOrientation#BOTTOM_TO_TOP. Geometry information registered with data providers with keys HierarchicLayout#ALTERNATIVE_GROUP_BOUNDS_DP_KEY and HierarchicLayout#ALTERNATIVE_EDGE_PATH_DP_KEY is 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 #StrictClusterSeparationEnabled that allows to specify whether or not nodes with different cluster IDs may be placed onto the same page.

The tree algorithms BalloonLayout, TreeLayout and AspectRatioTreeLayout now 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 #FromSketchModeEnabled and #Comparator are no longer ignored when enabling the interleaved placement mode (see #InterleavedMode).

TreeLayout: Now take into consideration the minimum group node size specified by the user with a IDataProvider registered with the graph with key GroupingKeys#MINIMUM_NODE_SIZE_DPKEY.

SeriesParallelLayout: Now takes into consideration the minimum node size specified by the user with a IDataProvider registered with the graph with key GroupingKeys#MINIMUM_NODE_SIZE_DPKEY.

Improved the runtime of EdgeRouter when routing edges that have PortConstraints or PortCandidates.

Improved the performance of OrthogonalSegmentDistributionStage and thus also ChannelEdgeRouter which 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.

Improved the performance of PartialLayout for input graphs that feature a high number of large subgraph components. Does not apply for component assignment strategy ComponentAssignmentStrategy#SINGLE.

LayoutUtilities#applyLayout now supports layout of tables.

ItemMapping: The property #Mapper is 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.

BalloonLayoutData, HierarchicLayoutData, LabelingData, OrthogonalLayoutData, SeriesParallelLayoutData and TreeLayoutData now have an EdgeLabelPreferredPlacement property which supports an ItemMapping for edge labels to provide a PrefererredPlacementDescriptor. Can be used as alternative to mappers registered with LayoutGraphAdapter#EDGE_LABEL_LAYOUT_PREFERRED_PLACEMENT_DESCRIPTOR_DPKEY.

PlanarEmbedding has been added and allows to calculate and query an embedding of a planar graph.

Bugfixes

Viewer

Model

Fixed a bug in IGraph#addLabel that ignored an explicitly specified preferred size if folding is enabled.

Fixed a bug that sometimes ignored the view state for a port on a folder node when a folding edge was created.

Fixed a potential exception when using folding on a filtered graph when either nodes with labels or ports, or edges with bends or labels are shown for the first time after being hidden before.

Fixed a bug that treated group nodes with no children als non-group nodes after they have been expanded.

Fixed a bug that creates folders with empty size when manually creating groups and the folding view is configured to collapse group nodes by default.

SandwichLabelModel: Fixed incorrect DefaultValue annotation 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 #SOURCE_BELOW and #TARGET_BELOW.

Geometry

GeneralPath#equals does no longer check for path equivalence (same coordinates etc.), but simply checks reference equality. This makes it consistent with the #hashCode method. To check for path value equivalence, use the new method #isEquivalentTo instead.

View

Label text isn't mirrored anymore if ComponentOrientation#RIGHT_TO_LEFT is set on the GraphComponent.

GraphOverviewComponent: Setting a new #OverviewInputMode updates now the #InputMode property accordingly.

Fixed a bug that might occur when changing wrapped styles in CollapsibleNodeStyleDecorator, ShadowNodeStyleDecorator, NodeStyleLabelStyleAdapter and NodeStylePortStyleAdapter.

Fixed a bug in GraphModelManager that didn't update the child groups if a new #ContentGroup is set.

Fixed a bug in GraphModelManager where #HierarchicEdgeNestingEnabled set to false was not respected when the graph changed or a group node was created first on a yet ungrouped graph.

Fixed some styles to call IRenderContext#childVisualRemoved after the IVisual actually has been removed instead of just before the removal.

Fixed a possible NullPointerException in the graph rendering code when items were removed from the graph during their style's #updateVisual method. 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).

Fixed the maximum y-coordinate for horizontal grid lines produced by GridVisualCreator with grid style LINES.

Input

All shortcuts have been adapted to the operation system conventions, e.g. shortcuts on Mac do not use the Control key anymore but the Command key 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.

CreateEdgeInputMode: The #EdgeCreated event 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.

Fixed a bug in bend creation for orthogonal edges when grid snapping was enabled.

A bug in orthogonal edge editing was fixed where an edge could become non-orthogonal when a non-selected bend was moved.

Fixed an issue with orthogonal edge editing where canceling moving a port or node would add bends to otherwise straight edge segments.

Self-loops with same source and target location are now treated as orthogonal.

When dragging an unselected bend and canceling the gesture by pressing ESC, the dragged bend was removed.

Layout

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.

RecursiveGroupLayout when used with HierarchicLayout as core layout algorithm: Fixed IllegalStateException that could be triggered when group nodes of the input graph have PortCandidates.

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 HierarchicLayout.

SimplexNodePlacer: Fixed bug that caused overlaps between edges and nodes when enabling node compaction (see #NodeCompaction) and having edges with either strong PortConstraints or PortCandidates.

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 (GroupingKeys#MINIMUM_NODE_SIZE_DPKEY).

OrganicLayout and ClassicOrganicLayout: Fixed bug that caused the algorithm to not consider the specified custom IGroupBoundsCalculator (see ClassicOrganicLayout#GroupBoundsCalculator).

Fixed OrganicLayout ignoring the GroupNodeMode settings.

OrganicLayout, ClassicOrganicLayout and InteractiveOrganicLayout: Fixed IllegalArgumentException that was triggered due to NaN values that could occur in case the input graph has a very large number of nodes.

CircularLayout and 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#Bundled wasn'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 ClassCastException if edge bundling is enabled and a custom node sequencer is specified (see SingleCycleLayout#NodeSequencer).

AspectRatioTreeLayout#ROOT_PLACEMENT_DPKEY is now of type NodeDpKey<RootPlacement>.

AspectRatioTreeLayout#SUBTREE_ROUTING_POLICY_DPKEY is now of type NodeDpKey<SubtreeArrangement>.

AspectRatioTreeLayoutData did not register the correct values with the graph for the root placement and the subtree routing policy.

IsolatedGroupComponentLayout: Fixed bug that caused edge labels that intersect with group nodes even though option ComponentLayout#LabelConsiderationEnabled is enabled.

EdgeRouter: Fixed rare RuntimeException that appeared if there were fixed (see #Scope) and grouped edges at the same time.

EdgeRouter: Fixed rare IllegalArgumentException that was triggered when having multiple target port candidates, where at least one must be fixed. Furthermore, to trigger the exception it is necessary that the path search algorithm tries to perform an early exit due to maximum duration restrictions or a stop request via AbortHandler.

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 IDataProvider with key EdgeRouter#EDGE_LAYOUT_DESCRIPTOR_DPKEY.

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.

Groups#hierarchicalClustering(Graph,int,INodeMap,INodeDistanceProvider,Linkage): Fixed NullPointerException that occurred when the given maximum number of clusters was 0 or 1.

Fixed NullPointerExceptions in some LayoutData implementations that could happen if some of the mappings where accessed but were never really used in client code.

Fixed a bug in TableLayoutConfigurator which altered the size of a column or row if an edge routing algorithm has been applied.

Fixed a bug in TableLayoutConfigurator which sometimes used the wrong table insets.

LayoutGraphAdapter/CopiedLayoutIGraph: IMappers which use ILabels as key and boolean, int or double as value are now correctly translated into data providers for layout algorithms.

Fixed a bug that a dataprovider with key LayoutGraphAdapter#EDGE_LABEL_LAYOUT_PREFERRED_PLACEMENT_DESCRIPTOR_DPKEY that has been filled by a LayoutData has been ignored.

Incompatible Changes

Viewer

Model

IGraph: The signature of method #addBend(IEdge, int, PointD) has been changed to #addBend(IEdge, PointD, int).

IMapperRegistry: Renamed the methods #add* to #create*. The type of property #MapperMetadata has been changed from IMapperMetadata to MapperMetadata.

DefaultGraph and 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 #addBend(PointD, int).

Geometry

GeneralPath: The return value type of method createPath has been changed from Path2D.Double to Path2D.

View

Most implementations and some usages of IAnimation have been removed and are now available as factory methods in IAnimation. This included the classes LayoutMorpher, EasedAnimation, GeneralPathAnimation, ParallelAnimation, LabelAnimation, NodeAnimation, PortAnimation, EdgeAnimation.

CanvasComponent: The property #Editable has been removed. It had no effect on almost all input modes anyway. To no longer allow editing a CanvasComponent use 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 GraphComponent or IGraph to set the GraphMLIOHandler used by the IO commands and convenience IO methods on GraphComponent is no longer supported. Use the #GraphMLIOHandler property on GraphComponent instead.

The interface IRectanglePainter has been replaced by the more powerful interface IVisualTemplate. Implementations have been adjusted accordingly and members and classes with name *Painter or *RectanglePainter have been renamed to *Template or *VisualTemplate.

EdgeDecorationInstaller: The method #getBendVisual(IRenderContext,IBend) returning an IVisual was replaced by the method #getBendDrawing(CanvasComponent,IEdge) returning an IVisualTemplate that is used for all bends of the passed edge. The subclasses EdgeFocusIndicatorInstaller, EdgeHighlightIndicatorInstaller and EdgeSelectionIndicatorInstaller now contain static ResourceKey fields #BEND_TEMPLATE_KEY that can be used to register custom IVisualTemplates for bends on the GraphComponent.

Input

The command mechanism has been refactored:

ICommand, CommandAction, CommandBindingAction have been moved to package com.yworks.yfiles.view.input. Classes Command, CommandBinding, CommandManager, CanExecuteRoutedEventArgs, ExecutedRoutedEventArgs as well as the related properties on CanvasComponent have been removed. KeyboardInputMode offers new methods #addCommandBinding and #addKeyBinding for binding commands to actions and keyboard gestures to commands.

Class KeyboardInputMode has been refactored. New interfaces CanExecuteCommandHandler and ExecuteCommandHandler for handling commands have been introduced. All methods for binding commands to IEventListener implementations 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 KeyboardInputModeBinding instance that offers a #remove method for this purpose.

HandleInputMode: For all HandleTypes a corresponding ResourceKey was added as static field that can be used to register a custom IVisualTemplate for this handle type. Per default the #createVisual(IRenderContext,IHandle) method now looks up the IVisualTemplate for the ResourceKey matching the HandleType for the passed IHandle. The #updateVisual method is no longer used and was removed.

An initially collapsed group node as a result of ICommand#GROUP_SELECTION now has a reasonable size.

IClipboardIdProvider: Signature of method #getId(IModelItem, IGraphClipboardContext) has been changed to #getId(IGraphClipboardContext, IModelItem).

Styles

AbstractEdgeStyle and AbstractStripeStyle: The return type of method #clone() has been changed from AbstractEdgeStyle<TVisual> to AbstractEdgeStyle. Furthermore, the return type of methods #createVisual(IRenderContext, IEdge) and #updateVisual(IRenderContext, IVisual, IEdge) has been changed from TVisual extends IVisual to IVisual.

IconLabelStyle:

The type of property #Url has been changed from String to java.net.URL.

The constructors have been changed and now take the URL of the icon instead of its Image.

MemoryIconLabelStyle: Simplified constructors that now only allow to specify the image of the icon as well as a custom renderer.

The type of ArcEdgeStyle#Renderer has been changed from IEdgeStyleRenderer to ArcEdgeStyleRenderer.

The type of PolylineEdgeStyle#Renderer has been changed from IEdgeStyleRenderer to PolylineEdgeStyleRenderer.

TableNodeStyle: The type of property #Renderer has been changed from INodeStyleRenderer to TableNodeStyleRenderer. Furthermore, the parameter type of methods #addPropertyChangedListener(IEventListener<PropertyChangedEventArgs>) and #removePropertyChangedListener(IEventListener<PropertyChangedEventArgs>) has been changed from IEventListener to IEventListener<PropertyChangedEventArgs>.

The type of VoidStripeStyle#Renderer has been changed from IStripeStyleRenderer to VoidStripeStyleRenderer.

GraphML

GraphML annotations: SerializationVisibilityType and GraphMLSerializationMode have been merged to GraphMLMemberVisibility.

Property: The properties #Value and #OwnerInstance have been removed. The new methods getValue and setValue now take the owner instance as parameter.

HandleSerializationEventArgs: The property #SourceType is now of type java.lang.reflect.Type instead of java.lang.Class.

IWriteContext and IParseContext: A parameter of type Class<T> that describes the target type has been added to the #getCurrent methods.

XamlSerializer: Signature of method #serialize(Type, IWriteContext, Object) has been changed to #serialize(IWriteContext, Object).

IXamlNameMapper: The return type of method getName(IWriteContext, Type) has been changed from String to XmlName.

Layout

ClassicOrganicLayout: The return type of method property #PreferredEdgeLength has been changed from int to double. Note that this also induces a corresponding change in class OrganicLayoutData.

OrganicLayout and ClassicOrganicLayout: The type of constant #PREFERRED_EDGE_LENGTH_DPKEY has been changed from EdgeDpKey<Integer> to EdgeDpKey<Double>.

LayoutGraph: Methods #getEdgeLabelLayout(Object), #getEdgeLayout(Object), #getNodeLabelLayout(Object) and #getNodeLayout(Object) have been deprecated.

HierarchicLayoutCore.IncrementalHint has been deprecated. Method INodeData#getIncrementalHint() now returns Object.

LayoutGraphAdapter: The type of the provided data provider keys have been changed from Object to a more specific type.

PartitionCellId: The return type of property #Cells has been changed from Collection<Object> to Iterable<Cell>.

HierarchicLayout:

The edge grouping now supports to group incoming and outgoing edges of a node. In previous versions incoming and outgoing edges always defined separate groups even though the user specified the same group IDs for such edges.

Method #isIntegratedEdgeLabelingEnabled does now always return false if 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:

HierarchicLayout#isNodeLabelConsiderationEnabled

OrthogonalLayout#isIntegratedEdgeLabelingEnabled

OrthogonalLayout#isNodeLabelConsiderationEnabled

HierarchicLayout may now place source/target labels in layers that contain common nodes. In previous versions such labels were always placed in separate layers which often led to less compact drawings with superfluous bends.

Geometry information registered with data providers with keys #ALTERNATIVE_GROUP_BOUNDS_DP_KEY and #ALTERNATIVE_EDGE_PATH_DP_KEY is now automatically rotated according to the specified layout orientation. This fixes unstable from-sketch behavior in incremental layout mode when using an orientation other than top-to-bottom. User that

OrganicLayout does 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.

Method Centrality#closenessCentrality now sets the closeness of a node to Infinity if the sum of the shortest path distances is 0. Before, it was set to NaN in such cases.

Groups.Dendrogram does no longer extend class Graph. To enable convenient iteration of a dendrogram, method #getChildren(Node) was added.

SingleCycleLayout: Property #NodeSequencer now allows to specify null to return to the default sequencer. In previous versions, specifying null leads to an IllegalStateException.

Demo Improvements

The package structure of the source code demos has been changed to a more intuitive structure.

The Viewer distribution now provides several source code demos.

The layout code in the BPMN demo was simplified and is now easier to adjust

A new demo application that shows how to configure hierarchic layout for arranging Sankey diagrams was added.

The new GraphMLCompatibilityDemo that shows how to load GraphML files created by yFiles for Java 3.0.x was added.

yFiles for Java 3.0.0.4 – Changes Since 3.0.0.3

Improvements

Demos

BPMNEditorDemo: The class BpmnLayoutData was added and is now used instead of the BpmnLayoutConfigurator.

BPMNEditorDemo: Fixed the initialization of snapping and of the default group node style.

LayoutStylesDemo: The bound restrictions of the Organic layout can now be specified explicitly.

LayoutStylesDemo: Fixed the configuration for the minimum node distance of the Organic layout that was not editable before.

Bugfixes

Viewer

Folding: Fixed a bug in the folding mechanism that could lead to an endless loop when loading a GraphML file containing FoldingEdgeState information.

PathBasedEdgeStyleRenderer: Fixed bug that could leave visual artifacts when switching to an arrow that returned a null visual.

CanvasComponent: Fixed a bug in the mouse wheel scroll behavior that moved the viewport in the wrong direction when scrolling page-wise vertically.

Layout

Fixed java.lang.IllegalArgumentException: Comparison method violates its general contract! problems caused by calling java.util.Arrays.sort for java.util.Comparator implementations that do not imply a total order.

HierarchicLayout: Fixed bug that caused a violation of the minimum first/last segment length for reversed/backloop edges which connect to group nodes.

HierarchicLayout: Fixed rare bug that may cause overlaps between labels and segments of edges with octilinear routes.

OrganicLayout: The type of the dataprovider key GROUP_NODE_MODE_DPKEY was fixed from NodeDpKey<Object> to NodeDpKey<GroupNodeMode>.

OrganicLayoutData: The type of the property GroupNodeModes was fixed from ItemMapping<Node, GroupNodeMode> to ItemMapping<INode, GroupNodeMode>.

yFiles for Java 3.0.0.3 – Changes Since 3.0.0.2

Bugfixes

Viewer

Folding: when using a MergingFoldingEdgeConverter the FoldingEdgeState representing multiple edges could become inconsistent after removing or reconnecting some of the edges.

Path Cropping: fixed a certain case where inaccurate numeric results with ports on node shape outlines would result in the first or last edge segment being completely removed.

DefaultEdgePathCropper: fixed an issue where getIntersection would not be called when cropping an edge at the source end.

IInputModeContext: fixed a bug in getGraph that could cause a stack overflow.

Edge Creation: fixed bug that could cause a 'Node not in this graph' exception during interactive edge creation.

PopupMenuInputMode: moved the default popup menu location one pixel to the right and one pixel down to prevent the mouse cursor from being positioned directly on the popup menu's border. (Mouse clicks on the popup menu's border do neither close the popup menu nor trigger any of the popup menu's entries.)

Layout

HierarchicLayout: fixed rare NullPointerException triggered in AsIsSequencer for edges incident to group nodes that have a sketch without bend points as well as port constraints.

HierarchicLayout: fixed bug that may cause non-orthogonal segments of grouped edges even though orthogonal edge routing is enabled.

HierarchicLayout: improved compactness of layouts that feature group nodes with insets and (group) nodes with halos (NodeHalo). Previously, the specification of halos could enlarge the insets of group nodes by an unnecessary large amount.

HierarchicLayout: fixed an exception that sometimes got triggered when sequence constraints were used.

PartialLayout: fixed NullPointerException that appeared if no DataProvider with key PARTIAL_NODES_DP_KEY is registered with the input graph.

yFiles for Java 3.0.0.2 – Changes Since 3.0.0.1

Improvements

Documentation

The Developer's Guide has been completely revised. Now it consists of two parts: The first part covers the basics of yFiles for Java, while the second part describes in detail how the behavior of the library can be adapted to the customer's requirements.

Viewer

Events defined on DropInputMode now carry additional event arguments DropTargetEventArgs which hold the original Java Swing drag and drop events.

Some GraphML annotations have been added to properties of label models and enums to increase the cross-product compatibility of generated GraphML files. The following properties have been annotated:

SmartEdgeLabelModel.AutoRotationEnabled is now annotated AutoRotation

HorizontalAlignment's CENTER, LEFT and RIGHT values are now annotated Center, Left and Right

TextTrimming's NONE, CHARACTER_ELLIPSIS and WORD_ELLIPSIS values are now annotated None, CharacterEllipsis and WordEllipsis

TextWrapping's WRAP_WITH_OVERFLOW, NO_WRAP and WRAP values are now annotated WrapWithOverflow, NoWrap and Wrap

EdgePathLabelModel.AutoRotationEnabled is now annotated AutoRotation

EdgeSegmentLabelModel.AutoRotationEnabled is now annotated AutoRotation

FreeEdgeLabelModel.RelativeAngleEnabled is now annotated EdgeRelativeAngle

AbstractJComponentLabelStyle.AutoFlippingEnabled is now annotated AutoFlip

ArcEdgeStyle.FixedHeightEnabled is now annotated FixedHeight

HtmlLabelStyle.AutoFlippingEnabled is now annotated AutoFlip

NodeStyleLabelStyleAdapter.AutoFlippingEnabled is now annotated AutoFlip

The default value for GraphML serialization of PanelNodeStyle.Color is now Black.

Layout

HierarchicLayout: Fixed NullPointerException that could happen in AsIsSequencer when incremental group hints are defined (see IncrementalHintsFactory.createIncrementalGroupHint) along with specific port constraints on edges incident to an incremental group node.

HierarchicLayout: Improved result if compact label placement is enabled (which is the default), see SimplexNodePlacer.LabelCompaction. In previous versions the labels may have been placed in a stacked style even if this did not make the result more compact (e.g. if all labels are placed to the right of the edges).

GraphPartitionManager: Fixed functionality to hide edges when using methods GraphPartitionManager.hide. Previously, edges were actually not hidden from the graph.

HierarchicLayout: Fixed distance between vertical (in a top-to-bottom layout) segments of same layer edges that connect to group nodes. This also applies to self-loops that connect to the top or bottom of a group node with both ends as well as same layer parts of other edges like back-loops.

HierarchicLayout: Fixed bug that caused the minimum edge-to-edge distance to be violated by edges with strong port constraints that cross each other.

Demos

BPMNEditorDemo: Fixed positioning of the dynamic substate button of activity and choreography nodes.

Fixed invalid HTML structure of demo readmes.

yFiles for Java 3.0.0.1 – Changes Since 3.0

Demos and Tutorials

Added new demo layout.LayoutStylesDemo that presents all major layout algorithms in an easily explorable and configurable manner.

Added new demo viewer.svgimageexport.SVGImageExportDemo that shows how to export the contents of a GraphComponent to SVG.

Added new demo viewer.pdfimageexport.PDFImageExportDemo that shows how to export the contents of a GraphComponent to PDF, EPS and EMF.

Added new demo viewer.svgnodestyle.SVGNodeStyleDemo that shows how to use SVG for node visualization.

Added new demo bpmn.editor.BPMNEditorDemo with corresponding graph element styles and a customized layout algorithm that demonstrates how to use yFiles for BPMN applications

GraphViewerDemo: Shift click on a node in the movie graph opens now a related link in the default browser (as already stated by the graph's description).

Improvements

Viewer

CanvasComponent: Added an event FitContentViewMarginsChanged that gets invoked when the propery #FitContentViewMargins has been changed.