private static void RouteConnectors([NotNull] LayoutState state, [NotNull] BoxTree visualTree) { visualTree.IterateParentFirst(node => { if (node.Element.IsCollapsed || node.State.NumberOfSiblings == 0 && node.AssistantsRoot == null) { return(false); } if (node.Level == 0) { return(true); } if (!node.Element.IsSpecial || node.IsAssistantRoot) { node.State.RequireLayoutStrategy().RouteConnectors(state, node); return(true); } return(false); }); }
private static void PreprocessVisualTree([NotNull] LayoutState state, [NotNull] BoxTree visualTree) { var defaultStrategy = state.Diagram.LayoutSettings.RequireDefaultLayoutStrategy(); var defaultAssistantsStrategy = state.Diagram.LayoutSettings.RequireDefaultAssistantLayoutStrategy(); var regular = new Stack <LayoutStrategyBase>(); regular.Push(defaultStrategy); var assistants = new Stack <LayoutStrategyBase>(); assistants.Push(defaultAssistantsStrategy); visualTree.IterateParentFirst(node => { if (node.State.IsHidden) { return(false); } LayoutStrategyBase strategy = null; if (state.LayoutOptimizerFunc != null) { var suggestedStrategyId = state.LayoutOptimizerFunc(node); if (!string.IsNullOrEmpty(suggestedStrategyId)) { strategy = state.Diagram.LayoutSettings.LayoutStrategies[suggestedStrategyId]; } } if (node.IsAssistantRoot) { if (strategy == null) { strategy = node.ParentNode.Element.AssistantLayoutStrategyId != null ? state.Diagram.LayoutSettings.LayoutStrategies[ node.ParentNode.Element.AssistantLayoutStrategyId] : assistants.Peek(); } assistants.Push(strategy); } else { if (strategy == null) { strategy = node.Element.LayoutStrategyId != null ? state.Diagram.LayoutSettings.LayoutStrategies[node.Element.LayoutStrategyId] : regular.Peek(); } regular.Push(strategy); if (!strategy.SupportsAssistants) { node.SuppressAssistants(); } } // now let it pre-allocate special boxes etc node.State.EffectiveLayoutStrategy = strategy; node.State.RequireLayoutStrategy().PreProcessThisNode(state, node); return((!node.Element.IsCollapsed && node.ChildCount > 0) || node.AssistantsRoot != null); }, node => { if (!node.State.IsHidden) { if (node.IsAssistantRoot) { assistants.Pop(); } else { regular.Pop(); } } }); }