yFiles.NET (WinForms) Changelog
yFiles.NET 4.4.0.2 - Changes Since 4.4.0.1
Bugfixes
- The installer did not correctly detect newer .NET framework versions.
Viewer
-
The
CreateEdgeInputMode.EdgeCreatedevent has been raised 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 is now raised 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. -
SmartEdgeLabelModel: Edge label snap lines have been too short for some positions that are far apart from the edge path. -
SmartEdgeLabelModel: An exception was thrown if the path of the corresponding edge contained bends that were close together or at the same location. - Folding: The view state of a port on a folder node was sometimes ignored when a folding edge was created.
- When dragging an unselected bend and canceling the gesture by pressing ESC, the dragged bend was removed.
-
Fixed several issues with orthogonal edge editing.
- Canceling moving a port added bends to otherwise straight edge segments.
- An edge could have become non-orthogonal when a non-selected bend was moved.
- Self-loops with the same source and target location are now treated as orthogonal.
-
Explicit
Arrowelements in GraphML were sometimes read back incorrectly. The new deserialization propertySerializationProperties.ParseArrowElementAsDefaultArrowcan be used to work around this issue. - GenericPortLocationModel wasn't serialized correctly.
-
Table.SetStyle(ILabel, ILabelStyle)andTable.SetLabelModelParameterignored the provided style resp. label model parameter. -
OverviewInputModecould break the overview visualization if the overview had a very small width or height. -
OverviewInputModethrew an exception if it was used without aClientCanvas. - Hiding INodeSnapResultProvider or IBendSnapResultProvider from the lookup no longer leads to a crash when nodes or bends are moved.
-
StripeDropInputMode.StripeCreatedalways returned a wrong stripe instance. -
Fixed numeric instabilities in
ImageSupport.Gaussian1DScaledthat could result in divisions by zero on certain platforms when drop shadows for built-in styles were used. - Fixed possible ObjectDisposedException when the GraphControl was disposed while an animation was still running.
Layout
- Fixed possible NullReferenceException when using OrganicLayouter for very small graphs.
-
Fixed a bug in
TableLayoutConfiguratorwhich altered the size of a column or row if an edge routing algorithm has been applied.
Demos
- BPMN demo: Default ConversationNodeStyle could not be deserialized correctly.
yFiles.NET 4.4.0.1 - Changes Since 4.4
Bugfixes
- A bug in
RotatedSliderEdgeLabelModelthat could only occur in very rare occasions where the first or last edge segment is orthogonal and the source or target port was completely outside the node boundaries, could cause the label to lie at infinite coordinates. In most cases this would result in the label becoming just invisible, but code that does not properly handle infinite coordinates could possibly break due to numeric instabilities. - An edge whose source or target port is owned by another edge (edge-to-edge connection) was always drawn in the background if grouping was enabled instead of in front of the related groups. Now, such an edge is drawn in front of these groups, with the same z-index as a similar edge from node to node would get.
GenericYList: CallingInserton an empty list has thrown an exception.MoveViewportInputModeno longer fires theDragFinishingandDragFinishedevents for simple clicks without any mouse movement.NodeDefaults,EdgeDefaultsand all otherDefaults: it was erroneously possible to assignnullto theStyleproperty although this property is marked asNotNull. Now, the property throws anArgumentNullExceptionin this case.FoldedGraphdetects more carefully what has changed before invoking the methodsCreateDummyEdgeAppearanceandChangeDummyEdgeAppearanceofIDummyEdgeConverter. Previously, in some cases, these methods were called to often or not at all.- When both a group node and its child node were resized together the group node bounds shrunk to its original bounds once the child had reached the original bounds.
- Fixed problem in
LayoutGraphAdapterwhere label candidates for edge labels were not always determined correctly. - When snapping was disabled temporarily (using Ctrl) during a move gesture the moved item snapped after finishing the gesture, anyway.
FoldedGraphUndoSupportdidn't add the correct bend information to its internal data structures.- Custom selection visualizations using
EdgeStyleDecorationInstallerinDecorationZoomMode.MixedorDecorationZoomMode.ViewCoordinatesdid not work correctly together withBridgeManager. - Explicit null values (
<x:Null/>) in GraphML could lead toNullReferenceExceptions. - GraphML serialization can be forced to write a class property in element syntax using a
GraphMLAttribute'sWriteAsAttributeproperty with valueXamlAttributeWriteMode.Never. Forcing a property that is shared to be written as element lead to invalid GraphML files. - If
GraphEditorInputMode.Graphhad been changed, the mode still held a reference to items from the previous graph instance, thus delaying garbage collection of that graph instance. This has been improved. - Orthogonal edge editing could throw an exception if edges were removed during a gesture that would require edge orthogonalization.
- Improved performance of
BridgeManagerand prevented redundantLineTopath elements. EmfExporter: Prevent locked files caused by internal exceptions.- Changes to
IGraph.Nodes,IGraph.Edgesand other collection properties onAbstractGraphWrapperimplementations were not correctly propagated to the wrappedIGraphinstance. In particular, this affected folding views. - If
NodeDropInputMode.LeafParentsAllowedwas false, dropping a node onto a leaf node did not consider parent group nodes of the leaf node as possible drag targets. This was a regression with respect to the behavior in version 4.3 and earlier of the library. The fixed behavior is slightly incompatible with previous releases in the 4.4 release branch. - If
NodeDropInputMode.LeafParentsAllowedwas true, the value of theFolderNodeParentsAllowedwas ignored. - Changes to the properties
CanvasControl.PrintCommandsEnabled,CanvasControl.NavigationCommandsEnabled,GraphControl.FileOperationsEnabledandGraphControl.ClipboardEnabledwere not properly reflected in the UI.
Layout
IncrementalHierarchicLayouter: In non-incremental mode, sequence constraints may not have been respected.IncrementalHierarchicLayouter: Optimized the sequence of group nodes if 'place at head/tail' sequence constraints are defined.IncrementalHierarchicLayouter: corrected wrong node placements in graphs with groups if sequence constraints are used.Polyline.EdgeRouter: Fixed rareNullReferenceExceptionthat may occur for graphs where only a subset of edges is routed, seeEdgeRouter.SphereOfAction.CircularLayouter: Fixed bug that may cause node overlaps.CopiedLayoutGraph: Fixed problem that may cause movement of label boxes in the original graph even if methodCopiedLayoutGraph.CommitLayoutToOriginalGraphis not called.ComponentLayouterModule: Disabled from-sketch option for styles that don't support it.MultiPageLayouter: Fixed bug that caused that anAbortHandlerattached to the input graph was ignored.MultiPageLayouter: FixedNullReferenceExceptionthat may occur if the data providerMultiPageLayouter.EdgeIdDpKEyis an instance ofEdgeMap.IncrementalHierarchicLayouter: Fixed routing style violations in octilinear grouped edges.IncrementalHierarchicLayouter: Fixed label placement for octilinear selfloops with the same side constraints for source and target port.
Incompatible Changes
Changes in Default Behavior
- If
NodeDropInputMode.LeafParentsAllowedis false, dropping a node onto a leaf node now does consider parent group nodes of the leaf node as possible drag targets. This fixes a regression with respect to the behavior in version 4.3 and earlier of the library. The fixed behavior is slightly incompatible with previous releases in the 4.4 release branch.
yFiles.NET 4.4 - Changes Since 4.3.0.5
Major Features Added
Viewer
GraphClipboardnow supports copying independent items. This allows the user to copy labels, ports, bends, or edges to other elements without having to copy their owners. Also this technique allows for copying an item (for example a label) to multiple target elements at once.- The
GraphClipboardnow supports an optional target location for pasting and the new methodGraphEditorInputMode.PasteAtLocationcan be used for this end, too. In addition,ApplicationCommands.Pastenow supports an optional parameter of typeIPointto provide a target location. GraphEditorInputModenow provides default action for duplicating single graph items or whole subgraphs. This also works with incomplete subgraphs, for example in a tree, it is possible to duplicate a subtree and the tree will never be disconnected.
In addition, the new commandGraphCommands.DuplicateSelectionCommand(shortcut: Ctrl-D) and the new methodGraphClipboard.Duplicatecan be used to duplicate selected items without altering the clipboard contents.GraphEditorInputModenow provides a default action for reversing edges. To this end, the methodsReverseEdgeandReverseEdgeshave been added toGraphEditorInputMode. Also, the new commandGraphCommands.ReverseEdgesCommand(shortcut: Ctrl-R) has been added.- Node and edge labels can now snap to particular locations while moving them interactively. Both types of labels can be aligned horizontally or vertically to their original location. In addition, a node label can be aligned with the borders or the center of its owner, and during resizing of that owner, smartly keeps its relative location to the snapped position. An edge label can be snapped on the path of its owner, or at particular distances of it.
This feature can be enabled and configured with anLabelSnapContextand is available for labels with one of these label models:SmartEdgeLabelModel,FreeEdgeLabelModel,FreeNodeLabelModel, andFreeLabelModel. - Interactive label editing and creation has the following new features:
- The current label visual can be hidden while the text editor is shown to reduce visual clutter. This feature is disabled by default and can be controlled through the property
GraphEditorInputMode.HideLabelDuringEditing. GraphEditorInputModeandTableEditorInputModeprovide new eventsLabelTextEditingStartedandLabelTextEditingCanceledthat are raised directly before the label text editor is shown and after the label editing has been canceled, respectively.- Double clicking nodes and edges now opens the label editor. An existing label can be double clicked to edit the label text. This feature can be disabled with the property
GraphEditorInputMode.DoubleClickLabelEditingAllowed. IEditLabelHelperimplementations provided by theILabel's lookup can now be used to forbid or customize the editing of individual labels. ClassLabelDecoratorprovides a new propertyEditLabelHelperDecoratorto customize this feature.GraphEditorInputMode.EditLabelandTableEditorInputMode.EditLabelcan now be used withSimpleLabelinstances. This provides editing capabilities for dummy elements such as legends, page headers or other textual elements.
- Uses the various callback methods on
GraphEditorInputMode,TableEditorInputModeandIEditLabelHelperimplementations in a consistent way, regardless of how many labels or labeled items are edited or added, and independent from how the editing/label creation process has been started (e.g. through a command or programmatically through the input mode convenience methods). - Determines the actual labeled item that is modified when multiple elements are selected in a consistent way.
- The current label visual can be hidden while the text editor is shown to reduce visual clutter. This feature is disabled by default and can be controlled through the property
Layout
- Added new layout algorithm
RadialLayouterthat places nodes on concentric circles. Edges are routed in a radial fashion using one of several routing strategies. - Added support for terminating (layout) algorithms prematurely. To this end, new class
AbortHandlerprovides methods for requesting early but graceful termination (see methodStop) and immediate termination (see methodCancel).The following layout algorithms have at least rudimentary support for immediate termination: Layout Algorithms Routing Algorithms Other Algorithms BalloonLayouterCircularLayouterCompactOrthogonalLayouterDirectedOrthogonalLayouterGenericTreeLayouterGRIPHierarchicGroupLayouterHierarchicLayouterIncrementalHierarchicLayouterOrganicLayouterOrthogonalGroupLayouterOrthogonalLayouterPartialLayouterRadialLayouterRecursiveGroupLayouterSmartOrganicLayouter
BusRouterPolyline.EdgeRouterOrganicEdgeRouterOrthogonalEdgeRouter
GreedyMISLabelingSALabeling
The following layout algorithms also support graceful early termination: Layout Algorithms Routing Algorithms Other Algorithms HierarchicGroupLayouterHierarchicLayouterIncrementalHierarchicLayouterOrganicLayouterSmartOrganicLayouter
Polyline.EdgeRouter
SALabeling
- Added support for parallel execution of computationally intensive tasks.
Layout algorithmsSmartOrganicLayouterandOrganicLayoutermay take advantage of multiple threads for layout calculations. Parallel execution is enabled using the algorithms'MultiThreadingAllowedproperty.
InterfaceITaskExecutorand factory classTaskExecutorFactorymake up the programmatic interface for the new concurrency support. - Introduced concept of node halos. Halos are reserved space around a node in which layout algorithms will not place other graph elements. Node halos are modelled using class
NodeHalo.The following layout algorithms support node halos: Layout Algorithms Routing Algorithms Other Algorithms BalloonLayouterCircularLayouterCompactOrthogonalLayouterComponentLayouterDirectedOrthogonalLayouterGenericTreeLayouterIncrementalHierarchicLayouterOrthogonalGroupLayouterOrthogonalLayouterRadialLayouterRecursiveGroupLayouterSmartOrganicLayouterTreeLayouter
Polyline.EdgeRouterSelfLoopLayouter
GreedyMISLabelingSALabelingInsetsGroupBoundsCalculatorMinimumSizeGroupBoundsCalculator
SmartOrganicLayouter: Added support for partition grid layout. SeePartitionGrid.
Minor Features Added
Viewer
GraphEditorInputModegot support for cyclic click selection. This helps in conveniently selecting items that are hidden behind other items. By default, this features is bound to the Alt-Key being pressed. It can be disabled by setting theCyclicSelectionRecognizerproperty toEventRecognizers.Never.ItemDropInputModeis a newDropInputModethat facilitates subclasses that support preview and snapping of the dragged item as well as highlighting potential drop targets.NodeDropInputModeandStripeDropInputModehave been refactored to useItemDropInputModeas base class.ItemHoverInputModeis a newIInputModethat fires events when the mouse enters or leaves the visualization of a graph item.GraphEditorInputModeandGraphViewerInputModeprovide a newCanvasClickedevent to detect clicks on an empty canvas location.- Node ports can now be moved by dragging their
IHandle. GraphClipboardhas new propertiesCopyItems,IndependentItems, andDependentItemsthat allow for restricting the types of items that can be copied at all, independently from their owners, or implicitly through their owners, respectively.GraphViewerInputModeandGraphEditorInputMode: TheirClickInputModenow delivers both left and right clicks.GraphViewerInputMode: The click hit test order can now be configured by propertyClickHitTestOrder.GraphEditorInputModeandGraphViewerInputModeprovide an explicit hit test order for double clicks that can be changed through theDoubleClickHitTestOrderproperty. By default, this hit test order prefers labels over other graph elements.- Added new method
ClickInputMode.PreventNextDoubleClickthat can be used in event handlers for single clicks to prevent that this click can become part of a double click event. NodeDropInputModecan now optionally drop nodes onto leaf nodes and thus convert the leaves into group nodes. Also it is possible to drop nodes into collapsed folder nodes. For both use-cases, an opt-in property has been added and a predicate property allows for fine-grained control over this feature.- Similarly, leaf nodes can now be the target of a reparenting gesture if the property
GraphEditorInputMode.ReparentToLeavesAllowedis enabled. In this case, leaves are converted into group nodes. - Added support for deleting bends in a way that an orthogonal edge remains orthogonal after removing the bends. The new property
GraphEditorInputMode.OrthogonalBendRemovalenables/disables this feature. GraphViewerInputModenow supports multi-selection via Ctrl+Click and marquee selection. The latter is disabled by default.OverviewInputModeand theGraphOverviewControlhave been optimized to improve the user experience when used on touch devices.OverviewInputModecan be customized more easily. Minor modes can be replaced and adjusted, as well as the list of available default command bindings can be modified.- Improved
GraphModelManagerto allow for easier customizations. PropertyUseHierarchicNestingwas added to allow for adding custom logic that uses a different approach to hierarchic nesting. Also the return types of some of the factory methods where made less restrictive to allow for further modifications. FoldingManagernow offers two convenience methods,UpdateViewStates(INode)andUpdateViewStates(IEdge), that will trigger update calls onIDummyNodeConverterandIDummyEdgeConverterfor elements that are currently being displayed in a view. This makes it easier to synchronize state between the master graph and the folded graph views in case this is not automatically performed by the default implementation.
Layout
BalloonLayouter: Added support for integrated node and edge labeling. See new propertiesIntegratedEdgeLabeling,IntegratedNodeLabeling, andNodeLabelingPolicy.BalloonLayouter: Added support for different policies to align nodes having the same root node. See new propertyChildAlignmentPolicy.BalloonLayouter: Added support for interleaved child node placement. With interleaved placement, child nodes are placed at different distances to their parent node to achieve a more compact layout. See new propertyInterleavedMode.IncrementalHierarchicLayouter: Improved partition grid support. Nodes can now be mapped to a multi-lane partition cell identifier, i.e., a cell spanning multiple columns and rows. See classPartitionGrid.IncrementalHierarchicLayouter: Improved edge label placement. Edge labels with preferred placement at source/target are placed closer to the corresponding node. Additionally,SimplexNodePlaceroffers the option to place adjacent edge labels in a compact, stacked style. See new propertyLabelCompaction.Polyline.EdgeRouter: Added a fine-granular configuration option to weigh the crossing costs for each label using the data provider look-up keyEdgeRouter.LabelCrossingCostFactorDpKey.Polyline.EdgeRouter: Added propertyIgnoreInnerNodeLabelsthat allows to ignore node labels that are inside the bounds of their owner so they may be crossed by edges. This is especially useful if labels of group nodes may be crossed while outer labels of non-group nodes may not.Polyline.EdgeRouter: Added support for customizing the order in which edges are routed. See new propertyEdgeOrderComparator.GenericTreeLayouter: When enablingGenericTreeLayouter.IntegratedNodeLabelingand/orGenericTreeLayouter.IntegratedEdgeLabeling, the respective labels will be taken into account during the calculation of group bounds.DelegatingNodePlacer: Added keyDelegatingNodePlacer.LeftRightDpKeythat allows choosing on which side a node is placed.PartialLayouter: Now supports handling of directed and undirected edges. See data provider keyDirectedEdgesDpKey.FixNodeLayoutStage: Added additionalFixPointPolicysUpperRight,LowerRight, andLowerLeft.LabelLayoutTranslator: Added propertiesWriteBackRelativeEdgeLabelLocationandWriteBackRelativeNodeLabelLocationthat allow a core layouter to specify new node or edge label locations relative to the label's owner.LabelLayoutKeys: Added keyIGNORE_LABEL_KEYthat allows specifying which edge and node labels should be ignored during layout calculations.- Added new class
OrganicRemoveOverlapsStagethat removes node overlaps while respecting a specified minimal node distance. Unlike the approach implemented in classRemoveOverlapsLayoutStage, this approach tries to keep the original layout structure, i.e., it tries to keep the geometric distance between the nodes. - Added class
StraightLineEdgeRouterthat routes edges as straight lines considering specified port constraints.
Improvements
Viewer
- Various performance improvements for the rendering and the selection handling. This affects, amongst others,
ShapeNodeStyleand styles that use aGeneralPath. GraphEditorInputMode.DetailSelectionRecognizeris now also applied for double clicks to determine the clicked item.- Improved options for internationalization of strings used in the library. Now custom resources with the names
yWorks.Canvas.CanvasResourcesandyWorks.yFiles.GraphResourcescan be added to the application project and override strings the library uses. GraphEditorInputModeandGraphViewerInputModedon't select or focus graph items styled with a void style (VoidNodeStyle,VoidEdgeStyle,VoidLabelStyle, andVoidPortStyle). The new propertyVoidStylesIgnoredspecifies whether this feature is enabled.GraphEditorInputModeandGraphViewerInputMode: the new protected methodShouldSelectcan be overridden to determine whether an item can be selected in general.DropInputMode: Added propertyLastDragEventArgs.OverviewInputMode: The new propertyMarginsspecifies margins for the visible area of the boundGraphOverviewControl. The new protected methodUpdateVisibleAreaprovides further means for customizing the visible area.CompositePositionHandler: Added methodsGetPositionHandlerandGetHandleto retrieve an earlier addedIPositionHandlerorIHandle.PortRelocationHandles now triggers theEdgePortsChangedevent of theGraphEditorInputMode.EdgeStyleDecorationInstallercan now be used with self loops without bends, too.ContextConfigurator: The new propertyZoomdetermines the zoom value that should be assumed on the canvas when drawing. This can affect the rendering of zoom dependent paintable implementations.TableLayoutConfigurator: Improved support for routing algorithms.IGraph: The collection models of graph items returned by the propertiesNodes,Edges, etc. now support the methodsRemoveandClearto remove graph items from the graph. Note that calling the methodAddis still not allowed.GraphModelManager: New callback methodOnGraphChanged.LayoutExecutor: The new propertyConsiderViewportLimitercan be enabled to let the target viewport after a layout respect theViewportLimiterof theGraphControl.
TheViewportAnimationhas a new propertyConsiderViewportLimiterfor the same purpose.LayoutGraphAdapternow adds data providers that map each node, edge and label of aLayoutGraphto their correspondingIModelItemin the originalIGraph. Especially, these data providers are available if a layout is run with aLayoutExecutoror the convenience methodsLayoutExtensions.MorphLayoutandLayoutExtensions.ApplyLayout.GeomSupport: The new methodCreateSmoothedPathcreates a new path as copy of a given one but with smoothed bends.IconLabelStyle: The icon is added to the hit test area for mouse clicks and marquee selection. This can be switched off by overridingIconLabelStyleRenderer.ShouldHitTestIcon.CanvasControl: MethodFitContentnow respects theViewportLimiter. This might result in zoom levels greater than1.0.DefaultDummyEdgeConverternow synchronizes theTagproperty of the first label if label synchronization is enabled.GraphCopierhas been improved to facilitate manipulation of the copied items:- The new events
NodeCopied,EdgeCopied,LabelCopied, andPortCopiedare dispatched after a model item has been copied. - The method
GetOrCreateCopy<T>is now public to facilitate copying of, for example, node tags.
- The new events
GraphClipboard: In hierarchically organized graphs, nodes are now pasted into their previous parent group, the group at their target position, or the root, depending on the new propertyParentNodeDetection.- Automatic installation of the integrated API documentation is now available for Visual Studio 2013 and 2015 and enabled for all supported Visual Studio versions by default.
Algorithms
Dfs: Added methodCancelthat can be used by subclasses to cancel the search.Cycles: Improved methodFindCycleto stop the search as soon as the first cycle has been found.GraphConnectivity: Improved methodMakeBiconnectedto work with graphs with self-loops (i.e. edges whose source node is also the target node).Groups: Replaced recursive implementation of methodBiconnectedComponentGroupingwith an iterative algorithm to support larger graphs.
Layout
IncrementalHierarchicLayouter: The default sequencing phase has been improved to produce less crossings and run faster.IncrementalHierarchicLayouter: Now prevents overlaps among same layer edges attached to group nodes.IncrementalHierarchicLayouter: Selfloop routing now takes the layout flow into account. For layout orientation top-to-bottom, selfloops will by default exit on the left or right and enter on top.IncrementalHierarchicLayouter: Added option to route selfloops like backloops (starting at the bottom of the node and ending at the top of the node) when backloop routing is enabled.IncrementalHierarchicLayouter: During layering, edges connected to group nodes may be redirected and replaced by dummy edges connected to the children of the group node. For these dummy edgesILayoutDataProvider.GetEdgeDatanow returns anIEdgeDataof the new typeEdgeDataType.RedirectedGroupEdge.PCListOptimizer: Improved port candidate assignment calculated by methodOptimizeAfterSequencing.SmartOrganicLayouter: Now uses a more sophisticated approach to remove node overlaps if the scope is set toScope.Alland the quality to time ratio is greater than or equal to0.7(propertyQualityTimeRatio).InteractiveOrganicLayouter: MethodStartLayoutnow takes advantage of multiple threads for layout calculation which may reduce the required runtime.BalloonLayouter: Reduced gaps between adjacent nodes.PartitionLayouter: Added nested classPartitionLayouter.PolylineInterEdgeRouterthat routes inter-edges using classPolyline.EdgeRouter.PartialLayouter: Now considers port constraints independent of the specified layout orientation. Note that port constraints are only considered if the core layout algorithm supports port constraints as well.PartialLayouter.StraightLineEdgeRouter: Added support for port constraints.RecursiveGroupLayouter: Added optionReplacePortConstraintsthat replaces port constraints by port candidates and, thus, may improve the layout result.Polyline.EdgeRouter: Improved support for port candidate sets (see classPortCandidateSet).Polyline.EdgeRouter: Rerouting improved to provide better results.Polyline.EdgeRouter: Memory usage has been reduced.Polyline.EdgeRouter: Added penalty setting for edge length. SeePenaltySettings.EdgeLengthPenalty.Polyline.EdgeRouter: Added four predefined optimization strategies. SeePenaltySettings.OptimizationBalanced,PenaltySettings.OptimizationEdgeBends,PenaltySettings.OptimizationEdgeCrossings, andPenaltySettings.OptimizationEdgeLengths.Polyline.EdgeRouter: Default penalty settings for minimal node to edge distance, minimal group node to edge distance, minimal first and last segment length, and bends in node to edge distance increased. As a result, these restrictions are considered more strongly.Polyline.EdgeRouter: Now avoids very small octilinear segments.Polyline.EdgeRouter: Edge grouping improved to keep edge segments grouped longer and to consider the paths of fixed edges when calculating the paths of edges having the same edge group.Polyline.EdgeRouter: When using polyline routing, short orthogonal edge segments in a monotonic path section are replaced by a single diagonal segment instead of a short diagonal segment followed by an orthogonal segment followed by a second short diagonal segment.DirectedOrthogonalLayouterandOrthogonalGroupLayouter: Added optimization step that reduces the number of perceived bends. See new propertyPerceivedBendsOptimization.OrthogonalLayouter,OrthogonalGroupLayouterandDirectedOrthogonalLayouter: Added optimization step that aligns degree one nodes (i.e. nodes with one incident edge) that have the same neighbor. See new propertyAlignDegreeOneNodes.OrthogonalGroupLayouter: Improved routing and edge labeling for self-loops of normal (non-group) nodes.LayoutTool: Added new rectangle arrangement methodArrangeRectangleMultiRowssuitable for arranging rows of rectangles with highly different sizes.ComponentLayouter: Added the following new component arrangement strategies toComponentArrangementStylesthat are suitable for components with highly different sizes:MultiRows,MultiRowsCompact,MultiRowsHeightConstrained,MultiRowsHeightConstrainedCompact,MultiRowsWidthConstrained, andMultiRowsWidthConstrainedCompact
Demos
- The new demos
Demo.yFiles.Graph.Bpmn.ViewandDemo.yFiles.Graph.Bpmn.Editorare more complex demos that show how yFiles can be customized to create ambitious BPM Editor and BPM Viewer. - The new demo
Demo.yFiles.Graph.Eventsshows how to register to the various events provided by the graph, the input modes, and theGraphControl. - The new demo
Demo.yFiles.Graph.Input.MoveUnselectedNodesshows how to use and configure a modifiedMoveInputModewhich lets the user move nodes without selecting them first. - The new demo
Demo.yFiles.Graph.Input.LabelEditingshows customizations of the interactive label editing made possible by the improvements of the label editing, for example input validation and instant typing. - The demo
Demo.yFiles.GraphEditornow supports changing the style of a label, drag'n'drop ports with aSimplePortStyleand editing nodes with aTableNodeStyle. - The new demo
Demo.yFiles.Layout.AbortHandlershows how the new classAbortHandlercan be used to stop a layout algorithm which is running in the background. - The demo
Demo.yFiles.Layout.InteractiveOrganicwas simplified. Now, it uses the events provided byMoveInputModeinstead of a customIPositionHandlerimplementation. - The demo
Demo.yFiles.Graph.IntegratedNodeStyledemonstrates a custom node style that renders its labels and ports on the same layer as itself. This results in labels and ports being hidden behind other nodes and edges that are rendered in front of the item that they belong to. - The demo
Demo.yFiles.Graph.Input.HandleProvidernow also shows how to implement a handle which supports rotation of labels. - The new step
21 Bridge Supportof the Style Tutorial shows how to add support for bridges to a custom edge style. - Various aspects of the
InputDemoshave been improved: more concise sample code, more meaningful descriptions and comments, and nicer overall appearance.
Incompatible Changes
Changes in Default Behavior
GraphEditorInputModenow by default supports the newGraphCommands.DuplicateCommandthat is bound to keyboard shortcut Ctrl-D. If this behavior is undesired new behavior, theDuplicateAllowedproperty can be set tofalse.TableEditorInputModenow only handles left mouse clicks by default, which is consistent with the rest of the library.- The clipboard now supports copying and pasting of items independently from their owning elements. E.g. single selected labels can be copied to other elements, as well as edges without their source and target nodes. This behavior can be reverted to the old behavior by setting
GraphClipboard'sIndependentItemstoNone. GraphEditorInputModenow by default allows for reversing selected edges using the Ctrl-R keyboard shortcut and the newGraphCommands.ReverseEdgeCommand. This new behavior can be turned off by setting theEdgeReversalAllowedproperty tofalse.GraphEditorInputModeandGraphViewerInputMode: The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.- Previously, ports at nodes and edges that were copied and pasted to and from the clipboard were all copied, even if there where no edges attached to them after the operation. Now those empty ports are not copied/pasted anymore unless the
PortDefaults'AutoCleanupproperty is set to false or they were unoccupied before the operation already. In order to restore the old behavior, where all ports were copied, regardless of edges where adjacent to them, make sure to include them in the core predicate, since this behavior change just affects ports that had previously not been accepted by the core predicate function. CanvasControl: MethodFitContentnow respects theViewportLimiter. This might result in zoom levels greater than1.0.GraphEditorInputMode'sNodeCreatedevent may now report nodes that are not part of the graph, when the user has dropped a node viaNodeDropInputModeand the newNodeDropInputMode.FolderNodeParentsAllowedproperty is enabled. By default this feature is disabled, though.IReparentNodeHandler'sIsValidParentmethod may now also be queried if the newGraphEditorInputMode.ReparentToLeavesAllowedproperty is enabled. By default this property is disabled, though. Note that the method will also be queried if the reparent handler is used outside the context ofGraphEditorInputMode.IValueSerializerContext.Instanceinside GraphML writing code now provide the object that should be converted, not the parent object. If you need to access the actual parent object, you can use theOwnerproperty on theGraphMLValueSerializerContextimplementation of this interface.GraphMLIOHandler.QueryReferenceIdnow never is fired forMarkupExtensionsand other proxy objects for serialization, only for the original object references.Polyline.EdgeRouter: MethodDoLayoutnow throws anArgumentExceptionif there is a node with zero width or height in the given graph.FixedGroupLayoutStage: MethodOrthogonalEdgeRouternow returns an instance of classPolyline.EdgeRouterinstead of classOrthogonalEdgeRouter.ComponentLayouter: PropertyPreferredLayoutSizenow throws anArgumentExceptionwhen setting the preferred size to negative values or zero.- Changed default behavior of edge label placement in layouters with integrated edge labeling when using
LabelPlacements.Anywhere. Now edge labels are placed on the edge and in the center between source and target node. This change affects the following layout algorithms:IncrementalHierarchicLayouter,OrthogonalLayouter,OrthogonalGroupLayouter,DirectedOrthogonalLayouter,GenericTreeLayouter, andLabelLayoutDataRefinement. LabelCandidateDescriptor: The default values of the propertiesEdgeOverlapPenaltyandNodeOverlapPenaltyhave been changed to0.0. Values greater than0.0trigger a known issue in all generic label placement algorithms that erroneously rejects all potential candidates. As a result, no suitable placement is calculated in this case.MoveInputModeaccepts mouse hovers with the Shift key held down again. This restores the default behavior in earlier versions of yFiles.NET 4.3.GraphEditorInputModeandGraphViewerInputMode: By default, graph items styled with a void style (VoidNodeStyle,VoidEdgeStyle,VoidLabelStyle,VoidPortStyle) won't be selected or get the focus.GraphEditorInputMode'sClickHitTestOrderproperty default value has changed. Now it does not contain the redundantGraphItemTypes.Allas the last element in the array anymore.GraphViewerInputMode: By default, clipboard commands are now disabled. This can be controlled with the new propertyClipboardCommandsEnabled.- The default keyboard shortcut for deselecting elements (
GraphCommand.DeselectAllCommand) has been changed toCtrl+Shift+A.Ctrl+Dis now the default shortcut for duplicating selected elements (GraphCommand.DuplicateSelectionCommand). Duplicating elements can be disabled via theDuplicateAllowedproperty. GraphEditorInputMode.ShouldBeMarqueeSelectedis no longer queried by thePastecommand to determine the items which should be selected after paste. Instead, the new methodGraphEditorInputMode.ShouldBeSelectedAfterPasteis queried. Note thatGraphEditorInputMode.ShouldBeMarqueeSelectedstill is queried to determine the items which should be selected by marquee selection.- Now, all pasted items are selected after a
Paste(was: only nodes, edges, and bends). This can be configured via the newPasteSelectableItemsproperty inGraphEditorInputModeand the correspondingShouldBeSelectedAfterPastemethod. - The hit test order for double clicks in
GraphEditorInputModeandGraphViewerInputModeis now controlled through the separateDoubleClickHitTestOrderproperty. By default, this hit test order prefers labels over other graph elements. - If
ClickInputModeis configured to deliver both single and double clicks, double clicks are not reported if the first click has created a new node or if cyclic selection is currently active. The same holds forTapInputModeand single/double taps. - The
Rotatehandle visualization is now a single circle, its very thin central point has been removed. - The segment index for label model parameters of
SliderEdgeLabelModelandSideSliderEdgeLabelModelnow is related to the visible segments for edges styled withPolylineEdgeStyle. - If an
IEditLabelHelperimplementation is present in anILabel's lookup, itsEditLabelmethod is now called in addition to an eventual owner's edit helper when the label text is edited. If implementations are present for both the label and the owner, editing is only allowed if both helpers returntrue. Additionally, the predicate methodGraphEditorInputMode.ShouldLabelBeEditedalways has to returntrue, whether edit helpers are present or not. - The label that is edited is now determined in the following order:
- If a label is explicitly provided as a command parameter or through a convenience method or is the only selected element, it is edited if the previous condition is satisfied. No other candidates are tried in that case.
- If a label owner is explicitly provided as a command parameter or through a convenience method, or is the only selected element, the first label that satisfies the condition above is edited if the previous condition is satisfied. If no such label exists, a new label is be added, provided that the owner allows adding. In either case, no other candidates are tried.
- The first selected label for which the previous condition is satisfied.
- If multiple label owners are selected, the first owner that has a label for which the previous condition is satisfied (in which case that label is edited).
- If
IEditLabelHelper.EditLabelfor either an editable label or its owner provides a different label instance, this instance is edited instead. - Otherwise, a label is added if an eligible owner can be found (see below).
- If an
IEditLabelHelperimplementation is present in anILabeledItem's lookup, itsAddLabelmethod is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate methodGraphEditorInputMode.ShouldLabelBeAddedalways has to returntrue, whether edit helpers are present or not. If the new label should be edited interactively after it's creation (the default behavior), it also must be editable, following the rules above. Therefore anIEditLabelHelperimplementation usually should allow editing of label instances that it has created itself inAddLabel. - The label owner for which a label is added is now determined in the following order:
- If a label owner is explicitly provided as a command parameter or through a convenience method, or is the only selected element, a label is added if the previous condition is satisfied. No other candidates are tried in that case.
- If multiple label owners are selected, the first one for which the previous condition is satisfied.
ContextConfiguratornow provides separateScaleandZoomproperties. TheScaleproperty now just scales the complete resulting output by the specified scale factor, including zoom invariant items such as selection decorations. TheZoomproperty acts as logical zoom factor, e.g. for zoom dependent rendering of items. In contrast, earlier versions theScaleproperty acted like theCanvasControl'szoom property, i.e. zoom invariant items were not scaled. To get the old behavior, setScaleandZoomto the same value.
API Changes
-
Changed
SnapLineto support non-orthogonal snap lines as well: its propertiesFromandTohave been changed from typedoubletoPointD, its propertyOrientationwas removed, and its constructors have been changed accordingly.Orthogonal snap lines are now modeled by class
OrthogonalSnapLine. It extendsSnapLineand provides the propertyOrientation. Existing API uses eitherSnapLineorOrthogonalSnapLine, depending on whether it works only with orthogonal snap lines or not.As a consequence, in class
SnapLineSnapResult, the propertySnapLinereturns a non-orthogonalSnapLineand the propertyDeltareturns aPointDinstead of adouble. API related toGraphSnapContextstill works only with orthogonal snap lines and usesOrthogonalSnapLine. - The
Keyproperty onSingleLineSnapLineTemplatePaintable,FixedDistanceSnapLineTemplatePaintable, andInBetweenSnapLineTemplatePaintable, has been made read only. GraphModelManager's factory methods for creating the installers now have a less restrictive return type. The default implementation still returns the same types as before, though.GraphClipboard's factory methods for creating the predicates for the various cut and copy operations now require a second argument that is the graph that the predicate is working on. Usages typically use the graph in the graph control where the selection is also being used. If the default graph selection implementation is used. The graph instance can be obtained from its corresponding property.GraphModelManager's installer related properties now use a weaker return type to simplify subclassing with new functionality. The instances used are the same and can be down-casted accordingly to the more specific types as documented.AlgorithmAbortedException: Removed overloaded methodsCheck. Client code that needs to terminate layout calculations prematurely must use new classAbortHandlerinstead.- Moved classes
PartitionGrid,PartitionCellId,RowDescriptor, andColumnDescriptorfrom packageyWorks.yFiles.Layout.Hierarchic.Incrementalto packageyWorks.yFiles.Layout.Grid. IItemFactory: Added methodCreateRedirectedGroupEdge.LayeredNodePlacer: Removed data provider keyDpKeyDistanceToParentMapfrom public API, since it is for internal use only.Polyline.EdgeRouter: MethodDoLayoutnow throws anArgumentExceptionif there is a node with zero width or height in the given graph.Polyline.EdgeRouter: Penalty settings have been changed to double precision. See classPenaltySettings.PathSearch: Signature of methodCalculateCostshas changed. It now takes an additional double array as parameter that is populated with the calculated costs instead of returning a new array.DrawingEmbedder: Removed public methodPreprocessNodesand protected methodPrintStatistics.GraphClipboard's protected methodCopy(IGraph, Predicate>IModelItem>, IGraph, ElementCopiedDelegate)which was called byCut,Copy, andPasteto invoke theGraphCopierhas been split:Copy(IGraph, Predicate >IModelItem>, IGraph, ElementCopiedDelegate)now is called only byCutandCopy.Pastenow invokes the new methodPaste(IGraph, Predicate >IModelItem>, IGraph, ElementCopiedDelegate, Predicate >IModelItem>).- The type of
GraphMLAttribute'sSerializableproperty has been changed fromboolto the enumGraphMLSerializationMode. GraphEditorInputModeandTableEditorInputMode: return value of callback methodsOnAddLabelandOnEditLabelhas been changed fromvoidtobool. The return value should specify whether the operation in question was successful.
Bugfixes
Viewer
FoldedGraphdetects more carefully what has changed before invoking the methodsCreateDummyEdgeAppearanceandChangeDummyEdgeAppearanceofIDummyEdgeConverter. Previously, in some cases, these methods were called to often or not at all.- When both a group node and its child node were resized together the group node bounds shrunk to its original bounds once the child had reached the original bounds.
- Fixed problem in
LayoutGraphAdapterwhere label candidates for edge labels were not always determined correctly. - Fixed
LayoutGraphAdapterproducing threading issues whenPortCalculatorwas used during a multi-threaded layout. - When snapping was disabled temporarily (using Ctrl) during a move gesture the moved item snapped after finishing the gesture, anyway.
FoldedGraphUndoSupportdidn't add the correct bend information to its internal data structures.- When using an
IEditLabelHelperand adding a label interactively, the helper'sEditLabelcallback was called instead ofAddLabel. - Newly added labels could have had an empty size when an
IEditLabelHelperinstance was registered. - When a highlighted item was removed from the graph, the highlight was not cleaned up.
- Reparenting an empty group node displayed the target node highlight around the reparented node.
- The modified
MoveInputModecreated byMainInputMode.CreateMoveUnselectedInputModechanged the cursor to indicate a movable object even when themodifierRecognizerdisabled moving. - When both a group node and its child node were resized together the group node bounds shrunk to its original bounds once the child had reached the original bounds.
ClickInputMode: Cancelling the mode during clicks didn't work correctly and as a result, the location reported for the next click might have been wrong.CreateEdgeInputModenow copies the dummy edge's tag to the created edge. This could have caused issues when theEdgeCreationStartedwas used to set a custom tag on the dummy edge.- When the pressed status of the Shift key changed during a reparenting gesture of a node, the bounds of its containing group node were not immediately updated.
- When snapping was disabled temporarily (using Ctrl) during a move gesture the moved item snapped after finishing the gesture, anyway.
- Labels whose positions were determined by
NinePositionsEdgeLabelModel,SliderEdgeLabelModel, andSideSliderEdgeLabelModelmight have disappeared when one or more edge segments were hidden under the source or target node. SnapContext: Snap results with anulltag were erroneously always discarded.GeneralPath#Transformand other GeneralPath methods usingMatrix2Dapplied the transformation matrix incorrectly in the case of a rotation.BevelNodeStyle: Fixed update of drop shadow afterRadiushas been changed.IconLabelStyle: MethodGetBoundsinIconLabelStyleRendererreturned a valid rectangle even if the label layout was invalid. As a consequence,IsVisibleerroneously returnedtruefor labels with invalid bounds.- The lookup of
CollapsibleNodeStyleRendererwas missing the correct results forIGroupBoundsCalculator,ISizeConstraintProvider, andIShapeGeometry. - The lookup of
ShadowNodeStyleDecoratorRendererwas missing the correct result forIShapeGeometry. - The
Nameproperty of theGraphMLAttributewas not considered during deserialization. - Write events in
GraphMLwere not always raised. - After setting an
ICanvasObjectGroup'sVisibleproperty tofalsethe group was still visible. CanvasControl.EnsureVisiblehasn't worked for bounds larger than the current viewport.- Setting the view point on a
CanvasControlwith a width or height of 0.0 could cause an exception if aViewportLimiterwas enabled. GraphCopierthrew anConcurrentModificationExceptionif the source and the target graph are identical.- Prevent an
ArgumentNullExceptionin the print preview of theCanvasControl. GraphEditorInputModeandGraphViewerInputModenow respect theMultiSelectionRecognizerfor extending an existing selection via marquee.- Fixed
TableEditorInputModeexhibiting problematic behavior under certain circumstances when theGraphControl's graph is replaced. - GraphML could write incorrect values for bend tags.
- Properties
ShinyPlateNodeStyleRenderer.Radius,ShinyPlateNodeStyleRenderer.Brush,ShinyPlateNodeStyleRenderer.PenandBevelNodeStyleRenderer.Radiuswere not used consistently. - Fixed memory leak that occurred when
CreateEdgeInputModewas uninstalled. DefaultArrow.Lengthdid not take theScalefactor into account, sometimes leading to gaps between the edge and the arrow.- Custom selection visualizations using
EdgeStyleDecorationInstallerinDecorationZoomMode.MixedorDecorationZoomMode.ViewCoordinatesdid not work correctly together withBridgeManager. - Fixed problems with license validation in conjunction with temporary or mandatory user profiles.
Layout
- Running any label placement algorithm had no effect for node/edge labels if the properties
RemoveNodeOverlaps/RemoveEdgeOverlapswere enabled because all potential candidates were erroneously rejected. AbstractLabelingAlgorithm: Fixed bug that may cause removal of labels that don't overlap with other elements if optionRemoveNodeOverlapsis enabled.IncrementalHierarchicLayouter: Fixed rareInvalidOperationExceptionthat may appear for grouped graphs containing nodes with fixed coordinates hint (see, e.g.,IncrementalHintsFactory.CreateUseExactCoordinatesHint).IncrementalHierarchicLayouter: Fixed bug that breaks incremental hints of grouped edges in incremental layout mode. (seeIncrementalHintsFactory.CreateSequenceIncrementallyHint).IncrementalHierarchicLayouter: Fixed bug that may cause a wrong order of fixed (non-incremental) elements if the layouter is applied in incremental mode and the graph contains sequence constraints.BorderLine: Fixed bug in methodGrowthat may result in anArgumentExceptionbecause the minimum value of a BorderLine becomes greater than the maximum value.Polyline.EdgeRouter: Fixed bug that may cause zero length routes of edges whose start and end point are at the same location.IncrementalHierarchicLayouter: Fixed possibleIndexOutOfRangeExceptionthat may occur for grouped graphs in incremental mode with recursive group layering enabled.IncrementalHierarchicLayouter: Fixed possible exception caused by inconsistent grouping.IncrementalHierarchicLayouter: Fixed broken edge routes that may occur for edges with labels ifSimplexNodePlacer's optionEdgeStraighteningOptimizationis enabled.IncrementalHierarchicLayouter: Fixed minimum edge length for orthogonal edges. It is now also taken into consideration for edges that connect to a node's side and for backloop edges.IncrementalHierarchicLayouter: Fixed possibleIndexOutOfRangeExceptioninPCListOptimizerthat may appear if there are port constraints which have no matching port candidate or port candidate set entry.SmartOrganicLayouter: Fixed bug that caused weird placement of fixed elements if the minimal node distance is set to 0.MultiPageLayouter: Fixed possibleNullReferenceExceptionif the input graph contains empty group nodes.MultiPageLayouter: Fixed possibleInvalidCastException.PartialLayouter: Fixed broken edge routes that may appear if optionEdgeRoutingStrategyis set toEdgeRoutingStrategyOctilinear.Polyline.EdgeRouter: Fixed wrong heuristic bend calculation if grid is used.BusRouter: FixedNullReferenceExceptioninBusRepresentationsthat could appear if the input graph contains overlapping nodes.OrganicEdgeRouterModule: Fixed optionUse existing bendswhich was ignored in previous versions.FixedGroupLayoutStage: FixedcanLayoutwhich changed the structure and layout of the graph.IncrementalHierarchicLayouter: Fixed possibleIndexOutOfRangeExceptionifPortConstraints are used together withPortCandidateSets.Polyline.EdgeRouter: Minimum first and last segment length and minimum node to edge distance were sometimes ignored when used together with octilinear routing style.Grouping: Fixed bug in methodNearestCommonAncestorthat sometimes caused wrong results if one of the specified nodes is the ancestor of the other node.InsetsGroupBoundsCalculator: Fixed methodCalculateBoundsto consider only the given child nodes and all edges between those child nodes instead of all nodes and all edges in the graph.GenericTreeLayouter: FixedNullReferenceExceptionthat occurred when usingLayeredNodePlaceras default node placer.LayoutTool: Fixed calculation of lower width bound in methodArrangeRectangleRows. Due to the better bound, the optimization procedure now needs less steps, especially for graphs with very wide components. Note, that the results may also slightly differ, because the optimization may now stop with slightly different values.SALabelingandGreedyMISLabeling: Fixed possibleNullReferenceExceptioncaused by labels with zero width/height and a "free" edge label model.IncrementalHierarchicLayouter: Fixed bug that caused wrong coordinates of empty rows (see classRowDescriptor) whose minimum height is zero.DirectedOrthogonalLayouter: Fixed a bug that sometimes caused misplaced edge labels of grouped edges.Polyline.EdgeRouter: Fixed possibleNullReferenceExceptionfor edge groups that contain fixed edges.Polyline.EdgeRouter: Fixed bug that caused wrong routes for edges grouped with fixed edges.IncrementalHierarchicLayouterandRankAssignments: Fixed possibleNullReferenceExceptionthat may occur if the maximal duration of the algorithm is limited.IncrementalHierarchicLayouter: Fixed bug that may cause overlaps of edge labels with preferred placement at source/target.Polyline.EdgeRouter: Fixed rareNullReferenceExceptionthat mainly appears if there are overlapping nodes.PartialLayouter: Fixed bug that may cause broken edge routes for edges incident to incremental group nodes if optionRouteInterEdgesImmediatelyis enabled.CompactOrthogonalLayouter: Fixed possibleArgumentExceptioncaused by nodes without node-ids. This problem may only appear if the inter edge router is set toChannelInterEdgeRouter.
yFiles.NET 4.3.0.5 - Changes Since 4.3.0.4
Bugfixes
CanvasControl: In rare cases, callingInvalidatedid not trigger repainting. This was especially noticeable in combination with a marquee selection rectangle.RotatedSideSliderEdgeLabelModel: Label model parameters of this model were serialized as the respective parameters ofRotatedSliderEdgeLabelModel. Thus, after loading, the positions of the labels are the expected ones but the label models changed.RotatedSliderEdgeLabelModel: Parameters with ratio 0.5 were not correctly deserialized from GraphML.FilteredGraphWrapper: TheEdgesAtmethods erroneously returned edges that were marked as hidden by theEdgePredicate. The methodsDegree,InDegree, andOutDegreeare based on these methods and were affected, too.GraphSnapContext: Snapping nodes to vertical edge segments was not working ifNodeToEdgeDistancewas set to 0.CollapsibleNodeStyleDecoratorandShadowNodeStyleDecorator: Lookup requests forISizeConstraintProvider,IGroupBoundsCalculator, andIShapeGeometryare now correctly delegated to the wrapped style.- The
EdgeStyleDecorationInstallerdid not copy the tags of dummy ports and edges used when displayed in view coordinates (ZoomMode=DecorationZoomMode.ViewCoordinates).
Automatic Layout
OrthogonalLayouterfailed almost always with anArrayIndexOutOfRangeExceptionif the Mixed Layout style was used.IncrementalHierarchicalLayouter: Fixed possible exception caused by inconsistent grouping. The problem may only occur in incremental mode and if there are sequence constraints.BusRouter: FixedNullReferenceExceptionthat may appear for graphs containing isolated nodes with self-loops.TreeReductionStage: Fixed wrong handling of group nodes which may cause aWrongGraphStructureexception as well as broken routes of edges incident to group nodes.- Fixed
NullReferenceExceptionwhen usingAssistantPlacertogether with distributed port assignment. CircularLayouter: Fixed issue that may cause infinite/too large node coordinates for unfavorable input settings, for example, if the maximal deviation angle is to small. Note that such coordinates may produce infinite looping or other exceptions.
yFiles.NET 4.3.0.4 - Changes Since 4.3.0.3
Bugfixes
GraphMLIOHandler: methodAddNamespacehad no effect, and adding a custom schema withAddSchemaLocationtriggered an exception.ContextConfigurator: propertyScaledid not throw an exception for invalid values.- Worked around several errors that were erroneously reported by
PEVerify. Runtime verification behavior was not affected by these.
Automatic Layout
FixedGroupLayoutStage: FixedCanLayoutwhich changed the structure and layout of the graph.PartialLayouter: Fixed broken edge routes that may appear if optionEdgeRoutingStrategyis set toOctilinear.Polyline.EdgeRouter: Fixed wrong heuristic bend calculation if grid is used.BusRouter: FixedNullReferenceExceptioninBusRepresentationsthat could appear if the input graph contains overlapping nodes.MultiPageLayouter: Fixed possibleNullReferenceExceptionif the input graph contains empty group nodes.MultiPageLayouter: Fixed possibleInvalidCastExceptionif group node insets are specified with classyWorks.yFiles.Util.Geom.Insets.IncrementalHierarchicLayouter: Fixed broken edge routes that may occur for edges with labels if there are "critical" edges, seeCriticalEdgeDpKey.SimplexNodePlacer: Fixed broken edge routes that may occur for edges with labels if optionStraightenEdgesis enabled.IncrementalHierarchicLayouter: FixedArgumentException(Graph is not acyclic) inSimplexNodePlacerthat could appear when sequence constraints were added to a graph with swimlanes and group nodes.BorderLine: Fixed rareArgumentExceptionthat was caused by numerical instability.IncrementalHierarchicLayouter: FixedArgumentExceptioninConstraintIncrementalLayererthat could appear when layer constraints were added in incremental mode.CircularLayouter: Fixed possibleNullReferenceExceptionwhen layout style is set toBccIsolatedand consider node labels is enabled.AbstractLabelingAlgorithm: Fixed bug that causes poor results if optionRemoveEdgeOverlapsis enabled and the labels should be placed on the edge.
Known issues
- GraphML serialization of node label model parameters that are created with
FreeNodeLabelModel.CreateNodeRatioAnchoredis incorrect (the y ratio value is inverted). A fix for this issue will be part of the next feature and/or major relase, since this would introduce an incompatible change in behavior.
yFiles.NET 4.3.0.3 - Changes Since 4.3.0.2
Bugfixes
Folding: Source port tags in view states were not parsed correctly from GraphML.BevelNodeStyle: Fixed update of drop shadow afterRadiushas been changed.FilteredGraphWrapper.Disposedid not clean up all event listeners.- Node ports could not be moved by dragging their
IHandle. - Image export: Custom selection visualizations created with
NodeStyleDecorationInstaller,LabelStyleDecorationInstallerandEdgeStyleDecorationInstallerin zoom invariant mode were not placed correctly.
Automatic Layout
IncrementalHierarchicLayouter: FixedArgumentExceptionthat may appear for graphs containing nodes with fixed coordinates.LabelLayoutDataRefinement: Fixed possibleInvalidCastExceptionfor unbuffered layout runs.RecursiveGroupLayouter: Removed all temporarily inserted port candidates before calling the inter-edge routing because otherwise the edges routes may become corrupted.TreeLayouterandGenericTreeLayouter: Fixed possibleNullReferenceExceptionfor trees with empty group nodes.ShuffleLayouter: Fixed bug that may cause small offsets of fixed nodes.Polyline.EdgeRouter: Fixed bug in calculation of edge to edge distance penalties which could reduce the space where edges can be routed causing them to take unnecessary long routes.Polyline.EdgeRouter: Fixed bug that caused edges that connect a node with an ancestor group node to violate the minimal node to edge distance for the target node.Polyline.EdgeRouter: Fixed bug that caused edges that connect a node with an ancestor group node to have unnecessary long and bended edge paths when using port constraints.Polyline.EdgeRouter: Fixed bug that caused edges that connect a node with an ancestor group node to cross their source nodes when using port constraints.Polyline.EdgeRouter: Fixed bug that makes it possible to group the source of one edge and the target of another edge at their common node.Polyline.EdgeRouter: Fixed bug that sometimes causes superfluous edge overlaps.Polyline.EdgeRouter: Fixed bug that caused minimum distance violation of grouped edges.Polyline.EdgeRouter: Fixed rareNullReferenceExceptionwhile calculating edge crossing costs.Polyline.EdgeRouter: Fixed bug that sometimes assumed wrong label bounds for labels of table nodes. This could result in too many bends for edges that were routed around those wrong boxes. Labels of table nodes are now ignored by the router ifTableLayoutConfiguratoris used to prepare the graph for layout calculations.Polyline.EdgeRouter: Fixed bug that sometimes assumed wrong label bounds if the router was used directly after another layout algorithm. This could result in too many bends for edges that were routed around those wrong boxes and/or edges crossing labels because the actual label boxes were ignored.PolylineLayoutStage: Fixed possibleIndexOutOfRangeExceptionif there are fixed edges with a single, very short segment.BusRouter: Fixed clean up of bends that resulted in unnecessary detours in edge paths.BusRouter: Fixed possibleIndexOutOfRangeException.BusRouter: Fixed possibleInvalidOperationExceptioncaused by non-orthogonal edge segments.BusRouter: Fixed possibleNullReferenceExceptionwhen routing only a subset of edges without adding aDataProviderto the graph that marks edges as selected.IncrementalHierarchicLayouter: Fixed bug that could result in infinite y-coordinates when octilinear edge routing was enabled.Polyline.EdgeRouter: Fixed bug that may cause anArgumentExceptionif a grid is specified (see optionGrid).OrthogonalGroupLayouter: Fixed bug that may cause wrong group bounds calculation if a group node label lies outside of the group node.PartialLayouter: Fixed possibleNullReferenceExceptionif the algorithm is applied to a graph with partition grid (seePartitionGrid).
Demos
ImageExportDemo: The hit test for the export rectangle was configured incorrectly.
yFiles.NET 4.3.0.2 - Changes Since 4.3.0.1
Improvement
LayoutGraphAdapterprovides now the originalTagdata for temporary graph objects.
Bugfixes
- Undoing a reparent grouping gesture might have resulted in inconsistent group node sizes. Note: The fix results in a slightly incompatible behavior when nodes are reparented programmatically and multiple folding views are used. In that case, you need now to subscribe to hierarchy events and manually adjust the group node bounds.
- The default value of
AbstractTableNodeStyle#BackgroundStylewas not serializable. - Manually bracketing undo edits with
BeginEditandEndEditmight have led to exceptions when folding was active.
Automatic Layout
DirectedOrthogonalLayoutercould throw aString.IndexOfexception.IncrementalHierarchicLayouter: Fixed a rare bug that caused broken edge routes if edges are routed polyline.PolylineLayoutStage: Fixed possibleIndexOutOfRangeExceptionif there are fixed edges with a single, very short segment.Polyline.EdgeRouter: Fixed a bug that makes it possible to group the source of one edge and the target of another edge at their common node.Polyline.EdgeRouter: Fixed a bug that sometimes causes superfluous edge overlaps.Polyline.EdgeRouter: Fixed a bug that causes that edges of a group starts in the node to edge distance area of another node.BusRouter: Fixed clean up of unnecessary bends that were placed on a backbone but not cause detours in edges.
yFiles.NET 4.3.0.1 - Changes Since 4.3
Improvements
Automatic Layout
Trees: Added methodIsForest(Graph, bool).
Demos
- The
Demo.yFiles.Graph.OrgChartdemo uses theViewportLimiterfeature to prevent arbitrary viewport changes.
Bugfixes
- Fixed exception in the class initializer of class
EdgeFocusIndicatorRenderer. NodeStyleLabelStyleAdapter: Fixed rendering bug when the style was used for node labels.ClickInputMode.SwallowFocusClickhad only an effect for the very first click.- Copying table stripes did not work correctly.
- GraphML: Properties with a text value containing nested
CDATAsections were not parsed correctly. - Moving the viewport by clicking into the
GraphOverviewControldid not honorCanvasControl.ViewportLimiterrestrictions. RotatedSliderEdgeLabelModelcan now deal with edge paths that arenull, e.g. when usingVoidEdgeStyle.- GraphML: Primitive types like floats and doubles could not be read when used in element syntax and the current
CultureInfowas notInvariant.
Automatic Layout
Rectangle2D.Intersectssometimes returnedtruefor non-intersecting rectangles. This could cause infinite loops inBusRouter.EdgeRouter: Fixed bug that may cause anArgumentExceptionif a grid is specified (see propertyGrid).OrthogonalGroupLayouter: Fixed bug that may cause a wrong group bounds calculation if a group node label lies outside of the group node.PartialLayouter: Fixed possibleNullReferenceExceptionif the partial layouter is applied to a graph with partition grid (seePartitionGrid).PartialLayouter: Fixed bug that may cause a very long runtime if the algorithm considers node alignment (see propertyConsiderNodeAlignment).IncrementalHierarchicLayouter: Fixed bug that may cause broken edge routes for edges with port candidates if backloop routing is enabled (see propertyBackloopRouting).ParallelEdgeLayouter: FixedNullReferenceExceptionthat appears if the leading edge has zero length.ParallelEdgeLayouter: Fixed bug that may cause points withDouble.NaN-coordinates for some edges.LayoutTool: Fixed bug in methodRouteEdgesParallel: that may cause points withDouble.NaN-coordinates for some edges.EdgeRouter: Fixed performance problems for graphs with overlapping fixed edges.IncrementalHierarchicLayouter: Fixed bug that caused unsuitable edge routes for grouped edges within group nodes.OrthogonalLayouter: Fixed exception that may appear for graphs with nodes of high degree.
BusRouter: Fixed possible stack overflow.
yFiles.NET 4.3 - Changes Since 4.2.0.1
Major Features Added
Automatic Layout
- Class
yWorks.yFiles.Layout.Router.Polyline.EdgeRouteris a new edge routing algorithm that creates polyline edge routes. The segments of an edge are either orthogonal or octilinear, that means, the slope of each segment is a multiple of 90 degrees or a multiple of 45 degrees, respectively.
[To the corresponding section in the yFiles.NET Developer's Guide...] yWorks.yFiles.Layout.Router.Polyline.PolylineLayoutStage: A new layout stage that adds polyline segments to the orthogonal edge paths of a graph.IncrementalHierarchicLayouter: Added support for octilinear edge routing, i.e., a routing style where the slope of each edge segment is a multiple of 45 degrees. Different edge routing styles can be specified using classyWorks.yFiles.Layout.Hierarchic.Incremental.RoutingStyle.yWorks.yFiles.Layout.PreferredPlacementDescriptor: A new descriptor that allows to specify advanced preferred placement information for edge labels.
[To the corresponding section in the yFiles.NET Developer's Guide...]
Minor Features Added
ClickInputMode,GraphEditorInputMode,GraphViewerInputMode: New events forLeftClicked,RightClicked,LeftDoubleClickedandRightDoubleClicked. Also,ClickInputModehas been improved to handle multiple mouse buttons concurrently.MainInputModeandGraphViewerInputMode: Added new bulk selection eventsMultiSelectionStartedandMultiSelectionFinished.LayoutExecutorcan now safely handle concurrent layout requests. By default an already running layout will be short-cut and the next layout request will be processed. PropertySequentialExecutioncan be set tofalseto revert to the old (unsafe) behavior. The newStopmethod and theIsRunningproperty can also be used in this context.- New classes
NodeStyleDecorationInstaller,EdgeStyleDecorationInstaller, andLabelStyleDecorationInstallerallow the use of a node, edge, or label style to render the selection, highlight, or focus indicator of nodes, edges, and labels, respectively.
Automatic Layout
BalloonLayouter: New option to take into account the bounds of node labels when calculating a layout.LabelLayoutTranslator: Added optionAutoFlippingEnabledto specify whether or not edge labels should be automatically flipped if they would be upside-down.AbstractLabelingAlgorithm: Added optionAutoFlippingEnabledto specify whether or not edge labels associated with a "free" label model should be automatically flipped if they would be upside-down.
Improvements
- Optionally,
LayoutExecutorusesWaitInputModewhile waiting during the calculation of a layout. - Added callback method
SetEdgePortLocationtoLayoutGraphAdapterthat is called while assigning a new location to a port that is owned by an edge. - Changing the event recognizers of an
IInputModeafter the mode has been installed has now an effect in all input modes. - Improved performance of table rendering and interaction.
- Refactored
MoveLabelInputModeto make customizations easier. The moved label is now accessible and various new protected methods provide fine-grained control of the behavior. MoveLabelInputModenow takes the position handler from the lookup of a label if one is present, and creates a new one only if none was found.IClipboardHelper: The predicate functionsShouldCutandShouldCopywere not used for the default cut and copy operations provided byGraphEditorInputModeandGraphControl.- Child input modes of
GraphViewerInputModecan now be changed similar toGraphEditorInputMode. - Added explicit extension method
IGraph.CreateNode(PointD,INodeStyle). GraphEditorInputModeandGraphViewerInputModeprovide a newCanvasClickedevent to detect clicks on the empty canvas area.
Automatic Layout
OrthogonalGroupLayoutersupports labels at edges incident to group nodes.IncrementalHierarchicLayouternow treats edge groups at empty group nodes like those on regular nodes instead of ignoring them like it is done for non-empty group nodes.WeightedLayerer: Improved quality by reducing the number of reversed edges ifWeightedCycleRemovalis enabled.PartialLayouternow considers edge ports when calculating the barycenter of a component (if its propertyPositioningStrategyis set toSubgraphPositioningStrategy.Barycenter).PartialLayouter: Reduced cases where the result contains overlapping node elements.PartialLayoutercalculates improved routing if optionRouteInterEdgesImmediatelyis enabled and generally for edges between fixed elements.SmartOrganicLayouter: Fixed nodes are no longer moved by a fixed offset if scope is set toScope.Subset.GenericTreeLayoutercreates more compact layouts, especially for trees with edge labels.- Added the ability to
DefaultNodePlacerto create polyline-style edge routings with sloped edge segments. - Added the ability to
DefaultPortAssignmentto distribute edges at the border of the nodes. RecursiveGroupLayouter: Improved performance for graphs with a mainly flat structure.GraphLayoutLineWrapper: Improved edge routing for overlapping edges, for example grouped edges.- Added auto-flipping to
RotatedDiscreteEdgeLabelLayoutModelandRotatedSliderEdgeLabelLayoutModel. Labels that are placed upside down by a layouter will be flipped. - Improved the performance of
PortCandidatewhich potentially improves the performance of theIncrementalHierarchicLayouterwith rotated graphs with PortCandidates. - Optimized number of generated
PortCandidates inRecursiveGroupLayouterfor the core layouter. GraphConnectivity: Improved methodMakeBiconnectedto work with graphs with self-loops (i.e. edges whose source and target nodes are the same).
Demos
- Added new demo
Demo.yFiles.Graph.Input.HandleProviderthat shows how to add resize handles to graph elements that don't provide them out of the box. - Added new demo
Demo.yFiles.Graph.Input.SingleSelectionthat shows how to configureGraphEditorInputModeto enable single selection mode for interaction. - Added new demo
Demo.yFiles.Graph.StyleDecoratorsand a corresponding step in the Custom Style Tutorial that shows how to correctly implement the decorator pattern for node styles. - Added new demo
Demo.yFiles.Graph.SelectionStylingthat shows how to use node, edge and label styles for the painting of the selection decorator. - Added new demo
Demo.yFiles.Layout.PreferredLabelPlacementthat shows how to use the newPreferredPlacementDescriptorlayout feature. - The layout modules now use the new preferred placement descriptor feature for label setup. Additionally, the previous label setup had no effect at all due to an erroneous configuration.
- Prevent negative edge weights in
Demo.yFiles.Algorithms.ShortestPathsince cycles with negative weights are not allowed by the algorithm.
Bugfixes
- If
NavigationInputModewas used as child ofGraphViewerInputModeorGraphEditorInputMode, it didn't respect the selectable and focusable items of its parent input mode. - In
CreateEdgeInputModeandMoveInputMode, snapping may not have been re-enabled after disabling it temporarily. GraphClipboard.Cut: The filter predicate was evaluated twice, resulting in unexpected behavior if the predicate evaluation depended on state that could change by removing graph elements.Matrix2D.Scale(double, double, MatrixOrder)did not work correctly forMatrixOrder.Append.- In
CreateEdgeInputMode, the compound undo unit is cancelled if the edge creation is implicitly cancelled. The old behavior can be restored by disablingCreateEdgeInputMode.CancelEditImplicitly. MoveInputModeonly considers hovers without modifiers as valid to prevent "cursor fight" withMoveViewportInputMode.NavigationInputMode.ToggleGroupNodeStatedid not expand collapsed folder nodes.NavigationInputMode: MethodsCollapseSelectionandExpandSelectionthrew aNullReferenceException.SimpleAbstractLabelStyle.IsInBoxalways returned false.
Automatic Layout
Rectangle2D.Intersectssometimes returnedtruefor non-intersecting rectangles. This can have caused infinity loops inBusRouter.IncrementalHierarchicLayouter: Fixed incorrect handling of port candidates in layouts where rotation and a mirror was set.IncrementalHierarchicLayouter: Fixed integer overflow when group compaction is activated while layouting extremely large, deeply nested graphs.IncrementalHierarchicLayouter: Fixed port handling of edges with a single edge port candidate that is contained in a set of node port candidates.- Fixed bug with invalid array access in
AspectRatioComponentLayerer. - Fixed bad edge routings in
FamilyTreeLayouterwhen there are several marriages between generations. IsolatedGroupComponentLayouternow considers labels in group bounds calculation if label awareness is enabled.PartialLayouter: Fixed IndexOutOfRangeException that sometimes appears for large graphs.GroupNodeRouterStage: Fixed possible exception that was caused by the missing removal of a temporarily added DataProvider.OrthogonalLayouterandDirectedOrthogonalLayouter: Fixed bug that caused an ArgumentException if input graph contains overlapping parallel edges and from sketch mode is enabled (see propertyUseSketchDrawing).OrthogonalEdgeRouter: Fixed exception that may appear when both optionsReroutingandLocalCrossingMinimizationare enabled.RotatedSliderEdgeLabelLayoutModelandSliderEdgeLabelLayoutModel: Improved label placement at zero-length edge segments.GraphTransformer: Fixed group nodes bounds after transforming a sub-graph only.ParallelEdgeLayouter: FixedNullReferenceExceptionwhich may appear when source/target points of parallel edges are outside of the corresponding node.SmartOrganicLayouter: Fixed problem that sometimes caused very long runtime for simple grouped graphs.SmartOrganicLayouter: Fixed wrong calculation of group node sizes if optionConsiderNodeLabelsis enabled.YVector: Fixed methodRotate(double)to no longer return vertically mirrored results.IncrementalHierarchicLayouter: Fixed bug that caused violation of strong port constraints of typeAnySidefor backloop edges.RecursiveGroupLayouter: FixedIllegalStateExceptionthat may appear if there are edges that start/end at group nodes.BusRouter: Fixed bug that may cause a broken bus structure.
Changes in Default Behavior
IClipboardHelper: The predicate functionsShouldCutandShouldCopyare now taken into account for the default cut and copy operations provided byGraphEditorInputModeandGraphControl.- Concurrently executing layouts using
LayoutExecutorwill now result in the subsequent executions waiting for the previous execution to finish. PropertySequentialExecutioncan be set tofalseto revert to the old (unsafe) behavior.
Automatic Layout
PartialLayouter: PropertyEdgeRoutingStrategynow disables a previously set customized edge router.
Incompatible API Changes
DefaultGraph.SetPreferredSizedoes not callOnLabelChangedany more. Thus, theLabelChangedevent is not fired.
Automatic Layout
IEdgeLabelLayout: Removed propertyPreferredPlacementand added propertyPreferredPlacementDescriptor.PartialLayouter: Replaced methodConfigureOrthogonalEdgeRouterby methodConfigureEdgeRouter.- Classes
yWorks.yFiles.Util.ISortedMapandyWorks.yFiles.Util.ISortedSethave been removed from the public API. These interface were never meant to be used by customers.
yFiles.NET 4.2.0.1 - Changes Since 4.2
Bugfixes
- GraphML data for edges was not read anymore. This has been fixed.
yFiles.NET 4.2 - Changes Since 4.1.0.4
Major Features Added
- New support for edge-to-edge connections in user interactions. Edges can be connected to other edges during edge creation as well as by reconnecting edge ends.
[To the corresponding section in the yFiles.NET Developer's Guide...] - A great number of additional status-indicating events has been added to the various default input modes in order to provide fine-grained callbacks to customization code.
- The library no longer contains Apache licensed third party code.
Automatic Layout
- Class
yWorks.yFiles.Layout.Multipage.MultiPageLayouteris a new layout algorithm that breaks apart a given graph into a set of smaller graphs so that each layout of a small graph fits into a given width and height.
TheDemo.yFiles.Layout.MultiPageshows how to use classMultiPageLayouterto sub-divide large graphs into smaller bits of navigable information.
[To the corresponding section in the yFiles.NET Developer's Guide...]
Minor Features Added
DefaultEdgeIntersectionCalculatornow supports cropping edges directly at the port instead of at the node's geometry. This can be used to easily have edges end at the port instead of at the geometry of the node. See the new propertiesCropAtPort,ExtraCropLength, and callback methodGetPortGeometry.
Automatic Layout and Analysis
- The orthogonal layout algorithms
OrthogonalLayouter,OrthogonalGroupLayouter, andDirectedOrthogonalLayouternow support specifying a minimum first/last segment length. See the corresponding descriptions ofOrthogonalLayouter.EdgeLayoutDescriptorDpKey,OrthogonalGroupLayouter.EdgeLayoutDescriptorDpKey, andDirectedOrthogonalLayouter.EdgeLayoutDescriptorDpKey, respectively. SimplexNodePlacer: Added an algorithm that reduces the number of bends. This option can be set using propertyBendReductionEnabledand is enabled by default. Note: using this option increases the runtime of theIncrementalHierarchicLayouter. If the runtime exceeds the maximal duration the number of bends is not reduced.- Added abstract class
AbstractPortConstraintOptimizer, a partial implementation of interfaceIPortConstraintOptimizer, to minimize the effort required to modify the port assignment after the sequencing phase of a hierarchic layout. TreeLayouter: When using port stylesBorderCenterandBorderDistributedtogether with child placement policiesLeavesStacked,LeavesStackedLeft,LeavesStackedRight, andLeavesStackedLeftAndRightedges connect to the appropriate sides of their target nodes instead of to the top. Moreover, the order of outgoing edges no longer results in crossings for port styleBorderDistributed.AbstractLabelingAlgorithm: Added DataProvider keyLabelModelDpKeythat can be used to temporarily specify the model of labels that is used by the labeling algorithm.ShortestPaths: Added methodShortestPair.
Improvements
GraphMLIOHandler: AddedAddRegistryOutputMapperoverload that takes a serialization handler.- The
LayoutGraphPanelin the algorithm demos now correctly displays the locations of labels. - The animation for bends has been slightly improved in the case where new bends are added during layout morphing.
Automatic Layout
FamilyTreeLayouter: Improved the algorithm with respect to the number of edge crossings.PCListOptimizer: Improved the handling of port candidates and enhanced backloop routing support.
Demos
- Added new demo
Demo.yFiles.Graph.EdgeToEdgethat shows how to enable and make use of the new edge-to-edge connection feature. - Added new
Demo.yFiles.Layout.Multipagethat shows how to use classMultiPageLayouterto sub-divide large graphs into smaller bits of navigable information.
Incompatible Changes
- The license file version has been changed to
1.1.1.0license files do not work with this release anymore and need to be replaced with the new ones you have received from our sales team. Please contactsales@yworks.comif you did not receive or lost your updated license file and attach your old license file. IImageNodeStyle'sOutlineproperty was interpreted as an absolute outline previously and therefore made it practically impossible to reuse the style instance for more than one node or more than one node location. The behavior has been adjusted to work like the mechanism used inGeneralPathNodeStylewhere the outline is encoded in a normalized coordinate space. Should you be affected by that change, then you need to adjust the path and transform it to the new normalized coordinate space.- Methods
GetTargetPortCandidateProviderandGetSourcePortCandidateProviderinGraphEditorInputModechanged their signatures to acceptIPortOwnerinstances instead ofINodeinstances. This was required to allow for interactive edge-to-edge connections. Overriding methods need to be adjusted accordingly. - Method
ShowHitNodeCandidatesOnlyin classPortRelocationHandlehas been renamed toShowHitPortOwnerCandidatesOnlyto support edge-to-edge connections. Also the behavior of this class has been changed to allow edge-to-edge connections if this feature has been enabled by providing port candidates at the edges. Should you wish to disallow edge-to-edge connection even though you are providing edge port candidates, the newEdgeToEdgeConnectionsAllowedproperty can be set tofalse. - Previously it was possible to cast
DefaultEdgeIntersectionCalculator.Instanceto the containing type. The singleton is not of the given type anymore. If you require an instance of that type, consider instantiating one instead. - Properties
CurrentCandidateSize,CandidateSize,ValidCenterBrush, andInvalidCenterBrushhave been removed from typeDefaultPortCandidateDescriptor, since the could not be used any more since 4.0. The new methodSetTemplatecan be used now to set customized template visualizations instead. DefaultPortCandidateDescriptorpreviously used theCurrentPortCandidateas theContentfor the createdTemplatePaintables. This has been corrected to now use theCandidateTagof theIPortCandidatebeing rendered.- Since with this release
LayoutGraphAdaptertranslatesIMapperinstances in the graph's mapper registry asIDataMapimplementations that enable data write-back scenarios, the code that deals withIncrementalHierarchicLayouter.LayerValueHolderDpKeynow behaves differently. In older releases theIIntValueHolderinterface was queried from the mapper to write back the layer data. Now the data is written directly into the mapper and theIIntValueHolderimplementation is ignored.
yFiles.NET 4.1.0.4 - Changes Since 4.1.0.3
Bugfixes
- Fixed licensing error that occurred on FIPS enabled systems.
- Setting
GraphOverviewControl.GraphPaintablehad no effect. - Deleting graph elements during interactive edge creation could throw an exception.
- Group node visualizations were not always removed correctly when the group node was deleted.
DefaultSelectionModelwas not always cleaned up correctly when the domain was changed.SliderEdgeLabelModelthrew an exception for paths with zero length segments.FilteredGraphWrapper: The adjacency state of the filtered instance was wrong under certain conditions.FreeEdgeLabelModel: Fixed bad positions returned by parameter finder.- Convenience class
LabelDecoratorwas unusable because of a wrong type parameter.
yFiles.NET 4.1.0.3 - Changes Since 4.1.0.2
Bugfixes
- Fixed
MethodAccessExceptioninImageSupport.DropShadowandBevelNodeStyleRenderer.
yFiles.NET 4.1.0.2 - Changes Since 4.1.0.1
Bugfixes
LayoutGraphAdapterdid not honor mapper in the registry registered under theLayoutGraphAdapter.EdgeLabelLayoutPreferredPlacementDpKeykey.BendAnchoredPortLocationModelcould throw an IndexOutOfRangeException under certain circumstances.- Sharing objects in GraphML did not work in some cases when these objects were written through a markup extension.
CreateEdgeInputModedid not highlight the closest target port candidate during the edge creation gesture.DropInputMode#AdjustEffects: Setting a customValidHitTestablehad no effect.DropInputMode: The mode did not exit cleany under some rare circumstances.- Fixed an issue with custom license files that were valid for a specific version, only
TableEditorInputMode#EditLabeldid not work.- Child modes of a
MultiplexingInputModewere not always disabled together with the parent mode.
Automatic Layout and Analysis
yWorks.yFiles.Algorithms.Groups: Fixed possible NRE when calculating BCC for a graph containing self-loops in methodBiconnectedComponentGrouping(Graph, INodeMap).yWorks.yFiles.Algorithms.ShortestPaths: Fixed an error in methodFindShortestUniformPaths(Graph,INodeMap,IDataProvider,bool,int,EdgeList,NodeList). In many cases, nodes and edges which did not belong to a shortest path were added to the result nevertheless.yWorks.yFiles.Algorithms.GraphConnectivity: Fixed methods that calculate biconnected components to mark selfloops as not belonging to any biconnected component.yWorks.yFiles.Algorithms.Cycles: MethodFindAllCycleEdges(Graph, bool)has been improved to return only edges that belong to at least one simple cycle. Previously, all edges were returned for the undirected case.
Improvements
- Improved license handling for cases where the .NET license manager mechanism is not fully functional.
yFiles.NET 4.1.0.1 - Changes Since 4.1
Bugfixes
- Fixed text painting in IconLabelStyle
- Some table related classes were not excluded from obfuscation.
- Fixed exception in
LayoutExecutorwhen animation and grouping were both disabled. - Fixed potential memory leaks in
TableLayoutConfiguratorwhen exceptions occurred. yWorks.yFiles.Algorithms.Groups.EdgeBetweennessClustering: The parametersminGroupCountandmaxGroupCounthad no effect.
Automatic Layout
LayoutExecutordid not provide the GraphControl's selection to the layout engine.- Fixed
NullReferenceExceptioninPartitionGridLayoutStageif no partition cells were assigned to any nodes. - Fixed Exception that was triggered when using a generic labeling algorithm (i.e. a subclass of
yWorks.yFiles.Layout.Labeling.AbstractLabelingAlgorithm) together with layout stageyWorks.yFiles.Layout.LabelLayoutDataRefinement.
yFiles.NET 4.1 - Changes Since 4.0.1
Major Features Added
New Comprehensive Support for Swimlane Diagrams
- New model class
yWorks.yFiles.UI.Model.Tableprovides extensive support for tabular presentation of subgraphs which is well suited for the visual presentation of swimlane layouts.
Flexible visualization for table elements by means of existing node styles is provided by implementations of theyWorks.yFiles.UI.Drawing.ITableNodeStyleinterface.
[To the corresponding section in the yFiles.NET Developer's Guide...] - New dedicated InputMode
yWorks.yFiles.UI.Input.TableEditorInputModewhich can be used either standalone or as a child mode ofyWorks.yFiles.UI.Input.GraphEditorInputModeand which provides support for user interaction specific to the tabular data representation of an associated node.
[To the corresponding section in the yFiles.NET Developer's Guide...] - New support class
TableLayoutConfiguratorcan automatically create a suitable partition grid setup from existing table structures in a graph. Also,LayoutExecutorhas been enhanced to optionally configure table specific layout features. [To the corresponding section in the yFiles.NET Developer's Guide...] - The
Demo.yFiles.Graph.TableEditordemo demonstrates the capabilities of table visualization editing, as well as automatic layout of swimlane diagrams.
Visual enhancements
- Added new edge label models
RotatedSliderEdgeLabelModelandRotatedSideSliderEdgeLabelModelwhich allow placement of rotated labels on a continuous set of positions along both sides of an edge or directly on the edge path.
Automatic Layout
- New support for rotated labels (e.g. using the new
RotatedSliderEdgeLabelModelorRotatedSideSliderEdgeLabelModel) in the yFiles generic labeling algorithms. PartialLayouter: A new layout algorithm for partial layouts. This layout algorithm changes the coordinates for a given set of graph elements (called partial elements). The location or size of the remaining elements (called fixed elements) is not allowed to change. The layout algorithm aims to place the partial elements such that the resulting drawing (including the fixed elements) has a good quality with respect to common graph drawing aesthetics.PartialLayoutModulerepresents an interactive configurator and launcher for this layout algorithm.BusRouter: A new orthogonal bus-style edge routing algorithm. This algorithm combines the large number of edges of complete subgraphs in a concise, tree-like structure that consists only of vertical and horizontal line segments. The positions of the nodes in a graph are not altered by this algorithm.BusRouterModulerepresents an interactive configurator and launcher for this layout algorithm.OrthogonalEdgeRouter: Added support for monotonic path restrictions. Such restrictions specify that edges should be routed monotonically in vertical and/or horizontal direction. The restrictions can be set using theMonotonicPathRestrictionproperty.IncrementalHierarchicLayouter: Added data provider keyCriticalEdgeDpKeythat allows to specify a priority value for edges that are part of critical paths. The layouter tries to vertically align each node pair that is connected by such a "critical" edge (an edge that has a non-zero, positive priority value). Conflicts between different critical edges are resolved in favor of the higher priority.SimplexNodePlacer: Added optionStraightenEdgeswhich allows to specify whether or not a postprocessing step should be applied that tries to remove some bends. Enabling this option may violate some minimum distances specified by the user.OrthogonalEdgeRouter: Added support forPortCandidateSets that allow to specify the available port candidates at a node.
Minor Features Added
CanvasControlnow offers a method that yields theVisualfor a givenICanvasObject. This can be leveraged by UI testing tools.- New class
NodeStylePortStyleAdaptercan be used to reuse existingINodeStyleimplementations for port visualization. GridPaintable's pens can now be customized for all grid styles.
Automatic Layout
- New layout stage class
PartitionGridRouterStageenablesOrthogonalEdgeRouterto properly route edges within a partition grid. RecursiveGroupLayouter: Added data provider keyGroupNodeLayouterDpKeythat allows an easier way to specify the layout algorithm used for recursive group nodes. Furthermore, it allows to specify non-recursive group nodes, i.e., group nodes whose contents are laid out using theILayouterinstance specified by the nearest predecessor of the group node (with respect to the grouping hierarchy) which is associated with an ILayouter.TreeLayouter: Added new support for child placement policies that can be used to achieve more compact tree layouts. SeeChildPlacementPolicy.TreeLayouter: Added new global layering option that ensures that large nodes never span more than their layer. SeeEnforceGlobalLayering.OrthogonalEdgeRouter: Added support for considering node labels, seeConsiderNodeLabels.CircularLayouter: Added data provider keyCircleIdHolderDpKeythat allows to obtain a mapping between nodes and the corresponding circle IDs.OrthogonalEdgeRouter: Added new routing styleRoutingStyle.Balancedwhich is based on the existingRoutingStyle.Prefermiddlebut draws segments between bends of the same direction (U-style turns) the short way.
Improvements
DropInputModehas been improved to capture the start of a drag enter gesture in cases where the drop target that is hit first would also accept the drag enter event.- All built in node styles have been modified to allow the CanvasControl to accept drop enter events even if they are hit first.
- License failures in the algorithms assembly are reported more prominently when used through
LayoutExecutorand related convenience methods. WaitInputModeis automatically enabled while file I/O commands are executed.GraphEditorInputMode.DeleteSelectionnow doesn't create an empty Undo edit if nothing would be deleted at all.CreateEdgeInputMode:UpdateEdgeStyleis now called after the source port candidate has been determined.Mouse2DEventTypesnow also includes the case where mouse capture is lost. All existing input modes have been improved to take advantage of this event, where appropriate.
Automatic Layout
LayoutExtensions: Added and improved convenience methods that deal with sequence and layer constraints.IncrementalHierarchicLayouter: Enhanced support for fixed nodes.GroupNodeHider: Several layout algorithms (all tree layouters, circular, all orthogonal layouters, random, the fixed group layout stage) assigned relatively small dimensions to empty group nodes. Some of them also moved these nodes to (0,0). None of these layout algorithms treats groups directly, instead they use the group node hider. The group node hider now optionally does not hide empty groups (HidingEmptyGroupNodes) enabling that these can be treated like normal nodes. This option is now used where appropriate. Note that some layout algorithms may still shrink empty group nodes depending on the particular choice of parameters, e.g., orthogonal layout with uniform node sizes.OrientationLayouter: Node insets as well as port constraints are now also translated correctly for each possible orientation.
Demos
- Added new
Demo.yFiles.Layout.MixedLayoutdemo that shows how to recursively apply different layout algorithms to the contents of group nodes. - Added new
Demo.yFiles.Layout.PartialLayoutdemo that presents specific setup of the new partial layout support in conjunction with Circular, Hierarchic, Organic, and Orthogonal Layout. - The new
Demo.yFiles.Layout.LayerConstraintsdemo shows how to use layer constraints with the IncrementalHierarchicLayouter to restrict the node layering. - The new
Demo.yFiles.Layout.SequenceConstraintsdemo shows how to use sequence constraints with the IncrementalHierarchicLayouter to restrict the node sequencing. - The new
Demo.yFiles.Layout.PortCandidatedemo shows how PortCandidateSets can be used with IncrementalHierarchicLayouter to control from what side edges connect to certain node types in the automatic layout process.
It also show-cases a custom node style that displays simple flowchart symbols and integrated port candidate visualization. - Added new
Demo.yFiles.Layout.LogicGatedemo that shows how to apply fixed PortConstraints to a layout and how to use PortCandidates for interactive edge creation (via IPortCandidateProvider).
It also show-cases a custom node style that displays logic gate symbols. - Added new
Demo.yFiles.Layout.GenericTreedemo that shows the effects of different NodePlacer implementations on a node and its subtree(s) in a tree layout calculated by GenericTreeLayouter. - The new
Demo.yFiles.Layout.EdgeLabelingdemo shows how to configure different edge label models as well as how to apply the generic edge labeling algorithm. - The new
Demo.yFiles.Layout.NodeLabelingdemo shows how to use the node label models in conjunction with the yFiles generic labeling algorithms. - Added new
Demo.yFiles.Graph.BusinessProcessDiagramdemo that presents bow to create, edit, and lay out business process diagrams that adhere to the Business Process Modeling Notation. - The new
Demo.yFiles.Layout.BusRouterDemoshows how to use the orthogonal bus-style edge router.
Bugfixes
- Resizing nodes interactively did not make use of additional snap lines from the
GraphSnapContext. - The expand and collapse group node commands did not execute in case the
UseCurrentItemForCommandproperty was being used. NavigationInputMode.ExitGroupraised theGroupEnteredevent instead of theGroupExitedevent.CreateEdgeInputModestarted calculation of the target port candidates too early and did not remove the highlighting of the target node if the creation was canceled early during the gesture.- A race condition in the license verification mechanism could lead to license failures in multi-threaded environments. .
- When no license information has been embedded during compile time, the license was searched in the filesystem during runtime, instead of resulting in a license failure.
- A memory leak in
CreateEdgeInputModemade cleaning up a GraphControl impossible after an edge had been created interactively using that mode with snapping disabled. - CreateEdgeInputMode's
GetSourcePortCandidatemethod was sometimes invoked with the wrong location. - MouseHoverInputMode now reacts during mouse drags, too and method
Showrespects parameter if it differs from the mouse location. - Mouse events were being redispatched, even if the mouse was outside the GraphControl. This resulted in tooltips being displayed and other potential issues when the overview was used to move the viewport.
ClickInputMode.ValidHitTestablewas not always queried in certain double click configurations.- Minimum node size was not automatically provided to the algorithms library by LayoutGraphAdapter.
Animator.AnimateAndWaitdid not update the control if called from the event dispatching thread.- Fixed multiple issues related to GraphML (de)serialization of
IDictionaries. - Content properties that are writable and have a collection type were not deserialized correctly.
CanvasControl.FitContentViewMarginswas never used.- The inline label text editor used by
TextEditorInputModecould not handle Unix styl line breaks correctly. - The
GraphClipboarddid not always copy all state of items that were invisible in a folded graph view.
Automatic Layout
InteractiveOrganicLayouter: Fixed bug that prevented the calculation of any layout before the first call toWakeUp.ComponentLayouter: Fixed bug that caused a wrong component assignment if customized component IDs were used.IncrementalHierarchicLayouter: Fixed bug that sometimes caused an assignment of infinite coordinates to group nodes as well as to points of edges incident to group nodes.IncrementalHierarchicLayouter: Fixed bug that caused unnecessary crossings when using node grouping.- Overriding
yWorks.yFiles.Layout.Tree.DelegatingNodePlacer#GetLowerRightChildrenandGetUpperLeftChildrenhad no effect. - Fixed potential
IndexOutOfRangeExceptioninyWorks.yFiles.Layout.RotatedSliderEdgeLabelLayoutModel. - Fixed invalid cast in
yWorks.yFiles.Layout.Router.EdgeGroupRouterStage. - Fixed
NullReferenceExceptionwhen usingyWorks.yFiles.Orthogonal.OrthogonalLayouterin FromSketchMode. DrawingEmbedder: Fixed NullReferenceException caused by nodes having the same center.NetworkFlows: Fixed wrong calculation of the cut set returned by methodCalcMaxFlowMinCut(Graph, Node, Node, IDataProvider, IEdgeMap, INodeMap).EdgeGroupRouterStage: Fixed bug that caused violation of edge grouping constraints as well as port constraints.- Fixed potential race condition when trying to access the edge path during layout calculation.
Incompatible Changes
- When
LayoutExecutor.Durationis 0, the viewport is now only moved whenAnimateViewportis true. yWorks.yFiles.Algorithms.Util.DoubleObjectPQ: Changed the type of parameterpriorityfrominttodoublefor methodsDecreasePriority,IncreasePriorityandChangePriority.OrientationLayouter: Changed behavior for mirrored orientations, i.e., there may be a fixed position offset between the layout results of the old and new version. The new version ensures that the position of elements not changed by the layout algorithm are kept fixed.Mouse2DEventTypeshas a new enumeration member 'LostCapture'. If cascades and switches over variables of this type might need to be adjusted to properly deal with this event type.LayoutGraphAdaptercan optionally create copies of node and edge styles during layout calculation. This is controlled by the new propertyCopyStyles. Utility classLayoutExecutorenables this feature if the layout is performed in a different thread.- The
Cutcommand onGraphControlis now only enabled ifDeletableItemsallows the deletion of the currently selected nodes.
yFiles.NET 4.0.1 - Changes Since 4.0
Minor Features Added
- Added support for different double-click handling modes in
ClickInputModeas well asGraphEditorInputModeandGraphViewerInputMode.
Improvements
- Add demo that showcases the printing functionality available in yFiles.NET.
- Updated and improved many of the existing demos to show best practices and use simpler code.
- LayoutModules in the demo have been improved to show the new layout features.
GraphEditorInputMode,NavigationInputMode: Added UseCurrentItemForCommands property.yWorks.yFiles.UI.Model.GraphExtensions: Added another extension method for creating labels with tag.yWorks.yFiles.UI.Model.FoldedGraph:IsExpanded(INode)raises correct exception if node is not part of the graph.yWorks.Canvas.Geometry.Structs.PointD: addedGetRounded().- Rules for
DesignerSerializationVisibilityhandling in GraphML are consistent now. yWorks.yFiles.GraphML.Parser.GraphMLParser: XMLExceptions wrapped in IOExceptions.yWorks.yFiles.GraphML.Xaml.XamlSerializernow supportsShouldSerialize*predicates.- The GraphML XAML parser and writer both support generic type arguments as specified in the XAML 2009 specification.
- GraphML now supports (de)serialization of generic dictionaries like
System.Collections.IDictionary<K,V> - Added
yWorks.yFiles.Layout.Hierarchic.Incremental.PartitionGrid#CreateCellSpanIdoverload that acceptsSystem.Collections.IEnumerable<V>
Bugfixes
- GraphML: Fixed broken serialization of primitives and string values in element syntax.
- GraphML: Public properties with a non-public getter or setter are ignored now.
yWorks.yFiles.GraphML.Xaml.XamlReader: XML attributes that are bound to an XML namespace are ignored if they do not specify an attached property.- Fixed crash in
yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouterwhen a node has more than 60 selfloops. - Fixed crash when removing
IEdgethat has same source and target port. PanelNodeStylecan now deal with empty layout.- Setting
yWorks.Canvas.Input.ContextMenuInputMode#Menudid not always clean up the old menu correctly. - Some layouter implementations did not properly catch internal (non-fatal)
NullReferenceExceptions. NavigationInputModedid not correctly update the location of group nodes during expand and collapse and did not enqueue the correct undo units.- Orthogonal edge segments were sometimes broken into halves during interactive resizes of the adjacent nodes. Now the corresponding bend is moved instead.
Folding bugfixes
A great number of bugs have been fixed in the folding environment. All of them could only be triggered programmatically.
- Fixed programmatic edge creation.
yWorks.yFiles.UI.Model.GroupedGraphExtensions.CreateGroupNode(INode parent): Fixed extension method ignoring parent.- Fixed
yWorks.yFiles.UI.Model.HierarchyExtensions.GetNearestCommonAncestor()not returning correct ancestor in some cases. SetLeaf()and setLocalRootnot included in Undo queue.yWorks.yFiles.UI.Model.GroupedGraphExtensions.GroupNodes(IEnumerable<INode>)called with empty enumerable callsCreateGroupNode()instead of creating group node with empty layout.- Various bugs that occurred in rare cases due to corrupted internal data structures have been fixed.
Changes in Default Behavior
- GraphML: Handling of
DesignerSerializationVisibilityfor collection properties is now consistent with WPF and Silverlight XAML rules:- If the property is specified as a content property with
ContentPropertyAttribute:- If
DesignerSerializationVisibilityis not specified orDesignerSerializationVisibility.Contentis specified, only the content is (de)serialized. - If
DesignerSerializationVisibility.Hiddenis specified, the property is ignored. - If
DesignerSerializationVisibility.Visibleis specified and the property is read-write, the collection object itself is (de)serialized, otherwise the property is ignored.
- If
- If the property is not specified as a content property with
ContentPropertyAttribute:- If
DesignerSerializationVisibility.Contentis specified for either read-write or read-only collection properties, only the content is (de)serialized. - If
DesignerSerializationVisibility.Hiddenis specified, the property is ignored. - If
DesignerSerializationVisibilityis either not specified or set toDesignerSerializationVisibility.Visiblefor read-write collection properties, the collection object is (de)serialized. - If
DesignerSerializationVisibilityis either not specified or set toDesignerSerializationVisibility.Visiblefor read-only collection properties, the property is ignored.
- If
- If the property is specified as a content property with
yFiles.NET 4.0 - Changes Since 3.2.1.2
Major Features Added
The layout API has been reworked to comply with the .NET coding style
yFiles.NET 4.0 uses an API for the layout that complies with the .NET coding conventions and makes use of the .NET base class libraries better than before. Namespaces, classes, and member names have been adjusted to comply with .NET best practices. Properties have been introduced replacing old getter and setter-style methods, enumerations have been created where previously simple value-type constants where used.
Streamlined the graph and viewer API
The core visual graph API has been revised and now makes heavy use of structs to pass rectangle, size, and point coordinates between the methods, reducing the code bloat and ambiguous and long argument lists. Also, the use of structs allows for cleaner code that uses operator overloading for geometric vector operations, while at the same time making it more obvious where data is passed by value instead of by reference.
The main interfaces that make up the graph API have been simplified. Convenience methods have been removed from the interface and moved to extension methods. This makes implementing the interface easier, results in a more predictable implementation while at the same time making the usage of the interface more convenient through more extension methods.
The user input-related classes use a command pattern-based approach similar to the one found in the WPF framework to perform various user-related actions. This makes replacing, removing, or reusing certain operations a lot easier.
Commands and undo units have been refactored to internationalized entities that can be localized by means of satellite assemblies.
Support for creating and working with orthogonal edge paths
- Class
yWorks.yFiles.UI.Input.OrthogonalEdgeEditingContextnow mediates between the various implementations that deal with repositioning nodes, bends, and ports to ensure that orthogonal edge paths stay orthogonal during the edit process. - Interface
yWorks.yFiles.UI.Input.IOrthogonalEdgeHelperdetermines how edges should be treated during editing with respect to orthogonality. - The various IInputMode implementations support editing orthogonal edge paths, as well as allow for creating an orthogonal edge path in the first place.
Interactive snapping of graph elements to guide lines and other elements during editing
- Class
yWorks.yFiles.UI.Input.GraphSnapContextsupports snapping elements to lines while they are being moved or resized interactively. This allows for conveniently editing diagrams by hand and still obtain great results with fixed distances and angles between elements in the diagram. - Interfaces
yWorks.yFiles.UI.Input.ISnapLineProviderand others can be used to influence the behavior, the types, and the display of the snap lines. - Support for intelligent magnetic grid has been integrated with the new snapping API.
GraphML support has been improved to automatically create XAML-like object representations
- Class
yWorks.yFiles.GraphML.GraphMLIOHandlerhas been reimplemented from scratch to greatly simplify customizations to the process of creating and parsing GraphML. - Namespace
yWorks.yFiles.GraphML.Xamlcontains code that allows for serializing and deserializing almost any kind of object automatically to and from XAML using reflection-based serialization. Most of the time it is not necessary to create customized XML serialization code for styles, models, parameters, and attached business data, anymore. - The GraphML API makes use of the LINQ to XML API for XML processing and thus is easier to use and performs better than the old implementation.
Built-in support for dragging nodes from other controls to the GraphControl
- Class
yWorks.yFiles.UI.Input.NodeDropInputModehas been added to provide convenient drag and drop support on top of the existing DropInputMode implementation. - The specialized input mode can be configured to provide a live preview of the node that will be dropped.
- Dropping can be performed directly onto group nodes, making the dropped node a new child of the group.
- The new snapping features are also leveraged by this new implementation.
Visual Enhancements
- New node style class
yWorks.yFiles.UI.Drawing.ShinyPlateNodeStyleprovides a nice, clean modern look with a high-performance drop shadow. - Style class
yWorks.yFiles.UI.Drawing.BevelNodeStylegot the same new high-performance drop shadow, that can be switched on and off. - All visual adorners for items in the GraphControl like the marquee selection box, the handles, the highlight and selection indicators, can now easily be customized and replaced by custom rendering templates that are instances of
yWorks.Canvas.Drawing.TemplatePaintable. - For each of the possible visual styles there is now a simple abstract base class implementation that can be used as a basis of custom styles. These base classes remove the need to implement a lot of boilerplate code that was previously necessary for even the most simple style implementations.
Automatic Layout
- Layout algorithm class
yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouterprovides enhanced support for swimlane layout through comprehensive new partition grid concept.
TheyWorks.yFiles.Layout.Hierarchic.Incremental.PartitionGridclass enables the definition of grid-like structures (partitions) consisting of rows and columns, and assignment of nodes of a diagram to the grid (partition) cells.
Minor Features Added
yWorks.yFiles.UI.Input.IPortCandiateand default implementations have been updated to allow for dynamically determined port candidates. This enables assignment of non-discrete port locations during edge creation and edge relocation.- All items that make up the graph structure can now be easily associated with a user tag of any kind, which can be specified at creation time. This allows for easier binding to custom business data and less code bloat.
- The mapper registry that can be used to register arbitrary maps of data for the items in the graph has become a first-class citizen of IGraph, making it more accessible. Also, meta data can now be associated with each mapper in the registry.
- Class LayoutExecutor makes it easy to launch layout algorithms and perform animations both synchronously and asynchronously.
- The implementations in the Algorithms and Layout library part now make use of the System.Collection interfaces and allow for using the
foreachconstruct. - Lots of extension methods have been added that greatly facilitate working with the lookup API, the layout API, the mapper registry, and IGraph in general.
- The defaults for styles and models that are used by IGraph have been refactored and can now more easily and more consistently be set, modified, stored, and restored.
- Many different fine-grained events and callbacks have been added to the various input mode implementations making customization easier, because subclassing is now less frequently required for customizations.
- GraphControl now has the notion of a "current" item which can be adorned by a focus rendering and which will automatically be highlighted if the graph control has keyboard focus.
- A default keyboard navigation feature has been implemented that allows for moving, extending, toggling, and modifying the selection, setting the current item and navigating into and out of groups in the context of a folded graph.
- Undoable edits in the undo queue can now easily be localized.
- Large parts of the library have been annotated with value analysis attributes that can be used to indicate possible NullReferenceExceptions and superfluous null checks.
- Many places in the library that previously allowed null values now require non-null values. Void and Null Implementations have been provided that now take their place and making most checks for null in code obsolete.
- Changing label and port locations is now animated smoothly. Also, the feel of the animation of the viewport has been improved.
- Many more improvements great and small for both the layout algorithms and the UI part.
Automatic Layout
- Layout algorithm class
yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouternow features consistent support for layering constraints both for non-incremental as well as incremental layout mode.
Also, specifying layering constraints is now conveniently supported directly by the layout algorithm class through methodCreateLayerConstraintFactory. yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: Added support for specifying a preferred time limit (in milliseconds) for the layout (see propertyMaximalDuration).yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: Added support for automatic edge grouping (see propertyAutomaticEdgeGrouping).yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouter,yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter,yWorks.yFiles.Layout.Orthogonal.DirectedOrthogonalLayouter: Added support for considering node labels.yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter: Added integrated edge labeling support.yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouterandyWorks.yFiles.Layout.Orthogonal.DirectedOrthogonalLayouter: Added convenience property for integrated edge labeling:IntegratedEdgeLabeling.yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter: The layouter now also considers minimum sizes for group nodes as given by the DataProvideryWorks.yFiles.Layout.Grouping.GroupingKeys.MinimumNodeSizeDpKey.yWorks.yFiles.Layout.Circular.CircularLayouter: More compact layouts can be obtained by settingPlaceChildrenOnCommonRadiusto false.yWorks.yFiles.Layout.Circular.CircularLayouter: Node labels can be considered by settingConsiderNodeLabelsto true.yWorks.yFiles.Layout.Organic.SmartOrganicLayouter: Node labels can be considered by settingConsiderNodeLabelsto true.
Graph Analysis Algorithms
yWorks.yFiles.Algorithms.Paths: added methodsFindAllPaths(Graph, Node, Node, Boolean),FindAllPaths(Graph, Node, Node, Boolean, Predicate<EdgeList>), andFindAllPathsCursor. These methods can be used to enumerate all directed or undirected paths that connect two nodes.
Improvements
yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouter: for layout styleyWorks.yFiles.Layout.Orthogonal.LayoutStyle.NormalTree, the grid size now also controls the distances between tree nodes.yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouter,yWorks.yFiles.Layout.Orthogonal.DirectedOrthogonalLayouter: improved integrated edge labeling.yWorks.yFiles.Layout.ComponentLayouter: Improved handling of user-defined components (components defined via theGivenComponentDpKeydata provider key) when there are edges between the components.yWorks.yFiles.Layout.Tree.GenericTreeLayouter: Improved layout runtime of graphs having subtrees with a large number of nodes.- All implementations of interface
yWorks.yFiles.Layout.Hierarchic.Layererhave been adjusted to implementyWorks.yFiles.Layout.Hierarchic.Incremental.Layereras well, thereby removing the need to wrap these classes inyWorks.yFiles.Layout.Hierarchic.Incremental.OldLayererWrapperfor use withyWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter. yWorks.yFiles.Layout.Organic.SmartOrganicLayouter: Minimal node distance is now also used for inter component spacing.yWorks.yFiles.Layout.Organic.SmartOrganicLayouter: Node subsets can now be used together with output restrictions orGroupNodeModeFixBoundsmode.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: added convenience propertiesOrthogonalRoutingandBackloopRouting.
Tutorials
- A new tutorial that shows how to implement custom styles for nodes, edges, ports, and labels has been added.
- The Getting Started tutorial has been improved to show the new snapping and orthogonal edge editing features.
- The existing tutorial has been revised to comply with the new API and new paradigms.
Demos Added
- New and improved demos show how to implement complex custom styles.
- A demo that acts as a viewer for a complex organization chart has been added.
- Demos that show customization of the clipboard and undoability have been rewritten and improved.
- A graph viewer demo has been added that allows browsing different graphs.
- The collapse demo that shows how tree-like graph structures can explored interactively has been improved to use nicer styles and more layout algorithms.
- A demo that shows how the snapping feature can be customized has been added.
- A demo has been implemented that shows how to configure edges for orthogonal editing.
- The interactive drag and drop feature for nodes showing a preview and snapping is demonstrated in a new demo.
- A demo that shows how to export canvas contents to bitmap and vector images has been added.
- A demo that allows for playing with
IncrementalHierarchicLayouterhas been implemented. - Another demo shows how shortest paths can be recalculated interactively upon user input.
- A set of demos that show how to use the algorithmic part of the library without a viewer component has been reintroduced.
- The OptionHandler framework for querying and presenting options and settings to the user that has been part of the core library in yFiles.NET 3.x is now part of the demos in source code form.
Bugfixes
yWorks.yFiles.Layout.OrientationLayouter: Fixed wrong handling of mirror mask (seeMirrorMask).yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: In some cases edge points could have infinite coordinates.yWorks.yFiles.Layout.Router.OrthogonalEdgeRouter: Fixed bug where in some cases strong port constraints were not taken into account for self-loops when local crossing minimization was enabled.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: Fixed insets of group node being treated incorrectly if non-orthogonal edge routes were used.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: Fixed rare exception about groups being "inconsistent".- Undo/Redo did not always work properly when group node contents were moved, resized, or moved to different group nodes.
yWorks.yFiles.Layout.Router.OrganicEdgeRouter: Fixed bug where OrganicEdgeRouter created some extreme edge routes for larger minimal distances (seeMinimalDistance). Critical edges will now be routed straightline.
Changes in Default Behavior
- yFiles.NET 4.0 uses a new licensing mechanism based on the .NET
LicenseManagerframework. Please see the yFiles.NET Readme for further information. yWorks.yFiles.Layout.Tree.BalloonLayouterhas a new default policy for placing the children of local roots. The old policyyWorks.yFiles.Layout.Tree.ChildOrderingPolicy.Symmetriccan be set with propertyChildOrderingPolicy.yWorks.yFiles.Layout.ComponentLayouternow considers labels by default (see propertyConsiderLabels). This prevents overlaps of labels associated with different graph components.
Incompatible API Changes
yFiles.NET 4.0 uses a revised API for the layout algorithms and significant changes in the API of the viewer and the model.
Please see the yFiles.NET migration guide for more information.
- The default behavior of the IGraph implementations has changed so that styles and models are now shared implicitly by reference between elements. This can easily be reverted to the old behavior by setting the corresponding property in the
INodeDefaults,IEdgeDefaults,IPortDefaults, andILabelDefaultsinstances. - The library does not allow
nullvalues in many places where previouslynullwas allowed to indicate default behavior. This makes client code easier to write because code that checks fornullis no longer needed and bugs can be identified earlier. The migration guide has more information about which exact methods this affects and what values should be used instead ifnullhad been passed to the methods intentionally, before. - The implementation of the
ICloneableof the default styles in the library has been changed to consistently be a shallow clone for all properties. This allows for fine-grained control over which objects can be shared between instances. If you change a property and don't want to affect shared instances, clone the value first and then assign new values to the properties in question, instead. This way more properties can be shared, even if some properties differ. This allows for a greatly reduced memory footprint and smaller GraphML files. - Group nodes no longer automatically adjust their bounds if the bounds of the contained nodes are changed programmatically. In all interactive scenarios the bounds are updated automatically but programmatic changes to the layout of nodes need an additional call to one of the
EnlargeGroupNodeextension methods ofIGroupedGraph. This greatly simplifies the changing of the coordinates of nodes programmatically in a consistent manner and also enables automatic rerouting of orthogonal edge paths adjacent to parent nodes, among other things. Usages of theIMovableinterface should be replaced by usages of theIPositionHandlerinterface instead for the same reason. Also, the newIReshapeHandlerinterface needs to be used instead of theIReshapeableinterface to provide a context to the implementation again for the same reasons. - The
IPortCandidateinterface has been changed to allow the implementation of dynamic port candidates that are aware of a specific user-specified location. For this to work the booleanValidflag has been replaced by the three-stateValidityenum-backed property.falseandtruedirectly map toInvalidandValid. The third possible valueDynamicdoes not need to be considered in existing applications because it will only come into play if the new feature is being used actively. Also, theCreateInstancemethod has been changed to now take a parameter of typeIInputModeContextand may not returnnullanymore. Please see the compatibility source code project and the migration guide on how to properly adjust existing code. - The undo mechanism has been improved so that beginning a compound edit does not place it into the undo queue immediately. Thus the rest of the queue is not discarded anymore if the edit is canceled afterwards. The compound edit will only become visible in the undo queue once its
Endmethod has been called. - The OptionHandler framework in the
yWorks.Optionnamespace has been moved from the core library to theDemo.yFiles.Optionnamespace and became a source code demo that is used by other demos. For some style implementation classes in the core library there was built-in support for the option handling, which has been removed from the core and partially been placed into the corresponding demos. - The
IReparentNodeHandlerinterface has been improved to now contain a callback that handles the actual reparenting of a node. This makes it possible to add additional callbacks and custom implementations for interactively reparented nodes. Existing code can implement the new method by delegating to the implementation inDefaultReparentNodeHandler. - The
DisplayNameattributes that had been declared at the properties of the style classes have been removed. Since it is not necessary anymore to obfuscate the properties and names of the style classes for the final deployment, the actual name of the properties can be used instead. - The GraphML that is written by this version is incompatible with previous releases. Also the default implementation cannot correctly parse GraphML content written with previous versions of the libary. However, a compatibility library is included in the distribution that can be used to import GraphML that has been written with yFiles.NET 3.2. Also, this support library mimics the legacy API so that existing code needs only marginal adjustments to work with the newer API.
- Changed integer-precision
java.awt.Insetstype to double-precisionyWorks.yFiles.Util.Geom.Insets. This affects parameter and return type in methodyWorks.yFiles.Layout.OrientationLayouter.CreateOrientedInsets.
Of course, the yFiles.NET support team will aid existing customers in migrating their code and possibly data to the new API based on their subscription.
yFiles.NET 3.2.1.2 - Changes Since 3.2.1.1
Bugfixes
- Fixed a NullReferenceException in the context of
IFoldedGraphthat could happen when usingITagOwner.Tags. - Fixed a rare but possible
ArgumentOutOfRangeExceptioninCanvasControlif the mouse was moved within 5 microseconds before theDragTimetimer ellapsed.
yFiles.NET 3.2.1.1 - Changes Since 3.2.1
Bugfixes
- Fixed a NullReferenceException in the context of
IFoldedGraphthat could happen in multi-level node collapse operations as a result to calls toCollapse.
yFiles.NET 3.2.1 - Changes Since 3.2.0.2
Minor Layout and Analysis Features Added
y.util.GraphHider: added methods that unhide specific nodes and edges:unhideNode(y.base.Node, bool),unhideNodes(y.base.NodeList, bool),unhideEdge(y.base.Edge),unhideEdges(y.base.EdgeList).- Added
y.layout.NormalizingGraphElementOrderStage. This layout stage can be used to normalize the order of the elements within a graph. - Added
y.layout.EdgeReversalStage. This layout stage can be used to temporarily reverse all or some of a graph's edges for layout calculation. y.layout.tree.DefaultNodePlacer: added two new styles for the rootAlignment property (ALIGNMENT_TRAILING_ON_BUSandALIGNMENT_LEADING_ON_BUS).y.layout.tree.GenericTreeLayouter: added support for a specific node grouping which can be disabled/enabled with methodsetGroupingSupported(bool). By default, this feature is enabled.
Bugfixes
- Fixed an exception (about unit being disposed already) in
UndoEngineif anIUndoUnitwas added within theAutoAddTimeSpanto the machine after the engine had been cleared. - Calling
IHierarchy.SetParentwhere the new parent was previously declared a leaf (instead of a group node) caused problems because the fact that the node now no longer was leaf was not published through an event. This resulted in inconsistent display of the views if theFoldingManagerwas used. Also the leaf state was not correctly rolled back during undo. - All built-in GraphML
DOMInputHandlercould not parse GraphML default attribute values. - Fixed incorrect implementation of various
BridgeManager.RegisterXXXObstaclemethods. - Fixed code in
FixedGroupLayoutStagethat threw aNullReferenceExceptionand rendered the stage basically useless. y.layout.hierarchic.incremental.SimplexNodePlacer: fixed wrong calculation of the width of the leftmost/rightmost swimlane.y.layout.tree.TreeLayouter: fixed strange edge routes appearing whensetPortStyle(int)was set toBORDER_CENTER_PORTSorBORDER_DISTRIBUTED_PORTSand the nodes had non-uniform size.y.layout.hierarchic.ConstraintLayerer: fixed possible NullReferenceException when the unconstrained layering would already contain same layer edges.y.layout.router.GroupNodeRouterStage: fixed bug where edges that end at selected group nodes are not routed wheny.layout.router.OrthogonalEdgeRouter#ROUTE_EDGES_AT_SELECTED_NODESwas set.y.layout.tree.AssistantPlacer: comparators for sorting the child nodes in a (sub)tree are now provided with non-assistant child nodes also.y.layout.router.OrthogonalPatternEdgeRouter: fixed bug where self loops with weak port candidates at self side might result in edge endpoints outside the node's bounds when grid routing is enabled. This will implicitly also affecty.layout.router.ChannelEdgeRouterwhen using the default settings.
Improvements
y.layout.router.OrganicEdgeRouter: added optionsetEdgeNodeOverlapAllowed(bool). Setting this option to true often leads to better results if thecreateNodeEnlargementStage()LayoutStage is not used (e.g. because the nodes are not allowed to move) and the distances between some nodes are small.y.layout.tree.TreeLayouter: more suitable handling of large edge labels and multiple edge labels assigned to one edge.y.layout.organic.InteractiveOrganicLayouter: added methody.layout.organic.InteractiveOrganicLayouter#startLayout()andy.layout.organic.InteractiveOrganicLayouter#stopAndWait(). Adjusted corresponding demos.y.layout.hierarchic.IncrementalHierarchicLayouter: sometimes, if both swimlanes and groups and layers have been defined by the user, the algorithm would place the group nodes into newly created layers in order to avoid group node overlaps, although this might not always be necessary. The algorithm has been improved to better detect overlaps.y.layout.grouping.FixedGroupLayoutStage: it is now possible to have this stage work on selected groups only.y.layout.hierarchic.ConstraintLayerer.ConstraintFactory: added methodgetMemento()to to create the factory without an initial graph.y.layout.hierarchic.incremental.SequenceConstraintFactory: added methodgetMemento()to to create the factory without an initial graph.
yFiles.NET 3.2.0.2 - Changes Since 3.2.0.1
Bugfixes
- Fixed obfuscation errors in yFilesAlgorithms.dll.
yFiles.NET 3.2.0.1 - Changes Since 3.2
Demos Added
- New orthogonal edges demo
Demo.yFiles.Graph.Input.OrthogonalEdges. yEd.NETnow can also use edge bridges and supports automatic adjustment of node bounds to label sizes.
Bugfixes
StringFormatscould not be deserialized from GraphML.- Fixed possible NPE in folding code when no DefaultPortStyle has been set on the backing graph.
- Added missing constant
y.layout.LayoutConstants.MINIMUM_NODE_SIZE_DPKEY. yWorks.yFiles.UI.Model.LayoutGraphAdapternow automatically translatesyWorks.Canvas.Input.ISizeConstraintProviders into minimum group node sizes fory.layout.LayoutConstants.MINIMUM_NODE_SIZE_DPKEY.yWorks.Canvas.Input.HandleInputModedid not work correctly when used together with multipleyWorks.yFiles.UI.Input.GraphEditorInputModeinstances.yWorks.Option.I18N.ResourceManagerI18NFactorynow correctly delegates to parent contexts when no matching key is found.
yFiles.NET 3.2 - Changes Since 3.1.1
Major Features Added
Removed Dependency on J# Assemblies
yFiles.NET 3.2 no longer depends on J# assemblies. Although there are still references to classes from the java.awt and java.util namespaces in some of the method signatures, replacement implementations of these classes are provided as part of the yFiles.NET assemblies.
Support for folding operations in hierarchically grouped graphs
- Class
yWorks.yFiles.UI.Model.FoldingManagercan be used to establish a model-view setup where so-called managed views provide support for folding operations in a hierarchically grouped graph. - Interface
yWorks.yFiles.UI.Model.IFoldedGraphdefines the contract for working with the folding-enabled graph in a managed view. It enables collapsing of group nodes and expanding of previously collapsed group nodes. - The various IInputMode implementations fully support working with folding-enabled graphs. Both collapsing and expanding group nodes and also navigating into and out of group nodes is covered.
- The clipboard facility and undo engine fully support folding operations transparently.
- A new node style decorator,
yWorks.yFiles.UI.Drawing.ICollapsibleNodeStyleDecorator, has been added. It is specifically designed to support the user interaction part of folding operations with group nodes by means of a collapse/expand "handle". - Class HierarchyTreeView provides additional folding-related support for displaying the hierarchy of a folding-enabled graph in a TreeView control.
- The GraphML framework has been extended to fully support reading and writing the collapsed/expanded state of group nodes in hierarchically grouped graphs.
Visual Enhancements
- Class
yWorks.yFiles.UI.BridgeManagerprovides support for so-called bridges in edge paths that resolve the visual ambiguity induced by edge crossings.
Automatic Layout
- The automatic layout algorithms no longer depend on J# assemblies.
- Layout algorithm
y.layout.hierarchic.IncrementalHierarchicLayouternow supports swimlane layouts of hierarchically grouped graphs. - Layout algorithm
y.layout.hierarchic.IncrementalHierarchicLayouternow allows to specify placement constraints for nodes that reside in the same layer. A default implementation of new interfacey.layout.hierarchic.incremental.SequenceConstraintFactoryenables user-defined constrained node sequencing, where nodes can be specified to be placed at the beginning or the end of their respective layer, or can be specified to be placed before/after a given reference node. - A new domain-specific layout algorithm,
y.layout.genealogy.FamilyTreeLayouter, has been added that is especially suited for genealogical family trees. - A new planarity test class,
y.layout.planar.PlanarityTest, has been added. It can be used to test a graph for planarity and to create a planar embedding of a planar graph. Both can be done in linear time. - Minimum size constraints for group nodes have been added to the major layout algorithms
y.layout.hierarchic.HierarchicGroupLayouter,y.layout.organic.OrganicLayouter,y.layout.organic.SmartOrganicLayouter, andy.layout.hierarchic.IncrementalHierarchicLayouter.
the relevant data can be bound to the graph using data provider look-up keyy.layout.grouping.GroupingKeys#MINIMUM_NODE_SIZE_DPKEY. - Significantly improved generic label placement algorithms
y.layout.labeling.SALabelingandy.layout.labeling.GreedyMISLabeling. The number of overlapping labels has been drastically reduced. Furthermore, these algorithms now place labels associated with theFREElabel model. - Added the ability for the organic layout algorithms to deal with elliptical shapes of group nodes, which may themselves contain elliptical node shapes. Class
y.layout.organic.EllipticalGroupBoundsCalculatorcan be used to add this ability to the algorithms. - Class
y.layout.SequentialLayouterhas been added, that can be used to run several layouters sequentially one after the other.
Graph Analysis Algorithms
- The graph analysis algorithms no longer depend on J# assemblies.
Minor Features Added
Graph Analysis Algorithms
y.algo.Cycles: added method#findAllCycleEdges(y.base.Graph, boolean)- Class
y.algo.IndependentSetshas been added. It provides methods for calculating independent sets of nodes.
GraphML Enhancements
- GraphML (de)serialization can be performed purely based on reflection information, removing the need for custom (de)serializer implementations for many use cases.
- The default format for serialized objects has been changed to XAML object syntax (this only affects classes that are new to yFiles.NET 3.2). The GraphML parsing framework also supports most of the XAML syntax, with the main exception of inlined (attribute syntax) markup extensions.
- Registration and lookup of (De)Serializer implementations has been simplified and made consistent.
Automatic Layout
- Class
y.layout.tree.NodeOrderComparatorhas been added as a convenience implementation to easily specify the order of child nodes in a tree-like structure. The tree layout algorithmsy.layout.tree.TreeLayouter,y.layout.tree.HVTreeLayouter,y.layout.tree.ARTreeLayouter, andy.layout.tree.BalloonLayouter. y.layout.hierarchic.incremental.TopLevelGroupToSwimlaneStagehas been added and allows for conveniently doing swimlane layouts for the incremental hierarchic layouter. It interprets top level group nodes as swimlanes and configures the core layouter appropriately.y.layout.hierarchic.IncrementalHierarchicLayouter: By default, edges at group nodes are used for layering even when recursive group layering is disabled and for incremental layering.y.layout.OrientationLayouter: added feature to mirror the graph at the x-axis or y-axis according to the given layout orientation. See method#setMirrorMask(int).y.layout.hierarchic.IncrementalHierarchicLayouternow has an improved port assignment strategy for edges that connect to group nodes.y.layout.hierarchic.ConstraintLayerer.ConstraintFactory: it is possible to specify weights to better enforce preferred layer distances.y.layout.router.OrthogonalPatternEdgeRouter: added new patterns for selfloops.y.layout.router.OrthogonalPatternEdgeRouter: improved routing for edges inside group nodes.y.layout.orthogonal.OrthogonalLayouter: now produces drawings with less crossings.
Improvements
- InputModes allow fine-grained control over user interaction with respect to specific graph element types.
y.layout.organic.InteractiveOrganicLayouter: added methody.layout.organic.InteractiveOrganicLayouter#startLayoutandy.layout.organic.InteractiveOrganicLayouter#stopAndWait. Adjusted corresponding demos.y.layout.hierarchic.IncrementalHierarchicLayouter: Sometimes if both swimlanes and groups and layers have been defined by the user, the algorithm would place the group nodes into newly created layers in order to avoid group node overlaps, although this might not always be necessary. The algorithm has been improved to better detect overlaps.y.layout.grouping.InsetsGroupBoundsCalculatorhas been enhanced to optionally take node labels of child nodes into account when calculating the bounds of a given group node. See also#isConsiderNodeLabelsEnabled()and#setConsiderNodeLabelsEnabled(boolean).yWorks.GraphML.Writer.IXmlWriternow offers several convenience methods to write typesafe attributes, CDATA content etc.
Demos Added
- New demos that are tailored to specific aspects of InputMode handling (see InputDemos solution folder).
- New folding demo
Demo.yFiles.Graph.Folding. - New demo that showcases the bridge calculation feature
Demo.yFiles.Graph.Bridges.
Bugfixes
y.layout.router.OrthogonalEdgeRouter: Fixed bug where edges weren't routed orthogonally if rerouting was enabled (#setReroutingEnabled(boolean))- Fixed bug where wrong minimum size is set when data provider
y.layout.grouping.GroupingKeys#MINIMUM_NODE_SIZE_DPKEYis missing. y.layout.labeling.MISLabelingAlgorithm: Fixed calls to getProfit after labeling causing NullPointerException.y.layout.router.OrthogonalSegmentDistributionStage: Replaced casts tojava.util.Listwithjava.util.Collectionto conform with API documentation fory.layout.PortCandidate#SOURCE_PCLIST_DPKEYandy.layout.PortCandidate#TARGET_PCLIST_DPKEY.y.layout.router.OrthogonalEdgeRouter: fixed bug where strong PortConstraints as well as fixed PortCandidates were not obeyed.y.layout.hierarchic.IncrementalHierarchicLayouter:#LAYERING_STRATEGY_USER_DEFINEDdid not work as expected for unconnected graphs, since each component was layered and normalized separately. The fix ensures that layer IDs are respected globally.y.layout.hierarchic.IncrementalHierarchicLayouter: Group layer compaction did not always work correctly for for graphs with edges at group nodes.y.layout.router.OrthogonalSegmentDistributionStage: fixed bug where fixed PortCandidates weren't kept. This also affectsy.layout.router.ChannelEdgeRouterand in some very uncommon casesy.layout.router.OrthogonalEdgeRouter.y.layout.tree.TreeLayouter: fixed incorrect handling of label bounds if a non-default orientation was used.y.layout.hierarchic.IncrementalHierarchicLayouter: Fixed incorrect calculation of group node heights for certain cases where edges at group nodes were present.
Changes in Default Behavior
y.layout.hierarchic.IncrementalHierarchicLayouter:#LAYERING_STRATEGY_USER_DEFINEDor#LAYERING_STRATEGY_FROM_SKETCHdisable recursive group layering.y.layout.CopiedLayoutGraphautomatically registers a DataProvider undery.layout.Layouter#NODE_DP_KEYif not already present on the original graph.
Incompatible API Changes
Removed Dependency on J# Assemblies
yFiles.NET 3.2 no longer depends on J# assemblies. Both the layout algorithms and analysis algorithms classes now use native .NET framework types instead of Java types, respectively use replacement class implementations.
Please see the yFiles.NET migration guide for more information.
yWorks.yFiles.UI.Input.GraphEditorInputMode: many of the boolean flag properties have been removed and replaced by properties that take type-safe flaggable enumeration values. UseMarqueeSelectableItemsinstead of the variousMarqueeSelect* properties. The functionality of boolean propertySelectElementsAllowedcan be mapped to theSelectableItemsenumeration property.yWorks.Canvas.Input.MainInputMode.MarqueeSelectnow takes one more argument as a predicate, that can be set tonullfor backwards compatibility.- The two deprecated Install and Uninstall methods from
yWorks.Canvas.Input.AbstractInputModethat were using theCanvasControlparameters have been finally removed in favor of the variants that take theIInputModeContextarguments. Adjust the implementation accordingly and obtain the canvas instance from the context object. - Most of the floating point properties in
ICanvasContextandCanvasControland the related interfaces that were of typefloathave been changed todoubleprecision floating point type. Change variable declarations or add casts where necessary. - Class
yWorks.yFiles.UI.Model.EmptyPortsCandidateProviderhas been renamed from the slightly misspelled version that was missing a 'd'. Add the missing letter. yWorks.GraphML.Writer.IWriteContextnow extendsyWorks.Support.ILookupinstead ofyWorks.Support.IContextLookup. The serializer for a given object is no longer available through the context lookup, use methodGetSerializerinstead.yWorks.GraphML.Writer.AbstractSerializer: propertiesTagNameandXmlNamespaceare deprecated, use the context aware methodsGetTagNameandGetXmlNamespaceinstead.yWorks.GraphML.Writer.GraphMLWriter: propertyWriteUserTagshas been removed, use the corresponding context property orGraphMLIOHandlerinstead. Also, this class does not implementyWorks.Support.ILookupDecoratoranymore, where necessary, decorate the current write context directly.- All constants in
yWorks.GraphML.Writer.AbstractXmlWriterhave been move to classXmlConstants. yWorks.GraphML.Reader.IParseContextnow extendsyWorks.Support.ILookupinstead ofyWorks.Support.IContextLookup. The deserializer for a given object is no longer available through the context lookup, use methodGetDeserializeror convenience methodDeserializeinstead.yWorks.GraphML.Reader.DOM.DOMGraphMLParser: propertiesReadUserTagsandContextPropertieshave been removed, set the corresponding context property directly or useGraphMLIOHandlerinstead.yWorks.GraphML.Reader.ReferenceResolverhas been refactored to interfaceIReferenceResolver. Also, only methodResolveReferenceis still public.- All concrete implementations of
yWorks.GraphML.Reader.IDeserializerhave been made private, retrieve the correct implementation for a given object through the parse context instead. y.layout.hierarchic.incremental.IncrementalHintsFactory,y.layout.hierarchic.ConstraintLayerer.ConstraintFactory,y.layout.hierarchic.incremental.SequenceConstraintFactory: All methods that previously hady.base.Nodeory.base.Edgearguments now takeobjectinstead. This should be source code compatible, but requires recompilation. In addition, if you manually register a DataProvider undery.layout.Layouter#NODE_DP_KEYon the graph, you are now required to use the IDs stored in this DataProvider as arguments for these methods.