yFiles.NET Change Log

yFiles.NET 5.0.0.2 - Changes Since 5.0.0.1

Bugfixes

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

Removing an item that is currently highlighted with a custom HighlightIndicatorManager, FocusIndicatorManager, or SelectionIndicatorManager no longer results in a NullReferenceException.

Moving an edge label with SmartEdgeLabelModel that is owned by an edge without visible path no longer throws an exception.

GraphEditorInputMode and GraphViewerInputMode no longer ignore changes to their sub-input modes after having been installed once.

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

Fixed a bug in CreateEdgeInputMode which caused port candidates not to be shown after re-installation of the input mode.

The extension method OrientedRectangleExtensions.GetCenter didn't return the correct center if the width or height of the rectangle was equal to 0.

StripeDropInputMode no longer calls ItemCreator twice.

The StripeDropInputMode.ItemCreated event now is properly raised.

The InteriorStretchLabelModel.GetMinimumNodeSize method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.

MoveViewportInputMode: The Dragging, Dragged, DragCanceling, DragCanceled, DragFinishing and DragFinished events did not fire reliably for touch input and when mouse inertia was active.

TextEditorInputMode: inserting a line break now replaces selected text.

The HitTestRadius property of the following implementations of ICanvasContext now correctly contain the value in world coordinates instead of view coordinates:

The context created by Contexts.CreateCanvasContext when passing a CanvasControl but no hit test radius.

The context passed to DisposeVisualCallback.

The context passed to IPositionHandlers by MoveInputMode.

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

Fixed an issue where bridges would erroneously appear when using EdgeStyleDecorationInstaller to use an edge style for highlight or selection.

RectangleVisual no longer truncates the rectangle coordinates to integers when drawing a rectangle with an outline.

Fixed validation for signing licenses which could fail with certain public keys.

Fixed an error message that could appear erroneously at build time when using a signing license.

Fixed a NullReferenceException when calling IGraph.ApplyLayout when the license is invalid.

Sometimes, the GroupNodeDefaults.Labels.AutoAdjustPreferredSize property and the GroupNodeDefaults.Ports.AutoCleanup property were not considered for labels and ports of groups.

Relocation of edges: dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.

The ApplicationCommands.Copy command is no longer executed twice.

The validation schema for GraphML has been fixed to work with more validators.

FreeEdgeLabelModel: static property Instance is now excluded from obfuscation.

AdjacentNodesGraphBuilder and TreeBuilder no longer remove unchanged nodes unnecessarily when those have been created lazily.

Layout

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

Fixed some InvalidCastExceptions that might occur when using port candidates.

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

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

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

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

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

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

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

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

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

MultiPageLayout: Fixed bug that proxy edges were never routed as such.

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

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

Improvements

GraphBuilder no longer requires an edge source, allowing graphs to be built consisting only of nodes.

If the GroupsSource property is not set (is null), GraphBuilder no longer removes existing groups during BuildGraph and UpdateGraph. The same applies to the related classes TreeBuilder and AdjacentNodesGraphBuilder.

Layout

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

yFiles.NET 5.0.0.1 - Changes Since 5.0

Bugfixes

Fixed several problems with relative resource URIs for UriImageNodeStyle and UriIconNodeStyle when reading and writing GraphML.

yFiles.NET 5.0 - Changes Since 4.4.0.2

Major Features Added

General

The complete yFiles.NET API has been overhauled, simplified, and made more consistent. Many strange and dark corners of the API have been cleaned up. Types have more logical and intuitive names. The namespace structure is more logical and intuitive as well.

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

API documentation and Developer's Guide are now integrated into our Documentation Viewer that provides useful search and filtering facilities.

Viewer

Support for building graphs based on user data offered by new classes GraphBuilder, TreeBuilder, and AdjacentNodesGraphBuilder.

High DPI support: A new Scale property allows for adapting zoom independent sizes in rendering (e.g. drawings for resize handles) as well as in user interaction (hit test radius or double click size) to higher screen resolutions and thus smaller pixels. An extension method automatically chooses an appropriate scaling in high DPI aware applications. Furthermore, the default font now is resolution independent.

Running animations and performing layouts now offers .NET's Task-based mechanism for asynchronous processes. This leads to easier composition of asynchronous processes using C#'s await keyword where code is written close to how synchronous code would look like instead of chaining callbacks. This also simplifies exception handling which works as usual via try-catch instead of callbacks.

Layout

Performance for many layout algorithms has been improved.

There now is a new way to configure yFiles automatic layout algorithms. The LayoutData class and its sub-classes can be used to pass configuration data to a layout algorithm by setting properties instead of registering DataProviders on the graph which have to be filled with this data. This reduces the code needed to configure a layout and is more flexible as well as reusable. As most subclasses of LayoutData are specialized for one layout algorithm, their properties provide a good overview which data can be passed to the algorithm.

Added new layout algorithm SeriesParallelLayout for graphs that are constructed only by series (combining two series parallel graphs by merging the source of one graph with the sink of the other) and parallel (combining two series parallel graphs by merging the sources and the sinks) operations.

Added edge bundling feature. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes. The following layout algorithms support edge bundling:

CircularLayout: Edge bundling is applied to edges of the same partition.

TreeReductionStage: Edge bundling is applied to non-tree edges.

RadialLayout: Edge bundling is applied to non-tree edges.

Added support for Sankey diagrams which visualize flow quantity between entities like e.g., cost or energy flow.

OrganicLayout now supports the detection of regular substructures in the graph (see OrganicLayout.ChainSubstructureStyle, OrganicLayout.StarSubstructureStyle, OrganicLayout.CycleSubstructureStyle, and OrganicLayout.ParallelSubstructureStyle) and applies a specific layout style to them such that they can be better recognized.

Deployment

The Software License Agreement now provides an alternative to the requirement of obfuscating the redistributable DLLs: delivering the redistributables as part of software applications is now allowed if the redistributable DLLs are obfuscated or if the assemblies of the application which reference yFiles are signed with a strong name whose public key token is bound to the license. See distribution.html for details.

Minor Features Added

Layout

Added multi-parent support to TreeLayout. A tree node can have multiple parents that are connected to all of its siblings and share the same parents. This might come to use in organizational charts where a team answers to multiple superiors.

Added grid placement support for nodes and edges to HierarchicLayout.

RecursiveGroupLayout: Added the InterEdgeRouter property to specify an edge router to layout edges that cross group node bounds. Thus, it is not necessary to subclass the layout algorithm to change inter-edge routing anymore.

HierarchicLayout supports recursively routed edges. Edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node. This routing style is specified using EdgeLayoutDescriptor.RecursiveEdgeStyle.

HierarchicLayout: Improved from-sketch behavior for groups with changed bounds (e.g. after folding or expanding a group node).

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

HierarchicLayout now allows to specify the directedness of edges, see HierarchicLayout.EdgeDirectednessDpKey. This new feature enables to, for example, support mixed graphs that contain both directed and undirected edges: While for directed edges the layering step tries to find a solution where the source of an edge is placed above the target (with respect to the main layout direction), for undirected edges the direction doesn't matter and the edge may also be inserted as same-layer edge. This feature also enables to force some edges to specifically point against the main layout direction.

HierarchicLayout: Added support for edges with a specific thickness. Minimum distances in the layout will consider these thicknesses, see HierarchicLayout.EdgeThicknessDpKey.

Incompatible Changes

General

The rendering mechanism has been overhauled: Most rendering code that previously used the IPaintable interface now uses the new IVisualCreator interface instead for improved rendering performance. Please see the migration guide for details on the resulting incompatibilities.

The minimum required framework version for the viewer part and the layout adapter is now .NET Framework 4.0. The minimum required framework version for the algorithms part still is .NET Framework 3.5

The return type of several methods has been changed from IEnumerator<T> to IEnumerable<T>.

Many usages of ref or out parameters have been replaced with a suitable structure as return type. The most prominent example of this change are the various GetTangent methods in IPathGeometry and GeneralPath that now return a Tangent.

All methods that take a parameter of type ICanvasContext, IRenderContext, IInputModeContext, IParseContext, IWriteContext, SnapContext, GraphSnapContext, or LabelSnapContext now have that parameter as their first parameter.

With the new web-based Documentation Viewer, the integrated help for the Visual Studio Help Viewer has been discontinued.

Namespace Structure

Classes of the viewer part have been reorganized into a simpler namespace structure.

Model

IGraph

IGraph now supports grouping by default. The GroupingSupported property has been removed from DefaultGraph. Grouping is now always enabled for graphs.

The new property AllowGroupingOperations on GraphEditorInputMode allows for switching interactive grouping operations on or off. Grouping operations are disabled by default and have to be enabled explicitly if the input mode should support them.

The grouping support interfaces IGroupedGraph and IHierarchy<T> have been removed and folded with IGraph.

IHierarchy<T>'s Root property is no longer available. The root of a grouping hierarchy is now represented by null.

Overhaul of IGraph's CreateNode, CreateEdge, AddLabel, AddPort: Ambiguous overloads have been removed, missing overloads have been added and parametershave been ordered to be consistent throughout all overloads.

IGraph's Nodes, Edges, Labels, and Ports properties have been changed from ICollectionModel to IListEnumerable. To be notified of created or removed items, the corresponding IGraph events should be used instead.

The properties NodeLabels and EdgeLabels on IGraph have been replaced by the extension methods GetNodeLabels and GetEdgeLabels.

The properties CollectionModel and Bends have been removed. Bends has been replaced by the GetBends extension method.

The classes BendList and ListLabelCollection have been removed. Use ListEnumerable instead.

The signatures of event handlers throughout the IGraph API have been made consistent using properly typed EventArgs subtypes. Exceptions are a few events that are raised very often which retain an argument list to improve performance.

The methods IsLeaf/SetLeaf and related properties and events have been replaced by IsGroupNode/SetIsGroupNode which have the exact opposite meaning from the old ones.

The signature of IGraph.AddBend has changed. The index parameter has been moved to the end and made optional.

The IGraphStructure interface and its SimpleGraphStructure implementation have been removed, as well as DefaultGraph's constructor that accepted an IGraphStructure.

IGraph now extends the ITagOwner interface. Thus graphs now have a Tag property.

DefaultGraph

DefaultGraph now raises removal events for labels, ports, and bends which are implicitly removed when their owner is removed.

Various protected factory methods on DefaultGraph have been removed: CreateNodeDefaults, CreateEdgeDefaults and CreateMapperRegistry, amongst others.

The method GetBounds has been removed from DefaultGraph.

The property UsePortCandidateProviders has been removed from both DefaultGraph and GraphSettings. Creating an edge using port candidate providers has to be done by manually querying the provider and calling CreateEdge(IPort, IPort).

Folding

The method IsInitiallyExpanded has been removed from IFoldedGraph. The methods IsInitiallyExpanded, SetInitiallyExpanded, and the property DefaultExpandedPredicate have been removed from FoldingManager.

The Expand, Collapse, and IsExpanded methods on IFoldingView (previously IFoldedGraph) now also work with nodes that belong to the master graph instead of the view graph. Thus the collapsed/expanded state can be set or queried for items that are currently not in the view graph. This replaces part of the removed functionality mentioned above.

The interfaces IChangeDummyNodeAppearanceCallback, IChangeDummyEdgeAppearanceCallback, and IChangeLabeledItemAppearanceCallback as well as the FoldingManager.GetChangeDummyAppearanceCallback methods have been removed. The view state properties can now directly be changed on the view state implementations returned by FoldingManager.GetFolderNodeState and FoldingManager.GetFoldingEdgeState, respectively.

IFoldingView.IsInFoldingState (previously IFoldedGraph.IsDummy) now throws an ArgumentException for labels and ports that are not part of this view. Previously, this method returned true for such items. Since this exception is already thrown for nodes, edges, and bends that are not part of this view, the behavior is now the same for all types of graph items.

Labels

The order of the parameters of ILabelModel.GetGeometry has been changed to ILabelModel.GetGeometry(ILabel, ILabelModelParameter).

FreeNodeLabelModel.CreateNodeCenterAnchored and FreeNodeLabelModel.CreateNodeLayoutAnchored have been removed.

FreeNodeLabelModel.CreateDefaultParameter now uses the label's center as its anchor point.

The new edge label models EdgeSegmentLabelModel and EdgePathLabelModel have been added. EdgeSegmentLabelModel allows to create parameters for a segment index and segment ratio while EdgePathLabelModel creates parameters using a ratio of the edge path.

The new label models replace the following removed label models: RotatingEdgeLabelModel, SliderEdgeLabelModel, SideSliderEdgeLabelModel, RotatedSliderEdgeLabelModel, and RotatedSideSliderEdgeLabelModel.

The label layout parameter of the edge label defaults now uses the EdgeSegmentLabelModel.

Ports

The property IPort.Location (to obtain a snapshot of the port's location) has been replaced by the extension method GetLocation. To retrieve a live view of the location of a port, use the new extension method IPort.DynamicLocation.

NodeScaledPortLocationModel has been replaced by FreeNodePortLocationModel that allows to specify the port location by a ratio of the node layout's size and an additional offset. The placement options and API are very similar to FreeNodeLabelModel.

AnchoredPortLocationModel has been removed.

Table

ITable interface:

The signature of CreateRow and CreateColumn has changed. The index parameter has been moved to the end and made optional.

The events StripeChanged and StripeRemoved use StripeEventArgs now. The corresponding event raiser methods have been changed accordingly.

The event LabelRemoved uses LabelEventArgs now.

New extension methods have been added: FindColumn, FindRow, GetCellBounds.

Table class:

The table's lookup decorator can now decorate stripe labels, too.

The following methods have been removed: CreateDefaultColumnStyle, CreateDefaultColumnInsets, CreateDefaultColumnLabelStyle, CreatedDefaultColumnLabelModelParameter, CreateColumnLabelDefaults, CreateDefaultRowStyle, CreateDefaultRowInsets, CreateDefaultRowLabelStyle, CreatedDefaultRowLabelModelParameter, CreateRowLabelDefaults, RemoveUndoSupport, some overloads of CreateRow/CreateColumn, some overloads of AddLabel

The properties DefaultStripeLookup, DefaultColumnLookup and DefaultRowLookup have been added, which replace the removed classes with the same same.

TableExtensions: The GetElementsToMove method has been removed

The IStripeSelection.SelectedStripes property has been removed. Use the individual properties for SelectedRows and SelectedColumns instead

StripeSelection: The superfluous overloads of IsSelected and SetSelected taking an IRow or IColumn have been removed.

The static helper method PlaceNodeInCell has been added to ITable to easily move a node into a specific table cell.

Undo Support

Extension methods to enable/disable Undo have been added to IGraph.

Setting the Tag property on model items and the graph now works with Undo.

Undo operations for the removal of graph elements now keep the proper item order. This improves the consistency especially for layouts between undo operations.

Overloads of the IGraph.BeginEdit extension method that work with IMementoSupport (either via ILookup or an IMementoSupportProvider) have been added.

The overload of the IGraph.BeginEdit extension method that accepted an IEnumerable of IModelItems has been removed.

IUndoSupport, MementoUndoUnit, MementoUndoableEdit, and MementoStateStruct have been removed.

IUndoUnit: The methods CanUndo and CanRedo have been removed.

The methods UndoImpl and RedoImpl on UndoUnitBase have been removed. Implementations should use Undo and Redo from the IUndoUnit interface instead.

The properties UndoText and RedoText on UndoEngine have been removed.

The interface IGraphUndoUnitSupport has been removed. Its methods Create...UndoUnit have been moved to DefaultGraph. Developers who have created a custom implementation have to derive from DefaultGraph and override the corresponding method(s).

Geometry

The yWorks.Geometry namespace has been simplified and cleaned up.

The basic geometry types PointD, SizeD, RectD and InsetsD have been made immutable.

The classes ImmutablePoint, ImmutableSize, ImmutableRectangle and ImmutableOrientedRectangle have been removed. The immutable types PointD, SizeD and RectD as well as the immutable instance provided by the new static method OrientedRectangle.CreateImmutable can be used instead.

The interfaces IPointSetter and ISizeSetter have been removed. Instead the interfaces IMutablePoint and IMutableSize are used.

The IReshapeable interface has been removed. The various overloads of the Reshape method have been implemented as extension methods on IMutableRectangle instead.

IMovable has been removed as well. Instead an IPositionHandler can be used.

PointD.FromPoint, SizeD.FromSize and RectD.FromRectangle have been removed and replaced by the extension methods IPoint.ToPoint, ISize.ToSize, and IRectangle.ToRect.

Various other geometry-related infrequently-used or duplicate classes and interfaces have been removed.

The static fields SizeD.Unbound, SizeD.Empty and SizeD.Zero have been added.

Controls

The ContentRect will now also be updated when creating edges, adding, editing or moving labels or deleting graph items.

The Cut, Copy and Paste commands are no longer handled by GraphControl and the respective methods have been removed as well. Command bindings for Copy are still supplied by GraphViewerInputMode and GraphEditorInputMode. Command bindings for Cut and Paste are still supplied by GraphEditorInputMode.

The Undo and Redo commands are no longer handled by GraphControl and the respective methods have been removed as well. Command bindings for Undo and Redo are still supplied by GraphEditorInputMode. Furthermore, the respective methods can still be called on the UndoEngine directly.

The UndoabilityEnabled property has been removed. Undo and Redo command bindings can be enabled on GraphEditorInputMode.

The ClipboardEnabled property has been removed. Clipboard command bindings can be enabled on GraphViewerInputMode and GraphEditorInputMode.

The GetUndoEngine method has been removed. The current UndoEngine can be retrieved from the graph instead.

The SelectionChanged event has been removed.

The new property LastEventLocation always contains the location of the last mouse or touch event.

The MouseWheelBehavior property replaces the previous property AutoMouseWheelZoomEnabled and not only allows disabling mouse wheel zoom, but also enabling scrolling with the mouse wheel.

The methods Add, AddCreator, AddGroup and AddGroupToGroup have been removed as the new methods AddChild and AddGroup of ICanvasObjectGroup provide a more intuitive way to add child elements to e.g. the GraphControl.GetBackgroundGroup.

The InputModes property has been removed. Developers who want to install multiple input modes on a CanvasControl have to set a MultiplexingInputMode as CanvasControl.InputMode and add their input modes to that mode.

Removed superfluous interfaces IUserTagProvider and ITableProvider, and all implementations.

Removed superfluous constructors from all style implementations.

All IStyleRenderer implementations: The accessibility of the Style, Layout, and Item properties has been reduced to protected. In addition, the latter has been renamed to Node, Label, Edge, or Port respectively.

Animations

The original overloads of Animator.Animate that accept a callback for finishing the animation have been removed. Instead the new Task-based overloads can be used.

Various Visualization Changes

Replaced IPaintable with IVisualCreator for improved rendering performance. IPaintable's Paint method now has to be implemented on the IVisual returned by IVisualCreator's CreateVisual and UpdateVisual methods.

The protected factory methods that supplied the initial value for GraphModelManager's Installer properties (EdgeStyleInstaller, NodeStyleInstaller, etc.) have been removed.

GraphModelManager.Invalidate has been removed.

The IRenderContext.Canvas method has been pulled up to ICanvasContext and renamed to CanvasControl.

IRenderContext: The Transform property has been removed.

The RenderContext class has been removed. Use CanvasControl.CreateRenderContext instead to retrieve an instance of IRenderContext.

DefaultEdgePathCropper now uses the new method HandleEmptyPath if cropping the edge would result in an empty path. By default this method crops at the ports instead which results in edges between a group node and one of its children being no longer hidden.

DefaultEdgeIntersectionCalculator: A callback method GetNodeGeometry has been added.

The CanvasObjectGroupProviderCallback property on ModelManager has been replaced with the GetCanvasObjectGroup method. The CanvasObjectGroupProviderCallback property on ItemModelManager has been replaced with the CanvasObjectGroup property and the GetCanvasObjectGroup method; the default implementation just defers to the property, just like GetDescriptor.

IGroupAction as well as ICanvasObjectGroup.GetGroupAction have been removed as they had hardly any use.

The interface ICanvasGroupProvider and the delegate CanvasObjectGroupProviderCallback have been removed. Accessing the individual CanvasObjectGroups can be done via the properties of CanvasControl instead.

ICanvasObjectTreeEventSource and the corresponding classes CanvasObjectAddEventArgs, CanvasObjectRemoveEventArgs, CanvasObjectMoveEventArgs, and CanvasObjectInvalidateEventArgs have been removed.

Input

General Input Mode Refactorings

The type hierarchy for input modes has been simplified considerably:

All input modes except OverviewInputMode, GraphViewerInputMode, and GraphEditorInputMode now directly implement IInputMode without any abstract base classes in between.

IConcurrentInputMode has been removed and merged with IInputMode.

The Enabled property on the IInputMode interface has been removed. It is still present on all concrete implementations.

The ConcurrencyController property has been removed. Instead, a parameter of type ConcurrencyController has been added to the IInputMode.Install method.

All abstract input mode base classes except AbstractInputMode (which has been renamed to InputModeBase) have been removed. AbstractConcurrentInputMode has been merged into InputModeBase.

Input mutex handling has been refactored considerably:

IInputMode's ConcurrencyController property has been removed. Input modes now get a ConcurrencyController as parameter of their Install method.

The ConcurrencyController has been refactored and is now only responsible for a single input mode. Its Active property indicates if the input mode currently has or may request the mutex.

The InputMutex class has been removed.

The PreferredCursor property has been moved from IInputMode to ConcurrencyController.

The input mutex should be requested and released using the according methods on ConcurrencyController. Most input modes don't provide the methods HasMutex, CanRequestMutex, RequestMutex and ReleaseMutex anymore.

The Enabled property of IInputModes is not set to false anymore if another input mode acquires the mutex. Instead their ConcurrencyController is deactivated. This provides a clear separation between suppressing input modes (while another mode holds the mutex) and explicitly disabling a mode from user code (via the Enabled property).

As a consequence most input modes don't provide the EnabledChanged event and the OnEnabled and OnDisabled methods anymore, but OnConcurrencyControllerActivated and OnConcurrencyControllerDeactivated instead.

IInputMode has a new property Priority which defines the installation priority of the input mode. Previously those have been available as properties on GraphViewerInputMode, GraphEditorInputMode, and TableEditorInputMode. Those have been removed.

IInputMode's Stop method has been renamed to TryStop to make it more obvious that an implementation might return false to indicate that it did not actually stop.

All input modes no longer raise Stopped and Canceled events. Developers who want to get notified when an input mode gets stopped or canceled have to override the OnStopped or OnCanceled methods. Also, the events Initializing and Initialized no longer exist. Input modes that need to perform one-time initialization on first Install can keep track of that themselves.

MultiplexingInputMode: The AddConcurrent methods as well as the Add method which takes an additional priority parameter have been removed. There is only one Add method left, which takes an input mode as its only parameter. Priority is determined by the input mode's Priority property. Whether an input mode runs exclusive or always active alongside other input modes is determined by the input mode's ConcurrencyController which has an Exclusive property controlling that. This property is also available for all default IInputMode implementations.

MultiplexingInputMode is now aware of changes to the priority of already installed input modes and will update the installation order accordingly when an input mode's priority is changed.

IInputModes in general:

The setter for Graph and GraphSelection properties, if present, and its associated Set* methods have been removed. Both are now always retrieved from the input mode context dynamically.

The read-only property InputModeContext has been introduced to expose the IInputModeContext the mode is installed in.

Many input modes now no longer have protected methods for state machine transitions. Instead those methods are mostly parameterless now.

GraphEditorInputMode and GraphViewerInputMode

GraphViewerInputMode and GraphEditorInputMode have been made more similar regarding customization in the capabilities they both provide:

GraphViewerInputMode now supports the same click and selection behavior as GraphEditorInputMode. This includes detail selection (Shift+Click) and cyclic selection (Alt+Click) as well as finer control over behavior like the ClickSelectableItems property and the ShouldClickSelect method.

The methods Click and DoubleClick now take an IModelItem and ClickEventArgs as arguments and have no return value. Instead of returning a boolean, the Handled property on the ClickEventArgs should be set.

Their ClickInputMode instances is now configured to raise events for both left and right clicks.

The default click actions that change the selection and create new nodes are only triggered on left mouse clicks now.

An explicit hit-test order for double clicks is provided that can be changed through the DoubleClickHitTestOrder property. By default, this hit-test order prefers labels over other graph elements.

GraphViewerInputMode now also has the AvailableCommands property, already known from GraphEditorInputMode or NavigationInputMode.

Several child input mode priorities in GraphViewerInputMode have been changed and most of them now have the same priorities as in GraphEditorInputMode.

The new CanvasClicked event reports clicks on an empty canvas location.

The new SelectablePredicate property allows finer control over what particular items should be selectable without the need to create a custom subclass.

The new CreateSelectionEventArgs method creates SelectionEventArgs using the GraphSelection.

The events MultiSelectionStarted and MultiSelectionFinished now use SelectionEventArgs<IModelItem>.

GraphViewerInputMode now has improved support for marquee selection. Marquee selection is no longer turned on or off via MarqueeSelectableItems but instead directly on the MarqueeSelectionInputMode. The recognizer for marquee selection is Shift+Drag and the child input mode priorities have been adjusted accordingly so that marquee selection and viewport movement can co-exist. The child input mode still defaults to being disabled, though.

Changing the ShowHandleItems property will now immediately update the currently visible handles.

The new DeletablePredicate property allows finer control over what particular items should be deletable without the need to create a custom subclass.

The new LabelAdding and LabelEditing events have been added. Those allow fine-grained control over adding or editing labels and tie into the existing functionality provided by IEditLabelHelper.

TextEditorInputMode now ensures that the TextBox is visible in the viewport when starting editing. This behavior can be adjusted by creating a custom subclass and overriding the EnsureVisible method.

Cleanup of the old GraphEditorInputMode API

The type of the OrthogonalBendRemoval property has been changed from bool to OrthogonalEdgeEditingPolicy.

The DeletingSelection and DeletedSelection events now use SelectionEventArgs<IModelItem>.

The constructor that take additional IGraph and IGraphSelection arguments have been removed, as well as the protected methods SetGraph, SetGraphControl, OnGraphChanged and the protected setter for the GraphSelection property. Instead, the IGraph instance is now always taken from the InputModeContext and cannot be changed after the mode is installed.

The CreateDefaultLabelConfiguration method has been removed.

The MarqueeSelect<T>(RectD,IEnumerable<T>) method has been removed.

The SelectionModel property has been removed. Instead the GraphSelection property is used.

The CollectionModel property has been removed. Instead the model items of the Graph property are used.

The GraphInputModeController property has been removed.

The protected event handlers for ClickInputMode's Clicked and DoubleClicked events have been removed.

FindItem has been removed. An additional overload of FindItems without the context parameter has been added. To replicate the previous behavior of FindItem, FindItems can be called and the first element taken from the resulting enumeration.

ShouldBeMovableForMoveInputMode has been removed.

Improved GraphViewerInputMode API:

Added support for the Copy command.

Added support for multi-selection via Ctrl+Click and marquee selection. The latter is disabled by default.

The click hit-test order can now be configured by property ClickHitTestOrder.

By default, clipboard commands are now disabled. This can be controlled with the new property AllowClipboardOperations.

The ItemSelected event has been removed.

ClipboardCommandsEnabled has been removed.

CreateEdgeInputMode

CreateEdgeInputMode has been refactored and streamlined:

Orthogonal edge creation is automatically enabled if orthogonal edge editing is enabled on the containing GraphEditorInputMode.

The ConnectToCandidatesOnly property has been removed. Edge creation now always uses port candidates.

The creation callbacks NodeBasedEdgeCreationCallback and PortBasedEdgeCreationCallback have been replaced by the new EdgeCreator which is always port-based.

The methods GetSourcePortOwner, GetTargetPortOwner, GetSourceNode and GetTargetNode have been replaced by GetSource and GetTarget.

The properties SourcePortCandidate and TargetPortCandidate are no longer read-only.

The methods DetermineEdgeStyle, AssignSourcePortPosition, AssignEdgeStyle as well as the EdgeStyle property have been removed. Instead the new EdgeDefaults property can be used to customize the new edge.

The UseHitNodeTargetCandidatesOnly property has been replaced by the new UseHitItemsCandidatesOnly property.

The type of the OrthogonalEdgeCreation property has been changed from bool to OrthogonalEdgeEditingPolicy.

The new DummyEdgeGraph property is used to create the dummy edge that visualizes the edge during creation.

The preview edge which is displayed during edge creation now shows the edge as it will be created, i.e. the preview edge has the same style, port visualization, and labels as the created edge will have.

The SnapToTargetCandidateOwner property has been removed. The preview edge now is always being cropped at the candidate owner's borders.

A new CancelGestureOnInvalidTarget property has been added that makes it possible to cancel the gesture immediately if ended on an invalid target.

The EdgeCreator callback now has a templateEdge parameter where all data for edge creation can be retrieved from. The source and target IPort parameters have been changed to IPortCandidates.

The AssignBends method has been removed and its functionality folded into the default EdgeCreator implementation. This also means that customized EdgeCreators now have to add bends to the created edge as well.

The following methods have been removed: IsPortCandidateResolutionEnabled, IsValidEnd, IsValidBegin, IsCancelGesture, IsBendCreationEnforced, IsValidBend, IsSourceNodeDraggingFinished, IsRemoveBendEvent. Instead, use the corresponding ...EventRecognizer properties to customize the behavior.

The following methods and properties have been removed: CreateBend(PointD), StartCreateEdge, OnTargetLocationChanged, GetNodes, NodeComparer and PortOwnerComparer.

Other Input Modes

ContextMenuInputMode: Support for different context menu trigger events has been added. Currently only mouse (right-click) and keyboard (application / context menu key) are distinguished, more may be added in the future.

ClickInputMode: The ValidClickHitCursor property has been added. This cursor is used when hovering over a valid hit region.

ClickInputMode: The PreventNextDoubleClick method has been added that can be used in event handlers for single clicks to prevent that this click can become part of a double click event.

CreateBendInputMode: The CancelEventRecognizer property has been removed.

HandleInputMode: The Active property has been removed. The mode can be manually deactivated using the Enabled property instead.

HandleInputMode: The Arm method now has a handle parameter for the handle that is under the mouse cursor.

NodeDropInputMode: The NodeCreator callback, NodeCreated event, and GetDraggedNode method have been removed. The ItemCreator callback, ItemCreated event and DraggedItem property from its base class ItemDropInputMode is used instead.

OverviewInputMode now extends MultiplexingInputMode and can be customized more easily. Minor modes can be replaced and adjusted, as well as the list of available default command bindings can be modified.

OverviewInputMode: The new Margins property specifies margins for the visible area of the bound GraphOverviewControl. The new protected method UpdateVisibleArea provides further means for customizing the visible area.

MarqueeSelectionInputMode: The events DragStarting, DragStarted, Dragging, Dragged, DragFinishing, DragFinished, DragCanceling and DragCanceled now use MarqueeSelectionEventArgs that provide the current selection rectangle.

MarqueeSelectionInputMode: The MarqueeSelected event has been removed. The DragFinished event can be used instead.

MarqueeSelectionInputMode: The LastModifierState property has been removed.

MoveInputMode now provides a QueryPositionHandler event that queries an IPositionHandler each time a drag is started.

MoveViewportInputMode: Mouse cursor handling is now also done by protected methods Arm and Disarm, similar to other input modes.

MultiplexingInputMode: The ChildController property and CreateChildConcurrencyController method have been removed.

TableEditorInputMode: The new events LabelAdding and LabelEditing allow fine-grained control over adding or editing labels and tie into the existing functionality provided by IEditLabelHelper.

TableEditorInputMode: The events DeletingSelection and DeletedSelection now use SelectionEventArgs<IStripe>.

TableEditorInputMode: Now contains the AllowMixedSelection property which has been moved from the removed class CompositeStripeSelection.

WaitInputMode.GetMultiplexingInputMode has been removed.

TextEditorInputMode: The events EditingStarted, EditingCanceled and TextEdited now use TextEventArgs.

TextEditorInputMode: The properties StopRecognizer, CancelRecognizer and LineBreakRecognizer have been added which allow for easy customization of the key gestures used to add new line breaks and to cancel or stop the text editing.

Label Editing

IEditLabelHelper has been refactored:

AddLabel and EditLabel have been replaced by the methods OnLabelAdding and OnLabelEditing which take the new LabelEditingEventArgs as their only argument.

The IEditLabelHelper.ConfigureTextEditorInputMode method has been removed. It has been replaced by the LabelEditingEventArgs.TextEditorInputModeConfigurator property.

The customizations possible from IEditLabelHelper are the same as those from the LabelAdding and LabelEditing events on GraphEditorInputMode and TableEditorInputMode. IEditLabelHelper is conceptually used as another event handler for those events.

The Owner property of EditLabelHelper has been removed, along with the respective constructor. The label owner can usually be queried from the LabelEditingEventArgs. Custom subclasses can of course still opt to store the item they were created for and use that field.

If an IEditLabelHelper implementation is present in an ILabeledItem's lookup, its AddLabel method is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate method GraphEditorInputMode.ShouldLabelBeAdded always has to return true, 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 an IEditLabelHelper implementation usually should allow editing of label instances that it has created itself in OnLabelAdding.

The current label visual can be hidden while the text editor is shown to reduce visual clutter. This feature is enabled by default and can be controlled through the GraphEditorInputMode.HideLabelDuringEditing property.

Snapping

SnapContext:

A boolean parameter snappingDisabled has been added to the methods HandleMove and DragFinished. This parameter has to be set to true to handle moves or finish a drag when snapping is temporarily disabled. This replaces the call to SnapContext.DisableSnapping.

The events Initializing, Initialized and CleanedUp as well as their associated methods now use InputModeEventArgs.

The VoidInstance field has been removed.

GraphSnapContext:

The return type of GetMovementInfos has been changed to IListEnumerable<MovementInfo> and the classes NodeMovementInfo, PortMovementInfo, BendMovementInfo and EdgeEndMovementInfo have been removed.

The info parameter's type of AddEdgeEndToBeMoved has been changed to the more general MovementInfo. A boolean parameter AtSource has been added.

The methods AddSameWidthEntries and AddSameHeightEntries now return an IListEnumerable<RectD> containing the rectangles whose widths respectively heights are closest to the given size. The parameters resultingSize and rects have been removed.

IEdgeSnapResultProvider:

The methods InitializeSnapping and CleanupSnapping have been removed.

The info parameter's type of CollectSnapResults has been changed to IListEnumerable<MovementInfo>.

SnapResult now has more factory methods. The class SnapLineSnapResult has been replaced with a factory method as well.

The classes SnapLineContainer, SingleLineSnapLineContainer, EdgeSegmentSnapLineContainer, FixedDistanceSnapLineContainer, InBetweenSnapLineContainer have been removed.

Clipboard

The GraphClipboard.ClipboardContext property has been removed.

The Copy methods in GraphCopier now have a new PointDoffset parameter that shifts nodes and bends by a given amount upon copying them.

The signature of IClipboardIdProvider.GetId has changed. The context parameter has been moved to the front.

KeyboardInputMode

KeyboardInputMode has been simplified along with all helper types and infrastructure around commands:

KeyboardInputMode now allows creating a mapping between a key gesture and a command as well as providing custom execution logic for a given command.

There is also a single new method RemoveCommand on KeyboardInputMode which removes all currently existing bindings for a given command.

Various Input-related Changes

Events

The properties LastMouse2DEventArgs and LastEventLocation have been removed from all input modes. Instead, the properties LastMouseEvent and LastEventLocation on CanvasControl can be used.

EdgeEventArgs now also contains the owner of the source and target port.

ItemClickedEventArgs now also contains the location of the click.

StripeEventArgs now also contains the Table for this event.

OrthogonalEdgeEditingContext: The events Initializing, Initialized and CleanedUp as well as associated methods now use InputModeEventArgs.

GraphCommands.AdjustGroupNodeSize now always processes the nodes in bottom to top order instead of using the order in which the nodes were selected.

The command framework has been simplified. Classes ApplicationCommands, NavigationCommands, and GraphCommands have been removed. All commands are now available on new class Commands. The ending "Command" has been removed from the command's names. There is no public implementation for a command, now. Instead, the factory method CreateCommand on class Commands has to be used.

All hit-testing methods as well as the methods in IPortSelectionTester and IBendSelectionTester now take an IInputModeContext instead of ICanvasContext as their context parameter.

IPositionHandler.SetPosition has been removed. The interface is now used as a flagging interface only.

The classes DefaultPositionHandler and PointHandle have been removed.

GraphEditorInputMode.NodeCreator now has an additional parent parameter which can be used as the parent node for creating a new node. GraphEditorInputMode tries to find a group node at the click location to pass as parent to the NodeCreator.

Opening a context menu from the keyboard no longer uses the last known mouse pointer location for opening the context menu. Instead, the location of the current selection or the current item are used.

IPortCandidateProvider: The two method overloads GetSourcePortCandidatesForEdge and GetTargetPortCandidatesForEdge that had an IEdge parameter have been removed - the two remaining pairs have been merged into a single method with an optional argument for the opposite candidate.

The property AbstractPortCandidateProvider.PortOwner has been removed, along with the methods that made use of it.

AbstractPortCandidateProvider: Overloads of CreateCandidate taking an IPort an optionally an IPortLocationModel have been removed.

DefaultPortCandidate: A constructor overload taking the optional PortCandidateValidity additionally has been added.

OrthogonalEdgeEditingContext.AddMovedEdgeEnd: The movementInfo parameter's type has been changed to the more general MovementInfo. A boolean parameter atSource has been added.

PortRelocationHandle: The method ConfigureDummyEdge has been folded into CreateDummyEdge.

The methods IDragHandler.HandleMove and IReshapeHandler.HandleReshape no longer has a return value.

The classes InputModeController and GraphInputModeController have been removed.

The abstract class EdgeEndMoveHandle has been removed.

The StateMachine class as well as the associated types and infrastructure have been removed from the API.

GraphML

The XML namespaces have been updated and the mapping from yFiles.NET types to their corresponding XML namespace has been changed.

All platform-independent graph model types are now mapped to http://www.yworks.com/xml/yfiles-common/3.0. This includes the following types:

all graph item types

all default label models

all port location models

all "void" styles

serialization for geometric primitives

All platform-independent GraphML support types are now mapped to http://www.yworks.com/xml/yfiles-common/markup/3.0.

All platform-independent framework classes are now mapped to http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0. This includes the following types:

Built-in value types (int, double, bool, etc., and enumeration types)

string

All library types specific to yFiles.NET are now mapped to http://www.yworks.com/xml/yfiles.net/5.0/forms. These are mainly the types in the following namespaces:

yWorks.Graph.Styles

yWorks.Markup.Platform

The following events have been added to signal the end of the write or parse process, respectively: GraphMLIOHandler.Parsed, GraphMLParser.Parsed, GraphMLIOHandler.Written, GraphMLWriter.Written, together with the corresponding event raiser methods.

SerializationProperties:

The new serialization property ParseLabelSize optionally disables parsing of the preferred size of a label. This can be used to prevent unexpected clipping when parsing GraphML written on different machines, or with fonts that are not available.

WriteGraphSettings and DisableGraphSettings have been merged to a single DisableGraphSettings property which is interpreted according to the context where it is set.

IndentOutput has been added that allows to define whether the XML output should be properly indented.

A few abstract base classes have been merged:

AbstractXmlWriter and DirectXmlWriter have been merged into XmlWriter

AbstractMapperInputHandler and ComplexMapperInputHandler have been merged into MapperInputHandler

AbstractMapperOutputHandler and ComplexMapperOutputHandler have been merged into MapperOutputHandler

The legacy interface IDeserializer has been removed. For custom deserialization an event handler for GraphMLIOHandler.HandleDeserialization can be used.

The classes ArrayValueSerializer and NullXmlWriter have been removed.

IXamlNameMapper has been refactored to and AddXamlNamespaceMapping has been added to GraphMLIOHandler.

QueryOutputHandlersEventArgs: The overload of AddOutputHandler taking an object id has been removed.

XmlWriter: A property indent has been added that allow to define whether the XML output should be properly indented.

XmlWriter: The constructor overload taking an InternalXmlWriter as well as the corresponding property DelegateWriter have been removed.

Utility Types

A lot of the utility types have been either replaced or removed.

The yWorks.Model namespace has been removed and its types have been moved to more intuitive namespaces.

The yWorks.Support namespace has been removed along with most of the types contained within, since they were not really needed. The remaining types have been moved to more meaningful namespaces, mainly yWorks.Controls.

The classes CompositeHandle<T> and CompositePositionHandler have been removed.

The IMapper.RemoveValue method has been removed. It depends on the specific implementation of the mapper whether a mapping can be removed. If an implementation provides a way to remove a mapping, that should be preferred over setting a null value.

The classes GenericYList, GenericListCell, and HashSet have been removed.

The classes DefaultNodeLookup, DefaultEdgeLookup, DefaultPortLookup, DefaultLabelLookup, DefaultBendLookup and DefaultItemLookup have been removed. Properties with the same names have been added to DefaultGraph instead.

The ItemDecorator<TModelItem> class has been removed. Its members have been pushed down to its former sub-classes NodeDecorator, EdgeDecorator, LabelDecorator, PortDecorator, and BendDecorator.

The events ItemSelected and ItemDeselected on ISelectionModel have been merged into the ItemSelectionChanged event.

The GeomSupport.CreateSmoothedPath method has been moved to GeneralPath.

Layout

Layout Execution

LayoutExecutor:

The method Stop now stops a running layout calculation as soon as possible and then immediately shows the result so far, skipping any animation. In addition, the new method Cancel immediately cancels a running calculation and doesn't change the GraphControl's Graph unless the animation was already running.

The property AbortHandler has been made read-only. There is a protected factory method CreateAbortHandler which can be overridden to create a custom AbortHandler implementation.

Labels are now taken into account for the final content rectangle and viewport animation.

The new property ConsiderViewportLimiter can be enabled to let the target viewport after a layout respect the ViewportLimiter of the GraphControl. The ViewportAnimation has a new property ConsiderViewportLimiter for the same purpose.

The classes LayoutExecutor and LayoutGraphAdapter now have a property AutomaticEdgeGrouping that automatically configures edge groups for ports with multiple incoming or outgoing edges. This feature is enabled by default.

The classes LayoutExecutor and LayoutGraphAdapter now have a property FixPorts that automatically configures strong source and target port constraints for all edges in the graph. This feature is disabled by default.

LayoutExecutor no longer throws an exception wrapping a layout exception if no event handler of LayoutFinished handled the event arguments. This means that exceptions in a layout algorithm can go by unnoticed if the layout runs asynchronously, and the task returned from LayoutExecutor.Start is not awaited.

LayoutGraphAdapter now adds data providers that map each node, edge, and label of a LayoutGraph to their corresponding IModelItem in the original IGraph. Especially, these data providers are available if a layout is run with a LayoutExecutor or the convenience methods MorphLayout or ApplyLayout.

Layout API

The legacy hierarchic layout algorithms HierarchicLayouter, HierarchicGroupLayouter, and the associated legacy interfaces ILayerer, IDrawer, IMementoSupport, ILayerSequencer, together with their implementations, have been removed. Instead, IncrementalHierarchicLayouter has been renamed to HierarchicLayout and is now the only implementation of the hierarchic layout style. All associated interfaces and implementations from the namespace yWorks.yFiles.Layout.Hierarchic.Incremental have been moved up to yWorks.Layout.Hierarchic.

The legacy classes OrthogonalGroupLayouter and DirectedOrthogonalLayouter have been removed and their features have been incorporated into OrthogonalLayout.

The legacy class OrthogonalEdgeRouter and all associated classes have been removed.

The HVTreeLayouter class has been removed and its features have been incorporated into TreeLayout.

The DefaultGraphLayout class has been removed.

The ParentEdgeAugmentationStage class has been removed.

The Graph.MoveSubgraph method has been removed.

CopiedLayoutIGraph has been removed. An instance of the base type CopiedLayoutGraph with the same functionality can be obtained from LayoutGraphAdapter's CreateCopiedLayoutGraph factory method.

The CanLayout method has been removed from all layout algorithms. Previously it pretty much always returned true.

Renamed Layout Types

yFiles.NET 4.4

yFiles.NET 5.0

Main Interface

ILayouter

ILayoutAlgorithm

ILayouter.DoLayout

ILayoutAlgorithm.ApplyLayout

ILayouter.CanLayout

removed

Major Layout Algorithms

HierarchicLayouter

removed

HierarchicGroupLayouter

removed

IncrementalHierarchicLayouter

HierarchicLayout

DirectedOrthogonalLayouter

removed; functionality incorporated into OrthogonalLayout

OrthogonalGroupLayouter

removed; functionality incorporated into OrthogonalLayout

OrthogonalLayouter

OrthogonalLayout

OrthogonalEdgeRouter

removed; functionality incorporated into EdgeRouter

OrganicLayouter

ClassicOrganicLayout

SmartOrganicLayouter

OrganicLayout

TreeLayouter

ClassicTreeLayout

GenericTreeLayouter

TreeLayout

HVTreeLayouter

removed; functionality incorporated into TreeLayout

SALabeling

GenericLabeling

GreedyMISLabeling

removed; functionality incorporated into GenericLabeling

MultiPageLayouter

MultiPageLayout

MultiPageLayout

MultiPageLayoutResult

Changes in alphabetical order

AbstractLabelingAlgorithm

LabelingBase

ARTreeLayouter

AspectRatioTreeLayout

BalloonLayouter

BalloonLayout

BufferedLayouter

BufferedLayout

CanonicMultiStageLayouter

MultiStageLayout

CanonicMultiStageLayouter.LabelLayouter

MultiStageLayout.Labeling

CanonicMultiStageLayouter.LabelLayouterEnabled

MultiStageLayout.LabelingEnabled

CircularLayouter

CircularLayout

CompactOrthogonalLayouter

CompactOrthogonalLayout

ComponentLayouter

ComponentLayout

FamilyTreeLayouter

FamilyTreeLayout

GenericTreeLayouter

TreeLayout

GroupedShuffleLayouter

RecursiveShuffleLayout

GroupNodeHider

HideGroupsStage

IncrementalHierarchicLayouter

HierarchicLayout

yWorks.yFiles.Layout.Hierarchic.Incremental.HierarchicLayouter

yWorks.Layout.Hierarchic.HierarchicLayoutCore

IncrementalHierarchicLayouter.CreateHierarchicLayouter

HierarchicLayout.CreateHierarchicLayoutCore

IncrementalHierarchicLayouter.HierarchicLayouter

HierarchicLayout.HierarchicLayoutCore

InteractiveOrganicLayouter.DisableStages

InteractiveOrganicLayout.DisableAllStages

InteractiveOrganicLayouter

InteractiveOrganicLayout

IsolatedGroupComponentLayouter

IsolatedGroupComponentLayout

LayouterKeys

LayoutKeys

LayoutTool

LayoutGraphUtilities

MinNodeSizeStage

MinimumNodeSizeStage

MISLabelingAlgorithm

MISLabelingBase

NormalizingGraphElementOrderStage

NormalizeGraphElementOrderStage

OrganicLayouter

ClassicOrganicLayout

OrientationLayouter

OrientationLayout

PartialLayouter

PartialLayout

RadialLayouter

RadialLayout

RecursiveGroupLayouter

RecursiveGroupLayout

ReducedScopeStage

(removed)

RemoveOverlapsLayoutStage

RemoveOverlapsStage

SALabeling

GenericLabeling

SequentialLayouter

SequentialLayout

SeriesParallelLayouter

SeriesParallelLayout

ShuffleLayouter

ShuffleLayout

SingleCycleLayouter

SingleCycleLayout

SmartOrganicLayouter

OrganicLayout

SplitEdgeLayoutStage

SplitEdgeStage

SubgraphLayouter

SubgraphLayout

TreeComponentLayouter

TreeComponentLayout

TreeLayouter

ClassicTreeLayout

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.EdgeCreated event 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 numeric instabilities in ImageSupport.Gaussian1DScaled that 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 TableLayoutConfigurator which 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 RotatedSliderEdgeLabelModel that 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: Calling Insert on an empty list has thrown an exception.

MoveViewportInputMode no longer fires the DragFinishing and DragFinished events for simple clicks without any mouse movement.

NodeDefaults, EdgeDefaults and all other Defaults: it was erroneously possible to assign null to the Style property although this property is marked as NotNull. Now, the property throws an ArgumentNullException in this case.

FoldedGraph detects more carefully what has changed before invoking the methods CreateDummyEdgeAppearance and ChangeDummyEdgeAppearance of IDummyEdgeConverter. 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 LayoutGraphAdapter where 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.

Custom selection visualizations using EdgeStyleDecorationInstaller in DecorationZoomMode.Mixed or DecorationZoomMode.ViewCoordinates did not work correctly together with BridgeManager.

Explicit null values (<x:Null/>) in GraphML could lead to NullReferenceExceptions.

GraphML serialization can be forced to write a class property in element syntax using a GraphMLAttribute's WriteAsAttribute property with value XamlAttributeWriteMode.Never. Forcing a property that is shared to be written as element lead to invalid GraphML files.

If GraphEditorInputMode.Graph had 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.

Changes to IGraph.Nodes, IGraph.Edges and other collection properties on AbstractGraphWrapper implementations were not correctly propagated to the wrapped IGraph instance. In particular, this affected folding views.

If NodeDropInputMode.LeafParentsAllowed was 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.LeafParentsAllowed was true, the value of the FolderNodeParentsAllowed was ignored.

Changes to the properties CanvasControl.PrintCommandsEnabled, CanvasControl.NavigationCommandsEnabled, GraphControl.FileOperationsEnabled and GraphControl.ClipboardEnabled were 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: Fixed label placement for octilinear selfloops with the same side constraints for source and target port.

Incompatible Changes

Changes in Default Behavior

If NodeDropInputMode.LeafParentsAllowed is 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

GraphClipboard now 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 GraphClipboard now supports an optional target location for pasting and the new method GraphEditorInputMode.PasteAtLocation can be used for this end, too. In addition, ApplicationCommands.Paste now supports an optional parameter of type IPoint to provide a target location.

GraphEditorInputMode now 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 command GraphCommands.DuplicateSelectionCommand (shortcut: Ctrl-D) and the new method GraphClipboard.Duplicate can be used to duplicate selected items without altering the clipboard contents.

GraphEditorInputMode now provides a default action for reversing edges. To this end, the methods ReverseEdge and ReverseEdges have been added to GraphEditorInputMode. Also, the new command GraphCommands.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 an LabelSnapContext and is available for labels with one of these label models: SmartEdgeLabelModel, FreeEdgeLabelModel, FreeNodeLabelModel, and FreeLabelModel.

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.

GraphEditorInputMode and TableEditorInputMode provide new events LabelTextEditingStarted and LabelTextEditingCanceled that 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.

IEditLabelHelper implementations provided by the ILabel's lookup can now be used to forbid or customize the editing of individual labels. Class LabelDecorator provides a new property EditLabelHelperDecorator to customize this feature.

GraphEditorInputMode.EditLabel and TableEditorInputMode.EditLabel can now be used with SimpleLabel instances. This provides editing capabilities for dummy elements such as legends, page headers or other textual elements.

In addition, label editing has been reworked for a more consistent user experience. Especially, label editing now:

Uses the various callback methods on GraphEditorInputMode, TableEditorInputMode and IEditLabelHelper implementations 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.

Layout

Added new layout algorithm RadialLayouter that 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 AbortHandler provides methods for requesting early but graceful termination (see method Stop) and immediate termination (see method Cancel).

The following layout algorithms have at least rudimentary support for immediate termination:

Layout Algorithms

Routing Algorithms

Other Algorithms

BalloonLayouter

CircularLayouter

CompactOrthogonalLayouter

DirectedOrthogonalLayouter

GenericTreeLayouter

GRIP

HierarchicGroupLayouter

HierarchicLayouter

IncrementalHierarchicLayouter

OrganicLayouter

OrthogonalGroupLayouter

OrthogonalLayouter

PartialLayouter

RadialLayouter

RecursiveGroupLayouter

SmartOrganicLayouter

BusRouter

Polyline.EdgeRouter

OrganicEdgeRouter

OrthogonalEdgeRouter

GreedyMISLabeling

SALabeling

The following layout algorithms also support graceful early termination:

Layout Algorithms

Routing Algorithms

Other Algorithms

HierarchicGroupLayouter

HierarchicLayouter

IncrementalHierarchicLayouter

OrganicLayouter

SmartOrganicLayouter

Polyline.EdgeRouter

SALabeling

Added support for parallel execution of computationally intensive tasks.Layout algorithms SmartOrganicLayouter and OrganicLayouter may take advantage of multiple threads for layout calculations. Parallel execution is enabled using the algorithms' MultiThreadingAllowed property.Interface ITaskExecutor and factory class TaskExecutorFactory make 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

BalloonLayouter

CircularLayouter

CompactOrthogonalLayouter

ComponentLayouter

DirectedOrthogonalLayouter

GenericTreeLayouter

IncrementalHierarchicLayouter

OrthogonalGroupLayouter

OrthogonalLayouter

RadialLayouter

RecursiveGroupLayouter

SmartOrganicLayouter

TreeLayouter

Polyline.EdgeRouter

SelfLoopLayouter

GreedyMISLabeling

SALabeling

InsetsGroupBoundsCalculator

MinimumSizeGroupBoundsCalculator

SmartOrganicLayouter: Added support for partition grid layout. See PartitionGrid.

Minor Features Added

Viewer

GraphEditorInputMode got 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 the CyclicSelectionRecognizer property to EventRecognizers.Never.

ItemDropInputMode is a new DropInputMode that facilitates subclasses that support preview and snapping of the dragged item as well as highlighting potential drop targets.NodeDropInputMode and StripeDropInputMode have been refactored to use ItemDropInputMode as base class.

ItemHoverInputMode is a new IInputMode that fires events when the mouse enters or leaves the visualization of a graph item.

GraphEditorInputMode and GraphViewerInputMode provide a new CanvasClicked event to detect clicks on an empty canvas location.

Node ports can now be moved by dragging their IHandle.

GraphClipboard has new properties CopyItems, IndependentItems, and DependentItems that allow for restricting the types of items that can be copied at all, independently from their owners, or implicitly through their owners, respectively.

GraphViewerInputMode and GraphEditorInputMode: Their ClickInputMode now delivers both left and right clicks.

GraphViewerInputMode: The click hit test order can now be configured by property ClickHitTestOrder.

GraphEditorInputMode and GraphViewerInputMode provide an explicit hit test order for double clicks that can be changed through the DoubleClickHitTestOrder property. By default, this hit test order prefers labels over other graph elements.

Added new method ClickInputMode.PreventNextDoubleClick that can be used in event handlers for single clicks to prevent that this click can become part of a double click event.

NodeDropInputMode can 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.ReparentToLeavesAllowed is 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.OrthogonalBendRemoval enables/disables this feature.

GraphViewerInputMode now supports multi-selection via Ctrl+Click and marquee selection. The latter is disabled by default.

OverviewInputMode and the GraphOverviewControl have been optimized to improve the user experience when used on touch devices.

OverviewInputMode can 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 GraphModelManager to allow for easier customizations. Property UseHierarchicNesting was 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.

FoldingManager now offers two convenience methods, UpdateViewStates(INode) and UpdateViewStates(IEdge), that will trigger update calls on IDummyNodeConverter and IDummyEdgeConverter for 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 properties IntegratedEdgeLabeling, IntegratedNodeLabeling, and NodeLabelingPolicy.

BalloonLayouter: Added support for different policies to align nodes having the same root node. See new property ChildAlignmentPolicy.

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 property InterleavedMode.

IncrementalHierarchicLayouter: Improved edge label placement. Edge labels with preferred placement at source/target are placed closer to the corresponding node. Additionally, SimplexNodePlacer offers the option to place adjacent edge labels in a compact, stacked style. See new property LabelCompaction.

Polyline.EdgeRouter: Added a fine-granular configuration option to weigh the crossing costs for each label using the data provider look-up key EdgeRouter.LabelCrossingCostFactorDpKey.

Polyline.EdgeRouter: Added property IgnoreInnerNodeLabels that 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 property EdgeOrderComparator.

GenericTreeLayouter: When enabling GenericTreeLayouter.IntegratedNodeLabeling and/or GenericTreeLayouter.IntegratedEdgeLabeling, the respective labels will be taken into account during the calculation of group bounds.

DelegatingNodePlacer: Added key DelegatingNodePlacer.LeftRightDpKey that allows choosing on which side a node is placed.

LabelLayoutTranslator: Added properties WriteBackRelativeEdgeLabelLocation and WriteBackRelativeNodeLabelLocation that allow a core layouter to specify new node or edge label locations relative to the label's owner.

LabelLayoutKeys: Added key IGNORE_LABEL_KEY that allows specifying which edge and node labels should be ignored during layout calculations.

Added new class OrganicRemoveOverlapsStage that removes node overlaps while respecting a specified minimal node distance. Unlike the approach implemented in class RemoveOverlapsLayoutStage, this approach tries to keep the original layout structure, i.e., it tries to keep the geometric distance between the nodes.

Improvements

Viewer

Various performance improvements for the rendering and the selection handling. This affects, amongst others, ShapeNodeStyle and styles that use a GeneralPath.

GraphEditorInputMode.DetailSelectionRecognizer is 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.CanvasResources and yWorks.yFiles.GraphResources can be added to the application project and override strings the library uses.

GraphEditorInputMode and GraphViewerInputMode don't select or focus graph items styled with a void style (VoidNodeStyle, VoidEdgeStyle, VoidLabelStyle, and VoidPortStyle). The new property VoidStylesIgnored specifies whether this feature is enabled.

GraphEditorInputMode and GraphViewerInputMode: the new protected method ShouldSelect can be overridden to determine whether an item can be selected in general.

DropInputMode: Added property LastDragEventArgs.

OverviewInputMode: The new property Margins specifies margins for the visible area of the bound GraphOverviewControl. The new protected method UpdateVisibleArea provides further means for customizing the visible area.

PortRelocationHandles now triggers the EdgePortsChanged event of the GraphEditorInputMode.

EdgeStyleDecorationInstaller can now be used with self loops without bends, too.

ContextConfigurator: The new property Zoom determines 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 properties Nodes, Edges, etc. now support the methods Remove and Clear to remove graph items from the graph. Note that calling the method Add is still not allowed.

GraphModelManager: New callback method OnGraphChanged.

LayoutExecutor: The new property ConsiderViewportLimiter can be enabled to let the target viewport after a layout respect the ViewportLimiter of the GraphControl.The ViewportAnimation has a new property ConsiderViewportLimiter for the same purpose.

LayoutGraphAdapter now adds data providers that map each node, edge and label of a LayoutGraph to their corresponding IModelItem in the original IGraph. Especially, these data providers are available if a layout is run with a LayoutExecutor or the convenience methods LayoutExtensions.MorphLayout and LayoutExtensions.ApplyLayout.

GeomSupport: The new method CreateSmoothedPath creates 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 overriding IconLabelStyleRenderer.ShouldHitTestIcon.

CanvasControl: Method FitContent now respects the ViewportLimiter. This might result in zoom levels greater than 1.0.

DefaultDummyEdgeConverter now synchronizes the Tag property of the first label if label synchronization is enabled.

GraphCopier has been improved to facilitate manipulation of the copied items:

The new events NodeCopied, EdgeCopied, LabelCopied, and PortCopied are dispatched after a model item has been copied.

The method GetOrCreateCopy<T> is now public to facilitate copying of, for example, node tags.

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 property ParentNodeDetection.

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 method Cancel that can be used by subclasses to cancel the search.

Cycles: Improved method FindCycle to stop the search as soon as the first cycle has been found.

GraphConnectivity: Improved method MakeBiconnected to work with graphs with self-loops (i.e. edges whose source node is also the target node).

Groups: Replaced recursive implementation of method BiconnectedComponentGrouping with 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 edges ILayoutDataProvider.GetEdgeData now returns an IEdgeData of the new type EdgeDataType.RedirectedGroupEdge.

SmartOrganicLayouter: Now uses a more sophisticated approach to remove node overlaps if the scope is set to Scope.All and the quality to time ratio is greater than or equal to 0.7 (property QualityTimeRatio).

InteractiveOrganicLayouter: Method StartLayout now takes advantage of multiple threads for layout calculation which may reduce the required runtime.

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.

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.

DirectedOrthogonalLayouter and OrthogonalGroupLayouter: Added optimization step that reduces the number of perceived bends. See new property PerceivedBendsOptimization.

OrthogonalLayouter, OrthogonalGroupLayouter and DirectedOrthogonalLayouter: Added optimization step that aligns degree one nodes (i.e. nodes with one incident edge) that have the same neighbor. See new property AlignDegreeOneNodes.

ComponentLayouter: Added the following new component arrangement strategies to ComponentArrangementStyles that are suitable for components with highly different sizes: MultiRows, MultiRowsCompact, MultiRowsHeightConstrained, MultiRowsHeightConstrainedCompact, MultiRowsWidthConstrained, and MultiRowsWidthConstrainedCompact

Demos

The new demos Demo.yFiles.Graph.Bpmn.View and Demo.yFiles.Graph.Bpmn.Editor are more complex demos that show how yFiles can be customized to create ambitious BPM Editor and BPM Viewer.

The new demo Demo.yFiles.Graph.Events shows how to register to the various events provided by the graph, the input modes, and the GraphControl.

The new demo Demo.yFiles.Graph.Input.MoveUnselectedNodes shows how to use and configure a modified MoveInputMode which lets the user move nodes without selecting them first.

The new demo Demo.yFiles.Graph.Input.LabelEditing shows 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.GraphEditor now supports changing the style of a label, drag'n'drop ports with a SimplePortStyle and editing nodes with a TableNodeStyle.

The new demo Demo.yFiles.Layout.AbortHandler shows how the new class AbortHandler can be used to stop a layout algorithm which is running in the background.

The demo Demo.yFiles.Layout.InteractiveOrganic was simplified. Now, it uses the events provided by MoveInputMode instead of a custom IPositionHandler implementation.

The demo Demo.yFiles.Graph.IntegratedNodeStyle demonstrates 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.HandleProvider now also shows how to implement a handle which supports rotation of labels.

The new step 21 Bridge Support of the Style Tutorial shows how to add support for bridges to a custom edge style.

Various aspects of the InputDemos have been improved: more concise sample code, more meaningful descriptions and comments, and nicer overall appearance.

Incompatible Changes

Changes in Default Behavior

GraphEditorInputMode now by default supports the new GraphCommands.DuplicateCommand that is bound to keyboard shortcut Ctrl-D. If this behavior is undesired new behavior, the DuplicateAllowed property can be set to false.

TableEditorInputMode now 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's IndependentItems to None.

GraphEditorInputMode now by default allows for reversing selected edges using the Ctrl-R keyboard shortcut and the new GraphCommands.ReverseEdgeCommand. This new behavior can be turned off by setting the EdgeReversalAllowed property to false.

GraphEditorInputMode and GraphViewerInputMode: 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' AutoCleanup property 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: Method FitContent now respects the ViewportLimiter. This might result in zoom levels greater than 1.0.

GraphEditorInputMode's NodeCreated event may now report nodes that are not part of the graph, when the user has dropped a node via NodeDropInputMode and the new NodeDropInputMode.FolderNodeParentsAllowed property is enabled. By default this feature is disabled, though.

IReparentNodeHandler's IsValidParent method may now also be queried if the new GraphEditorInputMode.ReparentToLeavesAllowed property 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 of GraphEditorInputMode.

IValueSerializerContext.Instance inside 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 the Owner property on the GraphMLValueSerializerContext implementation of this interface.

GraphMLIOHandler.QueryReferenceId now never is fired for MarkupExtensions and other proxy objects for serialization, only for the original object references.

Polyline.EdgeRouter: Method DoLayout now throws an ArgumentException if there is a node with zero width or height in the given graph.

ComponentLayouter: Property PreferredLayoutSize now throws an ArgumentException when 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, and LabelLayoutDataRefinement.

LabelCandidateDescriptor: The default values of the properties EdgeOverlapPenalty and NodeOverlapPenalty have been changed to 0.0. Values greater than 0.0 trigger 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.

MoveInputMode accepts mouse hovers with the Shift key held down again. This restores the default behavior in earlier versions of yFiles.NET 4.3.

GraphEditorInputMode and GraphViewerInputMode: By default, graph items styled with a void style (VoidNodeStyle, VoidEdgeStyle, VoidLabelStyle, VoidPortStyle) won't be selected or get the focus.

GraphEditorInputMode's ClickHitTestOrder property default value has changed. Now it does not contain the redundant GraphItemTypes.All as the last element in the array anymore.

GraphViewerInputMode: By default, clipboard commands are now disabled. This can be controlled with the new property ClipboardCommandsEnabled.

The default keyboard shortcut for deselecting elements (GraphCommand.DeselectAllCommand) has been changed to Ctrl+Shift+A. Ctrl+D is now the default shortcut for duplicating selected elements (GraphCommand.DuplicateSelectionCommand). Duplicating elements can be disabled via the DuplicateAllowed property.

GraphEditorInputMode.ShouldBeMarqueeSelected is no longer queried by the Paste command to determine the items which should be selected after paste. Instead, the new method GraphEditorInputMode.ShouldBeSelectedAfterPaste is queried. Note that GraphEditorInputMode.ShouldBeMarqueeSelected still 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 new PasteSelectableItems property in GraphEditorInputMode and the corresponding ShouldBeSelectedAfterPaste method.

The hit test order for double clicks in GraphEditorInputMode and GraphViewerInputMode is now controlled through the separate DoubleClickHitTestOrder property. By default, this hit test order prefers labels over other graph elements.

If ClickInputMode is 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 for TapInputMode and single/double taps.

The Rotate handle visualization is now a single circle, its very thin central point has been removed.

The segment index for label model parameters of SliderEdgeLabelModel and SideSliderEdgeLabelModel now is related to the visible segments for edges styled with PolylineEdgeStyle.

If an IEditLabelHelper implementation is present in an ILabel's lookup, its EditLabel method 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 return true. Additionally, the predicate method GraphEditorInputMode.ShouldLabelBeEdited always has to return true, 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.EditLabel for 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 IEditLabelHelper implementation is present in an ILabeledItem's lookup, its AddLabel method is called to determine whether a label may be added and provide a suitable label instance. Additionally, the predicate method GraphEditorInputMode.ShouldLabelBeAdded always has to return true, 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 an IEditLabelHelper implementation usually should allow editing of label instances that it has created itself in AddLabel.

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.

ContextConfigurator now provides separate Scale and Zoom properties. The Scale property now just scales the complete resulting output by the specified scale factor, including zoom invariant items such as selection decorations. The Zoom property acts as logical zoom factor, e.g. for zoom dependent rendering of items. In contrast, earlier versions the Scale property acted like the CanvasControl's zoom property, i.e. zoom invariant items were not scaled. To get the old behavior, set Scale and Zoom to the same value.

API Changes

Changed SnapLine to support non-orthogonal snap lines as well: its properties From and To have been changed from type double to PointD, its property Orientation was removed, and its constructors have been changed accordingly.

Orthogonal snap lines are now modeled by class OrthogonalSnapLine. It extends SnapLine and provides the property Orientation. Existing API uses either SnapLine or OrthogonalSnapLine, depending on whether it works only with orthogonal snap lines or not.

As a consequence, in class SnapLineSnapResult, the property SnapLine returns a non-orthogonal SnapLine and the property Delta returns a PointD instead of a double. API related to GraphSnapContext still works only with orthogonal snap lines and uses OrthogonalSnapLine.

The Key property on SingleLineSnapLineTemplatePaintable, FixedDistanceSnapLineTemplatePaintable, and InBetweenSnapLineTemplatePaintable, 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.

GraphClipboard's protected method Copy(IGraph, Predicate>IModelItem>, IGraph, ElementCopiedDelegate) which was called by Cut, Copy, and Paste to invoke the GraphCopier has been split: Copy(IGraph, Predicate >IModelItem>, IGraph, ElementCopiedDelegate) now is called only by Cut and Copy. Paste now invokes the new method Paste(IGraph, Predicate >IModelItem>, IGraph, ElementCopiedDelegate, Predicate >IModelItem>).

The type of GraphMLAttribute's Serializable property has been changed from bool to the enum GraphMLSerializationMode.

GraphEditorInputMode and TableEditorInputMode: return value of callback methods OnAddLabel and OnEditLabel has been changed from void to bool. The return value should specify whether the operation in question was successful.

Bugfixes

Viewer

FoldedGraph detects more carefully what has changed before invoking the methods CreateDummyEdgeAppearance and ChangeDummyEdgeAppearance of IDummyEdgeConverter. 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 LayoutGraphAdapter where label candidates for edge labels were not always determined correctly.

Fixed LayoutGraphAdapter producing threading issues when PortCalculator was 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.

When using an IEditLabelHelper and adding a label interactively, the helper's EditLabel callback was called instead of AddLabel.

Newly added labels could have had an empty size when an IEditLabelHelper instance 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 MoveInputMode created by MainInputMode.CreateMoveUnselectedInputMode changed the cursor to indicate a movable object even when the modifierRecognizer disabled 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.

CreateEdgeInputMode now copies the dummy edge's tag to the created edge. This could have caused issues when the EdgeCreationStarted was 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, and SideSliderEdgeLabelModel might have disappeared when one or more edge segments were hidden under the source or target node.

GeneralPath#Transform and other GeneralPath methods using Matrix2D applied the transformation matrix incorrectly in the case of a rotation.

BevelNodeStyle: Fixed update of drop shadow after Radius has been changed.

IconLabelStyle: Method GetBounds in IconLabelStyleRenderer returned a valid rectangle even if the label layout was invalid. As a consequence, IsVisible erroneously returned true for labels with invalid bounds.

The lookup of CollapsibleNodeStyleRenderer was missing the correct results for IGroupBoundsCalculator, ISizeConstraintProvider, and IShapeGeometry.

The lookup of ShadowNodeStyleDecoratorRenderer was missing the correct result for IShapeGeometry.

The Name property of the GraphMLAttribute was not considered during deserialization.

Write events in GraphML were not always raised.

After setting an ICanvasObjectGroup's Visible property to false the group was still visible.

CanvasControl.EnsureVisible hasn't worked for bounds larger than the current viewport.

Setting the view point on a CanvasControl with a width or height of 0.0 could cause an exception if a ViewportLimiter was enabled.

GraphCopier threw an ConcurrentModificationException if the source and the target graph are identical.

Prevent an ArgumentNullException in the print preview of the CanvasControl.

GraphEditorInputMode and GraphViewerInputMode now respect the MultiSelectionRecognizer for extending an existing selection via marquee.

IncrementalHierarchicLayouter: Fixed broken edge routes that may occur for edges with labels if SimplexNodePlacer's option EdgeStraighteningOptimization is 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 possible IndexOutOfRangeException in PCListOptimizer that 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.

BusRouter: Fixed NullReferenceException in BusRepresentations that could appear if the input graph contains overlapping nodes.

OrganicEdgeRouterModule: Fixed option Use existing bends which was ignored in previous versions.

FixedGroupLayoutStage: Fixed canLayout which changed the structure and layout of the graph.

IncrementalHierarchicLayouter: Fixed possible IndexOutOfRangeException if PortConstraints are used together with PortCandidateSets.

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 method NearestCommonAncestor that sometimes caused wrong results if one of the specified nodes is the ancestor of the other node.

InsetsGroupBoundsCalculator: Fixed method CalculateBounds to consider only the given child nodes and all edges between those child nodes instead of all nodes and all edges in the graph.

GenericTreeLayouter: Fixed NullReferenceException that occurred when using LayeredNodePlacer as default node placer.

LayoutTool: Fixed calculation of lower width bound in method ArrangeRectangleRows. 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.

IncrementalHierarchicLayouter and RankAssignments: Fixed possible NullReferenceException that 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 rare NullReferenceException that mainly appears if there are overlapping nodes.

PartialLayouter: Fixed bug that may cause broken edge routes for edges incident to incremental group nodes if option RouteInterEdgesImmediately is enabled.

CompactOrthogonalLayouter: Fixed possible ArgumentException caused by nodes without node-ids. This problem may only appear if the inter edge router is set to ChannelInterEdgeRouter.

yFiles.NET 4.3.0.5 - Changes Since 4.3.0.4

Bugfixes

CanvasControl: In rare cases, calling Invalidate did 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 of RotatedSliderEdgeLabelModel. 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: The EdgesAt methods erroneously returned edges that were marked as hidden by the EdgePredicate. The methods Degree, InDegree, and OutDegree are based on these methods and were affected, too.

GraphSnapContext: Snapping nodes to vertical edge segments was not working if NodeToEdgeDistance was set to 0.

CollapsibleNodeStyleDecorator and ShadowNodeStyleDecorator: Lookup requests for ISizeConstraintProvider, IGroupBoundsCalculator, and IShapeGeometry are now correctly delegated to the wrapped style.

The EdgeStyleDecorationInstaller did not copy the tags of dummy ports and edges used when displayed in view coordinates (ZoomMode = DecorationZoomMode.ViewCoordinates).

Automatic Layout

OrthogonalLayouter failed almost always with an ArrayIndexOutOfRangeException if 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: Fixed NullReferenceException that may appear for graphs containing isolated nodes with self-loops.

TreeReductionStage: Fixed wrong handling of group nodes which may cause a WrongGraphStructure exception as well as broken routes of edges incident to group nodes.

Fixed NullReferenceException when using AssistantPlacer together 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: method AddNamespace had no effect, and adding a custom schema with AddSchemaLocation triggered an exception.

ContextConfigurator: property Scale did 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: Fixed CanLayout which changed the structure and layout of the graph.

PartialLayouter: Fixed broken edge routes that may appear if option EdgeRoutingStrategy is set to Octilinear.

MultiPageLayouter: Fixed possible InvalidCastException if group node insets are specified with class yWorks.yFiles.Util.Geom.Insets.

IncrementalHierarchicLayouter: Fixed broken edge routes that may occur for edges with labels if there are "critical" edges, see CriticalEdgeDpKey.

SimplexNodePlacer: Fixed broken edge routes that may occur for edges with labels if option StraightenEdges is enabled.

IncrementalHierarchicLayouter: Fixed ArgumentException (Graph is not acyclic) in SimplexNodePlacer that could appear when sequence constraints were added to a graph with swimlanes and group nodes.

BorderLine: Fixed rare ArgumentException that was caused by numerical instability.

IncrementalHierarchicLayouter: Fixed ArgumentException in ConstraintIncrementalLayerer that could appear when layer constraints were added in incremental mode.

CircularLayouter: Fixed possible NullReferenceException when layout style is set to BccIsolated and consider node labels is enabled.

AbstractLabelingAlgorithm: Fixed bug that causes poor results if option RemoveEdgeOverlaps is enabled and the labels should be placed on the edge.

Known issues

GraphML serialization of node label model parameters that are created with FreeNodeLabelModel.CreateNodeRatioAnchored is 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 after Radius has been changed.

FilteredGraphWrapper.Dispose did not clean up all event listeners.

Node ports could not be moved by dragging their IHandle.

Image export: Custom selection visualizations created with NodeStyleDecorationInstaller, LabelStyleDecorationInstaller and EdgeStyleDecorationInstaller in zoom invariant mode were not placed correctly.

Automatic Layout

IncrementalHierarchicLayouter: Fixed ArgumentException that may appear for graphs containing nodes with fixed coordinates.

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 if TableLayoutConfigurator is 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 possible IndexOutOfRangeException if 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 possible NullReferenceException when routing only a subset of edges without adding a DataProvider to 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 an ArgumentException if a grid is specified (see option Grid).

OrthogonalGroupLayouter: Fixed bug that may cause wrong group bounds calculation if a group node label lies outside of the group node.

PartialLayouter: Fixed possible NullReferenceException if the algorithm is applied to a graph with partition grid (see PartitionGrid).

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

LayoutGraphAdapter provides now the original Tag data 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#BackgroundStyle was not serializable.

Manually bracketing undo edits with BeginEdit and EndEdit might have led to exceptions when folding was active.

OrthogonalLayouter: Fixed exception that may appear for graphs with nodes of high degree.

yFiles.NET 4.3 - Changes Since 4.2.0.1

Major Features Added

Automatic Layout

Class yWorks.yFiles.Layout.Router.Polyline.EdgeRouter is 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 class yWorks.yFiles.Layout.Hierarchic.Incremental.RoutingStyle.

LayoutExecutor can now safely handle concurrent layout requests. By default an already running layout will be short-cut and the next layout request will be processed. Property SequentialExecution can be set to false to revert to the old (unsafe) behavior. The new Stop method and the IsRunning property can also be used in this context.

New classes NodeStyleDecorationInstaller, EdgeStyleDecorationInstaller, and LabelStyleDecorationInstaller allow 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 option AutoFlippingEnabled to specify whether or not edge labels should be automatically flipped if they would be upside-down.

AbstractLabelingAlgorithm: Added option AutoFlippingEnabled to specify whether or not edge labels associated with a "free" label model should be automatically flipped if they would be upside-down.

Improvements

Optionally, LayoutExecutor uses WaitInputMode while waiting during the calculation of a layout.

Added callback method SetEdgePortLocation to LayoutGraphAdapter that is called while assigning a new location to a port that is owned by an edge.

Changing the event recognizers of an IInputMode after the mode has been installed has now an effect in all input modes.

Improved performance of table rendering and interaction.

Refactored MoveLabelInputMode to make customizations easier. The moved label is now accessible and various new protected methods provide fine-grained control of the behavior.

MoveLabelInputMode now 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 functions ShouldCut and ShouldCopy were not used for the default cut and copy operations provided by GraphEditorInputMode and GraphControl.

Child input modes of GraphViewerInputMode can now be changed similar to GraphEditorInputMode.

Added explicit extension method IGraph.CreateNode(PointD,INodeStyle).

GraphEditorInputMode and GraphViewerInputMode provide a new CanvasClicked event to detect clicks on the empty canvas area.

Automatic Layout

OrthogonalGroupLayouter supports labels at edges incident to group nodes.

IncrementalHierarchicLayouter now 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 if WeightedCycleRemoval is enabled.

PartialLayouter now considers edge ports when calculating the barycenter of a component (if its property PositioningStrategy is set to SubgraphPositioningStrategy.Barycenter).

PartialLayouter: Reduced cases where the result contains overlapping node elements.

PartialLayouter calculates improved routing if option RouteInterEdgesImmediately is enabled and generally for edges between fixed elements.

SmartOrganicLayouter: Fixed nodes are no longer moved by a fixed offset if scope is set to Scope.Subset.

RecursiveGroupLayouter: Fixed IllegalStateException that 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 functions ShouldCut and ShouldCopy are now taken into account for the default cut and copy operations provided by GraphEditorInputMode and GraphControl.

Concurrently executing layouts using LayoutExecutor will now result in the subsequent executions waiting for the previous execution to finish. Property SequentialExecution can be set to false to revert to the old (unsafe) behavior.

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.MultiPageLayouter is 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.The Demo.yFiles.Layout.MultiPage shows how to use class MultiPageLayouter to sub-divide large graphs into smaller bits of navigable information.[To the corresponding section in the yFiles.NET Developer's Guide...]

Minor Features Added

DefaultEdgeIntersectionCalculator now 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 properties CropAtPort, ExtraCropLength, and callback method GetPortGeometry.

Automatic Layout and Analysis

The orthogonal layout algorithms OrthogonalLayouter, OrthogonalGroupLayouter, and DirectedOrthogonalLayouter now support specifying a minimum first/last segment length. See the corresponding descriptions of OrthogonalLayouter.EdgeLayoutDescriptorDpKey, OrthogonalGroupLayouter.EdgeLayoutDescriptorDpKey, and DirectedOrthogonalLayouter.EdgeLayoutDescriptorDpKey, respectively.

SimplexNodePlacer: Added an algorithm that reduces the number of bends. This option can be set using property BendReductionEnabled and is enabled by default. Note: using this option increases the runtime of the IncrementalHierarchicLayouter. If the runtime exceeds the maximal duration the number of bends is not reduced.

Added abstract class AbstractPortConstraintOptimizer, a partial implementation of interface IPortConstraintOptimizer, to minimize the effort required to modify the port assignment after the sequencing phase of a hierarchic layout.

TreeLayouter: When using port styles BorderCenter and BorderDistributed together with child placement policies LeavesStacked, LeavesStackedLeft, LeavesStackedRight, and LeavesStackedLeftAndRight edges 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 style BorderDistributed.

AbstractLabelingAlgorithm: Added DataProvider key LabelModelDpKey that can be used to temporarily specify the model of labels that is used by the labeling algorithm.

Automatic Layout

Demos

Added new demo Demo.yFiles.Graph.EdgeToEdge that shows how to enable and make use of the new edge-to-edge connection feature.

Added new Demo.yFiles.Layout.Multipage that shows how to use class MultiPageLayouter to sub-divide large graphs into smaller bits of navigable information.

Incompatible Changes

The license file version has been changed to 1.1. 1.0 license 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 contact sales@yworks.com if you did not receive or lost your updated license file and attach your old license file.

IImageNodeStyle's Outline property 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 in GeneralPathNodeStyle where 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 GetTargetPortCandidateProvider and GetSourcePortCandidateProvider in GraphEditorInputMode changed their signatures to accept IPortOwner instances instead of INode instances. This was required to allow for interactive edge-to-edge connections. Overriding methods need to be adjusted accordingly.

Method ShowHitNodeCandidatesOnly in class PortRelocationHandle has been renamed to ShowHitPortOwnerCandidatesOnly to 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 new EdgeToEdgeConnectionsAllowed property can be set to false.

Previously it was possible to cast DefaultEdgeIntersectionCalculator.Instance to 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, and InvalidCenterBrush have been removed from type DefaultPortCandidateDescriptor, since the could not be used any more since 4.0. The new method SetTemplate can be used now to set customized template visualizations instead.

DefaultPortCandidateDescriptor previously used the CurrentPortCandidate as the Content for the created TemplatePaintables. This has been corrected to now use the CandidateTag of the IPortCandidate being rendered.

Since with this release LayoutGraphAdapter translates IMapper instances in the graph's mapper registry as IDataMap implementations that enable data write-back scenarios, the code that deals with IncrementalHierarchicLayouter.LayerValueHolderDpKey now behaves differently. In older releases the IIntValueHolder interface was queried from the mapper to write back the layer data. Now the data is written directly into the mapper and the IIntValueHolder implementation is ignored.

Automatic Layout and Analysis

yWorks.yFiles.Algorithms.ShortestPaths: Fixed an error in method FindShortestUniformPaths(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: Method FindAllCycleEdges(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 LayoutExecutor when animation and grouping were both disabled.

yWorks.yFiles.Algorithms.Groups.EdgeBetweennessClustering: The parameters minGroupCount and maxGroupCount had no effect.

Automatic Layout

LayoutExecutor did not provide the GraphControl's selection to the layout engine.

Fixed NullReferenceException in PartitionGridLayoutStage if 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 stage yWorks.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.Table provides 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 the yWorks.yFiles.UI.Drawing.ITableNodeStyle interface.[To the corresponding section in the yFiles.NET Developer's Guide...]

New dedicated InputMode yWorks.yFiles.UI.Input.TableEditorInputMode which can be used either standalone or as a child mode of yWorks.yFiles.UI.Input.GraphEditorInputMode and 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...]

The Demo.yFiles.Graph.TableEditor demo demonstrates the capabilities of table visualization editing, as well as automatic layout of swimlane diagrams.

Visual enhancements

Added new edge label models RotatedSliderEdgeLabelModel and RotatedSideSliderEdgeLabelModel which 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 RotatedSliderEdgeLabelModel or RotatedSideSliderEdgeLabelModel) 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.PartialLayoutModule represents 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.BusRouterModule represents 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 the MonotonicPathRestriction property.

IncrementalHierarchicLayouter: Added data provider key CriticalEdgeDpKey that 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 option StraightenEdges which 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 for PortCandidateSets that allow to specify the available port candidates at a node.

Minor Features Added

CanvasControl now offers a method that yields the Visual for a given ICanvasObject. This can be leveraged by UI testing tools.

New class NodeStylePortStyleAdapter can be used to reuse existing INodeStyle implementations for port visualization.

GridPaintable's pens can now be customized for all grid styles.

Automatic Layout

RecursiveGroupLayouter: Added data provider key GroupNodeLayouterDpKey that 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 the ILayouter instance 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. See ChildPlacementPolicy.

TreeLayouter: Added new global layering option that ensures that large nodes never span more than their layer. See EnforceGlobalLayering.

OrthogonalEdgeRouter: Added support for considering node labels, see ConsiderNodeLabels.

CircularLayouter: Added data provider key CircleIdHolderDpKey that allows to obtain a mapping between nodes and the corresponding circle IDs.

OrthogonalEdgeRouter: Added new routing style RoutingStyle.Balanced which is based on the existing RoutingStyle.Prefermiddle but draws segments between bends of the same direction (U-style turns) the short way.

Improvements

DropInputMode has 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 LayoutExecutor and related convenience methods.

WaitInputMode is automatically enabled while file I/O commands are executed.

GraphEditorInputMode.DeleteSelection now doesn't create an empty Undo edit if nothing would be deleted at all.

CreateEdgeInputMode: UpdateEdgeStyle is now called after the source port candidate has been determined.

Mouse2DEventTypes now 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.MixedLayout demo that shows how to recursively apply different layout algorithms to the contents of group nodes.

Added new Demo.yFiles.Layout.PartialLayout demo that presents specific setup of the new partial layout support in conjunction with Circular, Hierarchic, Organic, and Orthogonal Layout.

The new Demo.yFiles.Layout.LayerConstraints demo shows how to use layer constraints with the IncrementalHierarchicLayouter to restrict the node layering.

The new Demo.yFiles.Layout.SequenceConstraints demo shows how to use sequence constraints with the IncrementalHierarchicLayouter to restrict the node sequencing.

The new Demo.yFiles.Layout.PortCandidate demo 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.LogicGate demo 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.GenericTree demo 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.EdgeLabeling demo shows how to configure different edge label models as well as how to apply the generic edge labeling algorithm.

The new Demo.yFiles.Layout.NodeLabeling demo shows how to use the node label models in conjunction with the yFiles generic labeling algorithms.

Added new Demo.yFiles.Graph.BusinessProcessDiagram demo 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.BusRouterDemo shows 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 UseCurrentItemForCommand property was being used.

NavigationInputMode.ExitGroup raised the GroupEntered event instead of the GroupExited event.

CreateEdgeInputMode started 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 CreateEdgeInputMode made cleaning up a GraphControl impossible after an edge had been created interactively using that mode with snapping disabled.

CreateEdgeInputMode's GetSourcePortCandidate method was sometimes invoked with the wrong location.

MouseHoverInputMode now reacts during mouse drags, too and method Show respects 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.ValidHitTestable was not always queried in certain double click configurations.

Minimum node size was not automatically provided to the algorithms library by LayoutGraphAdapter.

Animator.AnimateAndWait did not update the control if called from the event dispatching thread.

Incompatible Changes

When LayoutExecutor.Duration is 0, the viewport is now only moved when AnimateViewport is true.

yWorks.yFiles.Algorithms.Util.DoubleObjectPQ: Changed the type of parameter priority from int to double for methods DecreasePriority, IncreasePriority and ChangePriority.

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.

Mouse2DEventTypes has 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.

LayoutGraphAdapter can optionally create copies of node and edge styles during layout calculation. This is controlled by the new property CopyStyles. Utility class LayoutExecutor enables this feature if the layout is performed in a different thread.

The Cut command on GraphControl is now only enabled if DeletableItems allows 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 ClickInputMode as well as GraphEditorInputMode and GraphViewerInputMode.

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.

Fixed yWorks.yFiles.UI.Model.HierarchyExtensions.GetNearestCommonAncestor() not returning correct ancestor in some cases.

SetLeaf() and set LocalRoot not included in Undo queue.

yWorks.yFiles.UI.Model.GroupedGraphExtensions.GroupNodes(IEnumerable<INode>) called with empty enumerable calls CreateGroupNode() 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 DesignerSerializationVisibility for collection properties is now consistent with WPF and Silverlight XAML rules:

If the property is specified as a content property with ContentPropertyAttribute:

If DesignerSerializationVisibility is not specified or DesignerSerializationVisibility.Content is specified, only the content is (de)serialized.

If DesignerSerializationVisibility.Hidden is specified, the property is ignored.

If DesignerSerializationVisibility.Visible is specified and the property is read-write, the collection object itself is (de)serialized, otherwise the property is ignored.

If the property is not specified as a content property with ContentPropertyAttribute:

If DesignerSerializationVisibility.Content is specified for either read-write or read-only collection properties, only the content is (de)serialized.

If DesignerSerializationVisibility.Hidden is specified, the property is ignored.

If DesignerSerializationVisibility is either not specified or set to DesignerSerializationVisibility.Visible for read-write collection properties, the collection object is (de)serialized.

If DesignerSerializationVisibility is either not specified or set to DesignerSerializationVisibility.Visible for read-only collection properties, the property is ignored.

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.OrthogonalEdgeEditingContext now 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.IOrthogonalEdgeHelper determines 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.GraphSnapContext supports 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.ISnapLineProvider and 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.GraphMLIOHandler has been reimplemented from scratch to greatly simplify customizations to the process of creating and parsing GraphML.

Namespace yWorks.yFiles.GraphML.Xaml contains 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.NodeDropInputMode has 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.ShinyPlateNodeStyle provides a nice, clean modern look with a high-performance drop shadow.

Style class yWorks.yFiles.UI.Drawing.BevelNodeStyle got 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.IncrementalHierarchicLayouter provides enhanced support for swimlane layout through comprehensive new partition grid concept.The yWorks.yFiles.Layout.Hierarchic.Incremental.PartitionGrid class 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.IPortCandiate and 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 foreach construct.

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.IncrementalHierarchicLayouter now 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 method CreateLayerConstraintFactory.

yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter: Added support for specifying a preferred time limit (in milliseconds) for the layout (see property MaximalDuration).

yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter: The layouter now also considers minimum sizes for group nodes as given by the DataProvider yWorks.yFiles.Layout.Grouping.GroupingKeys.MinimumNodeSizeDpKey.

yWorks.yFiles.Layout.Circular.CircularLayouter: More compact layouts can be obtained by setting PlaceChildrenOnCommonRadius to false.

yWorks.yFiles.Layout.Circular.CircularLayouter: Node labels can be considered by setting ConsiderNodeLabels to true.

yWorks.yFiles.Layout.Organic.SmartOrganicLayouter: Node labels can be considered by setting ConsiderNodeLabels to true.

Graph Analysis Algorithms

yWorks.yFiles.Algorithms.Paths: added methods FindAllPaths(Graph, Node, Node, Boolean), FindAllPaths(Graph, Node, Node, Boolean, Predicate<EdgeList>), and FindAllPathsCursor. These methods can be used to enumerate all directed or undirected paths that connect two nodes.

Improvements

yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouter: for layout style yWorks.yFiles.Layout.Orthogonal.LayoutStyle.NormalTree, the grid size now also controls the distances between tree nodes.

yWorks.yFiles.Layout.ComponentLayouter: Improved handling of user-defined components (components defined via the GivenComponentDpKey data 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.Layerer have been adjusted to implement yWorks.yFiles.Layout.Hierarchic.Incremental.Layerer as well, thereby removing the need to wrap these classes in yWorks.yFiles.Layout.Hierarchic.Incremental.OldLayererWrapper for use with yWorks.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 or GroupNodeModeFixBounds mode.

Changes in Default Behavior

yFiles.NET 4.0 uses a new licensing mechanism based on the .NET LicenseManager framework. Please see the yFiles.NET Readme for further information.

yWorks.yFiles.Layout.Tree.BalloonLayouter has a new default policy for placing the children of local roots. The old policy yWorks.yFiles.Layout.Tree.ChildOrderingPolicy.Symmetric can be set with property ChildOrderingPolicy.

yWorks.yFiles.Layout.ComponentLayouter now considers labels by default (see property ConsiderLabels). 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, and ILabelDefaults instances.

The library does not allow null values in many places where previously null was allowed to indicate default behavior. This makes client code easier to write because code that checks for null is 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 if null had been passed to the methods intentionally, before.

The implementation of the ICloneable of 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 EnlargeGroupNode extension methods of IGroupedGraph. 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 the IMovable interface should be replaced by usages of the IPositionHandler interface instead for the same reason. Also, the new IReshapeHandler interface needs to be used instead of the IReshapeable interface to provide a context to the implementation again for the same reasons.

The IPortCandidate interface 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 boolean Valid flag has been replaced by the three-state Validity enum-backed property. false and true directly map to Invalid and Valid. The third possible value Dynamic does not need to be considered in existing applications because it will only come into play if the new feature is being used actively. Also, the CreateInstance method has been changed to now take a parameter of type IInputModeContext and may not return null anymore. 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 End method has been called.

The OptionHandler framework in the yWorks.Option namespace has been moved from the core library to the Demo.yFiles.Option namespace 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 IReparentNodeHandler interface 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 in DefaultReparentNodeHandler.

The DisplayName attributes 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.

Minor Layout and Analysis Features Added

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_BUS and ALIGNMENT_LEADING_ON_BUS).

y.layout.tree.GenericTreeLayouter: added support for a specific node grouping which can be disabled/enabled with method setGroupingSupported(bool). By default, this feature is enabled.

Bugfixes

Fixed an exception (about unit being disposed already) in UndoEngine if an IUndoUnit was added within the AutoAddTimeSpan to the machine after the engine had been cleared.

Calling IHierarchy.SetParent where 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 the FoldingManager was used. Also the leaf state was not correctly rolled back during undo.

y.layout.router.GroupNodeRouterStage: fixed bug where edges that end at selected group nodes are not routed when y.layout.router.OrthogonalEdgeRouter#ROUTE_EDGES_AT_SELECTED_NODES was 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 affect y.layout.router.ChannelEdgeRouter when using the default settings.

Improvements

y.layout.router.OrganicEdgeRouter: added option setEdgeNodeOverlapAllowed(bool). Setting this option to true often leads to better results if the createNodeEnlargementStage() 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.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 method getMemento() to to create the factory without an initial graph.

y.layout.hierarchic.incremental.SequenceConstraintFactory: added method getMemento() 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.NET now can also use edge bridges and supports automatic adjustment of node bounds to label sizes.

Bugfixes

StringFormats could not be deserialized from GraphML.

Fixed possible NPE in folding code when no DefaultPortStyle has been set on the backing graph.

yWorks.yFiles.UI.Model.LayoutGraphAdapter now automatically translates yWorks.Canvas.Input.ISizeConstraintProviders into minimum group node sizes for y.layout.LayoutConstants.MINIMUM_NODE_SIZE_DPKEY.

yWorks.Canvas.Input.HandleInputMode did not work correctly when used together with multiple yWorks.yFiles.UI.Input.GraphEditorInputMode instances.

yWorks.Option.I18N.ResourceManagerI18NFactory now 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.FoldingManager can 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.IFoldedGraph defines 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.

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.BridgeManager provides support for so-called bridges in edge paths that resolve the visual ambiguity induced by edge crossings.

Automatic Layout

Layout algorithm y.layout.hierarchic.IncrementalHierarchicLayouter now allows to specify placement constraints for nodes that reside in the same layer. A default implementation of new interface y.layout.hierarchic.incremental.SequenceConstraintFactory enables 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, and y.layout.hierarchic.IncrementalHierarchicLayouter.the relevant data can be bound to the graph using data provider look-up key y.layout.grouping.GroupingKeys#MINIMUM_NODE_SIZE_DPKEY.

Significantly improved generic label placement algorithms y.layout.labeling.SALabeling and y.layout.labeling.GreedyMISLabeling. The number of overlapping labels has been drastically reduced. Furthermore, these algorithms now place labels associated with the FREE label 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.EllipticalGroupBoundsCalculator can be used to add this ability to the algorithms.

Class y.layout.SequentialLayouter has 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.IndependentSets has 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.NodeOrderComparator has been added as a convenience implementation to easily specify the order of child nodes in a tree-like structure. The tree layout algorithms y.layout.tree.TreeLayouter, y.layout.tree.HVTreeLayouter, y.layout.tree.ARTreeLayouter, and y.layout.tree.BalloonLayouter.

y.layout.hierarchic.incremental.TopLevelGroupToSwimlaneStage has 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.IncrementalHierarchicLayouter now 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.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.InsetsGroupBoundsCalculator has 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).

y.layout.router.OrthogonalSegmentDistributionStage: Replaced casts to java.util.List with java.util.Collection to conform with API documentation for y.layout.PortCandidate#SOURCE_PCLIST_DPKEY and y.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_DEFINED did 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 affects y.layout.router.ChannelEdgeRouter and in some very uncommon cases y.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.CopiedLayoutGraph automatically registers a DataProvider under y.layout.Layouter#NODE_DP_KEY if 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. Use MarqueeSelectableItems instead of the various MarqueeSelect* properties. The functionality of boolean property SelectElementsAllowed can be mapped to the SelectableItems enumeration property.

yWorks.Canvas.Input.MainInputMode.MarqueeSelect now takes one more argument as a predicate, that can be set to null for backwards compatibility.

The two deprecated Install and Uninstall methods from yWorks.Canvas.Input.AbstractInputMode that were using the CanvasControl parameters have been finally removed in favor of the variants that take the IInputModeContext arguments. Adjust the implementation accordingly and obtain the canvas instance from the context object.

Most of the floating point properties in ICanvasContext and CanvasControl and the related interfaces that were of type float have been changed to double precision floating point type. Change variable declarations or add casts where necessary.

Class yWorks.yFiles.UI.Model.EmptyPortsCandidateProvider has been renamed from the slightly misspelled version that was missing a 'd'. Add the missing letter.

yWorks.GraphML.Writer.IWriteContext now extends yWorks.Support.ILookup instead of yWorks.Support.IContextLookup. The serializer for a given object is no longer available through the context lookup, use method GetSerializer instead.

yWorks.GraphML.Writer.AbstractSerializer: properties TagName and XmlNamespace are deprecated, use the context aware methods GetTagName and GetXmlNamespace instead.

yWorks.GraphML.Writer.GraphMLWriter: property WriteUserTags has been removed, use the corresponding context property or GraphMLIOHandler instead. Also, this class does not implement yWorks.Support.ILookupDecorator anymore, where necessary, decorate the current write context directly.

All constants in yWorks.GraphML.Writer.AbstractXmlWriter have been move to class XmlConstants.

yWorks.GraphML.Reader.IParseContext now extends yWorks.Support.ILookup instead of yWorks.Support.IContextLookup. The deserializer for a given object is no longer available through the context lookup, use method GetDeserializer or convenience method Deserialize instead.

yWorks.GraphML.Reader.DOM.DOMGraphMLParser: properties ReadUserTags and ContextProperties have been removed, set the corresponding context property directly or use GraphMLIOHandler instead.

yWorks.GraphML.Reader.ReferenceResolver has been refactored to interface IReferenceResolver. Also, only method ResolveReference is still public.

All concrete implementations of yWorks.GraphML.Reader.IDeserializer have 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 had y.base.Node or y.base.Edge arguments now take object instead. This should be source code compatible, but requires recompilation. In addition, if you manually register a DataProvider under y.layout.Layouter#NODE_DP_KEY on the graph, you are now required to use the IDs stored in this DataProvider as arguments for these methods.