DropInputMode
which occurred if a drag enter was recognized while another drag action was still running. HighlightIndicatorManager
, FocusIndicatorManager
, or SelectionIndicatorManager
no longer results in a NullReferenceException
. 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. CreateEdgeInputMode
which caused port candidates not to be shown after re-installation of the input mode. 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.StripeDropInputMode.ItemCreated
event now is properly raised.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.HitTestRadius
property of the following implementations of ICanvasContext
now correctly contain the value in world coordinates instead of view coordinates: Contexts.CreateCanvasContext
when passing a CanvasControl
but no hit test radius. DisposeVisualCallback
.IPositionHandlers
by MoveInputMode
.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. NullReferenceException
when calling IGraph.ApplyLayout
when the license is invalid. GroupNodeDefaults.Labels.AutoAdjustPreferredSize
property and the GroupNodeDefaults.Ports.AutoCleanup
property were not considered for labels and ports of groups. ApplicationCommands.Copy
command is no longer executed twice.FreeEdgeLabelModel
: static property Instance
is now excluded from obfuscation. AdjacentNodesGraphBuilder
and TreeBuilder
no longer remove unchanged nodes unnecessarily when those have been created lazily. Rectangle2D.Contains(Rectangle2D)
method. As a consequence of this error, the results of various algorithms and automatic layouts could have been wrong. 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 PortCandidate
s or PortConstraint
s. 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. GraphBuilder
no longer requires an edge source, allowing graphs to be built consisting only of nodes. 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
. 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. UriImageNodeStyle
and UriIconNodeStyle
when reading and writing GraphML.GraphBuilder
, TreeBuilder
, and AdjacentNodesGraphBuilder
.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.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. LayoutData
class and its sub-classes can be used to pass configuration data to a layout algorithm by setting properties instead of registering DataProvider
s 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.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.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.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.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.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
.IPaintable
interface now uses the new IVisualCreator
interface instead for improved rendering performance. Please see the migration guide for details on the resulting incompatibilities.IEnumerator<T>
to IEnumerable<T>
. 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
.ICanvasContext
, IRenderContext
, IInputModeContext
, IParseContext
, IWriteContext
, SnapContext
, GraphSnapContext
, or LabelSnapContext
now have that parameter as their first parameter. yWorks.Graph
contains types related to the graph structure, including label models and port location models.yWorks.Controls
contains types related to the GraphControl
and CanvasControl
, and to the visualization in general.yWorks.Graph.Styles
contains the style implementations.yWorks.Controls.Input
contains the types related to input modes.yWorks.Geometry
.yWorks.Layout
, yWorks.Algorithms
, and the namespaces that correspond to a specific layout style.Contexts
: Factory methods replace the removed classes CanvasContext
and SimpleInputModeContext
.Lookups
: Factory methods replace the removed properties HidingLookupChainLink
, FactoryLookupChainLink
and AddingLookupChainLink
.Animations
: Factory methods replace the removed classes EasedAnimation
, ParallelAnimation
, GeneralPathAnimation
, LayoutMorpher
, LayoutMorpherWrapper
, EdgeAnimation
, LabelAnimation
, NodeAnimation
, and PortAnimation
.PortCandidateProviders
: Factory methods replace all existing non-abstract
implementations. PortCandidateProviderBase
remains for an easier start for own implementations.EdgeReconnectionPortCandidateProviders
: Factory methods replace all existing implementations.Commands
: Factory method CreateCommand
replaces all existing implementations of ICommand
.IGraph
now supports grouping by default. The GroupingSupported
property has been removed from DefaultGraph
. Grouping is now always enabled for graphs.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.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
.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.NodeLabels
and EdgeLabels
on IGraph
have been replaced by the extension methods GetNodeLabels
and GetEdgeLabels
.CollectionModel
and Bends
have been removed. Bends
has been replaced by the GetBends
extension method.BendList
and ListLabelCollection
have been removed. Use ListEnumerable
instead.IGraph
now provides events for property changes on model items, e.g. NodeStyleChanged
, NodeLayoutChanged
, etc. Those events replace the dedicated change reporters available previously (e.g. INodeBoundsChangeReporter
, ILabelTextChangeReporter
, etc.), which have been removed.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.IsLeaf
/SetLeaf
and related properties and events have been replaced by IsGroupNode
/SetIsGroupNode
which have the exact opposite meaning from the old ones.IGraph.AddBend
has changed. The index parameter has been moved to the end and made optional.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
now raises removal events for labels, ports, and bends which are implicitly removed when their owner is removed.DefaultGraph
have been removed: CreateNodeDefaults
, CreateEdgeDefaults
and CreateMapperRegistry
, amongst others.GetBounds
has been removed from DefaultGraph
.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)
.IsInitiallyExpanded
has been removed from IFoldedGraph
. The methods IsInitiallyExpanded
, SetInitiallyExpanded
, and the property DefaultExpandedPredicate
have been removed from FoldingManager
.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.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. 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.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. RotatingEdgeLabelModel
, SliderEdgeLabelModel
, SideSliderEdgeLabelModel
, RotatedSliderEdgeLabelModel
, and RotatedSideSliderEdgeLabelModel
.EdgeSegmentLabelModel
.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.ITable
interface: CreateRow
and CreateColumn
has changed. The index parameter has been moved to the end and made optional.StripeChanged
and StripeRemoved
use StripeEventArgs
now. The corresponding event raiser methods have been changed accordingly.LabelRemoved
uses LabelEventArgs
now.FindColumn
, FindRow
, GetCellBounds
.Table
class: CreateDefaultColumnStyle
, CreateDefaultColumnInsets
, CreateDefaultColumnLabelStyle
, CreatedDefaultColumnLabelModelParameter
, CreateColumnLabelDefaults
, CreateDefaultRowStyle
, CreateDefaultRowInsets
, CreateDefaultRowLabelStyle
, CreatedDefaultRowLabelModelParameter
, CreateRowLabelDefaults
, RemoveUndoSupport
, some overloads of CreateRow
/CreateColumn
, some overloads of AddLabel
DefaultStripeLookup
, DefaultColumnLookup
and DefaultRowLookup
have been added, which replace the removed classes with the same same.TableExtensions
: The GetElementsToMove
method has been removedIStripeSelection.SelectedStripes
property has been removed. Use the individual properties for SelectedRows
and SelectedColumns
insteadStripeSelection
: The superfluous overloads of IsSelected
and SetSelected
taking an IRow
or IColumn
have been removed.PlaceNodeInCell
has been added to ITable
to easily move a node into a specific table cell.IGraph
.Tag
property on model items and the graph now works with Undo.IGraph.BeginEdit
extension method that work with IMementoSupport
(either via ILookup
or an IMementoSupportProvider
) have been added.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.UndoImpl
and RedoImpl
on UndoUnitBase
have been removed. Implementations should use Undo
and Redo
from the IUndoUnit
interface instead.UndoText
and RedoText
on UndoEngine
have been removed.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).yWorks.Geometry
namespace has been simplified and cleaned up. PointD
, SizeD
, RectD
and InsetsD
have been made immutable.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.IPointSetter
and ISizeSetter
have been removed. Instead the interfaces IMutablePoint
and IMutableSize
are used.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
.SizeD.Unbound
, SizeD.Empty
and SizeD.Zero
have been added.ContentRect
will now also be updated when creating edges, adding, editing or moving labels or deleting graph items.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
.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.UndoabilityEnabled
property has been removed. Undo
and Redo
command bindings can be enabled on GraphEditorInputMode
.ClipboardEnabled
property has been removed. Clipboard command bindings can be enabled on GraphViewerInputMode
and GraphEditorInputMode
.GetUndoEngine
method has been removed. The current UndoEngine
can be retrieved from the graph instead.SelectionChanged
event has been removed.LastEventLocation
always contains the location of the last mouse or touch event.MouseWheelBehavior
property replaces the previous property AutoMouseWheelZoomEnabled
and not only allows disabling mouse wheel zoom, but also enabling scrolling with the mouse wheel.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
.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.CollectCanvasObjects
method has been removed.SimpleAbstractNode
/Edge
/Port
/LabelStyle
to Node
/Edge
/Port
/LabelStyleBase
.SimplePortStyle
. Instead, use NodeStylePortStyleAdapter
with ShapeNodeStyle
.SimpleLabelStyle
to DefaultLabelStyle
.IStripeStyle
for styles of IColumns
and IRows
. With NodeStyleStripeStyleAdapter
, you can still use node styles as styles for columns and rows.INodeStyle
, IEdgeStyle
, ILabelStyle
, and IPortStyle
.AbstractEdgeStyle
, AbstractStyleRenderer
, AbstractNodeStyleRenderer
, AbstractEdgeStyleRenderer
, AbstractLabelStyleRenderer
, AbstractShapedNodeStyleRenderer
, AbstractShapedLabelStyleRenderer
, VoidVisualStyle
, and VoidStyleRenderer
.AbstractTableNodeStyle
and DynamicTableNodeStyle
into TableNodeStyle
.IUserTagProvider
and ITableProvider
, and all implementations.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.IModelItemInstaller
and related interfaces and classes. Styles no longer implement IModelItemInstaller
, simplifying certain custom style implementations.Animator.AnimateAndWait
has been removed.Animator.Animate
that accept a callback for finishing the animation have been removed. Instead the new Task-based overloads can be used.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.GraphModelManager
's Installer properties (EdgeStyleInstaller
, NodeStyleInstaller
, etc.) have been removed.GraphModelManager.Invalidate
has been removed.IRenderContext.Canvas
method has been pulled up to ICanvasContext
and renamed to CanvasControl
.IRenderContext
: The Transform
property has been removed.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.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.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.OverviewInputMode
, GraphViewerInputMode
, and GraphEditorInputMode
now directly implement IInputMode
without any abstract base classes in between.IConcurrentInputMode
has been removed and merged with IInputMode
. Enabled
property on the IInputMode
interface has been removed. It is still present on all concrete implementations.ConcurrencyController
property has been removed. Instead, a parameter of type ConcurrencyController
has been added to the IInputMode.Install
method.AbstractInputMode
(which has been renamed to InputModeBase
) have been removed. AbstractConcurrentInputMode
has been merged into InputModeBase
.IInputMode
's ConcurrencyController
property has been removed. Input modes now get a ConcurrencyController
as parameter of their Install
method.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.InputMutex
class has been removed.PreferredCursor
property has been moved from IInputMode
to ConcurrencyController
.ConcurrencyController
. Most input modes don't provide the methods HasMutex
, CanRequestMutex
, RequestMutex
and ReleaseMutex
anymore.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).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.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.IInputMode
s in general: 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.InputModeContext
has been introduced to expose the IInputModeContext
the mode is installed in.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.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.ClickInputMode
instances is now configured to raise events for both left and right clicks.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
.GraphViewerInputMode
have been changed and most of them now have the same priorities as in GraphEditorInputMode
.CanvasClicked
event reports clicks on an empty canvas location.SelectablePredicate
property allows finer control over what particular items should be selectable without the need to create a custom subclass.CreateSelectionEventArgs
method creates SelectionEventArgs
using the GraphSelection
.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.GraphViewerInputMode
now also has a KeyboardInputMode
.GraphViewerInputMode
now allows copying items (including the convenience method) and handles the command appropriately.GraphEditorInputMode
ShowHandleItems
property will now immediately update the currently visible handles.DeletablePredicate
property allows finer control over what particular items should be deletable without the need to create a custom subclass.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. GraphEditorInputMode
API OrthogonalBendRemoval
property has been changed from bool
to OrthogonalEdgeEditingPolicy
.DeletingSelection
and DeletedSelection
events now use SelectionEventArgs<IModelItem>
.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.CreateDefaultLabelConfiguration
method has been removed.MarqueeSelect<T>(RectD,IEnumerable<T>)
method has been removed.SelectionModel
property has been removed. Instead the GraphSelection
property is used.CollectionModel
property has been removed. Instead the model items of the Graph
property are used.GraphInputModeController
property has been removed.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.GraphViewerInputMode
API: Copy
command.ClickHitTestOrder
.AllowClipboardOperations
.ItemSelected
event has been removed.ClipboardCommandsEnabled
has been removed.CreateEdgeInputMode
has been refactored and streamlined:
GraphEditorInputMode
.ConnectToCandidatesOnly
property has been removed. Edge creation now always uses port candidates.NodeBasedEdgeCreationCallback
and PortBasedEdgeCreationCallback
have been replaced by the new EdgeCreator
which is always port-based.GetSourcePortOwner
, GetTargetPortOwner
, GetSourceNode
and GetTargetNode
have been replaced by GetSource
and GetTarget
.SourcePortCandidate
and TargetPortCandidate
are no longer read-only.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.UseHitNodeTargetCandidatesOnly
property has been replaced by the new UseHitItemsCandidatesOnly
property.OrthogonalEdgeCreation
property has been changed from bool
to OrthogonalEdgeEditingPolicy
.DummyEdgeGraph
property is used to create the dummy edge that visualizes the edge during creation.SnapToTargetCandidateOwner
property has been removed. The preview edge now is always being cropped at the candidate owner's borders.CancelGestureOnInvalidTarget
property has been added that makes it possible to cancel the gesture immediately if ended on an invalid target.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
.AssignBends
method has been removed and its functionality folded into the default EdgeCreator
implementation. This also means that customized EdgeCreator
s now have to add bends to the created edge as well.IsPortCandidateResolutionEnabled
, IsValidEnd
, IsValidBegin
, IsCancelGesture
, IsBendCreationEnforced
, IsValidBend
, IsSourceNodeDraggingFinished
, IsRemoveBendEvent
. Instead, use the corresponding ...EventRecognizer
properties to customize the behavior.CreateBend(PointD)
, StartCreateEdge
, OnTargetLocationChanged
, GetNodes
, NodeComparer
and PortOwnerComparer
.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.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.IEditLabelHelper.ConfigureTextEditorInputMode
method has been removed. It has been replaced by the LabelEditingEventArgs.TextEditorInputModeConfigurator
property.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.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.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
.GraphEditorInputMode.HideLabelDuringEditing
property.SnapContext
: 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
.Initializing
, Initialized
and CleanedUp
as well as their associated methods now use InputModeEventArgs
.VoidInstance
field has been removed.GraphSnapContext
: GetMovementInfos
has been changed to IListEnumerable<MovementInfo>
and the classes NodeMovementInfo
, PortMovementInfo
, BendMovementInfo
and EdgeEndMovementInfo
have been removed.AddEdgeEndToBeMoved
has been changed to the more general MovementInfo
. A boolean parameter AtSource
has been added.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
: InitializeSnapping
and CleanupSnapping
have been removed.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.SnapLineContainer
, SingleLineSnapLineContainer
, EdgeSegmentSnapLineContainer
, FixedDistanceSnapLineContainer
, InBetweenSnapLineContainer
have been removed.GraphClipboard.ClipboardContext
property has been removed.Copy
methods in GraphCopier
now have a new PointD
offset
parameter that shifts nodes and bends by a given amount upon copying them.IClipboardIdProvider.GetId
has changed. The context parameter has been moved to the front.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.RemoveCommand
on KeyboardInputMode
which removes all currently existing bindings for a given command.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.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.IPortSelectionTester
and IBendSelectionTester
now take an IInputModeContext
instead of ICanvasContext
as their context parameter.IPositionHandler
and IHandle
implementations no longer implement IPoint
.IPositionHandler.SetPosition
has been removed. The interface is now used as a flagging interface only.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
.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.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
.IDragHandler.HandleMove
and IReshapeHandler.HandleReshape
no longer has a return value.InputModeController
and GraphInputModeController
have been removed.EdgeEndMoveHandle
has been removed.StateMachine
class as well as the associated types and infrastructure have been removed from the API.The XML namespaces have been updated and the mapping from yFiles.NET types to their corresponding XML namespace has been changed.
http://www.yworks.com/xml/yfiles-common/3.0
. This includes the following types: http://www.yworks.com/xml/yfiles-common/markup/3.0
.http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0
. This includes the following types: int
, double
, bool
, etc., and enumeration types) string
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
GraphMLIOHandler.Parsed
, GraphMLParser.Parsed
, GraphMLIOHandler.Written
, GraphMLWriter.Written
, together with the corresponding event raiser methods.SerializationProperties
: 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.AbstractXmlWriter
and DirectXmlWriter
have been merged into XmlWriter
AbstractMapperInputHandler
and ComplexMapperInputHandler
have been merged into MapperInputHandler
AbstractMapperOutputHandler
and ComplexMapperOutputHandler
have been merged into MapperOutputHandler
IDeserializer
has been removed. For custom deserialization an event handler for GraphMLIOHandler.HandleDeserialization
can be used.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.A lot of the utility types have been either replaced or removed.
yWorks.Model
namespace has been removed and its types have been moved to more intuitive namespaces.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
.EmptyCollection<T>
, EmptyList<T>
, CompositeEnumerable
, CompositeEnumerator
, CompositeListEnumerable
, CompositeCollectionModel
, SingleListEnumerable
, SingletonCollection
, SingletonList
, DoubleCollection
, and CollectionChangedEventArgs
have been removed.CompositeHandle<T>
and CompositePositionHandler
have been removed.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.GenericYList
, GenericListCell
, and HashSet
have been removed.DefaultNodeLookup
, DefaultEdgeLookup
, DefaultPortLookup
, DefaultLabelLookup
, DefaultBendLookup
and DefaultItemLookup
have been removed. Properties with the same names have been added to DefaultGraph
instead.ItemDecorator<TModelItem>
class has been removed. Its members have been pushed down to its former sub-classes NodeDecorator
, EdgeDecorator
, LabelDecorator
, PortDecorator
, and BendDecorator
.ItemSelected
and ItemDeselected
on ISelectionModel
have been merged into the ItemSelectionChanged
event.GeomSupport.CreateSmoothedPath
method has been moved to GeneralPath
.LayoutExecutor
: 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.AbortHandler
has been made read-only. There is a protected factory method CreateAbortHandler
which can be overridden to create a custom AbortHandler
implementation.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.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.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
.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
.OrthogonalGroupLayouter
and DirectedOrthogonalLayouter
have been removed and their features have been incorporated into OrthogonalLayout
.OrthogonalEdgeRouter
and all associated classes have been removed.HVTreeLayouter
class has been removed and its features have been incorporated into TreeLayout
.DefaultGraphLayout
class has been removed.ParentEdgeAugmentationStage
class has been removed.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.CanLayout
method has been removed from all layout algorithms. Previously it pretty much always returned true
.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 |
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. Arrow
elements in GraphML were sometimes read back incorrectly. The new deserialization property SerializationProperties.ParseArrowElementAsDefaultArrow
can be used to work around this issue. Table.SetStyle(ILabel, ILabelStyle)
and Table.SetLabelModelParameter
ignored the provided style resp. label model parameter. OverviewInputMode
could break the overview visualization if the overview had a very small width or height. OverviewInputMode
threw an exception if it was used without a ClientCanvas
. StripeDropInputMode.StripeCreated
always returned a wrong stripe instance. ImageSupport.Gaussian1DScaled
that could result in divisions by zero on certain platforms when drop shadows for built-in styles were used. TableLayoutConfigurator
which altered the size of a column or row if an edge routing algorithm has been applied. 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.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.LayoutGraphAdapter
where label candidates for edge labels were not always determined correctly.FoldedGraphUndoSupport
didn't add the correct bend information to its internal data structures.EdgeStyleDecorationInstaller
in DecorationZoomMode.Mixed
or DecorationZoomMode.ViewCoordinates
did not work correctly together with BridgeManager
.<x:Null/>
) in GraphML could lead to NullReferenceExceptions
.GraphMLAttribute
's WriteAsAttribute
property with value XamlAttributeWriteMode.Never
. Forcing a property that is shared to be written as element lead to invalid GraphML files.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.BridgeManager
and prevented redundant LineTo
path elements.EmfExporter
: Prevent locked files caused by internal exceptions.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.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.NodeDropInputMode.LeafParentsAllowed
was true, the value of the FolderNodeParentsAllowed
was ignored.CanvasControl.PrintCommandsEnabled
, CanvasControl.NavigationCommandsEnabled
, GraphControl.FileOperationsEnabled
and GraphControl.ClipboardEnabled
were not properly reflected in the UI.IncrementalHierarchicLayouter
: In non-incremental mode, sequence constraints may not have been respected.IncrementalHierarchicLayouter
: Optimized the sequence of group nodes if 'place at head/tail' sequence constraints are defined.IncrementalHierarchicLayouter
: corrected wrong node placements in graphs with groups if sequence constraints are used.Polyline.EdgeRouter
: Fixed rare NullReferenceException
that may occur for graphs where only a subset of edges is routed, see EdgeRouter.SphereOfAction
.CircularLayouter
: Fixed bug that may cause node overlaps.CopiedLayoutGraph
: Fixed problem that may cause movement of label boxes in the original graph even if method CopiedLayoutGraph.CommitLayoutToOriginalGraph
is not called.ComponentLayouterModule
: Disabled from-sketch option for styles that don't support it.MultiPageLayouter
: Fixed bug that caused that an AbortHandler
attached to the input graph was ignored.MultiPageLayouter
: Fixed NullReferenceException
that may occur if the data provider MultiPageLayouter.EdgeIdDpKEy
is an instance of EdgeMap
.IncrementalHierarchicLayouter
: Fixed routing style violations in octilinear grouped edges.IncrementalHierarchicLayouter
: Fixed label placement for octilinear selfloops with the same side constraints for source and target port.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.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.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.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.LabelSnapContext
and is available for labels with one of these label models: SmartEdgeLabelModel
, FreeEdgeLabelModel
, FreeNodeLabelModel
, and FreeLabelModel
.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.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.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).RadialLayouter
that places nodes on concentric circles. Edges are routed in a radial fashion using one of several routing strategies.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 |
|
|
|
The following layout algorithms also support graceful early termination: | ||
Layout Algorithms | Routing Algorithms | Other Algorithms |
|
|
|
SmartOrganicLayouter
and OrganicLayouter
may take advantage of multiple threads for layout calculations. Parallel execution is enabled using the algorithms' MultiThreadingAllowed
property.ITaskExecutor
and factory class TaskExecutorFactory
make up the programmatic interface for the new concurrency support.NodeHalo
. The following layout algorithms support node halos: | ||
Layout Algorithms | Routing Algorithms | Other Algorithms |
|
|
|
SmartOrganicLayouter
: Added support for partition grid layout. See PartitionGrid
.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.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.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.GraphEditorInputMode.ReparentToLeavesAllowed
is enabled. In this case, leaves are converted into group nodes.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.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.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 partition grid support. Nodes can now be mapped to a multi-lane partition cell identifier, i.e., a cell spanning multiple columns and rows. See class PartitionGrid
.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.PartialLayouter
: Now supports handling of directed and undirected edges. See data provider key DirectedEdgesDpKey
.FixNodeLayoutStage
: Added additional FixPointPolicy
s UpperRight
, LowerRight
, and LowerLeft
.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.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.StraightLineEdgeRouter
that routes edges as straight lines considering specified port constraints.ShapeNodeStyle
and styles that use a GeneralPath
.GraphEditorInputMode.DetailSelectionRecognizer
is now also applied for double clicks to determine the clicked item.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.CompositePositionHandler
: Added methods GetPositionHandler
and GetHandle
to retrieve an earlier added IPositionHandler
or IHandle
.PortRelocationHandle
s 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
.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: NodeCopied
, EdgeCopied
, LabelCopied
, and PortCopied
are dispatched after a model item has been copied.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
.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.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
.PCListOptimizer
: Improved port candidate assignment calculated by method OptimizeAfterSequencing
.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.BalloonLayouter
: Reduced gaps between adjacent nodes.PartitionLayouter
: Added nested class PartitionLayouter.PolylineInterEdgeRouter
that routes inter-edges using class Polyline.EdgeRouter
.PartialLayouter
: Now considers port constraints independent of the specified layout orientation. Note that port constraints are only considered if the core layout algorithm supports port constraints as well.PartialLayouter.StraightLineEdgeRouter
: Added support for port constraints.RecursiveGroupLayouter
: Added option ReplacePortConstraints
that replaces port constraints by port candidates and, thus, may improve the layout result.Polyline.EdgeRouter
: Improved support for port candidate sets (see class PortCandidateSet
).Polyline.EdgeRouter
: Rerouting improved to provide better results.Polyline.EdgeRouter
: Memory usage has been reduced.Polyline.EdgeRouter
: Added penalty setting for edge length. See PenaltySettings.EdgeLengthPenalty
.Polyline.EdgeRouter
: Added four predefined optimization strategies. See PenaltySettings.OptimizationBalanced
, PenaltySettings.OptimizationEdgeBends
, PenaltySettings.OptimizationEdgeCrossings
, and PenaltySettings.OptimizationEdgeLengths
.Polyline.EdgeRouter
: Default penalty settings for minimal node to edge distance, minimal group node to edge distance, minimal first and last segment length, and bends in node to edge distance increased. As a result, these restrictions are considered more strongly.Polyline.EdgeRouter
: Now avoids very small octilinear segments.Polyline.EdgeRouter
: Edge grouping improved to keep edge segments grouped longer and to consider the paths of fixed edges when calculating the paths of edges having the same edge group.Polyline.EdgeRouter
: When using polyline routing, short orthogonal edge segments in a monotonic path section are replaced by a single diagonal segment instead of a short diagonal segment followed by an orthogonal segment followed by a second short diagonal segment.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
.OrthogonalGroupLayouter
: Improved routing and edge labeling for self-loops of normal (non-group) nodes.LayoutTool
: Added new rectangle arrangement method ArrangeRectangleMultiRows
suitable for arranging rows of rectangles with highly different sizes.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
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.Demo.yFiles.Graph.Events
shows how to register to the various events provided by the graph, the input modes, and the GraphControl
.Demo.yFiles.Graph.Input.MoveUnselectedNodes
shows how to use and configure a modified MoveInputMode
which lets the user move nodes without selecting them first.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.Demo.yFiles.GraphEditor
now supports changing the style of a label, drag'n'drop ports with a SimplePortStyle
and editing nodes with a TableNodeStyle
.Demo.yFiles.Layout.AbortHandler
shows how the new class AbortHandler
can be used to stop a layout algorithm which is running in the background.Demo.yFiles.Layout.InteractiveOrganic
was simplified. Now, it uses the events provided by MoveInputMode
instead of a custom IPositionHandler
implementation.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.Demo.yFiles.Graph.Input.HandleProvider
now also shows how to implement a handle which supports rotation of labels.21 Bridge Support
of the Style Tutorial shows how to add support for bridges to a custom edge style.InputDemos
have been improved: more concise sample code, more meaningful descriptions and comments, and nicer overall appearance.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.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.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.FixedGroupLayoutStage
: Method OrthogonalEdgeRouter
now returns an instance of class Polyline.EdgeRouter
instead of class OrthogonalEdgeRouter
.ComponentLayouter
: Property PreferredLayoutSize
now throws an ArgumentException
when setting the preferred size to negative values or zero.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
.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.Paste
(was: only nodes, edges, and bends). This can be configured via the new PasteSelectableItems
property in GraphEditorInputMode
and the corresponding ShouldBeSelectedAfterPaste
method.GraphEditorInputMode
and GraphViewerInputMode
is now controlled through the separate DoubleClickHitTestOrder
property. By default, this hit test order prefers labels over other graph elements.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.Rotate
handle visualization is now a single circle, its very thin central point has been removed.SliderEdgeLabelModel
and SideSliderEdgeLabelModel
now is related to the visible segments for edges styled with PolylineEdgeStyle
.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.IEditLabelHelper.EditLabel
for either an editable label or its owner provides a different label instance, this instance is edited instead.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
.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.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
.
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.AlgorithmAbortedException
: Removed overloaded methods Check
. Client code that needs to terminate layout calculations prematurely must use new class AbortHandler
instead.PartitionGrid
, PartitionCellId
, RowDescriptor
, and ColumnDescriptor
from package yWorks.yFiles.Layout.Hierarchic.Incremental
to package yWorks.yFiles.Layout.Grid
.IItemFactory
: Added method CreateRedirectedGroupEdge
.LayeredNodePlacer
: Removed data provider key DpKeyDistanceToParentMap
from public API, since it is for internal use only.Polyline.EdgeRouter
: Method DoLayout
now throws an ArgumentException
if there is a node with zero width or height in the given graph.Polyline.EdgeRouter
: Penalty settings have been changed to double precision. See class PenaltySettings
.PathSearch
: Signature of method CalculateCosts
has changed. It now takes an additional double array as parameter that is populated with the calculated costs instead of returning a new array.DrawingEmbedder
: Removed public method PreprocessNodes
and protected method PrintStatistics
.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>)
.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.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.LayoutGraphAdapter
where label candidates for edge labels were not always determined correctly.LayoutGraphAdapter
producing threading issues when PortCalculator
was used during a multi-threaded layout.FoldedGraphUndoSupport
didn't add the correct bend information to its internal data structures.IEditLabelHelper
and adding a label interactively, the helper's EditLabel
callback was called instead of AddLabel
.IEditLabelHelper
instance was registered.MoveInputMode
created by MainInputMode.CreateMoveUnselectedInputMode
changed the cursor to indicate a movable object even when the modifierRecognizer
disabled moving.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.NinePositionsEdgeLabelModel
, SliderEdgeLabelModel
, and SideSliderEdgeLabelModel
might have disappeared when one or more edge segments were hidden under the source or target node.SnapContext
: Snap results with a null
tag were erroneously always discarded.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.CollapsibleNodeStyleRenderer
was missing the correct results for IGroupBoundsCalculator
, ISizeConstraintProvider
, and IShapeGeometry
.ShadowNodeStyleDecoratorRenderer
was missing the correct result for IShapeGeometry
.Name
property of the GraphMLAttribute
was not considered during deserialization.GraphML
were not always raised.ICanvasObjectGroup
's Visible
property to false
the group was still visible.CanvasControl.EnsureVisible
hasn't worked for bounds larger than the current viewport.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.ArgumentNullException
in the print preview of the CanvasControl
.GraphEditorInputMode
and GraphViewerInputMode
now respect the MultiSelectionRecognizer
for extending an existing selection via marquee.TableEditorInputMode
exhibiting problematic behavior under certain circumstances when the GraphControl
's graph is replaced.ShinyPlateNodeStyleRenderer.Radius
, ShinyPlateNodeStyleRenderer.Brush
, ShinyPlateNodeStyleRenderer.Pen
and BevelNodeStyleRenderer.Radius
were not used consistently.CreateEdgeInputMode
was uninstalled.DefaultArrow.Length
did not take the Scale
factor into account, sometimes leading to gaps between the edge and the arrow.EdgeStyleDecorationInstaller
in DecorationZoomMode.Mixed
or DecorationZoomMode.ViewCoordinates
did not work correctly together with BridgeManager
.RemoveNodeOverlaps
/RemoveEdgeOverlaps
were enabled because all potential candidates were erroneously rejected.AbstractLabelingAlgorithm
: Fixed bug that may cause removal of labels that don't overlap with other elements if option RemoveNodeOverlaps
is enabled.IncrementalHierarchicLayouter
: Fixed rare InvalidOperationException
that may appear for grouped graphs containing nodes with fixed coordinates hint (see, e.g., IncrementalHintsFactory.CreateUseExactCoordinatesHint
).IncrementalHierarchicLayouter
: Fixed bug that breaks incremental hints of grouped edges in incremental layout mode. (see IncrementalHintsFactory.CreateSequenceIncrementallyHint
).IncrementalHierarchicLayouter
: Fixed bug that may cause a wrong order of fixed (non-incremental) elements if the layouter is applied in incremental mode and the graph contains sequence constraints.BorderLine
: Fixed bug in method Grow
that may result in an ArgumentException
because the minimum value of a BorderLine becomes greater than the maximum value.Polyline.EdgeRouter
: Fixed bug that may cause zero length routes of edges whose start and end point are at the same location.IncrementalHierarchicLayouter
: Fixed possible IndexOutOfRangeException
that may occur for grouped graphs in incremental mode with recursive group layering enabled.IncrementalHierarchicLayouter
: Fixed possible exception caused by inconsistent grouping.IncrementalHierarchicLayouter
: Fixed broken edge routes that may occur for edges with labels 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.MultiPageLayouter
: Fixed possible NullReferenceException
if the input graph contains empty group nodes.MultiPageLayouter
: Fixed possible InvalidCastException
.PartialLayouter
: Fixed broken edge routes that may appear if option EdgeRoutingStrategy
is set to EdgeRoutingStrategyOctilinear
.Polyline.EdgeRouter
: Fixed wrong heuristic bend calculation if grid is used.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 PortConstraint
s are used together with PortCandidateSet
s.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.SALabeling
and GreedyMISLabeling
: Fixed possible NullReferenceException
caused by labels with zero width/height and a "free" edge label model.IncrementalHierarchicLayouter
: Fixed bug that caused wrong coordinates of empty rows (see class RowDescriptor
) whose minimum height is zero.DirectedOrthogonalLayouter
: Fixed a bug that sometimes caused misplaced edge labels of grouped edges.Polyline.EdgeRouter
: Fixed possible NullReferenceException
for edge groups that contain fixed edges.Polyline.EdgeRouter
: Fixed bug that caused wrong routes for edges grouped with fixed edges.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
.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.EdgeStyleDecorationInstaller
did not copy the tags of dummy ports and edges used when displayed in view coordinates (ZoomMode
= DecorationZoomMode.ViewCoordinates
).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.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.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.PEVerify
. Runtime verification behavior was not affected by these.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
.Polyline.EdgeRouter
: Fixed wrong heuristic bend calculation if grid is used.BusRouter
: Fixed NullReferenceException
in BusRepresentations
that could appear if the input graph contains overlapping nodes.MultiPageLayouter
: Fixed possible NullReferenceException
if the input graph contains empty group nodes.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.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.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.IHandle
.NodeStyleDecorationInstaller
, LabelStyleDecorationInstaller
and EdgeStyleDecorationInstaller
in zoom invariant mode were not placed correctly.IncrementalHierarchicLayouter
: Fixed ArgumentException
that may appear for graphs containing nodes with fixed coordinates.LabelLayoutDataRefinement
: Fixed possible InvalidCastException
for unbuffered layout runs.RecursiveGroupLayouter
: Removed all temporarily inserted port candidates before calling the inter-edge routing because otherwise the edges routes may become corrupted.TreeLayouter
and GenericTreeLayouter
: Fixed possible NullReferenceException
for trees with empty group nodes.ShuffleLayouter
: Fixed bug that may cause small offsets of fixed nodes.Polyline.EdgeRouter
: Fixed bug in calculation of edge to edge distance penalties which could reduce the space where edges can be routed causing them to take unnecessary long routes.Polyline.EdgeRouter
: Fixed bug that caused edges that connect a node with an ancestor group node to violate the minimal node to edge distance for the target node.Polyline.EdgeRouter
: Fixed bug that caused edges that connect a node with an ancestor group node to have unnecessary long and bended edge paths when using port constraints.Polyline.EdgeRouter
: Fixed bug that caused edges that connect a node with an ancestor group node to cross their source nodes when using port constraints.Polyline.EdgeRouter
: Fixed bug that makes it possible to group the source of one edge and the target of another edge at their common node.Polyline.EdgeRouter
: Fixed bug that sometimes causes superfluous edge overlaps.Polyline.EdgeRouter
: Fixed bug that caused minimum distance violation of grouped edges.Polyline.EdgeRouter
: Fixed rare NullReferenceException
while calculating edge crossing costs.Polyline.EdgeRouter
: Fixed bug that sometimes assumed wrong label bounds for labels of table nodes. This could result in too many bends for edges that were routed around those wrong boxes. Labels of table nodes are now ignored by the router 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 IndexOutOfRangeException
.BusRouter
: Fixed possible InvalidOperationException
caused by non-orthogonal edge segments.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
).ImageExportDemo
: The hit test for the export rectangle was configured incorrectly.LayoutGraphAdapter
provides now the original Tag
data for temporary graph objects.AbstractTableNodeStyle#BackgroundStyle
was not serializable.BeginEdit
and EndEdit
might have led to exceptions when folding was active.DirectedOrthogonalLayouter
could throw a String.IndexOf
exception.IncrementalHierarchicLayouter
: Fixed a rare bug that caused broken edge routes if edges are routed polyline.PolylineLayoutStage
: Fixed possible IndexOutOfRangeException
if there are fixed edges with a single, very short segment.Polyline.EdgeRouter
: Fixed a bug that makes it possible to group the source of one edge and the target of another edge at their common node.Polyline.EdgeRouter
: Fixed a bug that sometimes causes superfluous edge overlaps.Polyline.EdgeRouter
: Fixed a bug that causes that edges of a group starts in the node to edge distance area of another node.BusRouter
: Fixed clean up of unnecessary bends that were placed on a backbone but not cause detours in edges.Trees
: Added method IsForest(Graph, bool)
.Demo.yFiles.Graph.OrgChart
demo uses the ViewportLimiter
feature to prevent arbitrary viewport changes.EdgeFocusIndicatorRenderer
.NodeStyleLabelStyleAdapter
: Fixed rendering bug when the style was used for node labels.ClickInputMode.SwallowFocusClick
had only an effect for the very first click.CDATA
sections were not parsed correctly.GraphOverviewControl
did not honor CanvasControl.ViewportLimiter
restrictions.RotatedSliderEdgeLabelModel
can now deal with edge paths that are null
, e.g. when using VoidEdgeStyle
.CultureInfo
was not Invariant
.Rectangle2D.Intersects
sometimes returned true
for non-intersecting rectangles. This could cause infinite loops in BusRouter
.EdgeRouter
: Fixed bug that may cause an ArgumentException
if a grid is specified (see property Grid
).OrthogonalGroupLayouter
: Fixed bug that may cause a wrong group bounds calculation if a group node label lies outside of the group node.PartialLayouter
: Fixed possible NullReferenceException
if the partial layouter is applied to a graph with partition grid (see PartitionGrid
).PartialLayouter
: Fixed bug that may cause a very long runtime if the algorithm considers node alignment (see property ConsiderNodeAlignment
).IncrementalHierarchicLayouter
: Fixed bug that may cause broken edge routes for edges with port candidates if backloop routing is enabled (see property BackloopRouting
).ParallelEdgeLayouter
: Fixed NullReferenceException
that appears if the leading edge has zero length.ParallelEdgeLayouter
: Fixed bug that may cause points with Double.NaN
-coordinates for some edges.LayoutTool
: Fixed bug in method RouteEdgesParallel
: that may cause points with Double.NaN
-coordinates for some edges.EdgeRouter
: Fixed performance problems for graphs with overlapping fixed edges.BusRouter
: Fixed possible stack overflow. IncrementalHierarchicLayouter
: Fixed bug that caused unsuitable edge routes for grouped edges within group nodes.OrthogonalLayouter
: Fixed exception that may appear for graphs with nodes of high degree.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.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
.yWorks.yFiles.Layout.PreferredPlacementDescriptor
: A new descriptor that allows to specify advanced preferred placement information for edge labels.ClickInputMode
, GraphEditorInputMode
, GraphViewerInputMode
: New events for LeftClicked
, RightClicked
, LeftDoubleClicked
and RightDoubleClicked
. Also, ClickInputMode
has been improved to handle multiple mouse buttons concurrently.MainInputMode
and GraphViewerInputMode
: Added new bulk selection events MultiSelectionStarted
and MultiSelectionFinished
.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.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.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.LayoutExecutor
uses WaitInputMode
while waiting during the calculation of a layout.SetEdgePortLocation
to LayoutGraphAdapter
that is called while assigning a new location to a port that is owned by an edge.IInputMode
after the mode has been installed has now an effect in all input modes.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
.GraphViewerInputMode
can now be changed similar to GraphEditorInputMode
.IGraph.CreateNode(PointD,INodeStyle)
.GraphEditorInputMode
and GraphViewerInputMode
provide a new CanvasClicked
event to detect clicks on the empty canvas area.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
.GenericTreeLayouter
creates more compact layouts, especially for trees with edge labels.DefaultNodePlacer
to create polyline-style edge routings with sloped edge segments.DefaultPortAssignment
to distribute edges at the border of the nodes.RecursiveGroupLayouter
: Improved performance for graphs with a mainly flat structure.GraphLayoutLineWrapper
: Improved edge routing for overlapping edges, for example grouped edges.RotatedDiscreteEdgeLabelLayoutModel
and RotatedSliderEdgeLabelLayoutModel
. Labels that are placed upside down by a layouter will be flipped.PortCandidate
which potentially improves the performance of the IncrementalHierarchicLayouter
with rotated graphs with PortCandidates.PortCandidate
s in RecursiveGroupLayouter
for the core layouter.GraphConnectivity
: Improved method MakeBiconnected
to work with graphs with self-loops (i.e. edges whose source and target nodes are the same).Demo.yFiles.Graph.Input.HandleProvider
that shows how to add resize handles to graph elements that don't provide them out of the box.Demo.yFiles.Graph.Input.SingleSelection
that shows how to configure GraphEditorInputMode
to enable single selection mode for interaction.Demo.yFiles.Graph.StyleDecorators
and a corresponding step in the Custom Style Tutorial that shows how to correctly implement the decorator pattern for node styles.Demo.yFiles.Graph.SelectionStyling
that shows how to use node, edge and label styles for the painting of the selection decorator.Demo.yFiles.Layout.PreferredLabelPlacement
that shows how to use the new PreferredPlacementDescriptor
layout feature.Demo.yFiles.Algorithms.ShortestPath
since cycles with negative weights are not allowed by the algorithm.NavigationInputMode
was used as child of GraphViewerInputMode
or GraphEditorInputMode
, it didn't respect the selectable and focusable items of its parent input mode.CreateEdgeInputMode
and MoveInputMode
, snapping may not have been re-enabled after disabling it temporarily.GraphClipboard.Cut
: The filter predicate was evaluated twice, resulting in unexpected behavior if the predicate evaluation depended on state that could change by removing graph elements.Matrix2D.Scale(double, double, MatrixOrder)
did not work correctly for MatrixOrder.Append
.CreateEdgeInputMode
, the compound undo unit is cancelled if the edge creation is implicitly cancelled. The old behavior can be restored by disabling CreateEdgeInputMode.CancelEditImplicitly
.MoveInputMode
only considers hovers without modifiers as valid to prevent "cursor fight" with MoveViewportInputMode
.NavigationInputMode.ToggleGroupNodeState
did not expand collapsed folder nodes.NavigationInputMode
: Methods CollapseSelection
and ExpandSelection
threw a NullReferenceException
.SimpleAbstractLabelStyle.IsInBox
always returned false.Rectangle2D.Intersects
sometimes returned true
for non-intersecting rectangles. This can have caused infinity loops in BusRouter
.IncrementalHierarchicLayouter
: Fixed incorrect handling of port candidates in layouts where rotation and a mirror was set.IncrementalHierarchicLayouter
: Fixed integer overflow when group compaction is activated while layouting extremely large, deeply nested graphs.IncrementalHierarchicLayouter
: Fixed port handling of edges with a single edge port candidate that is contained in a set of node port candidates.AspectRatioComponentLayerer
.FamilyTreeLayouter
when there are several marriages between generations.IsolatedGroupComponentLayouter
now considers labels in group bounds calculation if label awareness is enabled.PartialLayouter
: Fixed IndexOutOfRangeException that sometimes appears for large graphs.GroupNodeRouterStage
: Fixed possible exception that was caused by the missing removal of a temporarily added DataProvider.OrthogonalLayouter
and DirectedOrthogonalLayouter
: Fixed bug that caused an ArgumentException if input graph contains overlapping parallel edges and from sketch mode is enabled (see property UseSketchDrawing
).OrthogonalEdgeRouter
: Fixed exception that may appear when both options Rerouting
and LocalCrossingMinimization
are enabled.RotatedSliderEdgeLabelLayoutModel
and SliderEdgeLabelLayoutModel
: Improved label placement at zero-length edge segments.GraphTransformer
: Fixed group nodes bounds after transforming a sub-graph only.ParallelEdgeLayouter
: Fixed NullReferenceException
which may appear when source/target points of parallel edges are outside of the corresponding node.SmartOrganicLayouter
: Fixed problem that sometimes caused very long runtime for simple grouped graphs.SmartOrganicLayouter
: Fixed wrong calculation of group node sizes if option ConsiderNodeLabels
is enabled.YVector
: Fixed method Rotate(double)
to no longer return vertically mirrored results.IncrementalHierarchicLayouter
: Fixed bug that caused violation of strong port constraints of type AnySide
for backloop edges.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.IClipboardHelper
: The predicate functions ShouldCut
and ShouldCopy
are now taken into account for the default cut and copy operations provided by GraphEditorInputMode
and GraphControl
.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.PartialLayouter
: Property EdgeRoutingStrategy
now disables a previously set customized edge router.DefaultGraph.SetPreferredSize
does not call OnLabelChanged
any more. Thus, the LabelChanged
event is not fired.IEdgeLabelLayout
: Removed property PreferredPlacement
and added property PreferredPlacementDescriptor
.PartialLayouter
: Replaced method ConfigureOrthogonalEdgeRouter
by method ConfigureEdgeRouter
.yWorks.yFiles.Util.ISortedMap
and yWorks.yFiles.Util.ISortedSet
have been removed from the public API. These interface were never meant to be used by customers.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.Demo.yFiles.Layout.MultiPage
shows how to use class MultiPageLayouter
to sub-divide large graphs into smaller bits of navigable information.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
.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.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.ShortestPaths
: Added method ShortestPair
.GraphMLIOHandler
: Added AddRegistryOutputMapper
overload that takes a serialization handler.LayoutGraphPanel
in the algorithm demos now correctly displays the locations of labels.FamilyTreeLayouter
: Improved the algorithm with respect to the number of edge crossings.PCListOptimizer
: Improved the handling of port candidates and enhanced backloop routing support.Demo.yFiles.Graph.EdgeToEdge
that shows how to enable and make use of the new edge-to-edge connection feature.Demo.yFiles.Layout.Multipage
that shows how to use class MultiPageLayouter
to sub-divide large graphs into smaller bits of navigable information.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.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.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
.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.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 TemplatePaintable
s. This has been corrected to now use the CandidateTag
of the IPortCandidate
being rendered.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.GraphOverviewControl.GraphPaintable
had no effect.DefaultSelectionModel
was not always cleaned up correctly when the domain was changed.SliderEdgeLabelModel
threw an exception for paths with zero length segments.FilteredGraphWrapper
: The adjacency state of the filtered instance was wrong under certain conditions.FreeEdgeLabelModel
: Fixed bad positions returned by parameter finder.LabelDecorator
was unusable because of a wrong type parameter.MethodAccessException
in ImageSupport.DropShadow
and BevelNodeStyleRenderer
.LayoutGraphAdapter
did not honor mapper in the registry registered under the LayoutGraphAdapter.EdgeLabelLayoutPreferredPlacementDpKey
key.BendAnchoredPortLocationModel
could throw an IndexOutOfRangeException under certain circumstances.CreateEdgeInputMode
did not highlight the closest target port candidate during the edge creation gesture.DropInputMode#AdjustEffects
: Setting a custom ValidHitTestable
had no effect.DropInputMode
: The mode did not exit cleany under some rare circumstances.TableEditorInputMode#EditLabel
did not work.MultiplexingInputMode
were not always disabled together with the parent mode.yWorks.yFiles.Algorithms.Groups
: Fixed possible NRE when calculating BCC for a graph containing self-loops in method BiconnectedComponentGrouping(Graph, INodeMap)
.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.LayoutExecutor
when animation and grouping were both disabled.TableLayoutConfigurator
when exceptions occurred.yWorks.yFiles.Algorithms.Groups.EdgeBetweennessClustering
: The parameters minGroupCount
and maxGroupCount
had no effect.LayoutExecutor
did not provide the GraphControl's selection to the layout engine.NullReferenceException
in PartitionGridLayoutStage
if no partition cells were assigned to any nodes.yWorks.yFiles.Layout.Labeling.AbstractLabelingAlgorithm
) together with layout stage yWorks.yFiles.Layout.LabelLayoutDataRefinement
.yWorks.yFiles.UI.Model.Table
provides extensive support for tabular presentation of subgraphs which is well suited for the visual presentation of swimlane layouts.yWorks.yFiles.UI.Drawing.ITableNodeStyle
interface.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.TableLayoutConfigurator
can automatically create a suitable partition grid setup from existing table structures in a graph. Also, LayoutExecutor
has been enhanced to optionally configure table specific layout features. [To the corresponding section in the yFiles.NET Developer's Guide...]Demo.yFiles.Graph.TableEditor
demo demonstrates the capabilities of table visualization editing, as well as automatic layout of swimlane diagrams.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.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 PortCandidateSet
s that allow to specify the available port candidates at a node.CanvasControl
now offers a method that yields the Visual
for a given ICanvasObject
. This can be leveraged by UI testing tools.NodeStylePortStyleAdapter
can be used to reuse existing INodeStyle
implementations for port visualization.GridPaintable
's pens can now be customized for all grid styles.PartitionGridRouterStage
enables OrthogonalEdgeRouter
to properly route edges within a partition grid.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.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.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.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.Demo.yFiles.Layout.MixedLayout
demo that shows how to recursively apply different layout algorithms to the contents of group nodes.Demo.yFiles.Layout.PartialLayout
demo that presents specific setup of the new partial layout support in conjunction with Circular, Hierarchic, Organic, and Orthogonal Layout.Demo.yFiles.Layout.LayerConstraints
demo shows how to use layer constraints with the IncrementalHierarchicLayouter to restrict the node layering.Demo.yFiles.Layout.SequenceConstraints
demo shows how to use sequence constraints with the IncrementalHierarchicLayouter to restrict the node sequencing.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.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).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.Demo.yFiles.Layout.EdgeLabeling
demo shows how to configure different edge label models as well as how to apply the generic edge labeling algorithm.Demo.yFiles.Layout.NodeLabeling
demo shows how to use the node label models in conjunction with the yFiles generic labeling algorithms.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.Demo.yFiles.Layout.BusRouterDemo
shows how to use the orthogonal bus-style edge router.GraphSnapContext
.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.CreateEdgeInputMode
made cleaning up a GraphControl impossible after an edge had been created interactively using that mode with snapping disabled.GetSourcePortCandidate
method was sometimes invoked with the wrong location.Show
respects parameter if it differs from the mouse location.ClickInputMode.ValidHitTestable
was not always queried in certain double click configurations.Animator.AnimateAndWait
did not update the control if called from the event dispatching thread.IDictionaries
.CanvasControl.FitContentViewMargins
was never used.TextEditorInputMode
could not handle Unix styl line breaks correctly.GraphClipboard
did not always copy all state of items that were invisible in a folded graph view.InteractiveOrganicLayouter
: Fixed bug that prevented the calculation of any layout before the first call to WakeUp
.ComponentLayouter
: Fixed bug that caused a wrong component assignment if customized component IDs were used.IncrementalHierarchicLayouter
: Fixed bug that sometimes caused an assignment of infinite coordinates to group nodes as well as to points of edges incident to group nodes.IncrementalHierarchicLayouter
: Fixed bug that caused unnecessary crossings when using node grouping.yWorks.yFiles.Layout.Tree.DelegatingNodePlacer#GetLowerRightChildren
and GetUpperLeftChildren
had no effect.IndexOutOfRangeException
in yWorks.yFiles.Layout.RotatedSliderEdgeLabelLayoutModel
.yWorks.yFiles.Layout.Router.EdgeGroupRouterStage
.NullReferenceException
when using yWorks.yFiles.Orthogonal.OrthogonalLayouter
in FromSketchMode.DrawingEmbedder
: Fixed NullReferenceException caused by nodes having the same center.NetworkFlows
: Fixed wrong calculation of the cut set returned by method CalcMaxFlowMinCut(Graph, Node, Node, IDataProvider, IEdgeMap, INodeMap)
.EdgeGroupRouterStage
: Fixed bug that caused violation of edge grouping constraints as well as port constraints.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.Cut
command on GraphControl
is now only enabled if DeletableItems
allows the deletion of the currently selected nodes.ClickInputMode
as well as GraphEditorInputMode
and GraphViewerInputMode
.GraphEditorInputMode
, NavigationInputMode
: Added UseCurrentItemForCommands property.yWorks.yFiles.UI.Model.GraphExtensions
: Added another extension method for creating labels with tag.yWorks.yFiles.UI.Model.FoldedGraph
: IsExpanded(INode)
raises correct exception if node is not part of the graph.yWorks.Canvas.Geometry.Structs.PointD
: added GetRounded()
.DesignerSerializationVisibility
handling in GraphML are consistent now.yWorks.yFiles.GraphML.Parser.GraphMLParser
: XMLExceptions wrapped in IOExceptions.yWorks.yFiles.GraphML.Xaml.XamlSerializer
now supports ShouldSerialize*
predicates.System.Collections.IDictionary<K,V>
yWorks.yFiles.Layout.Hierarchic.Incremental.PartitionGrid#CreateCellSpanId
overload that accepts System.Collections.IEnumerable<V>
yWorks.yFiles.GraphML.Xaml.XamlReader
: XML attributes that are bound to an XML namespace are ignored if they do not specify an attached property.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
when a node has more than 60 selfloops.IEdge
that has same source and target port.PanelNodeStyle
can now deal with empty layout.yWorks.Canvas.Input.ContextMenuInputMode#Menu
did not always clean up the old menu correctly.NullReferenceException
s.NavigationInputMode
did not correctly update the location of group nodes during expand and collapse and did not enqueue the correct undo units.A great number of bugs have been fixed in the folding environment. All of them could only be triggered programmatically.
yWorks.yFiles.UI.Model.GroupedGraphExtensions.CreateGroupNode(INode parent)
: Fixed extension method ignoring parent.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.DesignerSerializationVisibility
for collection properties is now consistent with WPF and Silverlight XAML rules: ContentPropertyAttribute
: DesignerSerializationVisibility
is not specified or DesignerSerializationVisibility.Content
is specified, only the content is (de)serialized.DesignerSerializationVisibility.Hidden
is specified, the property is ignored.DesignerSerializationVisibility.Visible
is specified and the property is read-write, the collection object itself is (de)serialized, otherwise the property is ignored.ContentPropertyAttribute
: DesignerSerializationVisibility.Content
is specified for either read-write or read-only collection properties, only the content is (de)serialized.DesignerSerializationVisibility.Hidden
is specified, the property is ignored.DesignerSerializationVisibility
is either not specified or set to DesignerSerializationVisibility.Visible
for read-write collection properties, the collection object is (de)serialized.DesignerSerializationVisibility
is either not specified or set to DesignerSerializationVisibility.Visible
for read-only collection properties, the property is ignored.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.
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.
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.yWorks.yFiles.UI.Input.IOrthogonalEdgeHelper
determines how edges should be treated during editing with respect to orthogonality.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.yWorks.yFiles.UI.Input.ISnapLineProvider
and others can be used to influence the behavior, the types, and the display of the snap lines.yWorks.yFiles.GraphML.GraphMLIOHandler
has been reimplemented from scratch to greatly simplify customizations to the process of creating and parsing GraphML.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.yWorks.yFiles.UI.Input.NodeDropInputMode
has been added to provide convenient drag and drop support on top of the existing DropInputMode implementation.yWorks.yFiles.UI.Drawing.ShinyPlateNodeStyle
provides a nice, clean modern look with a high-performance drop shadow.yWorks.yFiles.UI.Drawing.BevelNodeStyle
got the same new high-performance drop shadow, that can be switched on and off.yWorks.Canvas.Drawing.TemplatePaintable
.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
provides enhanced support for swimlane layout through comprehensive new partition grid concept.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.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.foreach
construct.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
now features consistent support for layering constraints both for non-incremental as well as incremental layout mode.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.Hierarchic.IncrementalHierarchicLayouter
: Added support for automatic edge grouping (see property AutomaticEdgeGrouping
).yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouter
, yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter
, yWorks.yFiles.Layout.Orthogonal.DirectedOrthogonalLayouter
: Added support for considering node labels.yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter
: Added integrated edge labeling support.yWorks.yFiles.Layout.Orthogonal.OrthogonalLayouter
and yWorks.yFiles.Layout.Orthogonal.DirectedOrthogonalLayouter
: Added convenience property for integrated edge labeling: IntegratedEdgeLabeling
.yWorks.yFiles.Layout.Orthogonal.OrthogonalGroupLayouter
: The layouter now also considers minimum sizes for group nodes as given by the 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.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.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.Orthogonal.OrthogonalLayouter
, yWorks.yFiles.Layout.Orthogonal.DirectedOrthogonalLayouter
: improved integrated edge labeling.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.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.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
: added convenience properties OrthogonalRouting
and BackloopRouting
.IncrementalHierarchicLayouter
has been implemented.yWorks.yFiles.Layout.OrientationLayouter
: Fixed wrong handling of mirror mask (see MirrorMask
).yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
: In some cases edge points could have infinite coordinates.yWorks.yFiles.Layout.Router.OrthogonalEdgeRouter
: Fixed bug where in some cases strong port constraints were not taken into account for self-loops when local crossing minimization was enabled.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
: Fixed insets of group node being treated incorrectly if non-orthogonal edge routes were used.yWorks.yFiles.Layout.Hierarchic.IncrementalHierarchicLayouter
: Fixed rare exception about groups being "inconsistent".yWorks.yFiles.Layout.Router.OrganicEdgeRouter
: Fixed bug where OrganicEdgeRouter created some extreme edge routes for larger minimal distances (see MinimalDistance
). Critical edges will now be routed straightline.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.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.
INodeDefaults
, IEdgeDefaults
, IPortDefaults
, and ILabelDefaults
instances.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.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.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.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.End
method has been called.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.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
.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.java.awt.Insets
type to double-precision yWorks.yFiles.Util.Geom.Insets
. This affects parameter and return type in method yWorks.yFiles.Layout.OrientationLayouter.CreateOrientedInsets
.Of course, the yFiles.NET support team will aid existing customers in migrating their code and possibly data to the new API based on their subscription.
IFoldedGraph
that could happen when using ITagOwner.Tag
s.ArgumentOutOfRangeException
in CanvasControl
if the mouse was moved within 5 microseconds before the DragTime
timer ellapsed.IFoldedGraph
that could happen in multi-level node collapse operations as a result to calls to Collapse
.y.util.GraphHider
: added methods that unhide specific nodes and edges: unhideNode(y.base.Node, bool)
, unhideNodes(y.base.NodeList, bool)
, unhideEdge(y.base.Edge)
, unhideEdges(y.base.EdgeList)
.y.layout.NormalizingGraphElementOrderStage
. This layout stage can be used to normalize the order of the elements within a graph.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.UndoEngine
if an IUndoUnit
was added within the AutoAddTimeSpan
to the machine after the engine had been cleared.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.DOMInputHandler
could not parse GraphML default attribute values.BridgeManager.RegisterXXXObstacle
methods.FixedGroupLayoutStage
that threw a NullReferenceException
and rendered the stage basically useless.y.layout.hierarchic.incremental.SimplexNodePlacer
: fixed wrong calculation of the width of the leftmost/rightmost swimlane.y.layout.tree.TreeLayouter
: fixed strange edge routes appearing when setPortStyle(int)
was set to BORDER_CENTER_PORTS
or BORDER_DISTRIBUTED_PORTS
and the nodes had non-uniform size.y.layout.hierarchic.ConstraintLayerer
: fixed possible NullReferenceException when the unconstrained layering would already contain same layer edges.y.layout.router.GroupNodeRouterStage
: fixed bug where edges that end at selected group nodes are not routed 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.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.organic.InteractiveOrganicLayouter
: added method y.layout.organic.InteractiveOrganicLayouter#startLayout()
and y.layout.organic.InteractiveOrganicLayouter#stopAndWait()
. Adjusted corresponding demos.y.layout.hierarchic.IncrementalHierarchicLayouter
: sometimes, if both swimlanes and groups and layers have been defined by the user, the algorithm would place the group nodes into newly created layers in order to avoid group node overlaps, although this might not always be necessary. The algorithm has been improved to better detect overlaps.y.layout.grouping.FixedGroupLayoutStage
: it is now possible to have this stage work on selected groups only.y.layout.hierarchic.ConstraintLayerer.ConstraintFactory
: added 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.Demo.yFiles.Graph.Input.OrthogonalEdges
.yEd.NET
now can also use edge bridges and supports automatic adjustment of node bounds to label sizes.StringFormats
could not be deserialized from GraphML.y.layout.LayoutConstants.MINIMUM_NODE_SIZE_DPKEY
.yWorks.yFiles.UI.Model.LayoutGraphAdapter
now automatically translates yWorks.Canvas.Input.ISizeConstraintProvider
s 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 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.
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.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.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".yWorks.yFiles.UI.BridgeManager
provides support for so-called bridges in edge paths that resolve the visual ambiguity induced by edge crossings.y.layout.hierarchic.IncrementalHierarchicLayouter
now supports swimlane layouts of hierarchically grouped graphs.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.y.layout.genealogy.FamilyTreeLayouter
, has been added that is especially suited for genealogical family trees.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.y.layout.hierarchic.HierarchicGroupLayouter
, y.layout.organic.OrganicLayouter
, y.layout.organic.SmartOrganicLayouter
, and y.layout.hierarchic.IncrementalHierarchicLayouter
.y.layout.grouping.GroupingKeys#MINIMUM_NODE_SIZE_DPKEY
.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.y.layout.organic.EllipticalGroupBoundsCalculator
can be used to add this ability to the algorithms.y.layout.SequentialLayouter
has been added, that can be used to run several layouters sequentially one after the other.y.algo.Cycles
: added method #findAllCycleEdges(y.base.Graph, boolean)
y.algo.IndependentSets
has been added. It provides methods for calculating independent sets of nodes.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.router.OrthogonalPatternEdgeRouter
: improved routing for edges inside group nodes.y.layout.orthogonal.OrthogonalLayouter
: now produces drawings with less crossings.y.layout.organic.InteractiveOrganicLayouter
: added method y.layout.organic.InteractiveOrganicLayouter#startLayout
and y.layout.organic.InteractiveOrganicLayouter#stopAndWait
. Adjusted corresponding demos.y.layout.hierarchic.IncrementalHierarchicLayouter
: Sometimes if both swimlanes and groups and layers have been defined by the user, the algorithm would place the group nodes into newly created layers in order to avoid group node overlaps, although this might not always be necessary. The algorithm has been improved to better detect overlaps.y.layout.grouping.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)
.yWorks.GraphML.Writer.IXmlWriter
now offers several convenience methods to write typesafe attributes, CDATA content etc.Demo.yFiles.Graph.Folding
.Demo.yFiles.Graph.Bridges
.y.layout.router.OrthogonalEdgeRouter
: Fixed bug where edges weren't routed orthogonally if rerouting was enabled ( #setReroutingEnabled(boolean)
)y.layout.grouping.GroupingKeys#MINIMUM_NODE_SIZE_DPKEY
is missing.y.layout.labeling.MISLabelingAlgorithm
: Fixed calls to getProfit after labeling causing NullPointerException.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.y.layout.hierarchic.IncrementalHierarchicLayouter
: #LAYERING_STRATEGY_USER_DEFINED
or #LAYERING_STRATEGY_FROM_SKETCH
disable recursive group layering.y.layout.CopiedLayoutGraph
automatically registers a DataProvider under y.layout.Layouter#NODE_DP_KEY
if not already present on the original graph.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.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.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.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.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.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.